SHARE
TWEET

Untitled

a guest May 23rd, 2019 88 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package xyz.juno.napthecham.main.anvil;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.InvocationTargetException;
  6. import java.lang.reflect.Method;
  7. import java.util.HashMap;
  8.  
  9. import org.bukkit.Bukkit;
  10. import org.bukkit.entity.Player;
  11. import org.bukkit.event.EventHandler;
  12. import org.bukkit.event.HandlerList;
  13. import org.bukkit.event.Listener;
  14. import org.bukkit.event.inventory.InventoryClickEvent;
  15. import org.bukkit.event.inventory.InventoryCloseEvent;
  16. import org.bukkit.event.player.PlayerQuitEvent;
  17. import org.bukkit.inventory.Inventory;
  18. import org.bukkit.inventory.ItemStack;
  19. import org.bukkit.inventory.meta.ItemMeta;
  20.  
  21. import xyz.juno.napthecham.main.NapTheCham;
  22.  
  23. public class AnvilGUI implements Listener {
  24.     private Player player;
  25.     private AnvilClickEventHandler handler;
  26.     private static Class<?> BlockPosition;
  27.     private static Class<?> PacketPlayOutOpenWindow;
  28.     private static Class<?> ContainerAnvil;
  29.     private static Class<?> ChatMessage;
  30.     private static Class<?> EntityHuman;
  31.     private HashMap<AnvilSlot, ItemStack> items = new HashMap<AnvilSlot, ItemStack>();
  32.     public static HashMap<Player, Float> exp = new HashMap<Player, Float>();
  33.     private Inventory inv;
  34.     private Listener listener;
  35.  
  36.     private void loadClasses() {
  37.         BlockPosition = AnvilLib.get().getNMSClass("BlockPosition");
  38.         PacketPlayOutOpenWindow = AnvilLib.get().getNMSClass("PacketPlayOutOpenWindow");
  39.         ContainerAnvil = AnvilLib.get().getNMSClass("ContainerAnvil");
  40.         EntityHuman = AnvilLib.get().getNMSClass("EntityHuman");
  41.         ChatMessage = AnvilLib.get().getNMSClass("ChatMessage");
  42.     }
  43.  
  44.     public AnvilGUI(final Player player, final AnvilClickEventHandler handler) {
  45.         loadClasses();
  46.         this.player = player;
  47.         this.handler = handler;
  48.  
  49.         this.listener = new Listener() {
  50.             @EventHandler
  51.             public void onInventoryClick(InventoryClickEvent event) {
  52.                 if (event.getWhoClicked() instanceof Player) {
  53.  
  54.                     if (event.getInventory().equals(inv)) {
  55.                         event.setCancelled(true);
  56.  
  57.                         ItemStack item = event.getCurrentItem();
  58.                         int slot = event.getRawSlot();
  59.                         String name = "";
  60.  
  61.                         if (item != null) {
  62.                             if (item.hasItemMeta()) {
  63.                                 ItemMeta meta = item.getItemMeta();
  64.  
  65.                                 if (meta.hasDisplayName()) {
  66.                                     name = meta.getDisplayName();
  67.                                 }
  68.                             }
  69.                         }
  70.  
  71.                         AnvilClickEvent clickEvent = new AnvilClickEvent(AnvilSlot.bySlot(slot), name);
  72.  
  73.                         handler.onAnvilClick(clickEvent);
  74.  
  75.                         if (clickEvent.getWillClose()) {
  76.                             event.getWhoClicked().closeInventory();
  77.                         }
  78.  
  79.                         if (clickEvent.getWillDestroy()) {
  80.                             destroy();
  81.                         }
  82.                     }
  83.                 }
  84.             }
  85.  
  86.             @EventHandler
  87.             public void onInventoryClose(InventoryCloseEvent event) {
  88.                 if (event.getPlayer() instanceof Player) {
  89.                     Inventory inv = event.getInventory();
  90.                     if (inv.equals(AnvilGUI.this.inv)) {
  91.                         inv.clear();
  92.                         player.setExp(exp.get(player));
  93.                         destroy();
  94.                     }
  95.                 }
  96.             }
  97.  
  98.             @EventHandler
  99.             public void onPlayerQuit(PlayerQuitEvent event) {
  100.                 if (event.getPlayer().equals(getPlayer())) {
  101.                     player.setExp(exp.get(player));
  102.                     destroy();
  103.                 }
  104.             }
  105.         };
  106.  
  107.         Bukkit.getPluginManager().registerEvents(listener, NapTheCham.NTC);
  108.     }
  109.  
  110.     public Player getPlayer() {
  111.         return player;
  112.     }
  113.  
  114.     public void setSlot(AnvilSlot slot, ItemStack item) {
  115.         items.put(slot, item);
  116.     }
  117.  
  118.     public void open() throws IllegalAccessException, InvocationTargetException, InstantiationException {
  119.         Float experience = player.getExp();
  120.         exp.put(player, experience);
  121.         try {
  122.             Object p = AnvilLib.get().getHandle(player);
  123.  
  124.  
  125.             Object container = ContainerAnvil.getConstructor(AnvilLib.get().getNMSClass("PlayerInventory"), AnvilLib.get().getNMSClass("World"), BlockPosition, EntityHuman).newInstance(AnvilLib.get().getPlayerField(player, "inventory"), AnvilLib.get().getPlayerField(player, "world"), BlockPosition.getConstructor(int.class, int.class, int.class).newInstance(0, 0, 0), p);
  126.             AnvilLib.get().getField(AnvilLib.get().getNMSClass("Container"), "checkReachable").set(container, false);
  127.  
  128.             //Set the items to the items from the inventory given
  129.             Object bukkitView = AnvilLib.get().invokeMethod("getBukkitView", container);
  130.             inv = (Inventory) AnvilLib.get().invokeMethod("getTopInventory", bukkitView);
  131.  
  132.             for (AnvilSlot slot : items.keySet()) {
  133.                 inv.setItem(slot.getSlot(), items.get(slot));
  134.             }
  135.  
  136.             //Counter stuff that the game uses to keep track of inventories
  137.             int c = (int) AnvilLib.get().invokeMethod("nextContainerCounter", p);
  138.  
  139.             //Send the packet
  140.             Constructor<?> chatMessageConstructor = ChatMessage.getConstructor(String.class, Object[].class);
  141.             Object playerConnection = AnvilLib.get().getPlayerField(player, "playerConnection");
  142.             Object packet = PacketPlayOutOpenWindow.getConstructor(int.class, String.class, AnvilLib.get().getNMSClass("IChatBaseComponent"), int.class).newInstance(c, "minecraft:anvil", chatMessageConstructor.newInstance("Repairing", new Object[]{}), 0);
  143.  
  144.             Method sendPacket = AnvilLib.get().getMethod("sendPacket", playerConnection.getClass(), PacketPlayOutOpenWindow);
  145.             sendPacket.invoke(playerConnection, packet);
  146.  
  147.             //Set their active container to the container
  148.             Field activeContainerField = AnvilLib.get().getField(EntityHuman, "activeContainer");
  149.             if (activeContainerField != null) {
  150.                 activeContainerField.set(p, container);
  151.  
  152.                 //Set their active container window id to that counter stuff
  153.                 AnvilLib.get().getField(AnvilLib.get().getNMSClass("Container"), "windowId").set(activeContainerField.get(p), c);
  154.  
  155.                 //Add the slot listener
  156.                 AnvilLib.get().getMethod("addSlotListener", activeContainerField.get(p).getClass(), p.getClass()).invoke(activeContainerField.get(p), p);
  157.             }
  158.         } catch (Exception e) {
  159.             e.printStackTrace();
  160.         }
  161.     }
  162.  
  163.     public void destroy() {
  164.         player = null;
  165.         handler = null;
  166.         items = null;
  167.  
  168.         HandlerList.unregisterAll(listener);
  169.  
  170.         listener = null;
  171.     }
  172.  
  173.     public enum AnvilSlot {
  174.         INPUT_LEFT(0),
  175.         INPUT_RIGHT(1),
  176.         OUTPUT(2);
  177.  
  178.         private int slot;
  179.  
  180.         private AnvilSlot(int slot) {
  181.             this.slot = slot;
  182.         }
  183.  
  184.         public static AnvilSlot bySlot(int slot) {
  185.             for (AnvilSlot anvilSlot : values()) {
  186.                 if (anvilSlot.getSlot() == slot) {
  187.                     return anvilSlot;
  188.                 }
  189.             }
  190.  
  191.             return null;
  192.         }
  193.  
  194.         public int getSlot() {
  195.             return slot;
  196.         }
  197.     }
  198.  
  199.     public interface AnvilClickEventHandler {
  200.         void onAnvilClick(AnvilClickEvent event);
  201.     }
  202.  
  203.     public class AnvilClickEvent {
  204.         private AnvilSlot slot;
  205.  
  206.         private String name;
  207.  
  208.         private boolean close = true;
  209.         private boolean destroy = true;
  210.  
  211.         public AnvilClickEvent(AnvilSlot slot, String name) {
  212.             this.slot = slot;
  213.             this.name = name;
  214.         }
  215.  
  216.         public AnvilSlot getSlot() {
  217.             return slot;
  218.         }
  219.  
  220.         public String getName() {
  221.             return name;
  222.         }
  223.  
  224.         public boolean getWillClose() {
  225.             return close;
  226.         }
  227.  
  228.         public void setWillClose(boolean close) {
  229.             this.close = close;
  230.         }
  231.  
  232.         public boolean getWillDestroy() {
  233.             return destroy;
  234.         }
  235.  
  236.         public void setWillDestroy(boolean destroy) {
  237.             this.destroy = destroy;
  238.         }
  239.     }
  240. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top