package me.mason.chest.listeners; import com.wasteofplastic.askyblock.ASkyBlockAPI; import com.wasteofplastic.askyblock.Island; import java.util.List; import me.mason.chest.Core; import me.mason.chest.utils.LM; import me.mason.chest.utils.SignUtil; import net.brcdev.shopgui.ShopGuiPlugin; import net.brcdev.shopgui.config.Settings; import net.brcdev.shopgui.player.PlayerData; import net.brcdev.shopgui.shop.ShopManager; import net.brcdev.shopgui.shop.WrappedShopItem; import org.apache.commons.lang.Validate; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.material.Sign; public class SignListener implements Listener { private final Core plugin; public SignListener(Core plugin) { this.plugin = plugin; } @EventHandler public void onSignPlace(SignChangeEvent event) { final Player player = event.getPlayer(); final SignUtil signUtil = this.plugin.getSignUtil(); if(!inValidWorld(player) || !signUtil.validSign(event.getLine(0))){ return; } if (!ASkyBlockAPI.getInstance().playerIsOnIsland(player)) { return; } final Block block = event.getBlock(); if (!block.getType().equals(Material.WALL_SIGN) ) { this.denySignChange(event, LM.NOT_AGAINST_CHEST.getValue()); return; } if(!player.hasPermission(LM.PERMISSION.getValue())){ this.denySignChange(event, LM.NO_PERMS_PLACE.getValue()); return; } final Sign signData = (Sign) event.getBlock().getState().getData(); final Block relative = block.getRelative(signData.getAttachedFace()); if (!relative.equals(Material.CHEST) || !relative.equals(Material.TRAPPED_CHEST)) { this.denySignChange(event, LM.NOT_AGAINST_CHEST.getValue()); return; } final String[] lines = signUtil.getLines(); for (int i = 0; i < 4; i++) { event.setLine(i, lines[i]); } player.sendMessage(LM.PLACE.getValue()); } private void denySignChange(SignChangeEvent event, String message) { event.getBlock().breakNaturally(); event.getPlayer().sendMessage(message); } @EventHandler public void onSignInteract(PlayerInteractEvent event) { final Player player = event.getPlayer(); final SignUtil signUtil = this.plugin.getSignUtil(); if (!this.inValidWorld(player)) { return; } final Action action = event.getAction(); if (action == Action.LEFT_CLICK_BLOCK || action == Action.RIGHT_CLICK_BLOCK) { return; } final Block block = event.getClickedBlock(); if (block == null || block.getType() != Material.WALL_SIGN) { return; } final org.bukkit.block.Sign sign = (org.bukkit.block.Sign) block.getState(); if (!signUtil.isSellChestSign(sign)) { return; } final ASkyBlockAPI askyblockAPI = ASkyBlockAPI.getInstance(); if (!askyblockAPI.playerIsOnIsland(player)) { return; } final Island island = askyblockAPI.getIslandAt(player.getLocation()); if (island == null) { return; } if (!island.getMembers().contains(player.getUniqueId())) { player.sendMessage(LM.NO_PERMS_USE.getValue()); return; } final Sign signData = (Sign) sign.getData(); final BlockState state = block.getRelative(signData.getAttachedFace()).getState(); if (state instanceof InventoryHolder) { final Inventory inventory = ((InventoryHolder) state).getInventory(); this.sellItems(inventory, player); } } public boolean inValidWorld(Player player) { List validWorlds = plugin.getConfig().getStringList("valid-worlds"); Validate.notEmpty(validWorlds,"[Haunted] Valid?"); return validWorlds.contains(player.getWorld().getName()); } public void sellItems(Inventory chest, Player seller) { ShopGuiPlugin sgp = ShopGuiPlugin.getInstance(); int amount = 0; double value = 0.0; ShopManager shopManager = sgp.getShopManager(); PlayerData playerData = sgp.getPlayerManager().getPlayerData(seller); for(int i = 0; i < chest.getContents().length; i++) { ItemStack stack = chest.getItem(i); if(stack == null || stack.getType().equals(Material.AIR)) { continue; } WrappedShopItem shopItem = shopManager.findShopItemByItemStack(seller, playerData, stack, Settings.sellHandAllExcludeFreeItems); if(shopItem == null || shopItem.getShopItem() == null || shopItem.getShop() == null) { continue; } double sellValue = shopItem.getShopItem().getSellPriceForAmount(shopItem.getShop(), seller, playerData, stack.getAmount()); amount += stack.getAmount(); value += sellValue; chest.setItem(i, new ItemStack(Material.AIR)); } sgp.getEconomyProvider().deposit(seller, value); if (amount == 0) { seller.sendMessage(LM.EMPTY_CHEST.getValue()); } else { seller.sendMessage(LM.SOLD.getValue().replace("%amount%", amount + "").replace("%value%", value + "")); } } }