Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.54 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement