package de.iani.treasurechest;
import java.sql.SQLException;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Level;
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;
import de.iani.treasurechest.PlayerTreasureChestContent.LoadState;
import de.iani.treasurechest.database.DatabaseTreasureChestItem;
public class TreasureChestCommandExecutor implements CommandExecutor {
private TreasureChest plugin;
public TreasureChestCommandExecutor(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, "treasurechest.setchest")) {
return true;
}
Player player = ((Player) sender);
Block target = player.getTargetBlock((Set<Material>) null, 5);
plugin.setChestLocation(target == null ? null : target.getLocation());
if (target != null) {
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 {
plugin.sendMessage(sender, "Treasurechest location removed!");
}
} else if (subcommand.equals("create")) {
if (!checkPlayer(sender) || !checkPermission(sender, "treasurechest.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, "treasurechest.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, "treasurechest.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, "treasurechest.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();
CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId);
if (target == null) {
plugin.sendMessage(sender, "Unknown player!", true);
} else {
plugin.addItem(target, activeItem.getDisplayItem(), activeItem.getPriceItems(), activeItem.getPriceMoney());
plugin.sendMessage(sender, "Item given to: " + target.getName() + " (" + target.getUUID() + ")");
}
}
return true;
} else if (subcommand.equals("list")) {
if (!checkPermission(sender, "treasurechest.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<DatabaseTreasureChestItem> items = content.getItems();
if (items.isEmpty()) {
plugin.sendMessage(sender, "keine Preise vorhanden");
} else {
ListedItemsData lid = new ListedItemsData(targetuuid);
int nr = 1;
for (DatabaseTreasureChestItem i : items) {
plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName());
lid.addItem(nr, i.getId());
nr++;
}
if (sender instanceof Player) {
Player player = ((Player) sender);
plugin.getData().setListedItems(player.getUniqueId(), lid);
} else {
plugin.getData().setListedItems(null, lid);
}
}
} else if (subcommand.equals("remove")) {
if (!checkPermission(sender, "treasurechest.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);
ListedItemsData lid;
if (sender instanceof Player) {
Player player = ((Player) sender);
lid = plugin.getData().getListedItems(player.getUniqueId());
} else {
lid = plugin.getData().getListedItems(null);
}
if (lid == null || !lid.getOwner().equals(targetuuid)) {
plugin.sendMessage(sender, "Nicht der gelistete Spieler", true);
return true;
}
Integer key = lid.getItemDatabaseKey(nr);
if (key == null) {
plugin.sendMessage(sender, "Ungültige ID", true);
return true;
}
try {
if (plugin.getDatabase().deleteItem(targetuuid, key)) {
PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid);
if (content != null && content.getLoadState() == LoadState.LOADED) {
content.removeItem(key);
}
} else {
plugin.sendMessage(sender, "Ungültige ID", true);
return true;
}
} catch (SQLException e) {
plugin.sendMessage(sender, ChatColor.DARK_RED + "Datenbankfehler");
plugin.getLogger().log(Level.SEVERE, "Could not delete item " + key + " for " + targetuuid + ": " + e.getMessage(), e);
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, "treasurechest.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, "treasurechest.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, "treasurechest.give", true)) {
plugin.sendMessage(sender, "/" + label + " give <player>");
plugin.sendMessage(sender, ChatColor.GREEN + " Gives a price to a player.");
}
if (checkPermission(sender, "treasurechest.list")) {
plugin.sendMessage(sender, "/" + label + " list <player>");
plugin.sendMessage(sender, ChatColor.GREEN + " Gives price for a player.");
}
if (checkPermission(sender, "treasurechest.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;
}
}