package tv.mineinthebox.essentials.events.shops;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.metadata.FixedMetadataValue;
import tv.mineinthebox.essentials.xEssentials;
import tv.mineinthebox.essentials.hook.Hooks;
import tv.mineinthebox.essentials.instances.Shop;
import tv.mineinthebox.essentials.interfaces.EventTemplate;
import tv.mineinthebox.essentials.interfaces.XOfflinePlayer;
public class ShopInteractEvent extends EventTemplate implements Listener {
public ShopInteractEvent(xEssentials pl) {
super(pl, "Shop");
}
@EventHandler
public void onInteract(PlayerInteractEvent e) {
if(e.isCancelled()) {
return;
}
if(e.getPlayer().isSneaking()) {
return;
}
if(e.getAction() == Action.LEFT_CLICK_BLOCK) {
if(e.getClickedBlock().getType() == Material.WALL_SIGN || e.getClickedBlock().getType() == Material.SIGN_POST) {
Sign sign = (Sign)e.getClickedBlock().getState();
if(sign.getLine(0).equalsIgnoreCase(pl.getConfiguration().getShopConfig().getAdminShopPrefix())) {
Shop shop = new Shop(sign);
if(shop.hasSellPrice()) {
if(e.getPlayer().getInventory().containsAtLeast(shop.getItem(), shop.getAmount())) {
if(pl.getConfiguration().getEconomyConfig().isEconomyEnabled()) {
pl.getManagers().getEcoManager().depositMoney(e.getPlayer().getName(), shop.getSellPrice());
e.getPlayer().getInventory().removeItem(shop.getItem());
sendMessage(e.getPlayer(), "you selled your items for " + shop.getSellPrice());
} else if(Hooks.isVaultEcoEnabled()) {
pl.getManagers().getVaultManager().desposit(e.getPlayer(), shop.getSellPrice());
e.getPlayer().getInventory().removeItem(shop.getItem());
sendMessage(e.getPlayer(), "you selled your items for " + shop.getSellPrice());
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "no vault installed!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you dont have enough of these items to sell!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you cannot sell items in this shop!");
}
e.setCancelled(true);
} else if(isShopSign(sign.getLines())) {
Shop shop = getShop(sign.getLocation());
if(shop != null) {
if(shop.hasSellPrice()) {
if(e.getPlayer().getInventory().containsAtLeast(shop.getItem(), shop.getAmount())) {
if(pl.getConfiguration().getEconomyConfig().isEconomyEnabled()) {
pl.getManagers().getEcoManager().depositMoney(e.getPlayer().getName(), shop.getSellPrice());
e.getPlayer().getInventory().removeItem(shop.getItem());
shop.getShopChest().getInventory().addItem(shop.getItem());
sendMessage(e.getPlayer(), "you selled your items for " + shop.getSellPrice());
} else if(Hooks.isVaultEcoEnabled()) {
pl.getManagers().getVaultManager().desposit(e.getPlayer(), shop.getSellPrice());
e.getPlayer().getInventory().removeItem(shop.getItem());
shop.getShopChest().getInventory().addItem(shop.getItem());
sendMessage(e.getPlayer(), "you selled your items for " + shop.getSellPrice());
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "no vault installed!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you dont have enough of these items to sell!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you cannot sell items in this shop!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "this shop does not exist!");
}
e.setCancelled(true);
}
}
} else if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
if(e.getClickedBlock().getType() == Material.WALL_SIGN || e.getClickedBlock().getType() == Material.SIGN_POST) {
Sign sign = (Sign)e.getClickedBlock().getState();
if(sign.getLine(0).equalsIgnoreCase(pl.getConfiguration().getShopConfig().getAdminShopPrefix())) {
Shop shop = new Shop(sign);
if(pl.getConfiguration().getEconomyConfig().isEconomyEnabled()) {
if(pl.getManagers().getEcoManager().hasEnough(e.getPlayer().getName(), shop.getBuyPrice())) {
if(e.getPlayer().getInventory().firstEmpty() != -1) {
Inventory inv = Bukkit.createInventory(null, 36, "shop:");
for(int i = 0; i < inv.getSize(); i++) {
inv.setItem(i, shop.getItem());
}
e.getPlayer().setMetadata("shop", new FixedMetadataValue(pl, sign));
e.getPlayer().openInventory(inv);
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you need atleast have one inventory slot open!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you don't have enough money to afford this!");
}
} else if(Hooks.isVaultEcoEnabled()) {
if(pl.getManagers().getVaultManager().hasEnough(e.getPlayer().getName(), shop.getBuyPrice())) {
if(e.getPlayer().getInventory().firstEmpty() != -1) {
Inventory inv = Bukkit.createInventory(null, 36, "shop:");
for(int i = 0; i < inv.getSize(); i++) {
inv.setItem(i, shop.getItem());
}
e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.BLOCK_CHEST_OPEN, 1F, 1F);
e.getPlayer().openInventory(inv);
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you need atleast have one inventory slot open!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you don't have enough money to afford this!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "no vault installed!");
}
e.setCancelled(true);
} else if(isShopSign(sign.getLines())) {
Shop shop = getShop(sign.getLocation());
if(shop.hasBuyPrice()) {
if(e.getPlayer().getInventory().firstEmpty() != -1) {
if(pl.getConfiguration().getEconomyConfig().isEconomyEnabled()) {
if(pl.getManagers().getEcoManager().hasEnough(e.getPlayer().getName(), shop.getBuyPrice())) {
if(!shop.isSoldOut()) {
pl.getManagers().getEcoManager().withdrawMoney(e.getPlayer().getName(), shop.getBuyPrice());
pl.getManagers().getEcoManager().depositMoney(sign.getLine(0), shop.getBuyPrice());
shop.getShopChest().getInventory().removeItem(shop.getItem());
e.getPlayer().getInventory().addItem(shop.getItem());
sendMessage(e.getPlayer(), "you successfully bought " + shop.getItem().getType().name() + " " + shop.getAmount() + "x for " + shop.getBuyPrice());
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "the shop is sold out!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you cannot afford this!");
}
} else if(Hooks.isVaultEcoEnabled()) {
if(pl.getManagers().getVaultManager().hasEnough(e.getPlayer().getName(), shop.getBuyPrice())) {
if(!shop.isSoldOut()) {
pl.getManagers().getVaultManager().withdraw(e.getPlayer().getName(), shop.getBuyPrice());
pl.getManagers().getEcoManager().depositMoney(sign.getLine(0), shop.getBuyPrice());
shop.getShopChest().getInventory().removeItem(shop.getItem());
e.getPlayer().getInventory().addItem(shop.getItem());
sendMessage(e.getPlayer(), "you successfully bought " + shop.getItem().getType().name() + " " + shop.getAmount() + "x for " + shop.getBuyPrice());
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "the shop is sold out!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you cannot afford this!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "no vault installed!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "you need atleast one empty slot!");
}
} else {
sendMessage(e.getPlayer(), ChatColor.RED + "this is not a buy sign!");
}
e.setCancelled(true);
}
}
}
}
private boolean isShopSign(String[] lines) {
if(lines[1].matches("[0-9]+")) {
int amount = Integer.parseInt(lines[1]);
if(amount <= 64) {
if(lines[2].matches("(?i)^b \\d+ s \\d+$") || lines[2].matches("(?i)^b \\d+$") || lines[2].matches("(?i)^s \\d+$")) {
if(lines[3].matches("([0-9]+):([0-9]+)")) {
return true;
} else {
try {
Material.valueOf(lines[3].toUpperCase().replaceAll(" ", "_"));
return true;
} catch(IllegalArgumentException e) {
return false;
}
}
}
}
}
return false;
}
private Shop getShop(Location loc) {
for(XOfflinePlayer off : pl.getManagers().getPlayerManager().getOfflinePlayers()) {
if(off.isShop(loc)) {
return off.getShop(loc);
}
}
return null;
}
}