package com.Acrobot.ChestShop.Listeners.PostTransaction; import com.Acrobot.Breeze.Utils.InventoryUtil; import com.Acrobot.ChestShop.ChestShop; import com.Acrobot.ChestShop.Configuration.Properties; import com.Acrobot.ChestShop.Events.ShopDestroyedEvent; import com.Acrobot.ChestShop.Events.TransactionEvent; import com.Acrobot.ChestShop.Signs.ChestShopSign; import com.Acrobot.ChestShop.Utils.uBlock; import org.bukkit.Material; import org.bukkit.block.Container; import org.bukkit.block.Sign; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; /** * @author Acrobot */ public class EmptyShopDeleter implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public static void onTransaction(TransactionEvent event) { if (event.getTransactionType() != TransactionEvent.TransactionType.BUY) { return; } Sign sign = event.getSign(); if (ChestShopSign.isAdminShop(sign)) { return; } Inventory ownerInventory = event.getOwnerInventory(); if (!shopShouldBeRemoved(ownerInventory, event.getStock())) { return; } if (!isInRemoveWorld(sign)) { return; } Container connectedContainer = uBlock.findConnectedContainer(sign); ShopDestroyedEvent destroyedEvent = new ShopDestroyedEvent(null, event.getSign(), connectedContainer); ChestShop.callEvent(destroyedEvent); Material signType = sign.getType(); sign.getBlock().setType(Material.AIR); if (Properties.REMOVE_EMPTY_CHESTS && !ChestShopSign.isAdminShop(ownerInventory) && InventoryUtil.isEmpty(ownerInventory)) { if (connectedContainer != null) { connectedContainer.getBlock().setType(Material.AIR); } } else { if (!signType.isItem()) { try { signType = Material.valueOf(signType.name().replace("WALL_", "")); } catch (IllegalArgumentException ignored) {} } if (signType.isItem()) { ownerInventory.addItem(new ItemStack(signType, 1)); } else { ChestShop.getBukkitLogger().warning("Unable to get item for sign " + signType + " to add to removed shop's container!"); } } } private static boolean shopShouldBeRemoved(Inventory inventory, ItemStack[] stock) { if (Properties.REMOVE_EMPTY_SHOPS) { if (Properties.ALLOW_PARTIAL_TRANSACTIONS) { for (ItemStack itemStack : stock) { if (inventory.containsAtLeast(itemStack, 1)) { return false; } } return true; } else if (!InventoryUtil.hasItems(stock, inventory)) { return true; } } return false; } private static boolean isInRemoveWorld(Sign sign) { return Properties.REMOVE_EMPTY_WORLDS.isEmpty() || Properties.REMOVE_EMPTY_WORLDS.contains(sign.getWorld().getName()); } }