package de.iani.treasurechest; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class ChestInventoryListener implements Listener { private TreasureChest plugin; HashMap<Player, OpenInventoryData> openInventories = new HashMap<Player, OpenInventoryData>(); public ChestInventoryListener(TreasureChest plugin) { this.plugin = plugin; } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onChestOpen(PlayerInteractEvent e) { if (plugin.getChestLocation() == null) { return; } Block b = e.getClickedBlock(); if (e.getAction() == Action.RIGHT_CLICK_BLOCK && b != null && b.getLocation().equals(plugin.getChestLocation())) { e.setCancelled(true); if (!e.getPlayer().hasPermission("pricechest.access")) { plugin.sendMessage(e.getPlayer(), "Du hast keinen Zugriff auf die Schatztruhe!"); return; } if (openInventories.containsKey(e.getPlayer())) { return;// ist schon offen? } PlayerTreasureChestContent content = plugin.getData().getChestContent(e.getPlayer().getUniqueId()); if (content == null || content.isEmpty()) { plugin.sendMessage(e.getPlayer(), "Deine Schatztruhe ist leer!"); return; } Inventory inventory = plugin.getServer().createInventory(null, 9 * 6, "Schatztruhe"); OpenInventoryData openInventory = new OpenInventoryData(b.getLocation(), inventory); int pos = 0; for (TreasureChestItem item : content.getItems()) { if (pos < 9 * 6) { ItemStack di = item.getDisplayItem().clone(); ItemMeta meta = di.getItemMeta(); ItemStack[] priceList = item.getPriceItems(); ArrayList<String> lore = new ArrayList<>(); if (priceList != null) { for (ItemStack stack : priceList) { StringBuilder t = new StringBuilder(); if (stack.getAmount() > 1) { t.append(stack.getAmount()).append(" "); } t.append(TreasureChest.capitalize(stack.getType().name(), true)); if (stack.getDurability() > 0) { t.append(':').append(stack.getDurability()); } if (stack.getItemMeta().hasDisplayName()) { t.append(" (benanntes Item)"); } lore.add(t.toString()); } } if (item.getPriceMoney() > 0) { lore.add(plugin.formatMoney(item.getPriceMoney())); } meta.setLore(lore); di.setItemMeta(meta); inventory.setItem(pos, di); openInventory.setItemAtPosition(pos, pos); } pos += 1; } e.getPlayer().openInventory(inventory); openInventories.put(e.getPlayer(), openInventory); e.getPlayer().playSound(b.getLocation(), Sound.BLOCK_CHEST_OPEN, 0.5f, 0.9f); } } @EventHandler(priority = EventPriority.HIGH) public void onInventoryClick(InventoryClickEvent event) { OpenInventoryData openInventory = openInventories.get(event.getWhoClicked()); if (openInventory == null) { return; } InventoryAction action = event.getAction(); switch (action) { case PICKUP_ALL: case PICKUP_HALF: case PICKUP_SOME: case PICKUP_ONE: { event.setCancelled(true); if (event.getRawSlot() < event.getView().getTopInventory().getSize() && event.getWhoClicked() instanceof Player) { Player player = (Player) event.getWhoClicked(); ItemStack[] playerInv = player.getInventory().getContents(); playerInv = Arrays.copyOf(playerInv, 36); Inventory clonedPlayerInventory = Bukkit.createInventory(null, 36); clonedPlayerInventory.setContents(playerInv); PlayerTreasureChestContent content = plugin.getData().getChestContent(player.getUniqueId()); int entryId = openInventory.getEntryAtPosition(event.getRawSlot()); TreasureChestItem selectedItem = content.getItem(entryId); if (selectedItem != null) { ItemStack[] priceList = selectedItem.getPriceItems(); int priceCount = priceList == null ? 0 : priceList.length; if (priceCount > 0) { ItemStack[] temp = new ItemStack[priceCount]; for (int i = 0; i < priceCount; i++) { temp[i] = priceList[i].clone(); } if (!clonedPlayerInventory.addItem(temp).isEmpty()) { plugin.sendMessage(player, "Du hast nicht genĂ¼gend Platz in deinem Inventar!", true); player.updateInventory(); return; } } plugin.sendMessage(player, ChatColor.GRAY + "Hole Preis ab:"); if (priceCount > 0) { ItemStack[] temp = new ItemStack[priceCount]; for (int i = 0; i < priceCount; i++) { temp[i] = priceList[i].clone(); } player.getInventory().addItem(temp); for (ItemStack stack : priceList) { StringBuilder t = new StringBuilder(" "); if (stack.getAmount() > 1) { t.append(stack.getAmount()).append(" "); } t.append(TreasureChest.capitalize(stack.getType().name(), true)); if (stack.getDurability() > 0) { t.append(':').append(stack.getDurability()); } ItemMeta meta = stack.getItemMeta(); if (meta.hasDisplayName()) { t.append(" (").append(meta.getDisplayName()).append(ChatColor.YELLOW).append(")"); } plugin.sendMessage(player, t.toString()); } } if (selectedItem.getPriceMoney() > 0) { plugin.giveMoney(player, selectedItem.getPriceMoney()); plugin.sendMessage(player, " " + plugin.formatMoney(selectedItem.getPriceMoney())); } plugin.sendMessage(player, ChatColor.GRAY + "Du hast einen Preis abgeholt!"); player.playSound(event.getWhoClicked().getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1f, 1f); content.removeItem(entryId); openInventory.getInventory().setItem(event.getRawSlot(), null); openInventory.removeEntryAtPositionAndShift(event.getRawSlot()); player.updateInventory(); } } } case CLONE_STACK: case COLLECT_TO_CURSOR: case DROP_ALL_CURSOR: case DROP_ALL_SLOT: case DROP_ONE_CURSOR: case DROP_ONE_SLOT: case HOTBAR_MOVE_AND_READD: case HOTBAR_SWAP: case UNKNOWN: default: { Player player = (Player) event.getWhoClicked(); player.updateInventory(); event.setCancelled(true); return; } } } @EventHandler(priority = EventPriority.HIGH) public void onInventoryDrag(InventoryDragEvent event) { if (openInventories.containsKey(event.getWhoClicked())) { event.setCancelled(true); } } @EventHandler public void onInventoryClose(InventoryCloseEvent e) { OpenInventoryData data = openInventories.remove(e.getPlayer()); if (data != null) { ((Player) e.getPlayer()).playSound(data.getLocation(), Sound.BLOCK_CHEST_CLOSE, 0.5f, 0.9f); } } @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { openInventories.remove(event.getPlayer()); } }