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