/* * Variables.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.variable; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import tk.itstake.steakgui.SteakGUI; import tk.itstake.steakgui.gui.Menu; import tk.itstake.steakgui.util.SteakGUIPlugin; import tk.itstake.steakgui.util.VaultHooker; import tk.itstake.util.BukkitUtil; import java.util.ArrayList; import java.util.HashMap; /** * Created by ITSTAKE on 2015-08-11. */ public class Variables { HashMap<String, String[]> placeholders = new HashMap<>(); public Variables() { placeholders.put("player", new String[]{}); } public boolean isPlaceHolder(String placeholder) { if(placeholders.containsKey(placeholder)) { return true; } else { return false; } } public String convert(String placeholder, Menu menu, Player player) { return convert(placeholder, new String[]{}, menu, player); } public String convert(String placeholder, ArrayList<String> data, Menu menu, Player player) { String[] strarray = new String[data.size()]; int i = 0; for(String str:data) { strarray[i] = SteakGUI.convertMessage(str, menu, player); i++; } return convert(placeholder, strarray, menu, player); } public String convert(String var, String[] data, Menu menu, Player player) { int i = 0; for(String str:data) { data[i] = SteakGUI.convertMessage(str, menu, player); i++; } switch(var) { case "player": return player.getName(); case "playerdisplay": return player.getDisplayName(); case "playerlist": return player.getPlayerListName(); case "playerexp": return player.getExp() + ""; case "playerlevel": return player.getLevel() + 0.0 + ""; case "playerleftexp": return player.getExpToLevel() + 0.0 + ""; case "playertotalexp": return player.getTotalExperience() + 0.0 + ""; case "playerfood": return player.getFoodLevel() + 0.0 + ""; case "playerhealth": return player.getHealth() + ""; case "playermaxhealth": return player.getMaxHealth() + ""; case "playergamemode": return player.getGameMode().toString(); case "menutitle": return menu.getTitle(); case "add": if(data.length == 2) { if(isNum(data[0]) && isNum(data[1])) { return parseNum(data[0]) + parseNum(data[1]) + ""; } else { return null; } } else { return null; } case "sub": if(data.length == 2) { if(isNum(data[0]) && isNum(data[1])) { return parseNum(data[0]) - parseNum(data[1]) + ""; } else { return null; } } else { return null; } case "multiply": if(data.length == 2) { if(isNum(data[0]) && isNum(data[1])) { return parseNum(data[0]) * parseNum(data[1]) + ""; } else { return null; } } else { return null; } case "divide": if(data.length == 2) { if(isNum(data[0]) && isNum(data[1]) && parseNum(data[1]) > 0) { return parseNum(data[0]) / parseNum(data[1]) + ""; } else { return null; } } else { return null; } case "if": if(data.length == 4) { String syntax = VariableConverter.convert(data[0], menu, player); if(syntaxConvert(syntax)) { return VariableConverter.convert(data[1], menu, player); } else { return ""; } } else if(data.length == 5) { String syntax = VariableConverter.convert(data[0], menu, player); if(syntaxConvert(syntax)) { return VariableConverter.convert(data[2], menu, player); } else { return VariableConverter.convert(data[3], menu, player); } } else { return null; } case "money": return VaultHooker.economy.getBalance(player.getName()) + ""; case "prefix": return VaultHooker.chat.getPlayerPrefix(player); case "suffix": return VaultHooker.chat.getPlayerPrefix(player); case "integer": if(data.length == 1 && isNum(data[0])) { return parseNum(data[0]) + ""; } else { return null; } case "replace": if(data.length == 3) { return data[0].replace(data[1], data[2]); } else { return null; } case "maxplayers": return Bukkit.getServer().getMaxPlayers() + ""; case "currentplayers": return BukkitUtil.allPlayers().length + ""; default: return SteakGUIPlugin.getVariables(var, data, menu, player); } } public static boolean syntaxConvert(String syntax) { String[] orsplited = syntax.split("\\|\\|"); for(String st:orsplited) { String[] andsp = st.split("&&"); ArrayList<Boolean> andbool = new ArrayList<>(); for(String sp:andsp) { andbool.add(ifConvert(sp)); } if(!andbool.contains(false)) { return true; } } return false; } private static boolean ifConvert(String sp) { String[] targetmath = new String[]{"==", "!=", "<=", ">=", "?=", ">", "<"}; for(String math:targetmath) { String[] splited = sp.split(math); if(splited.length == 2) { String one = splited[0].trim(); String two = splited[1].trim(); switch(math) { case "==": return one.equals(two); case "!=": return !one.equals(two); case "<=": return (parseNum(one) <= parseNum(two)); case ">=": return (parseNum(one) >= parseNum(two)); case "?=": return one.contains(two); case ">": return (parseNum(one) > parseNum(two)); case "<": return (parseNum(one) < parseNum(two)); default: return false; } } } return false; } private static double parseNum(String cost) { if(isInt(cost)) { return Integer.parseInt(cost); } else { return Double.parseDouble(cost); } } private static boolean isNum(String cost) { if(isInt(cost)) { return true; } else if(isDouble(cost)) { return true; } else { return false; } } private static boolean isDouble(String cost) { try { Double.parseDouble(cost); } catch (Exception e) { return false; } return true; } private static boolean isInt(String str) { try { Integer.parseInt(str); } catch (Exception e) { return false; } return true; } }