/* * ItemTask.java * * Copyright (c) 2015 ITSTAKE * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package tk.itstake.steakgui.itemtask; import ninja.amp.ampmenus.events.ItemClickEvent; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import tk.itstake.steakgui.SteakGUI; import tk.itstake.steakgui.gui.Menu; import tk.itstake.steakgui.util.*; import tk.itstake.util.BukkitUtil; import tk.itstake.util.LanguageHandler; import tk.itstake.util.MessageHandler; import java.util.ArrayList; import java.util.List; /** * Created by bexco on 2015-07-26. */ public class ItemTask { public static String COMMAND = "command"; public static String OPEN_MENU = "open"; public static String BUY = "buy"; public static String SELL = "sell"; public static String MESSAGE = "message"; public static String GIVE = "give"; public static String TAKE = "take"; public static String SOUND = "sound"; public static String BROADCAST = "broadcast"; public static String CLOSE = "close"; public static String UPDATE = "update"; public static String IF = "if"; String TYPE = ""; Object[] DATA = null; ArrayList<ClickType> CLICKTYPE = null; private MessageHandler mh = new MessageHandler(); private LanguageHandler lh = new LanguageHandler(); public ItemTask(String type, Object[] data, ArrayList<ClickType> clickType) { TYPE = type; DATA = data; CLICKTYPE = clickType; } public ItemTask(String type, Object[] data) { TYPE = type; DATA = data; CLICKTYPE = null; } public void runTask(final ItemClickEvent event, final Menu MENU) throws Exception { JSONParser parser = new JSONParser(); int i = 0; for(Object data:DATA) { DATA[i] = SteakGUI.convertMessage((String)data, MENU, event.getPlayer()); i++; } if(CLICKTYPE == null || CLICKTYPE.contains(event.getClick())) { if (TYPE.equals(COMMAND) && DATA.length == 2) { String permission = (String)DATA[0]; String command = (String)DATA[1]; event.getPlayer().setMetadata("SGCmd", new FixedMetadataValue(Bukkit.getServer().getPluginManager().getPlugin("SteakGUI"), SteakGUI.convertMessage(command, MENU, event.getPlayer()))); if (permission.equals("op") && !event.getPlayer().isOp()) { event.getPlayer().setOp(true); Bukkit.getServer().getPluginManager().callEvent(new PlayerCommandPreprocessEvent(event.getPlayer(), SteakGUI.convertMessage(command, MENU, event.getPlayer()))); event.getPlayer().setOp(false); } else if (permission.equals("console")) { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.substring(1)); } else { Bukkit.getServer().getPluginManager().callEvent(new PlayerCommandPreprocessEvent(event.getPlayer(), SteakGUI.convertMessage(command, MENU, event.getPlayer()))); } } else if (TYPE.equals(OPEN_MENU) && DATA.length == 1) { final String menuname = (String)DATA[0]; event.setWillClose(true); Bukkit.getServer().getScheduler().runTaskLater(SteakGUI.p, new Runnable() { @Override public void run() { Menu openmenu = MenuFileHandler.loadMenu(SteakGUI.convertMessage(menuname, MENU, event.getPlayer())); openmenu.open(event.getPlayer()); } }, 2); } else if (TYPE.equals(BUY) && DATA.length == 7) { String type = (String)DATA[0]; String json = (String)DATA[1]; String costtype = (String)DATA[2]; String cost = (String)DATA[3]; String buycompletemsg = (String)DATA[4]; String nomoneymsg = (String)DATA[5]; String noslotmsg = (String)DATA[6]; if (type.equals("item")) { JSONObject jo = null; try { jo = (JSONObject) parser.parse(json); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack item = ItemStackConverter.convert(jo); if(costtype.equals("money")) { if (VaultHooker.economy.getBalance(event.getPlayer().getName()) >= parseCost((String) cost)) { if (event.getPlayer().getInventory().firstEmpty() != -1) { event.getPlayer().getInventory().addItem(item); VaultHooker.economy.withdrawPlayer(event.getPlayer().getName(), parseCost((String) cost)); if(!buycompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(buycompletemsg, MENU, event.getPlayer())); } } else { if(!noslotmsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(noslotmsg, MENU, event.getPlayer())); } } } else { if(!nomoneymsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(nomoneymsg, MENU, event.getPlayer())); } } } else if(costtype.equals("item")) { JSONObject jo2 = null; try { jo2 = (JSONObject) parser.parse(cost); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack item2 = ItemStackConverter.convert(jo2); if (BukkitUtil.hasItem(event.getPlayer().getInventory(), item2)) { if (event.getPlayer().getInventory().firstEmpty() != -1) { event.getPlayer().getInventory().setContents(BukkitUtil.removeItem(event.getPlayer().getInventory(), item2).getContents()); event.getPlayer().getInventory().addItem(item); if(!buycompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(buycompletemsg, MENU, event.getPlayer())); } } else { if(!noslotmsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(noslotmsg, MENU, event.getPlayer())); } } } else { if(!nomoneymsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(nomoneymsg, MENU, event.getPlayer())); } } } else if(costtype.equals("permission")) { if(event.getPlayer().hasPermission((String)cost)) { if (event.getPlayer().getInventory().firstEmpty() != -1) { event.getPlayer().getInventory().addItem(item); VaultHooker.permission.playerRemove(event.getPlayer(), (String)cost); if(!buycompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(buycompletemsg, MENU, event.getPlayer())); } } else { if(!noslotmsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(noslotmsg, MENU, event.getPlayer())); } } } else { if(!nomoneymsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(nomoneymsg, MENU, event.getPlayer())); } } } } else if (type.equals("permission")) { if(!event.getPlayer().hasPermission((String)json)) { if (costtype.equals("money")) { if (VaultHooker.economy.getBalance(event.getPlayer().getName()) >= parseCost((String) cost)) { VaultHooker.permission.playerAdd(event.getPlayer(), (String)json); if(!buycompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(buycompletemsg, MENU, event.getPlayer())); } } else { if(!nomoneymsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(nomoneymsg, MENU, event.getPlayer())); } } } else if (costtype.equals("item")) { JSONObject jo2 = null; try { jo2 = (JSONObject) parser.parse(cost); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack item2 = ItemStackConverter.convert(jo2); if (BukkitUtil.hasItem(event.getPlayer().getInventory(), item2)) { event.getPlayer().getInventory().setContents(BukkitUtil.removeItem(event.getPlayer().getInventory(), item2).getContents()); VaultHooker.permission.playerAdd(event.getPlayer(), (String)json); if(!buycompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(buycompletemsg, MENU, event.getPlayer())); } } } else if(costtype.equals("permission")) { if(event.getPlayer().hasPermission((String)cost)) { VaultHooker.permission.playerRemove(event.getPlayer(), (String)cost); VaultHooker.permission.playerAdd(event.getPlayer(), (String)json); if(!buycompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(buycompletemsg, MENU, event.getPlayer())); } } else { if(!nomoneymsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(nomoneymsg, MENU, event.getPlayer())); } } } } else { mh.sendMessage(event.getPlayer(), lh.getLanguage("existpermission")); } } } else if (TYPE.equals(SELL) && DATA.length == 6) { String type = (String)DATA[0]; String sellitem = (String)DATA[1]; String costtype = (String)DATA[2]; String cost = (String)DATA[3]; String sellcompletemsg = (String)DATA[4]; String sellfailedmsg = (String)DATA[5]; if (type.equals("item")) { JSONObject jo = null; try { jo = (JSONObject) parser.parse(sellitem); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack item = ItemStackConverter.convert(jo); if(BukkitUtil.hasItem(event.getPlayer().getInventory(), item)) { event.getPlayer().getInventory().setContents(BukkitUtil.removeItem(event.getPlayer().getInventory(), item).getContents()); if(costtype.equals("money")) { VaultHooker.economy.depositPlayer(event.getPlayer().getName(), parseCost((String) cost)); if(!sellcompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(sellcompletemsg, MENU, event.getPlayer())); } } else if(costtype.equals("item")) { JSONParser jp2 = new JSONParser(); JSONObject jo2 = null; try { jo2 = (JSONObject) parser.parse(cost); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack item2 = ItemStackConverter.convert(jo2); event.getPlayer().getInventory().addItem(item2); if(!sellcompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(sellcompletemsg, MENU, event.getPlayer())); } } else if(costtype.equals("permission")) { VaultHooker.permission.playerAdd(event.getPlayer(), (String)cost); if(!sellcompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(sellcompletemsg, MENU, event.getPlayer())); } } } else { if(!sellfailedmsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(sellfailedmsg, MENU, event.getPlayer())); } } } else if (type.equals("permission")) { if(event.getPlayer().hasPermission((String)sellitem)) { if(costtype.equals("money")) { VaultHooker.economy.depositPlayer(event.getPlayer().getName(), parseCost((String) cost)); VaultHooker.permission.playerRemove(event.getPlayer(), (String)sellitem); } else if(costtype.equals("item")) { JSONObject jo = null; try { jo = (JSONObject) parser.parse(cost); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack item = ItemStackConverter.convert(jo); event.getPlayer().getInventory().addItem(item); VaultHooker.permission.playerRemove(event.getPlayer(), (String)sellitem); } else if(costtype.equals("permission")) { if(!event.getPlayer().hasPermission((String)cost)) { VaultHooker.permission.playerAdd(event.getPlayer(), (String)cost); VaultHooker.permission.playerRemove(event.getPlayer(), (String)sellitem); } } if(!sellcompletemsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(sellcompletemsg, MENU, event.getPlayer())); } } else { if(!sellfailedmsg.equals("")) { mh.sendMessage(event.getPlayer(), SteakGUI.convertMessage(sellfailedmsg, MENU, event.getPlayer())); } } } } else if (TYPE.equals(MESSAGE) && DATA.length == 1) { String message = (String)DATA[0]; new MessageHandler().sendMessage(event.getPlayer(), SteakGUI.convertMessage(message, MENU, event.getPlayer())); } else if (TYPE.equals(GIVE) && DATA.length == 2) { String type = (String)DATA[0]; String json = (String)DATA[1]; if (type.equals("item")) { JSONObject jo = null; try { jo = (JSONObject) parser.parse(json); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack additem = ItemStackConverter.convert(jo); if(additem.getItemMeta().getDisplayName() != null) { additem.getItemMeta().setDisplayName(SteakGUI.convertMessage(additem.getItemMeta().getDisplayName(), MENU, event.getPlayer())); } if(additem.getItemMeta().getLore() != null && additem.getItemMeta().getLore().size() > 0) { List<String> lorel = additem.getItemMeta().getLore(); i = 0; for(String lore:lorel) { lorel.add(i, SteakGUI.convertMessage(lore, MENU, event.getPlayer())); } additem.getItemMeta().setLore(lorel); } event.getPlayer().getInventory().addItem(additem); } else if (type.equals("permission")) { VaultHooker.permission.playerAdd(event.getPlayer(), (String)json); } else if (type.equals("money")) { VaultHooker.economy.depositPlayer(event.getPlayer().getName(), parseCost((String)json)); } else if (type.equals("exp")) { if (isNum((String)json)) { event.getPlayer().giveExp(Integer.parseInt((String) json)); } else { throw new Exception("Input String is Not Number"); } } else if (type.equals("level")) { if (isNum((String) json)) { event.getPlayer().giveExpLevels(Integer.parseInt((String) json)); } else { throw new Exception("Input String is Not Number"); } } } else if (TYPE.equals(TAKE) && DATA.length == 2) { String type = (String)DATA[0]; String json = (String)DATA[1]; if (type.equals("item")) { JSONObject jo = null; try { jo = (JSONObject) parser.parse(json); } catch(Exception e) { mh.sendMessage(event.getPlayer(), lh.getLanguage("menu.wrongsetting")); e.printStackTrace(); return; } ItemStack removeitem = ItemStackConverter.convert(jo); if(removeitem.getItemMeta().getDisplayName() != null) { removeitem.getItemMeta().setDisplayName(SteakGUI.convertMessage(removeitem.getItemMeta().getDisplayName(), MENU, event.getPlayer())); } if(removeitem.getItemMeta().getLore() != null && removeitem.getItemMeta().getLore().size() > 0) { List<String> lorel = removeitem.getItemMeta().getLore(); i = 0; for(String lore:lorel) { lorel.add(i, SteakGUI.convertMessage(lore, MENU, event.getPlayer())); } removeitem.getItemMeta().setLore(lorel); } event.getPlayer().getInventory().setContents(BukkitUtil.removeItem(event.getPlayer().getInventory(), removeitem).getContents()); } else if (type.equals("permission")) { VaultHooker.permission.playerRemove(event.getPlayer(), (String)json); } else if (type.equals("money")) { VaultHooker.economy.withdrawPlayer(event.getPlayer().getName(), parseCost((String)json)); } else if (type.equals("exp")) { if (isNum((String)json)) { event.getPlayer().giveExp(Integer.parseInt((String)json) * -1); } else { throw new Exception("Input String is Not Number"); } } else if (type.equals("level")) { if (isNum((String)json)) { event.getPlayer().giveExpLevels(Integer.parseInt((String)json) * -1); } else { throw new Exception("Input String is Not Number"); } } } else if (TYPE.equals(SOUND) && DATA.length == 3) { String sound = (String)DATA[0]; String volume = (String)DATA[1]; String pitch = (String)DATA[2]; if (isFloat(volume) && isFloat(pitch)) { event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.valueOf(sound), Float.parseFloat(volume), Float.parseFloat(pitch)); } else { throw new Exception("Input String is Not Float"); } } else if (TYPE.equals(BROADCAST) && DATA.length == 1) { String message = (String)DATA[0]; for (Player player : BukkitUtil.allPlayers()) { new MessageHandler().sendMessage(player, SteakGUI.convertMessage(message, MENU, event.getPlayer())); } } else if (TYPE.equals(CLOSE)) { event.setWillClose(true); } else if (TYPE.equals(UPDATE)) { event.setWillClose(true); Bukkit.getServer().getScheduler().runTaskLater(SteakGUI.p, new Runnable() { @Override public void run() { MENU.open(event.getPlayer()); } }, 2); } else if(TYPE.equals(IF) && DATA.length == 3) { String first = SteakGUI.convertMessage((String)DATA[0]); if(first.equals("true")) { JSONArray jo = (JSONArray) DATA[2]; for(Object task:jo) { JSONObject json = (JSONObject)task; ItemTaskConverter.convert(json).runTask(event, MENU); } } else { JSONArray jo = (JSONArray) DATA[3]; for(Object task:jo) { JSONObject json = (JSONObject)task; ItemTaskConverter.convert(json).runTask(event, MENU); } } } else { SteakGUIPlugin.runTask(TYPE, DATA, event, MENU); } } } private boolean isNum(String str) { try { Integer.parseInt(str); } catch (Exception e) { return false; } return true; } private boolean isFloat(String str) { try { Float.parseFloat(str); } catch (Exception e) { return false; } return true; } public String getType() { return TYPE; } public Object[] getData() { return DATA; } public ArrayList<ClickType> getClickType() { if(CLICKTYPE != null) { return CLICKTYPE; } else { return null; } } public void setClickType(ArrayList<ClickType> type) { CLICKTYPE = type; } private double parseCost(String cost) { if(isNum(cost)) { return Integer.parseInt(cost); } else { return Double.parseDouble(cost); } } private boolean isDouble(String cost) { try { Double.parseDouble(cost); } catch (Exception e) { return false; } return true; } private boolean isCost(String cost) { if(isNum(cost)) { return true; } else if(isDouble(cost)) { return true; } else { return false; } } }