EpicBuckets/src/main/java/com/songoda/epicbuckets/listeners/InventoryClickListener.java

413 lines
12 KiB
Java

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<UUID, String> 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();
}
}