broken-arrow

Untitled

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