Advertisement
broken-arrow

Untitled

May 11th, 2021
648
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.50 KB | None | 0 0
  1. import org.broken.cheststorage.ChestStorage;
  2. import org.broken.cheststorage.data.ChestRegistry;
  3. import org.broken.cheststorage.data.ChestRegistry.ChestData;
  4. import org.bukkit.Bukkit;
  5. import org.bukkit.Location;
  6. import org.bukkit.Material;
  7. import org.bukkit.block.Block;
  8. import org.bukkit.block.Hopper;
  9. import org.bukkit.entity.Player;
  10. import org.bukkit.event.EventHandler;
  11. import org.bukkit.event.EventPriority;
  12. import org.bukkit.event.Listener;
  13. import org.bukkit.event.block.Action;
  14. import org.bukkit.event.inventory.*;
  15. import org.bukkit.event.player.PlayerInteractEvent;
  16. import org.bukkit.inventory.Inventory;
  17. import org.bukkit.inventory.InventoryHolder;
  18. import org.bukkit.inventory.ItemStack;
  19. import org.bukkit.metadata.FixedMetadataValue;
  20. import org.bukkit.scheduler.BukkitRunnable;
  21. import org.mineacademy.fo.Common;
  22. import org.mineacademy.fo.plugin.SimplePlugin;
  23. import org.mineacademy.fo.remain.Remain;
  24.  
  25. import java.util.ArrayList;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29.  
  30. public final class ChestInventoryListener extends ChestGuiInventory implements Listener {
  31.  
  32.     public static final Map<Player, Object> viewers = new HashMap<>();
  33.     private final static String CHEST_METADATA = "SpecialChestLocation";
  34.  
  35.     @EventHandler(priority = EventPriority.LOWEST)
  36.     public void onInventoryPlayerUpdate(InventoryClickEvent event) {
  37.         inventoryUpdates(event);
  38.     }
  39.  
  40.     @EventHandler(priority = EventPriority.LOWEST)
  41.     public void onInventoryPlayerUpdate(InventoryDragEvent event) {
  42.         inventoryUpdates(event);
  43.         //craftingUpdate(event);
  44.     }
  45.  
  46.     @EventHandler(priority = EventPriority.LOW)
  47.     public void onBlockClick(PlayerInteractEvent event) {
  48.  
  49.         Player player = event.getPlayer();
  50.         Block clickedBlock = event.getClickedBlock();
  51.  
  52.         if (clickedBlock != null && clickedBlock.getType() == Material.CHEST
  53.                 && event.getAction() == Action.RIGHT_CLICK_BLOCK && !player.isSneaking()) {
  54.  
  55.             Location blockLocation = event.getClickedBlock().getLocation();
  56.             ChestData chestData = ChestRegistry.getInstance().findChest(blockLocation);
  57.  
  58.             //System.out.println("Attempted to load a chest inventory at " + Common.shortLocation(blockLocation) + " = " + chestData);
  59.  
  60.             if (chestData != null) {
  61.                 player.setMetadata(CHEST_METADATA, new FixedMetadataValue(SimplePlugin.getInstance(), blockLocation));
  62.                 Inventory inventory = createMenu();
  63.  
  64.                 //onOpen(event);
  65.                 //player.openInventory(getInventory());
  66.  
  67.                 System.out.println(ChestGuiInventory.viewers.get(player.getUniqueId()));
  68.                 showMenus(player, chestData);
  69.                 event.setCancelled(true);
  70.                 getInventory().getViewers().remove(event.getPlayer());
  71.                 //ItemStack[] itemStacks = chestData.getChestContents();
  72.                 //getInventory().setContents(itemStacks);
  73.                 System.out.println("Inventory  " + getInventory());
  74.                 //System.out.println("createMenu" + createMenu());
  75.             }
  76.         }
  77.     }
  78.  
  79.  
  80.     private void showMenu(Player player, ChestData chestData, Location location) {
  81.         int size = 27;
  82.         Inventory gui = Bukkit.createInventory(null, size, "Gui Chest" + Common.shortLocation(location));
  83.         ItemStack[] items = chestData.getChestContents();
  84.  
  85.         if (items == null)
  86.             items = new ItemStack[size];
  87.  
  88.         gui.setContents(items);
  89.         player.openInventory(gui);
  90.     }
  91.  
  92.     @EventHandler
  93.     public void inventoryUpdates(InventoryInteractEvent event) {
  94.         InventoryHolder holder = event.getInventory().getHolder();
  95.         Location locations = event.getInventory().getLocation();
  96.         System.out.println("if InventoryInteractEvent ");
  97.         Player player = (Player) event.getWhoClicked();
  98.  
  99.         if (!player.hasMetadata(CHEST_METADATA)) return;
  100.  
  101.         Location location = (Location) player.getMetadata("SpecialChestLocation").get(0).value();
  102.         ChestRegistry registry = ChestRegistry.getInstance();
  103.         ChestData chestData = registry.findChest(location);
  104.  
  105.         System.out.println("chest loc" + location);
  106.         if (chestData != null) {
  107.  
  108.             System.out.println("if Inventory ");
  109.             Bukkit.getScheduler().scheduleSyncDelayedTask(ChestStorage.getInstance(), () -> {
  110.                 ItemStack[] items = chestData.getChestContents();
  111.                 if (getInventory().getHolder() != null)
  112.                     getInventory().setContents(items);
  113.                 ItemStack[] item = getInventory().getContents();
  114.                 registry.saveChestItemsFromHopper(location, item);
  115.             }, 1);
  116.         }
  117.     }
  118.  
  119.     @EventHandler
  120.     public void onInventoryclick(InventoryClickEvent event) {
  121.  
  122.     /*  ChestStorage.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(ChestStorage.getInstance(), () -> {
  123.             List<HumanEntity> plyers = event.getInventory().getViewers();
  124.  
  125.             for (Map.Entry<Player, Object> entry : viewers.entrySet()) {
  126.                 Player p = entry.getKey();
  127.                 //Player p = (Player) he;
  128.                 p.updateInventory();
  129.                 System.out.println("player fun " + p);
  130.             }
  131.         }, 1L);*/
  132.     }
  133.  
  134.     @EventHandler(priority = EventPriority.LOW)
  135.     public void onInventoryClose(InventoryCloseEvent event) {
  136.         Inventory inventory = event.getInventory();
  137.         Player player = (Player) event.getPlayer();
  138.  
  139.         if (!player.hasMetadata(CHEST_METADATA)) {
  140.             System.out.println("@RETURN DUE TO NO METADATA");
  141.  
  142.             return;
  143.         }
  144.  
  145.         Location location = (Location) player.getMetadata("SpecialChestLocation").get(0).value();
  146.         ChestRegistry registry = ChestRegistry.getInstance();
  147.         ChestData chestData = registry.findChest(location);
  148.  
  149.         //System.out.println("Attempted to save chest data at " + Common.shortLocation(location) + " and found: " + chestData);
  150.         player.removeMetadata(CHEST_METADATA, ChestStorage.getInstance());
  151.  
  152.         if (chestData != null)
  153.             //registry.saveChestItems(location, player.getUniqueId(), inventory.getContents());
  154.  
  155.             //viewers.remove(event.getPlayer());
  156.             onClose(event);
  157.         getInventory().getViewers().remove(event.getPlayer());
  158.     }
  159.  
  160.  
  161.     public void onInventoryMoveIn(InventoryMoveItemEvent event) {
  162.  
  163.  
  164.         ArrayList<ItemStack> items = new ArrayList<>();
  165.         Inventory destination = event.getDestination();
  166.         Location destinationloc = event.getDestination().getLocation();
  167.         Inventory source = event.getSource();
  168.         Location sourceloc = event.getSource().getLocation();
  169.         Inventory initiator = event.getInitiator();
  170.         Location initiatorloc = event.getInitiator().getLocation();
  171.         ItemStack item = event.getItem();
  172.         items.add(item);
  173.  
  174.         ItemStack[] test = items.toArray(new ItemStack[0]);
  175.  
  176.         ChestRegistry registry = ChestRegistry.getInstance();
  177.         ChestData chestData = registry.findChest(destinationloc);
  178.         System.out.println("Destination " + test);
  179.         if (chestData != null) {
  180.             System.out.println("Destination " + destination + " " + destinationloc);
  181.             event.setCancelled(true);
  182.             //event.setItem();
  183.             registry.saveChestItemsFromHopper(destinationloc, test);
  184.  
  185.         }
  186.         /*System.out.println("source " + source + " " + sourceloc);
  187.         System.out.println("Initiator " + initiator + " " + initiatorloc);
  188.         System.out.println("item " + item);*/
  189.     }
  190.  
  191.     /**
  192.      * Detect if items are moved from hopper to chest or chest to hopper.
  193.      *
  194.      * @param event
  195.      */
  196.  
  197.     @EventHandler(priority = EventPriority.NORMAL)
  198.     public void fromHopperToContainer(InventoryMoveItemEvent event) {
  199.         if (event.getInitiator().getHolder() instanceof Hopper) {
  200.             ChestRegistry registry = ChestRegistry.getInstance();
  201.             Location location = event.getDestination().getLocation();
  202.  
  203.             ChestData chestData = registry.findChest(location);
  204.             //ItemStack[] itemStacks = chestData.getChestContents();
  205.             //chestData = registry.findChest(location);
  206.  
  207.             ArrayList<ItemStack> items = new ArrayList<>();
  208.             ItemStack item = event.getItem();
  209.             items.add(item);
  210.             ItemStack[] test = items.toArray(new ItemStack[0]);
  211.  
  212.             //System.out.println("Items " + Arrays.toString(test));
  213.  
  214.             if (chestData != null) {
  215.                 if (!event.isCancelled()) {
  216.                     event.setCancelled(true);
  217.                     new BukkitRunnable() {
  218.                         @Override
  219.                         public void run() {
  220.                             if (location != null) {
  221.                                 int hopperAmount = 1;
  222.                                 if (hopperMoveItemFromToChest(event.getSource(), hopperAmount, createMenu())) {
  223.                                     registry.saveChestItemsFromHopper(location, test);
  224.                                 }
  225.                                 for (Player player : Remain.getOnlinePlayers()) {
  226.                                     if (player.hasMetadata(CHEST_METADATA)) {
  227.                                         Location playerChestLocation = (Location) player.getMetadata(CHEST_METADATA).get(0).value();
  228.                                         showMenu(player, registry.findChest(location), playerChestLocation);
  229.                                     }
  230.                                 }
  231.                                 /*if (event.getDestination().getHolder() != null)
  232.                                     event.getDestination().getHolder().getInventory().clear();*/
  233.                                 //if (getInventory().getViewers().size() > 0) getInventory().setContents(itemStacks);
  234.                             }
  235.                         }
  236.                     }.runTaskLater(ChestStorage.getInstance(), 1);
  237.                 }
  238.             }
  239.         }
  240.     }
  241.  
  242.     public static ItemStack removeStackFromInventory(Inventory inventory, int amount, List filters) {
  243.         ItemStack RemoveItemsFromContainerBefore;
  244.         for (int i = 0; i < inventory.getContents().length; i++) {
  245.             ItemStack stack = inventory.getItem(i);
  246.             if ((stack != null)) {
  247.                 RemoveItemsFromContainerBefore = stack.clone();
  248.                 RemoveItemsFromContainerBefore.setAmount(Math.min(stack.getAmount(), amount));
  249.                 stack.setAmount(stack.getAmount() - RemoveItemsFromContainerBefore.getAmount());
  250.  
  251.                 System.out.println("stack.getAmount " + stack.getAmount());
  252.                 System.out.println("Items before " + RemoveItemsFromContainerBefore);
  253.  
  254.                 return RemoveItemsFromContainerBefore;
  255.             }
  256.         }
  257.         return null;
  258.     }
  259.  
  260.     public static boolean hopperMoveItemFromToChest(Inventory from, int amount, Inventory to, List filters) {
  261.         ItemStack removed = removeStackFromInventory(from, amount, null);
  262.         if (removed != null) {
  263.             HashMap<Integer, ItemStack> leftOvers = to.addItem(removed);
  264.             for (ItemStack leftOver : leftOvers.values()) {
  265.                 from.addItem(leftOver);
  266.  
  267.                 System.out.println("Items leftOver " + leftOver);
  268.                 if (removed.equals(leftOver)) return false;
  269.             }
  270.             return true;
  271.         }
  272.         return false;
  273.     }
  274.  
  275.     public static boolean hopperMoveItemFromToChest(Inventory from, int amount, Inventory to) {
  276.         return hopperMoveItemFromToChest(from, amount, to, null);
  277.     }
  278.  
  279.     public static boolean hopperMoveItemFromToChest(Inventory from, ItemStack stack, int amount, Inventory to) {
  280.         if (stack != null) {
  281.             ItemStack toRemoveFromHopper = stack.clone();
  282.             toRemoveFromHopper.setAmount(Math.min(stack.getAmount(), amount));
  283.             stack.setAmount(stack.getAmount() - toRemoveFromHopper.getAmount());
  284.  
  285.             HashMap<Integer, ItemStack> leftOvers = to.addItem(toRemoveFromHopper);
  286.             for (ItemStack leftOver : leftOvers.values()) {
  287.                 from.addItem(leftOver);
  288.                 if (toRemoveFromHopper.equals(leftOver)) return false;
  289.             }
  290.             return true;
  291.         }
  292.         return false;
  293.     }
  294.  
  295. }
  296.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement