ChestShop-3/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/EmptyShopDeleter.java

92 lines
3.2 KiB
Java

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