package regalowl.hyperconomy;
import java.util.HashMap;
import org.bukkit.ChatColor;
import org.bukkit.Location;
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;
public class Manageshop implements CommandExecutor {
private HashMap<HyperPlayer, PlayerShop> currentShop = new HashMap<HyperPlayer, PlayerShop>();
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
HyperConomy hc = HyperConomy.hc;
LanguageFile L = hc.getLanguageFile();
if (hc.getHyperLock().isLocked(sender)) {
hc.getHyperLock().sendLockMessage(sender);
return true;
}
if (!hc.gYH().gFC("config").getBoolean("config.use-player-shops")) {
sender.sendMessage(L.get("PLAYERSHOPS_DISABLED"));
return true;
}
int maxVolume = hc.gYH().gFC("config").getInt("config.max-player-shop-volume");
EconomyManager em = hc.getEconomyManager();
Player player = null;
if (sender instanceof Player) {
player = (Player)sender;
}
if (player == null) {return true;}
HyperPlayer hp = em.getHyperPlayer(player.getName());
HyperEconomy he = em.getEconomy(hp.getEconomy());
if (em.inAnyShop(player)) {
Shop s = em.getShop(player);
if (s instanceof PlayerShop) {
PlayerShop ps = (PlayerShop)s;
if (ps.getOwner().equals(hp) || ps.isAllowed(hp) || player.hasPermission("hyperconomy.admin")) {
currentShop.put(hp, (PlayerShop)s);
}
}
}
PlayerShop cps = null;
if (currentShop.containsKey(hp)) {
cps = currentShop.get(hp);
if (!(cps.getOwner() == hp) && !cps.isAllowed(hp) && !player.hasPermission("hyperconomy.admin")) {
currentShop.remove(hp);
cps = null;
}
}
if (args.length == 0) {
player.sendMessage(L.get("MANAGESHOP_HELP"));
if (cps != null) {
player.sendMessage(L.f(L.get("MANAGESHOP_HELP2"), cps.getName()));
player.sendMessage(L.f(L.get("MANAGESHOP_HELP3"), cps.getName()) + " " + ChatColor.AQUA + cps.getOwner().getName());
player.sendMessage(L.get("MANAGESHOP_HELP4") + " " + ChatColor.AQUA + hc.getDataBukkit().getCommonFunctions().implode(cps.getAllowed(), ","));
} else {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
}
return true;
}
if (args[0].equalsIgnoreCase("select") || args[0].equalsIgnoreCase("sel")) {
if (args.length == 1) {
player.sendMessage(L.get("MANAGESHOP_SELECT_HELP"));
return true;
}
if (!em.shopExists(args[1])) {
player.sendMessage(L.get("SHOP_NOT_EXIST"));
return true;
}
Shop s = em.getShop(args[1]);
if (!(s instanceof PlayerShop)) {
player.sendMessage(L.get("ONLY_EDIT_OWN_SHOPS"));
return true;
}
PlayerShop ps = (PlayerShop)s;
if ((!(ps.getOwner().equals(hp) || ps.isAllowed(hp))) && !player.hasPermission("hyperconomy.admin")) {
player.sendMessage(L.get("ONLY_EDIT_OWN_SHOPS"));
return true;
}
currentShop.put(hp, ps);
player.sendMessage(L.get("SHOP_SELECTED"));
} else if (args[0].equalsIgnoreCase("setstock") && player.hasPermission("hyperconomy.admin")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
HyperObject ho = null;
double amount = 0.0;
if (args.length == 3) {
ho = hp.getHyperEconomy().getHyperObject(args[1]);
try {
amount = Double.parseDouble(args[2]);
} catch (Exception e) {
player.sendMessage(L.get("MANAGESHOP_SETSHOP_HELP"));
return true;
}
} else {
player.sendMessage(L.get("MANAGESHOP_SETSHOP_HELP"));
return true;
}
if (ho == null) {
player.sendMessage(L.get("OBJECT_NOT_IN_DATABASE"));
return true;
}
HyperObject ho2 = he.getHyperObject(ho.getName(), cps);
if (ho2 instanceof PlayerShopObject) {
PlayerShopObject pso = (PlayerShopObject)ho2;
pso.setStock(amount);
player.sendMessage(L.f(L.get("STOCK_SET"), pso.getName()));
return true;
} else {
player.sendMessage(L.get("OBJECT_NOT_IN_DATABASE"));
}
} else if (args[0].equalsIgnoreCase("add") || args[0].equalsIgnoreCase("a")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
int amount = 1;
HyperObject ho = null;
if (args.length == 1) {
ItemStack selectedItem = player.getItemInHand();
ho = hp.getHyperEconomy().getHyperObject(selectedItem);
} else if (args.length == 2) {
try {
amount = Integer.parseInt(args[1]);
} catch (Exception e) {
player.sendMessage(L.get("MANAGESHOP_ADD_HELP"));
return true;
}
ItemStack selectedItem = player.getItemInHand();
ho = hp.getHyperEconomy().getHyperObject(selectedItem);
} else if (args.length == 3) {
ho = hp.getHyperEconomy().getHyperObject(args[1]);
try {
amount = Integer.parseInt(args[2]);
} catch (Exception e) {
player.sendMessage(L.get("MANAGESHOP_ADD_HELP"));
return true;
}
} else {
player.sendMessage(L.get("MANAGESHOP_ADD_HELP"));
return true;
}
if (ho == null) {
player.sendMessage(L.get("OBJECT_NOT_IN_DATABASE"));
return true;
}
HyperObject ho2 = he.getHyperObject(ho.getName(), cps);
if (ho2 instanceof PlayerShopItem) {
PlayerShopItem pso = (PlayerShopItem)ho2;
int count = pso.count(player.getInventory());
if (amount > count) {
amount = count;
}
if (amount <= 0) {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
return true;
}
double amountRemoved = pso.remove(amount, player.getInventory());
((PlayerShopObject) pso).setStock(pso.getStock() + amountRemoved);
player.sendMessage(L.get("STOCK_ADDED"));
return true;
} else if (ho2 instanceof PlayerShopEnchant) {
PlayerShopEnchant pso = (PlayerShopEnchant)ho2;
if (amount < 1) {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
return true;
}
double removed = pso.removeEnchantment(player.getItemInHand());
if (removed > 0) {
((PlayerShopObject) pso).setStock(pso.getStock() + removed);
} else {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
}
return true;
} else if (ho2 instanceof ShopXp) {
ShopXp pso = (ShopXp)ho2;
if (amount < 1) {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
return true;
}
int count = pso.getTotalXpPoints(player);
if (amount > count) {
amount = count;
}
boolean success = pso.removeXp(player, amount);
if (success) {
((PlayerShopObject) pso).setStock(pso.getStock() + amount);
} else {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
}
} else {
hc.getDataBukkit().writeError("Setting PlayerShopObject stock failed in /ms add.");
return true;
}
} else if (args[0].equalsIgnoreCase("remove") || args[0].equalsIgnoreCase("r")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
if (args.length < 2) {
player.sendMessage(L.get("MANAGESHOP_REMOVE_HELP"));
return true;
}
int amount = 1;
if (args.length == 3) {
try {
amount = Integer.parseInt(args[2]);
} catch (Exception e) {}
}
HyperObject ho = he.getHyperObject(args[1], cps);
if (ho == null) {
player.sendMessage(L.get("OBJECT_NOT_IN_DATABASE"));
return true;
}
if (ho instanceof PlayerShopItem) {
PlayerShopItem pso = (PlayerShopItem)ho;
if (pso.getStock() < amount) {
amount = (int) Math.floor(pso.getStock());
}
if (amount <= 0.0) {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
return true;
}
int space = pso.getAvailableSpace(player.getInventory());
if (space < amount) {
player.sendMessage(L.get("NOT_ENOUGH_SPACE"));
return true;
}
pso.add(amount, player.getInventory());
((PlayerShopObject) pso).setStock(pso.getStock() - amount);
player.sendMessage(L.get("STOCK_REMOVED"));
return true;
} else if (ho instanceof PlayerShopEnchant) {
PlayerShopEnchant pso = (PlayerShopEnchant)ho;
if (pso.getStock() < 1) {
amount = (int) Math.floor(pso.getStock());
}
if (amount < 1) {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
return true;
}
double amountAdded = pso.addEnchantment(player.getItemInHand());
if (amountAdded > 0) {
((PlayerShopObject) pso).setStock(pso.getStock() - amountAdded);
} else {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
}
} else if (ho instanceof ShopXp) {
ShopXp pso = (ShopXp)ho;
if (pso.getStock() < amount) {
amount = (int) Math.floor(pso.getStock());
}
if (amount < 1) {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
return true;
}
boolean success = pso.addXp(player, amount);
if (success) {
((PlayerShopObject) pso).setStock(pso.getStock() - amount);
} else {
player.sendMessage(L.get("MUST_TRANSFER_MORE_THAN_ZERO"));
}
} else {
hc.getDataBukkit().writeError("Setting PlayerShopObject stock failed in /ms remove.");
return true;
}
} else if (args[0].equalsIgnoreCase("create") || args[0].equalsIgnoreCase("c")) {
if (args.length == 1) {
player.sendMessage(L.get("MANAGESHOP_CREATE_HELP"));
return true;
}
if (em.shopExists(args[1])){
player.sendMessage(L.get("SHOP_ALREADY_EXISTS"));
return true;
}
int maxShops = hc.gYH().gFC("config").getInt("config.max-shops-per-player");
if (em.getShops(hp).size() > maxShops && !player.hasPermission("hyperconomy.admin")) {
player.sendMessage(L.f(L.get("SHOP_LIMIT_REACHED"), maxShops));
return true;
}
String name = args[1];
int radius = 2;
if (args.length > 2) {
try {
radius = Integer.parseInt(args[2]);
} catch (Exception e) {
//continue
}
}
PlayerShop newShop = new PlayerShop(name, hp.getEconomy(), hp);
Location l = player.getLocation();
newShop.setPoint1(player.getWorld().getName(), l.getBlockX() - radius, l.getBlockY() - radius, l.getBlockZ() - radius);
newShop.setPoint2(player.getWorld().getName(), l.getBlockX() + radius, l.getBlockY() + radius, l.getBlockZ() + radius);
if (newShop.getVolume() > maxVolume) {
player.sendMessage(L.f(L.get("CANT_MAKE_SHOP_LARGER_THAN"), maxVolume));
newShop.deleteShop();
return true;
}
for (HyperObject ho:he.getHyperObjects(newShop)) {
if (ho instanceof PlayerShopObject) {
((PlayerShopObject) ho).setStatus(HyperObjectStatus.NONE);
}
}
em.addShop(newShop);
player.sendMessage(L.get("SHOP_CREATED"));
} else if (args[0].equalsIgnoreCase("delete") || args[0].equalsIgnoreCase("d")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
if (cps.isEmpty()) {
cps.deleteShop();
currentShop.remove(hp);
player.sendMessage(L.f(L.get("HAS_BEEN_REMOVED"), cps.getName()));
return true;
} else {
if (args.length >= 2 && args[1].equalsIgnoreCase("confirm")) {
cps.deleteShop();
currentShop.remove(hp);
player.sendMessage(L.f(L.get("HAS_BEEN_REMOVED"), cps.getName()));
return true;
} else {
player.sendMessage(L.get("MANAGESHOP_DELETE_CONFIRM"));
return true;
}
}
} else if (args[0].equalsIgnoreCase("set1") || args[0].equalsIgnoreCase("s1")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
Location priorLoc = cps.getLocation1();
cps.setPoint1(player.getLocation());
if (cps.getVolume() > maxVolume) {
player.sendMessage(L.f(L.get("CANT_MAKE_SHOP_LARGER_THAN"), maxVolume));
cps.setPoint1(priorLoc);
return true;
}
player.sendMessage(L.get("P1_SET"));
} else if (args[0].equalsIgnoreCase("set2") || args[0].equalsIgnoreCase("s2")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
Location priorLoc = cps.getLocation2();
cps.setPoint2(player.getLocation());
if (cps.getVolume() > maxVolume) {
player.sendMessage(L.f(L.get("CANT_MAKE_SHOP_LARGER_THAN"), maxVolume));
cps.setPoint2(priorLoc);
return true;
}
player.sendMessage(L.get("P2_SET"));
} else if (args[0].equalsIgnoreCase("price") || args[0].equalsIgnoreCase("p")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
if (args.length != 3) {
player.sendMessage(L.get("MANAGESHOP_PRICE_HELP"));
return true;
}
double price = 0.0;
try {
price = Double.parseDouble(args[2]);
} catch (Exception e) {
player.sendMessage(L.get("MANAGESHOP_PRICE_HELP"));
return true;
}
if (!he.objectTest(args[1])) {
player.sendMessage(L.get("OBJECT_NOT_IN_DATABASE"));
return true;
}
HyperObject ho = he.getHyperObject(args[1], cps);
if (ho instanceof PlayerShopObject) {
((PlayerShopObject) ho).setPrice(price);
player.sendMessage(L.get("PRICE_SET"));
return true;
} else {
hc.getDataBukkit().writeError("Setting PlayerShopObject price failed.");
return true;
}
} else if (args[0].equalsIgnoreCase("status") || args[0].equalsIgnoreCase("s")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
if (args.length != 3) {
player.sendMessage(L.get("MANAGESHOP_STATUS_HELP"));
return true;
}
HyperObjectStatus status = HyperObjectStatus.fromString(args[2]);
if (status == HyperObjectStatus.NONE && !args[2].equalsIgnoreCase("none")) {
player.sendMessage(L.get("INVALID_STATUS"));
return true;
}
if (!he.objectTest(args[1]) && !args[1].equalsIgnoreCase("all")) {
player.sendMessage(L.get("OBJECT_NOT_IN_DATABASE"));
return true;
}
if (args[1].equalsIgnoreCase("all")) {
for (HyperObject ho:he.getHyperObjects(cps)) {
if (ho instanceof PlayerShopObject) {
((PlayerShopObject) ho).setStatus(status);
}
}
player.sendMessage(L.get("ALL_STATUS_SET"));
return true;
} else {
HyperObject ho = he.getHyperObject(args[1], cps);
if (ho instanceof PlayerShopObject) {
((PlayerShopObject) ho).setStatus(status);
player.sendMessage(L.get("STATUS_SET"));
return true;
} else {
hc.getDataBukkit().writeError("Setting PlayerShopObject status failed.");
return true;
}
}
} else if (args[0].equalsIgnoreCase("allow")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
if (args.length != 2) {
player.sendMessage(L.get("MANAGESHOP_ALLOW_HELP"));
return true;
}
if (!em.hasAccount(args[1])) {
player.sendMessage(L.get("ACCOUNT_NOT_EXIST"));
return true;
}
HyperPlayer ap = em.getHyperPlayer(args[1]);
if (cps.isAllowed(ap)) {
cps.removeAllowed(ap);
player.sendMessage(L.get("DISALLOWED_TO_MANAGE_SHOP"));
} else {
cps.addAllowed(ap);
player.sendMessage(L.get("ALLOWED_TO_MANAGE_SHOP"));
}
return true;
} else if (args[0].equalsIgnoreCase("owner") && player.hasPermission("hyperconomy.admin")) {
if (cps == null) {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
return true;
}
if (args.length != 2) {
player.sendMessage(L.get("MANAGESHOP_OWNER_HELP"));
return true;
}
if (!em.hasAccount(args[1])) {
player.sendMessage(L.get("ACCOUNT_NOT_EXIST"));
return true;
}
HyperPlayer newOwner = em.getHyperPlayer(args[1]);
cps.setOwner(newOwner);
player.sendMessage(L.get("OWNER_SET"));
return true;
} else {
player.sendMessage(L.get("MANAGESHOP_HELP"));
if (cps != null) {
player.sendMessage(L.f(L.get("MANAGESHOP_HELP2"), cps.getName()));
player.sendMessage(L.f(L.get("MANAGESHOP_HELP3"), cps.getName()) + " " + ChatColor.AQUA + cps.getOwner().getName());
player.sendMessage(L.get("MANAGESHOP_HELP4") + " " + ChatColor.AQUA + hc.getDataBukkit().getCommonFunctions().implode(cps.getAllowed(), ","));
} else {
player.sendMessage(L.get("NO_SHOP_SELECTED"));
}
return true;
}
return true;
}
}