Newer
Older
TreasureChest / src / main / java / de / iani / treasurechest / ChestInventoryListener.java
@Brokkonaut Brokkonaut on 4 Jul 2017 9 KB Transfer to git
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());
    }
}