Advertisement
Cool_boy21

Untitled

Jun 11th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.47 KB | None | 0 0
  1. package com.Coolboy.BetterTeleport;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.LinkedHashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import net.md_5.bungee.api.ChatColor;
  9. import net.md_5.bungee.api.chat.ClickEvent;
  10. import net.md_5.bungee.api.chat.ComponentBuilder;
  11. import net.md_5.bungee.api.chat.HoverEvent;
  12. import net.md_5.bungee.api.chat.TextComponent;
  13. import org.bukkit.Bukkit;
  14. import org.bukkit.Effect;
  15. import org.bukkit.Location;
  16. import org.bukkit.Material;
  17. import org.bukkit.SkullType;
  18. import org.bukkit.entity.Entity;
  19. import org.bukkit.entity.Player;
  20. import org.bukkit.inventory.Inventory;
  21. import org.bukkit.inventory.ItemStack;
  22. import org.bukkit.inventory.meta.ItemMeta;
  23. import org.bukkit.inventory.meta.SkullMeta;
  24. import org.bukkit.metadata.FixedMetadataValue;
  25. import org.bukkit.scheduler.BukkitRunnable;
  26.  
  27. public class Util {
  28.  
  29.     public static Location safeLocation(Entity dest) {
  30.         Location tpLoc = dest.getLocation();
  31.         while (!tpLoc.getBlock().getType().isSolid()) {
  32.             tpLoc.setY(tpLoc.getBlockY());
  33.             tpLoc = tpLoc.subtract(0, 1, 0);
  34.             if (tpLoc.getBlockY() == 0) {
  35.                 return null;
  36.             }
  37.             if (tpLoc.getBlock().getType().equals(Material.LAVA)
  38.                     || tpLoc.getBlock().getType().equals(Material.STATIONARY_LAVA)
  39.                     || tpLoc.getBlock().getType().equals(Material.MAGMA)
  40.                     || tpLoc.getBlock().getType().equals(Material.CACTUS)) {
  41.                 return null;
  42.             }
  43.             if (tpLoc.getBlock().isLiquid()) {
  44.                 break;
  45.             }
  46.         }
  47.         tpLoc.add(0, 1, 0);
  48.         return tpLoc;
  49.     }
  50.  
  51.     //get entry with player
  52.     public static Map.Entry<String, Long> getPlayer(LinkedHashMap<String, Long> map, String name) {
  53.         Map.Entry<String, Long> player = null;
  54.         for (Map.Entry<String, Long> entry : map.entrySet()) {
  55.             if (entry.getKey().equals(name)) {
  56.                 player = entry;
  57.                 break;
  58.             }
  59.         }
  60.         return player;
  61.     }
  62.  
  63.     public static LinkedHashMap<String, Long> removePlayer(LinkedHashMap<String, Long> map, String name) {
  64.         for (Map.Entry<String, Long> entry : map.entrySet()) {
  65.             if (entry.getKey().equals(name)) {
  66.                 map.remove(entry.getKey());
  67.                 break;
  68.             }
  69.         }
  70.         return map;
  71.     }
  72.  
  73.     public static void tryTp(Map.Entry<String, Long> player, Player tpTo) {
  74.         long timestamp = player.getValue();
  75.         long diff = System.currentTimeMillis() - timestamp;
  76.         //timeout for teleport
  77.         if (diff / 1000 > 90) {
  78.             sendMessage(tpTo, "&4Час очікування вичерпано");
  79.         } else if (Bukkit.getPlayer(player.getKey()) != null) {
  80.             Player tpFrom = Bukkit.getServer().getPlayer(player.getKey());
  81.             sendMessage(tpFrom, tpTo.getDisplayName() + "&6 прийняв ваш запит на телепортацію");
  82.             sendMessage(tpFrom, "&6Телепортування до гравця &f" + tpTo.getDisplayName());
  83.             Location loc = safeLocation(tpTo);
  84.             if (loc != null) {
  85.                 tpFrom.teleport(loc);
  86.                 loc.getWorld().playEffect(loc, Effect.ENDER_SIGNAL, 0);
  87.             } else {
  88.                 sendMessage(tpFrom, "&4Небезпечне телепортування!");
  89.                 sendMessage(tpTo, "&4Небезпечне телепортування!");
  90.             }
  91.         } else {
  92.             sendMessage(tpTo, "&4Гравця не знайдено!");
  93.         }
  94.     }
  95.  
  96.     public static void sendMessage(Player player, String msg) {
  97.         msg = ChatColor.translateAlternateColorCodes('&', msg);
  98.         if (player.isOnline()) {
  99.             player.sendMessage(msg);
  100.         }
  101.     }
  102.  
  103.     public static ItemStack setLore(ItemStack stack, String lore) {
  104.         lore = ChatColor.translateAlternateColorCodes('&', lore);
  105.         ItemMeta meta = stack.getItemMeta();
  106.         meta.setLore(Arrays.asList(lore));
  107.         stack.setItemMeta(meta);
  108.         return stack;
  109.     }
  110.  
  111.     public static ItemStack setLore(ItemStack stack, String... lore) {
  112.         List<String> loreList = new ArrayList<>();
  113.         for (String str : lore) {
  114.             str = ChatColor.translateAlternateColorCodes('&', str);
  115.             loreList.add(str);
  116.         }
  117.         ItemMeta meta = stack.getItemMeta();
  118.         meta.setLore(loreList);
  119.         stack.setItemMeta(meta);
  120.         return stack;
  121.     }
  122.  
  123.     public static ItemStack setName(ItemStack stack, String name) {
  124.         name = ChatColor.translateAlternateColorCodes('&', name);
  125.         ItemMeta meta = stack.getItemMeta();
  126.         meta.setDisplayName(name);
  127.         stack.setItemMeta(meta);
  128.         return stack;
  129.     }
  130.  
  131.     public static ItemStack setItemMeta(ItemStack stack, String name, String lore) {
  132.         name = ChatColor.translateAlternateColorCodes('&', name);
  133.         lore = ChatColor.translateAlternateColorCodes('&', lore);
  134.         ItemMeta meta = stack.getItemMeta();
  135.         meta.setDisplayName(name);
  136.         meta.setLore(Arrays.asList(lore));
  137.         stack.setItemMeta(meta);
  138.         return stack;
  139.     }
  140.  
  141.     public static Inventory addButtons(Inventory inv, int page) {
  142.         int size = inv.getSize();
  143.         int o = Bukkit.getServer().getOnlinePlayers().size();
  144.  
  145.         ItemStack info = new ItemStack(Material.SIGN, 1);
  146.         setName(info, "&5Інформація");
  147.         setLore(info,
  148.                 Util.encodeHiddenLore(String.valueOf(page)),
  149.                 "&6Список усіх гравців серверу",
  150.                 "&6Щоб телепортуватись, натисніть по голові гравця"
  151.         );
  152.  
  153.         ItemStack next = new ItemStack(Material.PAPER, 1);
  154.         setName(next, "&5Наступна сторінка");
  155.  
  156.         ItemStack previous = new ItemStack(Material.PAPER, 1);
  157.         setName(previous, "&5Попередня сторінка");
  158.  
  159.         ItemStack empty = new ItemStack(Material.BARRIER, 1);
  160.         setName(empty, "&5Пусто");
  161.  
  162.         if (o == 1) {
  163.             inv.setItem(4, empty);
  164.         }
  165.         inv.setItem(size - 5, info);
  166.         if (o > 45) {
  167.             inv.setItem(size - 9, previous);
  168.             inv.setItem(size - 1, next);
  169.         }
  170.         return inv;
  171.     }
  172.  
  173.     public static List<ItemStack> getHeads(Player player) {
  174.         List<ItemStack> heads = new ArrayList<>();
  175.         for (Player pl : Bukkit.getOnlinePlayers()) {
  176.             if (pl.equals(player)) {
  177.                 continue;
  178.             }
  179.             ItemStack head = new ItemStack(Material.SKULL_ITEM, 1, (short) SkullType.PLAYER.ordinal());
  180.             SkullMeta meta = (SkullMeta) head.getItemMeta();
  181.             meta.setOwner(pl.getName());
  182.             head.setItemMeta(meta);
  183.             String world = pl.getLocation().getWorld().getName();
  184.             head = setItemMeta(head, pl.getDisplayName(), "&8Світ: " + getWorldColor(world) + world);
  185.             heads.add(head);
  186.         }
  187.         return heads;
  188.     }
  189.  
  190.     public static ChatColor getWorldColor(String world) {
  191.         if (world.contains("nether")) {
  192.             return ChatColor.DARK_RED;
  193.         }
  194.         if (world.contains("end")) {
  195.             return ChatColor.BLUE;
  196.         }
  197.         if (world.contains("space")) {
  198.             return ChatColor.GRAY;
  199.         }
  200.         return ChatColor.DARK_GREEN;
  201.     }
  202.  
  203.     public static ItemStack[] getPage(int i, Player player) {
  204.         List<ItemStack> heads = getHeads(player);
  205.         if (heads.isEmpty()) {
  206.             return null;
  207.         }
  208.         List<ItemStack> page;
  209.         double pages = Math.floor(heads.size() / 45) + 1;
  210.         if (i > pages) {
  211.             throw new IndexOutOfBoundsException();
  212.         }
  213.         if (pages != 1) {
  214.             if (i != pages) {
  215.                 page = heads.subList(i * 45, i * 45 + 45);
  216.             } else {
  217.                 page = heads.subList(i * 45, heads.size());
  218.             }
  219.             return page.toArray(new ItemStack[page.size()]);
  220.         }
  221.         return heads.toArray(new ItemStack[heads.size()]);
  222.     }
  223.  
  224.     public static Inventory makeInventory(ItemStack[] stacks, Player player, String title) {
  225.         int o = Bukkit.getServer().getOnlinePlayers().size();
  226.         int size = 18;
  227.         if (o > 45) {
  228.             size = 54;
  229.         } else {
  230.             for (int i = 0; true; i++) {
  231.                 if ((o + i) % 9 == 0) {
  232.                     size = o + i + 9;
  233.                     break;
  234.                 }
  235.                 if (i > 10) {
  236.                     break;
  237.                 }
  238.             }
  239.         }
  240.         Inventory inv = Bukkit.createInventory(null, size, title);
  241.         if (stacks != null) {
  242.             inv.setContents(getPage(0, player));
  243.         }
  244.         addButtons(inv, 0);
  245.         return inv;
  246.     }
  247.  
  248.     public static String setColor(String msg) {
  249.         msg = ChatColor.translateAlternateColorCodes('&', msg);
  250.         return msg;
  251.     }
  252.  
  253.     public static int getPageNumber(Inventory inv) {
  254.         ItemStack info = inv.getItem(inv.getSize() - 5);
  255.         String lore = info.getItemMeta().getLore().get(0);
  256.         return Integer.decode(Util.decodeHiddenLore(lore));
  257.     }
  258.  
  259.     public static LinkedHashMap<String, Long> readMetadata(Player player) {
  260.         LinkedHashMap<String, Long> requests = new LinkedHashMap<>();
  261.         if (player.hasMetadata("requests")) {
  262.             requests = (LinkedHashMap<String, Long>) player.getMetadata("requests").get(0).value();
  263.         }
  264.         return requests;
  265.     }
  266.  
  267.     public static void call(Player tpTo, Player tpFrom) {
  268.         //Message creating
  269.         if (tpFrom.getName().equalsIgnoreCase(tpTo.getName())) {
  270.             Util.sendMessage(tpFrom, "&4Неможливо телепортуватись до самого себе");
  271.             return;
  272.         }
  273.         LinkedHashMap<String, Long> requests = readMetadata(tpTo);
  274.         Util.sendMessage(tpFrom, "&6Запит надіслано гравцю &f" + tpTo.getDisplayName());
  275.         TextComponent message = new TextComponent(tpFrom.getDisplayName());
  276.         TextComponent msg1 = new TextComponent(" просить дозволу телепортуватись до вас \n");
  277.         msg1.setColor(ChatColor.GOLD);
  278.         message.addExtra(msg1);
  279.         TextComponent msg2 = new TextComponent("Щоб телепортуватись, використайте ");
  280.         msg2.setColor(ChatColor.GOLD);
  281.         message.addExtra(msg2);
  282.         TextComponent accept = new TextComponent("/tpaccept \n");
  283.         accept.setColor(ChatColor.RED);
  284.         accept.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Натисніть, щоб прийняти").create()));
  285.         accept.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpaccept"));
  286.         message.addExtra(accept);
  287.         TextComponent msg3 = new TextComponent("Щоб відхилити, використайте ");
  288.         msg3.setColor(ChatColor.GOLD);
  289.         message.addExtra(msg3);
  290.         TextComponent decline = new TextComponent("/tpdeny \n");
  291.         decline.setColor(ChatColor.RED);
  292.         decline.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Натисніть, щоб відмовити").create()));
  293.         decline.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tpdeny"));
  294.         message.addExtra(decline);
  295.         TextComponent msg4 = new TextComponent("Заявка буде автоматично скасована через ");
  296.         msg4.setColor(ChatColor.GOLD);
  297.         message.addExtra(msg4);
  298.         TextComponent msg5 = new TextComponent("90 секунд");
  299.         msg5.setColor(ChatColor.RED);
  300.         message.addExtra(msg5);
  301.         tpTo.spigot().sendMessage(message);
  302.         //saving hashmap
  303.         if (requests.isEmpty() || !requests.containsKey(tpFrom.getName())) {
  304.             requests.put(tpFrom.getName(), System.currentTimeMillis());
  305.         } else {
  306.             requests.replace(tpFrom.getName(), System.currentTimeMillis());
  307.         }
  308.         tpTo.setMetadata("requests", new FixedMetadataValue(BetterTeleport.getInstance(), requests));
  309.         new BukkitRunnable() {
  310.             @Override
  311.             public void run() {
  312.                 LinkedHashMap<String, Long> requests = Util.readMetadata(tpTo);
  313.                 if(requests.containsKey(tpFrom.getName())) {
  314.                     tpFrom.sendMessage(Util.setColor(tpTo.getDisplayName() + " &4не підтвердив запит"));
  315.                     requests.remove(tpFrom.getName());
  316.                 }
  317.             }
  318.         }.runTaskLater(BetterTeleport.getInstance(), 1800);
  319.     }
  320.  
  321.     //inserts a formatting character between every character, making it invisible when displayed as lore
  322.     public static String encodeHiddenLore(String lore) {
  323.         for (int i = 0; i < lore.length(); i += 2) {
  324.             lore = lore.substring(0, i) + org.bukkit.ChatColor.COLOR_CHAR + lore.substring(i, lore.length());
  325.         }
  326.         return lore;
  327.     }
  328.  
  329.     //removes the formatting characters
  330.     public static String decodeHiddenLore(String lore) {
  331.         while (lore.contains(org.bukkit.ChatColor.COLOR_CHAR + "")) {
  332.             lore = lore.substring(0, lore.indexOf(org.bukkit.ChatColor.COLOR_CHAR)) + lore.substring(lore.indexOf(org.bukkit.ChatColor.COLOR_CHAR) + 1, lore.length());
  333.         }
  334.         return lore;
  335.     }
  336. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement