Newer
Older
TreasureChest / src / main / java / de / iani / treasurechest / PriceChestCommandExecutor.java
@Brokkonaut Brokkonaut on 4 Jul 2017 12 KB Transfer to git
package de.iani.treasurechest;

import java.util.List;
import java.util.Set;
import java.util.UUID;

import org.bukkit.ChatColor;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import de.iani.playerUUIDCache.CachedPlayer;

public class PriceChestCommandExecutor implements CommandExecutor {
    private TreasureChest plugin;

    public PriceChestCommandExecutor(TreasureChest plugin) {
        this.plugin = plugin;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (args.length == 0) {
            displayHelp(sender, label);
        } else {
            String subcommand = args[0].toLowerCase();
            if (subcommand.equals("setchest")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.setchest")) {
                    return true;
                }
                Player player = ((Player) sender);
                Block target = player.getTargetBlock((Set<Material>) null, 5);
                plugin.setChestLocation(target.getLocation());
                player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null);
                player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null);
                player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null);
                plugin.sendMessage(sender, "Treasurechest location set!");
            } else if (subcommand.equals("create")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) {
                    return true;
                }
                Player player = ((Player) sender);
                ItemStack inHand = player.getInventory().getItemInMainHand();
                if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) {
                    plugin.sendMessage(sender, "You have to hold the display item in hand!", true);
                    return true;
                }
                TreasureChestItem newItem = new TreasureChestItem(inHand.clone(), null, 0);
                plugin.getData().setActiveItem(player.getUniqueId(), newItem);
                plugin.sendMessage(sender, "Created a new Treasurechest item!");
            } else if (subcommand.equals("addmoney")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) {
                    return true;
                }
                if (args.length < 2) {
                    plugin.sendMessage(sender, "/" + label + " addmoney <amount>", true);
                    return true;
                }
                int amount = getIntArgument(args[1], 0);
                Player player = ((Player) sender);
                TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId());
                if (activeItem == null) {
                    plugin.sendMessage(sender, "You have no active item!", true);
                    return true;
                }
                activeItem.setPriceMoney(activeItem.getPriceMoney() + amount);
                plugin.sendMessage(sender, "Set the money to " + activeItem.getPriceMoney());
            } else if (subcommand.equals("additem")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) {
                    return true;
                }
                Player player = ((Player) sender);
                ItemStack inHand = player.getInventory().getItemInMainHand();
                if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) {
                    plugin.sendMessage(sender, "You have to hold the item in hand!", true);
                    return true;
                }
                TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId());
                if (activeItem == null) {
                    plugin.sendMessage(sender, "You have no active item!", true);
                    return true;
                }
                activeItem.addPriceItem(inHand.clone());
                plugin.sendMessage(sender, "Item added: " + inHand.getAmount() + " " + TreasureChest.capitalize(inHand.getType().name(), true));
            } else if (subcommand.equals("give")) {
                if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.give")) {
                    return true;
                }
                if (args.length < 2) {
                    plugin.sendMessage(sender, "/" + label + " give <player>", true);
                    return true;
                }
                Player player = ((Player) sender);
                TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId());
                if (activeItem == null) {
                    plugin.sendMessage(sender, "You have no active item!", true);
                    return true;
                }

                for (int arg = 1; arg < args.length; arg++) {
                    String nameOrId = args[arg].replace(",", "").trim();
                    UUID targetuuid = null;
                    try {
                        targetuuid = UUID.fromString(nameOrId);
                    } catch (Exception e) {
                        CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true);
                        if (target != null) {
                            targetuuid = target.getUUID();
                            nameOrId = target.getName();
                        }
                    }
                    if (targetuuid == null) {
                        plugin.sendMessage(sender, "Unknown player!", true);
                    } else {
                        PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid);
                        content.addItem(activeItem);
                        plugin.sendMessage(sender, "Item given to: " + nameOrId + " (" + targetuuid.toString() + ")");
                    }
                }
                return true;
            } else if (subcommand.equals("list")) {
                if (!checkPermission(sender, "pricechest.list")) {
                    return true;
                }
                if (args.length < 2) {
                    plugin.sendMessage(sender, "/" + label + " list <player>", true);
                    return true;
                }
                String nameOrId = args[1];
                UUID targetuuid = null;
                try {
                    targetuuid = UUID.fromString(nameOrId);
                } catch (Exception e) {
                    CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true);
                    if (target != null) {
                        targetuuid = target.getUUID();
                        nameOrId = target.getName();
                    }
                }
                if (targetuuid == null) {
                    plugin.sendMessage(sender, "Unknown player!", true);
                    return true;
                }

                PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid);
                plugin.sendMessage(sender, ChatColor.GRAY + "Preise von " + nameOrId + " (" + targetuuid.toString() + "):");
                List<TreasureChestItem> items = content.getItems();
                if (items.isEmpty()) {
                    plugin.sendMessage(sender, "keine Preise vorhanden");
                } else {
                    int nr = 1;
                    for (TreasureChestItem i : items) {
                        plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName());
                        nr++;
                    }
                }
            } else if (subcommand.equals("remove")) {
                if (!checkPermission(sender, "pricechest.remove")) {
                    return true;
                }
                if (args.length < 3) {
                    plugin.sendMessage(sender, "/" + label + " remove <player> <nr>", true);
                    return true;
                }

                String nameOrId = args[1];
                UUID targetuuid = null;
                try {
                    targetuuid = UUID.fromString(nameOrId);
                } catch (Exception e) {
                    CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true);
                    if (target != null) {
                        targetuuid = target.getUUID();
                        nameOrId = target.getName();
                    }
                }
                if (targetuuid == null) {
                    plugin.sendMessage(sender, "Unknown player!", true);
                    return true;
                }
                int nr = getIntArgument(args[2], -1);
                PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid);
                if (!content.removeItem(nr - 1)) {
                    plugin.sendMessage(sender, "Ungültige ID", true);
                    return true;
                }
                plugin.sendMessage(sender, "Der Preis wurde entfernt!");
            } else {
                plugin.sendMessage(sender, "Unknown subcommand!", true);
                return true;
            }
        }
        return true;
    }

    private void displayHelp(CommandSender sender, String label) {
        plugin.sendMessage(sender, ChatColor.GREEN + "Commands");
        if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.setchest", true)) {
            plugin.sendMessage(sender, "/" + label + " setchest");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Set the treasure chest location to the location you are looking at.");
        }
        if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.create", true)) {
            plugin.sendMessage(sender, "/" + label + " create");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Creates a price with the item in hand as display item.");
            plugin.sendMessage(sender, "/" + label + " additem");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Adds the item in hand to the price.");
            plugin.sendMessage(sender, "/" + label + " addmoney <amount>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Adds money to a price.");
        }
        if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.give", true)) {
            plugin.sendMessage(sender, "/" + label + " give <player>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Gives a price to a player.");
        }
        if (checkPermission(sender, "pricechest.list")) {
            plugin.sendMessage(sender, "/" + label + " list <player>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Gives price for a player.");
        }
        if (checkPermission(sender, "pricechest.remove")) {
            plugin.sendMessage(sender, "/" + label + " remove <player> <id>");
            plugin.sendMessage(sender, ChatColor.GREEN + "  Removes a price from a players chest.");
        }
    }

    private int getIntArgument(String value, int defaultValue) {
        try {
            return Integer.parseInt(value);
        } catch (Exception e) {
            // ignore - return default
        }
        return defaultValue;
    }

    private boolean checkPermission(CommandSender sender, String perm) {
        return checkPermission(sender, perm, false);
    }

    private boolean checkPermission(CommandSender sender, String perm, boolean silent) {
        boolean hasPermission = sender.hasPermission(perm);
        if (!silent && !hasPermission) {
            plugin.sendMessage(sender, "No permission!", true);
        }
        return hasPermission;
    }

    private boolean checkPlayer(CommandSender sender) {
        return checkPlayer(sender, false);
    }

    private boolean checkPlayer(CommandSender sender, boolean silent) {
        boolean isPlayer = sender instanceof Player;
        if (!isPlayer && !silent) {
            plugin.sendMessage(sender, "You must be a player!", true);
        }
        return isPlayer;
    }
}