package com.songoda.epicbuckets.listeners; import com.songoda.epicbuckets.EpicBuckets; import com.songoda.epicbuckets.genbuckets.GenbucketItem; import com.songoda.epicbuckets.genbuckets.GenbucketManager; import com.songoda.epicbuckets.inventories.InventoryManager; import com.songoda.epicbuckets.util.ChatUtil; import org.apache.commons.lang.ArrayUtils; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import java.util.Map; import java.util.UUID; import java.util.WeakHashMap; /** * InventoryClickListener created by: SoFocused * Date Created: oktober 03 2018 * Time created: 21:15 */ public class InventoryClickListener implements Listener { private EpicBuckets main = EpicBuckets.main; private Map shopMap = new WeakHashMap<>(); // Main inventory @EventHandler public void onClick(InventoryClickEvent event) { String inventoryTitle = ChatUtil.stripColor(main.getConfig().getString("MENU-ITEMS.inventory-name")); String clickedInventoryTitle = ChatColor.stripColor(event.getInventory().getTitle()); if (!clickedInventoryTitle.equalsIgnoreCase(inventoryTitle)) return; if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; if (!event.getCurrentItem().hasItemMeta()) return; event.setCancelled(true); // I'm guessing the fastest way to find it is to check if the // slot is in the config.yml itself? int slot = event.getSlot(); FileConfiguration config = EpicBuckets.getInstance().getConfig(); Player player = (Player) event.getWhoClicked(); for (String key : config.getConfigurationSection("MENU-ITEMS").getKeys(false)) { // Check if the key has the item category if not just skip if (!config.contains("MENU-ITEMS." + key + ".slot")) continue; int configSlot = config.getInt("MENU-ITEMS." + key + ".slot"); if (slot == configSlot) { // Now we know that the slot they clicked // was found in the config! String shopName = config.getString("MENU-ITEMS." + key + ".shop"); InventoryManager inventoryManager = new InventoryManager(); inventoryManager.loadSubInventory(player, shopName); } } } // Sub inventories @EventHandler public void onClickSubInventory(InventoryClickEvent event) { FileConfiguration config = main.shopFile.config; String clickedInventory = ChatUtil.stripColor(event.getInventory().getTitle()); boolean foundInventory = false; String shopName = ""; for (String key : config.getConfigurationSection("shops").getKeys(false)) { String inventoryName = ChatUtil.stripColor(config.getString("shops." + key + ".inventory-name")); if (!clickedInventory.equalsIgnoreCase(inventoryName)) continue; foundInventory = true; shopName = key; break; } if (!foundInventory || shopName.equalsIgnoreCase("")) return; event.setCancelled(true); Player player = (Player) event.getWhoClicked(); int slot = event.getSlot(); int goBackButton = config.getInt("shops." + shopName + ".goBackButton"); boolean useBackButton = config.getBoolean("use-back-buttons"); // Player clicked on the back button if (useBackButton && slot == goBackButton) { player.getOpenInventory().close(); player.performCommand("genbucket"); return; } // They did not click on the back button so we // have to check if they're trying to purchase // a genbucket // Loop thru all slots in the shops config to see // if it equals with a genbucket // Left click to buy or right click to open stacked shop for (String key : config.getConfigurationSection("shops." + shopName).getKeys(false)) { if (!config.contains("shops." + shopName + "." + key + ".slot")) continue; int configSlot = config.getInt("shops." + shopName + "." + key + ".slot"); if (configSlot != slot) continue; // I can init & declare because I know I have the // necessary data GenbucketItem genbucketItem = new GenbucketItem(shopName, key); // Buy a singular genbucket if (event.getClick().equals(ClickType.LEFT)) { purchaseGenbucket(player, 1, genbucketItem); } else { // Open the multiple gui shop final boolean infinite_gens = main.getConfig().getBoolean("INFINITE-USE"); if (infinite_gens) { return; } shopMap.put(player.getUniqueId(), shopName + ":" + key); GenbucketManager genbucketManager = new GenbucketManager(); genbucketManager.openBulkShop(player, genbucketItem); } break; } } @EventHandler public void onClickBulkShop(InventoryClickEvent event) { FileConfiguration config = EpicBuckets.getInstance().getConfig(); String inventoryName = ChatUtil.stripColor(config.getString("BULK-SHOP-INVENTORY.inventory-name").replace("{player}", event.getWhoClicked().getName())); String clickedInventoryName = ChatUtil.stripColor(event.getInventory().getTitle()); if (!inventoryName.equalsIgnoreCase(clickedInventoryName)) return; if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; if (!event.getCurrentItem().hasItemMeta()) return; event.setCancelled(true); // Lets first check if they're trying to increase/decrease the amount Player player = (Player) event.getWhoClicked(); // We have to case this to avoid NPE if (!shopMap.containsKey(player.getUniqueId())) { player.getOpenInventory().close(); return; } int clickedSlot = event.getSlot(); int returnBackItemSlot = config.getInt("BULK-SHOP-INVENTORY.return-back-slot"); int purchaseItemSlot = config.getInt("BULK-SHOP-INVENTORY.purchase-item.slot"); if (ArrayUtils.contains(modifySlotList(), clickedSlot)) { modifyValue(event.getInventory(), player, event.getCurrentItem()); } else if (clickedSlot == returnBackItemSlot) { player.getOpenInventory().close(); String[] genbucketDetails = shopMap.get(player.getUniqueId()).split(":"); InventoryManager inventoryManager = new InventoryManager(); inventoryManager.loadSubInventory(player, genbucketDetails[0]); } else if (clickedSlot == purchaseItemSlot) { String[] genbucketDetails = shopMap.get(player.getUniqueId()).split(":"); GenbucketItem genbucketItem = new GenbucketItem(genbucketDetails[0], genbucketDetails[1]); purchaseGenbucket(player, GenbucketManager.getPlayerInteger(player), genbucketItem); } } @EventHandler public void onClickActGbInventory(InventoryClickEvent event) { if (!event.getInventory().getTitle().equalsIgnoreCase("Active genbuckets")) return; if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; if (!event.getCurrentItem().hasItemMeta()) return; event.setCancelled(true); if (event.getSlot() == 53) { InventoryManager inventoryManager = new InventoryManager(); inventoryManager.loadNextInventory(event.getInventory()); return; } UUID uuid = UUID.fromString(ChatColor.stripColor(event.getCurrentItem().getItemMeta().getDisplayName())); Player player = (Player) event.getWhoClicked(); ClickType clickType = event.getClick(); if (clickType.equals(ClickType.LEFT)) { // Teleport player.teleport(GenbucketManager.activeGenbucketLocation.get(uuid).clone().add(0, 50, 0)); player.sendMessage("§a§lTeleporting..."); } else { GenbucketManager.activeGenbucketItems.remove(uuid); event.getInventory().clear(event.getSlot()); player.sendMessage("§c§lStopping..."); } } private void modifyValue(Inventory inventory, Player player, ItemStack itemStack) { boolean addition = ChatUtil.stripColor(itemStack.getItemMeta().getDisplayName().split(" ")[0]).equalsIgnoreCase("+"); int value = Integer.parseInt(itemStack.getItemMeta().getDisplayName().split(" ")[1]); int oldAmount = GenbucketManager.getPlayerInteger(player); int newAmount; if (addition) { newAmount = oldAmount + value; if (newAmount > 64) newAmount = newAmount - (newAmount - 64); GenbucketManager.setPlayerInteger(player, newAmount); } else { newAmount = oldAmount - value; if (newAmount == 0) newAmount = 1; else if (newAmount < 0) newAmount = oldAmount - (oldAmount - 1); GenbucketManager.setPlayerInteger(player, newAmount); } FileConfiguration config = main.getConfig(); int mainItemSlot = config.getInt("BULK-SHOP-INVENTORY.main-item-slot"); inventory.getItem(mainItemSlot).setAmount(GenbucketManager.getPlayerInteger(player)); player.updateInventory(); } private int[] modifySlotList() { FileConfiguration config = main.getConfig(); int[] modifyValueSlots = new int[6]; for (int i = 0; i < config.getString("BULK-SHOP-INVENTORY.increase-item.slots").split(",").length; i++) modifyValueSlots[i] = Integer.parseInt(config.getString("BULK-SHOP-INVENTORY.increase-item.slots").split(",")[i]); int x = 3; for (int i = 0; i < config.getString("BULK-SHOP-INVENTORY.decrease-item.slots").split(",").length; i++) { if (modifyValueSlots[x] == 0) modifyValueSlots[x] = Integer.parseInt(config.getString("BULK-SHOP-INVENTORY.decrease-item.slots").split(",")[i]); x++; } return modifyValueSlots; } private void purchaseGenbucket(Player player, int amount, GenbucketItem genbucketItem) { if (player.getInventory().firstEmpty() == -1) { player.sendMessage(ChatUtil.colorPrefix(main.messageFile.config.getString("INVENTORY-FULL"))); return; } int price = genbucketItem.getPrice() * amount; double playerBalance = main.getBalance(player); final boolean infinite_gens = main.getConfig().getBoolean("INFINITE-USE"); if (infinite_gens) { player.getInventory().addItem(genbucketItem.getGenbucketItem()); return; } if (playerBalance >= price) { // they have enough money main.withdrawBalance(player, price, true); genbucketItem.setAmount(amount); player.getInventory().addItem(genbucketItem.getGenbucketItem()); } else { // they have less money player.sendMessage(ChatUtil.colorPrefix(main.messageFile.config.getString("NOT-ENOUGH-MONEY").replace("{money}", String.valueOf((playerBalance - price) * -1)))); } boolean closeGUI = main.getConfig().getBoolean("CLOSE-GUI-AFTER-PURCHASE"); if (closeGUI) player.getOpenInventory().close(); } }