Advertisement
broken-arrow

Untitled

May 2nd, 2021
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.99 KB | None | 0 0
  1. package org.broken.cheststorage.menus;
  2.  
  3. import org.broken.cheststorage.ChestStorage;
  4. import org.broken.cheststorage.data.ChestRegistry;
  5. import org.broken.cheststorage.data.ChestRegistry.ChestData;
  6. import org.bukkit.Bukkit;
  7. import org.bukkit.Location;
  8. import org.bukkit.Material;
  9. import org.bukkit.block.Block;
  10. import org.bukkit.block.Hopper;
  11. import org.bukkit.entity.Player;
  12. import org.bukkit.event.EventHandler;
  13. import org.bukkit.event.EventPriority;
  14. import org.bukkit.event.Listener;
  15. import org.bukkit.event.block.Action;
  16. import org.bukkit.event.inventory.InventoryCloseEvent;
  17. import org.bukkit.event.inventory.InventoryMoveItemEvent;
  18. import org.bukkit.event.player.PlayerInteractEvent;
  19. import org.bukkit.inventory.Inventory;
  20. import org.bukkit.inventory.ItemStack;
  21. import org.bukkit.metadata.FixedMetadataValue;
  22. import org.bukkit.scheduler.BukkitRunnable;
  23. import org.mineacademy.fo.Common;
  24. import org.mineacademy.fo.plugin.SimplePlugin;
  25.  
  26. import java.util.ArrayList;
  27. import java.util.HashMap;
  28. import java.util.List;
  29.  
  30. public final class ChestInventoryListener extends ChestGuiInventory implements Listener {
  31.  
  32. private final static String CHEST_METADATA = "SpecialChestLocation";
  33.  
  34. @EventHandler(priority = EventPriority.LOW)
  35. public void onBlockClick(PlayerInteractEvent event) {
  36.  
  37. Player player = event.getPlayer();
  38. Block clickedBlock = event.getClickedBlock();
  39.  
  40. if (clickedBlock != null && clickedBlock.getType() == Material.CHEST
  41. && event.getAction() == Action.RIGHT_CLICK_BLOCK && !player.isSneaking()) {
  42.  
  43. Location blockLocation = event.getClickedBlock().getLocation();
  44. ChestData chestData = ChestRegistry.getInstance().findChest(blockLocation);
  45.  
  46. System.out.println("Attempted to load a chest inventory at " + Common.shortLocation(blockLocation) + " = " + chestData);
  47.  
  48. if (chestData != null) {
  49. player.setMetadata(CHEST_METADATA, new FixedMetadataValue(SimplePlugin.getInstance(), blockLocation));
  50.  
  51. /*List<HumanEntity> players = getInventory().getViewers();
  52. System.out.println(players);
  53. HumanEntity playerres = players.get(players.size());
  54. System.out.println(playerres);
  55. if (playerres != null)
  56. playerres.openInventory(getInventory());*/
  57. showMenus(player, chestData);
  58. event.setCancelled(true);
  59. }
  60. }
  61. }
  62.  
  63. private void showMenu(Player player, ChestData chestData) {
  64. int size = 27;
  65. Inventory gui = Bukkit.createInventory(null, size, "Gui Chest");
  66. ItemStack[] items = chestData.getChestContents();
  67.  
  68. if (items == null)
  69. items = new ItemStack[size];
  70.  
  71. gui.setContents(items);
  72. player.openInventory(gui);
  73. }
  74.  
  75. @EventHandler(priority = EventPriority.LOW)
  76. public void onInventoryClose(InventoryCloseEvent event) {
  77. Inventory inventory = event.getInventory();
  78. Player player = (Player) event.getPlayer();
  79.  
  80. if (!player.hasMetadata(CHEST_METADATA)) {
  81. System.out.println("@RETURN DUE TO NO METADATA");
  82.  
  83. return;
  84. }
  85.  
  86. Location location = (Location) player.getMetadata("SpecialChestLocation").get(0).value();
  87. ChestRegistry registry = ChestRegistry.getInstance();
  88. ChestData chestData = registry.findChest(location);
  89.  
  90. System.out.println("Attempted to save chest data at " + Common.shortLocation(location) + " and found: " + chestData);
  91. player.removeMetadata(CHEST_METADATA, ChestStorage.getInstance());
  92.  
  93. if (chestData != null)
  94. registry.saveChestItems(location, player.getUniqueId(), inventory.getContents());
  95. event.getViewers().remove(event.getPlayer());
  96. }
  97.  
  98.  
  99. public void onInventoryMoveIn(InventoryMoveItemEvent event) {
  100.  
  101.  
  102. ArrayList<ItemStack> items = new ArrayList<>();
  103. Inventory destination = event.getDestination();
  104. Location destinationloc = event.getDestination().getLocation();
  105. Inventory source = event.getSource();
  106. Location sourceloc = event.getSource().getLocation();
  107. Inventory initiator = event.getInitiator();
  108. Location initiatorloc = event.getInitiator().getLocation();
  109. ItemStack item = event.getItem();
  110. items.add(item);
  111.  
  112. ItemStack[] test = items.toArray(new ItemStack[0]);
  113.  
  114. ChestRegistry registry = ChestRegistry.getInstance();
  115. ChestData chestData = registry.findChest(destinationloc);
  116. System.out.println("Destination " + test);
  117. if (chestData != null) {
  118. System.out.println("Destination " + destination + " " + destinationloc);
  119. event.setCancelled(true);
  120. //event.setItem();
  121. registry.saveChestItemsFromHopper(destinationloc, test);
  122.  
  123. }
  124. /*System.out.println("source " + source + " " + sourceloc);
  125. System.out.println("Initiator " + initiator + " " + initiatorloc);
  126. System.out.println("item " + item);*/
  127. }
  128.  
  129. /**
  130. * Detect if items are moved from hopper to chest or chest to hopper.
  131. *
  132. * @param event
  133. */
  134.  
  135. @EventHandler(priority = EventPriority.NORMAL)
  136. public void fromHopperToContainer(InventoryMoveItemEvent event) {
  137. if (event.getInitiator().getHolder() instanceof Hopper) {
  138. ChestRegistry registry = ChestRegistry.getInstance();
  139. Location location = event.getDestination().getLocation();
  140.  
  141. ChestData chestData = registry.findChest(location);
  142. //ItemStack[] itemStacks = chestData.getChestContents();
  143. chestData = registry.findChest(location);
  144.  
  145. ArrayList<ItemStack> items = new ArrayList<>();
  146. ItemStack item = event.getItem();
  147. items.add(item);
  148. ItemStack[] test = items.toArray(new ItemStack[0]);
  149.  
  150. //System.out.println("Items " + Arrays.toString(test));
  151.  
  152. if (chestData != null) {
  153. if (!event.isCancelled()) {
  154. event.setCancelled(true);
  155. new BukkitRunnable() {
  156. @Override
  157. public void run() {
  158. if (location != null) {
  159. int hopperAmount = 1;
  160. if (hopperMoveItemFromToChest(event.getSource(), hopperAmount, getInventory())) {
  161. //registry.saveChestItemsFromHopper(location, test);
  162. }
  163. /*if (event.getDestination().getHolder() != null)
  164. event.getDestination().getHolder().getInventory().clear();*/
  165. //if (getInventory().getViewers().size() > 0) getInventory().setContents(itemStacks);
  166. }
  167. }
  168. }.runTaskLater(ChestStorage.getInstance(), 1);
  169. }
  170. }
  171. }
  172. }
  173.  
  174. public static ItemStack removeStackFromInventory(Inventory inventory, int amount, List filters) {
  175. ItemStack RemoveItemsFromContainerBefore;
  176. for (int i = 0; i < inventory.getContents().length; i++) {
  177. ItemStack stack = inventory.getItem(i);
  178. if ((stack != null)) {
  179. RemoveItemsFromContainerBefore = stack.clone();
  180. RemoveItemsFromContainerBefore.setAmount(Math.min(stack.getAmount(), amount));
  181. stack.setAmount(stack.getAmount() - RemoveItemsFromContainerBefore.getAmount());
  182.  
  183. System.out.println("stack.getAmount " + stack.getAmount());
  184. System.out.println("Items before " + RemoveItemsFromContainerBefore);
  185.  
  186. return RemoveItemsFromContainerBefore;
  187. }
  188. }
  189. return null;
  190. }
  191.  
  192. public static boolean hopperMoveItemFromToChest(Inventory from, int amount, Inventory to, List filters) {
  193. ItemStack removed = removeStackFromInventory(from, amount, null);
  194. if (removed != null) {
  195. HashMap<Integer, ItemStack> leftOvers = to.addItem(removed);
  196. for (ItemStack leftOver : leftOvers.values()) {
  197. from.addItem(leftOver);
  198.  
  199. System.out.println("Items leftOver " + leftOver);
  200. if (removed.equals(leftOver)) return false;
  201. }
  202. return true;
  203. }
  204. return false;
  205. }
  206.  
  207. public static boolean hopperMoveItemFromToChest(Inventory from, int amount, Inventory to) {
  208. return hopperMoveItemFromToChest(from, amount, to, null);
  209. }
  210.  
  211. public static boolean hopperMoveItemFromToChest(Inventory from, ItemStack stack, int amount, Inventory to) {
  212. if (stack != null) {
  213. ItemStack toRemoveFromHopper = stack.clone();
  214. toRemoveFromHopper.setAmount(Math.min(stack.getAmount(), amount));
  215. stack.setAmount(stack.getAmount() - toRemoveFromHopper.getAmount());
  216.  
  217. HashMap<Integer, ItemStack> leftOvers = to.addItem(toRemoveFromHopper);
  218. for (ItemStack leftOver : leftOvers.values()) {
  219. from.addItem(leftOver);
  220. if (toRemoveFromHopper.equals(leftOver)) return false;
  221. }
  222. return true;
  223. }
  224. return false;
  225. }
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement