From a6966bddb700187934e022ada354680631ae865e Mon Sep 17 00:00:00 2001 From: Krglok Date: Thu, 17 Jan 2013 19:23:20 +0100 Subject: [PATCH 01/29] First Update on ClassRank with error correction in Vault-Permission --- src/net/slipcor/classranks/ClassRanks.java | 3 +- .../classranks/handlers/HandleBPerms.java | 5 +- .../classranks/handlers/HandleSuperPerms.java | 4 +- .../classranks/handlers/HandleVaultPerms.java | 95 ++++++++++++++----- .../classranks/managers/ClassManager.java | 4 +- .../classranks/managers/CommandManager.java | 83 +++++++++++----- .../classranks/register/payment/Methods.java | 8 +- src/plugin.yml | 5 +- 8 files changed, 148 insertions(+), 59 deletions(-) diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index d6d8544..97ae8f6 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -70,7 +70,8 @@ public void onEnable() { db.i("Vault found!"); if (getConfig().getBoolean("vaultpermissions")) { this.perms = new HandleVaultPerms(this); - } + log("ClassRank Vault permissions plugin found", Level.INFO); // success! + this.perms.setupPermissions(); } if (getConfig().getBoolean("vaulteconomy")) { setupEconomy(); } diff --git a/src/net/slipcor/classranks/handlers/HandleBPerms.java b/src/net/slipcor/classranks/handlers/HandleBPerms.java index 9056f10..1e44e54 100644 --- a/src/net/slipcor/classranks/handlers/HandleBPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleBPerms.java @@ -23,6 +23,7 @@ * @author slipcor */ +@SuppressWarnings("deprecation") public class HandleBPerms extends CRHandler { private final ClassRanks plugin; private final DebugManager db; @@ -34,7 +35,8 @@ public HandleBPerms(ClassRanks cr) { @Override public boolean isInGroup(String world, String permName, String player) { - return ApiLayer.hasGroupRecursive(world, CalculableType.USER, player, + //ApiLayer.hasGroup(world, type, name, group) + return ApiLayer.hasGroup(world, CalculableType.USER, player, permName); } @@ -134,6 +136,7 @@ public void rankRemove(String world, String player, String cString) { } for (int i = 0; i < worlds.length; i++) { try { + ApiLayer.removeGroup(worlds[i], CalculableType.USER, player, cString); db.i("removed rank " + cString + " from player " + player diff --git a/src/net/slipcor/classranks/handlers/HandleSuperPerms.java b/src/net/slipcor/classranks/handlers/HandleSuperPerms.java index 26c54b6..7435925 100644 --- a/src/net/slipcor/classranks/handlers/HandleSuperPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleSuperPerms.java @@ -49,7 +49,7 @@ public boolean isInGroup(String world, String permName, String player) { */ @Override public boolean setupPermissions() { - plugin.log("No permissions plugin found, defaulting to SuperPerms.", Level.INFO); // success! + plugin.log("No permissions plugin found, No Permissions are used.", Level.INFO); // success! return true; } @@ -85,6 +85,7 @@ public void rankAdd(String world, String player, String rank) { plugin.getConfig().set("players." + player + "." + cString, rank); db.i("added rank " + rank + " to player " + player + ", no world support"); plugin.saveConfig(); + plugin.log("SuperPerm PermName " + rank + ": user " + player + " set " + world, Level.INFO); } /* @@ -127,6 +128,7 @@ public void classAddGlobal(String player, String cString) { @Override public void rankAddGlobal(String player, String rank) { rankAdd(null, player, rank); + plugin.log("SuperPerm PermName " + rank + ": user " + player , Level.INFO); } @Override diff --git a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java index 8eaecef..517776a 100644 --- a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java @@ -1,6 +1,7 @@ package net.slipcor.classranks.handlers; import java.util.ArrayList; +import java.util.Map; import java.util.logging.Level; import net.milkbowl.vault.permission.Permission; @@ -87,18 +88,24 @@ public void classAdd(String world, String player, String cString) { @Override public void rankAdd(String world, String player, String rank) { player = PlayerManager.search(player); // auto-complete playername - if (world.equalsIgnoreCase("all")) { rankAddGlobal(player, rank); return; } + String cString = ClassManager.getClassNameByPermName(rank); + plugin.getConfig().set("players." + player + "." + cString, rank); + plugin.getConfig().set("worlds." + world + "." + player, rank); + plugin.saveConfig(); + db.i("Vault PermName " + rank + ": user " + player + " set " + world); + try { - permission.playerAddGroup(world, player, rank); - db.i("added rank " + rank + " to player " + player - + " in world " + world); + if (permission.playerAddGroup(world, player, rank)) { + db.i("Vault added rank " + rank + " to player " + player + " in world " + world); + } else { + db.i("ERROR Vault added rank " + rank + " to player " + player + " in world " + world); + } } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found in world " + world, Level.WARNING); + plugin.log("Vault Exception added rank " + rank + " or user " + player + " not found in world " + world, Level.WARNING); } } @@ -113,6 +120,10 @@ public void rankRemove(String world, String player, String cString) { rankRemoveGlobal(player, cString); return; } + plugin.getConfig().set("players." + player, null); + plugin.getConfig().set("worlds." + world + "." + player, null); + plugin.saveConfig(); + try { permission.playerRemoveGroup(world, player, cString); db.i("removed rank " + cString + " from player " + player @@ -123,24 +134,50 @@ public void rankRemove(String world, String player, String cString) { } } + @SuppressWarnings("unchecked") @Override public String getPermNameByPlayer(String world, String player) { - player = PlayerManager.search(player); // auto-complete playername - ArrayList permGroups = new ArrayList(); - - if (world.equalsIgnoreCase("all")) { - return getPermNameByPlayerGlobal(player); - } - db.i("checking world "+world); - String[] list = permission.getPlayerGroups(world, player); - for (String sRank : list) { - db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) { - permGroups.add(sRank); +// ArrayList permGroups = new ArrayList(); + Map groups = null; + + String cPerm = ""; + + if ((world == "") || (world == "all") ) { + try { + groups = plugin.getConfig().getConfigurationSection("players." + player).getValues(true); + } catch (Exception e) { + db.i("Exception GetPermByPlayer : GetConfigurationSection"); + } + + if (groups == null) { + return ""; + } + // Set last Value as result + for (Object group : groups.values()) { + cPerm = (String) group; +// permGroups.add((String) group); + } + db.i("player has groups: " + groups.toString()); + } else { + try { + groups = (Map) plugin.getConfig().getConfigurationSection("worlds." + world); + } catch (Exception e) { + db.i("Exception GetPermByPlayer : GetConfigurationSection"); + } + + if (groups == null) { + return ""; } + if (groups.containsKey(player)) { + cPerm = groups.get(player).toString(); + db.i("worlds contains key "+player +" value"+ cPerm); + } else { + db.i("worlds contains NOT key "+player ); + } + } - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); +// return ClassManager.getLastPermNameByPermGroups(permGroups); + return cPerm; } @Override @@ -158,8 +195,13 @@ public void classAddGlobal(String player, String cString) { @Override public void rankAddGlobal(String player, String rank) { player = PlayerManager.search(player); // auto-complete playername + String cString = ClassManager.getClassNameByPermName(rank); + plugin.getConfig().set("players." + player + "." + cString, rank); + db.i("Vault added rank " + rank + " to player " + player + ", no world support"); + plugin.saveConfig(); try { permission.playerAddGroup(Bukkit.getPlayer(player), rank); + plugin.log("Vault PermName " + rank + ": user " + player , Level.INFO); db.i("added rank " + rank + " to player " + player); } catch (Exception e) { plugin.log("PermName " + rank + " or user " + player @@ -171,7 +213,9 @@ public void rankAddGlobal(String player, String rank) { public void rankRemoveGlobal(String player, String cString) { player = PlayerManager.search(player); // auto-complete playername - + plugin.getConfig().set("players." + player, null); + plugin.saveConfig(); + try { permission.playerRemoveGroup(Bukkit.getPlayer(player), cString); db.i("removed rank " + cString + " from player " + player); @@ -200,9 +244,12 @@ public String getPermNameByPlayerGlobal(String player) { @Override public void removeGroups(Player player) { String[] list = permission.getPlayerGroups(player); - - for (String sRank : list) { - permission.playerRemoveGroup(player, sRank); + if (list != null) { + for (String sRank : list) { + permission.playerRemoveGroup(player, sRank); + plugin.getConfig().set("players." + player, null); + } + plugin.saveConfig(); } } } diff --git a/src/net/slipcor/classranks/managers/ClassManager.java b/src/net/slipcor/classranks/managers/ClassManager.java index 2761f42..ad6d9d4 100644 --- a/src/net/slipcor/classranks/managers/ClassManager.java +++ b/src/net/slipcor/classranks/managers/ClassManager.java @@ -14,9 +14,9 @@ /** * class manager class * - * @version v0.3.0 + * @version v0.4.4.2 * - * @author slipcor + * @author slipcor / krglok */ public class ClassManager { diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java index 4b896c4..a3b408d 100644 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ b/src/net/slipcor/classranks/managers/CommandManager.java @@ -34,7 +34,7 @@ public class CommandManager { public boolean rankpublic; // do we spam changed to the public? public boolean defaultrankallworlds; // do ppl rank themselves in all // worlds? - public boolean onlyoneclass; // only maintain one class + public boolean onlyoneclass; // only maintain oneass public ItemStack[][] rankItems; public String[] signCheck = { null, null, null }; // SignCheck variable @@ -52,8 +52,7 @@ public CommandManager(ClassRanks plugin) { * new rank */ public boolean rank(String[] args, Player comP) { - db.i("ranking " + comP.getName() + " : " - + FormatManager.formatStringArray(args)); + db.i("ranking " + comP.getName() + " : " + FormatManager.formatStringArray(args)); int cDown = pm.coolDownCheck(comP); if (cDown > 0) { plugin.msg(comP, @@ -155,11 +154,11 @@ public boolean rank(String[] args, Player comP) { if (ClassRanks.economy != null) { - if (ClassRanks.economy.hasAccount(comP.getName())) { - plugin.log("Account not found: " + comP.getName(), - Level.SEVERE); - return true; - } +// if (ClassRanks.economy.hasAccount(comP.getName())) { +// plugin.log("Account not found: " + comP.getName(), +// Level.SEVERE); +// return true; +// } if (!ClassRanks.economy.has(comP.getName(), rank_cost)) { // no money, no ranking! plugin.msg(comP, @@ -304,18 +303,43 @@ public boolean rank(String[] args, Player comP) { */ public boolean parseCommand(Player pPlayer, String[] args) { - db.i("parsing player " + pPlayer + ", command: " - + FormatManager.formatStringArray(args)); + db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); if (args.length > 1) { - if (args[0].equalsIgnoreCase("get")) { + if (args[0].equalsIgnoreCase("list")) { + // Command list of Ranks in the Class + ArrayList classes = ClassManager.getClasses(); + plugin.msg(pPlayer, ChatColor.YELLOW+"Class / Rank List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + for (Class c : classes) { + if (c.name.startsWith("%") && !pPlayer.isOp()) { + continue; + } + if (args[1].equalsIgnoreCase(c.name)) { + plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); + for (Rank r : c.ranks) { + plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); + } + } + } + return true; + + } else if (args[0].equalsIgnoreCase("get")) { + // Command Get String world = pPlayer.getWorld().getName(); if (args.length > 2) { world = args[2]; + } else { + world = "all"; + } + if (args.length == 1) { + args[1] = pPlayer.getName(); } + args[1] = PlayerManager.search(args[1]); - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(world, args[1])); + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); if (rank == null) { plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) @@ -376,7 +400,10 @@ public boolean parseCommand(Player pPlayer, String[] args) { world = args[3]; } else if (args.length == 3) { // => /class add *name* *classname* - self = false; + String[] tArgs = { args[0], args[1] , args[2] }; + + args = tArgs; // override : without world //krglok 01.2013 +// self = false; } else if (args.length == 2) { // => /class add *classname* @@ -493,11 +520,11 @@ public boolean parseCommand(Player pPlayer, String[] args) { } } // ADD - Rank tempRank = ClassManager.getRankByPermName(args[2]); + Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(args[2])); if (tempRank == null) { plugin.msg(pPlayer, - "The class you have entered does not exist!"); + "The class you have entered does not exist!"+args[2]); return true; } @@ -518,7 +545,8 @@ public boolean parseCommand(Player pPlayer, String[] args) { String sRank = tempRank.getPermName(); plugin.perms.rankAdd(world, args[1], sRank); } else { - plugin.perms.classAdd(world, args[1], cPermName); + plugin.perms.rankAdd(world, args[1], cPermName); +// plugin.perms.classAdd(world, args[1], cPermName); } if ((rankpublic) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { @@ -535,6 +563,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { // only ONE argument! if (args[0].equalsIgnoreCase("reload")) { + // Command reload if (pPlayer.isOp()) { plugin.load_config(); plugin.msg(pPlayer, "Config reloaded!"); @@ -545,6 +574,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { } if (args[0].equalsIgnoreCase("rankup")) { + // Command rankup if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName())) { plugin.msg(pPlayer, @@ -553,6 +583,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { } return rank(args, pPlayer); } else if (args[0].equalsIgnoreCase("rankdown")) { + // Command rank down if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName())) { plugin.msg(pPlayer, @@ -561,6 +592,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { } return rank(args, pPlayer); } else if (args[0].equalsIgnoreCase("remove")) { + // Command remove if (!plugin.perms.hasPerms(pPlayer, "classranks.self.addremove", pPlayer.getWorld() .getName())) { @@ -597,22 +629,25 @@ public boolean parseCommand(Player pPlayer, String[] args) { : pPlayer.getWorld().getName()) + "!"); return true; } else if (args[0].equalsIgnoreCase("add")) { - plugin.msg(pPlayer, "Not enough arguments!"); + // Command add + plugin.msg(pPlayer, ChatColor.RED+"Not enough arguments!"); + plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); return true; } else if (args[0].equalsIgnoreCase("list")) { + // Command list Classes ArrayList classes = ClassManager.getClasses(); - plugin.msg(pPlayer, "Class List"); - plugin.msg(pPlayer, "--------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"Class List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); for (Class c : classes) { if (c.name.startsWith("%") && !pPlayer.isOp()) { continue; } - plugin.msg(pPlayer, "Class §a" + c.name); - for (Rank r : c.ranks) { - plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); - } + plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); +// for (Rank r : c.ranks) { +// plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); +// } } return true; } diff --git a/src/net/slipcor/classranks/register/payment/Methods.java b/src/net/slipcor/classranks/register/payment/Methods.java index 2d32bde..57ae92c 100644 --- a/src/net/slipcor/classranks/register/payment/Methods.java +++ b/src/net/slipcor/classranks/register/payment/Methods.java @@ -42,13 +42,13 @@ public class Methods { * Implement all methods along with their respective name & class. */ private static void _init() { - addMethod("iConomy", new net.slipcor.classranks.register.payment.methods.iCo6()); - addMethod("iConomy", new net.slipcor.classranks.register.payment.methods.iCo5());/* + addMethod("iConomy", new net.slipcor.classranks.register.payment.methods.iCo6());/* + addMethod("iConomy", new net.slipcor.classranks.register.payment.methods.iCo5()); addMethod("iConomy", new praxis.classranks.register.payment.methods.iCo4()); - addMethod("BOSEconomy", new praxis.classranks.register.payment.methods.BOSE6());*/ + addMethod("BOSEconomy", new praxis.classranks.register.payment.methods.BOSE6()); addMethod("BOSEconomy", new net.slipcor.classranks.register.payment.methods.BOSE7()); addMethod("Essentials", new net.slipcor.classranks.register.payment.methods.EE17()); - addMethod("Currency", new net.slipcor.classranks.register.payment.methods.MCUR()); + addMethod("Currency", new net.slipcor.classranks.register.payment.methods.MCUR());*/ Dependencies.add("MultiCurrency"); } diff --git a/src/plugin.yml b/src/plugin.yml index cee8d57..c5e02b6 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,9 +1,9 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.4.1 +version: 0.4.4.2 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ -soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] +soft-depends: [Vault] commands: class: description: Lets users choose a class / change classes @@ -14,6 +14,7 @@ commands: /class [rankup/rankdown] [username] {world} | Rank user up/down /class [rankup/rankdown] | Rank yourself up/down /class get [username] {world} | Get the active rank of a user + /class list {classname} | list of class or class / rank rankdown: description: Rank down yourself or others usage: | From 9a689e90d42e6f5c290530a832d322aac8f1779c Mon Sep 17 00:00:00 2001 From: Krglok Date: Tue, 22 Jan 2013 18:35:28 +0100 Subject: [PATCH 02/29] New Commands and some restructure of code new implementation of VaultHandle --- README.creole | 67 ---------- src/net/slipcor/classranks/ClassRanks.java | 13 +- .../classranks/managers/CommandManager.java | 117 +++++++++++------- src/plugin.yml | 2 +- 4 files changed, 82 insertions(+), 117 deletions(-) delete mode 100644 README.creole diff --git a/README.creole b/README.creole deleted file mode 100644 index 4edbc69..0000000 --- a/README.creole +++ /dev/null @@ -1,67 +0,0 @@ -* CHANGELOG -* -* v0.4 -** 0.4.4.1 - fix exp costs not updating the level correctly -** 0.4.4 - add /class list -** 0.4.3 - config setting to remove all perm groups on class select -** 0.4.2 - Vault disabling for either Economy or Permissions -** 0.4.1 - Vault disabling via config -** 0.4.0 - Vault support - -* v0.3 -** 0.3.1 - edit the message prefix by setting "prefix" in the config -** 0.3.0.7 - fix custom EXP and PRICE not working -** 0.3.0 - another big rewrite to activate exp/cost/items setting for each rank - -* v0.2 -** 0.2.1 - internal command restructuring (no visible changes) -** 0.2.0 - mayor rewrite, SQL database dropped, multiPermissions, debug mode - -* v0.1.5 -** 0.1.5.2 - dbload change: /class dbload deletes database in the first place! -** 0.1.5.0 - Update to #1337 config system - -* v0.1.4 -** 0.1.4.4 - minor fixes -** 0.1.4.3 - Multiworld "all" support -** 0.1.4.2 - Reagents => Items ; Cooldown ; Sign usage -** 0.1.4.1 - method NPE Fix -** 0.1.4.0 - Register API - -* v0.1.3 -** 0.1.3.4 - Fixes: cost parsing, class change announcement - Cleanup: static plugin access, ordering -** 0.1.3.3 - Possibility to require items for upranking -** 0.1.3.2 - little fix of auto completion, cleanup -** 0.1.3.1 - database filling via content.yml -** 0.1.3.0 - big rewrite: +SQL, +classadmin - -* v0.1.2 -** 0.1.2.8 - rewritten config, ready for ingame ranks and permissionsbukkit -** 0.1.2.7 - consistency tweaks, removed debugging, username autocomplete -** 0.1.2.6 - corrected permission nodes -** 0.1.2.5 - command /class get *playername* {*world*} -** 0.1.2.4 - FIX: players now CAN add/remove their OWN class if they have permission -** 0.1.2.3 - world and player color customizable -** 0.1.2.2 - iConomy now is optional -** 0.1.2.1 - fix: /class *name* now only working for rank 1 classes -** 0.1.2.0 - little tweaks for release - -* v0.1.1 -** 0.1.1.2 - Classes have their own class -** 0.1.1.1 - Formats have their own class -** 0.1.1.0 - Plugin reload, display customizable class names, everything rewritten - -* v0.1.0 -** 0.1.0.2 Cost for rankup to second and third rank, config access is now static -** 0.1.0.1 Permission nodes, public announcement, more coloring -** 0.1.0.0 Rewritten, new config and different group management - -* v0.0.1 -** 0.0.1.2 - Interface, getRank to read out the Rank -** 0.0.1.1 - (OP) Rankup/Rankdown user -** 0.0.1.0 - (OP) Group add / delete - -* v0.0.0 -** 0.0.0.3 - Color support -** 0.0.0.2 - iConomy support -** 0.0.0.1 - basic functionality: choose your class via group if you didn't already \ No newline at end of file diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 97ae8f6..9d912dd 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -58,14 +58,16 @@ public void onEnable() { @SuppressWarnings("unused") ClassManager cm = new ClassManager(this); + // register commands getCommand("class").setExecutor(new ClassCommand(this, cmdMgr)); - getCommand("classadmin").setExecutor( - new ClassAdminCommand(this, cmdMgr)); + getCommand("classadmin").setExecutor(new ClassAdminCommand(this, cmdMgr)); getCommand("rankup").setExecutor(new RankupCommand(this, cmdMgr)); getCommand("rankdown").setExecutor(new RankdownCommand(this, cmdMgr)); - load_config(); // load the config file + // load the config file + load_config(); + // load Vault if (pm.getPlugin("Vault") != null) { db.i("Vault found!"); if (getConfig().getBoolean("vaultpermissions")) { @@ -77,6 +79,7 @@ public void onEnable() { } } + // backup permissions if (this.perms == null || (this.perms != null && !this.perms.setupPermissions())) { if (pm.getPlugin("bPermissions") != null) { @@ -97,7 +100,7 @@ public void onEnable() { tracker.start(); Update.updateCheck(this); - log("v" + this.getDescription().getVersion() + " enabled", Level.INFO); + log("Version " + this.getDescription().getVersion() + " init ready", Level.INFO); } @Override @@ -110,7 +113,7 @@ public void onDisable() { * (re)load the config */ public void load_config() { - String debugVersion = "0310"; + String debugVersion = "0320"; if (getConfig() == null || !getConfig().getString("cversion").equals(debugVersion)) { diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java index a3b408d..8fb39e4 100644 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ b/src/net/slipcor/classranks/managers/CommandManager.java @@ -297,6 +297,74 @@ public boolean rank(String[] args, Player comP) { return true; } + /** + * printout Classas and/or Class Ranks + * + * @param pPlayer + * @param args + */ + private void cmdList (Player pPlayer, String[] args) { + ArrayList classes = ClassManager.getClasses(); + plugin.msg(pPlayer, ChatColor.YELLOW+"Class / Rank List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + for (Class c : classes) { + if (c.name.startsWith("%") && !pPlayer.isOp()) { + continue; + } + if (args[1].equalsIgnoreCase(c.name)) { + plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); + for (Rank r : c.ranks) { + plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); + } + } + } + + } + + /** + * printout player Class, Rank and world + * + * @param pPlayer + * @param args + */ + private void cmdGet (Player pPlayer, String[] args) { + String world = pPlayer.getWorld().getName(); + if (args.length > 2) { + world = args[2]; + } else { + world = "all"; + } + if (args.length == 1) { + args[1] = pPlayer.getName(); + } + + args[1] = PlayerManager.search(args[1]); + + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); + + if (rank == null) { + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " has no class in " + fm.formatWorld(world) + "!"); + } else { + + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " is " + c_Color + cDispName + ChatColor.WHITE + + " in " + fm.formatWorld(world) + "!"); + } + + } + + private void cmdTemp (Player pPlayer, String[] args) { + + } + + + /* * The main switch for the command usage. Check for known commands, * permissions, arguments, and commit whatever is wanted. @@ -306,53 +374,13 @@ public boolean parseCommand(Player pPlayer, String[] args) { db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); if (args.length > 1) { if (args[0].equalsIgnoreCase("list")) { - // Command list of Ranks in the Class - ArrayList classes = ClassManager.getClasses(); - plugin.msg(pPlayer, ChatColor.YELLOW+"Class / Rank List"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - for (Class c : classes) { - if (c.name.startsWith("%") && !pPlayer.isOp()) { - continue; - } - if (args[1].equalsIgnoreCase(c.name)) { - plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); - for (Rank r : c.ranks) { - plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); - } - } - } + // Command list of Ranks in the Class 3.2 + cmdList(pPlayer,args); return true; } else if (args[0].equalsIgnoreCase("get")) { - // Command Get - String world = pPlayer.getWorld().getName(); - if (args.length > 2) { - world = args[2]; - } else { - world = "all"; - } - if (args.length == 1) { - args[1] = pPlayer.getName(); - } - - args[1] = PlayerManager.search(args[1]); - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); - - if (rank == null) { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " has no class in " + fm.formatWorld(world) + "!"); - } else { - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " is " + c_Color + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) + "!"); - } + // Command Get 3.2 + cmdGet(pPlayer, args); return true; } @@ -382,6 +410,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { plugin.msg(pPlayer, "Argument " + args[0] + " unrecognized!"); return false; } + // add / remove boolean self = true; String world = defaultrankallworlds ? "all" : pPlayer.getWorld() diff --git a/src/plugin.yml b/src/plugin.yml index c5e02b6..287c2e4 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -8,7 +8,7 @@ commands: class: description: Lets users choose a class / change classes usage: | - /class [classname] | Choose the class [classname] + /class [classname] | Choose the class [classname] for yourself /class [add] {username} {classname} {world} | Add user to a class /class [remove] {username} {world} | Remove user from a class /class [rankup/rankdown] [username] {world} | Rank user up/down From 4bd3556fea4d820179e5dd1cec3934fb11bfa5cb Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 23 Jan 2013 08:55:47 +0100 Subject: [PATCH 03/29] bperm api ref changed --- .classpath | 15 + .project | 17 + bin/config.yml | 101 +++++ bin/net/slipcor/classranks/ClassRanks.class | Bin 0 -> 15367 bytes bin/net/slipcor/classranks/Tracker.class | Bin 0 -> 2731 bytes bin/net/slipcor/classranks/Update.class | Bin 0 -> 5684 bytes .../commands/ClassAdminCommand.class | Bin 0 -> 1781 bytes .../classranks/commands/ClassCommand.class | Bin 0 -> 1756 bytes .../classranks/commands/RankdownCommand.class | Bin 0 -> 2320 bytes .../classranks/commands/RankupCommand.class | Bin 0 -> 2314 bytes bin/net/slipcor/classranks/core/Class.class | Bin 0 -> 1270 bytes bin/net/slipcor/classranks/core/Rank.class | Bin 0 -> 3160 bytes .../classranks/handlers/CRHandler.class | Bin 0 -> 973 bytes .../classranks/handlers/HandleBPerms.class | Bin 0 -> 6619 bytes .../classranks/handlers/HandlePEX.class | Bin 0 -> 6447 bytes .../handlers/HandleSuperPerms.class | Bin 0 -> 5715 bytes .../handlers/HandleVaultPerms.class | Bin 0 -> 8646 bytes .../listeners/CRServerListener.class | Bin 0 -> 5255 bytes .../classranks/managers/ClassManager.class | Bin 0 -> 10058 bytes .../classranks/managers/CommandManager.class | Bin 0 -> 21570 bytes .../classranks/managers/DebugManager.class | Bin 0 -> 1093 bytes .../classranks/managers/FormatManager.class | Bin 0 -> 5518 bytes .../classranks/managers/PlayerManager.class | Bin 0 -> 5619 bytes .../payment/Method$MethodAccount.class | Bin 0 -> 503 bytes .../payment/Method$MethodBankAccount.class | Bin 0 -> 559 bytes .../classranks/register/payment/Method.class | Bin 0 -> 1023 bytes .../classranks/register/payment/Methods.class | Bin 0 -> 4040 bytes .../payment/methods/BOSE7$BOSEAccount.class | Bin 0 -> 2240 bytes .../methods/BOSE7$BOSEBankAccount.class | Bin 0 -> 2481 bytes .../register/payment/methods/BOSE7.class | Bin 0 -> 3665 bytes .../payment/methods/EE17$EEcoAccount.class | Bin 0 -> 3997 bytes .../register/payment/methods/EE17.class | Bin 0 -> 3162 bytes .../methods/MCUR$MCurrencyAccount.class | Bin 0 -> 2211 bytes .../register/payment/methods/MCUR.class | Bin 0 -> 2970 bytes .../payment/methods/iCo5$iCoAccount.class | Bin 0 -> 2393 bytes .../payment/methods/iCo5$iCoBankAccount.class | Bin 0 -> 2636 bytes .../register/payment/methods/iCo5.class | Bin 0 -> 3640 bytes .../payment/methods/iCo6$iCoAccount.class | Bin 0 -> 2471 bytes .../register/payment/methods/iCo6.class | Bin 0 -> 3072 bytes bin/plugin.yml | 65 +++ .../classranks/handlers/HandleBPerms.java | 419 +++++++++--------- 41 files changed, 407 insertions(+), 210 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 bin/config.yml create mode 100644 bin/net/slipcor/classranks/ClassRanks.class create mode 100644 bin/net/slipcor/classranks/Tracker.class create mode 100644 bin/net/slipcor/classranks/Update.class create mode 100644 bin/net/slipcor/classranks/commands/ClassAdminCommand.class create mode 100644 bin/net/slipcor/classranks/commands/ClassCommand.class create mode 100644 bin/net/slipcor/classranks/commands/RankdownCommand.class create mode 100644 bin/net/slipcor/classranks/commands/RankupCommand.class create mode 100644 bin/net/slipcor/classranks/core/Class.class create mode 100644 bin/net/slipcor/classranks/core/Rank.class create mode 100644 bin/net/slipcor/classranks/handlers/CRHandler.class create mode 100644 bin/net/slipcor/classranks/handlers/HandleBPerms.class create mode 100644 bin/net/slipcor/classranks/handlers/HandlePEX.class create mode 100644 bin/net/slipcor/classranks/handlers/HandleSuperPerms.class create mode 100644 bin/net/slipcor/classranks/handlers/HandleVaultPerms.class create mode 100644 bin/net/slipcor/classranks/listeners/CRServerListener.class create mode 100644 bin/net/slipcor/classranks/managers/ClassManager.class create mode 100644 bin/net/slipcor/classranks/managers/CommandManager.class create mode 100644 bin/net/slipcor/classranks/managers/DebugManager.class create mode 100644 bin/net/slipcor/classranks/managers/FormatManager.class create mode 100644 bin/net/slipcor/classranks/managers/PlayerManager.class create mode 100644 bin/net/slipcor/classranks/register/payment/Method$MethodAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/Method$MethodBankAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/Method.class create mode 100644 bin/net/slipcor/classranks/register/payment/Methods.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/BOSE7$BOSEAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/BOSE7$BOSEBankAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/BOSE7.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/EE17$EEcoAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/EE17.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/MCUR$MCurrencyAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/MCUR.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoBankAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo5.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo6$iCoAccount.class create mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo6.class create mode 100644 bin/plugin.yml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..05e5809 --- /dev/null +++ b/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..b3bb963 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + ClassRanks + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/bin/config.yml b/bin/config.yml new file mode 100644 index 0000000..e1dd86d --- /dev/null +++ b/bin/config.yml @@ -0,0 +1,101 @@ +#------------------# +# General Settings # +#------------------# +rankpublic: true +trackRanks: false +defaultrankallworlds: false +onlyoneclass: true +clearranks: false +signcheck: false +signchoose: '[choose]' +signrankup: '[rankup]' +signrankdown: '[rankdown]' +cooldown: 0 +debug: false +checkprices: true +checkitems: true +checkexp: true +vaultpermissions: true +vaulteconomy: true +prefix: ClassRanks + +#----------------# +# Color Settings # +#----------------# +playercolor: '&e' +worldcolor: '&6' + +classes: + Fighter: + Warrior: + name: 'Warrior I' + color: '&7' + price: 10.00 + SWarrior: + name: 'Warrior II' + color: '&7' + price: 50.00 + MWarrior: + name: 'Warrior III' + color: '&8' + price: 100.00 + Business: + Trader: + name: 'Trader I' + color: '&a' + price: 10.00 + STrader: + name: 'Trader II' + color: '&a' + price: 50.00 + items: + - 'GOLD_INGOT:3' + - 'IRON_INGOT:3' + MTrader: + name: 'Trader III' + color: '&2' + price: 100.00 + + +#---------------------# +# Money Cost Settings # +#---------------------# +prices: + I: '10.00' + II: '50.00' + III: '100.00' + +#--------------------# +# Item Cost Settings # +#--------------------# +items: + I: + - 'REDSTONE:2' + - 'COAL:2' + II: + - 'GOLD_INGOT:2' + - 'IRON_INGOT:3' + III: + - 'DIAMOND:5' + - 'LAPIS_BLOCK:5' + +#-------------------# +# EXP Cost Settings # +#-------------------# +exp: + I: '10' + II: '50' + III: '100' + +#---------# +# Players # +#---------# + +players: + Notch: + Fighter: Warrior + +#------------------# +# Config debugging # +#------------------# +cversion: '0300' diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class new file mode 100644 index 0000000000000000000000000000000000000000..7c5ee237d05ed7eff0c9189954dd29b5ea4703f1 GIT binary patch literal 15367 zcmbtb33yahvaUM4+?&pgLIOw>v_TL^AOTU31d$!15D{b-wMm-L(&>)foj@E>QC!De zN5_3Pj=MmbAd1Tvp6gST_t&|%JKdxk@I5}hKKGubPMxa1>QtS3 z^3pGlZ6>0T>S==%Q@=mKd{6#*UzxutC{wR z2V*V4*z{055sU;uV`M%WVW$g-%$l7w2xL_K5~hlLL(|hw4lZeK=$zb_hz07F>%}th zLad}Qm{=CA-_1&5!3Ndl{54RuwVr1qLFB0E7JhYM`I|wd`WagxUwbC z98Od^t(8;kUKrqM3dS1aOy&95UIs~pwbW)EZ9ig^Ikqkwii8s5m|TO0%w=*?!MEgK#iDektCNUk9K{;1fi>A<2Sb559rnJCju<#=WXEGd= z+RBsg5-=t$F-eV z(IOgT(#i0VvQIQO85Cd|md7yCbi}tdH>GKuA~fJ$O`%aAT>);E!cg{xiu6v?35xuf zLKdA$Js_EIG*Evs9P83hgGpg%dan3ffoa5|C^gyUV(Se)ZcmEN2AxR|x1}limqwc- z_5H-e6Bad73$~4r*k2Ch%oPq-TGUFX+tW|d{J{rgTbRvub1aYuMI)6gjpC8IqaUGMXTu?8~+od(Qq&j$+L=u2Ccz% zm`6kD9m?LHw2WrTuI8h2Z6|nvMct{`q>Gq_q@9}IZ%Z>{DSlh#wtx%hw{)pNmtarR z7TKH#g)76+21FkXmDAxZ!WLadm&1+L)J}yNm)hd*+O1l2aHU08(bd>4K_R#D^9~;Z zCH{`CGw52dzb6??O6}4X{hqFex?r!(O(G6QU3$k}Xwr>{w9HiO=zgUKDbm26zcRRqW;;t_SaH}MH|J*c;bmbEa9U~^n^i=V`QF5 z<}}p@5{gS5@w!;3Nqhw&$81lM#eGIcaVM~Zm*^FPUdGOm;VX7G#G+T}PqvS6 z_yR64W0y@*xc#$5f1%g0I|Q1Vf)Tj*VYz%_m$A<3;oshXu>2B{`eVUBeXG#?n?-L4 z2WBE_Z^wx9n;MamRj6jnU zP!~ialS6SkPFqX=u;?R!jXR!*HktG>mQioF)|>Px>W7a!bht^MqrMIakf>eU`M)gs zg8s`1?{o~J1M4m_v(^p!zh!t?Cf-J<`{e?vLJ)0zWegkM=3)^STt4b~;9hrly^ z!*oC$+Votg!d%0+(%_1$xzJ$oa2^4>4dEOhpo8&VSz~LQdJq`NhZ}qt zR?^9As@39AJQ^HFf-5n5wqtedM)(|KaTUYcxS-r!TtUjZx*D91kL05a#u-6|E0`Q@ zMhI$MSR-X^Uv{IK=rq2T$%g7`Unhbmv53h=v*>P+vVfPCVg)X*~prWzkF;d+DXfS^wHY9fgs4!kT5G8S%XVWTdOq-$iE%Ve24 znaCkxNNG8IbC#4+?4~5umm4jPa1=@hR;ET{je$futsen|<_TCDQ-^a|LonlM@LMaQ zv2eY~Fvh~BaG*69tBZ!CF_W9&<8+&T_wfpDHF#zIj4<~k7N5?)fq6pKlY}m&8I!4H zN2M8h&s&2`msf!)$t;@y^iZ8>>@15{k!A8~SeUb)Nryl-bf%zL{ z3j1ZT$v0!w!hlprj&1U-=&#%56+Lbji$Rhoufo!u7T?8p!*c><8q>M9vKlyGZsR`~ zeD7X>Vy1?c16GUg0)lB1di<7(oQ^*!7r$n;-?3d-$C&XfbRym`p z_VGs9gC2uUJKcJ^*i41N(3%GjxM@M`kQSZg{k)XYfi zTP0Lql?@6}de7{w!Ew+g{~7wL5(oFX#ed~DB#~+ghrl;Zu)08cNDd?M@!$AugWm!R z8EnpgvEe*BEMD^+q@}rtWvU?6AKH6?-$QQ2@8jSgEBi}#sX^ukul{$Ty)_S`8N55r z9+a2xKP>)80ueJ5N$4;}ru$f?`vfZ=Tm#Z3e}?cc%atRLY5+j0aBlot-e&Q?L59kSH>)HNUD3lfpZKZ$+Xc2Z&T&rmT61mm8HNT3nt)MqLNEEEFl ztXT-$(~| zI%?FW1`KE5G>17=o2oYgr3!4|@I7jOOC6y4z%cFXMZ2E~_4P~_=D>6Y?DFmcUHj~j zqscXyJOhfML@Um@Wy42eC|n+Bse^>eBAd%uKnj>NRKJuL)Mpw~R@Mcb!wE~LJn55z z;;vlDr>ah8B+)%obZoFy!gy#5pbEmRWQq;@mW{)nbA?Y$Qd10txih~CP1Ij_Ej3k5!!l%R!D*|UgY?PT1Jh@) zx)nHvh>I5K)yvA`i~T-zteRmc#QnWHRhvBw$FT|_f9e!I$Ej`CCCZ0RqcIqd!%sr= zVL1Z^SQ_IEI9<$g;@Q~EMafhr09uO*)Lb>+Q1cKOW|-@wWdS=BwbTNI?7%(Y_&G?I zpqmDI@qT~jQ$G_+DU30P{0%;%YRbj=Ax1R7gHU;NuWJtJ?xH6~avy4pwD&qopEph$iuZz|m9yo2o(r zZ8X^i&a{8#>awT#|&m%IyAi!5RV=ls&;eABVV%WRqu zBB)HBa!)3!#xYCk!;d-x+afCDRM~b?IE|24t->GZiPB6^zEWKf=86e33Dd6>cOI zyqJu>+fw&PBrTljPy(%Wj(^Pixw}&b0GuZ#G7|*sNv_r6%pS1RgX$q1v0y^^@+~K1 z>9luXwosho?p?Y;i;rMBnQix%HVV~Rwcb$c0HzE{=O${Yc9p~q2d-x6J0tc7KBn=R zySf%k_E%IHq z&!#SM;{qktNtP~g+X7{Q+>Fuh_!x=Ohu$UB1O0m9Z6Hed=iznK>rp%?>WyEot{y?9 zx<-iNl8iHCH71rpqsunX0cD%0?*cp=)K2~JJYYdt*?Q`~fevY>A$TvBwqfm5QRZr= z;bq)ThjvbK2zVnJLT)MphvoQKT28%aDEVm^ek*7M4X06P7bYxwN;-@V#~V(*Q|zc( zu;WHmyevthHxeW`y&OCYDceXBT=-%&O<1UzQC56RlBRE>nJEruC24k9@d91BC{?*w zSDvIRPf1lS(Uo<&GMK7tkjf-2D=%KYks1|kp{ba)qWH8V2`4Lxf0LwD*OMPYI9E70 zubs{>E52|oU7VyV(DVExT{BO2yg_#~(dVXl(y)bk*hQ1m?FL#}UVN)F%K@mYD85~0 z*+h2=<-0+-jjGFw@5$GFW?(pwLG(5`=2>K_%R99}ljTB%xJJ1j{X$~x#V z(0_74@zWdVk6`n;B)yoV*NXp&pCr9$FGE!6(s(%sN&_MQt|I`eYC4d{(Ma60Ihw}P zVwylPnoKRYjItUv7gG&gOUKY1bS&LZ(`g;ezz45ddX{F>`!t6>qq+1Iu6^vl#Sb4X z;1b;8IEWT;f85?Er^P%PH!+T)IzAe=DW+49XHo;lXqkpdnGFR8CO!_)+w>0Lav;y4 zcj-M`{yQ2Vd!If4-+u?k-O2cw))_R>plRLq>)#(2!I-wDu!RM~$sCT*rm>+ddjWTkV%_NiN<(uZylrxR-;* z5|(QBM((X>2AcX0-N?A{_PEi`16e*;sSu%xSq=Y8|Bz==SxrC?}D3bl8he;3>&1B1gO83;{tqpV?V+ zwq0{hXU!V7?sI;bJ>){&0iIZ+=puPLvd{ITS6ITo6(MRBU+UoO$`Zah$-kTJ)Vl3) zzc1k%GHN|`?M)?oi>}qQZv*W+*6}@DYqvfis^f_L@{p*G1E30wK9W|QRJ$}rtK6mT z=c$j~VJ$jz@cJZoxS!)qs>xkh;emw@mS{6wuhrU7iU(J!S&8o*we(MIW$q6Y_J zNq)M@9M;oQYHsA`gvtxDMsV{ICUcD{XrncyX3v6+{E8w#w1i(v@?WZarM}JXyQrwt z=RUN918wAXk17O}Lwgo%;ujW_`dp}fvuEK3es^{o9aUxR+V(+`Ka}QwqS;?nxKN#z?;w5Jhp;%V}S?seyG9jc^i-#vBT@7K^ybq4Dk7}c$( zc|G+h^^_Kr7M5D2`}QvC*^N6?={(mcvyFOnY3MsofFTI{`9pz~e!4?;u1B#qKZeT~ z-zY!d$?x(9%I|v3^{Hzc$}ij=x2gQ-f#_5H3;l=^*jHN+QLI4hxsndXWx`=}IxYbJ zhK{6Fh#k(N`E)h~5mQ8Q<1S8XP;)M7&ZEoee7ce@paY8+bmhs+~wT@iLSlx|vtfEqprN%Gcsv z+MT$G_9)%SFXH0aTPWY9yLl_!!`pD9YzN(|il|L>qx)0|-KzT1!)g#cqDIi8sv6JZ zXuXS}si-AqrY2WYc;809(~vphpjspn9>NKdP` z=^6DN%B}RA`ZqnVzN8n_4tmj5KrgvU=w;V_^or|XlmqEiR~h}ubr`+o8c%BZA^#y(G`j$R%yXj-Mhdy=t=yUf$w9VZgCkU%4048}0`B z#vP^a+;RHe-GZ_e-3BJP1@;x7v~ULajE1Z zR_;&O?cT;7kHv0JF?&6|*z^qN0?#OvW7zPFMcp_q^h{*S6GXY3i#$=@$8!$x1| zRd~OSyL)crV$Wuj&vJ?91@7VbhbbUcpnkx%9IY5mBe?{)qYK1yXD7$aLVd>$Z=W(x9qjAhM zfDCs#+D3yH)BUx${r%)=j7_~|0BACp5~va&fra8 zbSKg<{1Jz+&2~+i^~vPRZgAMgH%&s~HNa34#`8`(fUJDo&;ti@SgOoYw7XvDqdWdU zebi21JP%6+tjRCJxoXiaHum5b`;Di$A9G5X1+d z5c1jHJYMIIetV$f3qV302h4*{Jk7+;rij(?YL+w61MmYf(Mjd@EVD7oS~VxB7D-4@ zqHvP24U?`_r=Y4t;SA%op*9m6RZvkXsw`2Gqm*w{_^^QH5*6+2h-ACltZnW(Z-vQA4@u{&YYeW z7=IxGTd&TxrHSr%IX9_RRk_>vY)MG;i1TrpqAtu1&zwm3sT?mbxco^@O>6BO} z{+)4d&Oxd0)zGaS^`GfX;y4^ut6u{7fBIy$(ze2gt{D zKutZ3;ULZA208&7#e6;$pOlv4Pfkw7-RupzCdbqt)O~Oia^$s`ygLDV7d&LjqYfvJ_)B%BY;5-C z28YvGXQ=aa?GZciS4ExGso@0~#9-z4TMoy@&%+zM8x81C_m`-LH>yV!4rjMeQF&5r zcuGBtBj>f$YYSq42V4)JpN{_FfyJONA&W1?pLAY^>myg{<@K^@Im@%Cw|ZPX0dFY# cy&MnQHJkAy%fwDAySM7V%G8snQ0l4w1(fL(ApigX literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/Tracker.class b/bin/net/slipcor/classranks/Tracker.class new file mode 100644 index 0000000000000000000000000000000000000000..f6c2ab60308a24f1e3c7951e2aa7d39195c74953 GIT binary patch literal 2731 zcma)8X;;){6n@@eAP}Ne1l-rUfGBYn9TyZ)p@S&HBGA@`;RQxQ5|a$5U9`3P-mm=w zezu;2(4O`O^hdRQ-eh1xMO)4x%f0u#%k$jaJAeN5>mLA)<0lO%fgO$v&A={rdDl1d zwiN`vFIEC}lnx!Kfp_TIx5g$pbmzLvC)8rY6cCb z3W30`?CbGh^1>6S3_{Bfb!^8@4LbzZCyKos)ofrFb_*DjGR)?i61$6td^ z_GL~p-QCS(DIJ8ar;<5j;4oSR^t|Qdr5*cBH+3oIs!57{-JOxOIEv#MjtOi^WWAyd z44lA8ff@qT;W`tANtM|Obn=n7=recMF((SPG_Ud!TbIO{YMhSg2m>8wkkN2fz)S@F zKVA%+!+Dm(TrRt=EiE>1V^ac*T<8nl=2}bNPHWURp%n(E z0-@EL@-BL=AD-VA?02jgsqVAV4_FEx6+V{?Tt-KXKu-Ep3N)-lAQoq8(TQssuCDB} zSZUxoNRP(UZ!%o;4Rz^w3q2aLJWwXI%L(PA^bOoVFAvOGc2V|Ds6xA%6Q!2S81yJ^ z8R$b!U@g60kwM-sc!~>wmX&#~AU0vB=*s9Az>o&E$AJVbuRCJkHiqMxZV)!rK-((JzU+RLh^msj zfpL|b>XpHmPaPAO(!d5z49Yl30|ne==n2=Ku}IFDRYH#@V#nh(vubP`j)ob|fvCiS zYYsR;(NjGp$D>Nwp`G{hGNQW8a3kkh5G3bgAJUXHpU)9UcNT4VhiTD%q)d z>0#Eu9PYCbTu(au039xYs1dd-F;jxPtRwFa@qvc-*P~jSz|&$hmREmA9HCfJM6J+g{>S{bT1XJc^Pow?vadu2l&^_6>9M@h?yB&Mj?Q)Ty#Z4Zr{~O2ZG>_@u;0?FDfIpAoJRS@^ z#X2Q^R8oKPj7ijE2qUm@2M+GB$JPA-Teu=(tB-o1g+&}9PbS}vVHYoVwX z>j|yt+N4Kpf&9KikAS#9z;7mPIkTIe{rp=lp!BbaMU9v)5DZT)ZMQ8W*3%$R(BIK( zBm@fM(PWPi6POb=t)5UQWw_XH+87c}; zC|k2sC~oUW6@C;6l!Uo|YqGCPw>q@0sH2J*(W0H2Wyo)@v+xW@bO8A%S1|{r6mL7q z%?rOTE>x^I=^)hDt4B5y#;QXbQQaw(oUdXUru%WMz>;3uj@O4m-FknWYj&MPAfa3R zy0y5^>`r8QVxtk&6LnT1pL4nWTiX^6U;(P6;?)G9>R_;|I|Hc2Vg-u?s^r3f z&_G`_6xS^7l?XMNkz}79vzI50Xt!>y&?2^J4XUU^i1x+wEiJKxt;HgQZ&6jXBmQs% zG{{X)P;nwjh9JdE*+*c(;Yg#H1vo{;5}Yb9-Hhw8Ml%*8{R~r*#uE|ppqL!vy3^61 zpk82hCRmd*RGfjOl-Z-(EwOmgCN*`fPvFS3Ov4Oi3{c>Qah8HJ1u8!fL>0@?NRm4k z3oQ1$GDTvw!4MMB+X--I6;iqVXf3RVcrl!TZ%uHtO85K`)$hO{}VOAorbXRh%E zC~_56D+u$vo4v}%1M zMNKZsWm(qBvl=!MHr43F`3laPVp)1z#kp7~Ioy(sj2!3M_1K``LPnxY6XckRi*PZy zO8w+#$6%alF;2Amq0tGpVMld|K%0DYtI)AgU>avP_LA~)2?Nnlbo*4np3>{ltHQu0 zo;z=gPA!_`9y8Naal)b(+lmoIOaYm6l$4h%qNy+ucd6H;CnA;+cj;W~>5ywp#>5qj z1*D?|TLCpc?oiuIS)w8-Z3xhYP9A(7AV0P+SXTrvh|3jRmKEe(YgAl;D;dm+o?#_J|p?H6unl=4KM9u~)O& z^-GgF15ZQs1%CMbxLyEq?F}k!#7)%7(&JH02BxM%F3kvs*&;IrJjcoSe6z|Oie+nu z3Khixwr){zt2`e^Fm*(dQKmT$KE~qPd7>umYaWQ`o-6${$%~pLZZ=zMMcs|a&7>8j z`&|{h(8Xku-)%-1uCi#DKH@TE#$2XmPmuI=cuM3q8dkzN0y61NB{LGe039FtH)sH$CAdd=DJ%mXIla;&WQNtwlDk*5Xdu_2UZyc^B46 ze|}NL!}t;nOvIxGqu6no-t?SPz5ZZ_1@L7IE7(KVO!}ZDX6rq=rD8-9*Y8AN_DM%R zs^T%E$eTVrkO^5Fk=<+Kqc&oem5jl2JjR7Ou%`iv9rhqe?!0qvB=!mi4F>XN|!+ zHl4FG1D9Lho^f_RUQzK!8HN3}=}M6HzN+HS z(jsMxX2qzNAAez9b)@M7aosXxcGsd)B~~!Pu#By*Q1Dk)C5Nb0Ct>&F?>wey=v@RP z$N#C~UwFfb#Zl8@{ufx7gG&cnPqY8Sn)UD%< z)G5rw`$Zw?Ba|tuaqmeD2jk|^vq5fNq>6ytqTsx9$xD#nx%@_j+m8g&CRWx!H67aHCyxp$ z>Ggcx{|ZqguTN|h$;*@T=GBSsfXsu=n_19#^WMU@!mCvYO1b_Bex1&@{F#oKbKgZ(5$15Z_WzLCs#wom^h%be20yRCfZ7 zrZ}nXJc@I4$g8C#D*Iln8AWCAL*XZ|U|sEA9JhK5H7OjwD20<#I4y-`t&7J&FOK6J z`YE_(93RO;y|2udKaRC*6_gc>gLhfqZd_AV@Dx_n7nT(UFBwM{2bD6#ohJMJW&Uw6 zQ`Z-j6}i3R;6=DTFoMc)@E(}LrS-)_m{Are3k3U981P+^!d3O&*R{J2yvqKq!B3>{ z$x&=8E1qa?AH&Y!)x)$*!3+30Zli4y$ZKgWP(vVVIkK3*)nNugn2qB(Qb&KDfJMA& zEx}1R6DPCGJq2z2>cFWio0nh%PQ%6Ymd^Jk)FZ*W&$U>J?Yz_6!WDPmEZoEQ{rr9y zO&DX@{~T6QhqI~0Irs*`ju$R-k>-4t3(w+CvV(OaSKNiW>GnztVHZ9{y_Zn(rzzD( zx!2=fe1=SGLqB%oJ~C|sHgmUoXw4>8@1JF#pIWWO1MDlJZY%IPN)AxN)A4z>iYXV= z&Ub)fRRvK6g9;WXXjagvV7-D>PQ!h2Xb>nlz`J9fI~PJBniR-V&Lxg$r;-H}YK~xA z@WB)wS~Y_0P9rR-oWFDk=hT#+IEF`-)jF>wzN2T69RW%9A=LW#V#fned_(ZbCFMIw ze=&y9;Z`o>qVh599lkD4l-KOLA4TQ0`|dliXP79>rH|UFR2zFjZ3(x+fg5&MGl z-E3Z$=Hh(J$2$7{0{VJA*Imd}7omavY{4bGxoKR{#T5~*=;nydkxsv(LLbH+E~ z2|P*JLE`=uwwPQwXCJ;wUFMTJPqCHHJ*x3ETRuuE#xr=9eG>H=_}{}^1<&zUyobMtpp;5@F5^TXN3~=5cXI;(+aRpDqm9*2k6c`3XU{2d=;BcCb!A%#B; zVPTG0uT7cd$oCC9Qkxiqp2F)jj^w{lveVc)u?6Lh;U99Zf6K?#Y*B9x;jF_J@OCZ% zGJ3ln+R9h}+(3kHWUjagGqH_~zKNc=nRsp|?{@Hb?j)mcp@(ke+1|*}G6F;oFP%MsOe{ z3Ybq`8WDcB2;-_DY~vi??#W4_ILD-3PAbTpG(E?pMoucsoODEvNyns>5i<`Ot=U7J zGmpljB;sRqL5eA3FT?2=|GC2C#KW0nFxbH$a4SQ>Bc#2|$Sy#8#F5U?kN_ztIF>(i LAcV|7d7|w9p?vBK literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/commands/ClassAdminCommand.class b/bin/net/slipcor/classranks/commands/ClassAdminCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..3042cbc901f9e6affee536a45fe2e53bc6111d9a GIT binary patch literal 1781 zcma)6TW=Fb6#m9BvEyzEahgCNp=+SQmt+?j7uuLY!CWPWR!wE8?bCR7*bLc=wL4Cm zzrri8yi{s})Jj$R+8aqHiE6Do z1%^)y6j0RGyn!i{3b??ql5tH36~^(Ga2^+R)=Lb_AA)~ac*(#=Fc{8uWGJ2wf}V(f z;5}b3lsl2b{VtEC-j5FRYD*>zYgx@_vq!&*L$8^00*0yR9jO>zR6E)1*%YBG;?^l1 ztThwb-q^!zePs`G^*?d`$HrSM>|yb@H0Uy|^OP94Od+3AQj?NYa1mE% z2im1+=v$#3C8YBr717pJ0-(!Y!)K$iugP2IYBv7C@+&OVf5&X2T-`@~Xx$(y|Ay?v z^5^?#k}=o#8_Ns%eSGBL_bu5uAmSLxun!_3gn3}kYdnu+S gzQKLML3%p9Kn4}R|Ki2wiq literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/commands/ClassCommand.class b/bin/net/slipcor/classranks/commands/ClassCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..23855378792d27c30e27368c948e2262b51adf07 GIT binary patch literal 1756 zcma)6TW=Fb6#m9BvEyzEaR?BS&~<>|OR^ilmr6~LKtlAjKMM7X?FL7Q0}q}(XM8T-Ip;g`@0Sms09?hx3{nh>p-^_>%eE86 zw&U|8iFvr0*iIA#JaiMguJ7tSErT?}iPwCK+ddCH`*G{Fa8w4P4D(U!*{#mzrd0p? z+I_G4e+s9gqL^W{?RPvGGMsM=N!!i#R3oU7xf8f+9{DW~Gbf1L6EUIe0bJ|pq07(*_DGsCB|mthcp4ySQeN1b6<_#XVd#B&CIfWdIQAw%(~6SPG9jJJHjkZ(i| z_nSPHTJK+`)rL%tXziiI(F1X4kSQl%7>mOGxENj)8^ejSE<#ttwIeKQjjv=}SFsGe z+RKAir571oVmLF9NrXzOZTpGOw?&*qiJ?}H!X)yA$sI=|i768^jFc&Zwl4xQ7p`SK zd}VG&9rF(!DpPH6wPh>Dp<;3k)iNSUK_Ar)7XQ=W4Qi3>)HchqG<|+Ha1GZP zm}HnL9@5EX4mVNDV1*bkq|`lb?%zoRw{V-m&(`7MI5!@qY3Ueld)%EADKr@pgYna_dnicEqaG zYcw(VgjzZ@3bf`U^gBjpUhh4<$a%f>-7l>peN*)RIDVw_IB61TvIS|*KqD*DXVF?Sg3mQ|kmtzl86?bsAi>ZoV@GD``Hou|X#a_id+^5=B Q>6V%}M~1(Xn8Jhq0Qhy{!2kdN literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/commands/RankdownCommand.class b/bin/net/slipcor/classranks/commands/RankdownCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..576ad2eef901fdabce4cde3c7c6293f2a9e29e2c GIT binary patch literal 2320 zcma)8YgZdZ7=DHXHpIo20HxugOHs%LSZLKMsq{jNqJh?eQCcsZY=*Fq-ObsZr1Dq% z4gKOd0zLNFqhI|?p5yVIWPxxA?T5_H%zM8*lYjpE<28UAa5Z!=n68j!P_e6)=bKiA z2Z7Jsoxrp_$Kh@%Fdx&gK z6gNYu2fqlbCOw~_t6Hg*ZI@v@-^TKyaza@Ra>Q;qrIj+t&9-AFFL_z`!J(;@=9y$W zN=1g5H_F`?#aj7Ts_T~R+H!%RkZLE|;$b_Mc3!0m4ADieB;tsmS4R&L43Sj2&<%!u z9U5Y4cST1x;u@|pOtneVk%dWVXRHfjvGhE3{0xL6OQm_ z==c<$QMI`5^IglU?lNRjEy-=pe{T7ltL1bdjvPMMaEoE6CGBB<98Ro`1>9!P%0jMk zhnlWGm2OcNR#d}XhQZTWxL30))EzM_G7JY>o-YY!jFON9N}@DnRJk9Bk}(;_9XwEj zvBWUY>VK$Rx%wr((y&Y!ZBxCYiCgk~hszK$bbO6GL+@tevZ?N_N*2Rp>by2Q8=7)% zRmVd-BEaL-Dm6TLah{iFWW)G#F+3*ONke)n)(F;he5;ZglU~!M7`|g*jXbO?lz5`! zsY(X3ij=Kz*W_PfXbPQ%QaYjS;68sYUZRtYDDeWrnFCzTWcSdQ zncBlZ<`o7vvIj`+VdS@l(0jCAA;rM^Bw~=#F;a33Ll~zU&`m=PeaGlT3W*jYBWgEJ z4k)u9;KR`Dzoe;)X!Y#hnD`aR%qc8ErK2{Rn(30%j$C^46XxYd2``94nf$U$HP^2GT zkmU$eL=zMTkfKzj(TfcEn#CwgOk$S)rpyt9T*nseRD=snkB=g(qX?@JVI3t1ijd;L fCd!RW)JaYycammnn|7VpAvzUjlte1D?SS(?u6>1E literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..1757ac502677528ecb5c757d3662fb62871edf47 GIT binary patch literal 2314 zcma)8YgZdZ7=DHXHpIo2P)fr^m!gmhWNE8bNu?KB6b-Z%jM94PWHW??>~7BPB$~hC zZ|E1#5$LhU9{uWH@*I!vBnyN>upcrzm-jyJ^GyE!_xD!-Zot*h!!YLxX$DohW_iA8 zRe2Ej+}#aK%X1v=mIL!KE$g+V_EJNX;o=T&aI?zYiutg#BP^+*kKwB4SIkm`EKGABd-WQICQnzUXyN5 zxx|qBU%mUHRIeOs_1&^vTP`vbQ{7ZMBJ3v8Evj^pA-d$1MH~?f>KH(RA(BcL`@wKY zhlZG%UDnZ$xP~hXvt7z`HxiG~@5D;=JMD{a{{A60o%_%Wmz@=Kl@cvWF=%Mw9g*n#1C(y*Oc zRX8Lr$~j|Y%V>Ia<0tM)LvC|9Yc%Y@mJ4xYF{fdcVY17O9k-2+989`*C#W#oe3SG~ zrI;?paE-vbEoE)NG|QrqYeO%mG7N;@5dNIw5qvu!t>MNA@V3hp$A`G7;iHpB%|HrA z$H(}DZj1XqZ(3fh$&g8P6t|83{K^?yE9qh!d3>tj7Q<*q*~9KQ#H)@)+-A@!LauR# zTJBOR-C-`gQ4Mz)MqaPNy}Dhc?ucQDVJz78d`T>0l!YWp66IN=#{EE)jhQ&^;DLh0 zGQ)6Z{GoLf>gV`E!%BBLJi^ROh;px;=aBDgq z;t|muuhppGDT=eAJf$1vpO4`&>CPC^Q@KX4q2p^+)R^?zA;s_w18db`Lvh3t9Zyv; zm>tLW_))_T#FSmy_9*cXut%9c182}%H9o@f{E22hfv~etNpS})h|~LV4#-0qAk5H% zz%YJ}DDjLQ_E>?JL{*X4>y1M)QSMiW#D>neBs!E-H->?A$*tX0UJHpYzV6k1ODx+h zYCQ2S=9CLe5_d=F*GpqUkvYAy2}R|tFL5k=d+2-sZ_{{zRyLv}3yftBa50nJ!%${+ z55t+47}?AoAi0O}Ut3D=(0G{)1MiZGK}ILZ$W@GDigrLdEi?3;q!k&Yvluy1vndKd zxqT1shi?BNOMP_K$o_@tUy#iFhM{aCwU11DHczwY^JMf@^w}S{zR;VDMv}czTED;t z$==B9J{HzVa{MLkY$om<;C?dt0-x<;HSrY<$=-det3{E9eSEu*O%fi?{)uUI^xbpv z9D&Mcn(_crRH`%vk)c?#n1G2H%+nu~YeXQ|u}w3T;bJ@DqYN7;!D?mLKpBEEqV&7ieewYs;G%6A<=@7q(Ng9gMM+k-ISr*T{1f*@>&0o zi9jNWKfoVlyfZ~0(g2BHX78OlbMCok&i?xS<0pUxJV_$PkPSTLM84Q|L+Q9ak0Qx~ zX5>)nIc1$Ekzg3y;yc{&dC+iP)wVoWG4z;&45JlOYb)V9&!ptL6%nZtL#iqo0atD5 zF+A;dX0dW!?>9uFv_v?GfVT)D(}6G)s!EEWLABmR5eT(JBywlV`E|Nn4(pzUI0n+_ z#~?#ImtRjJ!!X>1wS^%Jq(E?K^q^Nq*V0JAVi>51z*}p#YMy+{YrY{Ay4+vqQt13> zGody`#4vsCXhv3IZ$&0rGxNoHz0UBd%N%DXtAw)Q)Y{FaP)>Q1t8(avvh?xvwg`5- zK!tMGSyf)Es<_)MEwAd?rx>O#65hfjZfnJ+8NU1nrAx?gDc1U7?xt}QGygnw$Bd=? z2l89=+LNu0n5k%4MBAOX*ERAmjGfl!L^g(`h_p!bZrKajknii|Fe3l6WwMu8`Mgcx zDp^r_t#F6DHiU&V9%!akHEc`Qdm*%4Ec4d$+I7g1vEuX-#^^BljIyN3`Y0l|Q5>hJ zA8A^zQ1*`U7=1?z2e?`|#L&h8hW9X1DDGkGo4GnpYX%8g$7v-SV*(?vX$8hQmnpkW z8NuKNH6hw0=&hp`U#VRm)$GD|j2vQeqc}TPm`IHGj3y6|-N&8xCw(k~H$&L>4E{?) z-#*5-XNfHyn4xVHF>9FGn8Q2?psNn<6AB~Y{to?|?&+JBW>nnA!!r!# VNi65ogw`xcovBSMJb@gI&%D!~8% literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/core/Rank.class b/bin/net/slipcor/classranks/core/Rank.class new file mode 100644 index 0000000000000000000000000000000000000000..97d6071eab6a4c70fceb0b614417f81fe69ba324 GIT binary patch literal 3160 zcma)7TXPgu5dKcGyOV4Nfk18;Ab{XzH!y%)B!NgsK%)u41OpLov%AAGWN*&QMxr2c zsnRMRe6Y$Ys(g_b9+WDqGJ%pRe5A@BC4T43B+Q24^00gQoYUQ>zwWPl{{8RoM*!Z! zO$`kKJ!Q)?+@f90RU9K%G+oy*%d@V*tz}G7)DRO`bJ3hLjiOmD7!%oxR?ZVx?Vhrn zlI^;7rF_yXSpuzNPqn5z$1WEJ1ax=AcB@5m-q%UwhAYL2BhWrpaSBGZHaly3#_$Ex zQ|B~j$~n2ITGgV?wy_rlH!OptLEQGNk}I&~T-c>up0mnc#hEuoc|GNsxmoJQaut`c zha(-S)Urj3ca7Gis(=_3NF27ywl^qnBlRq#h?7VpuMqo710EUeoo3L(mAsWiBiePe zqJxp9dZ(Kq(4`}egp^*_q50BA9ZhJKXPb2-(ITZSI&`c`VjH$=c%!bGK6)KH@TPz^ zXBKPL#Cd_X)JSg#Xpkf6t5?TsSS_WDjx|_IB8=H(>twBzwVcx?Qz_G1$(hAz)3N0~ zIE;B0Y*uOO3-clg$5J#aZuyL9Rs{0phTJgGlOT-Mc4cAdF`ge*MHM4Vm3>?mv87;n zl6Jn;`cxRpGBcZ~6p*o#8j(d5SVb*GM@2V*?NoggR>}}$gZLq|xZ!}>B4{NG-9)V* zqOMeQKvGRpflD6OBU@&&L>45cV+niBvx~-%D3$-EEBDDI7ERU zZG!_E-WOP>I=$X!5~FBOVjL41P6})aB{ZTLb)3S7etJi0j+wQKwl}Y+J*8nvpkw7M zIaafadCQRxe57L-YqRn0Bw?qf6p5 ze4*jI+U13F7GqXFj6RRO7G@4+NGh7zzQ3dcTphBURK8A2+MYR>LaB zM|i5?WtS?(%Q?@Pur1a5(%~wQ%v;%7;S|4AgqWPF)SR4k!j==PSq`FIl7iU6QP;>1 zrp6zqE&rwLubi}M&pE4BPFb!Eazd&-=Ob609$K-E|LeK?hu)->k-m?%bY=ma>AnSQ zNbg)gce*RKfKBPH_yT&;orwq7x`0%=t!V-2KWWl{KK}1e=6#4^7bSy_?WXfR=)zuX z=65}XeZ1L^oz$J=$AC|9Z*Y~;ZiX(Dw1-lIlJ?S%glN#Zg?^>9k5J-D+K&SYu7QJu z(?sjHaVP*|aFyQT>A$ey9tA%{|A`|i1c_c|&JRJL9|IA_-7AexL>eE)kqF~WD~%^2 zjRzyc?p$enHq!VV91UI`BuJUJge=~Mr*%oH(=4Ipl!ta-YdQA`MH`u~AsmbH)xFYJ zk-kdL@g=DzeGOwI@D;8_Y9**@B&g#!!64sNb$d^;Q(R{GCAaUgpgoTf7xx}wbml%j z7?TGx{qaW!VvU1$@IzO8CU7sUZ#IgJZL!~;T*^qWG1VJ`s_{H#y2ku` zMZR9bcFdy}U-SM7`TZ^OxQYV4LmAibGp^$o+`w(>{f_Tdl6q7x+zsls7QbSSp7`ab z{U!QppfA6v{kv~?cbO+c(3+p19SIFW4!Gki?;ta!>tzoBo348?LoUsti+_#dB# Bt0n*d literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/handlers/CRHandler.class b/bin/net/slipcor/classranks/handlers/CRHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..a813c2c2b1cfac365894797af4eda94b846204cd GIT binary patch literal 973 zcmbtTO>Yx15PeS5CJjj%TD}StD4;e0sXlN46(N;M6r@$DTGRtK@5V~pY`l@}t(2d| zsS*c%06z*bb~f}tgjV7*Z{FCN55MuxU*CTKc!lRRR2X_%I&M=nNixHeR9I_-9$7vV zx}Qp8`QhounOj4Zp>rWF1y6+@@XzsuOdP|?TcwqI$FS7xoikJqv%YL#39C&kV})TY zQd%D8<5-$6B2Fd4dXyz1Jr_oKUIeRds4TL=%79n)`ux@(2X)P;Bh`0DaWOD%1!x6DyGtuu2T;$ ze9-UzN4xaK?RlD`G>b*buv=<&FHgNZGr`WrxtJX&6|HDa8Q5iY;DLj4;#6*S2DV}JDq+2-s5VGI7Bw6PYjgPQ@@u@UeV mZU?-By8-VNe6!&93;v+s53v>QJ;LLFPq0nZ7@m@?;Ms3%CkUDV literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/handlers/HandleBPerms.class b/bin/net/slipcor/classranks/handlers/HandleBPerms.class new file mode 100644 index 0000000000000000000000000000000000000000..a297b93b2d9b50c663ef1d90df46ae9a665116fd GIT binary patch literal 6619 zcmc&&YjjlA75>h=?#<-#3XT#~9IHHrB#fe@nBapqks%jSm+tu1YBZGZK5SJ!fxe&^gflL<)xyOy|M&3&D{ z&pzMx?S1yi>mR>x0Khr;mj;hOea0$8^XXJBp0%U#w3*M_W~L_}?KU%sv}Na`tJKYs zb(Y`}_Pohg;-grZM&5W6pAuY4I zipe$36RiS^QkhiY0)bg`#xt#$CDJb7TbfN+L3lC2Kouqmc;`ggs~|AhfFA)3HRA&_ zW)wk8!3ok=P@3f-yv5!O8> z6%wsD5w1$*TQV!{Y%wQr-kjJ~=4LaRHZ#d+Tft6clFi5RCem4j({Q?mus~hHigpp& zj2X{HyK-bbmCvWLnS9jDrJ_sCbi9~Wv2V#)20n)~h~|d2y$a`|QNsd(lhhQ&LMk0iXOm2wWHe@N zw$cVZkA;M~rFF$xfm$b$(ZdL96BcQpI!-@o!WlRp%o;BzqWZ={bDUtBBke(4ge4jl zbFssqtnIqWiWdwl#WDg@$T|`fIAKm?G;}&v&{(064`;H4@TP1rlaPtD%0LS)77!_c z&=_Gw+BL)krVdZM{MxvcD^R6O3NtM*`^Zu(X^JQb@)oKHuI!25CbSjIc+VO$=jN%@ zo+ORAx_C}3YbT>!#h#v2A!=m`slt}%Iz|66%BmV0uu%hx(X{bA8TbM^7=}Boqor{m z>7+K|+1_;m)5njD63wfsKz3BAU!0(<|L>|n5nPEb4JLDc9I=&)rGt%Ivkk<-i354d zwBy~XZVz+m)~zuVqhZqsxj7?s(1X`Zr-QI?m4P0K*<|bLqM6ROBr{ptT59H5?3>VQ zAcHJRX3{FOS@vd`sv%0V0)OXqb2Y98H#>fxGU}s&0*a24jj}FK4K*cwtAvcD@&$Uh z23s^-D==|5iR2dp*Wt?~E1$ZK(&N6jR3xk;0@r)9j%@Q_%X|l^CA&e<~p9| ztMDc}+gpN`%cR~)C@$IJq`1JsF&G;SN2S2sl-Dp=s_F`v#kOs3kvS8@fZRA=Q-;B~wq>zl09BQ`^~DnvSU93*V6-nmyed6jRX)(5aehVzbrU*TPW zlgU@i%vW;894KKHad{hwee)PZG0a?rp}T(`W=FxLxeT^Xs=epAp+dxEY8Q=G#sy53 ziKXpnWjfoXcJyNt6}Qs~k_Bc!$#U|r-b=4)$Ixx*n^BPm6w;|j*ytneauffnfxqDc z7Fs%0sp#}Ohu3ND2pez<(NI;72)1R5cHCN#lE;E6m4~c(a>KysJV$tWPV=Bf9!Ypt zBM%k4PT&_FH27Q1r*`-_1~_rHLe27gbZ zbr>PeFiqMy)~LmFKFQ~kIUDN{PQj_}9G$e1*1@_xn9)!_fHQaV$?-c;MLCNx&ZgZg z<#Vnxy6iKExu~NrdO$tzWV}H%@XpJ(^AL6Cd6ducTirg)?AVL5VsoFvq?)t$;GBM( zSJ#gVUxnYd+q+x757jL1$4c*R<#q-awVK9qq0<#uXA`RVIDyC9(^#~_Sbzu`Rd8Vy zaGe{RPMbAorI#?_T#I$QyM$gs@O*?*HOw613!ynbt9ef z#zf)=EULglFJqyj6PKy)Ixcsy&=o!si!1O&$GiA|zBPI|M7Y1S#_=)lR!MC7ksbsOeog*b{~$ICa9ESi+Zfn|Q)+#oK&?L%7{v7+yo8$u@l}DgzJQRg z)!>~&hrEscT_|#>e?F65D;)+EH`oUfkW#k9%vr!Jm40^G*J!vAp)<+r)nt z7BmH9B+BA}lEs51i-$*A?7?@)WS?Jz{I$LVJBPMD%hkrQgInrqu2<66PUwMU)YA$~ z!b)PeimJMpWUj_S#7Na@qO_J)mmp0xdU?%}lRI!J9^`cg)9f*Nc@Z1&Hm~n;?4OCb z)cWOAJ`pW*aj2}zLrRTOdxx-7>2eaSAH(B}Y8H=P-^KSB(E^@9Tkw4f>`L6A?))5c zmXb{XyJ&52J{AI<$|mP{WfNt`XDzi|UWy7uRc8eYS^Ve^BQ8z0aKQr%LP{ zSH4>@l_;4+D^9)>G8|!8_4sG=Ud5hA9=o= zJl{zs?_yrxNv7{6-}jL3yUF*xzK>^K_hYY9$32%Zuen~g6e!2YH{ZJ?tmc%ZS$+o?Fcr=cfZ`&r;Csts@gg9Mnyd@+rH_D?5(mjx0bh`VWvA(zLR|h@Br1Y zo&C&1to#pi1Kz=2;1M3wAH_wi!tK0Tth_y}y|=OI-opxeFR$D11fJx-msveu!&7*N z&+l>Ehdjs(VUJS8CiWM^yj1CV=XM~xlYNJWv;GIa#&1;9@Nc)$&ns8@^UIaKyIkqF zaYy7M6?4TTPzo$3HN2&T>0ey&z(bzy}u+;wncP{`+yTK4Ulj_4p zaQKrD>K6^3A#Pm!tMmvTvc(Yi1ODg;4HxoRHjHAp=X3gy0fmUu_V7=KZlA}KHCNy` zk(nWPqxX*PZ2wW6$+9Y)y?=CPuN>7`DY8FtXK=c%MqcGU?GaK1RFV zb$Z-&3Ra6lu8)K6UfWtXh`$J^&WP;~pZ+d*X4=1|zN0B{pwaJb^zFi#wSkat{+L6l z>8JaABEL`F^_@{~r1@$Sz4Cj)GOf;PhN0WLkm(^1Pxp2RpiY1L~F1+6Q(Y@v> z72YYBw{Nm1WEE6qlKFTdrC>ovnN8YdzfH1Vn}S&xBRiPLt z2m6fd6?$LN;QAfusGjW6vkAF(2EAr~BB!9Sob!_tDNse3pQ=P|Luy?%ozEz^u&!gL zKBR|}dMX~?Y-SUwc-vG)>bI&mTfw~JC$GvUk})Ie#{#j173V9cn`+f*_!urwpvDdJ%A7$=+e&(P(&c1wTQwqBu7c@VIHd_1 zE&}UTO%#$?63MOAxCEUjeffcbggH(ba%*;J=)o3x%KQ{pbhuBFGJrCRO|oV+^(v^L4u(=`GqfX} zPsRMWnvO4D7UF0Xw&4>hwimdNHxtQlG99M?#={-Pkdf5zN$6CM4P9$DDhS$mOg1Ch zQ5Y&%?q`<~k)j@H*nv0!;zpFd617)$7ZI|W&88k5=+rZgl=%DgoCHqDSJri;v+=Nl zsgW`h=5V;%O3@T`!H=Y9y3O~(!jaH4q>xdOrp}eyK*KdsX+kQg4L|6QzbTZVXF}UN z;|4PEP0d`H3TB2a5~MU9NfMuH~Mf?O$7nZP&|a*ZfN zsx&=Jxghk2hDRm18fVM~$dCPu$Bs}QgjiK_WlVC}WDKT_%iWYakY~*7jqRL!lkn^k4x##^;Ebz_n`Ft{MdwOf7BW;&x7V6+bFq zW{J?sY*rucNaW0FjA4cV@wA3#q!@!GHZF$roQCJ|6BZP$tax(bAW2uMpz5!l?1=35 zqK237vXrpUZo)aXv2UjlHQVa9`td3qE((fWXgtYffwk56IbK)s+7wzZOFmt`{Q_?& zIE~JC=sD|hamksrSo3cBZ)Jo$rE3L<{~V-O&dM+D~M8@&nlFjp+C0bUqt3)+VGAp69Bco>00n0J6rDiGv% zE$x8Q`F#f0ITHb#g;QmoJsYR-nf#l}=apPrq0L#&9?x=?%67$9o>aCrB80R#P z;N03qe#xg+?waIBm|wJ8!hvNRxNsB~b7TZ-MzCT0_tSiLr55;A*d;m!AFnIjeT-L414!eO__YV_`Vo%0mm6IiFj%FfXl`&dQjF z3-~-j*V`<|BsW~%ajf5(uLL=mz)sr-Wide(NKM(*f^>k8HXgyC0zpwQwE)iYhlQ)j zAB{~%FjRrNp?deBR{XYSG|_Z;JkTdJECv*z`yie*SV`1Z(cyNYzM6ShL)6z2=XDHe zJuc;SGwph?0sXwo@G8Y)XTWqbVB&i0wt_eDX(t1wl@$-?fiQWGaY3&NMMX-*CHzB$ zirFec$LPz%2Oj%@66}(4{0u(pU>6{AKCZUAX%wI9Y^=R$1UKJ}>IOmK)&qhH0bABg z2yb`My|YlTUoYVKO~I2NyE6A-NyJO*SynFYE?D1Fu)eQoeGm_@EDq3_0ACKe@Ssy2 ztrj0Q(zVMO$|lSqWC21pA6u{-R}sc7wC`mhZepAbRE^0Zvni{Cm_pN3+s8kj3nzOF?KSjVP3CitN!6t(-A!75Uzz# zRne>T7{+=Jx*dI@z&mp4*@!pj?Tz@4wyK`i%6*s<^am=JMtsdd-w0mV zazmvOs0^rkkNwL9_7xl0pSpZ(9>vd|;FexXcs#|zm-AbLhjXHHJ zb!ZPR#_d$BJp|+q0&=GX#0u*GO}n&8yR=F>wDKd4H}OkSxPhAY7T)HL7gN}O#X9og z*YrTd+_rj$RzkUj@cbL6s~9`Rg{v$r6CvY(ig%$<+TI0bavEPxYy`QGeS&Upq-1pn zRD?;6$KSXRh(cLHFZ3HPOif+1De97CBf2CuwZF3wD{7LD$7GAEN%o0#7el#+N9(oY$4z70=3s^j^K}7&Ak!zXltdX)hF~; z1HPpZZ&T1~(c7m4e1Xd2>CLnk=}iF{NACu!uYHI7x)jLE&$b32~j{$W94X2E0p!t-|j2*^Rt+gI5W71HQe- zK9Ek_?jp~$R(XxlzRo`WH44ldRQ5O7;J(3(zBMk3t!{*^j8GaYjWQ)7RlymWB~msY XgAzp$YN4@mWoQm3{heD^;2-}5Jq{=p literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/handlers/HandleSuperPerms.class b/bin/net/slipcor/classranks/handlers/HandleSuperPerms.class new file mode 100644 index 0000000000000000000000000000000000000000..e4fc05d0a9a0ec931e9609385ef2c840f1388a63 GIT binary patch literal 5715 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 F{2$)E*^vMM literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/ClassManager.class b/bin/net/slipcor/classranks/managers/ClassManager.class new file mode 100644 index 0000000000000000000000000000000000000000..2a345ed0f5c3d55167708d96d0c9eb0e08610061 GIT binary patch literal 10058 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 literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/CommandManager.class b/bin/net/slipcor/classranks/managers/CommandManager.class new file mode 100644 index 0000000000000000000000000000000000000000..db0620bf6c8133699f202ca0ecd22a9ef2eddccc GIT binary patch literal 21570 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 literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/DebugManager.class b/bin/net/slipcor/classranks/managers/DebugManager.class new file mode 100644 index 0000000000000000000000000000000000000000..0512ca7e7130c5bcb5fad5383e5b135cb6a2eb6f GIT binary patch literal 1093 zcma))U2hUW6o%gc>EG7!y;$G@&$s1{34Wux{3Aw+mSo{4f5C zHhv^t_yhb=#&@96CWXMw&Yqcb-shZm=J%hUzX0rE*FZ#I$9F=j@2Q^M4J_M}{eB?* z)4p{ked#(u-+JS82JYcFG7uBEeIkd_@}%!tN1YSL4h0sZ9jc)tAl@_Rc>`DZ0-NUn*aPuLQR9bL1D=0M<;$GP20+}y}ofp3%S-L>> zJJz&#bR?dlEU?Db)+v#r_{J4L`X3;TEo@Wx$*58o{LRlI6(*4KBo#<1l2V$Nv^9&g WGl8^A(sPpbNO>_Y$>MksJo^g_!`H6> literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/FormatManager.class b/bin/net/slipcor/classranks/managers/FormatManager.class new file mode 100644 index 0000000000000000000000000000000000000000..93ffe1e142f788d47b75abc86a581abd98a8e83c GIT binary patch literal 5518 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 LYT)mR^B?~O4$C@d literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/PlayerManager.class b/bin/net/slipcor/classranks/managers/PlayerManager.class new file mode 100644 index 0000000000000000000000000000000000000000..617f9c6b1ad33260fbee25010c7817931aead3f9 GIT binary patch literal 5619 zcma)A349z?9sb_#W@ob*lIGZy^xPh_n>6V{r46DfjO^4%JLL1go>F}j7ZCp?FIIjvk z0&}j?#2X9)}Qjrnc@aa(WTPY(k+}7AVW6O^qmMT~xP;I7$!#gvhqlOjU zU_VqW!*YT0VcqK2Q)7BcAP{QoE}(O^+bXaEAq6XonK&O+G@^;PAd|jCjK(_})3}A9 z#>)$t=?TlQ#$@^~BBHl7ZdX9R&plo4 zhKv!5>M0*C6sS$wc@j*RR?xJa&>Hlk73(EDUL(C)z&#hM0ZFkzMF%!AtXeXuC!$Qr z*+^%c&I)gnEH<74l`j0Sa%{0} zg?7${w)Qp!d#H4-{dJ7!kx^M&3lA1m&9=ranNIsuTqgtUG17fW*`eN{q8xr7ZlwF! zkRq9wX0d4mCFdv`tAckj`D~mRW_XhkW39Xew<>rS{am6kPWM<9x8dE?lj*ckv$Rd* zDV;VaSFy7!+kALW)*2}@y?Q(z^W!GGS60gR$pmzKlp`vo5?_-s%4|Nre6uGRdz*Bfy!B^;%>B7m1s^Y8o8bg%Ku!x;k z7$RpFZY#iRcBhbicFTuvWCvQA0}`3vQt@qkhecnDMmOq1S|&#RD+~E&(LW1+#(qD( zr{eqg0io!$vuWJ-b3|v{1v+NoRy6AsXHijPvP{^YeuQTgJi{@iWMpSMsN%=?i8E*p zNYAr!*MzobJ!7YX)2)7n=M?Bbii+#crz+*L#duOpeeT<1a4b zod#tqc5sllf7~zl@f-Y3!EZUL*a5Ub(4$!+Dt?bYuqmfxS`b5_O|o1*g+HnIGycMk zMmN|q;UzkIV$tB13n;tf--w)S3(J+ypi>njuYaicC;mm%7>v^f^&F3xag?zAw~GJZ zzr+TU({_|?UY8H2n1y*kX}0)S&`8@erVyMUg-c*TF_Im;B>z3mv5 zE8mnxe-e!X=M*+9XY=JNwwz5VVsR1283m10fjmV)f#Uvor6s;>`QcG_B+8~+_YA&WMoJf-fu^IVY+Cg&s!yPHaMe)+9>UxQ`N4$-{;lCL zU^)MuMK&u?hn1MeoqFdm=3@ch$i@~*G+-eXWknp}DXCJ=F)W_KSpwbe3n#FA)q*us zSS2utbDH=&iFF5{<~ASL=MoE6oxJDNGlwzv1X>4cE;x#I(p@x(&Pi-;dVmbwwrY!L zAJ9UPt5M0D-!h!dF=jQdaBFZ0&b8GHItuW;o3!QFh#vIXerV!-$4?{rxL*PHe^II6 zQn66F5jlnI>K98lIgfy$PE zB3F}mWB)!y@P)Sg%BGm#;IT>OG?WDtdz~jDzk5zS=ZI*TLd1nuZ-aLd!v`^seyEAl za_4J9*%V9{+=t|Ln%ka3)X!r(q?h+N@TSVss6rd&Vm+gA5goGuO}sX)<$68M?xZ_< z=#cGP>$EkEt#}i*;aU#rw_y;s^QLnUJ8TE;pwno7KF)U`gE4wX?(N1N%5sr*oGboE z35Sxax$;o*b>z5*m`L-s|7N^}fDB@>?Q(_MEX%I0As-1yhw81QlHq8Fa*8BA1wuiy zg1z~FQgF3Pt#h4Xe3hBs6*hPI^ESNQiJ*HWwINKzUb^pEK~>8Syq;~`JBXe zJyZB0gXuYjpVr}*yXx>l{KjMW^}4bK56xi;P2rC&9Dpvt@K@SG+X4k2|L)@8^Y|oQ zj7Haa173c;7fS=)yRk5rTrV-X0$$E+PId*nhw`k2+l6hUs}%&|=G=CmEU&Bm&Bt$! z(!x(qi8G}2UfbB5Pk8)@`w-)BJ|lY(=T7&%}u3IFXVd7n68R62-f?lj2*NxU;aA7`>VJypP3T?$JHZvOw6}ePjk3lz~WR!{o2JsuDsMha+%8vkvSu)uXA!y{-j*V>{$!7N}OUn r^yKp6CWUG!jf;v0h5;__K8L zJh`lK8^?K}U5ExlZy`#-Goe#HnJr}O7{ZyLJeCaGgW;H7E2-KTjE8TOh$LZ%Y%z02 zRO)D1WKONJHA9f7QYF;aoC|xe^CF$oG>RvsG^C{HRVP*0Qualr!l|;}LW2V%mwA;& zE}uH1bjr{l44;1gS68p8dzu#}mJcc;dAq)8ROuKxk6KG}S2-bVh%<)K|14tY{xKJ5R$f5XaA@n9#lq$$R_c;CmF-08S7YD<@Szar z#1aD&i+^|a-TCjozrH^{0pJ=gU1$)v6-NOW39gFaux2nGzF|URJn&Sp(2|-;q6Bzx^MgsjmMmhxWh4?i9U9@x?95B|p;8paYRk017iaVBF%U#Q! jW#4koa^G?Q2UY)}<&l{W4LGjW6F5b-PzixExN!U*Zux)Z literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/Method.class b/bin/net/slipcor/classranks/register/payment/Method.class new file mode 100644 index 0000000000000000000000000000000000000000..89788d0ceb7d8dddfd80d2f1530ed08b41d7a38c GIT binary patch literal 1023 zcmbtTO-~y!6dY67WdlhA<)c7>7HFGX@S#U~C?7&XN=sEF4!t>BvoYCtBipIOU*o_J z;71|eI;(VxLZ!lGXKl@!@f$zi-d*1S_=FE3CKz_Lblj$@A7_Tgsj$`v-L>4vL|G>d z?~ALR)Q*3Zu9N)=G09NB6u$*eg--Zs`%=b^AxfnCo(>YF85SDN)As(;ZV+m{R3nGH zxsgj}jLVqAJu@g zrwcgC1}2urDi@v^HocqA5V@XcEzMy*nbL-M$ME?%88TG=$~43d!*J} z0tT8udTKzG9?cX275?t-+OxYJ$BFB>_U7fpNn<;8wr$)({RmB+m%(H_x#EL= z%$+;;ob#RUeCM9^@Ba78w*VZ%D;h!qNyqY&UfRx?SvP5>4bO88XUa>uR?7B#%T4Bt z%Nfh@lS7t2nVs-7LT8eXkG1cO~%rw=7{eb=A<#6mNwB|Gi^Jze^?;g);>x~`m+;O z3<5Xns6w?|HS5q2m8)$!Vu(kvLx2l`T{>z|tzoyo78Oh-d(!YGnQ$B}Xw|V74P>`h z1(7zl=+IFsS8X~r2dfSp^{9<=?^Ye1(xB=gX&_0o9cwtB8MoZ~C1hF1tZAf24cC_M zYBP>7S_$2sw3*WF8>G_fiK2^zv-`77Hgj3ST>@PnRRftoe@PnO6~~=ul}X&KqZ_i` z#>7NXR>#`b3UGr!d)h~%=o6?N%BOw1KTp9q=H(iE0!K95!~JpzNWYGI(a)+9gTU6x z=s|Pzv{UtQ&+`ckqtUCZ#TBC~^SgIPC~9M4Zp*?uyY&ZlfAc}hKc+BZtE%y2}< z{rEI{!{$w6_*o{|xB}WhVZWyaXYqiB&rp?R?u%b_oWp}urDI*9kXJHOD1nC03LN~X zS_=}c!5ALW@p%}$0Bo;6o5>lzty*KphcR(Z8k#yLz$S{Zm;prsA8Iu!Q%vcYgv}P2 zG`wMz4etthX9i>oB-XD0PX#?feU9+rnHn;3s%bT31)A2YoaD{ONTiHeth7X3T<={! z*CE3(QkF}B%Vx~$xCmRWzMx|W!x}EH7!`rgYw!rZsNqrGY3o5MxYh9`e3`f?=^}#% zE4!=MIO|g)v3y0xDV&bu627M6aYe4}9n0i=_VXB?(D5V&NjQTHlLmS2X&uktSwgoi z=8d#BkaDuF)o*y@=mQ&<_0ci`69T)}MN=e;EpBG>4wWhfxXu{9IY|$ux@EWECa+=sh|mz1ql>G!99-(jv8A3ISL(?T#M7I&4xx_UIEYH` zTlmg#RC=%DxhQTz19!I4!lRA+cStOtF}#2#J`?rZ7qIgNS{}HLJqy@ZTJ0~b+81%) zXEY1pApgIG0~FYS2zJu>F3!XjY+(x9um}6liX>0mf&F|+3otYXX#qfzPflP|bzH}7 zWtY`zbGtIpg9EsoP9zT;s@#$2?@=59P4$Ov;7-E**djhYkNx$%OE?_D*|NV)>SQOO zb>U{twjz`mj^bFs+aW#!DCDAS8dsS6nBCzOaE>ebV>nTQGpx*k#2PZ^(Y}O}0%flW zWqp)hkCC(E1a^X)okTMRD!_dTg9UJV3%(=sXuQVM1LgyoPE}a&R^Ycl4EHILDlGS} zwtTR{l096Ab%h?J_`2q?ZwY4vhUU<6>k>FW-^SSBfsQ47E`%BAay1^pfouH8-=4F} ze-Sc5Sg9h&@H`rkq8=t$e;e&M&myK()JDZ?7cO9mHjNZzn#C2!@NEl1%cLZ%!J+KW z0^9kCze5TDPt#NiX)9|@2(r|Kdfk9Ai!SF5*O^Vs<&zB+@N z=4y8A95zv6&D8+|(w!>DYr&~mJgk63BYkt2Qd(qDW#rSP$Yb4+=7@6LS3cWYj1p~* zFv_-Bv~Wk_`ntfIcuIzsALbAoCIB|i|?~JUSvbeunk_q8N5s>yuzO%KY)oJQZ}z*n&%(G zkMK0+=;g<>d<}2lb;(Qs7=LHo{z1n7$tu2A0df!9UtT{FWEH~EI*s98;!6lG{~tF#gEIgC literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/BOSE7$BOSEAccount.class b/bin/net/slipcor/classranks/register/payment/methods/BOSE7$BOSEAccount.class new file mode 100644 index 0000000000000000000000000000000000000000..f93ac0a434b2bfcb94c35c3e6eb3fdd79aff79ef GIT binary patch literal 2240 zcmbW2U2hXd6o%jNXX31l8)8DsM`@cjwn2&8_V!k9Jb)N2kWkjO{;Abs5;ZUEf%mr*caqr4@4xXMpsQQ*?B8Qy(uq^|GTrLin6_E{7S+5{EAAXrB2t z@0VkES9-jMbdDscDU|nd_5Oj#(saFFW=2cfrlmU(BMUvLg-~h|c`|TT8+q;6AUlJC zxD=!{bdc-E25|=k2`ET==pb{wAonS;IEAuo*Yxw>kxaaZv-|N#PIMyfXL}Z9LyKDQ$q3k|s_|f|D!)LCOMYJic-!v1g*0 zv88+r9#WBtV8H?wK~U7B5=gM<0tvoT)pPDlT*q-5tBcINzH`s-f1Z>7p8WYYfU78{ zpb5-7GBEtQy=}RkVbx9F_e^KYH#}Lh{Xlxgwz<=gPGB@-u;EsHV|HbAetMjrvvl#c zWw}i!NFgqe-85UKQ8%5Mu~ONT7M&&qX8ILaQUc@Q(!mypS4c@;EqHg*Kgl`Yq|9cfftUxtUu-*8K}lfj1Vk6#v;F8Ax!p|}}w({}9OmcVBI1sO-f zc)r_(HA=ypTa|+lcuB_)^fY2Pts{d`fmpt<#&6E(NMV3?FY6dYTHsWfa(Y8*o%+FS@B|15hMCoBnkw*~j<;|@V8Cxy0?)MQ^+2Op z5A5wawP~_yx9lo~Hn?H>^N!oBZ3tvm1Jl}CGPk3ur0CsBOL}BUyU(2}Z_~EFENf<9 zx5C7*z9$=QOS11XI&Nc@ZiPqezCh2o$u7O>Ha$z;vAHkQ6irX@d{O8Njw8J}{uW3- zg}VY%{SHewyws&frZ|N~fouJ84hw}c$Yyy!==U(a zq`t>EfkJCC@yts#K@exLflY7V&FYRIMfwF#uo+IkcS48@nEWg2Ne2Z7<{5PtwZ9 znzq|zdB4L_YgjrIfq_#zcG{lii;D zq$p=p0*2d38OCK?A&$ViZQd6Yb%K1z758y<@c>$wuwsX>X@&ZkuKuFXVZL*1bS^?C zkfp)8qVj$1M3GuAkzEq`wQrH@CyH$K5_v!(fAlRfeWHllOJtu!9`!Bqep_Ubnw;A? z!!?<>cOQxPZj4JD>uA%z6gVt#rd@|jREH1LZ81c({_r^N4?Vg6^vk_*4EMY5dvYK5 z%e{$@qF$e&Jn+1zJPaSh{a10raXrXGNA$Pav>wyW8&ch_a}fMJ--=I-9T=R4o|?m6e~KmYylCxBD$utc~TQk#!l2J`dG17TyBd2IqI;U7G`jVL*nw}l)6A)r(Se4eL zbXL+b>FLE)MYaUgGNg72IB5eiL^-0YYkF>j;qZj4o2sUy7j;u{CT)+-Z9hZpIaO1w z0fu0Ae2yVBtS>211hGd%1W|^)6J$MA$So?yHEA)cFvKQwS<22yhRUDa$&j_8nhbpt zJ7rrEKJkcT6zfX1kWn>;j_&yOv?E|RAVNTxK_J5^DM!Tili8+(vzDQ1nf@>Yl7!aG zDTb-)S{P3;)SOK9rB0IK%Z4OdG%ICC)QoCT1SG?F6zw=7po5`xJM}~yMH|CD0w1fu zsa@8MoMaKt?vX0AxQpW=x^R#LC4fm?Q#N=Qq=6x2`Rlld1b;31Ukf##OQ|B| z^NO~_&{NH#0>mZN&mqo}xR(n%3h zm?j8v&7xAg?Yjltx_b?M zs8KBAhMf+>dM+D7aa@V8{v=i5~1@KgAn4ZR5B`bw12L78Fy!R}ANN znkCiBmfB@W84LK9;o`0keJRJ#=%AL&)%l8>J{I_s?>&xC{6V^E=nC-jn!c3w(mj1z z(0?60rDwYf zJv4I9!B}&-X^YP^==r5|t1vxOZrWDWv=wcxX|L-woFK|Y9DY#7`iRdy?74m#ov!^| zgy;vP9Q$KaU3-7Jk2>e6d+ITg*Smg0&m;84P8ZSFLst>~oMq4!HfCENqn+rY=WZ&! zgzd3|-V>_pk>3sA0{IN%I4)w4-VV|GFxbCn66h_%Fh*QXCurnK214c0q?y9 zuC8O=b+|wk!pS!$NQ76(0ekou3)d4#?(`Af*xbK*o7e#D#09FMi@uPWJ*UlXNJE53 zu6U^}LUvuPkSiWrOCm{uExEpyJzp#3zDB58N2%N{`2uY5e6@H1wv+}~NB&f-x?a~Q zJRV?A@^{eZRuMO2g(7aDLP3|hGI^)BQc(@S!QnD&mv!HbA|Q=<$dH_{{$Q9AD6Ql*;c*+JUcYBlw2K?`T{gnD6OYrt1f= F{{i=zI%fa? literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/EE17$EEcoAccount.class b/bin/net/slipcor/classranks/register/payment/methods/EE17$EEcoAccount.class new file mode 100644 index 0000000000000000000000000000000000000000..fddbeb414e0e38b278d8c49d7dcf7942246111a8 GIT binary patch literal 3997 zcmcInZEqA+6n@rDf%%AQTnoE>PLFNTC81WV(CV4&9wuW@c-P zC<-RNCw}ogF)_ZNNfQG~A)>}FYQh&a@q@oceeTS3*-Do*O`E27X3o9$+~+yxx#zUE z|M~tW09)`%2muAV4dKM>te#JqRxFj(Y}?X|5j$pyjBY!^isiNOoG_eNPB_D6+Kwd> zo3=M55-D>}DrFW7Cxi+GHD|R^Etb`cOssF{tVq#XsbJS^efPM&8@-3`S3!lL<%ELT zX#qF`Hcwuh7wkREpFhVDGB;9&FIT-*(-Wq_c&%(SS2f~6{| z5Q!j&`&3k;Rza}2WkAl?6-nI?y@lM6u#RX$S(mDr(y{}ZrOR*MSRtt@*gGeb zrI{k>(2&L?rFay<#3OhB4~DRMTK?i@foH3D2vM#d)v^WAcSgao=6Fj9V{cVw1Z&Y4 z!a4=(Qf4kDG|L&@oD(r&+tiG%W$l=j*JD(RVdlnFG~rURXKZ zaVVy;;yEUzah%)l6@gweNq2{)ycLxp)0~qPSAi0jg>NoS7{#ELPRnpTtKy^=uELOG zX(>kNn>SNAJx-Bnub-Jk*2C)%}y9*Au}wkBPw)c70ev= z6Vwft_l*imE;d!<gNNRX9`AN!|qB3El1$8O_m0z53-QeN06G zhlO zmzd(&`Y3HnyhJ6P6>Hcmg8W^C0DsssfSMZFRoK5(+N<4hF~1ISKFH_N)(zLOr1b`B zTHCIp?kY_IEaSMuoj%UZC-^>y2HF}p$1PZn`}ve_@`wN(ufR%<(($LLaCdHAauchP zt>2;UCf3N;D_Grg4eM{A{djHc1~#=#V(TP!PU7)N?Ab7hec!miYf#667<4f-kO**! zqlOv`p`NO0r;H?)sCSBwWfAQw&`l5Zd_L*YOLA2m0{_Y(1SQ1E!=YmZ7xkc*ql9~# za4YysNTlm;qVEbid#7Ob6J~oU%-}?E?x;8Sbdf@EqGH00Pncoupvy4UtpizWIlMEDa$Lfki0%4ug}Tr z3-bDsysnVfSLF3Ic}>g*FTKd?vR^lv{JL@WPGy*(YVc~xdQerYY_;w^ze>wB7UyrV z4wEiEuc|c_?|+kj|08}?^KN}5ly2U7dd-yuWXuK7Edu(1fPN&PpXUVVTvmRV2fRF;FQRCpXQ_q&&zS19T*vpnU4ODoOS{)&1FWg? Y>jG;kP|LSPtgJ6p%Kr*q#$_n~0d#L=wg3PC literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/EE17.class b/bin/net/slipcor/classranks/register/payment/methods/EE17.class new file mode 100644 index 0000000000000000000000000000000000000000..1eb5f5b33121d72d05e6df99bf27eece0237f7b2 GIT binary patch literal 3162 zcmbVOU31e$6g_J@mTg1`AyA;uQV3wjU_qb+8cGR?p(#$FgocvR4@E4Fh%FgO>A-*J zAE1ArFFe3Z8)!SzXHD7Ptow#1>$V?A&uE#?n$ii3rVQ5HhrUs*o}JQ=5g2)Fes3BL)2SP` zRv$|%(2y0V49d3<@(C2GzE6JJZ1@7>HOp-p()5D0$)+@9`<2nzH7$_6Y&&*vMIc=) zEem93-G{P(GQ4<&7c=*gXWyn zfNA9GGPvE?sN0UfiDGGx-189Ft3yLhKqGw7Y%;qsf;(z11)lBHr*qJ#4)-ie&$nGC zhj&@k3MNo-(3iHVInr6Tl#koF|1$=;G8jcDa+fHY*WgAt? zb=>AN9q-|Na+*zd!y%`b6UeQZ{xxNgFyab}h##nsTWctBM`o4#)d_5=kmV6QV_Aw{ zl&&Y10BcBs>!C~20o=_*(6cl9q&_XvTZ`t^bUN6nuePK z`?t$a#{w1wl$dkUw>-P0x>KOc#@-H-*m&J;NP6ft?r8X&z8(;wV;|nh;V%8%k)nWQ ze5v7H*MN>jijMoLyGG=b4Nlwny5o9s*7T)@uLO>6HxW9MSHsr=dpe?4pIS05G#ee4 zz`#CC?w*&?*C*`3M>4oPieGQyTmj~_DE+ep6RjbzJ9^diY)4`~a8_~v^KXcM zDfKzwCw&+1`T65@2Y(q{1=pd8*U(?_CWT>Mv*E-2+zjZ^28>`ge{n=(53k+epE35b z2Yje6m{yFzr@5-g>CyeY&?5JNs97m$JZ6V&K zqLNZ-OG@Z;XvyJ_^C~?&L-)=mavf{O z84KCjtszP%lYfjWahP_}qWAP}44m{QP%O&(KQLt_L2-2E4QB8CgzQ54Mfq3o->XgB z8eQ7N7tf)W|H8_13}s&M%#_))Y`q6@LHptXF_BBLU04y{;9D{j z81*}tys8p&NY86{kUGFOtFYqCX82b5BtKF96Dz-9tkc#C4lEIPH=$p?9VQ=z8JS^| tKaA-j1FH$K3E8V0zn&xvU5R>lw+5T*LDu+~^)<42G`YH5r%2d>_!nWYxGewx literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/MCUR$MCurrencyAccount.class b/bin/net/slipcor/classranks/register/payment/methods/MCUR$MCurrencyAccount.class new file mode 100644 index 0000000000000000000000000000000000000000..9f78aeedd2b0dba93fd594110489e82e23fd132d GIT binary patch literal 2211 zcmbW2Yi|=r7=_Q+#%ntZgaD?c7fMNsZ6FH)($a)*vBNF40|_w_d_d#%$X?>zjds^= zqyD8zRi&b$eyIAnKdRz=cO7Fkwj7}-dpR@n%$b?+*s%`m!@{C=%XDcT#Y!!6emT%O`+ne*Xa?kUWWA5EEO}FO+8d3tY zZ)9H@UFo!qjpiF=lA0D+IqU?raDw^hHsA`R9BC_ox#|b_R^VAqds!eIbS!`Vs=!k9 zu#=3gf(a{@V+E@M>xEB49JEzzkm<79QdtNb*O5goha^tun8BPtvQTVr%PAciGSs7L zIjY{Xo637Go854!t|_|>=~?_f5L3KVfrp>u^1yM?%C)AXlQL;Oa#YFTOMI>2D}f8P zGNj)LI%79+3eFt8|)AH$(pd9GeF@T3`V@0&W681>HBy>4LbcK2BPQO6RC>6X>ET8gD* z9k*D@cBH@NxV?6V)m0rUtZJlg^p(fjJso#KB5B)BD-tU@?z5P){JLt(!0JaQ8g9ZP z9cy?jaC(emHk|g9?e;?(RUJ>bYi`T!d8T?`aT2p!>kC|X0{UaeQC^up5X#r^Okm-# zH5XO1z|oINTf=jK8;50#)-A;+{{6vuDyby>A3=itsIq|BS*|_$)aj(pgx90=wodIy zx*soHdW&PFzc5?6{1zwwASr>J4m$R5nKa2UJQs3IkRhsnA6}&bs&x#nf*@ zS}yd}AjXRkpZTHBJg#7Yn1Z6a&%RA$-heE#iFfq_E;9FO1eG14vP0DMiKrWK)axmz zrHQB?;wW

efWmPjOUx3TkB{>UJEpGX-^LBI<4&wPJc@M z4gH`q3TkH@{pyc$Ja=~!k|k)SACi0b?mf?W&U0S&?|**(1Hk(zNeD6AF}b7KWuvB7 zEmbdTwry!<$yP01Fl>igYE64y;ijWjxKpei*=jEHbXP)zVcIW*40zFBt^gc&ldoYiWkwWy3U_6^3v;vCk06 zRFAlfF!~h4ATwOe8YbVaSMuC?qUFn+VJKVGwer4Z8RFSLj5tNZW?0O2OSx47q7f@_ z=W)4SFieKwcp@9rBOL?7hyn>w28k|jYZcS8+2aO>~&GQt{jI%*gv?0 zCf$hS>At9rpeU4GnXK1z-NTQVZtD7d#OC>IhbS(BCCHV?Wz%f8gIS{MGW0rU##?;M zw1f=9{nx4FnOq}LK9-Di+!qOc!0;&EHLbSp=pX`hYCnk}Qq&Zp*g=R6rd@MrlcvQJ z*jRg@CvfnmXKo@yX=;N9X$3z+TgZs z88y+83`v>=LsN=| z5B+-R7ZQV?zO?j+!>UgXcM9fK(Bi^h^w?$ybBn>AU)A|!W;D8 zZu~Qbe+(FpbTp=N@r_fo3eVx8v7qVo7SnLk?|28(H-n}V9Ze_jw(s?p?==*98Q?qB zVi{^Wy@5&JauX5K5*U7kse{>H@y;3IL&;O5PH{WP;--srjl`t;K9<>_z;-h^}yacmU@;5wUIK`(!PfzjL4;Vf_7^8z1P?CS)@CAAzFWuCH-HsZf zz(8RR(${Pn86;>gy2~q)R5OqizQkAL@@slWQcOo_{|&zNNv!!KVsptqarg^{&s$b@ r**&Bl-)sSnHGyM3a0nVfhmeO(>o{fSh~~p_Zwv)m4O-X9*$LRc;>495 literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoAccount.class b/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoAccount.class new file mode 100644 index 0000000000000000000000000000000000000000..ed19c1e0ea82b88b627c14474d11734c898aaa51 GIT binary patch literal 2393 zcmbVMO>Y}T7=Fff{MAY8IwUP^LxBcrJ0V-rHc*nbq)AI#oCL@R1&PCWJ+im;?nb+7 zONIjn4jecD|DzHhksxv4io}nqc;EHfnAnl69z3&tX5Qy{Kj)tpfBpsFI-aBu6S(W> z!0;Q^f$4gN*-*akDd(AQc)Di!f%c38)wZ=07`6`TZq+xeb@%2REo-LfHk}}agh1}8 zYAK_koSLy+d8$o9lLD*bQg4RTbDb^X6-cR$g21J+>DnypxOUs{+vJyRME6z%(sj2{ zwVawSFgxt#!|0fzU*lC1@jy0!k?q1uhOrOE*S|x9~O@_&T7J7dDDtvfZM@Jd6%NrAR89 zTUeoyU@j6dXcu%gQTiRzztTqxOqmS9FG3pGxe(C^?mI%*!=;c6NR#pG z5w8An%>JuB`*hEK9t)BE6N--`oMQXGF%f^xA6Jj?PU1Pi@z9mi;T1*ERd5z&Uu09g z$fj@&?-J=!XeD_3ua8!_F`!Z-l{%?dSpRNQe@ZjDy?U_iwum4H;5 zF#(;A7OK# q3O`a6enJjE_c7)p#@D!5&#;^1Y1yOKM*Is{q`s~I literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoBankAccount.class b/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoBankAccount.class new file mode 100644 index 0000000000000000000000000000000000000000..e72aa5562112742175ba4074a9ce43cc00410ef0 GIT binary patch literal 2636 zcmbVMU2_v<6n@?$%@=RmG=+j<0kKLFY8Rp4N1;&CBGt52TPon^X0wwlB)gs6O=kL2 z{Fw2=3om2_n6Y8TuNn0Mb;b)XyzoN(CywXrZbL|d$#9W(H_!W?=Q;bl=bT^v{rY#w`$2eHDQt1~zVT?-*W3NCslilQ<35giuNgTkFF+3q~=>Kh!IEbeN z_LOyZ*A9WhnQX6Yb`Q+4&LN2ek^-Xz!_-&nwW4lssKu%-kSF&)f%O`mqH$t>bh%Fwal@18Hs1{oIrwf`1o?k zb9kBerX{k-Q7sl#s&I{H$os`4PT*t=F9;m$;rOm~63=6X0vz3?+srIxuXEfPNiF!I z56~?~)f#t_fLIh5UUyaP=8C!%7#UVeC5|~KF~>1+r(SezRdX4Sfh68omkM$E-`dfj3Fc)@xRS zJI@nGcVc))U}n%Z^oImhMAx*4;eCPGL3!HSSzzSh;=>r0y-oXJdhX91-$5#O59!?W4)*1yo7lgD$-5rGVOrCO(E1UPeN4fh zU;>}w2q622+8ELQg?^L%FZ8?+(3$z?4xB{LG_~{(*o-a9I<= z8J?sk2gfd^n9XFSz^E1o~b*Pm=cx!n=}WzYCim<{5u zlE3WmIORWiA4B0={Bo>`(-BT3>{&759l1^J-oY5|dX&Di<1J^$@e*Dp(pS7F!P9N7 zzslJzl^s%PlFGe7Rp$GvobOWkhE%>KmG1^sS?I5Fu}kF#Qu&coei~F|vA@bvm&$!o z`I%IH8B~SlQ*is|g4<67mwvgk{C;cWOtkJg5!|)lvGxe6*E^|x??Xky@DWt2om7AH zp`y_lP_?%wwZ~hXOn-VzetSP?&y8063h@Z4=rp(YZhKIlU+KDqzvveJMhgG5F{T5@ dT0Ie>iN^EgDy}gpy$#_y-i>m%yoV1U{sScj^56gf literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo5.class b/bin/net/slipcor/classranks/register/payment/methods/iCo5.class new file mode 100644 index 0000000000000000000000000000000000000000..4daf2bdd806246e0f579dc647910e9d89ad102f2 GIT binary patch literal 3640 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 literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo6.class b/bin/net/slipcor/classranks/register/payment/methods/iCo6.class new file mode 100644 index 0000000000000000000000000000000000000000..71fb29430a533ba40bebae96538939ec6a6896d2 GIT binary patch literal 3072 zcmbVOT~pgu5Ixs6$aVxF#z_-WT4+hZIH0CYDAXi@7)WRgNkd8t{gj0;0!wlvxl?`$ z{~-_UOl#6+rqjOmM|HaQN|9~ZbUZv*SGwAB_Uzu>mH+wok3Ru?jJkvv!);6V6t`;B zG}}?Ms_MFqY8|q(;cOz9-F%5DW>in*n6&G6zw?)35KCV^+#2ys#ZmLQa;o* zPeMP#Y_EJ9f{#HWLd!Of88Ri!HU&Sw@Vx><|Ds_T-aUr+RBoFgQMC8;G~yVLkwTi` zV#%=d&AM6Eo#$$~s&g7!Q>)vmWANu-GvOT=F2h`@S9z`Bl8jVE_nubk6~ki4PUSk4 zroeDnhJ+-AM8=z{Nm{sRGfi8bV_20!5)wn2Y_@gBHEb)1>kMp;GP>`mnnycob;YO{ z9tozX*C`46wqvRud6-)1LYT%l-k0zmF+?*c;~l(91gdG*Eh1nm49Nr4eZUV{(C?Do zV1x5_%FU5QqD=NYwH?7wB!phpG|n$!mf>os!9Au5GL_(^o5l4#e)D)VP+kQF)-d%$vidROM$%8KXx*R~yQrdFc z;)yy;Hr%3Z)>O|BT|7EfvYm=jt{)v4o>CL7r}!OM$n9Rh8Xie_NY!?hm5gsU^?Cv>2`#Rh<%E!lr}`s>B{4GOpmQB%boQrimGr#xp#Zu+=s&{YfC> z3*H7p`ir_+b=NDF?dV0-74z*&8DC+Cnw5^E$j36naN95uo22k-uJ9Wggw56zuafxA zp9iyiV)F~1s9entGE|g#`w731uJ>m-<(Lfov@?vHnK3%Jfh|wfjyBXFqv`xKXb6i)c$`!&>z1WEB2wLzU^6WC+7E3-7?%1# zTf<9m7?#e(*izOEmweW?y>xRT(BP&~K)*iv#rW5QKFt^Dp1y5#y+BV2t&G;b=~KwR z&`k`3bnO?Lm&q8AeFF^P5?E12px0MF3MJ;yUwqtMY7Xgu_L ztqXJ{3LWnXeH){J*PDUYSl`Qt-Wx5*Sm>0#Zvk?FQWGak-{dQdMcw8E_zIbjK>+4= z6SyH9et^lSfOu5EOjiL@$OXtbS~-8L19_{(`y1)}B&U%V-fxB+OSH>5i8*>3p`^xDzN^qLrtlQ_+Ip81vtT9B&kHZJaGe_&IzMusx!Dac$Yx znBSRh3jFjG_oDf}+oCZW@@GSh%Xkpg$f6v}J!>ptC1CSNA=jAC|Bh9L1|DagH1PQe zu2Uwr8`#Z!+ralHkn?|I`~-c8m*TMEqNy@S5OkH=Xbod{NF}k_5=K4@BM%LGRx{S`=|s8mIDQ;>HJ?9{|(t@)24;A$JFJe7T#3IoAP;wmZ^mg0y@7udH*+HL^DKV gpCpKy!;!eF!lZSCWLb1twf+=d(CX4UPlO)We^@h|Q2+n{ literal 0 HcmV?d00001 diff --git a/bin/plugin.yml b/bin/plugin.yml new file mode 100644 index 0000000..287c2e4 --- /dev/null +++ b/bin/plugin.yml @@ -0,0 +1,65 @@ +name: ClassRanks +main: net.slipcor.classranks.ClassRanks +version: 0.4.4.2 +author: slipcor +website: http://dev.bukkit.org/server-mods/classranks/ +soft-depends: [Vault] +commands: + class: + description: Lets users choose a class / change classes + usage: | + /class [classname] | Choose the class [classname] for yourself + /class [add] {username} {classname} {world} | Add user to a class + /class [remove] {username} {world} | Remove user from a class + /class [rankup/rankdown] [username] {world} | Rank user up/down + /class [rankup/rankdown] | Rank yourself up/down + /class get [username] {world} | Get the active rank of a user + /class list {classname} | list of class or class / rank + rankdown: + description: Rank down yourself or others + usage: | + /rankdown [username] | Rank down yourself or username + rankup: + description: Rank up yourself or others + usage: | + /rankup [username] | Rank up yourself or username + classadmin: + description: Administrate the classes + usage: | + /classadmin add class [classname] [permname] [displayname] [color] + /classadmin add rank [classname] [permname] [displayname] [color] + /classadmin change class [classname] [newname] + /classadmin change rank [classname] [rankname] [displayname] [color] + /classadmin remove class [classname] + /classadmin remove rank [classname] [rankname] +permissions: + classranks.*: + description: Gives access to all commands + children: + classranks.rankdown: true + classranks.self.rank: true + classranks.self.addremove: true + classranks.admin.*: + description: Gives access to all admin commands + children: + classranks.admin.rank: true + classranks.admin.addremove: true + classranks.admin.admin: true + classranks.rankdown: + description: Allows you to rank down + default: op + classranks.self.rank: + description: Allows you to rank yourself + default: true + classranks.self.addremove: + description: Allows you to add/remove your class + default: true + classranks.admin.rank: + description: Allows you to rank other people + default: op + classranks.admin.addremove: + description: Allows you to add/remove other peoples classes + default: op + classranks.admin.admin: + description: Allows you to administrate the classes (db) + default: op diff --git a/src/net/slipcor/classranks/handlers/HandleBPerms.java b/src/net/slipcor/classranks/handlers/HandleBPerms.java index 1e44e54..c0a8b54 100644 --- a/src/net/slipcor/classranks/handlers/HandleBPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleBPerms.java @@ -1,210 +1,209 @@ -package net.slipcor.classranks.handlers; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.DebugManager; -import net.slipcor.classranks.managers.PlayerManager; - -import org.bukkit.World; -import org.bukkit.entity.Player; - -import de.bananaco.bpermissions.api.ApiLayer; -import de.bananaco.bpermissions.api.util.CalculableType; - -/** - * bPermissions handler class - * - * @version v0.4.3 - * - * @author slipcor - */ - -@SuppressWarnings("deprecation") -public class HandleBPerms extends CRHandler { - private final ClassRanks plugin; - private final DebugManager db; - - public HandleBPerms(ClassRanks cr) { - plugin = cr; - db = new DebugManager(cr); - } - - @Override - public boolean isInGroup(String world, String permName, String player) { - //ApiLayer.hasGroup(world, type, name, group) - return ApiLayer.hasGroup(world, CalculableType.USER, player, - permName); - } - - /* - * Function that tries to setup the permissions system, returns result - */ - @Override - public boolean setupPermissions() { - // try to load permissions, return result - try { - ApiLayer al = new ApiLayer(); - plugin.log("<3 bPermissions", Level.INFO); - return (al.toString() != null); - } catch (Exception e) { - db.i("bPerms not found"); - return false; - } - } - - @Override - public boolean hasPerms(Player comP, String string, String world) { - return comP.hasPermission(string); - } - - /* - * Add a user to a given class in the given world - */ - @Override - public void classAdd(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - ApiLayer.addGroup(worlds[i], CalculableType.USER, player, - cString); - db.i("added group " + cString + " to player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - /* - * Add a user to a given rank in the given world - */ - @Override - public void rankAdd(String world, String player, String rank) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - ApiLayer.addGroup(worlds[i], CalculableType.USER, player, rank); - db.i("added rank " + rank + " to player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - /* - * Remove a user from the class he has in the given world - */ - @Override - public void rankRemove(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - - ApiLayer.removeGroup(worlds[i], CalculableType.USER, player, - cString); - db.i("removed rank " + cString + " from player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - @Override - public String getPermNameByPlayer(String world, String player) { - player = PlayerManager.search(player); // auto-complete playername - ArrayList permGroups = new ArrayList(); - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - db.i("checking world "+worlds[i]); - String[] list = ApiLayer.getGroups(worlds[i], CalculableType.USER, - player); - for (String sRank : list) { - db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) { - permGroups.add(sRank); - } - } - - } - - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } - - @Override - public void classAddGlobal(String player, String cString) { - - } - - @Override - public void rankAddGlobal(String player, String rank) { - - } - - @Override - public void rankRemoveGlobal(String player, String cString) { - - } - - @Override - public String getPermNameByPlayerGlobal(String player) { - return null; - } - - @Override - public void removeGroups(Player player) { - String[] list = ApiLayer.getGroups(player.getWorld().getName(), CalculableType.USER, player.getName()); - for (String group : list) { - ApiLayer.removeGroup(player.getWorld().getName(), CalculableType.USER, player.getName(), - group); - } - } -} +package net.slipcor.classranks.handlers; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.PlayerManager; + +import org.bukkit.World; +import org.bukkit.entity.Player; + +import de.bananaco.bpermissions.api.ApiLayer; +import de.bananaco.bpermissions.api.CalculableType; + +/** + * bPermissions handler class + * + * @version v0.4.3 + * + * @author slipcor + */ + +public class HandleBPerms extends CRHandler { + private final ClassRanks plugin; + private final DebugManager db; + + public HandleBPerms(ClassRanks cr) { + plugin = cr; + db = new DebugManager(cr); + } + + @Override + public boolean isInGroup(String world, String permName, String player) { + //ApiLayer.hasGroup(world, type, name, group) + return ApiLayer.hasGroup(world, CalculableType.USER, player, + permName); + } + + /* + * Function that tries to setup the permissions system, returns result + */ + @Override + public boolean setupPermissions() { + // try to load permissions, return result + try { + ApiLayer al = new ApiLayer(); + plugin.log("<3 bPermissions", Level.INFO); + return (al.toString() != null); + } catch (Exception e) { + db.i("bPerms not found"); + return false; + } + } + + @Override + public boolean hasPerms(Player comP, String string, String world) { + return comP.hasPermission(string); + } + + /* + * Add a user to a given class in the given world + */ + @Override + public void classAdd(String world, String player, String cString) { + player = PlayerManager.search(player); // auto-complete playername + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + try { + ApiLayer.addGroup(worlds[i], CalculableType.USER, player, + cString); + db.i("added group " + cString + " to player " + player + + " in world " + worlds[i]); + } catch (Exception e) { + plugin.log("PermName " + cString + " or user " + player + + " not found in world " + worlds[i], Level.WARNING); + } + } + } + + /* + * Add a user to a given rank in the given world + */ + @Override + public void rankAdd(String world, String player, String rank) { + player = PlayerManager.search(player); // auto-complete playername + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + try { + ApiLayer.addGroup(worlds[i], CalculableType.USER, player, rank); + db.i("added rank " + rank + " to player " + player + + " in world " + worlds[i]); + } catch (Exception e) { + plugin.log("PermName " + rank + " or user " + player + + " not found in world " + worlds[i], Level.WARNING); + } + } + } + + /* + * Remove a user from the class he has in the given world + */ + @Override + public void rankRemove(String world, String player, String cString) { + player = PlayerManager.search(player); // auto-complete playername + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + try { + + ApiLayer.removeGroup(worlds[i], CalculableType.USER, player, + cString); + db.i("removed rank " + cString + " from player " + player + + " in world " + worlds[i]); + } catch (Exception e) { + plugin.log("PermName " + cString + " or user " + player + + " not found in world " + worlds[i], Level.WARNING); + } + } + } + + @Override + public String getPermNameByPlayer(String world, String player) { + player = PlayerManager.search(player); // auto-complete playername + ArrayList permGroups = new ArrayList(); + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + db.i("checking world "+worlds[i]); + String[] list = ApiLayer.getGroups(worlds[i], CalculableType.USER, + player); + for (String sRank : list) { + db.i("checking rank "+sRank); + if (ClassManager.rankExists(sRank)) { + permGroups.add(sRank); + } + } + + } + + db.i("player has groups: " + permGroups.toString()); + return ClassManager.getLastPermNameByPermGroups(permGroups); + } + + @Override + public void classAddGlobal(String player, String cString) { + + } + + @Override + public void rankAddGlobal(String player, String rank) { + + } + + @Override + public void rankRemoveGlobal(String player, String cString) { + + } + + @Override + public String getPermNameByPlayerGlobal(String player) { + return null; + } + + @Override + public void removeGroups(Player player) { + String[] list = ApiLayer.getGroups(player.getWorld().getName(), CalculableType.USER, player.getName()); + for (String group : list) { + ApiLayer.removeGroup(player.getWorld().getName(), CalculableType.USER, player.getName(), + group); + } + } +} From 8e7f92949e23ec6941a883fae502cd22fd5fcf0d Mon Sep 17 00:00:00 2001 From: oduda Date: Wed, 30 Jan 2013 14:49:09 +0100 Subject: [PATCH 04/29] =?UTF-8?q?export=20der=20ClassRank=20map=20notwendi?= =?UTF-8?q?g=20offen.=20Config=20manager=20um=20die=20Cofig=20daten=20bess?= =?UTF-8?q?er=20verwalten=20zu=20k=C3=B6nnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/net/slipcor/classranks/ClassRanks.class | Bin 15367 -> 15767 bytes src/net/slipcor/classranks/ClassRanks.java | 817 ++++++++++---------- 2 files changed, 414 insertions(+), 403 deletions(-) diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index 7c5ee237d05ed7eff0c9189954dd29b5ea4703f1..9b3f188aaeaf74f4df2820eacecda694c4ea27f4 100644 GIT binary patch literal 15767 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 diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 9d912dd..25f25f3 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -1,403 +1,414 @@ -package net.slipcor.classranks; - -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.java.JavaPlugin; - -import net.milkbowl.vault.economy.Economy; -import net.slipcor.classranks.commands.ClassAdminCommand; -import net.slipcor.classranks.commands.ClassCommand; -import net.slipcor.classranks.commands.RankdownCommand; -import net.slipcor.classranks.commands.RankupCommand; -import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.handlers.*; -import net.slipcor.classranks.listeners.*; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.CommandManager; -import net.slipcor.classranks.managers.DebugManager; -import net.slipcor.classranks.managers.FormatManager; -import net.slipcor.classranks.managers.PlayerManager; -import net.slipcor.classranks.register.payment.Method; - -/** - * main plugin class - * - * @version v0.3.1 - * - * @author slipcor - */ - -public class ClassRanks extends JavaPlugin { - private final CommandManager cmdMgr = new CommandManager(this); - private final CRServerListener serverListener = new CRServerListener(this, - cmdMgr); - private final DebugManager db = new DebugManager(this); - public boolean trackRanks = false; - - public Method method = null; // eConomy access - public static Economy economy = null; - public CRHandler perms; // Permissions access - - @Override - public void onEnable() { - - PluginManager pm = getServer().getPluginManager(); - pm.registerEvents(serverListener, this); - - @SuppressWarnings("unused") - ClassManager cm = new ClassManager(this); - - // register commands - getCommand("class").setExecutor(new ClassCommand(this, cmdMgr)); - getCommand("classadmin").setExecutor(new ClassAdminCommand(this, cmdMgr)); - getCommand("rankup").setExecutor(new RankupCommand(this, cmdMgr)); - getCommand("rankdown").setExecutor(new RankdownCommand(this, cmdMgr)); - - // load the config file - load_config(); - - // load Vault - if (pm.getPlugin("Vault") != null) { - db.i("Vault found!"); - if (getConfig().getBoolean("vaultpermissions")) { - this.perms = new HandleVaultPerms(this); - log("ClassRank Vault permissions plugin found", Level.INFO); // success! - this.perms.setupPermissions(); } - if (getConfig().getBoolean("vaulteconomy")) { - setupEconomy(); - } - } - - // backup permissions - if (this.perms == null || (this.perms != null && !this.perms.setupPermissions())) { - - if (pm.getPlugin("bPermissions") != null) { - db.i("bPermissions found!"); - this.perms = new HandleBPerms(this); - } else if (pm.getPlugin("PermissionsEx") != null) { - db.i("PermissionsEX found!"); - this.perms = new HandlePEX(this); - } else { - db.i("No perms found, defaulting to SuperPermissions!"); - this.perms = new HandleSuperPerms(this); - } - this.perms.setupPermissions(); - } - - - Tracker tracker = new Tracker(this); - tracker.start(); - Update.updateCheck(this); - - log("Version " + this.getDescription().getVersion() + " init ready", Level.INFO); - } - - @Override - public void onDisable() { - Tracker.stop(); - log("disabled", Level.INFO); - } - - /** - * (re)load the config - */ - public void load_config() { - String debugVersion = "0320"; - - if (getConfig() == null - || !getConfig().getString("cversion").equals(debugVersion)) { - log("creating default config.yml", Level.INFO); - getConfig().set("cversion", debugVersion); - getConfig().options().copyDefaults(true); - saveConfig(); - } - DebugManager.active = getConfig().getBoolean("debug", false); - - if (getConfig().getBoolean("checkprices") - && getConfig().getConfigurationSection("prices") != null) { - db.i("prices are already set, reading..."); - // set prices - Map prices = (Map) getConfig() - .getConfigurationSection("prices").getValues(true); - cmdMgr.moneyCost = new double[prices.size()]; - int i = 0; - for (String Key : prices.keySet()) { - String sVal = (String) prices.get(Key); - try { - cmdMgr.moneyCost[i] = Double.parseDouble(sVal); - db.i("#" + i + " => " - + String.valueOf(Double.parseDouble(sVal))); - } catch (Exception e) { - cmdMgr.moneyCost[i] = 0; - log("Unrecognized cost key '" + String.valueOf(Key) + "': " - + sVal, Level.INFO); - } - i++; - } - } - - if (getConfig().getBoolean("checkexp") - && getConfig().getConfigurationSection("exp") != null) { - // set exp prices - - db.i("exp costs are set, reading..."); - Map expprices = (Map) getConfig() - .getConfigurationSection("exp").getValues(true); - cmdMgr.expCost = new int[expprices.size()]; - int i = 0; - for (String Key : expprices.keySet()) { - String sVal = (String) expprices.get(Key); - try { - cmdMgr.expCost[i] = Integer.parseInt(sVal); - db.i("#" + i + " => " - + String.valueOf(Integer.parseInt(sVal))); - } catch (Exception e) { - cmdMgr.expCost[i] = 0; - log("Unrecognized exp cost key '" + String.valueOf(Key) - + "': " + sVal, Level.INFO); - } - i++; - } - } - - // set subcolors - cmdMgr.getFormatManager().setColors("world", - getConfig().getString("playercolor"), - getConfig().getString("worldcolor")); - - // set other variables - cmdMgr.rankpublic = getConfig().getBoolean("rankpublic", false); - cmdMgr.defaultrankallworlds = getConfig().getBoolean( - "defaultrankallworlds", false); - cmdMgr.onlyoneclass = getConfig().getBoolean("onlyoneclass", true); - trackRanks = getConfig().getBoolean("trackRanks", false); - - boolean signs = getConfig().getBoolean("signcheck", false); - if (signs) { - db.i("sign check activated!"); - cmdMgr.signCheck[0] = getConfig().getString("signchoose", - "[choose]"); - cmdMgr.signCheck[1] = getConfig().getString("signrankup", - "[rankup]"); - cmdMgr.signCheck[2] = getConfig().getString("signrankdown", - "[rankdown]"); - } - - PlayerManager.coolDown = getConfig().getInt("cooldown", 0); - - ItemStack[][] itemStacks = null; - if (getConfig().getBoolean("checkitems") - && getConfig().getConfigurationSection("items") != null) { - db.i("items exist, parsing..."); - Map items = (Map) getConfig() - .getConfigurationSection("items").getValues(false); - if (items == null) { - db.i("items invalid, setting to null"); - itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; - } else { - // for each items => ItemStack[][1,2,3] - int iI = 0; - itemStacks = new ItemStack[items.size()][]; - for (String isKey : items.keySet()) { - List values = getConfig().getList("items." + isKey); - itemStacks[iI] = new ItemStack[values.size()]; - db.i("creating itemstack:"); - for (int iJ = 0; iJ < values.size(); iJ++) { - String[] vValue = (String.valueOf(values.get(iJ))) - .split(":"); - - int vAmount = vValue.length > 1 ? Integer - .parseInt(vValue[1]) : 1; - try { - itemStacks[iI][iJ] = new ItemStack( - Material.valueOf(vValue[0]), vAmount); - - } catch (Exception e) { - try { - itemStacks[iI][iJ] = new ItemStack( - Integer.valueOf(vValue[0]), vAmount); - } catch (Exception e2) { - - log("Unrecognized reagent: " + vValue[0], - Level.WARNING); - continue; - } - } - } - db.i(iI + " - " - + FormatManager.formatItemStacks(itemStacks[iI])); - iI++; - } - } - } - cmdMgr.rankItems = itemStacks; - - Map classRanks = getConfig().getConfigurationSection( - "classes").getValues(false); - for (String sClassName : classRanks.keySet()) { - Map ranks = ((ConfigurationSection) classRanks - .get(sClassName)).getValues(false); - boolean newClass = true; - for (String sRankName : ranks.keySet()) { - - String rankName = null; - String rankColor = "&f"; - double rankCost = -1337D; - ItemStack[] rankItems = null; - int rankExp = -1; - - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".name") != null) { - rankName = getConfig() - .getString( - "classes." + sClassName + "." + sRankName - + ".name"); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".color") != null) { - rankColor = getConfig().getString( - "classes." + sClassName + "." + sRankName - + ".color"); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".price") != null) { - rankCost = Double.valueOf(getConfig().getString( - "classes." + sClassName + "." + sRankName - + ".price")); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".items") != null) { - rankItems = FormatManager - .getItemStacksFromStringList(getConfig() - .getStringList( - "classes." + sClassName + "." - + sRankName + ".items")); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".exp") != null) { - rankExp = Integer.parseInt(getConfig().getString( - "classes." + sClassName + "." + sRankName + ".exp")); - } - - if (newClass) { - // create class - ClassManager.configClassAdd(sClassName, sRankName, - rankName, rankColor, rankItems, rankCost, rankExp, - null); - - newClass = false; - } else { - ClassManager.configRankAdd(sClassName, sRankName, rankName, - rankColor, rankItems, rankCost, rankExp, null); - } - } - } - - saveConfig(); - } - - /** - * log a prefixed message to the logfile - * - * @param message - * the message to log - * @param level - * the logging level - */ - public void log(String message, Level level) { - Bukkit.getLogger().log(level, "[ClassRanks] " + message); - } - - /** - * send a message to a player - * - * @param pPlayer - * the player to message - * @param string - * the string to send - */ - public void msg(Player pPlayer, String string) { - pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") - + ChatColor.WHITE + "] " + string); - db.i("to " + pPlayer.getName() + ": " + string); - } - - /** - * send a message to a commandsender - * - * @param sender - * the commandsender to message - * @param string - * the string to send - */ - public void msg(CommandSender sender, String string) { - sender.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") - + ChatColor.WHITE + "] " + string); - } - - /** - * save the classrank map to the config - */ - public void save_config() { - db.i("saving config..."); - for (net.slipcor.classranks.core.Class cClass : ClassManager - .getClasses()) { - db.i(" - " + cClass.name); - for (Rank rRank : cClass.ranks) { - - rRank.debugPrint(); - - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".name", String.valueOf(rRank.getDispName())); - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".color", - String.valueOf("&" - + Integer.toHexString(rRank.getColor() - .ordinal()))); - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".price", String.valueOf(rRank.getCost())); - - if (rRank.getExp() > -1) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".exp", - String.valueOf(rRank.getExp())); - if (rRank.getItems() != null) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".items", - rRank.getItems()); - if (rRank.getCost() != -1337D) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".price", - String.valueOf(rRank.getCost())); - } - } - saveConfig(); - } - - private boolean setupEconomy() - { - RegisteredServiceProvider economyProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); - if (economyProvider != null) { - economy = economyProvider.getProvider(); - } - - return (economy != null); - } -} +package net.slipcor.classranks; + +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; + +import net.milkbowl.vault.economy.Economy; +import net.slipcor.classranks.commands.ClassAdminCommand; +import net.slipcor.classranks.commands.ClassCommand; +import net.slipcor.classranks.commands.RankdownCommand; +import net.slipcor.classranks.commands.RankupCommand; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.handlers.*; +import net.slipcor.classranks.listeners.*; +import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.CommandManager; +import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.managers.PlayerManager; +import net.slipcor.classranks.register.payment.Method; + +/** + * main plugin class + * + * @version v0.3.1 + * + * @author slipcor + */ + +public class ClassRanks extends JavaPlugin { + private final CommandManager cmdMgr = new CommandManager(this); + private final CRServerListener serverListener = new CRServerListener(this, + cmdMgr); + private final DebugManager db = new DebugManager(this); + public boolean trackRanks = false; + + public Method method = null; // eConomy access + public static Economy economy = null; + public CRHandler perms; // Permissions access + + private Map classes; + + @Override + public void onEnable() { + + PluginManager pm = getServer().getPluginManager(); + pm.registerEvents(serverListener, this); + + @SuppressWarnings("unused") + ClassManager cm = new ClassManager(this); + + // register commands + getCommand("class").setExecutor(new ClassCommand(this, cmdMgr)); + getCommand("classadmin").setExecutor(new ClassAdminCommand(this, cmdMgr)); + getCommand("rankup").setExecutor(new RankupCommand(this, cmdMgr)); + getCommand("rankdown").setExecutor(new RankdownCommand(this, cmdMgr)); + + // load the config file + load_config(); + + // load Vault + if (pm.getPlugin("Vault") != null) { + db.i("Vault found!"); + if (getConfig().getBoolean("vaultpermissions")) { + this.perms = new HandleVaultPerms(this); + log("ClassRank Vault permissions plugin found", Level.INFO); // success! + this.perms.setupPermissions(); } + if (getConfig().getBoolean("vaulteconomy")) { + setupEconomy(); + } + } + + // backup permissions + if (this.perms == null || (this.perms != null && !this.perms.setupPermissions())) { + + if (pm.getPlugin("bPermissions") != null) { + db.i("bPermissions found!"); + this.perms = new HandleBPerms(this); + } else if (pm.getPlugin("PermissionsEx") != null) { + db.i("PermissionsEX found!"); + this.perms = new HandlePEX(this); + } else { + db.i("No perms found, defaulting to SuperPermissions!"); + this.perms = new HandleSuperPerms(this); + } + this.perms.setupPermissions(); + } + + + Tracker tracker = new Tracker(this); + tracker.start(); + Update.updateCheck(this); + + log("Version " + this.getDescription().getVersion() + " init ready", Level.INFO); + } + + @Override + public void onDisable() { + Tracker.stop(); + log("disabled", Level.INFO); + } + + /** + * (re)load the config + */ + public void load_config() { + String debugVersion = "0320"; + + if (getConfig() == null + || !getConfig().getString("cversion").equals(debugVersion)) { + log("creating default config.yml", Level.INFO); + getConfig().set("cversion", debugVersion); + getConfig().options().copyDefaults(true); + saveConfig(); + } + DebugManager.active = getConfig().getBoolean("debug", false); + + if (getConfig().getBoolean("checkprices") + && getConfig().getConfigurationSection("prices") != null) { + db.i("prices are already set, reading..."); + // set prices + Map prices = (Map) getConfig() + .getConfigurationSection("prices").getValues(true); + cmdMgr.moneyCost = new double[prices.size()]; + int i = 0; + for (String Key : prices.keySet()) { + String sVal = (String) prices.get(Key); + try { + cmdMgr.moneyCost[i] = Double.parseDouble(sVal); + db.i("#" + i + " => " + + String.valueOf(Double.parseDouble(sVal))); + } catch (Exception e) { + cmdMgr.moneyCost[i] = 0; + log("Unrecognized cost key '" + String.valueOf(Key) + "': " + + sVal, Level.INFO); + } + i++; + } + } + + if (getConfig().getBoolean("checkexp") + && getConfig().getConfigurationSection("exp") != null) { + // set exp prices + + db.i("exp costs are set, reading..."); + Map expprices = (Map) getConfig() + .getConfigurationSection("exp").getValues(true); + cmdMgr.expCost = new int[expprices.size()]; + int i = 0; + for (String Key : expprices.keySet()) { + String sVal = (String) expprices.get(Key); + try { + cmdMgr.expCost[i] = Integer.parseInt(sVal); + db.i("#" + i + " => " + + String.valueOf(Integer.parseInt(sVal))); + } catch (Exception e) { + cmdMgr.expCost[i] = 0; + log("Unrecognized exp cost key '" + String.valueOf(Key) + + "': " + sVal, Level.INFO); + } + i++; + } + } + + // set subcolors + cmdMgr.getFormatManager().setColors("world", + getConfig().getString("playercolor"), + getConfig().getString("worldcolor")); + + // set other variables + cmdMgr.rankpublic = getConfig().getBoolean("rankpublic", false); + cmdMgr.defaultrankallworlds = getConfig().getBoolean( + "defaultrankallworlds", false); + cmdMgr.onlyoneclass = getConfig().getBoolean("onlyoneclass", true); + trackRanks = getConfig().getBoolean("trackRanks", false); + + boolean signs = getConfig().getBoolean("signcheck", false); + if (signs) { + db.i("sign check activated!"); + cmdMgr.signCheck[0] = getConfig().getString("signchoose", + "[choose]"); + cmdMgr.signCheck[1] = getConfig().getString("signrankup", + "[rankup]"); + cmdMgr.signCheck[2] = getConfig().getString("signrankdown", + "[rankdown]"); + } + + PlayerManager.coolDown = getConfig().getInt("cooldown", 0); + + ItemStack[][] itemStacks = null; + if (getConfig().getBoolean("checkitems") + && getConfig().getConfigurationSection("items") != null) { + db.i("items exist, parsing..."); + Map items = (Map) getConfig() + .getConfigurationSection("items").getValues(false); + if (items == null) { + db.i("items invalid, setting to null"); + itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; + } else { + // for each items => ItemStack[][1,2,3] + int iI = 0; + itemStacks = new ItemStack[items.size()][]; + for (String isKey : items.keySet()) { + List values = getConfig().getList("items." + isKey); + itemStacks[iI] = new ItemStack[values.size()]; + db.i("creating itemstack:"); + for (int iJ = 0; iJ < values.size(); iJ++) { + String[] vValue = (String.valueOf(values.get(iJ))) + .split(":"); + + int vAmount = vValue.length > 1 ? Integer + .parseInt(vValue[1]) : 1; + try { + itemStacks[iI][iJ] = new ItemStack( + Material.valueOf(vValue[0]), vAmount); + + } catch (Exception e) { + try { + itemStacks[iI][iJ] = new ItemStack( + Integer.valueOf(vValue[0]), vAmount); + } catch (Exception e2) { + + log("Unrecognized reagent: " + vValue[0], + Level.WARNING); + continue; + } + } + } + db.i(iI + " - " + + FormatManager.formatItemStacks(itemStacks[iI])); + iI++; + } + } + } + cmdMgr.rankItems = itemStacks; + + Map classRanks = getConfig().getConfigurationSection( + "classes").getValues(false); + for (String sClassName : classRanks.keySet()) { + Map ranks = ((ConfigurationSection) classRanks + .get(sClassName)).getValues(false); + boolean newClass = true; + for (String sRankName : ranks.keySet()) { + + String rankName = null; + String rankColor = "&f"; + double rankCost = -1337D; + ItemStack[] rankItems = null; + int rankExp = -1; + + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".name") != null) { + rankName = getConfig() + .getString( + "classes." + sClassName + "." + sRankName + + ".name"); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".color") != null) { + rankColor = getConfig().getString( + "classes." + sClassName + "." + sRankName + + ".color"); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".price") != null) { + rankCost = Double.valueOf(getConfig().getString( + "classes." + sClassName + "." + sRankName + + ".price")); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".items") != null) { + rankItems = FormatManager + .getItemStacksFromStringList(getConfig() + .getStringList( + "classes." + sClassName + "." + + sRankName + ".items")); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".exp") != null) { + rankExp = Integer.parseInt(getConfig().getString( + "classes." + sClassName + "." + sRankName + ".exp")); + } + + if (newClass) { + // create class + ClassManager.configClassAdd(sClassName, sRankName, + rankName, rankColor, rankItems, rankCost, rankExp, + null); + + newClass = false; + } else { + ClassManager.configRankAdd(sClassName, sRankName, rankName, + rankColor, rankItems, rankCost, rankExp, null); + } + } + } + setClasses(classRanks); + + saveConfig(); + } + + /** + * log a prefixed message to the logfile + * + * @param message + * the message to log + * @param level + * the logging level + */ + public void log(String message, Level level) { + Bukkit.getLogger().log(level, "[ClassRanks] " + message); + } + + /** + * send a message to a player + * + * @param pPlayer + * the player to message + * @param string + * the string to send + */ + public void msg(Player pPlayer, String string) { + pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + + ChatColor.WHITE + "] " + string); + db.i("to " + pPlayer.getName() + ": " + string); + } + + /** + * send a message to a commandsender + * + * @param sender + * the commandsender to message + * @param string + * the string to send + */ + public void msg(CommandSender sender, String string) { + sender.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + + ChatColor.WHITE + "] " + string); + } + + /** + * save the classrank map to the config + */ + public void save_config() { + db.i("saving config..."); + for (net.slipcor.classranks.core.Class cClass : ClassManager + .getClasses()) { + db.i(" - " + cClass.name); + for (Rank rRank : cClass.ranks) { + + rRank.debugPrint(); + + getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".name", String.valueOf(rRank.getDispName())); + getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".color", + String.valueOf("&" + + Integer.toHexString(rRank.getColor() + .ordinal()))); + getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".price", String.valueOf(rRank.getCost())); + + if (rRank.getExp() > -1) + getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".exp", + String.valueOf(rRank.getExp())); + if (rRank.getItems() != null) + getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".items", + rRank.getItems()); + if (rRank.getCost() != -1337D) + getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".price", + String.valueOf(rRank.getCost())); + } + } + saveConfig(); + } + + private boolean setupEconomy() + { + RegisteredServiceProvider economyProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + if (economyProvider != null) { + economy = economyProvider.getProvider(); + } + + return (economy != null); + } + + public Map getClasses() { + return classes; + } + + private void setClasses(Map classes) { + this.classes = classes; + } +} From 5fe74dd3abd78c4a13c7e0ccc46727772f79e751 Mon Sep 17 00:00:00 2001 From: Krglok Date: Mon, 4 Feb 2013 15:55:02 +0100 Subject: [PATCH 05/29] Ticket /class list Fehlerbehebung bei command execution --- .../classranks/managers/CommandManager.class | Bin 21570 -> 21318 bytes .../classranks/managers/CommandManager.java | 1967 ++++++++--------- 2 files changed, 981 insertions(+), 986 deletions(-) diff --git a/bin/net/slipcor/classranks/managers/CommandManager.class b/bin/net/slipcor/classranks/managers/CommandManager.class index db0620bf6c8133699f202ca0ecd22a9ef2eddccc..56305163f6980ba1f0b7d90baf6dfb6af321bf28 100644 GIT binary patch delta 5891 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 Th)&UILHSz7))+x&bk{!tUX>n{ delta 6287 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 0) { - plugin.msg(comP, - "You have to wait " + ChatColor.RED + String.valueOf(cDown) - + ChatColor.WHITE + " seconds!"); - return true; // cooldown timer still counting => OUT! - } - db.i("cooldown check positive"); - - if ((!plugin.perms.hasPerms(comP, "classranks.rankdown", comP - .getWorld().getName())) - && args[0].equalsIgnoreCase("rankdown")) { - // if we either are no OP or try to rank down, but we may not - plugin.msg(comP, "You don't have permission to rank down!"); - return true; - } - - db.i("perm check successful"); - - String World = defaultrankallworlds ? "all" : comP.getWorld().getName(); // store - // the - // player's - // world - String changePlayer = comP.getName(); // store the player we want to - // change - Boolean self = true; // we want to change ourselves ... maybe - - if (args.length > 1) { // we have more than one argument. that means: - changePlayer = PlayerManager.search(args[1]); // we want to change a - // different player - self = false; // we do not want to change ourselves - if (args.length > 2) { // we even have more than two arguments. that - // means: - World = args[2]; // we want to specify a world where we change - } - } - - // does player have a rank? - - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(World, changePlayer)); - - if (rank == null) { - // No Rank - if (self) { - plugin.msg(comP, "You don't have a class!"); - return true; - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " does not have a class !"); - return true; - } - } - - db.i("rank check successful"); - - String cPermName = rank.getPermName(); // Permissions rank name - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - Class cClass = rank.getSuperClass(); // Rank class - int cRank = cClass.ranks.indexOf(rank); // Rank index - int cMaxRank = cClass.ranks.size() - 1; // Classes max tree rank - db.i("rank " + cRank + " of " + cMaxRank); - // placeholder: cost - double rank_cost = 0; - // placeholder: items - ItemStack[] items = null; - - // placeholders for new rank - int rankOffset = 0; - - if (args[0].equalsIgnoreCase("rankup")) { - // we want to rank up! - if (cRank >= cMaxRank) { - // if the player is in the maximum rank - if (self) { - plugin.msg(comP, "You are already at highest rank!"); - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " already at highest rank!"); - } - return true; - } - if (self) { - // if we rank ourselves, that might cost money - // (otherwise, thats not the players problem ;) ) - try { - rank_cost = moneyCost[cRank + 1]; - } catch (Exception e) { - plugin.log("cost not set: "+(cRank + 1), Level.WARNING); - } - - Rank rNext = ClassManager.getNextRank(rank, 1); - if (rNext != null) { - if (rNext.getCost() != -1337D) { - rank_cost = rNext.getCost(); - } - } - - if (ClassRanks.economy != null) { - -// if (ClassRanks.economy.hasAccount(comP.getName())) { -// plugin.log("Account not found: " + comP.getName(), -// Level.SEVERE); -// return true; -// } - if (!ClassRanks.economy.has(comP.getName(), rank_cost)) { - // no money, no ranking! - plugin.msg(comP, - "You don't have enough money to rank up!"); - return true; - } - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(comP.getName()); - if (ma == null) { - plugin.log("Account not found: " + comP.getName(), - Level.SEVERE); - return true; - } - if (!ma.hasEnough(rank_cost)) { - // no money, no ranking! - plugin.msg(comP, - "You don't have enough money to rank up!"); - return true; - } - } - - items = rankItems != null ? rankItems[cRank + 1] : null; - - if (rNext.getItemstacks() != null) { - items = rNext.getItemstacks(); - } - } - rankOffset = 1; - } else if (args[0].equalsIgnoreCase("rankdown")) { - if (cRank < 1) { - // We are at lowest rank - if (self) { - plugin.msg(comP, "You are already at lowest rank!"); - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " already at lowest rank!"); - } - return true; - } - rankOffset = -1; - } - - if (rankOffset > 0) { - - if (expCost != null && expCost.length > 0) { - int exp_cost = -1; - - try { - exp_cost = expCost[cRank + 1]; - } catch (Exception e) { - plugin.log("Exp cost not set: "+cRank + 1, Level.WARNING); - } - Rank rNext = ClassManager.getNextRank(rank, 1); - if (rNext != null && rNext.getExp() != -1) { - exp_cost = rNext.getExp(); - } - - if (exp_cost > 0) { - if (comP.getTotalExperience() < exp_cost) { - plugin.msg(comP, - "You don't have enough experience ("+comP.getTotalExperience()+")! You need " - + exp_cost); - return true; - } - int newExp = comP.getTotalExperience() - exp_cost; - comP.setExp(0); - comP.setLevel(0); - comP.giveExp(newExp); - - plugin.msg(comP, "You paid " + exp_cost - + " experience points!"); - } - } - - if ((items != null) - && (!FormatManager.formatItemStacks(items).equals(""))) { - if (!pm.ifHasTakeItems(comP, items)) { - plugin.msg(comP, "You don't have the required items!"); - plugin.msg(comP, - "(" + FormatManager.formatItemStacks(items) + ")"); - return true; - } - } - } - - if (onlyoneclass || rankOffset < 0) { - // up and only OR down - db.i("removing old class..."); - plugin.perms.rankRemove(World, changePlayer, cPermName); - } - - rank = ClassManager.getNextRank(rank, rankOffset); - - cPermName = rank.getPermName(); - cDispName = rank.getDispName(); - c_Color = rank.getColor(); - - db.i("adding new rank..."); - plugin.perms.rankAdd(World, changePlayer, cPermName); - - if ((rank_cost > 0)) { - // take the money, inform the player - - if (ClassRanks.economy != null) { - ClassRanks.economy.withdrawPlayer(comP.getName(), rank_cost); - comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."); - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(comP.getName()); - ma.subtract(rank_cost); - comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + plugin.method.format(rank_cost) + ChatColor.RED - + " debited."); - } - } - - if (self && !rankpublic) { - // we rank ourselves and do NOT want that to be public - plugin.msg(comP, - "You are now a " + c_Color + cDispName + ChatColor.WHITE - + ChatColor.WHITE + " in " + fm.formatWorld(World) - + "!"); - } else { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] Player " + fm.formatPlayer(changePlayer) - + " now is a " + c_Color + cDispName - + ChatColor.WHITE + " in " + fm.formatWorld(World) - + "!"); - } - return true; - } - - /** - * printout Classas and/or Class Ranks - * - * @param pPlayer - * @param args - */ - private void cmdList (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); - plugin.msg(pPlayer, ChatColor.YELLOW+"Class / Rank List"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - for (Class c : classes) { - if (c.name.startsWith("%") && !pPlayer.isOp()) { - continue; - } - if (args[1].equalsIgnoreCase(c.name)) { - plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); - for (Rank r : c.ranks) { - plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); - } - } - } - - } - - /** - * printout player Class, Rank and world - * - * @param pPlayer - * @param args - */ - private void cmdGet (Player pPlayer, String[] args) { - String world = pPlayer.getWorld().getName(); - if (args.length > 2) { - world = args[2]; - } else { - world = "all"; - } - if (args.length == 1) { - args[1] = pPlayer.getName(); - } - - args[1] = PlayerManager.search(args[1]); - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); - - if (rank == null) { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " has no class in " + fm.formatWorld(world) + "!"); - } else { - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " is " + c_Color + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) + "!"); - } - - } - - private void cmdTemp (Player pPlayer, String[] args) { - - } - - - - /* - * The main switch for the command usage. Check for known commands, - * permissions, arguments, and commit whatever is wanted. - */ - public boolean parseCommand(Player pPlayer, String[] args) { - - db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); - if (args.length > 1) { - if (args[0].equalsIgnoreCase("list")) { - // Command list of Ranks in the Class 3.2 - cmdList(pPlayer,args); - return true; - - } else if (args[0].equalsIgnoreCase("get")) { - // Command Get 3.2 - cmdGet(pPlayer, args); - return true; - } - - // more than /class or /class rankup - if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to change other user's ranks!"); - return true; - } - - if ((!args[0].equalsIgnoreCase("add")) - && (!args[0].equalsIgnoreCase("remove"))) { - if ((args[0].equalsIgnoreCase("rankup")) - || (args[0].equalsIgnoreCase("rankdown"))) { - // rank up or down - if (args.length > 1) { - return rank(args, pPlayer); - } else { - plugin.msg( - pPlayer, - "Not enough arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - } - plugin.msg(pPlayer, "Argument " + args[0] + " unrecognized!"); - return false; - } - - // add / remove - boolean self = true; - String world = defaultrankallworlds ? "all" : pPlayer.getWorld() - .getName(); - if (args[0].equalsIgnoreCase("remove")) { - if (args.length > 2) { - // => /class remove *name* world - world = args[2]; - self = false; - } else if (args.length > 1) { - self = false; - } - } else if (args[0].equalsIgnoreCase("add")) { - if (args.length > 3) { - // => /class add *name* *classname* world - world = args[3]; - } else if (args.length == 3) { - // => /class add *name* *classname* - String[] tArgs = { args[0], args[1] , args[2] }; - - args = tArgs; // override : without world //krglok 01.2013 -// self = false; - } else if (args.length == 2) { - // => /class add *classname* - - String[] tArgs = { args[0], pPlayer.getName(), args[1] }; - - args = tArgs; // override : pretend to have said: //class - // add me class - } else if (args.length < 2) { - // not enough arguments ;) - plugin.msg( - pPlayer, - "Not enough arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - } - db.i("precheck successful"); - - if (!self) { - if (!plugin.perms.hasPerms(pPlayer, - "classranks.admin.addremove", pPlayer.getWorld() - .getName())) { - // only if we are NOT op or may NOT add/remove classes - plugin.msg(pPlayer, - "You don't have permission to add/remove other player's classes!"); - return true; - } - } - db.i("perm check successful"); - - // get the class of the player we're talking about - args[1] = PlayerManager.search(args[1]); - String sPermName = plugin.perms.getPermNameByPlayer(world, args[1]); - if (!sPermName.equals("")) { - if (plugin.trackRanks) { - ClassManager.saveClassProgress(Bukkit.getPlayer(args[1])); - } - int i = 0; // combo breaker - while (!sPermName.equals("")) { - db.i("removing rank " + sPermName); - - Rank tempRank = ClassManager.getRankByPermName(sPermName); - - String cDispName = tempRank.getDispName(); // Display rank - // name - ChatColor c_Color = tempRank.getColor(); // Rank color - - if (args[0].equalsIgnoreCase("add")) { - // only one class per player :p - plugin.msg(pPlayer, - "Player " + fm.formatPlayer(args[1]) - + " already already has the rank " - + c_Color + cDispName + "!"); - } else if (args[0].equalsIgnoreCase("remove")) { - if (plugin.trackRanks) { - ClassManager.saveClassProgress(Bukkit - .getPlayer(args[1])); - } - plugin.perms.rankRemove(world, args[1], - tempRank.getPermName()); // do it! - - if ((!pPlayer.getName().equalsIgnoreCase(args[1]))) { - plugin.msg(pPlayer, - "Player " + fm.formatPlayer(args[1]) - + " removed from rank " + c_Color - + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) - + "!"); - - Player chP = plugin.getServer().getPlayer(args[1]); - try { - if (chP.isOnline()) { - chP.sendMessage("[" + ChatColor.AQUA - + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] You were removed from rank " - + c_Color + cDispName - + ChatColor.WHITE + " in " - + fm.formatWorld(world) + "!"); - } - } catch (Exception e) { - // do nothing, the player is not online - } - } else { - // self remove successful! - if (i == 0) - plugin.msg( - pPlayer, - "You were removed from rank " + c_Color - + cDispName + ChatColor.WHITE - + " in " - + fm.formatWorld(world) + "!"); - } - } - if (++i > 10) { - plugin.log("Infinite loop! More than 10 ranks!?", - Level.SEVERE); - break; - } - sPermName = plugin.perms - .getPermNameByPlayer(world, args[1]); - } - return true; - } - // player has no class - if (!args[0].equalsIgnoreCase("add")) { - // no class and trying to remove - if (pPlayer.getName().equalsIgnoreCase(args[1])) { - plugin.msg(pPlayer, "You don't have a class!"); - return true; - } else { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " does not have a class!"); - return true; - } - } - // ADD - Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(args[2])); - - if (tempRank == null) { - plugin.msg(pPlayer, - "The class you have entered does not exist!"+args[2]); - return true; - } - - String cPermName = tempRank.getPermName(); // Display rank name - String cDispName = tempRank.getDispName(); // Display rank name - ChatColor c_Color = tempRank.getColor(); // Rank color - - if (plugin.trackRanks) { - int rID = ClassManager.loadClassProcess( - Bukkit.getPlayer(args[1]), tempRank.getSuperClass()); - - tempRank = tempRank.getSuperClass().ranks.get(rID); - - cPermName = tempRank.getPermName(); // Display rank name - cDispName = tempRank.getDispName(); // Display rank name - c_Color = tempRank.getColor(); // Rank color - - String sRank = tempRank.getPermName(); - plugin.perms.rankAdd(world, args[1], sRank); - } else { - plugin.perms.rankAdd(world, args[1], cPermName); -// plugin.perms.classAdd(world, args[1], cPermName); - } - - if ((rankpublic) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] " + fm.formatPlayer(args[1]) - + " now is a " + c_Color + cDispName); - return true; - } else { - plugin.msg(pPlayer, "You now are a " + c_Color + cDispName); - return true; - } - } else if (args.length > 0) { - // only ONE argument! - - if (args[0].equalsIgnoreCase("reload")) { - // Command reload - if (pPlayer.isOp()) { - plugin.load_config(); - plugin.msg(pPlayer, "Config reloaded!"); - } else { - plugin.msg(pPlayer, "You don't have permission to reload!"); - } - return true; - } - - if (args[0].equalsIgnoreCase("rankup")) { - // Command rankup - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to rank yourself up!"); - return true; - } - return rank(args, pPlayer); - } else if (args[0].equalsIgnoreCase("rankdown")) { - // Command rank down - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to rank yourself down!"); - return true; - } - return rank(args, pPlayer); - } else if (args[0].equalsIgnoreCase("remove")) { - // Command remove - if (!plugin.perms.hasPerms(pPlayer, - "classranks.self.addremove", pPlayer.getWorld() - .getName())) { - plugin.msg(pPlayer, - "You don't have permission to add/remove your rank!"); - return true; - } - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(pPlayer.getWorld().getName(), - pPlayer.getName())); - - if (rank == null) { - plugin.msg(pPlayer, "You don't have a class!"); - return true; - } - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - if (plugin.trackRanks) { - ClassManager.saveClassProgress(pPlayer); - } - plugin.perms.rankRemove(defaultrankallworlds ? "all" : pPlayer - .getWorld().getName(), pPlayer.getName(), rank - .getPermName()); - - plugin.msg( - pPlayer, - "You were removed from rank " - + c_Color - + cDispName - + ChatColor.WHITE - + " in " - + fm.formatWorld(defaultrankallworlds ? "all" - : pPlayer.getWorld().getName()) + "!"); - return true; - } else if (args[0].equalsIgnoreCase("add")) { - // Command add - plugin.msg(pPlayer, ChatColor.RED+"Not enough arguments!"); - plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); - return true; - - } else if (args[0].equalsIgnoreCase("list")) { - // Command list Classes - ArrayList classes = ClassManager.getClasses(); - plugin.msg(pPlayer, ChatColor.YELLOW+"Class List"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - for (Class c : classes) { - if (c.name.startsWith("%") && !pPlayer.isOp()) { - continue; - } - plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); -// for (Rank r : c.ranks) { -// plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); -// } - } - return true; - } - - // /class [classname] - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer - .getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to choose your class!"); - return true; - } - - String sRankInfo = plugin.perms.getPermNameByPlayer(pPlayer - .getWorld().getName(), pPlayer.getName()); - - if (!sRankInfo.equals("")) { - plugin.msg(pPlayer, "You already have the rank " + sRankInfo - + "!"); - return true; - } - - String s = ""; - - if (plugin.trackRanks) { - s = ClassManager.getFirstPermNameByClassName(args[0], - pPlayer.getName()); - } else { - s = ClassManager.getFirstPermNameByClassName(args[0]); - } - - if (s == null || s.equals("")) { - plugin.msg(pPlayer, - "The class you have entered does not exist!"); - return true; - } - Rank rank = ClassManager.getRankByPermName(s); - - if (rank == null) { - plugin.msg(pPlayer, "Internal Error #1!"); - return true; - } - db.i("rank check successful"); - - int rID = 0; - if (plugin.trackRanks) { - rID = ClassManager.loadClassProcess(pPlayer, - rank.getSuperClass()); - } - double rank_cost = 0D; - - try { - rank_cost = moneyCost[rID]; - } catch (Exception e) { - plugin.log("cost not set: "+rID, Level.WARNING); - } - - if (rank.getCost() != -1337D) { - rank_cost = rank.getCost(); - } - // Check if the player has got the money - if (ClassRanks.economy != null) { - if (plugin.getConfig().getBoolean("checkprices") - && ClassRanks.economy.has(pPlayer.getName(), rank_cost)) { - - plugin.msg(pPlayer, - "You don't have enough money to choose your class! (" - + ClassRanks.economy.format(rank_cost) - + ")"); - return true; - } - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); - if (plugin.getConfig().getBoolean("checkprices") - && !ma.hasEnough(rank_cost)) { - - plugin.msg(pPlayer, - "You don't have enough money to choose your class! (" - + plugin.method.format(rank_cost) - + ")"); - return true; - } - } - db.i("money check successful"); - if (expCost != null && expCost.length > 0) { - int exp_cost = -1; - - try { - exp_cost = expCost[rID]; - } catch (Exception e) { - plugin.log("Exp cost not set: "+rID, Level.WARNING); - } - - if (rank.getExp() != -1) { - exp_cost = rank.getExp(); - } - - if (exp_cost > 0) { - if (pPlayer.getTotalExperience() < exp_cost) { - plugin.msg(pPlayer, - "You don't have enough experience! You need " - + exp_cost); - return true; - } - pPlayer.setTotalExperience(pPlayer.getTotalExperience() - - exp_cost); - plugin.msg(pPlayer, "You paid " + exp_cost - + " experience points!"); - } - } - db.i("exp check successful"); - - ItemStack[] items = null; - - if (rankItems != null && (rankItems[rID] != null) - && (!FormatManager.formatItemStacks(rankItems[rID]).equals( - ""))) { - items = rankItems[rID]; - } - - if (rank.getItemstacks() != null) { - items = rank.getItemstacks(); - } - - if (items != null) { - - if (!pm.ifHasTakeItems(pPlayer, items)) { - plugin.msg(pPlayer, "You don't have the required items!"); - plugin.msg( - pPlayer, - "(" - + FormatManager - .formatItemStacks(items) - + ")"); - return true; - } - } - db.i("item check successful"); - - String cPermName = rank.getPermName(); // Display rank name - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - // success! - - if (plugin.getConfig().getBoolean("clearranks")) { - plugin.perms.removeGroups(pPlayer); - } - - plugin.perms.rankAdd(defaultrankallworlds ? "all" : pPlayer - .getWorld().getName(), pPlayer.getName(), cPermName); - if (rankpublic) { - plugin.getServer().broadcastMessage( - "Player " + fm.formatPlayer(pPlayer.getName()) - + " has chosen a class, now has the rank " - + c_Color + cDispName); - } else { - plugin.msg(pPlayer, - "You have chosen your class! You now have the rank " - + c_Color + cDispName); - } - - if (plugin.getConfig().getBoolean("checkprices") - && (rank_cost > 0)) { - // if it costs anything at all - - if (ClassRanks.economy != null) { - ClassRanks.economy.withdrawPlayer(pPlayer.getName(), rank_cost); - pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" - + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN - + "] " + ChatColor.RED + "Your account had " - + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."); - } else if ((plugin.method != null)) { - MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); - ma.subtract(rank_cost); - pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" - + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN - + "] " + ChatColor.RED + "Your account had " - + ChatColor.WHITE - + plugin.method.format(rank_cost) + ChatColor.RED - + " debited."); - } - } - return true; - } - plugin.msg(pPlayer, - "Not enough arguments (" + String.valueOf(args.length) + ")!"); - return false; - } - - public boolean parseAdminCommand(Player pPlayer, String[] args) { - db.i("parsing admin " + pPlayer.getName() + ", command: " - + FormatManager.formatStringArray(args)); - - if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.admin", pPlayer - .getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to administrate ranks!"); - return true; - } - - db.i("perm check successful"); - - if (args.length < 3) { - plugin.msg(pPlayer, - "Not enough arguments (" + String.valueOf(args.length) - + ")!"); - return false; - } - db.i("enough arguments"); - - if (args[0].equalsIgnoreCase("remove")) { - /* - * /classadmin remove class *classname* /classadmin remove rank - * *classname* *rankname* - */ - if (args[1].equalsIgnoreCase("class")) { - if (args.length != 3) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configClassRemove(args[2], pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - if (args.length != 4) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configRankRemove(args[2], args[3], pPlayer); - } - // second argument unknown - return false; - } else if (args[0].equalsIgnoreCase("add")) { - - /* - * /classadmin add class *classname* *rankname* *displayname* - * *color* /classadmin add rank *classname* *rankname* *displayname* - * *color* - */ - - if (args.length != 9) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - if (args[1].equalsIgnoreCase("class")) {// , ItemStack[] isItems, - // double dCost, int iExp - return ClassManager.configClassAdd(args[2], args[3], args[4], - args[5], - FormatManager.getItemStacksFromCommaString(args[6]), - Double.parseDouble(args[7]), Integer.parseInt(args[8]), - pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - return ClassManager.configRankAdd(args[2], args[3], args[4], - args[5], - FormatManager.getItemStacksFromCommaString(args[6]), - Double.parseDouble(args[7]), Integer.parseInt(args[8]), - pPlayer); - } - // second argument unknown - return false; - } else if (args[0].equalsIgnoreCase("change")) { - - /* - * /classadmin change rank *classname* *rankname* *displayname* - * *color* /classadmin change class *classname* *newclassname* - */ - - if (args[1].equalsIgnoreCase("class")) { - if (args.length != 4) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager - .configClassChange(args[2], args[3], pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - if (args.length != 6) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configRankChange(args[2], args[3], args[4], - args[5], pPlayer); - } - // second argument unknown - return false; - } - return false; - } - - public FormatManager getFormatManager() { - return fm; - } -} +package net.slipcor.classranks.managers; + +import java.util.ArrayList; +import java.util.logging.Level; + +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Class; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.PlayerManager; +import net.slipcor.classranks.register.payment.Method.MethodAccount; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +/** + * command manager class + * + * @version v0.4.3 + * + * @author slipcor + */ + +public class CommandManager { + private final ClassRanks plugin; + private final FormatManager fm; + private final PlayerManager pm; + private final DebugManager db; + + public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs + public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP + // Costs + public boolean rankpublic; // do we spam changed to the public? + public boolean defaultrankallworlds; // do ppl rank themselves in all + // worlds? + public boolean onlyoneclass; // only maintain oneass + public ItemStack[][] rankItems; + public String[] signCheck = { null, null, null }; // SignCheck variable + + public CommandManager(ClassRanks plugin) { + this.plugin = plugin; + this.pm = new PlayerManager(plugin); + this.fm = new FormatManager(); + this.db = new DebugManager(plugin); + } + + /* + * This function provides the main ranking process - including error + * messages when stuff is not right. - check if permissions are there - get + * old rank - calculate new rank - eventually delete from old rank - add to + * new rank + */ + public boolean rank(String[] args, Player comP) { + db.i("ranking " + comP.getName() + " : " + FormatManager.formatStringArray(args)); + int cDown = pm.coolDownCheck(comP); + if (cDown > 0) { + plugin.msg(comP, + "You have to wait " + ChatColor.RED + String.valueOf(cDown) + + ChatColor.WHITE + " seconds!"); + return true; // cooldown timer still counting => OUT! + } + db.i("cooldown check positive"); + + if ((!plugin.perms.hasPerms(comP, "classranks.rankdown", comP + .getWorld().getName())) + && args[0].equalsIgnoreCase("rankdown")) { + // if we either are no OP or try to rank down, but we may not + plugin.msg(comP, "You don't have permission to rank down!"); + return true; + } + + db.i("perm check successful"); + + String World = defaultrankallworlds ? "all" : comP.getWorld().getName(); // store + // the + // player's + // world + String changePlayer = comP.getName(); // store the player we want to + // change + Boolean self = true; // we want to change ourselves ... maybe + + if (args.length > 1) { // we have more than one argument. that means: + changePlayer = PlayerManager.search(args[1]); // we want to change a + // different player + self = false; // we do not want to change ourselves + if (args.length > 2) { // we even have more than two arguments. that + // means: + World = args[2]; // we want to specify a world where we change + } + } + + // does player have a rank? + + Rank rank = ClassManager.getRankByPermName(plugin.perms + .getPermNameByPlayer(World, changePlayer)); + + if (rank == null) { + // No Rank + if (self) { + plugin.msg(comP, "You don't have a class!"); + return true; + } else { + plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) + + " does not have a class !"); + return true; + } + } + + db.i("rank check successful"); + + String cPermName = rank.getPermName(); // Permissions rank name + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + Class cClass = rank.getSuperClass(); // Rank class + int cRank = cClass.ranks.indexOf(rank); // Rank index + int cMaxRank = cClass.ranks.size() - 1; // Classes max tree rank + db.i("rank " + cRank + " of " + cMaxRank); + // placeholder: cost + double rank_cost = 0; + // placeholder: items + ItemStack[] items = null; + + // placeholders for new rank + int rankOffset = 0; + + if (args[0].equalsIgnoreCase("rankup")) { + // we want to rank up! + if (cRank >= cMaxRank) { + // if the player is in the maximum rank + if (self) { + plugin.msg(comP, "You are already at highest rank!"); + } else { + plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) + + " already at highest rank!"); + } + return true; + } + if (self) { + // if we rank ourselves, that might cost money + // (otherwise, thats not the players problem ;) ) + try { + rank_cost = moneyCost[cRank + 1]; + } catch (Exception e) { + plugin.log("cost not set: "+(cRank + 1), Level.WARNING); + } + + Rank rNext = ClassManager.getNextRank(rank, 1); + if (rNext != null) { + if (rNext.getCost() != -1337D) { + rank_cost = rNext.getCost(); + } + } + + if (ClassRanks.economy != null) { + +// if (ClassRanks.economy.hasAccount(comP.getName())) { +// plugin.log("Account not found: " + comP.getName(), +// Level.SEVERE); +// return true; +// } + if (!ClassRanks.economy.has(comP.getName(), rank_cost)) { + // no money, no ranking! + plugin.msg(comP, + "You don't have enough money to rank up!"); + return true; + } + } else if (plugin.method != null) { + MethodAccount ma = plugin.method.getAccount(comP.getName()); + if (ma == null) { + plugin.log("Account not found: " + comP.getName(), + Level.SEVERE); + return true; + } + if (!ma.hasEnough(rank_cost)) { + // no money, no ranking! + plugin.msg(comP, + "You don't have enough money to rank up!"); + return true; + } + } + + items = rankItems != null ? rankItems[cRank + 1] : null; + + if (rNext.getItemstacks() != null) { + items = rNext.getItemstacks(); + } + } + rankOffset = 1; + } else if (args[0].equalsIgnoreCase("rankdown")) { + if (cRank < 1) { + // We are at lowest rank + if (self) { + plugin.msg(comP, "You are already at lowest rank!"); + } else { + plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) + + " already at lowest rank!"); + } + return true; + } + rankOffset = -1; + } + + if (rankOffset > 0) { + + if (expCost != null && expCost.length > 0) { + int exp_cost = -1; + + try { + exp_cost = expCost[cRank + 1]; + } catch (Exception e) { + plugin.log("Exp cost not set: "+cRank + 1, Level.WARNING); + } + Rank rNext = ClassManager.getNextRank(rank, 1); + if (rNext != null && rNext.getExp() != -1) { + exp_cost = rNext.getExp(); + } + + if (exp_cost > 0) { + if (comP.getTotalExperience() < exp_cost) { + plugin.msg(comP, + "You don't have enough experience ("+comP.getTotalExperience()+")! You need " + + exp_cost); + return true; + } + int newExp = comP.getTotalExperience() - exp_cost; + comP.setExp(0); + comP.setLevel(0); + comP.giveExp(newExp); + + plugin.msg(comP, "You paid " + exp_cost + + " experience points!"); + } + } + + if ((items != null) + && (!FormatManager.formatItemStacks(items).equals(""))) { + if (!pm.ifHasTakeItems(comP, items)) { + plugin.msg(comP, "You don't have the required items!"); + plugin.msg(comP, + "(" + FormatManager.formatItemStacks(items) + ")"); + return true; + } + } + } + + if (onlyoneclass || rankOffset < 0) { + // up and only OR down + db.i("removing old class..."); + plugin.perms.rankRemove(World, changePlayer, cPermName); + } + + rank = ClassManager.getNextRank(rank, rankOffset); + + cPermName = rank.getPermName(); + cDispName = rank.getDispName(); + c_Color = rank.getColor(); + + db.i("adding new rank..."); + plugin.perms.rankAdd(World, changePlayer, cPermName); + + if ((rank_cost > 0)) { + // take the money, inform the player + + if (ClassRanks.economy != null) { + ClassRanks.economy.withdrawPlayer(comP.getName(), rank_cost); + comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE + + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED + + "Your account had " + ChatColor.WHITE + + ClassRanks.economy.format(rank_cost) + ChatColor.RED + + " debited."); + } else if (plugin.method != null) { + MethodAccount ma = plugin.method.getAccount(comP.getName()); + ma.subtract(rank_cost); + comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE + + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED + + "Your account had " + ChatColor.WHITE + + plugin.method.format(rank_cost) + ChatColor.RED + + " debited."); + } + } + + if (self && !rankpublic) { + // we rank ourselves and do NOT want that to be public + plugin.msg(comP, + "You are now a " + c_Color + cDispName + ChatColor.WHITE + + ChatColor.WHITE + " in " + fm.formatWorld(World) + + "!"); + } else { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] Player " + fm.formatPlayer(changePlayer) + + " now is a " + c_Color + cDispName + + ChatColor.WHITE + " in " + fm.formatWorld(World) + + "!"); + } + return true; + } + + /** + * printout Class and/or Class Ranks + * + * @param pPlayer + * @param args + */ + private void cmdList (Player pPlayer, String[] args) { + ArrayList classes = ClassManager.getClasses(); + + pPlayer.sendMessage(ChatColor.YELLOW+"Class / Rank List"); + pPlayer.sendMessage(ChatColor.YELLOW+"--------------------"); + // check for Classlist or Classranklist + if (args.length > 1 ) { + // Do Class Rank List + for (Class c : classes) { + if (args[1].equalsIgnoreCase(c.name)) { + pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); + for (Rank r : c.ranks) { + pPlayer.sendMessage("=> " + ChatColor.GREEN + r.getDispName()); + } + } + } + + } else { + // Do Class List + for (Class c : classes) { + pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); + } + } + + } + + /** + * printout player Class, Rank and world + * + * @param pPlayer + * @param args + */ + private void cmdGet (Player pPlayer, String[] args) { + String world = pPlayer.getWorld().getName(); + if (args.length > 2) { + world = args[2]; + } else { + world = "all"; + } + if (args.length == 1) { + args[1] = pPlayer.getName(); + } + + args[1] = PlayerManager.search(args[1]); + + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); + + if (rank == null) { + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " has no class in " + fm.formatWorld(world) + "!"); + } else { + + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " is " + c_Color + cDispName + ChatColor.WHITE + + " in " + fm.formatWorld(world) + "!"); + } + + } + + private void cmdTemp (Player pPlayer, String[] args) { + + } + + + + /* + * The main switch for the command usage. Check for known commands, + * permissions, arguments, and commit whatever is wanted. + */ + public boolean parseCommand(Player pPlayer, String[] args) { + + db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); + if (args.length > 1) { + if (args[0].equalsIgnoreCase("list")) { + // Command list of Ranks in the Class 3.2 + cmdList(pPlayer,args); + return true; + + } else if (args[0].equalsIgnoreCase("get")) { + // Command Get 3.2 + cmdGet(pPlayer, args); + return true; + } + + // more than /class or /class rankup + if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", + pPlayer.getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to change other user's ranks!"); + return true; + } + + if ((!args[0].equalsIgnoreCase("add")) + && (!args[0].equalsIgnoreCase("remove"))) { + if ((args[0].equalsIgnoreCase("rankup")) + || (args[0].equalsIgnoreCase("rankdown"))) { + // rank up or down + if (args.length > 1) { + return rank(args, pPlayer); + } else { + plugin.msg( + pPlayer, + "Not enough arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + } + plugin.msg(pPlayer, "Argument " + args[0] + " unrecognized!"); + return false; + } + + // add / remove + boolean self = true; + String world = defaultrankallworlds ? "all" : pPlayer.getWorld() + .getName(); + if (args[0].equalsIgnoreCase("remove")) { + if (args.length > 2) { + // => /class remove *name* world + world = args[2]; + self = false; + } else if (args.length > 1) { + self = false; + } + } else if (args[0].equalsIgnoreCase("add")) { + if (args.length > 3) { + // => /class add *name* *classname* world + world = args[3]; + } else if (args.length == 3) { + // => /class add *name* *classname* + String[] tArgs = { args[0], args[1] , args[2] }; + + args = tArgs; // override : without world //krglok 01.2013 +// self = false; + } else if (args.length == 2) { + // => /class add *classname* + + String[] tArgs = { args[0], pPlayer.getName(), args[1] }; + + args = tArgs; // override : pretend to have said: //class + // add me class + } else if (args.length < 2) { + // not enough arguments ;) + plugin.msg( + pPlayer, + "Not enough arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + } + db.i("precheck successful"); + + if (!self) { + if (!plugin.perms.hasPerms(pPlayer, + "classranks.admin.addremove", pPlayer.getWorld() + .getName())) { + // only if we are NOT op or may NOT add/remove classes + plugin.msg(pPlayer, + "You don't have permission to add/remove other player's classes!"); + return true; + } + } + db.i("perm check successful"); + + // get the class of the player we're talking about + args[1] = PlayerManager.search(args[1]); + String sPermName = plugin.perms.getPermNameByPlayer(world, args[1]); + if (!sPermName.equals("")) { + if (plugin.trackRanks) { + ClassManager.saveClassProgress(Bukkit.getPlayer(args[1])); + } + int i = 0; // combo breaker + while (!sPermName.equals("")) { + db.i("removing rank " + sPermName); + + Rank tempRank = ClassManager.getRankByPermName(sPermName); + + String cDispName = tempRank.getDispName(); // Display rank + // name + ChatColor c_Color = tempRank.getColor(); // Rank color + + if (args[0].equalsIgnoreCase("add")) { + // only one class per player :p + plugin.msg(pPlayer, + "Player " + fm.formatPlayer(args[1]) + + " already already has the rank " + + c_Color + cDispName + "!"); + } else if (args[0].equalsIgnoreCase("remove")) { + if (plugin.trackRanks) { + ClassManager.saveClassProgress(Bukkit + .getPlayer(args[1])); + } + plugin.perms.rankRemove(world, args[1], + tempRank.getPermName()); // do it! + + if ((!pPlayer.getName().equalsIgnoreCase(args[1]))) { + plugin.msg(pPlayer, + "Player " + fm.formatPlayer(args[1]) + + " removed from rank " + c_Color + + cDispName + ChatColor.WHITE + + " in " + fm.formatWorld(world) + + "!"); + + Player chP = plugin.getServer().getPlayer(args[1]); + try { + if (chP.isOnline()) { + chP.sendMessage("[" + ChatColor.AQUA + + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] You were removed from rank " + + c_Color + cDispName + + ChatColor.WHITE + " in " + + fm.formatWorld(world) + "!"); + } + } catch (Exception e) { + // do nothing, the player is not online + } + } else { + // self remove successful! + if (i == 0) + plugin.msg( + pPlayer, + "You were removed from rank " + c_Color + + cDispName + ChatColor.WHITE + + " in " + + fm.formatWorld(world) + "!"); + } + } + if (++i > 10) { + plugin.log("Infinite loop! More than 10 ranks!?", + Level.SEVERE); + break; + } + sPermName = plugin.perms + .getPermNameByPlayer(world, args[1]); + } + return true; + } + // player has no class + if (!args[0].equalsIgnoreCase("add")) { + // no class and trying to remove + if (pPlayer.getName().equalsIgnoreCase(args[1])) { + plugin.msg(pPlayer, "You don't have a class!"); + return true; + } else { + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " does not have a class!"); + return true; + } + } + // ADD + Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(args[2])); + + if (tempRank == null) { + plugin.msg(pPlayer, + "The class you have entered does not exist!"+args[2]); + return true; + } + + String cPermName = tempRank.getPermName(); // Display rank name + String cDispName = tempRank.getDispName(); // Display rank name + ChatColor c_Color = tempRank.getColor(); // Rank color + + if (plugin.trackRanks) { + int rID = ClassManager.loadClassProcess( + Bukkit.getPlayer(args[1]), tempRank.getSuperClass()); + + tempRank = tempRank.getSuperClass().ranks.get(rID); + + cPermName = tempRank.getPermName(); // Display rank name + cDispName = tempRank.getDispName(); // Display rank name + c_Color = tempRank.getColor(); // Rank color + + String sRank = tempRank.getPermName(); + plugin.perms.rankAdd(world, args[1], sRank); + } else { + plugin.perms.rankAdd(world, args[1], cPermName); +// plugin.perms.classAdd(world, args[1], cPermName); + } + + if ((rankpublic) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] " + fm.formatPlayer(args[1]) + + " now is a " + c_Color + cDispName); + return true; + } else { + plugin.msg(pPlayer, "You now are a " + c_Color + cDispName); + return true; + } + } else if (args.length > 0) { + // only ONE argument! + + if (args[0].equalsIgnoreCase("reload")) { + // Command reload + if (pPlayer.isOp()) { + plugin.load_config(); + plugin.msg(pPlayer, "Config reloaded!"); + } else { + plugin.msg(pPlayer, "You don't have permission to reload!"); + } + return true; + } + + if (args[0].equalsIgnoreCase("rankup")) { + // Command rankup + if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", + pPlayer.getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to rank yourself up!"); + return true; + } + return rank(args, pPlayer); + } else if (args[0].equalsIgnoreCase("rankdown")) { + // Command rank down + if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", + pPlayer.getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to rank yourself down!"); + return true; + } + return rank(args, pPlayer); + } else if (args[0].equalsIgnoreCase("remove")) { + // Command remove + if (!plugin.perms.hasPerms(pPlayer, + "classranks.self.addremove", pPlayer.getWorld() + .getName())) { + plugin.msg(pPlayer, + "You don't have permission to add/remove your rank!"); + return true; + } + Rank rank = ClassManager.getRankByPermName(plugin.perms + .getPermNameByPlayer(pPlayer.getWorld().getName(), + pPlayer.getName())); + + if (rank == null) { + plugin.msg(pPlayer, "You don't have a class!"); + return true; + } + + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + if (plugin.trackRanks) { + ClassManager.saveClassProgress(pPlayer); + } + plugin.perms.rankRemove(defaultrankallworlds ? "all" : pPlayer + .getWorld().getName(), pPlayer.getName(), rank + .getPermName()); + + plugin.msg( + pPlayer, + "You were removed from rank " + + c_Color + + cDispName + + ChatColor.WHITE + + " in " + + fm.formatWorld(defaultrankallworlds ? "all" + : pPlayer.getWorld().getName()) + "!"); + return true; + } else if (args[0].equalsIgnoreCase("add")) { + // Command add + plugin.msg(pPlayer, ChatColor.RED+"Not enough arguments!"); + plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); + return true; + + } else if (args[0].equalsIgnoreCase("list")) { + // Command list Classes + cmdList(pPlayer, args); + return true; + } + + // /class [classname] + if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer + .getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to choose your class!"); + return true; + } + + String sRankInfo = plugin.perms.getPermNameByPlayer(pPlayer + .getWorld().getName(), pPlayer.getName()); + + if (!sRankInfo.equals("")) { + plugin.msg(pPlayer, "You already have the rank " + sRankInfo + + "!"); + return true; + } + + String s = ""; + + if (plugin.trackRanks) { + s = ClassManager.getFirstPermNameByClassName(args[0], + pPlayer.getName()); + } else { + s = ClassManager.getFirstPermNameByClassName(args[0]); + } + + if (s == null || s.equals("")) { + plugin.msg(pPlayer, + "The class you have entered does not exist!"); + return true; + } + Rank rank = ClassManager.getRankByPermName(s); + + if (rank == null) { + plugin.msg(pPlayer, "Internal Error #1!"); + return true; + } + db.i("rank check successful"); + + int rID = 0; + if (plugin.trackRanks) { + rID = ClassManager.loadClassProcess(pPlayer, + rank.getSuperClass()); + } + double rank_cost = 0D; + + try { + rank_cost = moneyCost[rID]; + } catch (Exception e) { + plugin.log("cost not set: "+rID, Level.WARNING); + } + + if (rank.getCost() != -1337D) { + rank_cost = rank.getCost(); + } + // Check if the player has got the money + if (ClassRanks.economy != null) { + if (plugin.getConfig().getBoolean("checkprices") + && ClassRanks.economy.has(pPlayer.getName(), rank_cost)) { + + plugin.msg(pPlayer, + "You don't have enough money to choose your class! (" + + ClassRanks.economy.format(rank_cost) + + ")"); + return true; + } + } else if (plugin.method != null) { + MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); + if (plugin.getConfig().getBoolean("checkprices") + && !ma.hasEnough(rank_cost)) { + + plugin.msg(pPlayer, + "You don't have enough money to choose your class! (" + + plugin.method.format(rank_cost) + + ")"); + return true; + } + } + db.i("money check successful"); + if (expCost != null && expCost.length > 0) { + int exp_cost = -1; + + try { + exp_cost = expCost[rID]; + } catch (Exception e) { + plugin.log("Exp cost not set: "+rID, Level.WARNING); + } + + if (rank.getExp() != -1) { + exp_cost = rank.getExp(); + } + + if (exp_cost > 0) { + if (pPlayer.getTotalExperience() < exp_cost) { + plugin.msg(pPlayer, + "You don't have enough experience! You need " + + exp_cost); + return true; + } + pPlayer.setTotalExperience(pPlayer.getTotalExperience() + - exp_cost); + plugin.msg(pPlayer, "You paid " + exp_cost + + " experience points!"); + } + } + db.i("exp check successful"); + + ItemStack[] items = null; + + if (rankItems != null && (rankItems[rID] != null) + && (!FormatManager.formatItemStacks(rankItems[rID]).equals( + ""))) { + items = rankItems[rID]; + } + + if (rank.getItemstacks() != null) { + items = rank.getItemstacks(); + } + + if (items != null) { + + if (!pm.ifHasTakeItems(pPlayer, items)) { + plugin.msg(pPlayer, "You don't have the required items!"); + plugin.msg( + pPlayer, + "(" + + FormatManager + .formatItemStacks(items) + + ")"); + return true; + } + } + db.i("item check successful"); + + String cPermName = rank.getPermName(); // Display rank name + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + + // success! + + if (plugin.getConfig().getBoolean("clearranks")) { + plugin.perms.removeGroups(pPlayer); + } + + plugin.perms.rankAdd(defaultrankallworlds ? "all" : pPlayer + .getWorld().getName(), pPlayer.getName(), cPermName); + if (rankpublic) { + plugin.getServer().broadcastMessage( + "Player " + fm.formatPlayer(pPlayer.getName()) + + " has chosen a class, now has the rank " + + c_Color + cDispName); + } else { + plugin.msg(pPlayer, + "You have chosen your class! You now have the rank " + + c_Color + cDispName); + } + + if (plugin.getConfig().getBoolean("checkprices") + && (rank_cost > 0)) { + // if it costs anything at all + + if (ClassRanks.economy != null) { + ClassRanks.economy.withdrawPlayer(pPlayer.getName(), rank_cost); + pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" + + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN + + "] " + ChatColor.RED + "Your account had " + + ChatColor.WHITE + + ClassRanks.economy.format(rank_cost) + ChatColor.RED + + " debited."); + } else if ((plugin.method != null)) { + MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); + ma.subtract(rank_cost); + pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" + + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN + + "] " + ChatColor.RED + "Your account had " + + ChatColor.WHITE + + plugin.method.format(rank_cost) + ChatColor.RED + + " debited."); + } + } + return true; + } + plugin.msg(pPlayer, + "Not enough arguments (" + String.valueOf(args.length) + ")!"); + return false; + } + + public boolean parseAdminCommand(Player pPlayer, String[] args) { + db.i("parsing admin " + pPlayer.getName() + ", command: " + + FormatManager.formatStringArray(args)); + + if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.admin", pPlayer + .getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to administrate ranks!"); + return true; + } + + db.i("perm check successful"); + + if (args.length < 3) { + plugin.msg(pPlayer, + "Not enough arguments (" + String.valueOf(args.length) + + ")!"); + return false; + } + db.i("enough arguments"); + + if (args[0].equalsIgnoreCase("remove")) { + /* + * /classadmin remove class *classname* /classadmin remove rank + * *classname* *rankname* + */ + if (args[1].equalsIgnoreCase("class")) { + if (args.length != 3) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configClassRemove(args[2], pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + if (args.length != 4) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configRankRemove(args[2], args[3], pPlayer); + } + // second argument unknown + return false; + } else if (args[0].equalsIgnoreCase("add")) { + + /* + * /classadmin add class *classname* *rankname* *displayname* + * *color* /classadmin add rank *classname* *rankname* *displayname* + * *color* + */ + + if (args.length != 9) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + if (args[1].equalsIgnoreCase("class")) {// , ItemStack[] isItems, + // double dCost, int iExp + return ClassManager.configClassAdd(args[2], args[3], args[4], + args[5], + FormatManager.getItemStacksFromCommaString(args[6]), + Double.parseDouble(args[7]), Integer.parseInt(args[8]), + pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + return ClassManager.configRankAdd(args[2], args[3], args[4], + args[5], + FormatManager.getItemStacksFromCommaString(args[6]), + Double.parseDouble(args[7]), Integer.parseInt(args[8]), + pPlayer); + } + // second argument unknown + return false; + } else if (args[0].equalsIgnoreCase("change")) { + + /* + * /classadmin change rank *classname* *rankname* *displayname* + * *color* /classadmin change class *classname* *newclassname* + */ + + if (args[1].equalsIgnoreCase("class")) { + if (args.length != 4) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager + .configClassChange(args[2], args[3], pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + if (args.length != 6) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configRankChange(args[2], args[3], args[4], + args[5], pPlayer); + } + // second argument unknown + return false; + } + return false; + } + + public FormatManager getFormatManager() { + return fm; + } +} From cd546e184c9500cd95791e6b0fbd60c1b7a006d2 Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 6 Feb 2013 09:31:50 +0100 Subject: [PATCH 06/29] Issues id=14, id=15,id=16 issues are a result of changes by krglok :( --- bin/config.yml | 202 +- bin/net/slipcor/classranks/ClassRanks.class | Bin 15767 -> 15717 bytes .../classranks/managers/CommandManager.class | Bin 21318 -> 21231 bytes bin/plugin.yml | 130 +- src/config.yml | 2 +- src/net/slipcor/classranks/ClassRanks.java | 833 +++---- .../classranks/managers/CommandManager.java | 1967 +++++++++-------- src/plugin.yml | 130 +- 8 files changed, 1637 insertions(+), 1627 deletions(-) diff --git a/bin/config.yml b/bin/config.yml index e1dd86d..2b8b262 100644 --- a/bin/config.yml +++ b/bin/config.yml @@ -1,101 +1,101 @@ -#------------------# -# General Settings # -#------------------# -rankpublic: true -trackRanks: false -defaultrankallworlds: false -onlyoneclass: true -clearranks: false -signcheck: false -signchoose: '[choose]' -signrankup: '[rankup]' -signrankdown: '[rankdown]' -cooldown: 0 -debug: false -checkprices: true -checkitems: true -checkexp: true -vaultpermissions: true -vaulteconomy: true -prefix: ClassRanks - -#----------------# -# Color Settings # -#----------------# -playercolor: '&e' -worldcolor: '&6' - -classes: - Fighter: - Warrior: - name: 'Warrior I' - color: '&7' - price: 10.00 - SWarrior: - name: 'Warrior II' - color: '&7' - price: 50.00 - MWarrior: - name: 'Warrior III' - color: '&8' - price: 100.00 - Business: - Trader: - name: 'Trader I' - color: '&a' - price: 10.00 - STrader: - name: 'Trader II' - color: '&a' - price: 50.00 - items: - - 'GOLD_INGOT:3' - - 'IRON_INGOT:3' - MTrader: - name: 'Trader III' - color: '&2' - price: 100.00 - - -#---------------------# -# Money Cost Settings # -#---------------------# -prices: - I: '10.00' - II: '50.00' - III: '100.00' - -#--------------------# -# Item Cost Settings # -#--------------------# -items: - I: - - 'REDSTONE:2' - - 'COAL:2' - II: - - 'GOLD_INGOT:2' - - 'IRON_INGOT:3' - III: - - 'DIAMOND:5' - - 'LAPIS_BLOCK:5' - -#-------------------# -# EXP Cost Settings # -#-------------------# -exp: - I: '10' - II: '50' - III: '100' - -#---------# -# Players # -#---------# - -players: - Notch: - Fighter: Warrior - -#------------------# -# Config debugging # -#------------------# -cversion: '0300' +#------------------# +# General Settings # +#------------------# +rankpublic: true +trackRanks: false +defaultrankallworlds: false +onlyoneclass: true +clearranks: false +signcheck: false +signchoose: '[choose]' +signrankup: '[rankup]' +signrankdown: '[rankdown]' +cooldown: 0 +debug: false +checkprices: true +checkitems: true +checkexp: true +vaultpermissions: true +vaulteconomy: true +prefix: ClassRanks + +#----------------# +# Color Settings # +#----------------# +playercolor: '&e' +worldcolor: '&6' + +classes: + Fighter: + Warrior: + name: 'Warrior I' + color: '&7' + price: 10.00 + SWarrior: + name: 'Warrior II' + color: '&7' + price: 50.00 + MWarrior: + name: 'Warrior III' + color: '&8' + price: 100.00 + Business: + Trader: + name: 'Trader I' + color: '&a' + price: 10.00 + STrader: + name: 'Trader II' + color: '&a' + price: 50.00 + items: + - 'GOLD_INGOT:3' + - 'IRON_INGOT:3' + MTrader: + name: 'Trader III' + color: '&2' + price: 100.00 + + +#---------------------# +# Money Cost Settings # +#---------------------# +prices: + I: '10.00' + II: '50.00' + III: '100.00' + +#--------------------# +# Item Cost Settings # +#--------------------# +items: + I: + - 'REDSTONE:2' + - 'COAL:2' + II: + - 'GOLD_INGOT:2' + - 'IRON_INGOT:3' + III: + - 'DIAMOND:5' + - 'LAPIS_BLOCK:5' + +#-------------------# +# EXP Cost Settings # +#-------------------# +exp: + I: '10' + II: '50' + III: '100' + +#---------# +# Players # +#---------# + +players: + Notch: + Fighter: Warrior + +#------------------# +# Config debugging # +#------------------# +cversion: '0310' diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index 9b3f188aaeaf74f4df2820eacecda694c4ea27f4..b9bb86a359e83c930eb12f7b07efc646f4137bd5 100644 GIT binary patch literal 15717 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 literal 15767 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%0D$ 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 HHT(Yn)MOd4 delta 5801 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 Rmd**vqZ6Ysm}*qZzW~^q2F?Hg diff --git a/bin/plugin.yml b/bin/plugin.yml index 287c2e4..8af45d8 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,65 +1,65 @@ -name: ClassRanks -main: net.slipcor.classranks.ClassRanks -version: 0.4.4.2 -author: slipcor -website: http://dev.bukkit.org/server-mods/classranks/ -soft-depends: [Vault] -commands: - class: - description: Lets users choose a class / change classes - usage: | - /class [classname] | Choose the class [classname] for yourself - /class [add] {username} {classname} {world} | Add user to a class - /class [remove] {username} {world} | Remove user from a class - /class [rankup/rankdown] [username] {world} | Rank user up/down - /class [rankup/rankdown] | Rank yourself up/down - /class get [username] {world} | Get the active rank of a user - /class list {classname} | list of class or class / rank - rankdown: - description: Rank down yourself or others - usage: | - /rankdown [username] | Rank down yourself or username - rankup: - description: Rank up yourself or others - usage: | - /rankup [username] | Rank up yourself or username - classadmin: - description: Administrate the classes - usage: | - /classadmin add class [classname] [permname] [displayname] [color] - /classadmin add rank [classname] [permname] [displayname] [color] - /classadmin change class [classname] [newname] - /classadmin change rank [classname] [rankname] [displayname] [color] - /classadmin remove class [classname] - /classadmin remove rank [classname] [rankname] -permissions: - classranks.*: - description: Gives access to all commands - children: - classranks.rankdown: true - classranks.self.rank: true - classranks.self.addremove: true - classranks.admin.*: - description: Gives access to all admin commands - children: - classranks.admin.rank: true - classranks.admin.addremove: true - classranks.admin.admin: true - classranks.rankdown: - description: Allows you to rank down - default: op - classranks.self.rank: - description: Allows you to rank yourself - default: true - classranks.self.addremove: - description: Allows you to add/remove your class - default: true - classranks.admin.rank: - description: Allows you to rank other people - default: op - classranks.admin.addremove: - description: Allows you to add/remove other peoples classes - default: op - classranks.admin.admin: - description: Allows you to administrate the classes (db) - default: op +name: ClassRanks +main: net.slipcor.classranks.ClassRanks +version: 0.4.4.4 +author: slipcor +website: http://dev.bukkit.org/server-mods/classranks/ +soft-depends: [Vault] +commands: + class: + description: Lets users choose a class / change classes + usage: | + /class [classname] | Choose the class [classname] for yourself + /class [add] {username} {classname} {world} | Add user to a class + /class [remove] {username} {world} | Remove user from a class + /class [rankup/rankdown] [username] {world} | Rank user up/down + /class [rankup/rankdown] | Rank yourself up/down + /class get [username] {world} | Get the active rank of a user + /class list {classname} | list of class or class / rank + rankdown: + description: Rank down yourself or others + usage: | + /rankdown [username] | Rank down yourself or username + rankup: + description: Rank up yourself or others + usage: | + /rankup [username] | Rank up yourself or username + classadmin: + description: Administrate the classes + usage: | + /classadmin add class [classname] [permname] [displayname] [color] + /classadmin add rank [classname] [permname] [displayname] [color] + /classadmin change class [classname] [newname] + /classadmin change rank [classname] [rankname] [displayname] [color] + /classadmin remove class [classname] + /classadmin remove rank [classname] [rankname] +permissions: + classranks.*: + description: Gives access to all commands + children: + classranks.rankdown: true + classranks.self.rank: true + classranks.self.addremove: true + classranks.admin.*: + description: Gives access to all admin commands + children: + classranks.admin.rank: true + classranks.admin.addremove: true + classranks.admin.admin: true + classranks.rankdown: + description: Allows you to rank down + default: op + classranks.self.rank: + description: Allows you to rank yourself + default: true + classranks.self.addremove: + description: Allows you to add/remove your class + default: true + classranks.admin.rank: + description: Allows you to rank other people + default: op + classranks.admin.addremove: + description: Allows you to add/remove other peoples classes + default: op + classranks.admin.admin: + description: Allows you to administrate the classes (db) + default: op diff --git a/src/config.yml b/src/config.yml index d0d748c..2b8b262 100644 --- a/src/config.yml +++ b/src/config.yml @@ -98,4 +98,4 @@ players: #------------------# # Config debugging # #------------------# -cversion: '0300' +cversion: '0310' diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 25f25f3..945c4d7 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -1,414 +1,419 @@ -package net.slipcor.classranks; - -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.java.JavaPlugin; - -import net.milkbowl.vault.economy.Economy; -import net.slipcor.classranks.commands.ClassAdminCommand; -import net.slipcor.classranks.commands.ClassCommand; -import net.slipcor.classranks.commands.RankdownCommand; -import net.slipcor.classranks.commands.RankupCommand; -import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.handlers.*; -import net.slipcor.classranks.listeners.*; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.CommandManager; -import net.slipcor.classranks.managers.DebugManager; -import net.slipcor.classranks.managers.FormatManager; -import net.slipcor.classranks.managers.PlayerManager; -import net.slipcor.classranks.register.payment.Method; - -/** - * main plugin class - * - * @version v0.3.1 - * - * @author slipcor - */ - -public class ClassRanks extends JavaPlugin { - private final CommandManager cmdMgr = new CommandManager(this); - private final CRServerListener serverListener = new CRServerListener(this, - cmdMgr); - private final DebugManager db = new DebugManager(this); - public boolean trackRanks = false; - - public Method method = null; // eConomy access - public static Economy economy = null; - public CRHandler perms; // Permissions access - - private Map classes; - - @Override - public void onEnable() { - - PluginManager pm = getServer().getPluginManager(); - pm.registerEvents(serverListener, this); - - @SuppressWarnings("unused") - ClassManager cm = new ClassManager(this); - - // register commands - getCommand("class").setExecutor(new ClassCommand(this, cmdMgr)); - getCommand("classadmin").setExecutor(new ClassAdminCommand(this, cmdMgr)); - getCommand("rankup").setExecutor(new RankupCommand(this, cmdMgr)); - getCommand("rankdown").setExecutor(new RankdownCommand(this, cmdMgr)); - - // load the config file - load_config(); - - // load Vault - if (pm.getPlugin("Vault") != null) { - db.i("Vault found!"); - if (getConfig().getBoolean("vaultpermissions")) { - this.perms = new HandleVaultPerms(this); - log("ClassRank Vault permissions plugin found", Level.INFO); // success! - this.perms.setupPermissions(); } - if (getConfig().getBoolean("vaulteconomy")) { - setupEconomy(); - } - } - - // backup permissions - if (this.perms == null || (this.perms != null && !this.perms.setupPermissions())) { - - if (pm.getPlugin("bPermissions") != null) { - db.i("bPermissions found!"); - this.perms = new HandleBPerms(this); - } else if (pm.getPlugin("PermissionsEx") != null) { - db.i("PermissionsEX found!"); - this.perms = new HandlePEX(this); - } else { - db.i("No perms found, defaulting to SuperPermissions!"); - this.perms = new HandleSuperPerms(this); - } - this.perms.setupPermissions(); - } - - - Tracker tracker = new Tracker(this); - tracker.start(); - Update.updateCheck(this); - - log("Version " + this.getDescription().getVersion() + " init ready", Level.INFO); - } - - @Override - public void onDisable() { - Tracker.stop(); - log("disabled", Level.INFO); - } - - /** - * (re)load the config - */ - public void load_config() { - String debugVersion = "0320"; - - if (getConfig() == null - || !getConfig().getString("cversion").equals(debugVersion)) { - log("creating default config.yml", Level.INFO); - getConfig().set("cversion", debugVersion); - getConfig().options().copyDefaults(true); - saveConfig(); - } - DebugManager.active = getConfig().getBoolean("debug", false); - - if (getConfig().getBoolean("checkprices") - && getConfig().getConfigurationSection("prices") != null) { - db.i("prices are already set, reading..."); - // set prices - Map prices = (Map) getConfig() - .getConfigurationSection("prices").getValues(true); - cmdMgr.moneyCost = new double[prices.size()]; - int i = 0; - for (String Key : prices.keySet()) { - String sVal = (String) prices.get(Key); - try { - cmdMgr.moneyCost[i] = Double.parseDouble(sVal); - db.i("#" + i + " => " - + String.valueOf(Double.parseDouble(sVal))); - } catch (Exception e) { - cmdMgr.moneyCost[i] = 0; - log("Unrecognized cost key '" + String.valueOf(Key) + "': " - + sVal, Level.INFO); - } - i++; - } - } - - if (getConfig().getBoolean("checkexp") - && getConfig().getConfigurationSection("exp") != null) { - // set exp prices - - db.i("exp costs are set, reading..."); - Map expprices = (Map) getConfig() - .getConfigurationSection("exp").getValues(true); - cmdMgr.expCost = new int[expprices.size()]; - int i = 0; - for (String Key : expprices.keySet()) { - String sVal = (String) expprices.get(Key); - try { - cmdMgr.expCost[i] = Integer.parseInt(sVal); - db.i("#" + i + " => " - + String.valueOf(Integer.parseInt(sVal))); - } catch (Exception e) { - cmdMgr.expCost[i] = 0; - log("Unrecognized exp cost key '" + String.valueOf(Key) - + "': " + sVal, Level.INFO); - } - i++; - } - } - - // set subcolors - cmdMgr.getFormatManager().setColors("world", - getConfig().getString("playercolor"), - getConfig().getString("worldcolor")); - - // set other variables - cmdMgr.rankpublic = getConfig().getBoolean("rankpublic", false); - cmdMgr.defaultrankallworlds = getConfig().getBoolean( - "defaultrankallworlds", false); - cmdMgr.onlyoneclass = getConfig().getBoolean("onlyoneclass", true); - trackRanks = getConfig().getBoolean("trackRanks", false); - - boolean signs = getConfig().getBoolean("signcheck", false); - if (signs) { - db.i("sign check activated!"); - cmdMgr.signCheck[0] = getConfig().getString("signchoose", - "[choose]"); - cmdMgr.signCheck[1] = getConfig().getString("signrankup", - "[rankup]"); - cmdMgr.signCheck[2] = getConfig().getString("signrankdown", - "[rankdown]"); - } - - PlayerManager.coolDown = getConfig().getInt("cooldown", 0); - - ItemStack[][] itemStacks = null; - if (getConfig().getBoolean("checkitems") - && getConfig().getConfigurationSection("items") != null) { - db.i("items exist, parsing..."); - Map items = (Map) getConfig() - .getConfigurationSection("items").getValues(false); - if (items == null) { - db.i("items invalid, setting to null"); - itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; - } else { - // for each items => ItemStack[][1,2,3] - int iI = 0; - itemStacks = new ItemStack[items.size()][]; - for (String isKey : items.keySet()) { - List values = getConfig().getList("items." + isKey); - itemStacks[iI] = new ItemStack[values.size()]; - db.i("creating itemstack:"); - for (int iJ = 0; iJ < values.size(); iJ++) { - String[] vValue = (String.valueOf(values.get(iJ))) - .split(":"); - - int vAmount = vValue.length > 1 ? Integer - .parseInt(vValue[1]) : 1; - try { - itemStacks[iI][iJ] = new ItemStack( - Material.valueOf(vValue[0]), vAmount); - - } catch (Exception e) { - try { - itemStacks[iI][iJ] = new ItemStack( - Integer.valueOf(vValue[0]), vAmount); - } catch (Exception e2) { - - log("Unrecognized reagent: " + vValue[0], - Level.WARNING); - continue; - } - } - } - db.i(iI + " - " - + FormatManager.formatItemStacks(itemStacks[iI])); - iI++; - } - } - } - cmdMgr.rankItems = itemStacks; - - Map classRanks = getConfig().getConfigurationSection( - "classes").getValues(false); - for (String sClassName : classRanks.keySet()) { - Map ranks = ((ConfigurationSection) classRanks - .get(sClassName)).getValues(false); - boolean newClass = true; - for (String sRankName : ranks.keySet()) { - - String rankName = null; - String rankColor = "&f"; - double rankCost = -1337D; - ItemStack[] rankItems = null; - int rankExp = -1; - - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".name") != null) { - rankName = getConfig() - .getString( - "classes." + sClassName + "." + sRankName - + ".name"); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".color") != null) { - rankColor = getConfig().getString( - "classes." + sClassName + "." + sRankName - + ".color"); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".price") != null) { - rankCost = Double.valueOf(getConfig().getString( - "classes." + sClassName + "." + sRankName - + ".price")); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".items") != null) { - rankItems = FormatManager - .getItemStacksFromStringList(getConfig() - .getStringList( - "classes." + sClassName + "." - + sRankName + ".items")); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".exp") != null) { - rankExp = Integer.parseInt(getConfig().getString( - "classes." + sClassName + "." + sRankName + ".exp")); - } - - if (newClass) { - // create class - ClassManager.configClassAdd(sClassName, sRankName, - rankName, rankColor, rankItems, rankCost, rankExp, - null); - - newClass = false; - } else { - ClassManager.configRankAdd(sClassName, sRankName, rankName, - rankColor, rankItems, rankCost, rankExp, null); - } - } - } - setClasses(classRanks); - - saveConfig(); - } - - /** - * log a prefixed message to the logfile - * - * @param message - * the message to log - * @param level - * the logging level - */ - public void log(String message, Level level) { - Bukkit.getLogger().log(level, "[ClassRanks] " + message); - } - - /** - * send a message to a player - * - * @param pPlayer - * the player to message - * @param string - * the string to send - */ - public void msg(Player pPlayer, String string) { - pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") - + ChatColor.WHITE + "] " + string); - db.i("to " + pPlayer.getName() + ": " + string); - } - - /** - * send a message to a commandsender - * - * @param sender - * the commandsender to message - * @param string - * the string to send - */ - public void msg(CommandSender sender, String string) { - sender.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") - + ChatColor.WHITE + "] " + string); - } - - /** - * save the classrank map to the config - */ - public void save_config() { - db.i("saving config..."); - for (net.slipcor.classranks.core.Class cClass : ClassManager - .getClasses()) { - db.i(" - " + cClass.name); - for (Rank rRank : cClass.ranks) { - - rRank.debugPrint(); - - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".name", String.valueOf(rRank.getDispName())); - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".color", - String.valueOf("&" - + Integer.toHexString(rRank.getColor() - .ordinal()))); - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".price", String.valueOf(rRank.getCost())); - - if (rRank.getExp() > -1) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".exp", - String.valueOf(rRank.getExp())); - if (rRank.getItems() != null) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".items", - rRank.getItems()); - if (rRank.getCost() != -1337D) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".price", - String.valueOf(rRank.getCost())); - } - } - saveConfig(); - } - - private boolean setupEconomy() - { - RegisteredServiceProvider economyProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); - if (economyProvider != null) { - economy = economyProvider.getProvider(); - } - - return (economy != null); - } - - public Map getClasses() { - return classes; - } - - private void setClasses(Map classes) { - this.classes = classes; - } -} +package net.slipcor.classranks; + +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; + +import net.milkbowl.vault.economy.Economy; +import net.slipcor.classranks.commands.ClassAdminCommand; +import net.slipcor.classranks.commands.ClassCommand; +import net.slipcor.classranks.commands.RankdownCommand; +import net.slipcor.classranks.commands.RankupCommand; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.handlers.*; +import net.slipcor.classranks.listeners.*; +import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.CommandManager; +import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.managers.PlayerManager; +import net.slipcor.classranks.register.payment.Method; + +/** + * main plugin class + * + * @version v0.3.1 + * + * @author slipcor + * + * issues + * id=15 + */ + +public class ClassRanks extends JavaPlugin { + private final CommandManager cmdMgr = new CommandManager(this); + private final CRServerListener serverListener = new CRServerListener(this, + cmdMgr); + private final DebugManager db = new DebugManager(this); + public boolean trackRanks = false; + + public Method method = null; // eConomy access + public static Economy economy = null; + public CRHandler perms; // Permissions access + + private Map classes; + + @Override + public void onEnable() { + + PluginManager pm = getServer().getPluginManager(); + pm.registerEvents(serverListener, this); + + @SuppressWarnings("unused") + ClassManager cm = new ClassManager(this); + + // register commands + getCommand("class").setExecutor(new ClassCommand(this, cmdMgr)); + getCommand("classadmin").setExecutor(new ClassAdminCommand(this, cmdMgr)); + getCommand("rankup").setExecutor(new RankupCommand(this, cmdMgr)); + getCommand("rankdown").setExecutor(new RankdownCommand(this, cmdMgr)); + + // load the config file + load_config(); + + // load Vault + if (pm.getPlugin("Vault") != null) { + db.i("Vault found!"); + if (getConfig().getBoolean("vaultpermissions")) { + this.perms = new HandleVaultPerms(this); + log("ClassRank Vault permissions plugin found", Level.INFO); // success! + this.perms.setupPermissions(); } + if (getConfig().getBoolean("vaulteconomy")) { + setupEconomy(); + } + } + + // backup permissions + if (this.perms == null || (this.perms != null && !this.perms.setupPermissions())) { + + if (pm.getPlugin("bPermissions") != null) { + db.i("bPermissions found!"); + this.perms = new HandleBPerms(this); + } else if (pm.getPlugin("PermissionsEx") != null) { + db.i("PermissionsEX found!"); + this.perms = new HandlePEX(this); + } else { + db.i("No perms found, defaulting to SuperPermissions!"); + this.perms = new HandleSuperPerms(this); + } + this.perms.setupPermissions(); + } + + + Tracker tracker = new Tracker(this); + tracker.start(); + Update.updateCheck(this); + + log("Version " + this.getDescription().getVersion() + " init ready", Level.INFO); + } + + @Override + public void onDisable() { + Tracker.stop(); + log("disabled", Level.INFO); + } + + /** + * (re)load the config + */ + public void load_config() { + // default value for config check !!! + String debugVersion = "0320"; // Krgok id=15 + // check for new config should be made + if (getConfig() == null ) { + //|| !getConfig().getString("cversion").equals(debugVersion) //krglok id=15 not necessary + + log("creating default config.yml", Level.INFO); + getConfig().set("cversion", debugVersion); + getConfig().options().copyDefaults(true); + saveConfig(); + } + DebugManager.active = getConfig().getBoolean("debug", false); + + if (getConfig().getBoolean("checkprices") + && getConfig().getConfigurationSection("prices") != null) { + db.i("prices are already set, reading..."); + // set prices + Map prices = (Map) getConfig() + .getConfigurationSection("prices").getValues(true); + cmdMgr.moneyCost = new double[prices.size()]; + int i = 0; + for (String Key : prices.keySet()) { + String sVal = (String) prices.get(Key); + try { + cmdMgr.moneyCost[i] = Double.parseDouble(sVal); + db.i("#" + i + " => " + + String.valueOf(Double.parseDouble(sVal))); + } catch (Exception e) { + cmdMgr.moneyCost[i] = 0; + log("Unrecognized cost key '" + String.valueOf(Key) + "': " + + sVal, Level.INFO); + } + i++; + } + } + + if (getConfig().getBoolean("checkexp") + && getConfig().getConfigurationSection("exp") != null) { + // set exp prices + + db.i("exp costs are set, reading..."); + Map expprices = (Map) getConfig() + .getConfigurationSection("exp").getValues(true); + cmdMgr.expCost = new int[expprices.size()]; + int i = 0; + for (String Key : expprices.keySet()) { + String sVal = (String) expprices.get(Key); + try { + cmdMgr.expCost[i] = Integer.parseInt(sVal); + db.i("#" + i + " => " + + String.valueOf(Integer.parseInt(sVal))); + } catch (Exception e) { + cmdMgr.expCost[i] = 0; + log("Unrecognized exp cost key '" + String.valueOf(Key) + + "': " + sVal, Level.INFO); + } + i++; + } + } + + // set subcolors + cmdMgr.getFormatManager().setColors("world", + getConfig().getString("playercolor"), + getConfig().getString("worldcolor")); + + // set other variables + cmdMgr.rankpublic = getConfig().getBoolean("rankpublic", false); + cmdMgr.defaultrankallworlds = getConfig().getBoolean( + "defaultrankallworlds", false); + cmdMgr.onlyoneclass = getConfig().getBoolean("onlyoneclass", true); + trackRanks = getConfig().getBoolean("trackRanks", false); + + boolean signs = getConfig().getBoolean("signcheck", false); + if (signs) { + db.i("sign check activated!"); + cmdMgr.signCheck[0] = getConfig().getString("signchoose", + "[choose]"); + cmdMgr.signCheck[1] = getConfig().getString("signrankup", + "[rankup]"); + cmdMgr.signCheck[2] = getConfig().getString("signrankdown", + "[rankdown]"); + } + + PlayerManager.coolDown = getConfig().getInt("cooldown", 0); + + ItemStack[][] itemStacks = null; + if (getConfig().getBoolean("checkitems") + && getConfig().getConfigurationSection("items") != null) { + db.i("items exist, parsing..."); + Map items = (Map) getConfig() + .getConfigurationSection("items").getValues(false); + if (items == null) { + db.i("items invalid, setting to null"); + itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; + } else { + // for each items => ItemStack[][1,2,3] + int iI = 0; + itemStacks = new ItemStack[items.size()][]; + for (String isKey : items.keySet()) { + List values = getConfig().getList("items." + isKey); + itemStacks[iI] = new ItemStack[values.size()]; + db.i("creating itemstack:"); + for (int iJ = 0; iJ < values.size(); iJ++) { + String[] vValue = (String.valueOf(values.get(iJ))) + .split(":"); + + int vAmount = vValue.length > 1 ? Integer + .parseInt(vValue[1]) : 1; + try { + itemStacks[iI][iJ] = new ItemStack( + Material.valueOf(vValue[0]), vAmount); + + } catch (Exception e) { + try { + itemStacks[iI][iJ] = new ItemStack( + Integer.valueOf(vValue[0]), vAmount); + } catch (Exception e2) { + + log("Unrecognized reagent: " + vValue[0], + Level.WARNING); + continue; + } + } + } + db.i(iI + " - " + + FormatManager.formatItemStacks(itemStacks[iI])); + iI++; + } + } + } + cmdMgr.rankItems = itemStacks; + + Map classRanks = getConfig().getConfigurationSection( + "classes").getValues(false); + for (String sClassName : classRanks.keySet()) { + Map ranks = ((ConfigurationSection) classRanks + .get(sClassName)).getValues(false); + boolean newClass = true; + for (String sRankName : ranks.keySet()) { + + String rankName = null; + String rankColor = "&f"; + double rankCost = -1337D; + ItemStack[] rankItems = null; + int rankExp = -1; + + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".name") != null) { + rankName = getConfig() + .getString( + "classes." + sClassName + "." + sRankName + + ".name"); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".color") != null) { + rankColor = getConfig().getString( + "classes." + sClassName + "." + sRankName + + ".color"); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".price") != null) { + rankCost = Double.valueOf(getConfig().getString( + "classes." + sClassName + "." + sRankName + + ".price")); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".items") != null) { + rankItems = FormatManager + .getItemStacksFromStringList(getConfig() + .getStringList( + "classes." + sClassName + "." + + sRankName + ".items")); + } + if (getConfig().get( + "classes." + sClassName + "." + sRankName + ".exp") != null) { + rankExp = Integer.parseInt(getConfig().getString( + "classes." + sClassName + "." + sRankName + ".exp")); + } + + if (newClass) { + // create class + ClassManager.configClassAdd(sClassName, sRankName, + rankName, rankColor, rankItems, rankCost, rankExp, + null); + + newClass = false; + } else { + ClassManager.configRankAdd(sClassName, sRankName, rankName, + rankColor, rankItems, rankCost, rankExp, null); + } + } + } + setClasses(classRanks); + getConfig().set("cversion", debugVersion); // set new config version + saveConfig(); + } + + /** + * log a prefixed message to the logfile + * + * @param message + * the message to log + * @param level + * the logging level + */ + public void log(String message, Level level) { + Bukkit.getLogger().log(level, "[ClassRanks] " + message); + } + + /** + * send a message to a player + * + * @param pPlayer + * the player to message + * @param string + * the string to send + */ + public void msg(Player pPlayer, String string) { + pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + + ChatColor.WHITE + "] " + string); + db.i("to " + pPlayer.getName() + ": " + string); + } + + /** + * send a message to a commandsender + * + * @param sender + * the commandsender to message + * @param string + * the string to send + */ + public void msg(CommandSender sender, String string) { + sender.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + + ChatColor.WHITE + "] " + string); + } + + /** + * save the classrank map to the config + */ + public void save_config() { + db.i("saving config..."); + for (net.slipcor.classranks.core.Class cClass : ClassManager + .getClasses()) { + db.i(" - " + cClass.name); + for (Rank rRank : cClass.ranks) { + + rRank.debugPrint(); + + getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".name", String.valueOf(rRank.getDispName())); + getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".color", + String.valueOf("&" + + Integer.toHexString(rRank.getColor() + .ordinal()))); + getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".price", String.valueOf(rRank.getCost())); + + if (rRank.getExp() > -1) + getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".exp", + String.valueOf(rRank.getExp())); + if (rRank.getItems() != null) + getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".items", + rRank.getItems()); + if (rRank.getCost() != -1337D) + getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".price", + String.valueOf(rRank.getCost())); + } + } + saveConfig(); + } + + private boolean setupEconomy() + { + RegisteredServiceProvider economyProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + if (economyProvider != null) { + economy = economyProvider.getProvider(); + } + + return (economy != null); + } + + public Map getClasses() { + return classes; + } + + private void setClasses(Map classes) { + this.classes = classes; + } +} diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java index 75482d3..e093ec7 100644 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ b/src/net/slipcor/classranks/managers/CommandManager.java @@ -1,981 +1,986 @@ -package net.slipcor.classranks.managers; - -import java.util.ArrayList; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.core.Class; -import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.PlayerManager; -import net.slipcor.classranks.register.payment.Method.MethodAccount; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -/** - * command manager class - * - * @version v0.4.3 - * - * @author slipcor - */ - -public class CommandManager { - private final ClassRanks plugin; - private final FormatManager fm; - private final PlayerManager pm; - private final DebugManager db; - - public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs - public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP - // Costs - public boolean rankpublic; // do we spam changed to the public? - public boolean defaultrankallworlds; // do ppl rank themselves in all - // worlds? - public boolean onlyoneclass; // only maintain oneass - public ItemStack[][] rankItems; - public String[] signCheck = { null, null, null }; // SignCheck variable - - public CommandManager(ClassRanks plugin) { - this.plugin = plugin; - this.pm = new PlayerManager(plugin); - this.fm = new FormatManager(); - this.db = new DebugManager(plugin); - } - - /* - * This function provides the main ranking process - including error - * messages when stuff is not right. - check if permissions are there - get - * old rank - calculate new rank - eventually delete from old rank - add to - * new rank - */ - public boolean rank(String[] args, Player comP) { - db.i("ranking " + comP.getName() + " : " + FormatManager.formatStringArray(args)); - int cDown = pm.coolDownCheck(comP); - if (cDown > 0) { - plugin.msg(comP, - "You have to wait " + ChatColor.RED + String.valueOf(cDown) - + ChatColor.WHITE + " seconds!"); - return true; // cooldown timer still counting => OUT! - } - db.i("cooldown check positive"); - - if ((!plugin.perms.hasPerms(comP, "classranks.rankdown", comP - .getWorld().getName())) - && args[0].equalsIgnoreCase("rankdown")) { - // if we either are no OP or try to rank down, but we may not - plugin.msg(comP, "You don't have permission to rank down!"); - return true; - } - - db.i("perm check successful"); - - String World = defaultrankallworlds ? "all" : comP.getWorld().getName(); // store - // the - // player's - // world - String changePlayer = comP.getName(); // store the player we want to - // change - Boolean self = true; // we want to change ourselves ... maybe - - if (args.length > 1) { // we have more than one argument. that means: - changePlayer = PlayerManager.search(args[1]); // we want to change a - // different player - self = false; // we do not want to change ourselves - if (args.length > 2) { // we even have more than two arguments. that - // means: - World = args[2]; // we want to specify a world where we change - } - } - - // does player have a rank? - - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(World, changePlayer)); - - if (rank == null) { - // No Rank - if (self) { - plugin.msg(comP, "You don't have a class!"); - return true; - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " does not have a class !"); - return true; - } - } - - db.i("rank check successful"); - - String cPermName = rank.getPermName(); // Permissions rank name - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - Class cClass = rank.getSuperClass(); // Rank class - int cRank = cClass.ranks.indexOf(rank); // Rank index - int cMaxRank = cClass.ranks.size() - 1; // Classes max tree rank - db.i("rank " + cRank + " of " + cMaxRank); - // placeholder: cost - double rank_cost = 0; - // placeholder: items - ItemStack[] items = null; - - // placeholders for new rank - int rankOffset = 0; - - if (args[0].equalsIgnoreCase("rankup")) { - // we want to rank up! - if (cRank >= cMaxRank) { - // if the player is in the maximum rank - if (self) { - plugin.msg(comP, "You are already at highest rank!"); - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " already at highest rank!"); - } - return true; - } - if (self) { - // if we rank ourselves, that might cost money - // (otherwise, thats not the players problem ;) ) - try { - rank_cost = moneyCost[cRank + 1]; - } catch (Exception e) { - plugin.log("cost not set: "+(cRank + 1), Level.WARNING); - } - - Rank rNext = ClassManager.getNextRank(rank, 1); - if (rNext != null) { - if (rNext.getCost() != -1337D) { - rank_cost = rNext.getCost(); - } - } - - if (ClassRanks.economy != null) { - -// if (ClassRanks.economy.hasAccount(comP.getName())) { -// plugin.log("Account not found: " + comP.getName(), -// Level.SEVERE); -// return true; -// } - if (!ClassRanks.economy.has(comP.getName(), rank_cost)) { - // no money, no ranking! - plugin.msg(comP, - "You don't have enough money to rank up!"); - return true; - } - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(comP.getName()); - if (ma == null) { - plugin.log("Account not found: " + comP.getName(), - Level.SEVERE); - return true; - } - if (!ma.hasEnough(rank_cost)) { - // no money, no ranking! - plugin.msg(comP, - "You don't have enough money to rank up!"); - return true; - } - } - - items = rankItems != null ? rankItems[cRank + 1] : null; - - if (rNext.getItemstacks() != null) { - items = rNext.getItemstacks(); - } - } - rankOffset = 1; - } else if (args[0].equalsIgnoreCase("rankdown")) { - if (cRank < 1) { - // We are at lowest rank - if (self) { - plugin.msg(comP, "You are already at lowest rank!"); - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " already at lowest rank!"); - } - return true; - } - rankOffset = -1; - } - - if (rankOffset > 0) { - - if (expCost != null && expCost.length > 0) { - int exp_cost = -1; - - try { - exp_cost = expCost[cRank + 1]; - } catch (Exception e) { - plugin.log("Exp cost not set: "+cRank + 1, Level.WARNING); - } - Rank rNext = ClassManager.getNextRank(rank, 1); - if (rNext != null && rNext.getExp() != -1) { - exp_cost = rNext.getExp(); - } - - if (exp_cost > 0) { - if (comP.getTotalExperience() < exp_cost) { - plugin.msg(comP, - "You don't have enough experience ("+comP.getTotalExperience()+")! You need " - + exp_cost); - return true; - } - int newExp = comP.getTotalExperience() - exp_cost; - comP.setExp(0); - comP.setLevel(0); - comP.giveExp(newExp); - - plugin.msg(comP, "You paid " + exp_cost - + " experience points!"); - } - } - - if ((items != null) - && (!FormatManager.formatItemStacks(items).equals(""))) { - if (!pm.ifHasTakeItems(comP, items)) { - plugin.msg(comP, "You don't have the required items!"); - plugin.msg(comP, - "(" + FormatManager.formatItemStacks(items) + ")"); - return true; - } - } - } - - if (onlyoneclass || rankOffset < 0) { - // up and only OR down - db.i("removing old class..."); - plugin.perms.rankRemove(World, changePlayer, cPermName); - } - - rank = ClassManager.getNextRank(rank, rankOffset); - - cPermName = rank.getPermName(); - cDispName = rank.getDispName(); - c_Color = rank.getColor(); - - db.i("adding new rank..."); - plugin.perms.rankAdd(World, changePlayer, cPermName); - - if ((rank_cost > 0)) { - // take the money, inform the player - - if (ClassRanks.economy != null) { - ClassRanks.economy.withdrawPlayer(comP.getName(), rank_cost); - comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."); - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(comP.getName()); - ma.subtract(rank_cost); - comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + plugin.method.format(rank_cost) + ChatColor.RED - + " debited."); - } - } - - if (self && !rankpublic) { - // we rank ourselves and do NOT want that to be public - plugin.msg(comP, - "You are now a " + c_Color + cDispName + ChatColor.WHITE - + ChatColor.WHITE + " in " + fm.formatWorld(World) - + "!"); - } else { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] Player " + fm.formatPlayer(changePlayer) - + " now is a " + c_Color + cDispName - + ChatColor.WHITE + " in " + fm.formatWorld(World) - + "!"); - } - return true; - } - - /** - * printout Class and/or Class Ranks - * - * @param pPlayer - * @param args - */ - private void cmdList (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); - - pPlayer.sendMessage(ChatColor.YELLOW+"Class / Rank List"); - pPlayer.sendMessage(ChatColor.YELLOW+"--------------------"); - // check for Classlist or Classranklist - if (args.length > 1 ) { - // Do Class Rank List - for (Class c : classes) { - if (args[1].equalsIgnoreCase(c.name)) { - pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); - for (Rank r : c.ranks) { - pPlayer.sendMessage("=> " + ChatColor.GREEN + r.getDispName()); - } - } - } - - } else { - // Do Class List - for (Class c : classes) { - pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); - } - } - - } - - /** - * printout player Class, Rank and world - * - * @param pPlayer - * @param args - */ - private void cmdGet (Player pPlayer, String[] args) { - String world = pPlayer.getWorld().getName(); - if (args.length > 2) { - world = args[2]; - } else { - world = "all"; - } - if (args.length == 1) { - args[1] = pPlayer.getName(); - } - - args[1] = PlayerManager.search(args[1]); - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); - - if (rank == null) { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " has no class in " + fm.formatWorld(world) + "!"); - } else { - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " is " + c_Color + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) + "!"); - } - - } - - private void cmdTemp (Player pPlayer, String[] args) { - - } - - - - /* - * The main switch for the command usage. Check for known commands, - * permissions, arguments, and commit whatever is wanted. - */ - public boolean parseCommand(Player pPlayer, String[] args) { - - db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); - if (args.length > 1) { - if (args[0].equalsIgnoreCase("list")) { - // Command list of Ranks in the Class 3.2 - cmdList(pPlayer,args); - return true; - - } else if (args[0].equalsIgnoreCase("get")) { - // Command Get 3.2 - cmdGet(pPlayer, args); - return true; - } - - // more than /class or /class rankup - if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to change other user's ranks!"); - return true; - } - - if ((!args[0].equalsIgnoreCase("add")) - && (!args[0].equalsIgnoreCase("remove"))) { - if ((args[0].equalsIgnoreCase("rankup")) - || (args[0].equalsIgnoreCase("rankdown"))) { - // rank up or down - if (args.length > 1) { - return rank(args, pPlayer); - } else { - plugin.msg( - pPlayer, - "Not enough arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - } - plugin.msg(pPlayer, "Argument " + args[0] + " unrecognized!"); - return false; - } - - // add / remove - boolean self = true; - String world = defaultrankallworlds ? "all" : pPlayer.getWorld() - .getName(); - if (args[0].equalsIgnoreCase("remove")) { - if (args.length > 2) { - // => /class remove *name* world - world = args[2]; - self = false; - } else if (args.length > 1) { - self = false; - } - } else if (args[0].equalsIgnoreCase("add")) { - if (args.length > 3) { - // => /class add *name* *classname* world - world = args[3]; - } else if (args.length == 3) { - // => /class add *name* *classname* - String[] tArgs = { args[0], args[1] , args[2] }; - - args = tArgs; // override : without world //krglok 01.2013 -// self = false; - } else if (args.length == 2) { - // => /class add *classname* - - String[] tArgs = { args[0], pPlayer.getName(), args[1] }; - - args = tArgs; // override : pretend to have said: //class - // add me class - } else if (args.length < 2) { - // not enough arguments ;) - plugin.msg( - pPlayer, - "Not enough arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - } - db.i("precheck successful"); - - if (!self) { - if (!plugin.perms.hasPerms(pPlayer, - "classranks.admin.addremove", pPlayer.getWorld() - .getName())) { - // only if we are NOT op or may NOT add/remove classes - plugin.msg(pPlayer, - "You don't have permission to add/remove other player's classes!"); - return true; - } - } - db.i("perm check successful"); - - // get the class of the player we're talking about - args[1] = PlayerManager.search(args[1]); - String sPermName = plugin.perms.getPermNameByPlayer(world, args[1]); - if (!sPermName.equals("")) { - if (plugin.trackRanks) { - ClassManager.saveClassProgress(Bukkit.getPlayer(args[1])); - } - int i = 0; // combo breaker - while (!sPermName.equals("")) { - db.i("removing rank " + sPermName); - - Rank tempRank = ClassManager.getRankByPermName(sPermName); - - String cDispName = tempRank.getDispName(); // Display rank - // name - ChatColor c_Color = tempRank.getColor(); // Rank color - - if (args[0].equalsIgnoreCase("add")) { - // only one class per player :p - plugin.msg(pPlayer, - "Player " + fm.formatPlayer(args[1]) - + " already already has the rank " - + c_Color + cDispName + "!"); - } else if (args[0].equalsIgnoreCase("remove")) { - if (plugin.trackRanks) { - ClassManager.saveClassProgress(Bukkit - .getPlayer(args[1])); - } - plugin.perms.rankRemove(world, args[1], - tempRank.getPermName()); // do it! - - if ((!pPlayer.getName().equalsIgnoreCase(args[1]))) { - plugin.msg(pPlayer, - "Player " + fm.formatPlayer(args[1]) - + " removed from rank " + c_Color - + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) - + "!"); - - Player chP = plugin.getServer().getPlayer(args[1]); - try { - if (chP.isOnline()) { - chP.sendMessage("[" + ChatColor.AQUA - + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] You were removed from rank " - + c_Color + cDispName - + ChatColor.WHITE + " in " - + fm.formatWorld(world) + "!"); - } - } catch (Exception e) { - // do nothing, the player is not online - } - } else { - // self remove successful! - if (i == 0) - plugin.msg( - pPlayer, - "You were removed from rank " + c_Color - + cDispName + ChatColor.WHITE - + " in " - + fm.formatWorld(world) + "!"); - } - } - if (++i > 10) { - plugin.log("Infinite loop! More than 10 ranks!?", - Level.SEVERE); - break; - } - sPermName = plugin.perms - .getPermNameByPlayer(world, args[1]); - } - return true; - } - // player has no class - if (!args[0].equalsIgnoreCase("add")) { - // no class and trying to remove - if (pPlayer.getName().equalsIgnoreCase(args[1])) { - plugin.msg(pPlayer, "You don't have a class!"); - return true; - } else { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " does not have a class!"); - return true; - } - } - // ADD - Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(args[2])); - - if (tempRank == null) { - plugin.msg(pPlayer, - "The class you have entered does not exist!"+args[2]); - return true; - } - - String cPermName = tempRank.getPermName(); // Display rank name - String cDispName = tempRank.getDispName(); // Display rank name - ChatColor c_Color = tempRank.getColor(); // Rank color - - if (plugin.trackRanks) { - int rID = ClassManager.loadClassProcess( - Bukkit.getPlayer(args[1]), tempRank.getSuperClass()); - - tempRank = tempRank.getSuperClass().ranks.get(rID); - - cPermName = tempRank.getPermName(); // Display rank name - cDispName = tempRank.getDispName(); // Display rank name - c_Color = tempRank.getColor(); // Rank color - - String sRank = tempRank.getPermName(); - plugin.perms.rankAdd(world, args[1], sRank); - } else { - plugin.perms.rankAdd(world, args[1], cPermName); -// plugin.perms.classAdd(world, args[1], cPermName); - } - - if ((rankpublic) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] " + fm.formatPlayer(args[1]) - + " now is a " + c_Color + cDispName); - return true; - } else { - plugin.msg(pPlayer, "You now are a " + c_Color + cDispName); - return true; - } - } else if (args.length > 0) { - // only ONE argument! - - if (args[0].equalsIgnoreCase("reload")) { - // Command reload - if (pPlayer.isOp()) { - plugin.load_config(); - plugin.msg(pPlayer, "Config reloaded!"); - } else { - plugin.msg(pPlayer, "You don't have permission to reload!"); - } - return true; - } - - if (args[0].equalsIgnoreCase("rankup")) { - // Command rankup - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to rank yourself up!"); - return true; - } - return rank(args, pPlayer); - } else if (args[0].equalsIgnoreCase("rankdown")) { - // Command rank down - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to rank yourself down!"); - return true; - } - return rank(args, pPlayer); - } else if (args[0].equalsIgnoreCase("remove")) { - // Command remove - if (!plugin.perms.hasPerms(pPlayer, - "classranks.self.addremove", pPlayer.getWorld() - .getName())) { - plugin.msg(pPlayer, - "You don't have permission to add/remove your rank!"); - return true; - } - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(pPlayer.getWorld().getName(), - pPlayer.getName())); - - if (rank == null) { - plugin.msg(pPlayer, "You don't have a class!"); - return true; - } - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - if (plugin.trackRanks) { - ClassManager.saveClassProgress(pPlayer); - } - plugin.perms.rankRemove(defaultrankallworlds ? "all" : pPlayer - .getWorld().getName(), pPlayer.getName(), rank - .getPermName()); - - plugin.msg( - pPlayer, - "You were removed from rank " - + c_Color - + cDispName - + ChatColor.WHITE - + " in " - + fm.formatWorld(defaultrankallworlds ? "all" - : pPlayer.getWorld().getName()) + "!"); - return true; - } else if (args[0].equalsIgnoreCase("add")) { - // Command add - plugin.msg(pPlayer, ChatColor.RED+"Not enough arguments!"); - plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); - return true; - - } else if (args[0].equalsIgnoreCase("list")) { - // Command list Classes - cmdList(pPlayer, args); - return true; - } - - // /class [classname] - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer - .getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to choose your class!"); - return true; - } - - String sRankInfo = plugin.perms.getPermNameByPlayer(pPlayer - .getWorld().getName(), pPlayer.getName()); - - if (!sRankInfo.equals("")) { - plugin.msg(pPlayer, "You already have the rank " + sRankInfo - + "!"); - return true; - } - - String s = ""; - - if (plugin.trackRanks) { - s = ClassManager.getFirstPermNameByClassName(args[0], - pPlayer.getName()); - } else { - s = ClassManager.getFirstPermNameByClassName(args[0]); - } - - if (s == null || s.equals("")) { - plugin.msg(pPlayer, - "The class you have entered does not exist!"); - return true; - } - Rank rank = ClassManager.getRankByPermName(s); - - if (rank == null) { - plugin.msg(pPlayer, "Internal Error #1!"); - return true; - } - db.i("rank check successful"); - - int rID = 0; - if (plugin.trackRanks) { - rID = ClassManager.loadClassProcess(pPlayer, - rank.getSuperClass()); - } - double rank_cost = 0D; - - try { - rank_cost = moneyCost[rID]; - } catch (Exception e) { - plugin.log("cost not set: "+rID, Level.WARNING); - } - - if (rank.getCost() != -1337D) { - rank_cost = rank.getCost(); - } - // Check if the player has got the money - if (ClassRanks.economy != null) { - if (plugin.getConfig().getBoolean("checkprices") - && ClassRanks.economy.has(pPlayer.getName(), rank_cost)) { - - plugin.msg(pPlayer, - "You don't have enough money to choose your class! (" - + ClassRanks.economy.format(rank_cost) - + ")"); - return true; - } - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); - if (plugin.getConfig().getBoolean("checkprices") - && !ma.hasEnough(rank_cost)) { - - plugin.msg(pPlayer, - "You don't have enough money to choose your class! (" - + plugin.method.format(rank_cost) - + ")"); - return true; - } - } - db.i("money check successful"); - if (expCost != null && expCost.length > 0) { - int exp_cost = -1; - - try { - exp_cost = expCost[rID]; - } catch (Exception e) { - plugin.log("Exp cost not set: "+rID, Level.WARNING); - } - - if (rank.getExp() != -1) { - exp_cost = rank.getExp(); - } - - if (exp_cost > 0) { - if (pPlayer.getTotalExperience() < exp_cost) { - plugin.msg(pPlayer, - "You don't have enough experience! You need " - + exp_cost); - return true; - } - pPlayer.setTotalExperience(pPlayer.getTotalExperience() - - exp_cost); - plugin.msg(pPlayer, "You paid " + exp_cost - + " experience points!"); - } - } - db.i("exp check successful"); - - ItemStack[] items = null; - - if (rankItems != null && (rankItems[rID] != null) - && (!FormatManager.formatItemStacks(rankItems[rID]).equals( - ""))) { - items = rankItems[rID]; - } - - if (rank.getItemstacks() != null) { - items = rank.getItemstacks(); - } - - if (items != null) { - - if (!pm.ifHasTakeItems(pPlayer, items)) { - plugin.msg(pPlayer, "You don't have the required items!"); - plugin.msg( - pPlayer, - "(" - + FormatManager - .formatItemStacks(items) - + ")"); - return true; - } - } - db.i("item check successful"); - - String cPermName = rank.getPermName(); // Display rank name - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - // success! - - if (plugin.getConfig().getBoolean("clearranks")) { - plugin.perms.removeGroups(pPlayer); - } - - plugin.perms.rankAdd(defaultrankallworlds ? "all" : pPlayer - .getWorld().getName(), pPlayer.getName(), cPermName); - if (rankpublic) { - plugin.getServer().broadcastMessage( - "Player " + fm.formatPlayer(pPlayer.getName()) - + " has chosen a class, now has the rank " - + c_Color + cDispName); - } else { - plugin.msg(pPlayer, - "You have chosen your class! You now have the rank " - + c_Color + cDispName); - } - - if (plugin.getConfig().getBoolean("checkprices") - && (rank_cost > 0)) { - // if it costs anything at all - - if (ClassRanks.economy != null) { - ClassRanks.economy.withdrawPlayer(pPlayer.getName(), rank_cost); - pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" - + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN - + "] " + ChatColor.RED + "Your account had " - + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."); - } else if ((plugin.method != null)) { - MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); - ma.subtract(rank_cost); - pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" - + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN - + "] " + ChatColor.RED + "Your account had " - + ChatColor.WHITE - + plugin.method.format(rank_cost) + ChatColor.RED - + " debited."); - } - } - return true; - } - plugin.msg(pPlayer, - "Not enough arguments (" + String.valueOf(args.length) + ")!"); - return false; - } - - public boolean parseAdminCommand(Player pPlayer, String[] args) { - db.i("parsing admin " + pPlayer.getName() + ", command: " - + FormatManager.formatStringArray(args)); - - if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.admin", pPlayer - .getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to administrate ranks!"); - return true; - } - - db.i("perm check successful"); - - if (args.length < 3) { - plugin.msg(pPlayer, - "Not enough arguments (" + String.valueOf(args.length) - + ")!"); - return false; - } - db.i("enough arguments"); - - if (args[0].equalsIgnoreCase("remove")) { - /* - * /classadmin remove class *classname* /classadmin remove rank - * *classname* *rankname* - */ - if (args[1].equalsIgnoreCase("class")) { - if (args.length != 3) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configClassRemove(args[2], pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - if (args.length != 4) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configRankRemove(args[2], args[3], pPlayer); - } - // second argument unknown - return false; - } else if (args[0].equalsIgnoreCase("add")) { - - /* - * /classadmin add class *classname* *rankname* *displayname* - * *color* /classadmin add rank *classname* *rankname* *displayname* - * *color* - */ - - if (args.length != 9) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - if (args[1].equalsIgnoreCase("class")) {// , ItemStack[] isItems, - // double dCost, int iExp - return ClassManager.configClassAdd(args[2], args[3], args[4], - args[5], - FormatManager.getItemStacksFromCommaString(args[6]), - Double.parseDouble(args[7]), Integer.parseInt(args[8]), - pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - return ClassManager.configRankAdd(args[2], args[3], args[4], - args[5], - FormatManager.getItemStacksFromCommaString(args[6]), - Double.parseDouble(args[7]), Integer.parseInt(args[8]), - pPlayer); - } - // second argument unknown - return false; - } else if (args[0].equalsIgnoreCase("change")) { - - /* - * /classadmin change rank *classname* *rankname* *displayname* - * *color* /classadmin change class *classname* *newclassname* - */ - - if (args[1].equalsIgnoreCase("class")) { - if (args.length != 4) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager - .configClassChange(args[2], args[3], pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - if (args.length != 6) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configRankChange(args[2], args[3], args[4], - args[5], pPlayer); - } - // second argument unknown - return false; - } - return false; - } - - public FormatManager getFormatManager() { - return fm; - } -} +package net.slipcor.classranks.managers; + +import java.util.ArrayList; +import java.util.logging.Level; + +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Class; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.PlayerManager; +import net.slipcor.classranks.register.payment.Method.MethodAccount; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +/** + * command manager class + * + * @version v0.4.3 + * + * @author slipcor + * + * issues + * id=14 + * id=16 + * + */ + +public class CommandManager { + private final ClassRanks plugin; + private final FormatManager fm; + private final PlayerManager pm; + private final DebugManager db; + + public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs + public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP + // Costs + public boolean rankpublic; // do we spam changed to the public? + public boolean defaultrankallworlds; // do ppl rank themselves in all + // worlds? + public boolean onlyoneclass; // only maintain oneass + public ItemStack[][] rankItems; + public String[] signCheck = { null, null, null }; // SignCheck variable + + public CommandManager(ClassRanks plugin) { + this.plugin = plugin; + this.pm = new PlayerManager(plugin); + this.fm = new FormatManager(); + this.db = new DebugManager(plugin); + } + + /* + * This function provides the main ranking process - including error + * messages when stuff is not right. - check if permissions are there - get + * old rank - calculate new rank - eventually delete from old rank - add to + * new rank + */ + public boolean rank(String[] args, Player comP) { + db.i("ranking " + comP.getName() + " : " + FormatManager.formatStringArray(args)); + int cDown = pm.coolDownCheck(comP); + if (cDown > 0) { + plugin.msg(comP, + "You have to wait " + ChatColor.RED + String.valueOf(cDown) + + ChatColor.WHITE + " seconds!"); + return true; // cooldown timer still counting => OUT! + } + db.i("cooldown check positive"); + + if ((!plugin.perms.hasPerms(comP, "classranks.rankdown", comP + .getWorld().getName())) + && args[0].equalsIgnoreCase("rankdown")) { + // if we either are no OP or try to rank down, but we may not + plugin.msg(comP, "You don't have permission to rank down!"); + return true; + } + + db.i("perm check successful"); + + String World = defaultrankallworlds ? "all" : comP.getWorld().getName(); // store + // the + // player's + // world + String changePlayer = comP.getName(); // store the player we want to + // change + Boolean self = true; // we want to change ourselves ... maybe + + if (args.length > 1) { // we have more than one argument. that means: + changePlayer = PlayerManager.search(args[1]); // we want to change a + // different player + self = false; // we do not want to change ourselves + if (args.length > 2) { // we even have more than two arguments. that + // means: + World = args[2]; // we want to specify a world where we change + } + } + + // does player have a rank? + + Rank rank = ClassManager.getRankByPermName(plugin.perms + .getPermNameByPlayer(World, changePlayer)); + + if (rank == null) { + // No Rank + if (self) { + plugin.msg(comP, "You don't have a class!"); + return true; + } else { + plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) + + " does not have a class !"); + return true; + } + } + + db.i("rank check successful"); + + String cPermName = rank.getPermName(); // Permissions rank name + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + Class cClass = rank.getSuperClass(); // Rank class + int cRank = cClass.ranks.indexOf(rank); // Rank index + int cMaxRank = cClass.ranks.size() - 1; // Classes max tree rank + db.i("rank " + cRank + " of " + cMaxRank); + // placeholder: cost + double rank_cost = 0; + // placeholder: items + ItemStack[] items = null; + + // placeholders for new rank + int rankOffset = 0; + + if (args[0].equalsIgnoreCase("rankup")) { + // we want to rank up! + if (cRank >= cMaxRank) { + // if the player is in the maximum rank + if (self) { + plugin.msg(comP, "You are already at highest rank!"); + } else { + plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) + + " already at highest rank!"); + } + return true; + } + if (self) { + // if we rank ourselves, that might cost money + // (otherwise, thats not the players problem ;) ) + try { + rank_cost = moneyCost[cRank + 1]; + } catch (Exception e) { + plugin.log("cost not set: "+(cRank + 1), Level.WARNING); + } + + Rank rNext = ClassManager.getNextRank(rank, 1); + if (rNext != null) { + if (rNext.getCost() != -1337D) { + rank_cost = rNext.getCost(); + } + } + + if (ClassRanks.economy != null) { + +// if (ClassRanks.economy.hasAccount(comP.getName())) { +// plugin.log("Account not found: " + comP.getName(), +// Level.SEVERE); +// return true; +// } + if (!ClassRanks.economy.has(comP.getName(), rank_cost)) { + // no money, no ranking! + plugin.msg(comP, + "You don't have enough money to rank up!"); + return true; + } + } else if (plugin.method != null) { + MethodAccount ma = plugin.method.getAccount(comP.getName()); + if (ma == null) { + plugin.log("Account not found: " + comP.getName(), + Level.SEVERE); + return true; + } + if (!ma.hasEnough(rank_cost)) { + // no money, no ranking! + plugin.msg(comP, + "You don't have enough money to rank up!"); + return true; + } + } + + items = rankItems != null ? rankItems[cRank + 1] : null; + + if (rNext.getItemstacks() != null) { + items = rNext.getItemstacks(); + } + } + rankOffset = 1; + } else if (args[0].equalsIgnoreCase("rankdown")) { + if (cRank < 1) { + // We are at lowest rank + if (self) { + plugin.msg(comP, "You are already at lowest rank!"); + } else { + plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) + + " already at lowest rank!"); + } + return true; + } + rankOffset = -1; + } + + if (rankOffset > 0) { + + if (expCost != null && expCost.length > 0) { + int exp_cost = -1; + + try { + exp_cost = expCost[cRank + 1]; + } catch (Exception e) { + plugin.log("Exp cost not set: "+cRank + 1, Level.WARNING); + } + Rank rNext = ClassManager.getNextRank(rank, 1); + if (rNext != null && rNext.getExp() != -1) { + exp_cost = rNext.getExp(); + } + + if (exp_cost > 0) { + if (comP.getTotalExperience() < exp_cost) { + plugin.msg(comP, + "You don't have enough experience ("+comP.getTotalExperience()+")! You need " + + exp_cost); + return true; + } + int newExp = comP.getTotalExperience() - exp_cost; + comP.setExp(0); + comP.setLevel(0); + comP.giveExp(newExp); + + plugin.msg(comP, "You paid " + exp_cost + + " experience points!"); + } + } + + if ((items != null) + && (!FormatManager.formatItemStacks(items).equals(""))) { + if (!pm.ifHasTakeItems(comP, items)) { + plugin.msg(comP, "You don't have the required items!"); + plugin.msg(comP, + "(" + FormatManager.formatItemStacks(items) + ")"); + return true; + } + } + } + + if (onlyoneclass || rankOffset < 0) { + // up and only OR down + db.i("removing old class..."); + plugin.perms.rankRemove(World, changePlayer, cPermName); + } + + rank = ClassManager.getNextRank(rank, rankOffset); + + cPermName = rank.getPermName(); + cDispName = rank.getDispName(); + c_Color = rank.getColor(); + + db.i("adding new rank..."); + plugin.perms.rankAdd(World, changePlayer, cPermName); + + if ((rank_cost > 0)) { + // take the money, inform the player + + if (ClassRanks.economy != null) { + ClassRanks.economy.withdrawPlayer(comP.getName(), rank_cost); + comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE + + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED + + "Your account had " + ChatColor.WHITE + + ClassRanks.economy.format(rank_cost) + ChatColor.RED + + " debited."); + } else if (plugin.method != null) { + MethodAccount ma = plugin.method.getAccount(comP.getName()); + ma.subtract(rank_cost); + comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE + + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED + + "Your account had " + ChatColor.WHITE + + plugin.method.format(rank_cost) + ChatColor.RED + + " debited."); + } + } + + if (self && !rankpublic) { + // we rank ourselves and do NOT want that to be public + plugin.msg(comP, + "You are now a " + c_Color + cDispName + ChatColor.WHITE + + ChatColor.WHITE + " in " + fm.formatWorld(World) + + "!"); + } else { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] Player " + fm.formatPlayer(changePlayer) + + " now is a " + c_Color + cDispName + + ChatColor.WHITE + " in " + fm.formatWorld(World) + + "!"); + } + return true; + } + + /** + * printout Class and/or Class Ranks + * + * @param pPlayer + * @param args + */ + private void cmdList (Player pPlayer, String[] args) { + ArrayList classes = ClassManager.getClasses(); + + pPlayer.sendMessage(ChatColor.YELLOW+"Class / Rank List"); + pPlayer.sendMessage(ChatColor.YELLOW+"--------------------"); + // check for Classlist or Classranklist + if (args.length > 1 ) { + // Do Class Rank List + for (Class c : classes) { + if (args[1].equalsIgnoreCase(c.name)) { + pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); + for (Rank r : c.ranks) { + pPlayer.sendMessage("=> " + ChatColor.GREEN + r.getDispName()); + } + } + } + + } else { + // Do Class List + for (Class c : classes) { + pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); + } + } + + } + + /** + * printout player Class, Rank and world + * + * @param pPlayer + * @param args + */ + private void cmdGet (Player pPlayer, String[] args) { + String world = pPlayer.getWorld().getName(); + if (args.length > 2) { + world = args[2]; + } else { + world = "all"; + } + if (args.length == 1) { + args[1] = pPlayer.getName(); + } + + args[1] = PlayerManager.search(args[1]); + + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); + + if (rank == null) { + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " has no class in " + fm.formatWorld(world) + "!"); + } else { + + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " is " + c_Color + cDispName + ChatColor.WHITE + + " in " + fm.formatWorld(world) + "!"); + } + + } + +// private void cmdTemp (Player pPlayer, String[] args) { +// +// } + + + + /* + * The main switch for the command usage. Check for known commands, + * permissions, arguments, and commit whatever is wanted. + */ + public boolean parseCommand(Player pPlayer, String[] args) { + + db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); + if (args.length > 1) { + if (args[0].equalsIgnoreCase("list")) { + // Command list of Ranks in the Class 3.2 + cmdList(pPlayer,args); + return true; + + } else if (args[0].equalsIgnoreCase("get")) { + // Command Get 3.2 + cmdGet(pPlayer, args); + return true; + } + + // more than /class or /class rankup + if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", + pPlayer.getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to change other user's ranks!"); + return true; + } + + if ((!args[0].equalsIgnoreCase("add")) + && (!args[0].equalsIgnoreCase("remove"))) { + if ((args[0].equalsIgnoreCase("rankup")) + || (args[0].equalsIgnoreCase("rankdown"))) { + // rank up or down + if (args.length > 1) { + return rank(args, pPlayer); + } else { + plugin.msg( + pPlayer, + "Not enough arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + } + plugin.msg(pPlayer, "Argument " + args[0] + " unrecognized!"); + return false; + } + + // add / remove + boolean self = true; + String world = defaultrankallworlds ? "all" : pPlayer.getWorld() + .getName(); + if (args[0].equalsIgnoreCase("remove")) { + if (args.length > 2) { + // => /class remove *name* world + world = args[2]; + self = false; + } else if (args.length > 1) { + self = false; + } + } else if (args[0].equalsIgnoreCase("add")) { + if (args.length > 3) { + // => /class add *name* *classname* world + world = args[3]; + } else if (args.length == 3) { + // => /class add *name* *classname* + String[] tArgs = { args[0], args[1] , args[2] }; + + args = tArgs; // override : without world //krglok 01.2013 +// self = false; + } else if (args.length == 2) { + // => /class add *classname* + + String[] tArgs = { args[0], pPlayer.getName(), args[1] }; + + args = tArgs; // override : pretend to have said: //class + // add me class + } else if (args.length < 2) { + // not enough arguments ;) + plugin.msg( + pPlayer, + "Not enough arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + } + db.i("precheck successful"); + + if (!self) { + if (!plugin.perms.hasPerms(pPlayer, + "classranks.admin.addremove", pPlayer.getWorld() + .getName())) { + // only if we are NOT op or may NOT add/remove classes + plugin.msg(pPlayer, + "You don't have permission to add/remove other player's classes!"); + return true; + } + } + db.i("perm check successful"); + + // get the class of the player we're talking about + args[1] = PlayerManager.search(args[1]); + String sPermName = plugin.perms.getPermNameByPlayer(world, args[1]); + if (!sPermName.equals("")) { + if (plugin.trackRanks) { + ClassManager.saveClassProgress(Bukkit.getPlayer(args[1])); + } + int i = 0; // combo breaker + while (!sPermName.equals("")) { + db.i("removing rank " + sPermName); + + Rank tempRank = ClassManager.getRankByPermName(sPermName); + + String cDispName = tempRank.getDispName(); // Display rank + // name + ChatColor c_Color = tempRank.getColor(); // Rank color + + if (args[0].equalsIgnoreCase("add")) { + // only one class per player :p + plugin.msg(pPlayer, + "Player " + fm.formatPlayer(args[1]) + + " already already has the rank " + + c_Color + cDispName + "!"); + } else if (args[0].equalsIgnoreCase("remove")) { + if (plugin.trackRanks) { + ClassManager.saveClassProgress(Bukkit + .getPlayer(args[1])); + } + plugin.perms.rankRemove(world, args[1], + tempRank.getPermName()); // do it! + + if ((!pPlayer.getName().equalsIgnoreCase(args[1]))) { + plugin.msg(pPlayer, + "Player " + fm.formatPlayer(args[1]) + + " removed from rank " + c_Color + + cDispName + ChatColor.WHITE + + " in " + fm.formatWorld(world) + + "!"); + + Player chP = plugin.getServer().getPlayer(args[1]); + try { + if (chP.isOnline()) { + chP.sendMessage("[" + ChatColor.AQUA + + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] You were removed from rank " + + c_Color + cDispName + + ChatColor.WHITE + " in " + + fm.formatWorld(world) + "!"); + } + } catch (Exception e) { + // do nothing, the player is not online + } + } else { + // self remove successful! + if (i == 0) + plugin.msg( + pPlayer, + "You were removed from rank " + c_Color + + cDispName + ChatColor.WHITE + + " in " + + fm.formatWorld(world) + "!"); + } + } + if (++i > 10) { + plugin.log("Infinite loop! More than 10 ranks!?", + Level.SEVERE); + break; + } + sPermName = plugin.perms + .getPermNameByPlayer(world, args[1]); + } + return true; + } + // player has no class + if (!args[0].equalsIgnoreCase("add")) { + // no class and trying to remove + if (pPlayer.getName().equalsIgnoreCase(args[1])) { + plugin.msg(pPlayer, "You don't have a class!"); + return true; + } else { + plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + + " does not have a class!"); + return true; + } + } + // ADD + Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(args[2])); + + if (tempRank == null) { + plugin.msg(pPlayer, + "The class you have entered does not exist!"+args[2]); + return true; + } + + String cPermName = tempRank.getPermName(); // Display rank name + String cDispName = tempRank.getDispName(); // Display rank name + ChatColor c_Color = tempRank.getColor(); // Rank color + + if (plugin.trackRanks) { + int rID = ClassManager.loadClassProcess( + Bukkit.getPlayer(args[1]), tempRank.getSuperClass()); + + tempRank = tempRank.getSuperClass().ranks.get(rID); + + cPermName = tempRank.getPermName(); // Display rank name + cDispName = tempRank.getDispName(); // Display rank name + c_Color = tempRank.getColor(); // Rank color + + String sRank = tempRank.getPermName(); + plugin.perms.rankAdd(world, args[1], sRank); + } else { + plugin.perms.rankAdd(world, args[1], cPermName); +// plugin.perms.classAdd(world, args[1], cPermName); + } + + if ((rankpublic) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] " + fm.formatPlayer(args[1]) + + " now is a " + c_Color + cDispName); + return true; + } else { + plugin.msg(pPlayer, "You now are a " + c_Color + cDispName); + return true; + } + } else if (args.length > 0) { + // only ONE argument! + + if (args[0].equalsIgnoreCase("reload")) { + // Command reload + if (pPlayer.isOp()) { + plugin.load_config(); + plugin.msg(pPlayer, "Config reloaded!"); + } else { + plugin.msg(pPlayer, "You don't have permission to reload!"); + } + return true; + } + + if (args[0].equalsIgnoreCase("rankup")) { + // Command rankup + if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", + pPlayer.getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to rank yourself up!"); + return true; + } + return rank(args, pPlayer); + } else if (args[0].equalsIgnoreCase("rankdown")) { + // Command rank down + if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", + pPlayer.getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to rank yourself down!"); + return true; + } + return rank(args, pPlayer); + } else if (args[0].equalsIgnoreCase("remove")) { + // Command remove + if (!plugin.perms.hasPerms(pPlayer, + "classranks.self.addremove", pPlayer.getWorld() + .getName())) { + plugin.msg(pPlayer, + "You don't have permission to add/remove your rank!"); + return true; + } + Rank rank = ClassManager.getRankByPermName(plugin.perms + .getPermNameByPlayer(pPlayer.getWorld().getName(), + pPlayer.getName())); + + if (rank == null) { + plugin.msg(pPlayer, "You don't have a class!"); + return true; + } + + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + if (plugin.trackRanks) { + ClassManager.saveClassProgress(pPlayer); + } + plugin.perms.rankRemove(defaultrankallworlds ? "all" : pPlayer + .getWorld().getName(), pPlayer.getName(), rank + .getPermName()); + + plugin.msg( + pPlayer, + "You were removed from rank " + + c_Color + + cDispName + + ChatColor.WHITE + + " in " + + fm.formatWorld(defaultrankallworlds ? "all" + : pPlayer.getWorld().getName()) + "!"); + return true; + } else if (args[0].equalsIgnoreCase("add")) { + // Command add + plugin.msg(pPlayer, ChatColor.RED+"Not enough arguments!"); + plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); + return true; + + } else if (args[0].equalsIgnoreCase("list")) { + // Command list Classes + cmdList(pPlayer, args); // Krglok id=14 + return true; + } + + // /class [classname] + if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer + .getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to choose your class!"); + return true; + } + + String sRankInfo = plugin.perms.getPermNameByPlayer(pPlayer + .getWorld().getName(), pPlayer.getName()); + + if (!sRankInfo.equals("")) { + plugin.msg(pPlayer, "You already have the rank " + sRankInfo + + "!"); + return true; + } + + String s = ""; + + if (plugin.trackRanks) { + s = ClassManager.getFirstPermNameByClassName(args[0], + pPlayer.getName()); + } else { + s = ClassManager.getFirstPermNameByClassName(args[0]); + } + + if (s == null || s.equals("")) { + plugin.msg(pPlayer, + "The class you have entered does not exist!"); + return true; + } + Rank rank = ClassManager.getRankByPermName(s); + + if (rank == null) { + plugin.msg(pPlayer, "Internal Error #1!"); + return true; + } + db.i("rank check successful"); + + int rID = 0; + if (plugin.trackRanks) { + rID = ClassManager.loadClassProcess(pPlayer, + rank.getSuperClass()); + } + double rank_cost = 0D; + + try { + rank_cost = moneyCost[rID]; + } catch (Exception e) { + plugin.log("cost not set: "+rID, Level.WARNING); + } + + if (rank.getCost() != -1337D) { + rank_cost = rank.getCost(); + } + // Check if the player has got the money + if (ClassRanks.economy != null) { + if (plugin.getConfig().getBoolean("checkprices") + && ClassRanks.economy.has(pPlayer.getName(), rank_cost)) { + + plugin.msg(pPlayer, + "You don't have enough money to choose your class! (" + + ClassRanks.economy.format(rank_cost) + + ")"); + return true; + } + } else if (plugin.method != null) { + MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); + if (plugin.getConfig().getBoolean("checkprices") + && !ma.hasEnough(rank_cost)) { + + plugin.msg(pPlayer, + "You don't have enough money to choose your class! (" + + plugin.method.format(rank_cost) + + ")"); + return true; + } + } + db.i("money check successful"); + if (expCost != null && expCost.length > 0) { + int exp_cost = -1; + + try { + exp_cost = expCost[rID]; + } catch (Exception e) { + plugin.log("Exp cost not set: "+rID, Level.WARNING); + } + + if (rank.getExp() != -1) { + exp_cost = rank.getExp(); + } + + if (exp_cost > 0) { + if (pPlayer.getTotalExperience() < exp_cost) { + plugin.msg(pPlayer, + "You don't have enough experience! You need " + + exp_cost); + return true; + } + pPlayer.setTotalExperience(pPlayer.getTotalExperience() + - exp_cost); + plugin.msg(pPlayer, "You paid " + exp_cost + + " experience points!"); + } + } + db.i("exp check successful"); + + ItemStack[] items = null; + + if (rankItems != null && (rankItems[rID] != null) + && (!FormatManager.formatItemStacks(rankItems[rID]).equals( + ""))) { + items = rankItems[rID]; + } + + if (rank.getItemstacks() != null) { + items = rank.getItemstacks(); + } + + if (items != null) { + + if (!pm.ifHasTakeItems(pPlayer, items)) { + plugin.msg(pPlayer, "You don't have the required items!"); + plugin.msg( + pPlayer, + "(" + + FormatManager + .formatItemStacks(items) + + ")"); + return true; + } + } + db.i("item check successful"); + + String cPermName = rank.getPermName(); // Display rank name + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + + // success! + + if (plugin.getConfig().getBoolean("clearranks")) { + plugin.perms.removeGroups(pPlayer); + } + + plugin.perms.rankAdd(defaultrankallworlds ? "all" : pPlayer + .getWorld().getName(), pPlayer.getName(), cPermName); + if (rankpublic) { + plugin.getServer().broadcastMessage( + "Player " + fm.formatPlayer(pPlayer.getName()) + + " has chosen a class, now has the rank " + + c_Color + cDispName); + } else { + plugin.msg(pPlayer, + "You have chosen your class! You now have the rank " + + c_Color + cDispName); + } + + if (plugin.getConfig().getBoolean("checkprices") + && (rank_cost > 0)) { + // if it costs anything at all + + if (ClassRanks.economy != null) { + ClassRanks.economy.withdrawPlayer(pPlayer.getName(), rank_cost); + pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" + + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN + + "] " + ChatColor.RED + "Your account had " + + ChatColor.WHITE + + ClassRanks.economy.format(rank_cost) + ChatColor.RED + + " debited."); + } else if ((plugin.method != null)) { + MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); + ma.subtract(rank_cost); + pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" + + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN + + "] " + ChatColor.RED + "Your account had " + + ChatColor.WHITE + + plugin.method.format(rank_cost) + ChatColor.RED + + " debited."); + } + } + return true; + } + plugin.msg(pPlayer, + "Not enough arguments (" + String.valueOf(args.length) + ")!"); + return false; + } + + public boolean parseAdminCommand(Player pPlayer, String[] args) { + db.i("parsing admin " + pPlayer.getName() + ", command: " + + FormatManager.formatStringArray(args)); + + if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.admin", pPlayer + .getWorld().getName())) { + plugin.msg(pPlayer, + "You don't have permission to administrate ranks!"); + return true; + } + + db.i("perm check successful"); + + if (args.length < 3) { + plugin.msg(pPlayer, + "Not enough arguments (" + String.valueOf(args.length) + + ")!"); + return false; + } + db.i("enough arguments"); + + if (args[0].equalsIgnoreCase("remove")) { + /* + * /classadmin remove class *classname* /classadmin remove rank + * *classname* *rankname* + */ + if (args[1].equalsIgnoreCase("class")) { + if (args.length != 3) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configClassRemove(args[2], pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + if (args.length != 4) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configRankRemove(args[2], args[3], pPlayer); + } + // second argument unknown + return false; + } else if (args[0].equalsIgnoreCase("add")) { + + /* + * /classadmin add class *classname* *rankname* *displayname* + * *color* /classadmin add rank *classname* *rankname* *displayname* + * *color* + */ + + if (args.length != 6) { ///krglok id=16 + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + if (args[1].equalsIgnoreCase("class")) {// , ItemStack[] isItems, + // double dCost, int iExp + return ClassManager.configClassAdd(args[2], args[3], args[4], + args[5], + FormatManager.getItemStacksFromCommaString(args[6]), + Double.parseDouble(args[7]), Integer.parseInt(args[8]), + pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + return ClassManager.configRankAdd(args[2], args[3], args[4], + args[5], + FormatManager.getItemStacksFromCommaString(args[6]), + Double.parseDouble(args[7]), Integer.parseInt(args[8]), + pPlayer); + } + // second argument unknown + return false; + } else if (args[0].equalsIgnoreCase("change")) { + + /* + * /classadmin change rank *classname* *rankname* *displayname* + * *color* /classadmin change class *classname* *newclassname* + */ + + if (args[1].equalsIgnoreCase("class")) { + if (args.length != 4) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager + .configClassChange(args[2], args[3], pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + if (args.length != 6) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configRankChange(args[2], args[3], args[4], + args[5], pPlayer); + } + // second argument unknown + return false; + } + return false; + } + + public FormatManager getFormatManager() { + return fm; + } +} diff --git a/src/plugin.yml b/src/plugin.yml index 287c2e4..8af45d8 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,65 +1,65 @@ -name: ClassRanks -main: net.slipcor.classranks.ClassRanks -version: 0.4.4.2 -author: slipcor -website: http://dev.bukkit.org/server-mods/classranks/ -soft-depends: [Vault] -commands: - class: - description: Lets users choose a class / change classes - usage: | - /class [classname] | Choose the class [classname] for yourself - /class [add] {username} {classname} {world} | Add user to a class - /class [remove] {username} {world} | Remove user from a class - /class [rankup/rankdown] [username] {world} | Rank user up/down - /class [rankup/rankdown] | Rank yourself up/down - /class get [username] {world} | Get the active rank of a user - /class list {classname} | list of class or class / rank - rankdown: - description: Rank down yourself or others - usage: | - /rankdown [username] | Rank down yourself or username - rankup: - description: Rank up yourself or others - usage: | - /rankup [username] | Rank up yourself or username - classadmin: - description: Administrate the classes - usage: | - /classadmin add class [classname] [permname] [displayname] [color] - /classadmin add rank [classname] [permname] [displayname] [color] - /classadmin change class [classname] [newname] - /classadmin change rank [classname] [rankname] [displayname] [color] - /classadmin remove class [classname] - /classadmin remove rank [classname] [rankname] -permissions: - classranks.*: - description: Gives access to all commands - children: - classranks.rankdown: true - classranks.self.rank: true - classranks.self.addremove: true - classranks.admin.*: - description: Gives access to all admin commands - children: - classranks.admin.rank: true - classranks.admin.addremove: true - classranks.admin.admin: true - classranks.rankdown: - description: Allows you to rank down - default: op - classranks.self.rank: - description: Allows you to rank yourself - default: true - classranks.self.addremove: - description: Allows you to add/remove your class - default: true - classranks.admin.rank: - description: Allows you to rank other people - default: op - classranks.admin.addremove: - description: Allows you to add/remove other peoples classes - default: op - classranks.admin.admin: - description: Allows you to administrate the classes (db) - default: op +name: ClassRanks +main: net.slipcor.classranks.ClassRanks +version: 0.4.4.4 +author: slipcor +website: http://dev.bukkit.org/server-mods/classranks/ +soft-depends: [Vault] +commands: + class: + description: Lets users choose a class / change classes + usage: | + /class [classname] | Choose the class [classname] for yourself + /class [add] {username} {classname} {world} | Add user to a class + /class [remove] {username} {world} | Remove user from a class + /class [rankup/rankdown] [username] {world} | Rank user up/down + /class [rankup/rankdown] | Rank yourself up/down + /class get [username] {world} | Get the active rank of a user + /class list {classname} | list of class or class / rank + rankdown: + description: Rank down yourself or others + usage: | + /rankdown [username] | Rank down yourself or username + rankup: + description: Rank up yourself or others + usage: | + /rankup [username] | Rank up yourself or username + classadmin: + description: Administrate the classes + usage: | + /classadmin add class [classname] [permname] [displayname] [color] + /classadmin add rank [classname] [permname] [displayname] [color] + /classadmin change class [classname] [newname] + /classadmin change rank [classname] [rankname] [displayname] [color] + /classadmin remove class [classname] + /classadmin remove rank [classname] [rankname] +permissions: + classranks.*: + description: Gives access to all commands + children: + classranks.rankdown: true + classranks.self.rank: true + classranks.self.addremove: true + classranks.admin.*: + description: Gives access to all admin commands + children: + classranks.admin.rank: true + classranks.admin.addremove: true + classranks.admin.admin: true + classranks.rankdown: + description: Allows you to rank down + default: op + classranks.self.rank: + description: Allows you to rank yourself + default: true + classranks.self.addremove: + description: Allows you to add/remove your class + default: true + classranks.admin.rank: + description: Allows you to rank other people + default: op + classranks.admin.addremove: + description: Allows you to add/remove other peoples classes + default: op + classranks.admin.admin: + description: Allows you to administrate the classes (db) + default: op From 7ad32e8739a02fa8cf2ea6271f73fd34351c28ee Mon Sep 17 00:00:00 2001 From: krglok Date: Wed, 10 Apr 2013 07:52:47 +0200 Subject: [PATCH 07/29] version 0.4.4.4 --- bin/config.yml | 9 +- bin/net/slipcor/classranks/ClassRanks.class | Bin 15717 -> 6603 bytes bin/net/slipcor/classranks/core/Class.class | Bin 1270 -> 1270 bytes .../classranks/core/PlayerClassList.class | Bin 0 -> 3288 bytes .../classranks/core/PlayerClassRank.class | Bin 0 -> 490 bytes .../listeners/CRServerListener.class | Bin 5255 -> 5456 bytes .../classranks/managers/ClassManager.class | Bin 10058 -> 10266 bytes .../classranks/managers/CommandManager.class | Bin 21231 -> 22692 bytes .../classranks/managers/ConfigManager.class | Bin 0 -> 15103 bytes .../managers/PlayerClassManager.class | Bin 0 -> 1654 bytes .../classranks/managers/PlayerManager.class | Bin 5619 -> 5760 bytes bin/plugin.yml | 12 +- src/config.yml | 9 +- src/net/slipcor/classranks/ClassRanks.java | 275 +--------- src/net/slipcor/classranks/core/Class.java | 2 + .../classranks/core/PlayerClassList.java | 114 +++++ .../classranks/core/PlayerClassRank.java | 20 + src/net/slipcor/classranks/core/Rank.java | 2 +- .../listeners/CRServerListener.java | 8 +- .../classranks/managers/ClassManager.java | 33 +- .../classranks/managers/CommandManager.java | 174 ++++--- .../classranks/managers/ConfigManager.java | 482 ++++++++++++++++++ .../managers/PlayerClassManager.java | 58 +++ .../classranks/managers/PlayerManager.java | 22 +- src/plugin.yml | 12 +- 25 files changed, 860 insertions(+), 372 deletions(-) create mode 100644 bin/net/slipcor/classranks/core/PlayerClassList.class create mode 100644 bin/net/slipcor/classranks/core/PlayerClassRank.class create mode 100644 bin/net/slipcor/classranks/managers/ConfigManager.class create mode 100644 bin/net/slipcor/classranks/managers/PlayerClassManager.class create mode 100644 src/net/slipcor/classranks/core/PlayerClassList.java create mode 100644 src/net/slipcor/classranks/core/PlayerClassRank.java create mode 100644 src/net/slipcor/classranks/managers/ConfigManager.java create mode 100644 src/net/slipcor/classranks/managers/PlayerClassManager.java diff --git a/bin/config.yml b/bin/config.yml index 2b8b262..cecefa8 100644 --- a/bin/config.yml +++ b/bin/config.yml @@ -95,7 +95,8 @@ players: Notch: Fighter: Warrior -#------------------# -# Config debugging # -#------------------# -cversion: '0310' +#------------------------# +# Config debugging # +# dont change the number # +#------------------------# +cversion: '0300' diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index b9bb86a359e83c930eb12f7b07efc646f4137bd5..d8be54c25b205d6251a4a9fb077ffd827be28a5b 100644 GIT binary patch literal 6603 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 diff --git a/bin/net/slipcor/classranks/core/Class.class b/bin/net/slipcor/classranks/core/Class.class index bfef405e49b91f9f1f0751954209af57b9e2ef80..62cda0ec13ff558261baa990551b4a703ec553ea 100644 GIT binary patch delta 45 zcmeyy`HgeKLuOtn1{MZk27U%<1`!6C$?uq>Sv43W88j#RvDC5}FmN&$PQJjR1_1Td B3D*Ds delta 45 zcmeyy`HgeKLuOtH1{MZE27U%f1`!6S$?uq>S=E4S^~ruLwXAv!oDBMtFR-Wq0Q7wc A#{d8T diff --git a/bin/net/slipcor/classranks/core/PlayerClassList.class b/bin/net/slipcor/classranks/core/PlayerClassList.class new file mode 100644 index 0000000000000000000000000000000000000000..39ff40952d94a5492c47c20dbc7c879032db969d GIT binary patch literal 3288 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 F_}>hpm?!`M diff --git a/bin/net/slipcor/classranks/managers/ClassManager.class b/bin/net/slipcor/classranks/managers/ClassManager.class index 2a345ed0f5c3d55167708d96d0c9eb0e08610061..085a1f1dd34d41aadbae91bcae324a6d243317d4 100644 GIT binary patch delta 3700 zcmai133Qaz75?sI_WU8sFiHMwOh}My5Ec-z z|9>7@a&2?gLtor+H-O2q)&-lOMs2s}DMLJaCS2pq^ovP2%M|JU28hp1-0ss zCtn}QZLoHlf?dJ(P^8|A+pyn-ed-mXtn6zh196NHq<055g;pfoxY4Ix_3p^J$G{c% zi5GKl$iRK*SKHGoM%^zM(Gu)h7l?$`hc|^**9E)?pvs+~ihgBotiT69{eY=#F-4+Y18o+iZa~;fQ)CW1Z&>10(UKVC%3bUUl7wh2#Gz zFf0VAK<@~oR*;>5Z@Fz)8|-Qix$(X-GH(Gxcz0rF^bF&Rig0 zs+m~@E)hd)lBUkfYB0qi@N9^L+asaw?(ym35|2yVf_#y=*n%#s-0p;CMNMd&8^W$M_0RBvYGCXyFhqNz%4$3tuDa&i{Fr3$y3eQQ$37h z8d4yIYFl=Bd9e;!BFG9y+H23>xNcoXw6-lA>0IrVfQ)uYsi4wQ)BD*Y7nb2HfsY}Z zLy`45t9d=moxz?^#4Tf3m58o(M|YrWV`pcnTgEayYpd~OtM*dK+Dnz7sG?B?d_^m3 zcwm*TWa7Yl8E=r?2~=rksH;7?R*+Uv+2}=1UU;7}BcxeA8y1t&>_V@K-ccF1{eRDOlS{>C`65SMQZ`Wra)5qq@GbHFiZq z>`FscN>J5~93!jL86$6TsrH;|aM47tTzug>5U00wQ zl{g7isOS0=jKvbRUR&`Amv#weVKDVT&=n5t^>_M7$GoxwXZd1n^y%;24R-kE#b zu{@`gog!mlh{$@0(Qu9-DDV?;?Nh_V4j%i%a!%{3lo0?Rx zLzb(j3f5<@;F*;SA4DmARAH5BF1*QX=k8kG?BLA{cyldpw)5tCHKJ&nT&Q*w`E&Nc z!7PBqReiXjsb+w928u>=`%iJ~weQ}G!s>$vFUvWgo-ZwlZRF`q@ZfvMW_}gu!9)(A z$+(DlUyOYE2_(D`(F8uxFK)*j5Z+sWgUsKCHtxD1$1&MO4<6i!yJ*h@q=cuOv|gff zSu$<_E2{f&cb(m|51`(($1&^PI>)$un5ow{wlTLFE4RZ3u+enHF;E@H<~S~jb$16x@KG-9yjgz4!k$j#*XY6yY`|}^5jT>eo3InVvq)OQb|T1>0(Ozu38X;py~vf#TD`=T z*4-|=j8{mUUcHLHlT^KW4Ohcutu)ncCUc`jwTI~}M{A5i@>)X5hGP&-6cYdPj=@{3 zDgQ@`@~woRv*{nAd;nWb4;6F}bCxCf_9PfTfY*n}t{EcxEwZF*GF)0QlDH_Lt(}itr?d&QmxUPcz+Ta2lTFgg%NGp0i+{nn*7Nvo}@O-c((C zQ+4gNpxYVc`xbNu<0J-?Q#VVDY}y8Kn$<0Hj9yvo|kJ{ifo`BIGArAUzUBcnLmn`(|A zgN}SsuCmHa_X%`W9G40;vAi%=%?H1oPu7fzRS%%IIxgcl7vnPVH;D4##5xwuZ!hkX zX=!n(KO>dXY~IzD6XP;BaXn=^*)qjteiF+6LYkkj^Ti_b`*2}g7VNPyU8G(uFN;k} zSnC`+QJ^_89XvzNK4}`VT;>$NGm-5LU*4IDe_A4b@=f)fG+Ry?*eb=+JydF9MsGo^ zgby!pGQP-n=u7;hcp06XqZ`=IJ)ELj@H&<921oUqoD*-cnck+#-lekM<8*wV!}tR! z#D_8uA4vl~k;V8_n(>*OiDPmuK9`L+E}JnZS8?xpeu?cDk>~iS{gR|vx@?ItG__(0 z4ycemIo;~NPKjD?LK`lZv*ipTeq1 qS5Ll0fQ{A2vcRVCLom%Ez|O&ClhqPRe)~8fn_UbkvW6aP(*9o!DQ)in delta 3691 zcmaJ^33OD|8UFss?7To0hGY^FCdiTv5_TAnEeHk(`>G(0Fockhp)*4uLK&>s9<8*+ z+ghuhgVe(TEK$NT1W}Y$gQ8YZiwjW2TD96zH>^^Ye($}>1X}FLNx1Lb`!C=3fB*k3 z4^BHaCGFUyCl3P{Ah$SR5tORU)-2VxgS)xk{q9^hcH#*QyU|h5Arfc^E?OL_Us_Y` z#2$51hb?IbHQbGR+!&2R8lJ+_%B2-{dq&W4Mxegd7Y?onH3XOVeQtzsM8oa)y`Yae zZttmH%XC@roZ6th;W~zw9e7FKFeAIvy3|f7ui%gBXQ`uHuW9IoM(wr)< zlSgHwUYA`o$B8!tsTFmBNW>RdvP2K$#GlmUj$XB~<8s$~8am^B!JX}vi+X<`(2U#? z27+`Gk>RFdS)jf;=)_;uW1Y6?gzchS{@6?5~3NQXGaIFl7s>8uZq;CgY#AOFA39?nXJ3B`cpi1DV4n_^1 zViBuDQUqnHV|v*jO>F2-dv4E+hHL7po#J5HZSH)br9P*)1Qx%~g`Ltt6HQXp+4LbU zT$E0lq)EE!o6)03CWA_6L0TwWU3S~5+S;0E+1yaLZi!pENVY?=1Vsktn=(32^kSYM zlOd-C!z=Wx#x_o?3p579PRS+9VZEL;5nuhPy1D|V|wgPlQcQvWYW^XU{L2s0x5Q9;K;auOqo|?i|KiB2C^nTp!k8T)%LFk8(7^IG6 z?e`AjTR&}v(`E$!`e`$aHly}FkZqTO3NkVdS$tWB@tBDTScDr9z zDxFNDlj(Fa14FqUi>a7|+3K~NEizxN%w3VbkY{dT_(dqdLKGvQ&gO3O2Kja=Evsp{ zjFwAj8Kh;c+ST!WKLNAyl9lHf9A>7Pnw)RcR}V)snpKo#J@hx@!+| zOAaA4KciXQo1d+A=hGFHyH-zTN}pCNC}}~9-|DrtVyM>|$E+v)wm$oC zy}o{QF7qoj@;iJ0tGu>2o-K)EO&sgu*ulLv4Ca|X@J#!*0nXge!R5zd484KL+(A}; zL>})%E;gbk?!p-SnBaawAa~!>N1G=nK5u5kt?S5OL*`rHpczr;MW+42T+9vsk(P?EE4NzS(61liLSx(#n}rR#DV-o`uROkcf=ldyF+mZuodVXSm@Iho8BgJu`g znWrB1<-{C$S!D8blF1;G)dM%RG1-b0UKh1=2&3mGXmpuG9>AaDD4na*a$OrOXGn`q z^_3zcx82*hz52w^|I*=A95;VI$40Bg`a@%?+X-t2)85Ge^cXesJC2eja{4$Tc!Dk1 z%(mOZD(vIVeuLWugiMG@Zkv+aHYK@jN^;wjBrUL%17u{-f%jegSMY6Bjk6k@{+TUMU?dM5! zE318!qxA)J!HfJf9peOgiG%ZHOvEdgj90M)$FUBt8`y6&b53GkpRD%!WVP2PtG(Xf z!^$XY3_fg(V@#wNUnK|8wALtb8)YeXOJv8%pBBcJ;)i_alh#q1ewtdaQXZ(l;e8{bna~8bn)t zXJA~0nC8hXzp)jU5y|;^ZJ=2OQhsw}L<@cpm+PC2M8~MzJ+F)PHI4nY?a0v?^4fTY zjx(jAZD*rhJa#kLt(TulhQGlKpZJLVKavffjH{<76Pl^r6y7YriI5-TKPNa7-{PI+ zZ8pj~9L4YQigA*KKgCbid;F-q&*6NA!{r0E(ub7PM?C#8SD)ZAK9wANCcLrB73UZf0Jgm<)T1HXmENHeg~ e7%2vREAMC)xrwxzmm)i4wSyr=7SMx57XAmyscnP+ diff --git a/bin/net/slipcor/classranks/managers/CommandManager.class b/bin/net/slipcor/classranks/managers/CommandManager.class index 2f801262ea933a386b77a23822973c08550d2919..d25d11cc85d77f89f9c7ff0ddabe1a12d46e3fa5 100644 GIT binary patch literal 22692 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 literal 21231 zcmb_^34B!5_5V5NzL|M5^N1lskSOSYY$1WLC`gbU#K@#9ZV?~v*>hhxL3(ts`)-w5PD(lKCs+o?M(hkA#n)Xahdjyj#s$wc?uWRGn z$0m|hv086xJ*?({hRvvqt%xTxhLtVELian{g!sa`@}^P2szh~s#rQ-D%aa8Ym;&+T zHR;z9rjQm?P2IxEic%&%iK$ard{L~fvR2o}Dl3;Il9gpCCMQu{xdNn&aG8R-xuiB; zg{B@07EDPb%ZnD)Em=}gTU1fKG+tesNUkW-?XzlQrAx5rV5*|Ldi>&e=@O>Mf+YG0&L{aJypzchC z?d)OW#u##*s2nlWB$) z?g>n}eOqgC{+uw)q7wr&o2g62xo9?}Lvv^@4kOfUTC56k=#gjVN7!@ zX$uLuwtqzHm8K;aq9R)E&megFqvtquu4czK_qdYT6Ky&l z#xI(RmnN#qQr$zel711O3z@pNbE2DUoI@AU#aLEVsvK@+A98E8`6Ke@*mNlrS_{7n z!jG0}%Nwmpq$+AFmd1nN;xdOWrz^l_O+2ZsctLxIZ87|2rSYLNk8>ZPR9C_Fl{Wg> z0s3s{d9>zV2~kn>&0nBSmV%Ix)UtN&#a48rb^1I6Uq4aSPCb& zOu|QTMwcb3`_#I6twmmuN>wDPwTf%up>)!0p z7TSs>f%HrW24uYnn1;4NIKMr$MI;z6(iE`T`{@aXo}{M`#w>K@Ge@6eh_P=zcIauG zlomS_iyH05j{F9v-d&k7q0c$=TP-%nHKA^cP1|AXv4`Q_tNq=gWY?V5Q)FnzF9NtFr6Lx6a5)> zM+*dYC)d@3<}s8Bu|9O@Bl-)(Ur}8aU+x;+45djMZa9s5hd?t^S7Xyx*a@u)v1B|Nt4zjYWhs%X0?@xawHq&MN{HS8@tz_CH zOpqa$W<4RBmGobScF}GqFq#ljwsA1p9qxw6KRWai?RE8OT70=VYfO{c4ZR!na0L9` zz7)bcayywF7FJjiG|Ejln#VX3639B@BSP%sK!E+tqG7kqVVi?svCQ;rIG z+QkXD$#&!2WV{@CM?6_n6I)S*II?J}8G$u)N4dM3?TjrgP1IG_ zGRg!g7n!y?R8X3hima=5ovdH<}5b0*H580Nm*FTnXs z$F!qf2Q;U{1zd=T3p+K@$R5YMFLnq1laYDlQfF949_a8O9_(5>lf~*R6bo5w(bTR1OI>5%Aqy`p_>9tWS5-`yCu>Ug{?stHeUcp@K* zxnQI~Q;X_YlfLkA4wvxpa35$f_DQ#uxNTD$o~qjdV~7Vjn)m;ZylESm}yI$Hh{!V@u*5lrd@_A>;nJg9(VW-i_MD@n{k}RU{$x z3JsZbw^@TN*c5~yoUc{0+@Veg?YKfm3h}DMQk`icc6Y;&0RsjgB<3X!S27YLgW1f~ zy)b@w8^^Y_eQI5U6oC`asaRQ=o~t^(%y>6%sxuu<>Zt07Pw@u5$QlZCUJ8-9mt4rM24lUZnT# zI)^&yy}JRTNt=c0#Ik4%4Bn)pjEZUO5$u*;Llf^0_4!a6PF+a11x*MJ=z zfyI+c<4MhRvyjcL)>$Us>F`}zP}bNJP8_R;-|g@{{400(_(b)h3d99Nnh%HPLv>v; zR*TG|Xi-IFyy#f`aeI5!u-WwxTTL>)sA74D@8bsod_U69jFWjFWE@_vmul8x06v=^ z!s{tfFO;_V5o|JC!m?;Z3X%%*2HqIp$FQFnGr8+^coR3kWGqZ3Vr8YVRIRrwElzkk zWhn{p78szWy`H$dG+v{Z3~9xZkX=GFl!_9|kKGuUv%rGrFeJF4%_shfa`EX;aD*EKLXXIE$sHd6B%o)QisB#i^UZ zZL<^|ltFb%r^c4Mj|RUzO?w}#Z~|6n3=_il{aQKC{7hf82(AHxVS>C6-k?N{!q)R9 zb!3U7S_QK>s=cKjkXr{e8y>~u*bi%E{8a}7FHeot7~n8KT>|`y7F1Q425L19*!~u` zfe_};(MRh~4*yvnE&u$9Q>ILxYx9TDN+a-SQB;dBs)^f-)TC4YHvR)V%ztzEWBvq8 zL#{Y)37qB5IE+RqP4Hjh)gy-cls^yfXE4RBTOIy_zl6S48#y+QpFNL;)QkV&@IM(@ ztW}Nd&*rbeyUVX$&NmK!tC!>Rtm*fNV@Hm{iTjj)aQMGED-JA}r`?;&F8=p%OaY76kL1rvZ8JLO+t~!atsJt3?6=mpx=sN<_-x8*L%9C*YO#6hZ=h%Wfl`OL? ztvq_mA=pt&hc!k19*Ce-*+hbFA4KgDM1?wpD~m2lCaT=QaD#Frq7WJH$OL^d?TXa& z>PlRi*m5kmImN{9%i=&MS`W76IHp7OF0|VLQTq`k2m)}?7LQgY5;fhUQ-PC#vsiU> z&_GYyM%$uqL)yl(5UWIGnj_P-e?JtGKei&7%0K~)05u9_%Lz>VW+VDFI~-jB#tf>D z9l!$0n#jkO<6IfKvmBW%Iz6a_t50u*MnIXy?8B5FfT_tZfmxQhjznah4jh`H_ns-W zhJGvS+tfUun>n**mA(i?NCBd6(&v9K{Uh`S`_$U=Sh7}h=DpLB?23$poaH?G1) z=@xUm5Et~^=P7af;vfQ#?PSE}nh_mScvj>LB>VfOp*0M`hE=Rw6b05`OC{{$&luxk z(SqP7uO$x|M;__o;C&L!IP#huqg-G{hqY~)Dj0x-)H+gU!rDnQ$IiE98PizzK0mqu zEc8p6*p3IwH17x z4U?w_rC~t#MoK4hTEO}goU2d4CR@&j?=I0wT^*~8PD~~f$>Gfxc(Bqj%)B`qAXhqa zl}_w)5ZSfF8RQyhBu2Knn6TwKY^V+&+i1E0D=o!+1g_4tDW{v|CP!}8#@2D|*Q8{k zt|n#6t+;F~k0 zd)N%5P@OZ5jvED-zqZ`Bzr$$y!6G7Vbd^o}{|8`DS~_=I9t5jq9$OxUHJ+PH=v3a^ zuWM{OBMi{``lurtMN59I-SmTitaEzjVj znyqz#XYC-`pf@2T&&qED@*G6iBrJXM@r{uqztdT&ZOEWbOJ|28&&vzYj|_psKr#KY z4f3rgJdm3G=4%s5_O*?g%NHGaNpp#-dhNXQ9)d|*kV*O7kW}~jy(6#boz7IA@h0=t zt*<-shP>HK58Otk`2V-H?rR~KTE`-ppIR{uYX9=8@e`6}Ly(VzX2Fz{#x*d47|lE7 z-bX?M^sd8pl~h-I7i2m=>d*}IrtSnQg1d<@<>=3M@RXy!o-rl9!!ad3hCzv;lx0eM z5M)Z=NT$R!uPK2Eni8XwH{R%eGkbY0lQS%En)38l69M2=>Z>Eu(XcQjD=<0EsX#ArfC^Qj& zd*hOYXaFYZ2_}0{S1QC)5k7Jnh+E`A`0!&eO`#!lEP8cz8KFsZ9Nxf^5dci5PEuTU z!wXQCOXT0uZzGL=f+o+;nYx*#7jC7QObs+I=VbgT*g~hGXrP4+6i2_|g$=ZLRJS$Y zeFddkWeTx_{47yGO&bYHQ*V4HOh zbuF+4Z=r{Zeafrz-9vVPZ*Z}tNrQnrE6>+J8@5nGaUd_SgGS}~8|d-Iskf!4_SX0e z)`*d#^q^<4uAJYsT-*+Dm=|cE7m96Nyiy$0#cRbOUA$Qw&I@m(cl7fILml%B<*>?z zcF>YBV*D$n$aNa%3_L$Cg<@F_) zuBX1{#gJ^p^*=JW_Qvi-_kvuYA4WGuyycCl1}RiaMlUhi7eIXFDB%zwXX-$=b@<7Okdg!&-zpH%fOSciB#J zbv2&c-dnk=P;n$LvV(f1d5LfjFypqnOW43Y!H%^)FQTdUQK0Thp@};8->x-@`|H&W zuE&?A#o3z2qU{tiWpTDOv|~M;*ra&Jqw6{v>xrhL$LXvf@+ zYj^xZE^ zxjAd-tir8~#5Xr*9qH*@WsUG?BP`tlY7ri*^(iNa5ISo8-HI2cL;e~nG4Se!y*fq^dgrPbY zWRO}2Qf3h7M7XSxnl=x-Xf@fn9dD;@7%)D$nB`L4+pl5bLNhN z8PawteZ=*+nl4#cx2)lS(aNRGv@&JUTw}yG^Rf-R99ApBuw9-7i}1Pn*{eU_)N3;r z;gyYjKu#;*FBC+LVQ%xKc*fb?%9jb%)76F_t>_ndPnn92qofI3ss2|^JldMrHSKca zY4!{V{Myx2qQ{u^NBDZZIU%erFW9s=W5^?XBWlofRG!tqH{&_NtK1cugRw$WY2e#j zO+FiRHt<>ya;w)x_}2}5ZzIhJKbWTG+0qCeBLqCmqx-bj)Hd_O~vq!GiWR=KzSFIRX#!QkUoL~6T#51` zl$XL|UJoC6J1)Z3&@}Ad40?uU)AKZkUZHvP2F<7ULFF%WGJOh4U*QAHZz)c@3DG2# zvyUpc1D(MK(-O|ZN0dXT8rR5GxHnGl7$npsRL3*$?c-cp#;4M9j?)T06JIo*OK0<1 zI+xesGsR!wv&4JpB7Tf6;m7Hh{48C@FVW@vDn1kZjIQLbQGN^W`8{3BKhcd6q?;rQ zDO~}rk|DHOj;7mW65TE*(48`u>g5c&PZD&$BvIDU1G0=Bl$G?5+(Zw{YI;OA(xb8& z<>RzLo}`WPJT=J6v{`)idQnmE9T0!rqRrH>^i{4ic)1OoWeW;$G zkJNVhi+Yj%s{TfQQ=g&y67T<{kJZ=oceRH;wG@43h3IoDhrYCW(^pmz%E9!tHH`jk zO{8zEne?r73VmlSr0=bBQC>j*u`Z-N*46Zrbt~<)?q#taWy{*aKI>`rTie;Te$PSc zLk?Si=Pc_hKFIosvwdB-qi-PR_>SR-Z#sAK%|qQOoa;M-JNwS#gMGi`F1~e~=X;zF z@oncreShMvzE4p11xJ0mxQA~qAK}mAp8i4H%Rday#oWU`l6(8da3B99?(47OeE<2} z&wmXU`0KgQ{~+ofL0bb4Fp=9H1eA!$pou1O^Kap;2sNQvczT?lKwLM-eX;{#Om6Ai#$^Y8vWR1lz@z4y}9)De+)fZq<_nz*qUZRzJk z0CzF00{jjH*ON~S@aDtzP%rf8wTC7IxbH6Nk~0R)yC~b&yBEt|MAA72OcQZ5D0bgN zT|u$$Q^4&ChH`T#3;a0QLX*5EvABY$OL=f#Fdgmv_`ff2LS zdTos!3GeidrW2^Afq4Os&Q3(mt_Ab)=N>CMww^)x=s)WA%p z_RmI|#7jEGu}q3HPG?_yv<}svFeC6oiIFspN8_`~F%;*qFo)x4Esv*XQ0_$i8+;tS z#mCc^JefNHFguv1n?rOQGBe0KeTcXV@50f6F5pQYC&3JzcsKnShiER0@*b$aMQf=$ z{|FWK)0cQMbuh1l3=t@^?$3Kk85O;f?7i?0_(cfRZS-vn=t`n5yj)%5e}a3x_O1m@>D9EtZN7UbROlN#t)Bcj z^?0}LB&X0qALM$o3bh6yTbiXkw%NCwbmo8tH{pp0LlJZkfZc8x1L$$csrsAVCa1FU zEaX)CqzB929=&=x4WR~dD4#A~EB5b`5WoDzbT= z2ZJ{s#s_b_fb#fc>I&D~gHNLZUPwoB8CAkfpU>rR$%~muZXcYuwPtUYuCOwVq_AuKlhzX2dRzmLrajM3q6$jc;^5eeZi7idExNG<0T zW~TGnqWHEHs=*P-GNvQkub^c3+Ts$EnJ;1w3 zhA&W=oqFm{3K}{uBE2)ZSX%QMv4RYCVJp)dt)j!svFLzfQEaJE^|Zz{vHI}_(@ig8 z60{0ZJnF0yT)?giyj}5zDRDmt)@aPCwDLUWh}1QUI3@b#7>$WaSYAVTm%2mtavG$ zbTwpUz$$GT25*r;TV$9TiXi2CGCWYJ91iF|LvcTA=0R>y-6s?L~3|Dfxp%9T$lb~mL zZ}GH!c2PtZrg7~^d3$!G!nGr=ea4I)LTeD7{R~~wVyNp0R?)Yb9d~S1d($S|v0lff zP{!Q@7r33)e}{_{r}eMD)({JSUn};RIkbWV3Sh>(8Bw(56Sg;jQ(U{cOeZ{fTp0 z|1^--vyp{}oCW2BSeoHI)_U~xV010tPEZP0fLr7o?IFXc!09eV2)LcH@+_C|Di@wb zlmHYFo+%GFa)b6hI~p5sUyycLJK*Txdd$l7Bv}R8>6ioV&l(;;eL=2&(C|P#MO|B< z?Qf0&tZ~>s#xe2WYF~4N+It=DVu3)x^buYckqa8+!c}xHz&v*;U6AMiv0gjm!&bItI5kS1F##={daNy4?lxTFrw{ z01%_bIRP-=tqTCmx5-dFOaEN|fT6*9>Rueugj~mD;N@15anWSRWcbivZg36FFL2T1 z;5yeKcsyMOo^oNPv{=m+6{P!>ZIvrru-NU&1}xTHGr?l80fw&z!>l(;!}9sM$n_82 zt|u~28Bnt0RpAB&ycx7!mv{|scX8$dxV=W4xu6MW_PAIGhVz1;XjHd3&a7Fv7OZG} zdI3Hh#Vfd+LGfBKCie8Xk#+vDnvS; zx&_?jAtn(nb$MGa^#ci@$0mQxHmt{h5RUfF13M&;QRbzcq5O(hYnMDGtc6! zJP+_-48Y(DK!WG+Gx*iTb9^WA$h!gVtp}|42mrlD0p&fxFX0W49{#=xK<_mGbMFC? z`v4H!-}w#x7a+Uu@caYH-TW4?g|`K$hxqv&vH5-J$REfd{Gk-^NBHFPFEWPzDkc0e zK2-cfrt{zN!Q5w(;4fq;e`bQU&<^;!qKFoG3L7btj;0w)j+B0xBW4S}8$w zi-go25?1x%sK=y(dLH#J%R%Z7lB3>~PU>CBRezSw>H|4g{X@E_|4N?PD~DJek1X*ImP-Ff zlw(kimn#2pQth9Na+)OkGvrMFTuJ&DO0B<2>io-5o{jQ6S?d3VEc0K2@-kWOze3LP zUoU6-*T}j4U(0#^hvj_#Mm%pu`M6x*e_B@hpGEmQxzN8uF7m%37yI9lOZ*?8{0rVc zkze{hm&^R$%H{s=jGQl?!a4ePv9N- zb>L&UH}Hkr7x+pZ4E$FfvXwk&`%wnvVLMA6u{)ydB#+viWutwVY_bQS94wpdV`Pgx zUAEfuP%e5U*j@e>>?0oshsh_wed9z6-u0-v{5o^INEUSN;=xUv>pQk=?=XWKZx1*&AX-A;02K4`qc4 zlrJ<`*`Z-77#gQSp-CznIzc(1IVk7j{bbc4bgDWi6j#}y#VD&($IwcZ6S^GbRVp`h zi#j;8TIGcvP=|yzsY63sP(Fcjo9Y_cp$-qds-mGksv|=0sa~N^RqxO@s!!-Ys&D8A zl^+&W5Dut*;gBi}XX8Dh`h+{H{^2faV7P}G9L`rm!UNTj;bH3N@FX=nJX0MLUZh5b zm!mvejS63=Mu#s`W5Vmy*zmn-TzCVXH=*tcH9oveO$a}yCWc>D$A;fR`7Yl7q)NhH zspG@ns;S{!YMK*P)1AZB3}=u!!5Ob+IwfkBbF!N4#8H2SI?-9C<~UcVxz0^$o^zj? z?>wPSa$Z&ooY&RK&gbeB=Nr`jpiXyosfEs7RodYYwXj1sRi^PkAcj3PJeS4;I~<mjw)GLbkG>cR zTDxhqtOezeFCSMuccL}y|Ag){D5dfPf;1znfZ%^ZqDT1b!PfI~7y2oCp>?aQ!;@v- zXPsb1`0O3l5JS&ze_$PIE|miIS9GYk7zze)>1r;4g25l?CUb2R4Ece?>g%OYXtkVf zE}w$oe0VI)b0|Cz9!>Kc4iAH`(;PU?72Z`+2aTBWi!^(5q;G$xXOBI&%F_2qd#Ibf zB$B)%diNW;hsKyHxEe~Oua6SADf%3!{y1Fm>;k;H8{dQcK-nQY_wKug3eoQ;s?kLB zzeINKZaQf%MM*UR`1nXG#6$c;{73H5w^uuVG@vc|&J57ad-35}<`sZ@XO$p98z}C@ z6?I$9!2DP0s|K1Jpb_oS@MU%au^%Y1n@S?!`dGZ}p~E%H2RVE2>nz&22RAHx0T*Z9 zR=8{02~(gixVm=PO*3~>`CjTn!N%2T8u}l4x%Xh*4l3A11NP8x+^1zhT0h~*>(jVm zr>)`W-`Fv|{@pb7u-$YGF4Fb_)XtPCw&LzI(rtCeMG8Lcllce>J!tYCgv#j%8+dRl zxZ4Df2EhI`x;6XsEDd1eD}{6hdN*z2 z7*p%hcSM}ThaRLBQ#V{^_d(fDEuo>RlE$DMkMdYmMUz!EO+$HtO3*BY5%|<$p{k>D zwUkzH}>T1qXS8_*nEl1S#e3-h4qv~cZRBL#M zTFb-KoqV*qi^r*TJOkw{)XhrbfrS9b#bssNN_w&W-0loxvm#g)BvwD!% zs)u-;dYJE1kKp5)M|lhCo>Uuoo7%)X)sy^3^%TFaw(*DRY5qt(!(XW1@PAS6LET>U zETZ+_Ark*BBJu5rw0Fqih{lglFGx?dQwFFPy^-% zymGD!v1rf_su%>QCSgVS4Q?6mlE>ijWAPc0b8t)yc-~-BpkZ+n*kZ=XD^|>lMC;2} zH?LnGY$^|iHw3~>k!VYKb%F?xy=obmh8Zra%@Z&}g}&}}fi=G7P?O-C8VW6mL_>Ax z=H<|nNI2B8ARJIf!{nLd4+X=)rYa^!X<03kb9$sM;Gq%tHFE68k$J>4(jc8YqBOy9 zpr*NDbs&0%50Vxwi}-z^T3<9M&sL|mKG3ANi#)rQmYGsdQ?*mF`;Jq=1j{J~<&hWQ zn$`xvzC4$0*xQ=O4(Jw|YAXCD8I&*l40O*==~ZEAnT=-2geeAfrEZuI%b3uk)P`Q< zDeKKlsG}2XtA)!fg9@lS)NPU_{6VF;cA`Y76t1$Y)=LgL&7j#dRJhDD$VG1GdoVUb zte*+EZIoPS7aCMZJ#gT_Z4vh|A{h*Q~)kS#N) zmq;@YWM(gP#9Ae(0J6e_tj^=q0GZk&Q|DS5lX_>NhP4Wo9~)F8kUJ$HD_fRx#&MYD zEM#>Cov0K5WXS;>Z!mU7($a-)twFtoT|VeiBZ^QCr%`zUAq*K*oFGh%KoO!zGJp!k z#NR4AmPuzDbdpRGtx68yuz*$`q3Kx~X*m;_yTPD7)Ym*&i#SsoEm{#?Cor6z^ggh7 zrHwx^sD%1iqDqcBORJSKU`o>Y0LTF7@G*Uq;JVnLlc~Qcv2+FlOOHKY7RC`MRa5>= z7+z-3fP`dIBc_y;;}fDQ4H_utDSECt!3aB$lStBBW6&T$Celt0K(oY*l;4!2@`Xa@ zD8DIOuQzBgm3rxCbdydu!mXvEs})HMx|z1a6gT)n&4C4Lz^!z-oh>r;#Hx1dz^P#h zHlFa_87N?T!Po-$Za68w1b%^ar$J>@3eOCd>0{WMxcLMrPBs+r)vfZYyu(ZP(0w}H z%hd0fiG@L}^h?vq&7_5C3|vfFgfe+HM}1AmJIdDtLxJ*H_+wIA-IX4C04L(#U}h&? z+CdNL^eedUAIQj{U(;_)IHpoF!EvU}BBALWyS%iEcI))pj8w}cH|SxC!xab4ZuW(g zrKL@`vYWEy9%^Ii?T-eq(Qti<6<|xu?T=__2<6eE^q5Y2ali_Y@^_&~J#x7E@_B&` z0XT-o=?R>2bmB>f&i8622K*laTAbcqr>=qZDqrUPIA)nFQ& zlR;X}sp88H`h!8w(sNMdNTZx7BvSFik9>hS7kl|1I;hhNOyhsxSz8MuqvuM+a^g$(<#m;gD`I|ePL8u3K$8T40rAEH@p z=CZZoc~ly=JP#W5p+O(f-QaOQjC4s&E9jT}pBujkJK#4B|#jk5A zfiev%k)KfN5hF%;>7Vp3ojze2mcy0U@;B&H`V8r4P{LYA$(Gf2qR;6|oxZ?bD(4~F zNywnD=s%`^P||>=bW6J7WCGHOzNT+<`d@^ml%?VpWYD*CF6=WFJU5`z_ZhCjyj#f3 zb_2*6{$hQgWwF>+W{Qih%1-QHm(IA?r7eH~gWasd5h9|&Uq+&$Sn2680+i|pgFNn} zGs0N66vD))!3O68W;n1Bt9MUuNH=8QG6d{vYz&0!n2M2zq(RN#Q0d_TkVVO^4H6EVKbP~GM$}wfa zS*8mY!BY*M#?v8be?#5;dZ^>bW4ejykp`G_UBXf1@l2Yf^DKCnV>y7#nO>g5r|EM2 zO-rS!!%YDcNDQ9K^B`xXf9T7heAOb$8j&TUX`!8tKsioF(9SrDgix&G;F-MG;4}C~ zuyz>AtVp!M*JSOEX%vj>So_MDf)$tGO0E(|4=)oVQg=;%Bou+RuRvT;W9r$jC}RnwtlC2Zg#02zf8LZs;Slc!ij8eH=u)w zPA9%q;M|7mOA3yR=zIqxlos7>N?jiQIku6^xfK|xlU0B#-!1X&7ac6$3S=I}{e~;V zMYJ0HOTJ%t4(4|L z4T2o+MDAajp1dYlR^q-be(|@$dv^|?X+~qYOK_gUaf2U`uP|mfIuCJ&K)| zR)e*NA49^C;S7<<)uX;xQG&}0KVk6i~kDSUuhe*ImgP5;ahT9e#W3{X|sp&Jp3FI)j@0A`)+t2g>*u-@t_#8 z+;ao55gx`3fYJO3dl?b-H3UQ>Uls*;B`b_tXP3TUQX^i2LXWUK@nQL`5?o1P-V}-d z`Pi(ioJOX+ZSY_C9XR+pRdr4!-!nY?o-kM1DmdRa_ye(=d{~YNPxN1e`jNqZU7Ldx?odFxmk#Jkxd=WUAa(vS;mTAv znYqy)PXz6n@XcY544Xeyjb6oU zP)oP@mV#%%>f~{zyl${wQzWrW8X|8!^3@vx+)`APU6+DiSGkCpBDCb-AzTbP$(`1! z^?0;y*c>{bO^I3su5Ek`?k8Gd?g|jzTm{P2Uh=f=T2DjkB`*M+VtUeXqM6 zg&k-H-frB`Mu|7o zBT?LReF)Wav@wP@Rx-^_O_4c)jizbHs^bmq6m5bT7|r9%ypkn+21qLmty0)ZGJ>O) z*~r(gkZ|tyTbh&eZC~n0pbf65h!A)5T-~! zt|7Z={BN?Ro~Wi8CIL;Li5N$D?WjyDvzhd_WpXN2ft8?7M=&{i@-W-UQ)!wtxeD9S zz{EXd=)*KQwRNxREr)uHR2+JkRMs9uG;+|g_31Rj2FT28AY*KS%%(ZkNO%_1&sm2D-f^0xlwt!BjMb_jD$t*~LF(oq< z%S}rI;!Xl_%X>HQV5!^L068NY$ShkRwe~>H$OcjkAgAR3A~q*LmK;^#mSzL0u?4i8 zR^W(C)jv}y-a_lhlAoYDXaF?SKiU$GR=HK+dNNIsobYFrAkTn?~J>!hi^GnRfLqif&FFWG&3U>K0ElBnq zPWGMQn3N!VBTjD~AeVE}kU0G%PVa7~BfYoNH!{4NKIrywoc@tyAhgas^luF>>6e0H z=^pwo(;d`9D9ne)={uyVt<-6V)BNc;)f_v*w1+k1*UnbjR^;5nxWewET{SW~d=Gcl z2=IL>_wxPP1nS~R8j8Rwxu*-8^C+-iE~ z#8h)$Ipz&-<58e2;IV3|ImwjkW{m~Tc&1z0*Cn=Ez!Q_gS|uoONCjM>WTj&VP6#m0 zla##PgS_6hkQQ)Nn!wB%35ofYDExaUT@<%wio%~Min+Ua%5I*a1TuTUF{ClOjpwIH zqYBa}cK-M=@53|`GiMe%6a!Nx3y)tWKD8`QiSwcYu9XKRi>1)hoat6lJqhmZR0EAe6{mwzD~pPty~4I5kh5ZkMlOc zq#o0>h)>AWBH5XF&Ns+8TS~z94yTrR` zOQ>jgoaBFP;}0v0V`KXJ596O8mo3a5pI_+OPQ8Z}xr;nSc|}GqZ(%;S@jsV1#=Ban zFuVV=C88=4X1+fNJySonnFtT<#6LUeiWluQ`~}L8%d|833+GtKNEY{@j`k!j5Brf(JcXLe(^O3dXdylotHUQ=8|ejHC=McbeUYxjr&ZhO zWxAJMrM>hzJwtEcld3oI_bqyl-l6yDUDoJ5?uzdi`qBqnK_BuQv~%erUWhN2mea@F zj1Q15LVF4Qled8WTKb&t#rHsa=}UeVpZL6r4_rQ>Z~0UDPRpn7wPI@5hNCt=hgqvd zyNoq$B|Eixc4=XDYnQOD-GKHc&eLweoO=-cck&6^6Wm369={KAf%aD})V|`L4xNh} z#a!$d#eE!=+}AOOOB_qMpJO@Nm3*?Jf%`ie(Khh_$0a<_u?6i`E_2+*LmhYVFvr7O z?s%R@IS%t^$A>)D@h=|d_y+Cwe2UY_6P#UnqO*i6oc(!{b0DAU9LH78#XQ;B$Wxpb z@l@wkJk5DMPj}wQGo1ILZRJ_chj=y;hFQ+NTe%I|>=h}hx zAr829@*3AcUh6uCyS;l0kD9 zeB6!P*t!p#t6$AusSNskeB1XaZmJqIb~FD6RbmJ9wweEnUoL3t82+077oXsNiu6>` zK^w0!>7bJrm~`4onrPDDyeINE!Vf3T{H^eFHo^|RrJhj=Fw2!cfGBhK!f;tGF^%HFr& zDuqO}vXv$$(-=jPNFyr|Ln>2ANlh!|r_vZJ(6oOh_f@mR&SfK}|Em7IQ`US(Ne52`jTP;?Ck>Fz#-zas<3RGPl6ymrxjC0ZNB)VF`{8oMud6r~dTK9Ptftk?kL$)+@x7Nc7(ew{I6k!T(kes|h zYQ;6f<60jxj#^2tWD?dyGt&Y^KX55vE7!vF0J#uS;uf9CpzP;ad66R127^5~l*P5- zZJL#}{vd8v-UJ@w%z5}VQM-raBr{Vkdo)%SBD3VmNBi+>(gB)qoYSqGN+y|e#~~R* z%6ilG<3`Y72Zk##ssNo|e{H_;%qNhsc*P)Z|i!&~u3sUMPu$^01A@)NY2_mPjE zqzn1?bSc`)(O!eTZM+}AGr!2t;|JR!-w#7;Xz)CuUA&_OT30(#s_Jy;Dd*k z@#6PYz7Bmi@N0ZGzmBhz4)Z>K16&Sc_M7N^9Z!$(`@Dxg;kWTA#9vgwrv!!t<+hBa zAMe+yw8i9g|Gotc7Fs|jf`owF}%uf5LR^X2>dPXI3AUIZb5i?-<*Zqcgb%Z`yR zO4oIyz2O=qY0HA?xWoXf-SwOV+!1E6f>Fo2Q9KR>nZtw(}e6Sm|h*#pnftn*a)5B zGmSk5ud8Ltt7Z!X+I2MH5LL)owmDxdt(eY3xl&|@ow;&e78j*ssdLS!d25y{F!rxT z|D!+YADXmm%bOMmrv?|J2qU4R3-Jh!2y`{jJc=X|)LpKw1|sopQh_x76)t#=Wfw9E zOW?SU6FA9E@@r;(BZ!}uC3eyA+K^c%Fj@0NZEKOniZi=MY= zdreyi3a8yC)6L=uo|AQWv3!{}SCJ z?=U9t8GU4Pjc#pX&^2zP%1Nu`Qs literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/PlayerManager.class b/bin/net/slipcor/classranks/managers/PlayerManager.class index 617f9c6b1ad33260fbee25010c7817931aead3f9..d9ef7cc0b412a5ab576c5b48008c82d6b2e341cc 100644 GIT binary patch literal 5760 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 r^yKp6CWUG prices = (Map) getConfig() - .getConfigurationSection("prices").getValues(true); - cmdMgr.moneyCost = new double[prices.size()]; - int i = 0; - for (String Key : prices.keySet()) { - String sVal = (String) prices.get(Key); - try { - cmdMgr.moneyCost[i] = Double.parseDouble(sVal); - db.i("#" + i + " => " - + String.valueOf(Double.parseDouble(sVal))); - } catch (Exception e) { - cmdMgr.moneyCost[i] = 0; - log("Unrecognized cost key '" + String.valueOf(Key) + "': " - + sVal, Level.INFO); - } - i++; - } - } - - if (getConfig().getBoolean("checkexp") - && getConfig().getConfigurationSection("exp") != null) { - // set exp prices - - db.i("exp costs are set, reading..."); - Map expprices = (Map) getConfig() - .getConfigurationSection("exp").getValues(true); - cmdMgr.expCost = new int[expprices.size()]; - int i = 0; - for (String Key : expprices.keySet()) { - String sVal = (String) expprices.get(Key); - try { - cmdMgr.expCost[i] = Integer.parseInt(sVal); - db.i("#" + i + " => " - + String.valueOf(Integer.parseInt(sVal))); - } catch (Exception e) { - cmdMgr.expCost[i] = 0; - log("Unrecognized exp cost key '" + String.valueOf(Key) - + "': " + sVal, Level.INFO); - } - i++; - } - } - - // set subcolors - cmdMgr.getFormatManager().setColors("world", - getConfig().getString("playercolor"), - getConfig().getString("worldcolor")); - - // set other variables - cmdMgr.rankpublic = getConfig().getBoolean("rankpublic", false); - cmdMgr.defaultrankallworlds = getConfig().getBoolean( - "defaultrankallworlds", false); - cmdMgr.onlyoneclass = getConfig().getBoolean("onlyoneclass", true); - trackRanks = getConfig().getBoolean("trackRanks", false); - - boolean signs = getConfig().getBoolean("signcheck", false); - if (signs) { - db.i("sign check activated!"); - cmdMgr.signCheck[0] = getConfig().getString("signchoose", - "[choose]"); - cmdMgr.signCheck[1] = getConfig().getString("signrankup", - "[rankup]"); - cmdMgr.signCheck[2] = getConfig().getString("signrankdown", - "[rankdown]"); - } - - PlayerManager.coolDown = getConfig().getInt("cooldown", 0); - - ItemStack[][] itemStacks = null; - if (getConfig().getBoolean("checkitems") - && getConfig().getConfigurationSection("items") != null) { - db.i("items exist, parsing..."); - Map items = (Map) getConfig() - .getConfigurationSection("items").getValues(false); - if (items == null) { - db.i("items invalid, setting to null"); - itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; - } else { - // for each items => ItemStack[][1,2,3] - int iI = 0; - itemStacks = new ItemStack[items.size()][]; - for (String isKey : items.keySet()) { - List values = getConfig().getList("items." + isKey); - itemStacks[iI] = new ItemStack[values.size()]; - db.i("creating itemstack:"); - for (int iJ = 0; iJ < values.size(); iJ++) { - String[] vValue = (String.valueOf(values.get(iJ))) - .split(":"); - - int vAmount = vValue.length > 1 ? Integer - .parseInt(vValue[1]) : 1; - try { - itemStacks[iI][iJ] = new ItemStack( - Material.valueOf(vValue[0]), vAmount); - - } catch (Exception e) { - try { - itemStacks[iI][iJ] = new ItemStack( - Integer.valueOf(vValue[0]), vAmount); - } catch (Exception e2) { - - log("Unrecognized reagent: " + vValue[0], - Level.WARNING); - continue; - } - } - } - db.i(iI + " - " - + FormatManager.formatItemStacks(itemStacks[iI])); - iI++; - } - } - } - cmdMgr.rankItems = itemStacks; - - Map classRanks = getConfig().getConfigurationSection( - "classes").getValues(false); - for (String sClassName : classRanks.keySet()) { - Map ranks = ((ConfigurationSection) classRanks - .get(sClassName)).getValues(false); - boolean newClass = true; - for (String sRankName : ranks.keySet()) { - - String rankName = null; - String rankColor = "&f"; - double rankCost = -1337D; - ItemStack[] rankItems = null; - int rankExp = -1; - - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".name") != null) { - rankName = getConfig() - .getString( - "classes." + sClassName + "." + sRankName - + ".name"); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".color") != null) { - rankColor = getConfig().getString( - "classes." + sClassName + "." + sRankName - + ".color"); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".price") != null) { - rankCost = Double.valueOf(getConfig().getString( - "classes." + sClassName + "." + sRankName - + ".price")); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".items") != null) { - rankItems = FormatManager - .getItemStacksFromStringList(getConfig() - .getStringList( - "classes." + sClassName + "." - + sRankName + ".items")); - } - if (getConfig().get( - "classes." + sClassName + "." + sRankName + ".exp") != null) { - rankExp = Integer.parseInt(getConfig().getString( - "classes." + sClassName + "." + sRankName + ".exp")); - } - - if (newClass) { - // create class - ClassManager.configClassAdd(sClassName, sRankName, - rankName, rankColor, rankItems, rankCost, rankExp, - null); - - newClass = false; - } else { - ClassManager.configRankAdd(sClassName, sRankName, rankName, - rankColor, rankItems, rankCost, rankExp, null); - } - } - } - setClasses(classRanks); - getConfig().set("cversion", debugVersion); // set new config version - saveConfig(); - } /** * log a prefixed message to the logfile @@ -354,50 +152,6 @@ public void msg(CommandSender sender, String string) { + ChatColor.WHITE + "] " + string); } - /** - * save the classrank map to the config - */ - public void save_config() { - db.i("saving config..."); - for (net.slipcor.classranks.core.Class cClass : ClassManager - .getClasses()) { - db.i(" - " + cClass.name); - for (Rank rRank : cClass.ranks) { - - rRank.debugPrint(); - - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".name", String.valueOf(rRank.getDispName())); - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".color", - String.valueOf("&" - + Integer.toHexString(rRank.getColor() - .ordinal()))); - getConfig().set( - "classes." + cClass.name + "." + rRank.getPermName() - + ".price", String.valueOf(rRank.getCost())); - - if (rRank.getExp() > -1) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".exp", - String.valueOf(rRank.getExp())); - if (rRank.getItems() != null) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".items", - rRank.getItems()); - if (rRank.getCost() != -1337D) - getConfig().set( - "classes." + cClass.name + "." - + rRank.getPermName() + ".price", - String.valueOf(rRank.getCost())); - } - } - saveConfig(); - } private boolean setupEconomy() { @@ -409,11 +163,4 @@ private boolean setupEconomy() return (economy != null); } - public Map getClasses() { - return classes; - } - - private void setClasses(Map classes) { - this.classes = classes; - } } diff --git a/src/net/slipcor/classranks/core/Class.java b/src/net/slipcor/classranks/core/Class.java index 7658d9f..07b6bfe 100644 --- a/src/net/slipcor/classranks/core/Class.java +++ b/src/net/slipcor/classranks/core/Class.java @@ -7,6 +7,8 @@ /** * class class + * - ClassName + * - Array of Ranks * * @version v0.3.0 * diff --git a/src/net/slipcor/classranks/core/PlayerClassList.java b/src/net/slipcor/classranks/core/PlayerClassList.java new file mode 100644 index 0000000..e9c2383 --- /dev/null +++ b/src/net/slipcor/classranks/core/PlayerClassList.java @@ -0,0 +1,114 @@ +package net.slipcor.classranks.core; + +import java.util.ArrayList; +import java.util.Iterator; + +/** + * + * @author Windu + * + * define a player Class Rank List object + * will be used to track player classes + */ +public class PlayerClassList { + + private String playerName; + + private ArrayList playerClassRanks; + + public PlayerClassList(String playerName, + ArrayList playerClassRanks) { + super(); + this.playerName = playerName; + this.playerClassRanks = playerClassRanks; + } + + public void setPlayerName(String playerName) { + this.playerName = playerName; + } + + public String getPlayerName() { + return this.playerName; + } + + public boolean equalsIgnoreCaseName(String playerName) { + return playerName.equalsIgnoreCase(playerName); + } + + public boolean addPlayerClassRank (String className, String rankName) { + + if (playerClassRanks == null) { + playerClassRanks = new ArrayList(); + } + playerClassRanks.add(new PlayerClassRank(className, rankName)); + + return true; + } + + public PlayerClassRank getPlayerClassRank(int index) { + + return playerClassRanks.get(index); + } + + public String getPlayerClass(int index) { + + return playerClassRanks.get(index).className; + } + + public String getPlayerRank(int index) { + + return playerClassRanks.get(index).rankName; + } + + + public boolean equalsIgnoreCaseClass(String className) { + boolean isfound = false; + for (Iterator item = playerClassRanks.iterator(); item.hasNext(); ) { + if ( item.next().className.equalsIgnoreCase(className)) { + isfound = true; + } + } + return isfound; + } + + public boolean equalsIgnoreCaseRank(String rankName) { + boolean isfound = false; + for (Iterator item = playerClassRanks.iterator(); item.hasNext(); ) { + if ( item.next().rankName.equalsIgnoreCase(rankName)) { + isfound = true; + } + } + return isfound; + } + + @SuppressWarnings("null") + public int getClassIndex(String className) { + int found = -1; + PlayerClassRank[] items = null; + if (playerClassRanks.size() > 0) { + playerClassRanks.toArray(items); + for (int i=0; i 0) { + playerClassRanks.toArray(items); + for (int i=0; i OUT } db.i("we want to check for sign usage!"); @@ -76,19 +76,19 @@ public void onPlayerInteract(PlayerInteractEvent event) { // we clicked a sign! Sign s = (Sign) bBlock.getState(); - if (s.getLine(0).equals(cmdMgr.signCheck[0])) { + if (s.getLine(0).equals(plugin.config.getSigns()[0])) { db.i("parsing command " + s.getLine(1)); String[] sArgs = {s.getLine(1)}; // parse the command! cmdMgr.parseCommand(event.getPlayer(), sArgs); } else { db.i("searching for rank commands"); for (int i = 0 ; i <= 3; i++) { - if (s.getLine(i).equals(cmdMgr.signCheck[1])) { + if (s.getLine(i).equals(plugin.config.getSigns()[1])) { db.i("rankup found, parsing..."); String[] sArgs = {"rankup"}; cmdMgr.parseCommand(event.getPlayer(), sArgs); return; - } else if (s.getLine(i).equals(cmdMgr.signCheck[2])) { + } else if (s.getLine(i).equals(plugin.config.getSigns()[2])) { db.i("rankup found, parsing"); String[] sArgs = {"rankdown"}; cmdMgr.parseCommand(event.getPlayer(), sArgs); diff --git a/src/net/slipcor/classranks/managers/ClassManager.java b/src/net/slipcor/classranks/managers/ClassManager.java index ad6d9d4..271b9ab 100644 --- a/src/net/slipcor/classranks/managers/ClassManager.java +++ b/src/net/slipcor/classranks/managers/ClassManager.java @@ -12,7 +12,8 @@ import org.bukkit.inventory.ItemStack; /** - * class manager class + * class manager class + * - Array of Classes * * @version v0.4.4.2 * @@ -25,7 +26,7 @@ public class ClassManager { private static DebugManager db; public ClassManager(ClassRanks cr) { - plugin = cr; + ClassManager.plugin = cr; db = new DebugManager(cr); } @@ -47,8 +48,9 @@ public static String getFirstPermNameByClassName(String cString) { public static String getFirstPermNameByClassName(String cString, String sPlayer) { // extended version: get rank for (Class c : classes) { - if (c.name.equals(cString)) + if (c.name.equals(cString)) { return c.ranks.get(ClassManager.loadClassProcess(Bukkit.getPlayer(sPlayer), c)).getPermName(); + } } return null; } @@ -116,7 +118,7 @@ public static boolean configClassRemove(String sClassName, Player pPlayer) { if (cClass != null) { classes.remove(cClass); plugin.msg(pPlayer, "Class removed: " + sClassName); - plugin.save_config(); + plugin.config.save_config(); return true; } plugin.msg(pPlayer, "Class not found: " + sClassName); @@ -131,7 +133,7 @@ public static boolean configRankRemove(String sClassName, String sPermName, Play ChatColor cColor = rank.getColor(); cClass.ranks.remove(rank); plugin.msg(pPlayer, "Rank removed: " + cColor + sPermName); - plugin.save_config(); + plugin.config.save_config(); return true; } plugin.msg(pPlayer, "Rank not found: " + sPermName); @@ -144,7 +146,8 @@ public static boolean configRankRemove(String sClassName, String sPermName, Play public static boolean configClassAdd(String sClassName, String sPermName, String sDispName, String sColor, ItemStack[] isItems, double dCost, int iExp, Player pPlayer) { Class cClass = getClassbyClassName(sClassName); - if (cClass == null) { + if (cClass == null) + { Class c = new Class(sClassName); c.add(sPermName, sDispName, (FormatManager.formatColor(sColor)), isItems, dCost, iExp); classes.add(c); @@ -152,14 +155,14 @@ public static boolean configClassAdd(String sClassName, String sPermName, String db.i("Class added: " + sClassName); else plugin.msg(pPlayer, "Class added: " + sClassName); - plugin.save_config(); + plugin.config.save_config(); return true; } if (pPlayer == null) db.i("Class already exists: " + sClassName); else - plugin.msg(pPlayer, "Class already exists: " + sClassName); + plugin.msg(pPlayer, "Class already exists for " + pPlayer); return true; } @@ -168,10 +171,14 @@ public static boolean configRankAdd(String sClassName, String sPermName, String if (cClass != null) { cClass.ranks.add(new Rank(sPermName, sDispName, (FormatManager.formatColor(sColor)), cClass, isItems, dCost, iExp)); if (pPlayer == null) + { db.i("Rank added: " + (FormatManager.formatColor(sColor)) + sPermName); - else - plugin.msg(pPlayer, "Rank added: " + (FormatManager.formatColor(sColor)) + sPermName); - plugin.save_config(); + plugin.config.save_config(); + } else + { + plugin.msg(pPlayer, "Rank added: " + (FormatManager.formatColor(sColor)) + sPermName +"/"+pPlayer); + plugin.config.save_config(); + } return true; } if (pPlayer == null) @@ -186,7 +193,7 @@ public static boolean configClassChange(String sClassName, String sClassNewName, if (cClass != null) { cClass.name = sClassNewName; plugin.msg(pPlayer, "Class changed: " + sClassName + " => " + sClassNewName); - plugin.save_config(); + plugin.config.save_config(); return true; } plugin.msg(pPlayer, "Class not found: " + sClassName); @@ -201,7 +208,7 @@ public static boolean configRankChange(String sClassName, String sPermName, Stri rank.setDispName(sDispName); rank.setColor((FormatManager.formatColor(sColor))); plugin.msg(pPlayer, "Rank updated: " + (FormatManager.formatColor(sColor)) + sPermName); - plugin.save_config(); + plugin.config.save_config(); return true; } plugin.msg(pPlayer, "Rank not found: " + sPermName); diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java index e093ec7..c5fe8a6 100644 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ b/src/net/slipcor/classranks/managers/CommandManager.java @@ -20,11 +20,6 @@ * @version v0.4.3 * * @author slipcor - * - * issues - * id=14 - * id=16 - * */ public class CommandManager { @@ -36,12 +31,10 @@ public class CommandManager { public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP // Costs - public boolean rankpublic; // do we spam changed to the public? - public boolean defaultrankallworlds; // do ppl rank themselves in all - // worlds? - public boolean onlyoneclass; // only maintain oneass - public ItemStack[][] rankItems; - public String[] signCheck = { null, null, null }; // SignCheck variable +// public boolean rankpublic; // do we spam changed to the public? +// public boolean onlyoneclass; // only maintain oneass +// public ItemStack[][] rankItems; +// public String[] signCheck = { null, null, null }; // SignCheck variable public CommandManager(ClassRanks plugin) { this.plugin = plugin; @@ -52,9 +45,12 @@ public CommandManager(ClassRanks plugin) { /* * This function provides the main ranking process - including error - * messages when stuff is not right. - check if permissions are there - get - * old rank - calculate new rank - eventually delete from old rank - add to - * new rank + * messages when stuff is not right. + * - check if permissions are there + * - get old rank + * - calculate new rank + * - eventually delete from old rank + * - add to new rank */ public boolean rank(String[] args, Player comP) { db.i("ranking " + comP.getName() + " : " + FormatManager.formatStringArray(args)); @@ -77,7 +73,7 @@ public boolean rank(String[] args, Player comP) { db.i("perm check successful"); - String World = defaultrankallworlds ? "all" : comP.getWorld().getName(); // store + String World = plugin.config.isDefaultrankallworlds() ? "all" : comP.getWorld().getName(); // store // the // player's // world @@ -184,8 +180,8 @@ public boolean rank(String[] args, Player comP) { return true; } } - - items = rankItems != null ? rankItems[cRank + 1] : null; + ItemStack[][] rankItems = plugin.config.getRankItems(); + items = rankItems != null ?rankItems[cRank + 1] : null; if (rNext.getItemstacks() != null) { items = rNext.getItemstacks(); @@ -249,7 +245,7 @@ public boolean rank(String[] args, Player comP) { } } - if (onlyoneclass || rankOffset < 0) { + if (plugin.config.isOnlyoneclass() || rankOffset < 0) { // up and only OR down db.i("removing old class..."); plugin.perms.rankRemove(World, changePlayer, cPermName); @@ -285,7 +281,7 @@ public boolean rank(String[] args, Player comP) { } } - if (self && !rankpublic) { + if (self && ! plugin.config.isRankpublic()) { // we rank ourselves and do NOT want that to be public plugin.msg(comP, "You are now a " + c_Color + cDispName + ChatColor.WHITE @@ -303,32 +299,25 @@ public boolean rank(String[] args, Player comP) { } /** - * printout Class and/or Class Ranks + * printout Classas and/or Class Ranks * * @param pPlayer * @param args */ private void cmdList (Player pPlayer, String[] args) { ArrayList classes = ClassManager.getClasses(); + plugin.msg(pPlayer, ChatColor.YELLOW+"Class / Rank List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - pPlayer.sendMessage(ChatColor.YELLOW+"Class / Rank List"); - pPlayer.sendMessage(ChatColor.YELLOW+"--------------------"); - // check for Classlist or Classranklist - if (args.length > 1 ) { - // Do Class Rank List - for (Class c : classes) { - if (args[1].equalsIgnoreCase(c.name)) { - pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); - for (Rank r : c.ranks) { - pPlayer.sendMessage("=> " + ChatColor.GREEN + r.getDispName()); - } - } + for (Class c : classes) { + if (c.name.startsWith("%") && !pPlayer.isOp()) { + continue; } - - } else { - // Do Class List - for (Class c : classes) { - pPlayer.sendMessage("Class "+ ChatColor.GREEN + c.name); + if (args[1].equalsIgnoreCase(c.name)) { + plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); + for (Rank r : c.ranks) { + plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); + } } } @@ -371,6 +360,24 @@ private void cmdGet (Player pPlayer, String[] args) { } + private void cmdConfig (Player pPlayer, String[] args) + { + plugin.msg(pPlayer, ChatColor.YELLOW+"Class Config Data"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + plugin.msg(pPlayer, ChatColor.GREEN+"Debug : "+plugin.config.isDebug().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"Prices : "+plugin.config.isCheckprices().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"Items : "+plugin.config.isCheckitems().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"Exp : "+plugin.config.isCheckexp().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"OneClass: "+plugin.config.isOnlyoneclass().toString()); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + Double[] MoneyCost = plugin.config.getMoneyCost(); + + for (int i = 0; i < MoneyCost.length; i++) + { + plugin.msg(pPlayer, ChatColor.YELLOW+": "+MoneyCost[i].toString()); + } + } // private void cmdTemp (Player pPlayer, String[] args) { // // } @@ -381,21 +388,23 @@ private void cmdGet (Player pPlayer, String[] args) { * The main switch for the command usage. Check for known commands, * permissions, arguments, and commit whatever is wanted. */ - public boolean parseCommand(Player pPlayer, String[] args) { + public boolean parseCommand(Player pPlayer, String[] args) + { db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); - if (args.length > 1) { + if (args.length > 1) + { if (args[0].equalsIgnoreCase("list")) { // Command list of Ranks in the Class 3.2 cmdList(pPlayer,args); return true; - } else if (args[0].equalsIgnoreCase("get")) { + } + if (args[0].equalsIgnoreCase("get")) { // Command Get 3.2 cmdGet(pPlayer, args); return true; } - // more than /class or /class rankup if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", pPlayer.getWorld().getName())) { @@ -425,8 +434,9 @@ public boolean parseCommand(Player pPlayer, String[] args) { // add / remove boolean self = true; - String world = defaultrankallworlds ? "all" : pPlayer.getWorld() - .getName(); + // preset of World name + String world = plugin.config.isDefaultrankallworlds() ? "all" : pPlayer.getWorld().getName(); + if (args[0].equalsIgnoreCase("remove")) { if (args.length > 2) { // => /class remove *name* world @@ -590,7 +600,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { // plugin.perms.classAdd(world, args[1], cPermName); } - if ((rankpublic) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { + if ((plugin.config.isRankpublic()) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { plugin.getServer().broadcastMessage( "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + "] " + fm.formatPlayer(args[1]) @@ -600,13 +610,20 @@ public boolean parseCommand(Player pPlayer, String[] args) { plugin.msg(pPlayer, "You now are a " + c_Color + cDispName); return true; } - } else if (args.length > 0) { + } + if (args.length > 0) + { // only ONE argument! + if (args[0].equalsIgnoreCase("config")) { + // Command list of Ranks in the Class 3.2 + cmdConfig(pPlayer, args); + return true; + } if (args[0].equalsIgnoreCase("reload")) { // Command reload if (pPlayer.isOp()) { - plugin.load_config(); + plugin.config.load_config(); plugin.msg(pPlayer, "Config reloaded!"); } else { plugin.msg(pPlayer, "You don't have permission to reload!"); @@ -655,7 +672,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { if (plugin.trackRanks) { ClassManager.saveClassProgress(pPlayer); } - plugin.perms.rankRemove(defaultrankallworlds ? "all" : pPlayer + plugin.perms.rankRemove(plugin.config.isDefaultrankallworlds() ? "all" : pPlayer .getWorld().getName(), pPlayer.getName(), rank .getPermName()); @@ -666,7 +683,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { + cDispName + ChatColor.WHITE + " in " - + fm.formatWorld(defaultrankallworlds ? "all" + + fm.formatWorld(plugin.config.isDefaultrankallworlds() ? "all" : pPlayer.getWorld().getName()) + "!"); return true; } else if (args[0].equalsIgnoreCase("add")) { @@ -675,11 +692,29 @@ public boolean parseCommand(Player pPlayer, String[] args) { plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); return true; - } else if (args[0].equalsIgnoreCase("list")) { + } + if (args[0].equalsIgnoreCase("list")) + { // Command list Classes - cmdList(pPlayer, args); // Krglok id=14 + ArrayList classes = ClassManager.getClasses(); + plugin.msg(pPlayer, ChatColor.YELLOW+"Class List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + for (Class c : classes) { + if (c.name.startsWith("%") && !pPlayer.isOp()) { + continue; + } + plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); +// for (Rank r : c.ranks) { +// plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); +// } + } return true; } + if (args[0].equalsIgnoreCase("info")) + { + + } // /class [classname] if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer @@ -789,6 +824,7 @@ public boolean parseCommand(Player pPlayer, String[] args) { db.i("exp check successful"); ItemStack[] items = null; + ItemStack[][] rankItems = plugin.config.getRankItems(); if (rankItems != null && (rankItems[rID] != null) && (!FormatManager.formatItemStacks(rankItems[rID]).equals( @@ -825,9 +861,9 @@ public boolean parseCommand(Player pPlayer, String[] args) { plugin.perms.removeGroups(pPlayer); } - plugin.perms.rankAdd(defaultrankallworlds ? "all" : pPlayer + plugin.perms.rankAdd(plugin.config.isDefaultrankallworlds() ? "all" : pPlayer .getWorld().getName(), pPlayer.getName(), cPermName); - if (rankpublic) { + if (plugin.config.isRankpublic()) { plugin.getServer().broadcastMessage( "Player " + fm.formatPlayer(pPlayer.getName()) + " has chosen a class, now has the rank " @@ -868,7 +904,8 @@ public boolean parseCommand(Player pPlayer, String[] args) { return false; } - public boolean parseAdminCommand(Player pPlayer, String[] args) { + public boolean parseAdminCommand(Player pPlayer, String[] args) + { db.i("parsing admin " + pPlayer.getName() + ", command: " + FormatManager.formatStringArray(args)); @@ -915,34 +952,43 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) { } // second argument unknown return false; - } else if (args[0].equalsIgnoreCase("add")) { + } + if (args[0].equalsIgnoreCase("add")) { - /* + /* Add Class and first Rank * /classadmin add class *classname* *rankname* *displayname* - * *color* /classadmin add rank *classname* *rankname* *displayname* + * *color* + * + * Add Rank to Class + * /classadmin add rank *classname* *rankname* *displayname* * *color* */ - - if (args.length != 6) { ///krglok id=16 + if (args.length != 9) + { plugin.msg( pPlayer, "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); + + String.valueOf(args.length) + ") should be 9 !"); return false; } - if (args[1].equalsIgnoreCase("class")) {// , ItemStack[] isItems, - // double dCost, int iExp + + if (args[1].equalsIgnoreCase("class")) + {// , ItemStack[] isItems, double dCost, int iExp + return ClassManager.configClassAdd(args[2], args[3], args[4], args[5], FormatManager.getItemStacksFromCommaString(args[6]), Double.parseDouble(args[7]), Integer.parseInt(args[8]), - pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { + null); //pPlayer); + } + if (args[1].equalsIgnoreCase("rank")) + { + return ClassManager.configRankAdd(args[2], args[3], args[4], args[5], FormatManager.getItemStacksFromCommaString(args[6]), Double.parseDouble(args[7]), Integer.parseInt(args[8]), - pPlayer); + null); //pPlayer); } // second argument unknown return false; diff --git a/src/net/slipcor/classranks/managers/ConfigManager.java b/src/net/slipcor/classranks/managers/ConfigManager.java new file mode 100644 index 0000000..bdbec6e --- /dev/null +++ b/src/net/slipcor/classranks/managers/ConfigManager.java @@ -0,0 +1,482 @@ +package net.slipcor.classranks.managers; + +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.ItemStack; +//import org.bukkit.plugin.Plugin; +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Rank; + +/* + * this Class read the config and make it persistaned + * each config node will be stored here. + * + */ +public class ConfigManager { + public ClassRanks plugin; + + public static String debugVersion = "0400"; + + private Map classes; + public Map getClasses() { + return classes; + } +// private void setClasses(Map classes) { +// this.classRanks = classes; +// } + + private Map players; + + public Map getPlayers() { + return players; + } + + private Map playerClassList; + + private Map playerClassRank; + + private Double[] moneyCost; + public Double[] getMoneyCost() { + return moneyCost; + } + public void setMoneyCost(Double[] moneyCost) { + this.moneyCost = moneyCost; + } + private int[] expCost; //= new int[ClassManager.getClasses().size()]; // EXP + public int[] getExpCost() { + return expCost; + } + + + public ConfigManager(ClassRanks plugin) { + super(); + this.plugin = plugin; + } + + private Boolean debug; + public Boolean isDebug() { + return debug; + } + public void setDebug(Boolean debug) { + this.debug = debug; + } + + private Boolean checkprices; + public Boolean isCheckprices() { + return checkprices; + } + public void setCheckprices(Boolean checkprices) { + this.checkprices = checkprices; + } + + private Map prices; + public Map getPrices() { + return prices; + } + public void setPrices(Map prices) { + this.prices = prices; + } + + private Boolean checkexp; + public Boolean isCheckexp() { + return checkexp; + } + public void setCheckexp(Boolean checkexp) { + this.checkexp = checkexp; + } + + private Map expprices; + public Map getExpprices() { + return expprices; + } + public void setExpprices(Map expprices) { + this.expprices = expprices; + } + + private Boolean trackRanks; + public Boolean isTrackRanks() { + return trackRanks; + } + public void setTrackRanks(Boolean trackRanks) { + this.trackRanks = trackRanks; + } + + private Boolean rankPublic; + public Boolean isRankpublic() { + return rankPublic; + } + public void setRankpublic(Boolean rankpublic) { + this.rankPublic = rankpublic; + } + + private Boolean signcheck; + public Boolean isSigncheck() { + return signcheck; + } + public void setSigncheck(Boolean signcheck) { + this.signcheck = signcheck; + } + + private String[] signs; + public String[] getSigns() { + return signs; + } + public void setSigns(String[] signs) { + this.signs = signs; + } + + private int coolDown; + public int getCoolDown() { + return coolDown; + } + public void setCoolDown(int coolDown) { + this.coolDown = coolDown; + } + + private ItemStack[][] itemStacks; + public ItemStack[][] getItemStacks() { + return itemStacks; + } + public void setItemStacks(ItemStack[][] itemStacks) { + this.itemStacks = itemStacks; + } + + private Boolean checkitems; + public Boolean isCheckitems() { + return checkitems; + } + public void setCheckitems(Boolean checkitems) { + this.checkitems = checkitems; + } + + private Map items; + public Map getItems() { + return items; + } + public void setItems(Map items) { + this.items = items; + } + + private ItemStack[][] rankItems; + public ItemStack[][] getRankItems() { + return rankItems; + } + public void setRankItems(ItemStack[][] rankItems) { + this.rankItems = rankItems; + } + + private boolean defaultRankAllWorlds; // do rank themselves in all worlds? + public Boolean isDefaultrankallworlds() { + return defaultRankAllWorlds; + } + public void setDefaultrankallworlds(boolean defaultrankallworlds) { + this.defaultRankAllWorlds = defaultrankallworlds; + } + + private boolean onlyOneClass; + public Boolean isOnlyoneclass() { + return onlyOneClass; + } + public void setOnlyoneclass(boolean onlyoneclass) { + this.onlyOneClass = onlyoneclass; + } + + + + public void load_config() { + + if (plugin.getConfig() == null + || !plugin.getConfig().getString("cversion").equals(debugVersion)) + { + plugin.log("creating default config.yml", Level.INFO); + plugin.getConfig().set("cversion", debugVersion); + plugin.getConfig().options().copyDefaults(true); + plugin.saveConfig(); + } +// DebugManager.active = plugin.getConfig().getBoolean("debug", false); + debug = plugin.getConfig().getBoolean("debug", false); + + // check for section is available + checkprices = plugin.getConfig().getBoolean("checkprices", false); + boolean isSection = false; + if (plugin.getConfig().getConfigurationSection("prices") != null) + { + isSection = true; + } + + if ( isCheckprices() && isSection) { + plugin.db.i("prices are already set, reading..."); + // set prices + prices = (Map) plugin.getConfig().getConfigurationSection("prices").getValues(true); + + if (prices.size() > 0) + { + moneyCost = new Double[prices.size()]; + } else + { + moneyCost = new Double[1]; + } + + int i = 0; + for (String Key : prices.keySet()) { + String sVal = (String) prices.get(Key); + try { + moneyCost[i] = Double.parseDouble(sVal); + plugin.db.i("#" + i + " => " + + String.valueOf(Double.parseDouble(sVal))); + } catch (Exception e) { + moneyCost[i] = 0.0; + plugin.log("Unrecognized cost key '" + String.valueOf(Key) + "': " + + sVal, Level.INFO); + } + i++; + } + } + + // check for section is available + + checkexp = plugin.getConfig().getBoolean("checkexp", false); + isSection = (plugin.getConfig().getConfigurationSection("exp") != null); + if ((isCheckexp()) && (isSection)) { + // set exp prices + plugin.db.i("exp costs are set, reading..."); + + expprices = (Map) plugin.getConfig().getConfigurationSection("exp").getValues(true); +// cmdMgr.expCost = new int[expprices.size()]; + + int i = 0; + for (String Key : expprices.keySet()) { + String sVal = (String) expprices.get(Key); + try { + plugin.cmdMgr.expCost[i] = Integer.parseInt(sVal); + plugin.db.i("#" + i + " => " + + String.valueOf(Integer.parseInt(sVal))); + } catch (Exception e) { + + expCost = new int[i+1]; + expCost[i] = 0; + plugin.log("Unrecognized exp cost key '" + String.valueOf(Key) + + "': " + sVal, Level.INFO); + } + i++; + } + } + + // set subcolors + plugin.cmdMgr.getFormatManager().setColors("world", + plugin.getConfig().getString("playercolor"), + plugin.getConfig().getString("worldcolor")); + + // set other variables + rankPublic = plugin.getConfig().getBoolean("rankpublic", false); + + defaultRankAllWorlds = plugin.getConfig().getBoolean("defaultrankallworlds", false); + + onlyOneClass = plugin.getConfig().getBoolean("onlyoneclass", true); + + trackRanks = plugin.getConfig().getBoolean("trackRanks", false); + + // Sign + signcheck = plugin.getConfig().getBoolean("signcheck", false); + + if (signcheck) { + plugin.db.i("sign check activated!"); + signs[0] = plugin.getConfig().getString("signchoose", + "[choose]"); + signs[1] = plugin.getConfig().getString("signrankup", + "[rankup]"); + signs[2] = plugin.getConfig().getString("signrankdown", + "[rankdown]"); + } + + ///PlayerManager.coolDown = plugin.getConfig().getInt("cooldown", 0); + coolDown = plugin.getConfig().getInt("cooldown", 0); + + itemStacks = null; + checkitems = plugin.getConfig().getBoolean("checkitems"); + + // check section is available + isSection = plugin.getConfig().getConfigurationSection("items") != null; + // item read and check + if (isCheckitems() && isSection) { + plugin.db.i("items exist, parsing..."); + + items = (Map) plugin.getConfig() + .getConfigurationSection("items").getValues(false); + // items error check + if (items == null) { + plugin.db.i("items invalid, setting to null"); + itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; + } else { + // for each items => ItemStack[][1,2,3] + int iI = 0; + itemStacks = new ItemStack[items.size()][]; + for (String isKey : items.keySet()) { + List values = plugin.getConfig().getList("items." + isKey); + itemStacks[iI] = new ItemStack[values.size()]; + plugin.db.i("creating itemstack:"); + for (int iJ = 0; iJ < values.size(); iJ++) { + String[] vValue = (String.valueOf(values.get(iJ))) + .split(":"); + + int vAmount = vValue.length > 1 ? Integer + .parseInt(vValue[1]) : 1; + try { + itemStacks[iI][iJ] = new ItemStack( + Material.valueOf(vValue[0]), vAmount); + + } catch (Exception e) { + try { + itemStacks[iI][iJ] = new ItemStack( + Integer.valueOf(vValue[0]), vAmount); + } catch (Exception e2) { + + plugin.log("Unrecognized reagent: " + vValue[0], + Level.WARNING); + continue; + } + } + } + plugin.db.i(iI + " - " + + FormatManager.formatItemStacks(itemStacks[iI])); + iI++; + } + } + } + setRankItems(itemStacks); + + // read basis class and ranks initialize the object + classes = plugin.getConfig().getConfigurationSection("classes").getValues(false); + for (String sClassName : classes.keySet()) { + Map ranks = ((ConfigurationSection) classes + .get(sClassName)).getValues(false); + boolean newClass = true; + for (String sRankName : ranks.keySet()) { + + String rankName = null; + String rankColor = "&f"; + double rankCost = -1337D; + ItemStack[] rankItems = null; + int rankExp = -1; + + if (plugin.getConfig().get( + "classes." + sClassName + "." + sRankName + ".name") != null) { + rankName = plugin.getConfig() + .getString( + "classes." + sClassName + "." + sRankName + + ".name"); + } + if (plugin.getConfig().get( + "classes." + sClassName + "." + sRankName + ".color") != null) { + rankColor = plugin.getConfig().getString( + "classes." + sClassName + "." + sRankName + + ".color"); + } + if (plugin.getConfig().get( + "classes." + sClassName + "." + sRankName + ".price") != null) { + rankCost = Double.valueOf(plugin.getConfig().getString( + "classes." + sClassName + "." + sRankName + + ".price")); + } + if (plugin.getConfig().get( + "classes." + sClassName + "." + sRankName + ".items") != null) { + rankItems = FormatManager + .getItemStacksFromStringList(plugin.getConfig() + .getStringList( + "classes." + sClassName + "." + + sRankName + ".items")); + } + if (plugin.getConfig().get( + "classes." + sClassName + "." + sRankName + ".exp") != null) { + rankExp = Integer.parseInt(plugin.getConfig().getString( + "classes." + sClassName + "." + sRankName + ".exp")); + } + + if (newClass) { + // create class + ClassManager.configClassAdd(sClassName, sRankName, + rankName, rankColor, rankItems, rankCost, rankExp, + null); + + newClass = false; + } else { + ClassManager.configRankAdd(sClassName, sRankName, rankName, + rankColor, rankItems, rankCost, rankExp, null); + } + } + } + +// getConfig().getString("progress."+pPlayer.getName()); + + plugin.saveConfig(); + } + + /** + * + */ + public void readPlayerSection() { + boolean isSection = (plugin.getConfig().getConfigurationSection("players") != null); + if (!isSection) { + players = null; + } else { + players = plugin.getConfig().getConfigurationSection("players").getValues(false); + + for (String sClassName : players.keySet()) { + + + } + } + + } + + /** + * save the classrank map to the config + */ + public void save_config() { + plugin.db.i("saving config..."); + for (net.slipcor.classranks.core.Class cClass : ClassManager + .getClasses()) { + plugin.db.i(" - " + cClass.name); + for (Rank rRank : cClass.ranks) { + + rRank.debugPrint(); + + plugin.getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".name", String.valueOf(rRank.getDispName())); + plugin.getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".color", + String.valueOf("&" + + Integer.toHexString(rRank.getColor() + .ordinal()))); + plugin.getConfig().set( + "classes." + cClass.name + "." + rRank.getPermName() + + ".price", String.valueOf(rRank.getCost())); + + if (rRank.getExp() > -1) + plugin.getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".exp", + String.valueOf(rRank.getExp())); + if (rRank.getItems() != null) + plugin.getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".items", + rRank.getItems()); + if (rRank.getCost() != -1337D) + plugin.getConfig().set( + "classes." + cClass.name + "." + + rRank.getPermName() + ".price", + String.valueOf(rRank.getCost())); + } + } + plugin.saveConfig(); + } + + +} diff --git a/src/net/slipcor/classranks/managers/PlayerClassManager.java b/src/net/slipcor/classranks/managers/PlayerClassManager.java new file mode 100644 index 0000000..5cf6d53 --- /dev/null +++ b/src/net/slipcor/classranks/managers/PlayerClassManager.java @@ -0,0 +1,58 @@ +package net.slipcor.classranks.managers; + +import net.slipcor.classranks.core.*; + +import java.util.ArrayList; +import java.util.Iterator; + +public class PlayerClassManager { + + private ArrayList playerClassList; + + public ArrayList getPlayerClassList() { + return playerClassList; + } + +// public void setPlayerClassList(ArrayList playerClassList) { +// this.playerClassList = playerClassList; +// } + + public PlayerClassManager() { + super(); + this.playerClassList = new ArrayList(); + } + + /* + * add player to list + * prevent double entrys + */ + public void addPlayer(String playerName) { + + // player not found make player entry + if (!checkPlayerName(playerName)) { + playerClassList.add(new PlayerClassList(playerName, null)); + } + + } + + /* + * checks for playername in list + */ + public boolean checkPlayerName(String playerName) { + + if (playerClassList.isEmpty()) { + return false; + } + boolean isfound = false; + for (Iterator item = playerClassList.iterator(); item.hasNext(); ) { + if ( item.next().equalsIgnoreCaseName(playerName)) { + isfound = true; + } + } + return isfound; + + } + + + +} diff --git a/src/net/slipcor/classranks/managers/PlayerManager.java b/src/net/slipcor/classranks/managers/PlayerManager.java index 6788441..7a40c91 100644 --- a/src/net/slipcor/classranks/managers/PlayerManager.java +++ b/src/net/slipcor/classranks/managers/PlayerManager.java @@ -16,6 +16,8 @@ /* * Player manager class + * - handles the cooldown , cooldown stored in yml + * - handles Inventory of player and Items * * v0.2.0 - mayor rewrite; no SQL; multiPermissions * @@ -31,7 +33,7 @@ public class PlayerManager { private final ClassRanks plugin; private static DebugManager db; - public static int coolDown; +// public static int coolDown; public PlayerManager(ClassRanks plugin) { this.plugin = plugin; @@ -93,18 +95,18 @@ boolean ifHasTakeItems(Player iPlayer, ItemStack[] isItems) { } int coolDownCheck(Player comP) { - if ((comP.isOp()) || (coolDown == 0)) { + if ((comP.isOp()) || (plugin.config.getCoolDown() == 0)) { return 0; // if we do not want/need to calculate the cooldown, get out of here! } db.i("calculating cooldown"); File fConfig = new File(plugin.getDataFolder(),"cooldowns.yml"); - YamlConfiguration config = new YamlConfiguration(); + YamlConfiguration configCool = new YamlConfiguration(); if(fConfig.isFile()){ try { - config.load(fConfig); + configCool.load(fConfig); } catch (FileNotFoundException e) { plugin.log("File not found!", Level.SEVERE); e.printStackTrace(); @@ -119,17 +121,17 @@ int coolDownCheck(Player comP) { } else { Map cdx = new HashMap(); cdx.put("slipcor", 0); - config.addDefault("cooldown", cdx); + configCool.addDefault("cooldown", cdx); } - Map cds = (Map) config.getConfigurationSection("cooldown").getValues(true); + Map cds = (Map) configCool.getConfigurationSection("cooldown").getValues(true); int now = Math.round((System.currentTimeMillis() % (60*60*24*1000)) /1000); if (cds.containsKey(comP.getName())) { db.i("player cooldown found!"); // Subtract the seconds waited from the needed seconds - int cd = coolDown - (now - (Integer) cds.get(comP.getName())); - if ((cd <= coolDown) && (cd > 0)) { + int cd = plugin.config.getCoolDown() - (now - (Integer) cds.get(comP.getName())); + if ((cd <= plugin.config.getCoolDown()) && (cd > 0)) { db.i("cooldown still is: "+cd); return cd; // we still have to wait, return how many seconds } @@ -140,9 +142,9 @@ int coolDownCheck(Player comP) { cds.put(comP.getName(), now); db.i("value set"); - config.set("cooldown", cds); + configCool.set("cooldown", cds); try { - config.save(fConfig); + configCool.save(fConfig); } catch (IOException e) { plugin.log("IO Exception!", Level.SEVERE); e.printStackTrace(); diff --git a/src/plugin.yml b/src/plugin.yml index 8af45d8..39802d0 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,9 +1,9 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.4.4 +version: 0.4.5 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ -soft-depends: [Vault] +soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] commands: class: description: Lets users choose a class / change classes @@ -15,6 +15,7 @@ commands: /class [rankup/rankdown] | Rank yourself up/down /class get [username] {world} | Get the active rank of a user /class list {classname} | list of class or class / rank + /class config | list configuration rankdown: description: Rank down yourself or others usage: | @@ -25,9 +26,12 @@ commands: /rankup [username] | Rank up yourself or username classadmin: description: Administrate the classes + usage: | - /classadmin add class [classname] [permname] [displayname] [color] - /classadmin add rank [classname] [permname] [displayname] [color] + add class and first rank + /classadmin add class [classname] [permname] [displayname] [color] [item|0] [cost] [exp] + add rank for class + /classadmin add rank [classname] [permname] [displayname] [color] [item|0] [cost] [exp] /classadmin change class [classname] [newname] /classadmin change rank [classname] [rankname] [displayname] [color] /classadmin remove class [classname] From 28cc71655bbaf5baca6f1076a7049a512908daf3 Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 10 Apr 2013 08:56:10 +0300 Subject: [PATCH 08/29] Create README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..b05a084 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +ClassRanks +========== + +Manage Permission groups and add ranking! Tired of adding people to your Permissions' yml files? So was I, so I coded this little plugin. Just say /class and easily rank people up and down in your prepared Permissions groups From eba273a26e1d40ca98dda1d4ef1ef0e574123561 Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 10 Apr 2013 08:58:42 +0300 Subject: [PATCH 09/29] Update README.md --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b05a084..ffa0db8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,18 @@ ClassRanks ========== -Manage Permission groups and add ranking! Tired of adding people to your Permissions' yml files? So was I, so I coded this little plugin. Just say /class and easily rank people up and down in your prepared Permissions groups +Manage Permission groups and add ranking! + +•CHANGELOG + +* v0.4 +* ** 0.4.5 - fix classadmin add, new command /class config / fix error in command description +** 0.4.4.4 - fix issue reload, class list, classadmin add +** 0.4.4.3 - method cleanup +** 0.4.4.2 - pull by Krglok +** 0.4.4.1 - fix exp costs not updating the level correctly +** 0.4.4 - add /class list +** 0.4.3 - config setting to remove all perm groups on class select +** 0.4.2 - Vault disabling for either Economy or Permissions +** 0.4.1 - Vault disabling via config +** 0.4.0 - Vault support From 81cec54da5a331152daeddb4453bdf748a60b4db Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 10 Apr 2013 08:59:10 +0300 Subject: [PATCH 10/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ffa0db8..d0b84de 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Manage Permission groups and add ranking! •CHANGELOG * v0.4 -* ** 0.4.5 - fix classadmin add, new command /class config / fix error in command description +** 0.4.5 - fix classadmin add, new command /class config / fix error in command description ** 0.4.4.4 - fix issue reload, class list, classadmin add ** 0.4.4.3 - method cleanup ** 0.4.4.2 - pull by Krglok From f8bc478ae25c0b5f3c4c3534a7d3837e95e7b4a2 Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 10 Apr 2013 09:00:21 +0300 Subject: [PATCH 11/29] Update README.md --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d0b84de..b2b8deb 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,26 @@ ClassRanks Manage Permission groups and add ranking! -•CHANGELOG +CHANGELOG * v0.4 +* ** 0.4.5 - fix classadmin add, new command /class config / fix error in command description + ** 0.4.4.4 - fix issue reload, class list, classadmin add + ** 0.4.4.3 - method cleanup + ** 0.4.4.2 - pull by Krglok + ** 0.4.4.1 - fix exp costs not updating the level correctly + ** 0.4.4 - add /class list + ** 0.4.3 - config setting to remove all perm groups on class select + ** 0.4.2 - Vault disabling for either Economy or Permissions + ** 0.4.1 - Vault disabling via config + ** 0.4.0 - Vault support From 58f0a1a3ba465246ce940cee0ac5d340664d5f1b Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 10 Apr 2013 09:00:44 +0300 Subject: [PATCH 12/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b2b8deb..3d99a50 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Manage Permission groups and add ranking! CHANGELOG * v0.4 -* + ** 0.4.5 - fix classadmin add, new command /class config / fix error in command description ** 0.4.4.4 - fix issue reload, class list, classadmin add From 694eaad34ca187c73cc5433b0afc966d472ac9c0 Mon Sep 17 00:00:00 2001 From: krglok Date: Wed, 10 Apr 2013 08:15:25 +0200 Subject: [PATCH 13/29] Version 0.4.5 New command config fix command description fix cklassadmin add issue --- src/net/slipcor/classranks/managers/CommandManager.java | 4 ++-- src/plugin.yml | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java index c5fe8a6..347a49e 100644 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ b/src/net/slipcor/classranks/managers/CommandManager.java @@ -17,9 +17,9 @@ /** * command manager class * - * @version v0.4.3 + * @version v0.4.5 * - * @author slipcor + * @author Krglok */ public class CommandManager { diff --git a/src/plugin.yml b/src/plugin.yml index 39802d0..713967c 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -28,9 +28,7 @@ commands: description: Administrate the classes usage: | - add class and first rank /classadmin add class [classname] [permname] [displayname] [color] [item|0] [cost] [exp] - add rank for class /classadmin add rank [classname] [permname] [displayname] [color] [item|0] [cost] [exp] /classadmin change class [classname] [newname] /classadmin change rank [classname] [rankname] [displayname] [color] From 9fe5fba793b77185f267f0b5a2b1ba42de649c65 Mon Sep 17 00:00:00 2001 From: krglok Date: Thu, 11 Apr 2013 09:58:56 +0200 Subject: [PATCH 14/29] Vault Test --- bin/net/slipcor/classranks/ClassRanks.class | Bin 6603 -> 6687 bytes .../handlers/HandleVaultPerms.class | Bin 8646 -> 8699 bytes bin/plugin.yml | 2 - src/net/slipcor/classranks/ClassRanks.java | 13 ++++-- .../classranks/handlers/HandleVaultPerms.java | 41 +++++++++++------- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index d8be54c25b205d6251a4a9fb077ffd827be28a5b..ab4f169ae9004225465326c05618efd695af2ae8 100644 GIT binary patch delta 1788 zcmaKtX>b!|7{~uldhBMqX`7_?MOvXi(n<@p6;TUf6cj3Qlmb!+&4RHdsohl3aV$k) z&>3fdcW_1=!4D#WAW~pyL4j7S3PKUQ55xoUL{Y(ug3l%$s56dV-rar9-*ddl!4d1q zk`G+iy%)d;xrLqYbspm7H1L)vb*qx ziZ_u(h||Nqrm%v8I3(dMLaynMGp*6@3u`J4qnnV>9Qhi1r&d=l;fV05Ij*Awxms&7 z3w9~!!8>N`RMX!`0E~@sJPjOs0ZH00VPN?`CUx+cb zQJG(HipW4*O`6Zot?t3sDo(NKYTM31T{xrS7ZWvB4~H6M{Kl#M0o^yRLGvp(hd(6z zE<%ZEF@NGOu{^Oj^E|h8*4PH0u21#_>-E_Tc!40{qBxwGXCV@&6Ia<}0?o3LLaIaw z;<2R67#k&ujY$P^4<$1j*~PJ>;VDkuiN+>veqfP;M<`XLG)fnl$rUbzGF8f=MDF19 zapR|YWy&E~X1fw7k6aQB5RJ*XrTJ*(+H@`GpQ!1&Z-FM$6@-{@C}K89r9vEMvISbW z%D0e}L&V+N75*Xt`WWV z!kBC6I#KADZmpy-5{)K!#2JStPNf@Y>~_O3#A2O`IK%?fDo&+5lyz|OtXEv)V*^KyUYsb%S$FG+QvP23>WHq4k8HS2xQJ?O1pDl{C>+twbq5%dv{5 zAtJqXMN#^C%TP3w+>!3ol81|kq8Ig{xAvh|{6Bijf3g=_aGA+r&J=5zX&p1IWu~Y5 z@l;&msh|=njqp_T@mS11g+898%x89fU^@+WQh5hmZNUUjw-q*zLD%o6axp72XX<($ z8kt}IZuf8lQGU!I$K%$#CmddfClAHO>Tqi3m=aD5*C9e^UV}XUn{{zOJ Bw}b!y delta 1769 zcmZ`)Yj6`)6#h=ybT`R{Hc8v0EiGxpLX$#)7OJgUpwv;Jh=3HtBB5DIrfJeiQU-oV z2OJ$y#{us+h>XIFGWb9qg)S|~LsZZriVsxqf#MqlL45Pjvq?tk4`woZZ_a+_eBb%b zy~*0jLlx$}%RBb~sG$0-=DFrZWud<#6jz%g;YizJGYHQqcplFZl$aXtXs=Jcknti% z=1ozfZNXS97zxK@yhL#HkGSVYI>Lcs37ZLJE3=%U(BjP7gc2ED1Z%(4`b9Ffiv~+x zx<)8XA~VGbi!q~HNB4>~mP*QZ3g+s+@ zYhGbZ=?p#ks)E;$PcX*f{%G8c19(HiLD8;woNwxAOGkUaA6M%ZsLibs4iTJUM3&Pd z<1j&Jr<9&%lMh81HqVo zUPuj?aSrDt{6errqAlg~I$B$U@$&JBMZvH5O&lIDY~Ua4=IpwVKNg$n54XmeSn*%D zAmMLXnr$K@NfKocvinu7Ti}n^MM9CNLNb}enM{w|M;2~_ z6yeGml|6uv(H>Rj2N#*KoU#Q9!|`Bzaru;xf3eC`1F@9tiK*d0gBpwZTU42f2x;+1BHgV}F^&cWg8=(qu~mb(+F|YR+~PG;1L@g9*c!4X^cdp z3B}^9t=Ong6p@#ZrXOiKGa~k14g6+v{01g+($QyEjii4 z-QHbzbe4AqR&-;f*Dkv7xP~>}?O3T{ZKGGiGW&WB53YvHm<{4mPC@4jy;x-616aVQ zO8Z6)OSr}+y~Y-mzc`_}(Kwk09mI%G!z;!33UB;z~v_{%zdigg!u>!H1qhiTaF z?ZN9@zi*cPtsQuq1$mBW_&~#P`{(@7@I_MbR=)RXDB|Zbwyrm~yz@4!$3$$xBxq>B zeoV$eOv4G>iBp(?^Jv6Bm`PU5qFmfX9?Yg|aW@S|6IJ6L8joh0hydLVm8PMEIB)^-k0oH!=HM)hD5t&UV(ez z#FB(SHzxzGlt6uV36~QTE^hcqMibv0{v_x(ayvSHj!!3Xkbzmch=07y`sf{G)l|x4 z)-G~z%t5)lFH5TEC6@vE9Fv)ay1rf-L~QqQ2YIdldCFJh=JFW?mb3JSFp}3XcozWGI|uUwbT8&m2}@229g-5dG$pj^szR@>bEpAV1laWfVigN`f(5K%0jpEKP1231 z`p>v3@=;krPgP2fLI3wi>A9cv>BbN4p%nr y$ig}v_cIBW++@k=p*jv2Xu`j~JhE&6 diff --git a/bin/net/slipcor/classranks/handlers/HandleVaultPerms.class b/bin/net/slipcor/classranks/handlers/HandleVaultPerms.class index d3966e3c04051137680b66e617f832e6f03cc6f5..f66a169f775ae70dcb04dd2f73649bbbc52dc11d 100644 GIT binary patch delta 1319 zcmYjQYiyHc6n;+ItzGHnR(5M<*Ka!5rQcY$!Gz&-W9)umLtvTQ?6QhL*=Dx^Ga{&{ z2m~}QQB;f|8i)$J6wBfi&D6yUn&6Fv#XoAIX#C*?Z!^rNl}y|8JLi4BbDr}&=bVmL zOjTGvxcb^T07bHV$hs!pm%Pf`=kL|3{ax)|zt-#vY-#dt@o6!5R_54bE{+LIwM|va zERrp-Ukmegboe^7fVXqAW|3Up>sn`*wyi7R@6dYsy1Tmqy;fw3Zo`B)Eiz9%8L!VR z5X|1>-RjNn>)q(jFAoH~{S6y?dadF?QaF0PO%_P8x*T663za7!sj$Q*i_tHzh6`10 zXKW9HrPL<3h*@AHi*WMeR-Be{n=FwEwJl*xs#S@-D5lAVy|PS@rzYcE>K;pM@Ok@? zIPx(I9$bg{a9{xnP|W8-EW%>tPkdO))Gvt_3u+OCdc>gtiD*O;n&CnVW0s?mwg$KH zb_F(ICAQM`qcu2{bVN$mF>O85yi99nS_jhLLmBR*w*i}R7Y@OXqv*u@=)!q);|c=! z3q9;|U+}Y(Dk;5}5cd&cCn0tb;sJ7fkTrH=H69_@9=>@L`)ChfFBH8~*pJs~-^77n ztK+b&Jp==uKr{}+j;B$CXDIIo%JCe@A0_$Y&ZkQMY zOu9$lZ_r0@s%aQ;?h#4RLz32-dj`p)xW8?-+@N}$H>PBr#Y1`sd+hu9aPt?!V<9LN z>nuyinK_2DLKsu0orOECIZwgLW5wR4uM0x%s@2Fn7sj z!z_f{5oy?{c-qcNVdJ%)g``Nm;c_`|Vw)VMnSMA-BeLizSasgX&FW8ATE(q1FZB^A z8zi79(x6<50DdB|pIPo#q;mCi{Kl2|oxA)8H|z=(O<_C!R;^k_&QhtQ@KpGuN~$Sb zN4C^Zyopl=Y!TAkvQ%o-F)if|k6G#<{7cpW^9=OrrQu&))NX>ADJ#QLsH0IIN4?%w z5`C^X%2;eV0god($y6BGj=Ye#BdZa@aCkfHA?jsPqe{)lN*94e46un2E-{f$6e{R9 yiWw^;My<`rs0nj5aEzG|uExlWIJRjH%4`M$+y6&YpJpeF|6Owk(oCiXY551|nJ!lV delta 1268 zcmX|AYfzL`7=GT}gKnti$Ibx|)b2HQ8nAM^_r?*=>gJ$9d13?|q;5d7tN; zY2SID`Qpsm699@NaLT+szQCrrI=ft3yFwk!uAaW`?ygYpJRFrQi!8u#fuS}~wbG1C z$+2Kc945(Am*TYr`GSN;f?I;#zTUPDZ$&5+?5}U@={1Xnq)7Hcixfzqa#*Ws775~- zT3edh+d4P9Lcz{!kQpr>$sSodtX49znkPJkF_pvBs(alX3K_?UdL(m=7;*MFH$6ulU5&pFDiw}upc>E)XbC1bwVetm?8%m86C9(RFm{(D3 zHzvgtmKvy2+BkMLBuLR2?6w=`1hgB*r1%KT8qZ{j^0-occh3FP#$?$rTN$F#<#9aV zJ5v6hM1DXDZbHM4ybwR}CjU$sZ*taOdFy^t`&}8U%cX*nq@YEXi;t3M$dMJ4#Xye% zOLUxWDVIuSMKp3iKZ`7wj1VLGjG`H(3c_bv1$cDaRZESMjAZeulniHb_S*l=ABoIm z3v(=YSZb9&BfAcNP@zBB;x9V&H*)woeBAr-FG!bWOMrn~$Jz;d>{|^F#8{Gf^ diff --git a/bin/plugin.yml b/bin/plugin.yml index 39802d0..713967c 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -28,9 +28,7 @@ commands: description: Administrate the classes usage: | - add class and first rank /classadmin add class [classname] [permname] [displayname] [color] [item|0] [cost] [exp] - add rank for class /classadmin add rank [classname] [permname] [displayname] [color] [item|0] [cost] [exp] /classadmin change class [classname] [newname] /classadmin change rank [classname] [rankname] [displayname] [color] diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 7937c98..f448cfc 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -70,11 +70,18 @@ public void onEnable() { // load Vault if (pm.getPlugin("Vault") != null) { db.i("Vault found!"); - if (getConfig().getBoolean("vaultpermissions")) { + if (getConfig().getBoolean("vaultpermissions")) + { this.perms = new HandleVaultPerms(this); log("ClassRank Vault permissions plugin found", Level.INFO); // success! - this.perms.setupPermissions(); } - if (getConfig().getBoolean("vaulteconomy")) { + + if (this.perms.setupPermissions() == false) + { + log("ClassRank Vault permissions NOT initialized", Level.SEVERE); // success! + } + } + if (getConfig().getBoolean("vaulteconomy")) + { setupEconomy(); } } diff --git a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java index 517776a..be16b01 100644 --- a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java @@ -41,14 +41,18 @@ public boolean isInGroup(String world, String permName, String player) { * Function that tries to setup the permissions system, returns result */ @Override - public boolean setupPermissions() { + public boolean setupPermissions() + { // try to load permissions, return result RegisteredServiceProvider permissionProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); - if (permissionProvider != null) { - try { + if (permissionProvider != null) + { + try + { permission = permissionProvider.getProvider(); getPermNameByPlayer(Bukkit.getWorlds().get(0).getName(), "slipcor"); - } catch (Exception e) { + } catch (Exception e) + { permission = null; } } @@ -88,7 +92,8 @@ public void classAdd(String world, String player, String cString) { @Override public void rankAdd(String world, String player, String rank) { player = PlayerManager.search(player); // auto-complete playername - if (world.equalsIgnoreCase("all")) { + if (world.equalsIgnoreCase("all")) + { rankAddGlobal(player, rank); return; } @@ -98,8 +103,10 @@ public void rankAdd(String world, String player, String rank) { plugin.saveConfig(); db.i("Vault PermName " + rank + ": user " + player + " set " + world); - try { - if (permission.playerAddGroup(world, player, rank)) { + try + { + if (permission.playerAddGroup(world, player, rank))//(permission.playerAddGroup(world, player, rank)) + { db.i("Vault added rank " + rank + " to player " + player + " in world " + world); } else { db.i("ERROR Vault added rank " + rank + " to player " + player + " in world " + world); @@ -193,17 +200,21 @@ public void classAddGlobal(String player, String cString) { } @Override - public void rankAddGlobal(String player, String rank) { + public void rankAddGlobal(String player, String rank) + { player = PlayerManager.search(player); // auto-complete playername String cString = ClassManager.getClassNameByPermName(rank); - plugin.getConfig().set("players." + player + "." + cString, rank); - db.i("Vault added rank " + rank + " to player " + player + ", no world support"); - plugin.saveConfig(); - try { + try + { permission.playerAddGroup(Bukkit.getPlayer(player), rank); - plugin.log("Vault PermName " + rank + ": user " + player , Level.INFO); - db.i("added rank " + rank + " to player " + player); - } catch (Exception e) { + plugin.log("Vault Global PermName " + rank + ": user " + player , Level.INFO); + db.i("Global added rank " + rank + " to player " + player); + + plugin.getConfig().set("players." + player + "." + cString, rank); + db.i("Vault added rank " + rank + " to player " + player + ", no world support"); + plugin.saveConfig(); + } catch (Exception e) + { plugin.log("PermName " + rank + " or user " + player + " not found", Level.WARNING); } From 95f0a4ae672ff92c58d8453258809c112c5ee3df Mon Sep 17 00:00:00 2001 From: krglok Date: Thu, 11 Apr 2013 12:53:20 +0200 Subject: [PATCH 15/29] Vault issue fixed command config extended new command groups CRHandler Interface extented --- .../classranks/handlers/CRHandler.class | Bin 973 -> 1041 bytes .../classranks/handlers/HandleBPerms.class | Bin 6619 -> 6747 bytes .../classranks/handlers/HandlePEX.class | Bin 6447 -> 6533 bytes .../handlers/HandleSuperPerms.class | Bin 5715 -> 5843 bytes .../handlers/HandleVaultPerms.class | Bin 8699 -> 9260 bytes .../classranks/managers/CommandManager.class | Bin 22692 -> 23745 bytes bin/plugin.yml | 11 +- .../classranks/handlers/CRHandler.java | 1 + .../classranks/handlers/HandleBPerms.java | 424 +++++++++--------- .../classranks/handlers/HandlePEX.java | 6 + .../classranks/handlers/HandleSuperPerms.java | 6 + .../classranks/handlers/HandleVaultPerms.java | 150 ++++--- .../classranks/managers/CommandManager.java | 79 +++- src/plugin.yml | 11 +- 14 files changed, 403 insertions(+), 285 deletions(-) diff --git a/bin/net/slipcor/classranks/handlers/CRHandler.class b/bin/net/slipcor/classranks/handlers/CRHandler.class index a813c2c2b1cfac365894797af4eda94b846204cd..1b8169df47aa66ab30d53c4df316324ee5d1cf34 100644 GIT binary patch delta 116 zcmX@hK9NJ<)W2Q(7#J9g8PwPrm>3x}Coa_7XnB;$ia$NIBp@fTGPTIPD8ICzn2|wU z!zU}TEKxrvF)v*|xTGjEFWp)*8dGfYA0|ykzR7CLbA?zK8I%~5fyOg3r~pYO22}uO CQXr}T delta 49 zcmbQpah6@+)W2Q(7#J9g8C2LAm>3x}Coa_7XnB-rvK6yBBk$xS=DA!9j0{RZ6-*4u E09?TfKmY&$ diff --git a/bin/net/slipcor/classranks/handlers/HandleBPerms.class b/bin/net/slipcor/classranks/handlers/HandleBPerms.class index a297b93b2d9b50c663ef1d90df46ae9a665116fd..5f57da04c35158fb6105ea7ff0125003b80f8d28 100644 GIT binary patch delta 79 zcmca@eA|TU)W2Q(7#J9g8D4JWs^t~oPfslg$VseBEpji)FD)o$WKh?b%*Z4>*^*m$ jax1S5Bj4sjydpe|&nEAXP-MJ1`Idw{`*WavCWaRPR$v*+ delta 36 scmca@a@&~e)W2Q(7#J9g8J=(Cs^y)0nAeJtck@495gt|s1}27Q01ML$Jpcdz diff --git a/bin/net/slipcor/classranks/handlers/HandlePEX.class b/bin/net/slipcor/classranks/handlers/HandlePEX.class index 18ed18ab9c9699e42bf71a1fec063f4470449078..19bd100e6fe56119f03f78467934b6da91b86f9d 100644 GIT binary patch delta 134 zcmZ2))M_kn>ff$?3=9m$46oT4m>3x}Cq5LP{DDzuqh&ph0DpRFNkC3wWonUoQGRJb z@#Jkhj*NVpfAARbcphP3WZ(sAGy~F1K$?kh1Bhgh1d?n(F$RX43{pT+3?j=Q%^(Bh RfmHZ2_yXk_8D4^UuK+>!8kYb7 delta 49 zcmV-10M7q~Gp{lb%Ko~(0000p0O|(-0s#Oik>MAU@BtFBIe!e3$_zgN4YLXjG7JR( H00IE%n=1}{ diff --git a/bin/net/slipcor/classranks/handlers/HandleSuperPerms.class b/bin/net/slipcor/classranks/handlers/HandleSuperPerms.class index e4fc05d0a9a0ec931e9609385ef2c840f1388a63..1e65e9002b4c0c1323433e24574033cf5f6c28a2 100644 GIT binary patch delta 134 zcmcbtb6J<`)W2Q(7#J9g89r^~;^!6SPfslg$VseBEpji)FD)o$WKf?R$RWZQJ^2Hx z$Ye=gJ4U|E5xn0xJl``gGH?SmngMAhAkDZ329afuWRL># RKq_(>vVro93?IO}j{q3g8QuT@ delta 36 scmcbtds&C;)W2Q(7#J9g89r>};^&V!Z diff --git a/bin/net/slipcor/classranks/handlers/HandleVaultPerms.class b/bin/net/slipcor/classranks/handlers/HandleVaultPerms.class index f66a169f775ae70dcb04dd2f73649bbbc52dc11d..779c8471c633028131be4317b1ae2017f3db258d 100644 GIT binary patch delta 4020 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 P&rCWKk}sR9n|2m+e^@4cG`j!v6o?)~n) z=R5a1zwb|_>+6=TSmwk_f_|0Z=Gvw} z_mTomyv&KEf#$|Ylo!VZwg5eIcv6t2MDwZ3$pJ@}IZb71o0Fk0=5HGQjLN*Qm#5uJxC08z}%_(EEF5*K6J`kkb6J8ZAZf;spTU;J)(C{z(Tb)hG zvww_F9Qcp&c>GD1@Tn^FH`PZqT*K`GYh7e@Q!=jLa}8f0 z!~m9u8!LFvDNvg{nYk8haY&LN)o@W8u3J_-tNNbE5>C1(Hcjl}P{%w4&WqyGP$q8m znWre9wECL_154`bn!+pU8UrgMYXVO32<(AX;o9biQ&QE8e#-4ev1DrEmv5-jwDGQi z8rDg+pja)khwdD9w^MQi$>ExsNKGIbu3JeTgPDs!U42tvX?=5DjZ<<3879=Jwe{8E z+TN77@C&&~lRWHTq|+*<%yLSB8lO5Kw~$PN^bs&t8E9;7XsC}ixiM6N8cs>JQ--T^ zslmJv0$(q?@zH2_&CC^zO>QYcx^6v6lhHCpwWLic8!PZESsq!kaz))TbETB0lxp%# ztl@(7wNGBnxs9AG<21QV9F!gd)17V6ZO3aeK_;qx-or9gz2+T}+#(ekHp(mtLS6Ud zsP8#b)O)^Z;@MZyf09MKsyRd5G6pHEkZG`C20WOF{wPN}W+Ml4a4Y6wGS6kWlXvG~ z8RlaZ&udVniU-V({RLLo0m%<`ptiio8;zrB8{CD#P#nA4LLJy!YAt*U8F929K+9d; z_>q{uIeCNkC=Z6)V;tyH zIU^3$4o{K3lKZxyxM$W0)iEGPRc4lmO+AoVGG{9;QN5K&LMky#FpdieV-aD538R`Y zYLJBp?!Z!xmSH89V=HR09d$T{dYnW9eME5;jZ{jra{5QavP8oZ7)Cr-5yahCK#vRQ zzaMPr*AaK1xnP0=l_3aTqeB)YDK4eCjYfyQg68XOeGzqYWSsI<^oHtGbjAsMy+((- zp}bk8e&!#hj%19EEx;yh`4WO3a3%Klw-egt387evF^+ya^kj zINFN`@hs2J@lG0}7-hzSK~$3da|i_lBF3nQBa1O2q!`(&1SP9M$&IA+%lLi*&^(IH z0A#5mAO}JDrNVor)LP^{^Eg~o-EXk&Yv{!BwzU)QSWvMGo>H5x0`GZBBXksY@0r$6 zC*GGBI`NU9)V>Qozr7QeIkx$2htOPV)vvD$9_>2cBcLwIGZYshO~`B)Huimcw|or^ zzI_N6zvk7!PO)0B4WkE#ICNS-pGLJ9>h?);qE>v8qK;){#rh?#O>O(Ftt9BhNQ`0T zHj{oU&sIae)yO2IzTy`2@klk)yGrM#2U-NoEJK`*=M z=eKCb9&Rg7GLx-1%&U{whf@o=CtkzTZ1Qo*;A1_-bK%sp(Vb$B5-H}$OtD1*kxDpi+hC}*GI)&1%o*(F&uG?nNRo<~C`0ItKHs!a@$6J}&~K0Rw&|V@tan(>WGB(PwAp%3bh~~q z;o2v|Of%M&PBM=jL4CRh^=W$2n~&~M@6bt{Z!%}^iIA%wmM*Ts+DA^! zy67qknSeKX(x59#*H(*>1~cXx=@HtO`mU+IBGnPd{U3@;K<`ytK6l{C9yEnqK5&+3 z-a!EGBA=gnBXN#4=TU_V_zvFZLNBm$f6zyHEj>6|Fki1vU3x7Ex2RH_NeME>ey_S)qPeR>>|M=BNpQ}ySL2dD=jkTzr+J7=Kufz diff --git a/bin/net/slipcor/classranks/managers/CommandManager.class b/bin/net/slipcor/classranks/managers/CommandManager.class index d25d11cc85d77f89f9c7ff0ddabe1a12d46e3fa5..598617e2169eab887acacd2f7828efadb6841f4a 100644 GIT binary patch delta 7264 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 delta 6229 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 HqFet9n9q=c diff --git a/bin/plugin.yml b/bin/plugin.yml index 713967c..0a9d03b 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -11,11 +11,12 @@ commands: /class [classname] | Choose the class [classname] for yourself /class [add] {username} {classname} {world} | Add user to a class /class [remove] {username} {world} | Remove user from a class - /class [rankup/rankdown] [username] {world} | Rank user up/down - /class [rankup/rankdown] | Rank yourself up/down - /class get [username] {world} | Get the active rank of a user - /class list {classname} | list of class or class / rank - /class config | list configuration + /class [rankup] {username} {world} | Rank user up + /class [rankdown] {username} {world} | Rank user down + /class [get] {username} {world} | Show rank of user + /class [list] {classname} | list of class/ranks + /class [config] | list the configuration + /class [groups] {username} | list the groups of user rankdown: description: Rank down yourself or others usage: | diff --git a/src/net/slipcor/classranks/handlers/CRHandler.java b/src/net/slipcor/classranks/handlers/CRHandler.java index aa6819a..de64ed1 100644 --- a/src/net/slipcor/classranks/handlers/CRHandler.java +++ b/src/net/slipcor/classranks/handlers/CRHandler.java @@ -23,4 +23,5 @@ public abstract class CRHandler { public abstract String getPermNameByPlayer(String world, String player); public abstract String getPermNameByPlayerGlobal(String player); public abstract void removeGroups(Player player); + public abstract String[] getPlayerGroups(String player); } diff --git a/src/net/slipcor/classranks/handlers/HandleBPerms.java b/src/net/slipcor/classranks/handlers/HandleBPerms.java index c0a8b54..aff0f32 100644 --- a/src/net/slipcor/classranks/handlers/HandleBPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleBPerms.java @@ -1,209 +1,215 @@ -package net.slipcor.classranks.handlers; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.DebugManager; -import net.slipcor.classranks.managers.PlayerManager; - -import org.bukkit.World; -import org.bukkit.entity.Player; - -import de.bananaco.bpermissions.api.ApiLayer; -import de.bananaco.bpermissions.api.CalculableType; - -/** - * bPermissions handler class - * - * @version v0.4.3 - * - * @author slipcor - */ - -public class HandleBPerms extends CRHandler { - private final ClassRanks plugin; - private final DebugManager db; - - public HandleBPerms(ClassRanks cr) { - plugin = cr; - db = new DebugManager(cr); - } - - @Override - public boolean isInGroup(String world, String permName, String player) { - //ApiLayer.hasGroup(world, type, name, group) - return ApiLayer.hasGroup(world, CalculableType.USER, player, - permName); - } - - /* - * Function that tries to setup the permissions system, returns result - */ - @Override - public boolean setupPermissions() { - // try to load permissions, return result - try { - ApiLayer al = new ApiLayer(); - plugin.log("<3 bPermissions", Level.INFO); - return (al.toString() != null); - } catch (Exception e) { - db.i("bPerms not found"); - return false; - } - } - - @Override - public boolean hasPerms(Player comP, String string, String world) { - return comP.hasPermission(string); - } - - /* - * Add a user to a given class in the given world - */ - @Override - public void classAdd(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - ApiLayer.addGroup(worlds[i], CalculableType.USER, player, - cString); - db.i("added group " + cString + " to player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - /* - * Add a user to a given rank in the given world - */ - @Override - public void rankAdd(String world, String player, String rank) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - ApiLayer.addGroup(worlds[i], CalculableType.USER, player, rank); - db.i("added rank " + rank + " to player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - /* - * Remove a user from the class he has in the given world - */ - @Override - public void rankRemove(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - - ApiLayer.removeGroup(worlds[i], CalculableType.USER, player, - cString); - db.i("removed rank " + cString + " from player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - @Override - public String getPermNameByPlayer(String world, String player) { - player = PlayerManager.search(player); // auto-complete playername - ArrayList permGroups = new ArrayList(); - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - db.i("checking world "+worlds[i]); - String[] list = ApiLayer.getGroups(worlds[i], CalculableType.USER, - player); - for (String sRank : list) { - db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) { - permGroups.add(sRank); - } - } - - } - - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } - - @Override - public void classAddGlobal(String player, String cString) { - - } - - @Override - public void rankAddGlobal(String player, String rank) { - - } - - @Override - public void rankRemoveGlobal(String player, String cString) { - - } - - @Override - public String getPermNameByPlayerGlobal(String player) { - return null; - } - - @Override - public void removeGroups(Player player) { - String[] list = ApiLayer.getGroups(player.getWorld().getName(), CalculableType.USER, player.getName()); - for (String group : list) { - ApiLayer.removeGroup(player.getWorld().getName(), CalculableType.USER, player.getName(), - group); - } - } -} +package net.slipcor.classranks.handlers; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.PlayerManager; + +import org.bukkit.World; +import org.bukkit.entity.Player; + +import de.bananaco.bpermissions.api.ApiLayer; +import de.bananaco.bpermissions.api.CalculableType; + +/** + * bPermissions handler class + * + * @version v0.4.3 + * + * @author slipcor + */ + +public class HandleBPerms extends CRHandler { + private final ClassRanks plugin; + private final DebugManager db; + + public HandleBPerms(ClassRanks cr) { + plugin = cr; + db = new DebugManager(cr); + } + + @Override + public boolean isInGroup(String world, String permName, String player) { + //ApiLayer.hasGroup(world, type, name, group) + return ApiLayer.hasGroup(world, CalculableType.USER, player, + permName); + } + + /* + * Function that tries to setup the permissions system, returns result + */ + @Override + public boolean setupPermissions() { + // try to load permissions, return result + try { + ApiLayer al = new ApiLayer(); + plugin.log("<3 bPermissions", Level.INFO); + return (al.toString() != null); + } catch (Exception e) { + db.i("bPerms not found"); + return false; + } + } + + @Override + public boolean hasPerms(Player comP, String string, String world) { + return comP.hasPermission(string); + } + + /* + * Add a user to a given class in the given world + */ + @Override + public void classAdd(String world, String player, String cString) { + player = PlayerManager.search(player); // auto-complete playername + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + try { + ApiLayer.addGroup(worlds[i], CalculableType.USER, player, + cString); + db.i("added group " + cString + " to player " + player + + " in world " + worlds[i]); + } catch (Exception e) { + plugin.log("PermName " + cString + " or user " + player + + " not found in world " + worlds[i], Level.WARNING); + } + } + } + + /* + * Add a user to a given rank in the given world + */ + @Override + public void rankAdd(String world, String player, String rank) { + player = PlayerManager.search(player); // auto-complete playername + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + try { + ApiLayer.addGroup(worlds[i], CalculableType.USER, player, rank); + db.i("added rank " + rank + " to player " + player + + " in world " + worlds[i]); + } catch (Exception e) { + plugin.log("PermName " + rank + " or user " + player + + " not found in world " + worlds[i], Level.WARNING); + } + } + } + + /* + * Remove a user from the class he has in the given world + */ + @Override + public void rankRemove(String world, String player, String cString) { + player = PlayerManager.search(player); // auto-complete playername + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + try { + + ApiLayer.removeGroup(worlds[i], CalculableType.USER, player, + cString); + db.i("removed rank " + cString + " from player " + player + + " in world " + worlds[i]); + } catch (Exception e) { + plugin.log("PermName " + cString + " or user " + player + + " not found in world " + worlds[i], Level.WARNING); + } + } + } + + @Override + public String getPermNameByPlayer(String world, String player) { + player = PlayerManager.search(player); // auto-complete playername + ArrayList permGroups = new ArrayList(); + + String[] worlds = { world }; + if (world.equalsIgnoreCase("all")) { + List lWorlds = plugin.getServer().getWorlds(); + + worlds = new String[lWorlds.size()]; + for (int i = 0; i < lWorlds.size(); i++) { + worlds[i] = lWorlds.get(i).getName(); + } + } + for (int i = 0; i < worlds.length; i++) { + db.i("checking world "+worlds[i]); + String[] list = ApiLayer.getGroups(worlds[i], CalculableType.USER, + player); + for (String sRank : list) { + db.i("checking rank "+sRank); + if (ClassManager.rankExists(sRank)) { + permGroups.add(sRank); + } + } + + } + + db.i("player has groups: " + permGroups.toString()); + return ClassManager.getLastPermNameByPermGroups(permGroups); + } + + @Override + public void classAddGlobal(String player, String cString) { + + } + + @Override + public void rankAddGlobal(String player, String rank) { + + } + + @Override + public void rankRemoveGlobal(String player, String cString) { + + } + + @Override + public String getPermNameByPlayerGlobal(String player) { + return null; + } + + @Override + public void removeGroups(Player player) { + String[] list = ApiLayer.getGroups(player.getWorld().getName(), CalculableType.USER, player.getName()); + for (String group : list) { + ApiLayer.removeGroup(player.getWorld().getName(), CalculableType.USER, player.getName(), + group); + } + } + + @Override + public String[] getPlayerGroups(String player) + { + return null; + } +} diff --git a/src/net/slipcor/classranks/handlers/HandlePEX.java b/src/net/slipcor/classranks/handlers/HandlePEX.java index 171ba42..440806e 100644 --- a/src/net/slipcor/classranks/handlers/HandlePEX.java +++ b/src/net/slipcor/classranks/handlers/HandlePEX.java @@ -210,4 +210,10 @@ public void removeGroups(Player player) { permissionHandler.getUser(player).removeGroup(group); } } + + @Override + public String[] getPlayerGroups(String player) + { + return null; + } } diff --git a/src/net/slipcor/classranks/handlers/HandleSuperPerms.java b/src/net/slipcor/classranks/handlers/HandleSuperPerms.java index 7435925..2ba2f3b 100644 --- a/src/net/slipcor/classranks/handlers/HandleSuperPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleSuperPerms.java @@ -146,4 +146,10 @@ public void removeGroups(Player player) { plugin.getConfig().set("players."+player.getName(), null); plugin.saveConfig(); } + + @Override + public String[] getPlayerGroups(String player) + { + return null; + } } diff --git a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java index be16b01..8645731 100644 --- a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java @@ -66,91 +66,106 @@ public boolean hasPerms(Player comP, String string, String world) { /* * Add a user to a given class in the given world + * diese funktion ist wahrscheinlich unnötig !! */ @Override - public void classAdd(String world, String player, String cString) { + public void classAdd(String world, String player, String cString) + { player = PlayerManager.search(player); // auto-complete playername - if (world.equalsIgnoreCase("all")) { + if (world.equalsIgnoreCase("all")) + { classAddGlobal(player, cString); return; } - try { + try + { permission.playerAddGroup(world, player, cString); - db.i("added group " + cString + " to player " + player - + " in world " + world); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + world, Level.WARNING); + db.i("added group " + cString + " to player " + player+ " in world " + world); + } catch (Exception e) + { + plugin.log("Exception Add Class " + cString + " or user " + player + " not found in world " + world, Level.WARNING); } } /* * Add a user to a given rank in the given world + * if world = all then rank added without world + * stores player Rank also in the config */ @Override - public void rankAdd(String world, String player, String rank) { + public void rankAdd(String world, String player, String rank) + { player = PlayerManager.search(player); // auto-complete playername if (world.equalsIgnoreCase("all")) { rankAddGlobal(player, rank); return; } - String cString = ClassManager.getClassNameByPermName(rank); - plugin.getConfig().set("players." + player + "." + cString, rank); - plugin.getConfig().set("worlds." + world + "." + player, rank); - plugin.saveConfig(); - db.i("Vault PermName " + rank + ": user " + player + " set " + world); try { if (permission.playerAddGroup(world, player, rank))//(permission.playerAddGroup(world, player, rank)) { db.i("Vault added rank " + rank + " to player " + player + " in world " + world); + String cString = ClassManager.getClassNameByPermName(rank); + plugin.getConfig().set("players." + player + "." + cString, rank); + plugin.getConfig().set("worlds." + world + "." + player, rank); + plugin.saveConfig(); + db.i("Vault PermName " + rank + ": user " + player + " set " + world); + } else { db.i("ERROR Vault added rank " + rank + " to player " + player + " in world " + world); } } catch (Exception e) { - plugin.log("Vault Exception added rank " + rank + " or user " + player + " not found in world " + world, Level.WARNING); + plugin.log("Exception added rank " + rank + " or user " + player + " not found in world " + world, Level.WARNING); } } /* - * Remove a user from the class he has in the given world + * Remove a user from the Rank he has in the given world + * if world = all then rank added without world + * Remove player Rank also in the config */ @Override public void rankRemove(String world, String player, String cString) { player = PlayerManager.search(player); // auto-complete playername - if (world.equalsIgnoreCase("all")) { + if (world.equalsIgnoreCase("all")) + { rankRemoveGlobal(player, cString); return; } - plugin.getConfig().set("players." + player, null); - plugin.getConfig().set("worlds." + world + "." + player, null); - plugin.saveConfig(); try { - permission.playerRemoveGroup(world, player, cString); - db.i("removed rank " + cString + " from player " + player - + " in world " + world); + if (permission.playerRemoveGroup(world, player, cString)) + { + db.i("removed rank " + cString + " from player " + player+ " in world " + world); + plugin.getConfig().set("players." + player, null); + plugin.getConfig().set("worlds." + world + "." + player, null); + plugin.saveConfig(); + } else + { + + } } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + world, Level.WARNING); + plugin.log("Exception Remove Rank " + cString + " or user " + player+ " not found in world " + world, Level.WARNING); } } + /* (non-Javadoc) + * @see net.slipcor.classranks.handlers.CRHandler#getPermNameByPlayer(java.lang.String, java.lang.String) + */ @SuppressWarnings("unchecked") @Override public String getPermNameByPlayer(String world, String player) { -// ArrayList permGroups = new ArrayList(); Map groups = null; - String cPerm = ""; if ((world == "") || (world == "all") ) { - try { + try + { groups = plugin.getConfig().getConfigurationSection("players." + player).getValues(true); } catch (Exception e) { db.i("Exception GetPermByPlayer : GetConfigurationSection"); @@ -188,35 +203,51 @@ public String getPermNameByPlayer(String world, String player) { } @Override - public void classAddGlobal(String player, String cString) { + public void classAddGlobal(String player, String cString) + { player = PlayerManager.search(player); // auto-complete playername - try { - permission.playerAddGroup(Bukkit.getPlayer(player), cString); - db.i("added rank " + cString + " to player " + player); + String world = null; + try + { + if (permission.playerAddGroup(world,player, cString)==false) + { + plugin.log("ERROR ADD PermName " + cString + " or user " + player + " ", Level.SEVERE); + + } else + { + plugin.log("Vault Global PermName " + cString + ": user " + player , Level.INFO); + db.i("Global added rank " + cString + " to player " + player); + } } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found", Level.WARNING); + plugin.log("Exception Add Class Global " + cString + " or user " + player, Level.SEVERE); } } @Override public void rankAddGlobal(String player, String rank) { + plugin.log("ADD PermName " + rank + " or user " + player + " ", Level.INFO); player = PlayerManager.search(player); // auto-complete playername String cString = ClassManager.getClassNameByPermName(rank); + String world = null; try { - permission.playerAddGroup(Bukkit.getPlayer(player), rank); - plugin.log("Vault Global PermName " + rank + ": user " + player , Level.INFO); - db.i("Global added rank " + rank + " to player " + player); - - plugin.getConfig().set("players." + player + "." + cString, rank); - db.i("Vault added rank " + rank + " to player " + player + ", no world support"); - plugin.saveConfig(); + if (permission.playerAddGroup(world,player, rank)==false) + { + plugin.log("ERROR ADD PermName " + rank + " or user " + player + " ", Level.SEVERE); + + } else + { + plugin.log("Vault Global PermName " + rank + ": user " + player , Level.INFO); + db.i("Global added rank " + rank + " to player " + player); + + plugin.getConfig().set("players." + player + "." + cString, rank); + db.i("Vault added rank " + rank + " to player " + player + ", no world support"); + plugin.saveConfig(); + } } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found", Level.WARNING); + plugin.log("Exception ADD GLOBAL RANK " + rank + " or user " + player, Level.SEVERE); } } @@ -226,25 +257,28 @@ public void rankRemoveGlobal(String player, String cString) { player = PlayerManager.search(player); // auto-complete playername plugin.getConfig().set("players." + player, null); plugin.saveConfig(); - - try { - permission.playerRemoveGroup(Bukkit.getPlayer(player), cString); + String world = null; + try + { + permission.playerRemoveGroup(world,player, cString); db.i("removed rank " + cString + " from player " + player); } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found ", Level.WARNING); + plugin.log("Exception Remove Group Global" + cString + " or user " + player+ " not found ", Level.SEVERE); } } @Override - public String getPermNameByPlayerGlobal(String player) { + public String getPermNameByPlayerGlobal(String player) + { player = PlayerManager.search(player); // auto-complete playername ArrayList permGroups = new ArrayList(); String[] list = permission.getPlayerGroups(Bukkit.getPlayer(player)); - for (String sRank : list) { + for (String sRank : list) + { db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) { + if (ClassManager.rankExists(sRank)) + { permGroups.add(sRank); } } @@ -252,8 +286,13 @@ public String getPermNameByPlayerGlobal(String player) { return ClassManager.getLastPermNameByPermGroups(permGroups); } + /** + * This function remove ALL groups from the player + * + */ @Override - public void removeGroups(Player player) { + public void removeGroups(Player player) + { String[] list = permission.getPlayerGroups(player); if (list != null) { for (String sRank : list) { @@ -263,4 +302,11 @@ public void removeGroups(Player player) { plugin.saveConfig(); } } + + @Override + public String[] getPlayerGroups(String player) + { + String world = null; + return permission.getPlayerGroups(world,player); + } } diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java index 347a49e..f4fee4b 100644 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ b/src/net/slipcor/classranks/managers/CommandManager.java @@ -336,24 +336,23 @@ private void cmdGet (Player pPlayer, String[] args) { } else { world = "all"; } - if (args.length == 1) { - args[1] = pPlayer.getName(); + String player = pPlayer.getName(); + if (args.length > 1) { + player = args[1]; } - - args[1] = PlayerManager.search(args[1]); - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1])+ " Get in " + fm.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, args[1])); + plugin.msg(pPlayer, "Player " + fm.formatPlayer(player)+ " Get in " + fm.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, player)); if (rank == null) { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + plugin.msg(pPlayer, "Player " + player + " has no class in " + fm.formatWorld(world) + "!"); } else { String cDispName = rank.getDispName(); // Display rank name ChatColor c_Color = rank.getColor(); // Rank color - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) + plugin.msg(pPlayer, "Player " + player + " is " + c_Color + cDispName + ChatColor.WHITE + " in " + fm.formatWorld(world) + "!"); } @@ -364,11 +363,15 @@ private void cmdConfig (Player pPlayer, String[] args) { plugin.msg(pPlayer, ChatColor.YELLOW+"Class Config Data"); plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - plugin.msg(pPlayer, ChatColor.GREEN+"Debug : "+plugin.config.isDebug().toString()); - plugin.msg(pPlayer, ChatColor.GREEN+"Prices : "+plugin.config.isCheckprices().toString()); - plugin.msg(pPlayer, ChatColor.GREEN+"Items : "+plugin.config.isCheckitems().toString()); - plugin.msg(pPlayer, ChatColor.GREEN+"Exp : "+plugin.config.isCheckexp().toString()); + plugin.msg(pPlayer, ChatColor.RED+"Debug : "+plugin.config.isDebug().toString()); + plugin.msg(pPlayer, ChatColor.YELLOW+"Prices : "+plugin.config.isCheckprices().toString()); + plugin.msg(pPlayer, ChatColor.YELLOW+"Items : "+plugin.config.isCheckitems().toString()); + plugin.msg(pPlayer, ChatColor.YELLOW+"Exp : "+plugin.config.isCheckexp().toString()); + plugin.msg(pPlayer, ChatColor.YELLOW+"CoolDown: "+plugin.config.getCoolDown()); plugin.msg(pPlayer, ChatColor.GREEN+"OneClass: "+plugin.config.isOnlyoneclass().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"AllWorlds: "+plugin.config.isDefaultrankallworlds().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"SignCheck: "+plugin.config.isSigncheck().toString()); + plugin.msg(pPlayer, ChatColor.GREEN+"TrackRank: "+plugin.config.isTrackRanks().toString()); plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); Double[] MoneyCost = plugin.config.getMoneyCost(); @@ -378,6 +381,30 @@ private void cmdConfig (Player pPlayer, String[] args) plugin.msg(pPlayer, ChatColor.YELLOW+": "+MoneyCost[i].toString()); } } + + private void cmdUserGroups (Player pPlayer, String[] args) + { + String player = pPlayer.getName(); + // is there a player parameter, get it + if (args.length > 1) + { + player = args[1]; + } + String[] list = plugin.perms.getPlayerGroups(player); + if (list != null) + { + int max = list.length; + plugin.msg(pPlayer, ChatColor.YELLOW+"User Groups "+ChatColor.DARK_GREEN+player); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + for (int i = 0; i < list.length; i++) + { + plugin.msg(pPlayer, ChatColor.YELLOW+": "+list[i]); + } + plugin.msg(pPlayer, ChatColor.YELLOW+"Count "+max+" ---------"); + } + + } + // private void cmdTemp (Player pPlayer, String[] args) { // // } @@ -405,6 +432,15 @@ public boolean parseCommand(Player pPlayer, String[] args) cmdGet(pPlayer, args); return true; } + + if (args[0].equalsIgnoreCase("groups")) { + // Command list of Ranks in the Class 3.2 + plugin.msg(pPlayer,"groups "+args[1]); + + cmdUserGroups(pPlayer, args); + return true; + } + // more than /class or /class rankup if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", pPlayer.getWorld().getName())) { @@ -611,6 +647,10 @@ public boolean parseCommand(Player pPlayer, String[] args) return true; } } + + //--------------------------------------------------------------------------- + // Simple Commands + // if (args.length > 0) { // only ONE argument! @@ -620,6 +660,18 @@ public boolean parseCommand(Player pPlayer, String[] args) return true; } + if (args[0].equalsIgnoreCase("get")) { + // Command Get 3.2 + cmdGet(pPlayer, args); + return true; + } + + if (args[0].equalsIgnoreCase("groups")) { + // Command list of Ranks in the Class 3.2 + cmdUserGroups(pPlayer, args); + return true; + } + if (args[0].equalsIgnoreCase("reload")) { // Command reload if (pPlayer.isOp()) { @@ -899,8 +951,7 @@ public boolean parseCommand(Player pPlayer, String[] args) } return true; } - plugin.msg(pPlayer, - "Not enough arguments (" + String.valueOf(args.length) + ")!"); + plugin.msg(pPlayer,ChatColor.YELLOW+"Not enough arguments !"); return false; } diff --git a/src/plugin.yml b/src/plugin.yml index 713967c..0a9d03b 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -11,11 +11,12 @@ commands: /class [classname] | Choose the class [classname] for yourself /class [add] {username} {classname} {world} | Add user to a class /class [remove] {username} {world} | Remove user from a class - /class [rankup/rankdown] [username] {world} | Rank user up/down - /class [rankup/rankdown] | Rank yourself up/down - /class get [username] {world} | Get the active rank of a user - /class list {classname} | list of class or class / rank - /class config | list configuration + /class [rankup] {username} {world} | Rank user up + /class [rankdown] {username} {world} | Rank user down + /class [get] {username} {world} | Show rank of user + /class [list] {classname} | list of class/ranks + /class [config] | list the configuration + /class [groups] {username} | list the groups of user rankdown: description: Rank down yourself or others usage: | From 8e4b9fb7803c36cd166df36bf4a318980f11796e Mon Sep 17 00:00:00 2001 From: krglok Date: Thu, 11 Apr 2013 23:54:26 +0200 Subject: [PATCH 16/29] Issue onPlayerInteract --- .../listeners/CRServerListener.class | Bin 5456 -> 5473 bytes .../listeners/CRServerListener.java | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/net/slipcor/classranks/listeners/CRServerListener.class b/bin/net/slipcor/classranks/listeners/CRServerListener.class index ffbaf4e57764020a3d222dd4a2b72b54f2b1aca3..bc9ddd98f73c2e5965d8082dc97339cb9538a651 100644 GIT binary patch delta 1206 zcmZXU{Zmv`7{@<{eYtm+tH1_1g4i+yFrT?xhh|Obe222 zZ-k5yw!{ccV;>SP*V7VX^PMr;DhkKhp+vX)(2dj{NhP8e=w9!)jnkXN9K~K+ag3Mx zxi3yLL0^sM^-h0&*Ut{z4B*Imtc0n%@z4sQ|V;tT%$dTDDJ`|{} z#6C!`KO+I1*Rdyb@@Ii3<~TirRi%zOHbYgx^Ml=Bc(tYZTYQ_Ff9sHB%iILxD*lFWo;CV7l$s=3TY{@`)0 zP{TDgDHofSn9OZ;?X1K{d|t1T;0MM zhDZ|Gzc|YPGv!pJbgwbRzx zK}8g`R@s#bTI!{W)>|ob7_8LR3wUjOF}^h#{`LPm zXRot=asS{xzE(5o1mqsA$Qm>V(J3diTddvmYV^qSTCS;&opMq0h+VQ&&vES$IKnNi z=77Jsy~XG9x_bPr!4;{5*=z79`{WM2(AsbC7>~T5IV^v(tr170+wKyt%MJFtiZ=z; zZf~%?uT$qOfisC+J3@UyU#V-!TxUX{$4kCYIH>ck9Jl{zJ!ueSMjlMPHE-77W2yzV zHg8W&OK)4qXXg`6Ys?AUvN6@I+&|@vbQ&J(X9l11g%D=#mZ=Hje2N&6gX#HVWa?P@X<@6yf)&Ji*_BZcS-?E$ zo+jVX9%bvwC>=GWvvdj05+1u!+O0~->>0xMmYHUGBn8#voMu~;h^aiv6QkT2mpR2y zgX7s5_LrFxtSASfNY!tiW1zvbl&!5YEAkD>E^;W_9OdOL6O1QTF|Mel3iAa0WzM9+ ze?I1usARLagY9A+J_wlqj#YbtPBP*4QNr6=-n4VA0Mb12)7_m`G)IOeyaW=-6HKkF$m5$7!yf)SE zMLk&c#t;qW)47 z6%VF4H_IiV{-6Vnzt!VPPN=meM{U@dmAy-O?^fP>xlWxXx$L8W2u1%?$r AG5`Po diff --git a/src/net/slipcor/classranks/listeners/CRServerListener.java b/src/net/slipcor/classranks/listeners/CRServerListener.java index 3e2ac3d..7440c3e 100644 --- a/src/net/slipcor/classranks/listeners/CRServerListener.java +++ b/src/net/slipcor/classranks/listeners/CRServerListener.java @@ -63,7 +63,8 @@ public void onPlayerInteract(PlayerInteractEvent event) { db.i("right block click!"); // we clicked a block - if (plugin.config.isSigncheck() == null) { + if ((plugin.config.isSigncheck() == false) || (plugin.config.isSigncheck() == null)) + { return; // no sign usage => OUT } db.i("we want to check for sign usage!"); From 6fdb9b2047fc046d9b10f1f5eda1bbbebb5b2bba Mon Sep 17 00:00:00 2001 From: krglok Date: Sun, 14 Apr 2013 09:06:15 +0200 Subject: [PATCH 17/29] ver 0.4.6 vault perms, onplayerInteract, /class groups --- README.md | 2 ++ bin/plugin.yml | 2 +- src/plugin.yml | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3d99a50..6cf01ec 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ CHANGELOG * v0.4 +** 0.4.6 - fix issue Vault PermissionGroups, fix issue onPlayerInteract, new command /class groups + ** 0.4.5 - fix classadmin add, new command /class config / fix error in command description ** 0.4.4.4 - fix issue reload, class list, classadmin add diff --git a/bin/plugin.yml b/bin/plugin.yml index 0a9d03b..24f3365 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.5 +version: 0.4.6 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] diff --git a/src/plugin.yml b/src/plugin.yml index 0a9d03b..24f3365 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.5 +version: 0.4.6 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From b9a12a38a3e358220ebafdcfd30029f4f49cd5ef Mon Sep 17 00:00:00 2001 From: Krglok Date: Wed, 17 Apr 2013 09:31:49 +0200 Subject: [PATCH 18/29] v 0.4.6 mit autoaupdate in config --- bin/config.yml | 1 + .../listeners/CRServerListener.class | Bin 5473 -> 5473 bytes .../classranks/managers/ConfigManager.class | Bin 15103 -> 15250 bytes src/config.yml | 1 + .../listeners/CRServerListener.java | 5 +++-- .../classranks/managers/ConfigManager.java | 13 ++++++++++++- 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/bin/config.yml b/bin/config.yml index cecefa8..6aeb419 100644 --- a/bin/config.yml +++ b/bin/config.yml @@ -1,6 +1,7 @@ #------------------# # General Settings # #------------------# +autoupdate: true rankpublic: true trackRanks: false defaultrankallworlds: false diff --git a/bin/net/slipcor/classranks/listeners/CRServerListener.class b/bin/net/slipcor/classranks/listeners/CRServerListener.class index bc9ddd98f73c2e5965d8082dc97339cb9538a651..a0ccfe6fb505283d9c31893196738fc178ecc435 100644 GIT binary patch delta 13 UcmaE;^-ybro+x9>WPMR104Bo(m;e9( delta 13 UcmaE;^-ybro+xAUWPMR104BZ!mjD0& diff --git a/bin/net/slipcor/classranks/managers/ConfigManager.class b/bin/net/slipcor/classranks/managers/ConfigManager.class index 0f148c637144a518ed79fe07593cd87b1ac5a60b..129bd9ed6c4912c6cfb0e0956d6d1aa7e091aa25 100644 GIT binary patch literal 15250 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 getClasses() { // private void setClasses(Map classes) { // this.classRanks = classes; // } - + private Boolean AutoUpdate; + + public Boolean isAutoUpdate() { + return AutoUpdate; + } + private Map players; public Map getPlayers() { @@ -199,6 +208,8 @@ public void load_config() { } // DebugManager.active = plugin.getConfig().getBoolean("debug", false); debug = plugin.getConfig().getBoolean("debug", false); + // Update Config + AutoUpdate = plugin.getConfig().getBoolean("autoupdate", false); // check for section is available checkprices = plugin.getConfig().getBoolean("checkprices", false); From 898022b07eabbca835e3fe1d725f9b01df7600cb Mon Sep 17 00:00:00 2001 From: krglok Date: Tue, 23 Apr 2013 17:35:09 +0200 Subject: [PATCH 19/29] v 0.4.6 updatecheck in Config --- bin/config.yml | 31 +++++++++--------- bin/net/slipcor/classranks/ClassRanks.class | Bin 6687 -> 6835 bytes bin/net/slipcor/classranks/Update.class | Bin 5684 -> 5765 bytes .../classranks/managers/ConfigManager.class | Bin 15250 -> 15400 bytes bin/plugin.yml | 2 +- src/config.yml | 31 +++++++++--------- src/net/slipcor/classranks/ClassRanks.java | 12 ++++--- src/net/slipcor/classranks/Update.java | 12 ++++--- .../classranks/managers/ConfigManager.java | 16 ++++++--- src/plugin.yml | 2 +- 10 files changed, 60 insertions(+), 46 deletions(-) diff --git a/bin/config.yml b/bin/config.yml index 6aeb419..8bfd115 100644 --- a/bin/config.yml +++ b/bin/config.yml @@ -1,7 +1,10 @@ #------------------# # General Settings # #------------------# -autoupdate: true +# updatecheck, check for new version and give a message to the server console # +updatecheck: true +# autoupdate, is not implemented now and should always false # +autoupdate: false rankpublic: true trackRanks: false defaultrankallworlds: false @@ -25,7 +28,9 @@ prefix: ClassRanks #----------------# playercolor: '&e' worldcolor: '&6' - +#-------------------# +# classes and ranks # +#-------------------# classes: Fighter: Warrior: @@ -56,8 +61,6 @@ classes: name: 'Trader III' color: '&2' price: 100.00 - - #---------------------# # Money Cost Settings # #---------------------# @@ -65,7 +68,6 @@ prices: I: '10.00' II: '50.00' III: '100.00' - #--------------------# # Item Cost Settings # #--------------------# @@ -79,7 +81,6 @@ items: III: - 'DIAMOND:5' - 'LAPIS_BLOCK:5' - #-------------------# # EXP Cost Settings # #-------------------# @@ -87,17 +88,17 @@ exp: I: '10' II: '50' III: '100' - -#---------# -# Players # -#---------# - +#-----------------------------------------# +# Players # +# neede when no permission plugin present # +#-----------------------------------------# players: Notch: Fighter: Warrior -#------------------------# -# Config debugging # -# dont change the number # -#------------------------# +#-------------------------------------------# +# Config debugging # +# dont change the number # +# will be used to check for new config file # +#-------------------------------------------# cversion: '0300' diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index ab4f169ae9004225465326c05618efd695af2ae8..6bafc73eeb6f9c5a517b038c14fd1598ed90eadd 100644 GIT binary patch delta 1550 zcma)*TX0iV6o&slZ8=GL0!`AiNuebKgf=aPdxfe63JOROu@sS^+GAYp?zP-&$+u zff;*e+7F$3;zO-oKRaFO}_8N#~+S`)BdDsboS)re$erwqz*V9zqlV~bezpW z7N^qjgcW~@b!Rwbtc#kRc9KOJEz+@gvMaQ%I}!<}L-X^S&SI9R{*evU)MNr{TB1fO zwZe!+QfvKo+E}X5PI%SPk=_y=_fuEXM{TWh6I^4Xhm{&Di1J~wEgOth#j5 zPL2v#2RK^l;27mCn^s;!j7TKSYr{9%aU1m}U8a@i6GiEG{`wT1Q*oTo zy3F)4W1}2S7wI{Ei6jaNgerGlW1F3GnnU>2?h#dLyK|;ZT6eL|X3kZIoz2DbiGbSW z4wRO10WZ&qr*@m6p@4hIilV72SRefT(-#V1*O zp2at=ld@!Ss&HkG{F{nUBkLU)ulg!dnJ}+LgzFJy6dRd9jAJ6MmK_S;HRuf?r{gTUPvr-$nHg$#B7X7SCvC)v!Wdb)a0EDA|9aO4iYG-Yj{P z-LW61gRXPEP&+HjZQT;x1RXc1rz*#0)=2F|lH=P?G~_CBbA*&sU#KHXYpw`Oz6iVQ zz!rFMYaZ8MxHyO_5_E86-q6QUxL2~tGCBugc1dwLqmKH5i%VR3nJLe*O8R$;o7Gv4 z71v&lmynwi<-4Ik(Z^Z~WGXWXHz()#`WPbQ*v)A}iCNqi|^7xw?7zQBSZ99M3**daI%3eFC}**S<( zooh?uKW%Je6EDp3H0F5J&AuwnMQ+aPV~Yh#>kqEd`ZYplh`l;ei;Mwt+a5m98L*J4>oB zt{AH^@xk^>Uo^cus7(wpDd-ezViXm%R?&LDwchX6d#klY&&+Ou&%S)$%y-WDpWnGm zuRGYJ9AA9uX#i{Kx+BVBp+m-VBBQQS=kS6G4fBK*H9{{c(^_kL70lr!6)z)1$TQM< zDy`rZyei`ad+qTA#iHs8yk^A|j*kuM>3D2se8;ei*G0%(uAL;fdgCc0ksQ?&EZ{9m ze?kG_9To55J<;p#$o~Kz$@oz0ch@;S#wl^aUF}-HCn`S0XX3oOwd@Pl))J$Mw3dqN zgST5cU#a+-UAv2(+%Sh5>dC^f^7s3UCdwXm|H;f*AblB)))<($k_T zRHjmhinz5~Hh12z$wlP^sZT4U3ese%6t&(JjVm$14KU)PgI#gM(1+qKT19ZAleXI> zDplhY!w$vM-TEzTtP#7sx8`4F2{ec^-kt)SrL`(G(K^xTYjd^`!a@s#U4?W7waRp* zFn!gI^>mdu?c0*yMjbM>i}n81j*S$XPWo%4f*X+sCqNU^hn96w`!URIjU2`E-SsA3 zjLhJ8tax`0~iHlZ|lC7)o4cv_&cH5d-HZG^h3Y3v3i&jcbJjm`ud6b_^G|64C z67@%|EPj$X%@h@wRLuRo%TGR&0-SY^JG?2qs`EgW03GT9?miBW+toKRWr24PtCJ*xrFPZ^KeH^ z+VBiDPosPa<@3mMPC6#p&uLF6oA42y`lImRFmKFbcEXaZR&G)%PwHygRL|47hC{8@ a$Ua@mU)KH=K)QgCOl`b(w3#0y>iid8K`@*E diff --git a/bin/net/slipcor/classranks/Update.class b/bin/net/slipcor/classranks/Update.class index 4de3e61894ae9f94039b2498c35c4f58325bd1bb..d6a4fc7279832cea383b855422744331505f57aa 100644 GIT binary patch delta 2097 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 diff --git a/bin/net/slipcor/classranks/managers/ConfigManager.class b/bin/net/slipcor/classranks/managers/ConfigManager.class index 129bd9ed6c4912c6cfb0e0956d6d1aa7e091aa25..682c33830bea5855a30c7365be98401c29c35cd0 100644 GIT binary patch literal 15400 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 getClasses() { // private void setClasses(Map classes) { // this.classRanks = classes; // } - private Boolean AutoUpdate; + private Boolean autoUpdate; public Boolean isAutoUpdate() { - return AutoUpdate; + return autoUpdate; + } + + private Boolean updateCheck; + + public Boolean isUpdateCheck() { + return updateCheck; } private Map players; @@ -208,8 +214,10 @@ public void load_config() { } // DebugManager.active = plugin.getConfig().getBoolean("debug", false); debug = plugin.getConfig().getBoolean("debug", false); - // Update Config - AutoUpdate = plugin.getConfig().getBoolean("autoupdate", false); + // AutoUpdate Config + autoUpdate = plugin.getConfig().getBoolean("autoupdate", false); + // UpdateCheck Config + updateCheck = plugin.getConfig().getBoolean("updatecheck", false); // check for section is available checkprices = plugin.getConfig().getBoolean("checkprices", false); diff --git a/src/plugin.yml b/src/plugin.yml index 24f3365..ce84b8d 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.6 +version: 0.4.6.3 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From 97f59b03b206283a8ea9425f92a089d57fc6fc21 Mon Sep 17 00:00:00 2001 From: krglok Date: Sat, 6 Sep 2014 18:38:28 +0200 Subject: [PATCH 20/29] V061 / 1.7.2 v0.6.1 - 1.7.2 compatible, fixed cost issue and remove issue - Track task deleted - Support only Vault for economy and permissions - UUID support , world specific use UUID, Allworlds use Playername - new Admin command : list , show the class and rank info - new Admin command : debug , set debug mode true/false - sign use are changed, 2nd line is : for class / rankup / rankdown - /class remove issue fixed - cost issue fixed in add and rankup - warnings: look for the right version of Vault and the permission plugin for UUID support! - tested with Vault-1.4.1 - tested with permissionEx - tested with permissionBukkit-2.4 --- .classpath | 11 +- bin/.gitignore | 1 + bin/config.yml | 2 + bin/net/slipcor/classranks/ClassRanks.class | Bin 6835 -> 7647 bytes bin/net/slipcor/classranks/Tracker.class | Bin 2731 -> 0 bytes .../commands/ClassAdminCommand.class | Bin 1781 -> 13446 bytes .../classranks/commands/ClassCommand.class | Bin 1756 -> 1857 bytes .../classranks/commands/RankdownCommand.class | Bin 2320 -> 2320 bytes .../classranks/commands/RankupCommand.class | Bin 2314 -> 2314 bytes bin/net/slipcor/classranks/core/Class.class | Bin 1270 -> 0 bytes .../classranks/core/PlayerClassList.class | Bin 3288 -> 0 bytes .../classranks/core/PlayerClassRank.class | Bin 490 -> 0 bytes bin/net/slipcor/classranks/core/Rank.class | Bin 3160 -> 3163 bytes .../classranks/handlers/CRHandler.class | Bin 1041 -> 1089 bytes .../classranks/handlers/HandleBPerms.class | Bin 6747 -> 0 bytes .../classranks/handlers/HandlePEX.class | Bin 6533 -> 0 bytes .../handlers/HandleSuperPerms.class | Bin 5843 -> 0 bytes .../handlers/HandleVaultPerms.class | Bin 9260 -> 8491 bytes .../listeners/CRServerListener.class | Bin 5473 -> 5635 bytes .../classranks/managers/ClassManager.class | Bin 10266 -> 11576 bytes .../classranks/managers/CommandManager.class | Bin 23745 -> 0 bytes .../classranks/managers/ConfigManager.class | Bin 15400 -> 15766 bytes .../classranks/managers/DebugManager.class | Bin 1093 -> 1143 bytes .../classranks/managers/FormatManager.class | Bin 5518 -> 5502 bytes .../managers/PlayerClassManager.class | Bin 1654 -> 1654 bytes .../classranks/managers/PlayerManager.class | Bin 5760 -> 6311 bytes .../classranks/register/payment/Methods.class | Bin 4040 -> 3904 bytes .../payment/methods/BOSE7$BOSEAccount.class | Bin 2240 -> 0 bytes .../methods/BOSE7$BOSEBankAccount.class | Bin 2481 -> 0 bytes .../register/payment/methods/BOSE7.class | Bin 3665 -> 0 bytes .../payment/methods/EE17$EEcoAccount.class | Bin 3997 -> 0 bytes .../register/payment/methods/EE17.class | Bin 3162 -> 0 bytes .../methods/MCUR$MCurrencyAccount.class | Bin 2211 -> 0 bytes .../register/payment/methods/MCUR.class | Bin 2970 -> 0 bytes .../payment/methods/iCo5$iCoAccount.class | Bin 2393 -> 0 bytes .../payment/methods/iCo5$iCoBankAccount.class | Bin 2636 -> 0 bytes .../register/payment/methods/iCo5.class | Bin 3640 -> 0 bytes .../payment/methods/iCo6$iCoAccount.class | Bin 2471 -> 0 bytes .../register/payment/methods/iCo6.class | Bin 3072 -> 0 bytes bin/plugin.yml | 5 +- src/config.yml | 2 + src/net/slipcor/classranks/ClassRanks.java | 126 +- src/net/slipcor/classranks/Tracker.java | 73 - .../commands/ClassAdminCommand.java | 435 ++++- .../classranks/commands/ClassCommand.java | 11 +- .../classranks/commands/PlayerCommands.java | 1483 +++++++++++++++++ .../classranks/commands/RankdownCommand.java | 5 +- .../classranks/commands/RankupCommand.java | 5 +- .../core/{Class.java => Clazz.java} | 8 +- .../classranks/core/PlayerClassList.java | 114 -- .../classranks/core/PlayerClazzList.java | 128 ++ ...yerClassRank.java => PlayerClazzRank.java} | 6 +- src/net/slipcor/classranks/core/Rank.java | 61 +- .../classranks/handlers/CRHandler.java | 105 +- .../classranks/handlers/HandleBPerms.java | 215 --- .../classranks/handlers/HandlePEX.java | 219 --- .../classranks/handlers/HandleSuperPerms.java | 155 -- .../classranks/handlers/HandleVaultPerms.java | 355 ++-- .../listeners/CRServerListener.java | 47 +- .../classranks/managers/ClassManager.java | 209 ++- .../classranks/managers/CommandManager.java | 1083 ------------ .../classranks/managers/ConfigManager.java | 251 ++- .../classranks/managers/DebugManager.java | 5 +- .../classranks/managers/FormatManager.java | 51 +- .../managers/PlayerClassManager.java | 15 +- .../classranks/managers/PlayerManager.java | 183 +- .../classranks/register/payment/Methods.java | 8 - .../register/payment/methods/BOSE7.java | 206 --- .../register/payment/methods/EE17.java | 219 --- .../register/payment/methods/MCUR.java | 126 -- .../register/payment/methods/iCo5.java | 226 --- .../register/payment/methods/iCo6.java | 147 -- src/plugin.yml | 5 +- 73 files changed, 2986 insertions(+), 3320 deletions(-) create mode 100644 bin/.gitignore delete mode 100644 bin/net/slipcor/classranks/Tracker.class delete mode 100644 bin/net/slipcor/classranks/core/Class.class delete mode 100644 bin/net/slipcor/classranks/core/PlayerClassList.class delete mode 100644 bin/net/slipcor/classranks/core/PlayerClassRank.class delete mode 100644 bin/net/slipcor/classranks/handlers/HandleBPerms.class delete mode 100644 bin/net/slipcor/classranks/handlers/HandlePEX.class delete mode 100644 bin/net/slipcor/classranks/handlers/HandleSuperPerms.class delete mode 100644 bin/net/slipcor/classranks/managers/CommandManager.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/BOSE7$BOSEAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/BOSE7$BOSEBankAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/BOSE7.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/EE17$EEcoAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/EE17.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/MCUR$MCurrencyAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/MCUR.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoBankAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo5.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo6$iCoAccount.class delete mode 100644 bin/net/slipcor/classranks/register/payment/methods/iCo6.class delete mode 100644 src/net/slipcor/classranks/Tracker.java create mode 100644 src/net/slipcor/classranks/commands/PlayerCommands.java rename src/net/slipcor/classranks/core/{Class.java => Clazz.java} (89%) delete mode 100644 src/net/slipcor/classranks/core/PlayerClassList.java create mode 100644 src/net/slipcor/classranks/core/PlayerClazzList.java rename src/net/slipcor/classranks/core/{PlayerClassRank.java => PlayerClazzRank.java} (73%) delete mode 100644 src/net/slipcor/classranks/handlers/HandleBPerms.java delete mode 100644 src/net/slipcor/classranks/handlers/HandlePEX.java delete mode 100644 src/net/slipcor/classranks/handlers/HandleSuperPerms.java delete mode 100644 src/net/slipcor/classranks/managers/CommandManager.java delete mode 100644 src/net/slipcor/classranks/register/payment/methods/BOSE7.java delete mode 100644 src/net/slipcor/classranks/register/payment/methods/EE17.java delete mode 100644 src/net/slipcor/classranks/register/payment/methods/MCUR.java delete mode 100644 src/net/slipcor/classranks/register/payment/methods/iCo5.java delete mode 100644 src/net/slipcor/classranks/register/payment/methods/iCo6.java diff --git a/.classpath b/.classpath index 05e5809..ae0b110 100644 --- a/.classpath +++ b/.classpath @@ -2,14 +2,7 @@ - - - - - - - - - + + diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..b0c8d5c --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +/net diff --git a/bin/config.yml b/bin/config.yml index 8bfd115..ce28186 100644 --- a/bin/config.yml +++ b/bin/config.yml @@ -5,6 +5,8 @@ updatecheck: true # autoupdate, is not implemented now and should always false # autoupdate: false +# use UUID for permissions and player related values +useUUID: false rankpublic: true trackRanks: false defaultrankallworlds: false diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index 6bafc73eeb6f9c5a517b038c14fd1598ed90eadd..1fa2a2b84818d661c01077174e5fac78ab031653 100644 GIT binary patch literal 7647 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 ATL1t6 literal 6835 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 diff --git a/bin/net/slipcor/classranks/Tracker.class b/bin/net/slipcor/classranks/Tracker.class deleted file mode 100644 index f6c2ab60308a24f1e3c7951e2aa7d39195c74953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2731 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 delta 689 zcmY*VJ8#oq6g^)Y@-R-JE^Xe$rEQwnNldAEC6q_PD?@n$(!XYf~zW{U@hc>xiK3|ux>4};;1 zfFMFHS`rWjA4H5H?;Nmvghvz!_j{5dGybzC%qG$TPC{^gu};8b@HP6*3*Vl9gCXX; z4#WZ>uWLL@X{^B?T_;8rF|^-_Un=nWlV0<`v@d2P`OJb_#ih&J*(Q6HbX2rqBp1DqoR_ z`=_|FPjei}0FehMZjjR~=8+>N8EF)ec>vW@rOil=R1qDnpdy(Kio#9{)PsEO%MFq3cR z)-4;<*2IO8xG^UF1OJJM@ywK%baUr?ckVg&ocr58N|-x*HS)VB7N&Mxky;#rQx@VdL#b&CGjIgsByY5~UbGv{-DbN*`f@}+wquWk zw9_i7?WnHy((nXX6&P8442vqG*C#VLXJHxV1$t+{Em&1=wX*u4r)5R`(5rGm{n4G# zRa}nYQefu?AuZd&8kk<52+|dGsGnrMtGFJ+HC}_}Q^V#h)N$kE8)HqnJJ6u>sCoA@ zCS0$Fl`M8Po$dr!_+@dL(^>G__BKJP-;vUo8j}}Og KlMe_rZ2kjK*>Ix( delta 560 zcmY+A%TE(g6vlsdX0#7WsWed9($XsSF;hAU;|o+O_`pOHS0*k?Xs|)rIH?Pa32T?+ z?%cX%W3(k|Vj%AP16;ZD-!R5AV`9SQobR0bo$q|-9w&c}#lQdg{1sT_!G8Rk?pv|U zT7PG!-P?TB?zOi%{<6Z@+)y<2iqX`0wH|PiCpr3+noGq{OeKgBk1(xh=$6qKkCP#n zV2r$?QhT_c%IKCl6RAH5*ahty&y=r!7_Vomis`<;MGyB97{1!3M7Xt4elv2R~$ diff --git a/bin/net/slipcor/classranks/commands/RankdownCommand.class b/bin/net/slipcor/classranks/commands/RankdownCommand.class index 576ad2eef901fdabce4cde3c7c6293f2a9e29e2c..4657d3d110767db00585aa2ac2be151a41650dc8 100644 GIT binary patch delta 151 zcmbOrG(l*>1@Ywk+}y;xlw$pWoW#o1B4;Rf;`4f3Qk!cTx3S=q^kS=F6qI9NVUTCw zWKdw>V^Cy}Vo;iVo&BJqIs-d{27@4jCWADC7K1E<9)miAK7%oX0fRMzAwvd((d3;R F;Q*?GD{lY* delta 151 zcmbOrG(l*>1@YX(yu|d>qGEmL{9GVA#TUY#_`DvM)aF{oZ7et?z1V6P1?3r77!(*d z859}#7?c>K7?dYpXFsT@!NAU-$sov}#URa~%^=I5&!Em=z+lW^$Y9N2#E`*YJb5Qa FH~@PBD*^xj diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class index 1757ac502677528ecb5c757d3662fb62871edf47..56380bb2452dab59d9b2f33f643852ca30894553 100644 GIT binary patch delta 170 zcmeAY>Jpl8PBA$@H#adarC2{8C$TcM$QjDDW@KPWNn&Ks^O>B;EIwJEjdLV^Cy}Vo;iVk^P{eIs-d{27@4jCWADC7K1E< Z9)miAK7%oX0fRMzAwvd((d5k>;Q+@%Ewlgt delta 166 zcmeAY>Jpl8PBAwzFEKr}s94`QKNrYO@rCfM85x*Tk{B8Ed?qI{i%(`_j1$M9a&tA~ z78ab6ZfsSIg7OS33=_q6K4<28~q=`o-yXQ-*GL$?TNKXZ=Ga z0*NI40DqM6&a?s%0wjK!y?5^1Gv}T;`|J0Qp8%HdB#sC}#&?w+dSb^3r0sY-3?=uQ zp-ri4mvkOSjA3A#?{eGYe#3rM+jbqr&|?lVj8;sot%PSklalXMM5u}kiK=M$T(zak z@btVh%ax1nenT{hD})pCd5a*1IuM3JRY~DDsMfnIe4$o|MD}bsw?WONpzd0TB9%lx z1{k8*+(sNj48!NJwlIiP0tA;t4|;WUBZ&kohEzrP?s~gbbLCrJ^9-TD;ob(9Lg(Gh znA#E{!_0-F8Ci+F6`E+>%opYLI>V=P<~Tc9C6Eof)^0Y1vP)ZBl>#r2#gC`Ag}>|i zDv*12S-GvM;!d-;TGq2qGfZD5yoD*;(TdG5eEAPbSCHXKto6g(OX3#p|MS!xGZu3n z$Zz3mSGGE0Cc;$_?sVc_$H>Dlc3Phk*%;y?)FRQlWiDkyzOR>pko?b9$zEdZ^A3e& zvZ8cb!7h1i5KBocYNl2-XiLX^A+%jA^Vaj)b;yvhqVy9+=rH+=vbf3mC?dB}9Hpoq zNm{Q__KxxheMj?$xSl`4;N~HQ_c4+$>|^YkX&t9^2r*jIv<@SMNsQnoCTM4@(@d2~ z$_R$`ErMnw=-{d&BE+lej+yBGa5fc<^Xr!pWI^^yewho4E{?) zKYfg!#sh<|xnwEQ)YEh}Z-!2zfY~n7In0v)x@u#AP#6jKcj)KTr#mgpsBnOXXBaGy VSc|77w2m2AT?Pz~2qA*Ue*l^kD$xJ{ diff --git a/bin/net/slipcor/classranks/core/PlayerClassList.class b/bin/net/slipcor/classranks/core/PlayerClassList.class deleted file mode 100644 index 39ff40952d94a5492c47c20dbc7c879032db969d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3288 zcmbVNU2_v<6n@@xlhClGwKfF>1jIrmfBa7OSs?`}fU1{;`8x9^@k?{l8>oR9wb^w%cR$Z&STut-UPG2oq_iQ&K)|^wVg<&Z4Em>b$>5^40rmxH| z*@c=yWL5j+trc6LKlj{WvgSJF;wUe99vbPo;44HuzqOiEN}qFG>z+iQYxks6EL*iT zmsk_+e8zGeQkFoYX9yV@bIMNbj6x!|nOwUNqwy()nGT&_mXBZ?naYA4K^OW=Y{zQ~ zU9tF7Hxyns5kyE%Q4?WoQ|Qe(WjnvNGH<&#tof2wxKgl6Q)vV|ucvC)yz+ZxjkZxkGU+L{`VGY5n>AJ#u)kQdO4V$!%)ZK4Rr`NXXCrtU z?}Tx%rP;h*GBJexv~PrC-&qR_P5mmxS2)~;^=5kU*)ZbNUN>%QLq-roUl>O^9~223 zK@!7K*>uMgrXO0Ua;>fsI0<{*4Uda`HP{OI-NIh z0-@$clDP8aLlf`Gm*~b~>wJXRM<%lPSYew}vt6rJaTNyZ{io}g_3fkEkwZR=%j}cq zRjz+EaRpa7lx6!a^K0#3KRvmB-NYnrD1;ZSYF@i?YFUr4Q@vAJE3;yXZw9%n5T$9a z)Z=g!W!jiuc7e2+CXvjOP-~O*D$&wFzU1+&2=|$Z&vBb%tIk*4D9l5f=S>vAJi@h# zUdalv*xcq?$J^Lge_w>42*6b|Joi$KM)jO9iV7xsNAmHLh)h=2+=6|za<4b>h`-5)=uaGZh=HGJ z>cSwO{V@29@;S(hJ9%jrpTK_a8sFaF8v%4!rB4z#fH!%Tpz9ye1`7< z{tfA%5-*_Ri67_}q^HCg^t>8zLVg^Dy?D#VO7pM82__z(|EC62NE`QQ7>`KMhf&za z1Uw=m44{c5lj}I}12zaUqu(tu&+W^dL0XVS{aBK^}3ytdi zK!(zwsjhM1xQ>hY``DHG1(y_|~^zd_I#r}3J?x6l6CBkD^(gFPyva*iP9(Srw% zi4KTgB7q!p5~u^hm@Sy+tzf~ zN#j0trlQ8NhWMeVG5)ooqDJb;_s{;;@_WsHNbe$%ahgKk|Ve55bQ1Ck_>QcOgMcTw7>&JMCy)1#F`U3xG8J1ot9ls=7q+>Ik jI}BZ9I*X+4Fr6i)v&?iHrc-%AI`sm*LORRLGJw*54FJ4-5TTJ{c7sSMcAK*tB zXNrl5tlZ4ZIrBO*pI`4E0M4-Q!4c@jDhpGi=TTzA$jCIcGJZ-!f-1Z*@0 za0Tj9`7A>t<4Jfuo~kGlDCd0xIa2~b|2IF(td1w=0wtcg$`>zmtg}mjqt<%mI@2Br zxV_{-RZxKMql7JiLaRM0L!jnk14WJ+K0FkO>FZbx7PGOkcXDiUJxL_ZNLtPKhjgQ5hx+8>uVJgPVVzbINz)ki-<|y$*TOMv-7;xu-vX#a0O2Qw7)6I&awQ xbeE`hj+dyv66GKu8^Gl>**Y~fP$g!Yn1fXtn%E)46}(2|5ijD!yM!F51`K=* zh77_CMhub+#tiZdCJY)3rVM%vW|LpAH!<2z&gQUT^qjl`NCr=S3M6AED{n+528GFQ*pxPxvjsCM>M*b{=rM3I z=riy!7%&Jk7&1sQ7%|8*7&B-vm;hx=C%?hHhDFW^q>3!NJdOn<+No@ zVqj%Ro}A9<&YA;cBd+v`4{IK%Mu25hEkxp^GNx0<1SvOM=n#_q`{xosHxC$sTbFfN*G&m#i> D*Gn~7 diff --git a/bin/net/slipcor/classranks/handlers/CRHandler.class b/bin/net/slipcor/classranks/handlers/CRHandler.class index 1b8169df47aa66ab30d53c4df316324ee5d1cf34..087581031c08b262a100f8b01e84bdddd5f3b6e2 100644 GIT binary patch delta 115 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 H`+xlxIUh3u diff --git a/bin/net/slipcor/classranks/handlers/HandleSuperPerms.class b/bin/net/slipcor/classranks/handlers/HandleSuperPerms.class deleted file mode 100644 index 1e65e9002b4c0c1323433e24574033cf5f6c28a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5843 zcmbVQd3;<|89g_dMid7Vx(nK!(d zDUAy#L<=gYh)WUNK3REi4cbr0{fc3H{1Rmdhcm)%?;J8&#-dbV}qRGelYu5enD z)T=0(I2~uuan>#mI)&}ItisvdJ;RQhO^#K@$8+UmTEDKiRypSslG}56JGq7zZ?^w> zz`)BCPOOi2btRY2*lrYy6{5wwHOZPU>BO1n5rlgc<~PW(XH;hNndrw7Qo<@0?LtPO zztPm^;Ng255EDyHyc}oIbJ_9WQ#gUC)d$JB%W#f?bQw@xR^D_m2EP}A;%ZY zu(Zy9PdmdHF|eLdR_z3%CN^LryS-rVF4tFa!`M!SLI!SP*Vh-f6PIF(iOWE(Xt%Ga zSb4%QgLVG$o^4TFLEm8mrs5u9<56rQihc2G9XFpz@$psqkxDvIlEYkxN+pt|c1%TIfv1m-jge@JQa*}w~#17=Ra)(tK(K%Ab=(bHeWmwN;t#lMa7_la( zMpS2ME-olg51HazZ$VH^lBadto}6jO&zu#Rsb!PJK+l%Xw6gNKQPjNg&7DtQvp1Km z^f>9|>*BnUU9J>mZMA*D5R@apIDK|BiUe4in$*R0^5CI0tJM#4Xp3S4wtf zNe3qJIs>l_3MbX{ z{|pBv-YP<8u+@bRQM{d@^=WX0p|>)>xM%2{Cfh4Q9>bQdH#q-b zVdBI1h{DN4XHCv6m8D<;)9Oh*%j=*OO-oIG<^!ICIG&UCmD zF2g5Gd=j5xeb^xii=RJ;K&nQgxL3inG8sD)&&p|mMgEM!tazCnr76c3``PV%@q*(C zSG-gy79F=Nq<_G~=j5!^S+aKd`#8yy4mQb-?Shh^&bM-oWJLw~gC-71mJ4LNlf#|| zVgP3phZ%wwl&oS1Ur;zcJag)HmL(kcA}yz+pIttDiLw=E{yeWlWFZ5SpH23Jvx{6l zLbkg4J`?xtKF(M1?XEKsWJ^B`Du`tDq}O)_p5#DvH(BMn*5q)mL=c|9>?ppe0J;6P ziSNh;(aPYX_#W3(o6y6TLN61S3JgCq@gw}$0`YoZ|J(w#0J_eNG2mNxRKX#ZB9Cx}_r4e=;o*BH=V<*UB%i7R2NOgLg6c zMBwinj_|XA*I9fTMTB#J1-%Dg_9h;}+}^`DZfoKIj(-UA@8?JhPUJPlc|aGh3%UAa z%*RV`lC1Mqb7Uc(9P;X|nCy+drP~>laAYXNb&7>a9Ku@^ zn=GNLBL$DWjTc>=TX>V`JA`+%pcZ2PRecO8egO>V7vh>v_d{%yi?JG)Aj`TH$RTO0WnQRZ zl1|7NNApA&Mhc=s?SVa3a~z#=I$Se)iA!*-tUe1J9GDm{8p>B*Vyk5pu8O26i&VN^sRazP6HBQ##C-U?>m`yz{?rxBZXx|sy5HB2C+XD#NM!+wVHS}70)6!$5_mC z6MhEGJ`~1060I!KBu#o_ zj&^keUEj#9WU9t}B6Ob!-6wPxi2J8Q_jPIgu|BPvX#3_GyV1~YqqP2vdwjSC7?}u= z!L+9F%zoZ_Eg@S!aEmtS9Sw}oq~V9E@K^lJH`S)JuS{|83hsxtrp diff --git a/bin/net/slipcor/classranks/handlers/HandleVaultPerms.class b/bin/net/slipcor/classranks/handlers/HandleVaultPerms.class index 779c8471c633028131be4317b1ae2017f3db258d..310aa572cd2adcefa56d804132d0e65624e13c86 100644 GIT binary patch literal 8491 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 A;s5{u diff --git a/bin/net/slipcor/classranks/listeners/CRServerListener.class b/bin/net/slipcor/classranks/listeners/CRServerListener.class index a0ccfe6fb505283d9c31893196738fc178ecc435..1de8022bfeb49d54c2fa98778d2688ad391e4bed 100644 GIT binary patch delta 2359 zcmZ`)30M?m7=FK<*_qkhfz>tS0R=}3GhAAQ5+#uY%0k71@YY&kTvwJ|Vu4c1HMPS| z?avCkPr3^vS~@H`?7rmw*kl_ zrwSWk?56HivD22mY4Y~esz`0EKU^L4%?$Zhn)M}pOOZ*j|J&QzK~qTBrLD?XH zJIXLk#Z zVpy-kjm1uwI77#oI7?ipWoa>-t>YY=D+(P)@Zx+O7ht1U;~3#|p&1wI5V%Mz(+mee=lwc=eU!~c-@zLiuH@sHTv}=k zIM0QAT%+S!Y$T`wv!UEyYdUc~Zd7rDnCVU*`agWp(TbbI$Bt6EMPxe-x=l=VW{kUo zpv<0JKDBbDhPwzU_5N^8W1X=q(ipDx8huDKwDTk^x6&DN%QbX}E1fGGvNakW)->VM zQpAC-pmsbS($S5F#YL{eGal9Pm~}*s<^Je&vtfCJ`SCcORPh8MTP${E+jTsJr$vhH zQ=ZlF9G(|tdahQ37j?XZm&JNLixa-0<5j#S+Vn~3Z!p^?`tl63BodC)u5{onyrbf6 z>$t`wrE<2Ncvoa4SyAun_y8Y@*-1|*U*IbhUkW36u=F*)5fhR}4*L#2sQ8{RFj61z zEp4o+2{!mD%=#viY4am~604I7m0xuHir++ca=!A1j$P;xyOT@YyZIa@<{2&mu2G42 z++))5ADcO+Wg#$S_0EZ$CK4f8xxOBkqmA8p(nS+TiG#D$DU@FJhxY*+4n7D=Q6PbsJ(UUR-Ly0rnT>z z_RfE#ZQD=U{bpS+Q;Muy|5sw9o~@jujjyvl^4!P_1Satr7s12i7{aU=&zzXREGXt1 zX9}jG0@H9D%CVSl_W)*L16!^|B_6~aR{2~!jd^$-^YI}T;Cn2@Pwe?8mXL%KC<9Ar zB&x`ZYRZL4MSQ!LArPZ^SWfd1q$q0W6ohCkYUwP5X)_{pHR|XNoJe=Nqv^|bz;&@@YHzA2Z7Gdaa?1*_@Z^xT)yth}zBdq4IidEJO6{}gQF$}|L-1u6) z5Z1A{&)7%O`Fn=Ink~jhjBglH@i9JOJeHzm*wjPW`YAr!59*E>gSN5TqCVJ+cME34 z@p%`%C7##MEhw?D#_>C&P3Z8?ejV=U!e7J#-!O=5{OlFMjxOR+_sZJyQMj93%sL`#MmBQ%4d}QvIRF3v delta 2268 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 Kw{!0bx#KsjeMF@I literal 10266 zcmcIqd3;pYb^fk2n??^TBm@kb1zwPlgbdh#H6RPbCR+k5urOd357I-78O_MEfJ9y1X_Go8^gH*xdGkin z0QtG)56!&$?mhRM?|f&um-*@+KK~^E3)L<^N)#I6X1XaAiw^W8l1)9aNGg?##CNBf z`Xlj3pP5WGwaHkg_2h>~q2l()o=8(H67OqTzvFhZC#~Su3(b^5b%%bNNk?N%%ah5- zP)9VC4l9&xjP}JN=}gj8XdY|M(vBjEP%qO`BHThjzJXY#FB(_4tk?praF-at=_S28 z6y_D1>KM7w+>zl-AaDD|p%xy`~=%6spFsFNg|M8JLLi)NiR? zSO$ej2E6boT+$JZo9iFuTOYc0oWYHUm= zqw&6QUAG@~3bQWg+#qUEFIvqJG#d?EiFqSLT5Jo~ZB+=Sv>NLo{Tj_YBkgS!ruCWW z)zM@sy}?ZO%e)mst|i2J)S9}{L!!#n2Cl&(aw3{GlaX|S=1!`$=W3d_+vDMKEJ3p$ z*V4avlH}eR2xBQ>j+=uFn29+Ft}qIh5rP&2*9m95Itu+*u26G6?1bmCuFb$oTqW{p zY7ncj){iv>v1%b>pj~kFnRjF&u~ZPPxWPaNIu*(ZSPrX^3ficOf$I%yz>N&~U6Ir} zZ3`oW9`W~BlN40Xd4kgw&74UrXBQ*Ao+;*$WaBobBR#u2BLjA*EE&UnqrEq#L$~4< zKej1MNF@83c4T(%j;5Pd=nn(8;!l{V1cz8;$fR=f#@MH>!?n_kr=#hiCTo5;$auQV zKm^P=6|qF5S2J!yGSOqE7+bBi#h0EJ1uZ6A*DiGIHDF>VLyl@ne6+i*v?GMxNaakJ z#CZ=A}panccShlxyClT2g=sB)bRz=(YA-qVS=Wn<1=I@&KS;W5?+z?=?0 z1{5Zb49yjpXsp*v3ayg{Qjm(XClbq;>j^|bDCbhd=uLx2pgw@T43U~;Ej98uWMCiO z!C;6C4482yu*NanT|^stJApe5+$F&iNGB{DB)PuJz<$gjy`$o=0|xGqkPGxA;^{~< zPE>;fE{Mxgd7n%wtP4W}x!Pa@R_KN?p(V5FafutZvloqN*@Y4dBTuq|gt-V*SW~n_ z<)f8^yr5jkJ0CRg03Kv)bBB!?BBEKUa0OH2`2<+OAjtlifj`HG$c1RU*Blfs6jY!b z7upH9aDDyGohgYK#eu3^RP1n9g~fj~N|rMA2CD|y>(IRgTG-(sDbky=Pz>famxgI_ zt`Zdbme4O9`_08RN)yPpozXt6VVBvT*uzTMG=_o2b5h+_Nob!i@DV&Bc>k4wPwL{4 z)Zzj-$lgZFudzmYn;BP!@EJcoUA*L53eg`a1BdZhX0rZNpH{7CUL76Hb=_s$=yL{+ z;3xywGL=G#F~@22+B7J+PA`aKc*c+84E-XM8+)OFtn_;2smLC4yR~@$!wfwOjd&tm zvon#26A!X;AeV}#7Kd7F&}&&ZEO|neoZFU<<+hP&DO_B-<;dp@ycd5eq4$D;7jcRy zNr;$;NlP<@WOL!)wku-22?y|Hh4G?|+sO%>k>vT65jis#a-$q(XK+gUDlOE~3P7Uu zmLAN2`MR9ff+|?BXpojmw|W1?fifDVQ6t;jdq(4XSkx2Ap(b{2{krc6uWWbED6IK{ z?cd>Beth#HNVGbU?2n{v_8Is#zC#l2)PuJDbH}i%h-ai@{;u@N|G=(ejAf&oP{5Ep zwijW3U3UPlGF4mjX0vaS+5!9%TVZ=BmNX;1Lp7#Of%5MA3Zb#yF))&hin7$oXllUf z-+d|Dcz-k{pffAZx}Z`_r@d{7l;rc3tm)BJgX|o}i&5~fs7FfQO-FYTeytJ&YB*%w5S=dI&an_r3_V~O0Dj`P1gX0 zg@rlKazTb?yl5icv@;qrn^yCWHQOEz2b7mWC|K(>uUz?6nO_B%KwWvOKs7@Jr9<>H z*NV%6)MUJ0jbpKLt+<%I4Rr|?SQc1KML_XB!pP}Tlh|1kP*psUH`lN@s%k?`Qj-}b z(rhxM>Wk5sitU(7~UpT`2~3Wj)6N>Mab6VJqAvjU3rE7L>mE2aBL zs5%xVHJ8^Tg-0U`GN%ry2CmaAvDU3t^9%+ePtd-Y8ShK)(l{iR96=G7GnAA4<P7c)!nQ213j=AcpfZ9OhC@jr5)BT?6GSo(Chk`n0?ch?RoKGCn z&h%{E56ZWaZM4J3c+SMq0>xGVYny;IhH2rTx>arWE1t?Hez}jZZte7C%c{X1b3j6z)|g!6N_)<$Fpb%m$RvAA$pE>&&aT_@L>0^e zG37mKDS~p#$0t9ZN)X^PujTkXC>Lw|oXD|p7|$7(@TrM&8ByVJ%n54i!(M`Xp*a_}nZSHs_^VI?kpsm${@? zI8rNU;#HJZhWS`vOMRU(y_C9vQnOgtc@QlP&w?TJJZd}Yk7F4Jn>`0HGvu*{Ti0=T z1-D-HC<2XHTz^Dfk%5n$dyPx=m*>(4kE-&0_v5JN(n% zpQ4Su**5km3K9pjTE?zBh=rht3v#`tbQ0<8iuhwi=OAvDrR!3HtuDYag#K7 z3#jr!y7Fq?M=n4M7Q2jUwTLKTB6p&6QJ5}T?y_bBqW>Q*x*fX-hZUwV2}ZSqj`Gn}`zrf89B-Kg z-qO_c9>l7UH%HB8&(oN75{WJ1%wgPd0-4G^Sqz3e#Dkw%yfcft=h~0&eiUW;YlleC zzCDq1@+0-aV2@_-m2?LPMk#qW8EY6tYw5stY{&Jy@ms^orqvikr-o^+CfGi_M{8e- zy|`C9eKKygo!&%vh0`9~N2vy>Nh>-3etrteTZHA~gb)=4ME6+(Zm$0x%Z2R)Q~AuZ zq)qtm5mkxqPA9s|i0a3gM@ zF_I{)(C*YQNNCT~Fi2>R`(s0U@~F^$AKq_Ux}M&V>^P0A{{X``|MAeY+pHKChg!*8 zY67rL>u06jY20Fcl)DvM_MJIJZ3BPHht?k?4<3yZ%YqzUw7K> zqfWc%t0;YYJAJ#0zU`xL`wM*gQ9CF6pZfMM@Hk<&a>B=SfxcY3jZsNAjCAH5S|MRT z8U7Ma*ccrr`^9k`bBFQq&W6)y>p_jSiq*Dk2 zP;X%&!<(|cfG=7WsF|E4dGIc=U|r*BY-eHmQnM%IIgPL+ujiY+jpVz0)mAlVt6rkc zA#WC^>x-CXP5T>8%g@j@TQ7>*yoeM9_EW2OQ_lnR%RQvXdl)wNvS+!E#o~V2{a)Jm zK2rSs%#R-=5)Wt`S}aQ(9PYAnBdybjNUj>vh?G)pw+=}UCC|s-;%j^-K`|aBXVIaP zVC$QdT86LV8#Y#h^hY`891^UW%R*&muuD26wq$dggP~x3L*p=B4tb_{tNmI0J*f~1 zN(U7RoWXRva8$nH_V(QeF^xP31vIDyuiR8A5b%#91Wba7`uv(vba1>C_jcc$vuEikaSNH*iYghKBb}E$$Uk_9cT|Z z&>q5Tj7|xRLwKFvBpeRm4g5eCszdl^{E*Pf*pHa^B-{>ZX9TFrliC?&)MlH`OF`{| z3Gkjpr*=W@%gT(L<(R+cRELHFpLPSU$|D1CCbIS40DaSvj9RHkh z{Bz3j&nd@0U$p%rfx%xiyoJs5%6v6rGI#q$E`{JF`d7N%u3QRP*jWDzRuCR5)_-Xe zR(DGIY~X^=nOYPdD-}M^onGMHFOtoth|f#xgujeyafbgf{S}Ra)gE;@ICSAZbbCbY zoD|S$rvR}^C&g>6r1&fR+79$N+(($YUsKE*^5)W_FXTIor6C_v{C|dg7LER!+J`(k zfZrU0Tkbf{&n!%g`SGFvEYJtauaO{MCqcf!TJSO^@%ni>zRA4!E&c@H+YI9GU_HLe z0{RN>#;Y2TwU!|cAp0F+?01N<-yz0+4U%-m@6aH5xsR16efjLTK9?PZ25;f41zO3E zNCJYU-e9Cv{()^Ut;#BjNo=W79^t^V%BRR*T?$n>+io3^RjR`MvPxBQibE3}nrb4~ zPEmMPO;@nRs7qO=IvdVl9OYE0%emoExDA&tZ zDIRq*)gEU~{b}s4&nl_qSvCI&r1@}lGigxmnK7)Elx9`Q`B{I#(ml3kl1qTFo;>R;@XzO}c?5RrWV~OBeYL;<{>IwdV=U6gWd(>*yiMSfZP~ z2Qk(Cs!Da{-rVC;)jrFVkDvR3qxX7Cx!jrMe9qGQQ7t{^M!65LTDX0@VF13*AbO2m z#p^uEy@41L{{WN95YzrX{FrR}2}{dQnXG=s(ET}?`U|r2m(1t90pnkw65(XxL0jeH?i!L@>X;)%)4tKI2mXpF_EKxgbP`Npc@}outXi^Z@DE{_F8T@V0IBm4mKlvH7ALEsHRbU{ad}lZnM{OZi;~6F;aIpbl1LVhjaTEjVzTqw zB!emEwD96^aaA~0S$y35(<0@yOx~KRy2@ybsq3T`0FG6#rzzM&nZ$x>rs9@{rq`Yj zPgI9%-KEvEnnRj4wJN+UlE|1=F&`T}=xXC4^Xn=bXZfn*vB5CSz>8BH|}Wc{a7CwoI~D!Aw83qr*+gXDVuea%pmC za4v#29YO7x{FRYf{W_9lI;>a0Bz-h>wb82L(TPNO*`#Q)cBr2^QpluEOu=TlZR$*2 zfLt4hWSMl-ArLL|RQ+@$6)6CNZ3>Xh)M`>R7MW64JwK9|5uRU# z{pU`Kmxrrnh7(cs+kI)&E{uY{{aQNb#uI8HEZ|r}NfT!Fn(Lg57Mkg`iD;~H=%jd} zvUq;oqD9f#;z+DETDz>+q1w=bIVO$5c{a+KGi6L&w5lSKuxJdEr62=L$WJ3_oFeXc zro3MJFHoimB-^%FkCw}UKLN+w16tH%W31GHQHvvPY;1ij-;p}a%O7R;<4<&k7^ zL0y$Pvg>WSfmTC7fR`3T6;rfyW*KTzjdU#=MB^q}W75rsU>?TmCDJDG7P=Jz7fp_f zEC|+hShGTJ4~vFoHwdlx6`IO=`JRFzB6{F5-V*Y zL9n%W0B|+^UL|+`#LB(qWJ+7(3I%k(P3!0Z5G5H2C(0LUr=f8j(K%7u|+t=1_x&##&C z577NBQ+7GraLo(JNNp+X@AvehNk61qB)!|JcqJl`%Hm0p#gQtT{zpGyud_x^n^HDq zA{NM?OOufhu_g42O~2AkNHn_OpfuhFvQe3h^FDs{ z#|Q}tZut@p*lcqa)=|Ddym}cz0gYgFv})1(_>!vP#Y(jnyS>HZol!#r+=^S9oWs;b zZRfzFZO-K&s0}Nqv}Ohux|(oY!5oY8_BTn9SiG)sVMs@2X`@tE(^(;Yn9c1NVU)Kz zQoAq?d)}hEo`_T;EQ%zGYr@N_;dvKN)-$k&Be;Xf2&-C(id&dzb4NyWrGl~1<>m3Z z7(&Kr&1|d1qiz9iHwQ5n=1_|}!wR^+v@|ThS`}IzxU0?G6w7<3kDoby+V}wX;9e&8 zWE$22dmYl6HWx6$Js(bLyrwre(De<)U@#RWNsMrXv-N zEe4U}iDkuV#Pr&5`63A2HtuJ0e;(lINIh5e06`3I~d{K_@y21HH?76$irf#x#o&llc@5HQ{JQ$YO+9!BEEPHSuVyR=M`YJl*CQd;&Ct zV|3G}0@@#is4K(IZSLqYT^v_jEuO_h@H~08&2xAzHsg4n%IV6G?v#xI`xNlWHlMj~A_fcOhAS%6TCvCyZ6w{L5;iB*Ql?sJbVY?yx^*@$<|ROSNwjuh zMIyW;}0SW!Y&mvCqiLI86unjs{_{+HebLOf;$|>Q``ZJ_QTTR zzo=-mA~GK*Rnb=o$t5;ls)G4I5;=#-2sV(MR4VQ=n=e-i%1YMFhreH5t91AZb(nv% z`6_joc2s8_YhWFt{Ug@ zyxQg)`6gfoEigTjSR6^HO*Dxco!2VJ<~26oqUdIfKK_K!YWi(9-_G^UbSHK}GOOuy z*i*zpb%}5-0VKjRaaulsCHe$RB#jm1PBgmro8absl|6_)k?f3p*T#AzGawR5++^bam8m3l_kj zU^4WS8!qUCTKWjox(VgQLY}LkOh>e|^+R$Y08OLpYWFS&cMh;!7%q2j1V)9ESBStdIt1DEVTcufBW{YOHsbHoO(vNKZSP7|j_V`JYj+c*6gi=6Kr0;hmZLUe`hjc zn%w<+ZT_Br0FTEs?VI}duI)r<$p5qXCw@|mLv(8KFF4BX%J}ZI`8SpJ@h5A;iQ42W z7zCv|cia5CN@Ex>Yw#2HVyn*fuzSI_5IPU&Xmw%0EgwDtqW+EW+QL-xOgMiIH<&dk zQ8Be;R7D4EMb&|^Q8DvP;B!;!bQW@Mo0-WQ;*-nhqS|SI;4dF@YX-nkd zh+tJzdcd*8&g(YVq*7JjU!C+(I#Snylw?*{I6Bl42ol@_cHV@>g=@o>I0B<|wIHO^ z(>I9@w& z^;qI4j5{tC(Pvx=VhzH8(N$Gi5hm4(A$T!8TIr;~9Y{lMF-$EOh$dB!POMl0#jU^$ zSk*;J44i?ZY%$v1Lb@lZP#$ZGaRL@vMFZL&aDr4A$4tp{qf|>wgl+*umNW}g%9zkZ z?YqNGag55`S67^nj3g!|;&nAx@=`Iy7RLz~gH~A5VN9n_6%R6Wc*^Ev;^Drt#57>6 zpoW~Opw0{>A1a2!^GuL3l$LpLSC!T?vO0|1xLp%YBw?6!ee{njpE;H|3AigD%GGli z6>FXXq8A}1(O}ha&GHkAu+8uD2bO@(DzRPlDq@Rl^-AfkN=+0?M8U1jGx&(bB3n#S zLr^Tp(-Ny}N3w6YqB2OQLnFj3>x*%f7Nc=iBG8Bgkoe0%|R6Ud0Cxr(sP6sw{ zRV@KU;ME>7vSlplY#L4@EU^S?VG0s>ZY%`5UZ>*iBtjvv3=B{J5X*7=qumZ{7G7m` zs4kX3exWjkiev?bz{L#0*U?NFYRvXo;#@ca`)v#OIG9)hj_Ak(?hRv$ox$$@oKwIK zUHzsq3u1*WE)W-j6_kgmWkKn^IezgMafvA|Zt4z=(FHwQTq;l)P_C83nayXFnmCS4 z-58{2#pSlRLR<;>NmQS-JWox;D-&>k4^p_AX^E>qNWC@1T95>Puw;<`)d}LRCGOMjgQGI0Q3SPzDb|+-r++@lWL~H>udUR^Jl$yK#$-SyVO^nbsSW ztgW}jVM@dsv;->bls4XIi%sf=K|sBLC#7NvOFRtxU6YrHs2(j|k0NJtKq+y?LJ%K= z3#3Wrs1fBZyISN4@b`gXDDDEGp)so#gpjhc#8c3je_)PNdlJtem%A?x86v-xX}|%2 zW{A8(M>7_Xc^0H^PE|nxl#74aV!MvxCQchY+Y&D@jdt$JgysU=$)V*+Eh=a1Pod=+ zH}_dPA%6;;85&(tp;f2KS-OP`OT4J;xvEY&4yJfnxoEKkaZ9|4SnhzEC|?+lCnK7k z4i94o|AsPDlTzs}r(&)09*XozHr`OOvB47mf%93WSUnc53XM-B;)zh#{(yioLO?57 z$ALj$Dc-fkd)lRhIJvQqB|bpVx(|B$CT90XQ0e@SU=N(!?f$y_6BKuw2MXuMO`$c- zoQcnD@wv)@wzn-{45fQ5MA28Q4kXV|-_e@0AL+ z9j)eg36}T~6+G>LVxve&qz<)62h00t)Sq0I)Cb~@U#3`3vx>VX#Mn&_%o4w}WIa2> zzpaJMgzoX_GO|)?(8$6!A9O4%KGI0kTDvc!l`G)- zFqRb1GAV~dI|(668bBjM;2hsU|Fxv|U?Qx?L5CvvaTpO^gS4QA_H_v?=?AKM9ZTBK z-?I{Nl>pOsb5vm|!+8KN%WPY=k~!FgquaC`O>>iPxP{P|Sa3bPmIFhS8fdrz8MI{^ znFrh)kcwIdGnv|iaGeNbWTIi)* zbsrEu(x41!wR$aZrB|!WQ;@34~kU%@W_XcXydm|mzKph@2 zAEd6SXa9rLy?5b*)U)@)R4}`61L3(3o{ML1p#Bfi06ZS4UY9&bgYE|)K|}Dji$8A!<*(fN}x#q24r@3TYe_Q7Oi?brz?gGz`ChhTaTxql#S|6a!b{T^@G&R`2yR z=wSpCxuZAG*rH7|fpI5eQtnjzDcnfY&@|A@2AYj=eTo|Bq!ArfQ-A#ES)^yp!>n~Q zzkwEZ*hq^odL5mPAGx)uiHnW3YKh!49T+{=(^*Bi=V77qnKscyYPCyN(cy)1K<HI9%CcjQ|c|;Y}`ui3ylFA z>Aq5rbl-VyC9BXgpwv)n0F!(p-_tIqX?lKu zCGzYB`Y88Pz|PCUlSBXPA=zA-BTHH3Zs=e`t{V zVg26>tev@RVtCg)+nCpXNOnDSDa}>W_3UpnLdHA?k#+Q41O1$Dg2=y>=H};aq4xQ? z4Ya3$MH{xRT}fG~pF^_Ov40D7#b4)S+GTIzY=c%&OrsX$Hfidv=eApDmU@jRXY?jM zTu^B+Ke!c=;^GqI5Rh^Doh_{6ET{W9m(+*LhNZef^)3+qIp1PL?6+{Iv$b(W$U^GK@y$}3p;348h;I1A@a`SRm z(-}pZco+;|?iy0dIZPYmk(y|#2hf5%TJaUm%;77@SZY>9Nt>d;CLSxONN(bZX!6=@ z;$sD6z?z~kQYBn{SE^fl6wFb@7>TLrrUB}Cy&w>p7 zy!04=Qyh7|1kEwc>Anchpx7q9SWrD(rf8u#|9tl;lk*{43cz2HMf|^E;=)$Iu4oY( zm&KKmcPI~449b_O-+K8VU#*VIk8S4r8h5F6eUSf-HyAn~-)P|L@El|)YL_|cX_hW^pjg=Md@-lX(QFr@#Y75o}qz;EE*?+>u4zoGpdH+%OY%rofzBZ1gZ;YArtx-Al zWMRC|hVdnPjNjPwF#B=)EZ}L!wr2omd5+<1&rELRiE@r7fp<%|wdZ`!^<2k6&l+yy zd4%&kuX0<@`+S(^7jEYzZsYZEdv6Es=GbMSmJ-p%7K-g55hJ&n70 zui)<9HQd9yj(d8a<6hnu@$MD$y~(}7r^H@5T)A%GQtjY*-{ObC3%IC)r$>1++`s`bW%IqBKKvrTL^*uF zr#HWh-qzr}4*UwgO1a>@9sC+r%LQkR;(zn&6a?RN<~R6F3gYyi<^NztF3vxsX9U3k zSLzu-oNo!gh2A!v>+pqunw!gSLyEUix7`q{(hkR%RJDit;;;Vy_T5xy(zYIZ=`w0< z67C1SW1?i3?nYngx!gqQk)_G+f`r}p1d}&)+)dpvqWf+dXL66#8c&7wG7V(jA)s8|fummhK7~j+k zK|Qz>igFmfuo#Z(Fe7LakED0eevbYhpiET^G(v}OKc+;4eiRl21LsRWYGDyr<6GgQ zw;>`Y&{e_@<~9(JbQb|Is8^^U&&GH?N@S7L%vMRBy;P>Y6ayno)GXBzvhxkmUh3ZT zHF(PH7_L6(Y8>x&=+1t75ji#k4VDW9FqaoTb9jM0g^fYel%ma^TghMK88D@uyt#Kz zK_4PFL_sR<#X;(;&A84w3{c|H;7ILf+a$kqq`hzbob2BJr6dz zcjoA#gN-iE9Nj-1zBJjQ)=xokWX4d$5G`%d9bJ+!8rg+|j2@gZT9h7a^zh8lBU>EJ zj!tiSa4G^4W2VRwquvSU_Avos0)Y3)GX^w>qw(bM!}$j18GSb2y!WL>L79Ne6mb-q`93Ms1;A4~1>3^KS{q7`g+}84PuEXWK#r!%i!7ZF+f_S;`@}ERsw1fF< zEfhyOOqmi2F(f4vxO$;{5P`JU5K$(MAt@yM>bbDkhGu&|iQk3S6vx7c5vq3YYPYii z(S%U%a5NYc8x)uc1*XlOQbY}6vNBm)=-zx|bBU+Pi93`N$AbV)K-MQsie|=Th=weI zxhraBj3#Tok>?$dhIGD{^SoI5=DjaBH(@#k=0V4O6ci_<=QNVvv0{IQ^sj)cbRo6o zzu+h?rmnd6*^B>5Q~5HA@#S#!uf*qPm(y*y-T4ClU6cE0hcqd2BW;kfVmn+N1l6H6 zkHnYI_lsFL0s~>q?czib-b1J3Yf*IsUVQ{@$k?rXA-GBNVY`@n?WBGvw9XcDoWp4M z3#?`6F%KyP^$tNV z(s|Ci3ill%dc5nACSy=61bm!!ns6G#X{jW@S%pDSm0|aEvQVdZ&=J!KB)wJ*;I2Xf zM6H|9&oMmfJlQJb3De2NqcnT@dlwZph+37HbWBoEELLc2c2bx@u{4d2%p7!v8YC62 zL80;ij?Brm#s~#T32c+}WCq?a%qi4XQb%pPvtYbS4LPEoR%@iLQ;%2aVQM!k>B6GT z-dk~F#*1NyqVek{>g;`#s%A@!nm*eA*{09-0L=7K*yzc~T>m@FAz!4{+x`>H93^?Qdzx0xhij4q_9K|cDh3$WNq|e zuUDwJ*&@+i_lfgYlC1`di#CeOlzj5f=y2KaZy>#LBpjO0&iA-ETjgQsRO^mXUk2@l zE09f{AHA;Q{ag(=Dvhxa`J;WZ6+El)p!nEk5Yw+z<{0pF!U-8Dhsb&XaN#QlTwD1z zjcYsE@&n{D+?*NGCjh@mT!*BnKi|JetYlhAcjx;LF{vW1|6|L#IjUny1NAgM&+BCL zQnIpIokf~_hq48&L38}Kl1_34#Z6A)ww^j=k`w-BBU`N8<8gI{Bij=*iR@Mh3UeDX z^erCt8tmK=RKW9qy>3;k}KA*qZ|Wh=6ZDq;bTp#hI+d=;yn zfb#&Ws@Jb<6nB>R^%H`jJb#0@=WzsiSfUvK&dWgNzVibOe0n`9MOulZS&L71ULX;A zrB27?W|CkPouaz`Kwj+}5CT&MXg<|~;3U@4CkZO0QfCUZs~hfXa@uK1ZeDG5(xS3X zD=SCMKX6dh?~H?f*K;4#bNf3H=t?>wwPCSABM=l1f&WqHaeq0djhRjX#K|l>`e<`Y z`Uo3UbtFgOtEr$Rl&elkA7tv2`%HCA%SzU4z*cA_O*E|^gqB!nPXzB^f_)|S zU{Lpu5i=xnC5=umq(T%o%-EKex+cBiIqgb3pYC-bIsU`VEo3_cG6${xN-utmOm1aOXLA{wma!~Fw zFxD`-3Kh+E*@ep7YSre=9^%voz5RzE%@cC8pyI4tT^)p)Q^h2=Hi%i7lOaNV4BLaDqN`YDlQ!-GcF|iuVsuqE_ji=j~hK ztEbMTeg()e$-0KOFJ;`4okx}Ie0jdrG#jc7x^f7SCgI-S8=n7NgDmIBv zor;_@lyyZ;4b7~`0SzGh1rTP}WT|pmp>iEilFj!cy4gZU=r*HjhhB7`WDWduSyZ+7 z>D%HI^a^40(*?c4#)6)Ui7x2*08g`TMOtLFFAsFS0y>JPwxSG<8tDMn#iw*0%o(1_h5Z0b^Rtw4v>lus zBZxA%n(Lm(|8OEr20?Nh&?#Q#>~?0;f?^|MtAe5i^nWTSrlsIe3yPWIkev_woPy&2 z4HHdZZrdm;&0*ujZ;cBFlp} z72l4u#ck9bZ6QiugZM6F*6yZ}D1RNx_u*e#x}T==di>Kz4Ri)?L^*5|%3+VJ6QuM)dKePjdM+_ETF%<0x6gEc*KN2ljVw%Xt1?yHKCUV45 z(OR4f2W3ReidD%DZ0tl zqK7<8beD&VUb2TMkcDXbib6SD6v;87k33QImF1#X#za4Pj_5Bhz`MVo?@}>P-XM;W z^`b;>5`*LpF<8DPhRF9ssr*U|#cik(!y|?pelg0(5@U>9G1h1+#u)XSYx)BWXuzjjdHXL#1tbcrW!Tkcw;HrGejF>g_v$!C}tX0i4%=A zVz#kX%rWj2CmGL*lZ}_rz9vpFUKjI?4@HIXnTQzw6$^~LBH|IE(qo9zJOQ!DlPjt` z`6A}&Dr!7^Mcgw`Bs}9qt!I*`^Gp|uJ#)lTPgpGTB*Yn>Ifd_R-Eg3 zS)AwjMEu$F6P|y?yFKE3FNq7hoy3LS&f+p}4{@b;fVj##SX}Kb71w$vh?U++VwHD_ zxWPL|+~}PrZt~6-w|HaXHt!N~yZ2mC@4Zyq;k{hk>0Kr6_FgaU_125~yz9jM-bc|s zj`k_B&bv)K;Qbfc7sPt+i=x5%y4c|TP;BykEgtgzigp*;J>p?gibqT@TAz5-42Z|f zT=BTsQ9Nn(5Ko!K;%W0pJP$%!DxNV%iY?|CwByBAbE0_GoFbkxXN!NCr=p#Y-wVX^ z=4s*uvsUad7mJt8GsP?BdE!;`Qt_I3g?Qb(N4#Nf7H^tQ;Q49smbp#5Z9XgBF<%ky zns12r%y-25=11ZK^9%8zCB#Qo7TO@%eDRLeUc6;>5+7Tg#V1xD@tJk3_}q$$FRVr4 zzt$4*t+iZyXRQ?9TN}iW)^_nf>m%`#^{M#9=Mz8rf?~HXPweq^l7_EPdVEKr9gKFU z^!i3g(>E6F1Znw>mI2>XY5V4(t&rKim~7=cSLXOGM*COU+IP8Z9^!vV(7{?C9GrJNb5?eOZQlugWgIw`4cp`?9<5E7`;Mwe02lS@!nr zl!bmNi~NS{mc{Ypu#`J-~U|4cd3f36(m zzeJAqUnj@-SL69+yt`G7_1`YX`|pzz{7=h?{#WJE{`ciE{!iqw{%_@^0LjS#uRJ#3 zlg9*XIVF%Sj}Nqy(*ix^^gwSpGcZuj3JjJf24={)fs^G)feLwQAS&ktYGpXEOwJGd zS(XPbLVF2*UnVO8SI7l{Yh`6%71|r+!oUME8h8ZlW3npntc(S=%Xr`od3xXznFxF> zlY#Hh{)qNxSsVCWF0nmwscp;Uc5C@3yQ4hIE|6#2edIZIUwN)QSpL}_F3+<^$@A?A z_+5s+NpgifMP6i|C@;28m6zBHSXAazEpHep+0J z+Tk=~hprSEuvt?4iY%=Mmo?lcQ7$)&ov0ppptq%yuNC$Diug?x=Ec3RL#iBai3j-^ zT}SfC8>m|Bf_?KFAM!{&&g%(qTUG^p)02yTkU-Dy@C>ApVmBk9#C*3Qq)|xVbT&+a;A|c6}JS#lQ{^$ex=|pD%(plnt(ib#kx!L z(Hw3H|qO44ab!W+`P!fN$jB^sbOhSW;F-FnUWrxqU|o4iSxP~H!k*~ z-jTT%0&b}yh|w7}dE5dQ>NcE{eU=RGKNU0}_rG5yMEk@lA0Q=$HM!aBhT0OLPUd}P zWb^+}3SOc}J{w`an}ebYki`p1#C^zRl>pd{nfZJf0KUyvGmzpe+$giw>glcZ^dUu? z%|9?5^$0-7T`Qdwo>Qy1rf74H?*Kq#+YHw~1N8#n1As;5fFf%^QI2=OM%k_?$3)Y< zD91t*;*GL;ck+I_cr``6=#9$Qm`bX%U-XF-;ABZ9Laqlp2f=Np#{wd$02XJL>y?h5(^4_KGXm{Y<%kn*3v-<$o>OQ2; z$XUmVdwfvle@=NY0zvhtqmW$+09w>M5Ai0|d%inp7 z+{07RPRF~Maxb4~2(B^#ejkf%p(SiSMbmX^N zFVV>;5M7PlqMK1D`Wi)I7}}9|H^%6L2%{JgL_b6g#o`2GpqOPGrR%Ct*h;`twi^{t zx2`H?yS7_hEo(i9YSMvSOeQ##o3^RbAKb(8tz4x5^zvrIq z-uLp{{@*-KL?hHJgA~)yNH9?y4~JTtqOt0xa3CI!1tLr1)yo2rKua(duda(m7Kd79 z+K&c#nL3{nSRSYj2O=%ivm4I|HYJ$+t>LzoP=x828F~2C3F}jZbuE+C9BgcBX#o3B z6hvKSq&dz>#6po4j4?ErV4Ud)ySptB3Rlkzw4$$IPN*dkNVLU*OrtV;#~;Yc)nenV zod_Ok6)DwfohAdM2M11?Fm!Sz2SECRwsS zSuu4pNWdDu$>zdDEYP%6ixW@;#VKGPYQm^EM5BqoTk7DJ0VE}0vk42G5NKj8BWT5alWr2W^QD{4= zIk-5`7ETDx$>H$4Xe``}W-A&AubdqTYL#Fz$2WyTkx*hHlc%DxfyrAJZ4R1LjoPr0 z!-f?Q({UCVWQr<;BEea0%Nm2R(*lsE=uWgL5N-&>Lh|f17PbTvn!CvI$cjpPA6yDF zCcEu0)kd(4wWxp!0WPs51oqYWG(NWlL2gzkKG~&vU6WX}MJ2UQW}0YGF?C`p4#jOn ztrH!Qp2-#+Aw53y%$*`FQ!MICM;6jFI?XdhfhzUms*#y6M=b}MP2lg zFh#ltx`Z7&#Wo@tcDh9+B4Z29Gt(9YQRT2HAy{b9QPh>GYel_#O)0DMg(A(t6%eJ? zaCi|%Q!LTrXhM%dA0*O6h2*0%nB?`NunYJfI?RA$%W7WJ@eZ5H*iYv)#ZNV6HX-2E<8-(h|7L`+9s6r?{MSL~P6q0hP&_}I_NpI9iHq-6C z3S>96D-&K!JWQh$($Y*fu(CDf3LLE3g%%}&>L*by z?5Vv90eXW)J+;K--qH7 z#Iy^=6yWK4G=WSW;a;*-KJC373Jl3qT4#g^r3h^5QcfPuRV(d17WJcJ&RQ-^lKo)(!Mg8emFaTFKgJUZWO)nEeidu!7Fd}T+&ms{WRb;L$77dhr z5|z}AwxbYPr^d8fR3UgovZ)TpO7vL=CE1KXIDDQCO2YLw7FE)bOhvj76b@ET!;hWBInA{u{SSoKwA{|W3h6m|-k{$hl>IGV}j>P2cD!V9@tb!m(a@=y+W_TYX;A43xu_*y9PR$TIGC`USsOf6boWWk(P2N zr6{)-TD5XnxPbmZ|7*}2*f~A5b}8X#3-ZyH>KVc1K{(bo=`A?c`dQOvGnLu195}32 zw&HDz-l0Dsj)4PHRgUH4B^QVO9R0QS03~1=n3sVof3CGD_gVCJdJjG~+A6yT ziPZe?&7E!2VlDrm4-EPz)94?#s}2W?{zd$4>WiHfTpn|do8ZuN&t!kS77#|k{sM-D>w&RJcNhB+_A4& z?l0-WTtar53h5%Qws;sH2aRbB#Nt6aAIq~PQ)K)IHjoB+g46! z3x%75F_Xt)!;dNCQCx#0lRHUmyu}k3XD)xBwKW)NX6l)lI%jZzVoic9$|p=L7upkq zwhjuCOMzU=&Ex^6&r@X;(+*gLW7@*|L<^_Uldye>sNI?^d}pl5GqB>hkyx-P+7f}* zG$SU&6XnpC@_{lH4k+~uf1eSOa_mWp-;c1118d4fE9O{ynjCJ7C4u-XD1b>lOrD2+ zB#tJZ!PLEO_N-~s%kijZjk~POjOYz|rdXc_}n48e0}fIPTQqD9il>0$!c)h2b9}>^YDt8%(;@q{mEp!lYg%^)dN8oJZu= zqFj5>@>Aiv`kK5_0*20(qtSTK@i_!-OmkHD!ppLa}^GONs z5@!m@?b@)%m&p|N!y=PcOCkvX($I`66O(^}@w#6g7n#(hkeJt4G?!+W{8JFi?TYjX zzH2PLmVX9YlPp#?Iagf65z?dqGJGvUA>WWk73Q0KBOI1^^>TQ)W%2U39YIVQX!6al z3A;78A{0*yDHp}Ey}!w~F!i=OaiJ3khnk0gHlfq1M6^8877iEkZG4Bpw;x7e)F;`b z2GB_U1!hhF-G=dz-V z3lK+p3wbv`W$=@L;DR|5H=DQ>L-t$GI9*ic6he;i*sd+SN8-d@B+C` zElplMj=~j;3snwb=Q3cizTaE4ogOr)z~nz5FC4JgzkA(2Ty+y}4gti}r?X(Z%H+2p zaTI@osH-A@WkFG!zsN4Vn-wmSj>@G!scrikw64l=q<@#X&bK5~zb_*H$Dvs{w^Ks$ zfyMt~q}xT!`kq)PP!Lx|D#R0U5MNvT4I_8%WS_ybBbeNbz;tB}6>~|> z5$55v91_u#dN*b$T_~}#+P*-nt(-3?zqfe5pe(jgo(j(mkcPrZ-}XW}NK9SP6x1gs z#4p^)By({O{EH-`*axUe5Vq?=oua9QmW6Qdhg(=Z-VdkRCRfg#?a^rw%RuBb{^icb z8p|gyi?&H5D2!|Q&4Lz!k;E6!n~~sox>=&CAh)|s>9(u-nq5a*jFx8ml>$$J!O0`i z53Dl_#`r-KYYn;8J5r*DEiGrsCY3<>hoz$@@d1eI)Lk(mq&vPWxoJAOgYJjS=)F6G1 z)UQvFX+;v!Jj7B%C3%#auTz4tWg;wTueQ{%Wc!p*yj9vwH5_|8K)Od-YLr3(Ew@aL zP`hOwz3Y|)?4H^}HCELaY8=v1m(`^DEmbS$7$X|Pp(}uZx=2m1)I`bKiW1QigDY$+ zkXa{LYO*@P4pjE`Wu7vU?g2xmSZb=Ul>`D?E7a31dRT(4zsb>*yszHUTLOjk#YBX7 z!;|mCoDwqz7tV>c#hQY0gM^gBKJ+;uze<86^@TNg;9$F>#4R&w1@fW>rIMEk>ENy2PDw#(3O|>vmk>X0+p$ zT({#+R+qRd*Cp<^b&1PRUE=yum$*UKC9W7V_~1HGx8ssfm$+X?IUK7UOhYhoD4qtO zl>hu)sve@c!qZ3^g+5z4qcv?cT7}v-Xe*6*IE%EeCbjGVG>&S} zkJ}g;k6)SCO*|o+xH2d4@i~bnWfNEDBt9WUJRArFwh7pEJ7{V){U{f`nL>Ut&2W%U zh8Ps+3kD5truE_CSY;=-Q94S2F#nDL8IH%*n>=0)xyxCcJ zbC0SAu;^y_|8Z|~)dN`z4`bmGEc{#-#)B@rg_hX!aUb$(LEk@UJB0>4O4H8pY^SB$ zXo9OgDOI<%JoN}gbJZiRdaJ7*bJY{B`f^u&MXIi+SS3n)!65H0x@a5r+xuAIHmu&i zi!Rwlm!)@Sns#I7VF?4U`XP7&HXIIZ0*#@IsgAC|OWvDk0d2&)$?X)UH_-YOT}vzI z23kqC(ki-(&ZkXup-XD_r_|+s9Ta3|SLZa)NcPTNnsa9_&uyTQ^df9eu^Q7|?gHXg zF^L`m|Sv}OZYlM~1lxq-B11GySNuE_&L!j}NK@}Qn#O*WwGa{~G)T@B5%qsTQn z5S-$6VQU1KZQZtn)&ba!d4SpR^jc8ZVaAWBE;Xi~<&;@08{+z$5U{(KXhXI{o(GT@@&J+4SAhJA?#lsWQ?^82$qD2E zs9-h_M4nCAKwblo*Yg08+*^SBI;W1T$OiIeP9P8E){zz2K;8zBck%#{9*@;$KZ&x7R&2g~l{@vyi9IVKL5W)Ml}1?}|YUh3x5y8O1C zp4~#j+UccRXjqruZ=u(B&>vHsy64Z%V>|uL+fMJ#vmZYklpOW3r=32*3b#>2nzqsx zG9-dz@DchtHEMrq)P!Uku6|ODlhTbU)!3SD^hhI4X`b=Uv?c6qXWw4(dB^uyPhUAR zmvBKl7p2K$jCUs=p%5n4V9c7G+*LersSL3n>^yZN6(v(v&jh=#JJU|?jjtiR8|m6I zaOuyqn=Y9py+e2MASF*Va%^7Ev&^@Ht9J14Id~EYJj$caDB&^Nd0fwSt}Wr?+j+7x zW(un9JRLAM(#RUWChsJqHqFVP8M=dKVpIvAqRDImduvuJ7AU7O-O>?BuXAonW-&p4 zJucw}Egu8uy&lMjEeBf(pPnHj8JCpNTD|z@$1!xR7S&zUMP{)d>{MPqxrK9Irf}A} zgk!I1KGsy`b1wrdo3+pu&UR4cli0!?+-Os3iPb=2J-ufqku>-8%(f|mhc7q1Nm@iL z(0-X;KZNkGgO{d-dTvUnH>Vq8wj%CKx5Qx;P|a28mPCp$k#1~DH7<9ST*Av`Bev3I zo)m}`CA_MgFA#{Ac~h+ym++;@R#7+`@Q+LQa^0G0xx$&Fov%z!e3hr2uSSF(#E6dR z=Ih$|dTq5Ugd93s!s~1}Hus-rsn4aUVK-%{kBsv;Cbk)4Hvg9TrG~DTp*#52cK)Sz z58thTU?Y!#lF2}=V7qvOz|xN{rD8KvsnSMuuWWQX|0<;vG8s0|R)hQOUfaU%*VefS zinfy`wca^7<|%#eiOil z0BQ;U5x-@AU418s{m*;pxWgY#&(?@^55fGeKa6>DIG7h4n)yB#a}nktuq20z$9S)u z|2eMk&@>;qrWpAHhW}>=e_ErRcS_513jfO=#y>e+mauSiaaZ4Z>M^9uUuKpSlv&*h zyB6c!@mKRaqkS8xYj*p0^F&o72z~z|^h{UQ+DrOyGkN$le0Oj?cc?XLw|bg8d=q>P zzB9N3mp!GV@*wE(V0^YU6yMMc2L4lh_9;xpAQl)L#XwTA=hMQ&8DbCY_Ho7E>MKS%jrl;7}T z^*uLu3|{K#&k@f!ZuOkZG0!4Scw&5>=L%lwS;wn9ck}t4dr@xU3t*)edLBc$n=kUb z#20&BMfnH5)blUC-19wO;Z=O4x0HYCJ%+FLj^k^+6ZkssNxas3D&OEe6J>yJ^e*9> zyls55cQvo~Uct9{*YNG$^?ZkSJDl5S!Pk}V_4VbAzJVw!`99wS ze!y4H5Blb!Y~Y7{3wVn!%8&SBDBCc8HE;Lb#yfoXqx?1R^lj!le2?-j-_yL?_ZC0t z`;wpbeZ$ZA3;1b&5%2ML;=TUC{EEMdU-ggR-}}e%YyMh(-9M4v@Gs*x{R#e~{~CVV ze*?;&^IQJ)XuFmF!bUvV*xw2G(F zB?`o10d%hNpyuNns9Jdy-cqUl^f!B)YNT83aq3*U+8(F&&?tKx_G!5C3qS96`bNon zEsyt8dP141fPB6#6jO!h_4_JmhAP6D-tbMJvC2Z5>03bEHJ1Y4m+DMa3|i$cQuV46 z-YR+hozygS1Tg#jgH<2Z8NGggmFlUEM9uV%P)DmSs1^9fsxGQT9YuxyT8yvYd&u%n zRF>+BIf`)&OZfW}*{{1QGtNMBh<=LmfQ{Gxwr`tX_2B#0TVGQxDZaW3$+$z<1Cv^6GUs>&L4* zd32V~r76LjPsN!XDG8wh@38@hzNLlVQscLD7XJ0@z*gqrRp6eJSanMt25BwM{_=XJ z#tA_ssw^YZy9Fm9WQy}PQukD@p@$@sym{&SgYNR~6&g|s4eG8+s1J0epDLwss<-QK zTH{zuDfPE4M!&~_J{~3eYQe*^>Yl{sX~fai2QB(S@JU*#dLUJk98&d~xshK+CL?)` z>OI35U}s*>BOe*ORh1`$U=bdU0SQiTyf&FjssXcxwyO$fzP3sRE!2v6f?U0;d|2f!9T^VYlLGqBintBzl zstGQ$SRG4!)j&F4RZs&yzL>9uP(Tf(i&Yg}j`B*BKSSGERZZ*FFxsw;qg^O>tKsyV z8bL3rk@O16H}L!p#{5N%qWAI9g-?y)B9xs_c14KqhEFTXRSgeRwLDRc=aW&+QWJPC z+D^xZ6lba95ymI+g=#Wih4LDFLUBFX)~Pza3+cgqYAWwm)A$9HFRSVN2HM_I6}%6h zoqVWH;?I@+(zP7s2jzB5qAx$KPE_@{Icnh5>LiTuXyaH!{tkS9;DJ9#y3G;V!5FHy kxDnfxu;pqq)BxRD+d+6^48n||xB*HtgT2jwpp}~Wf6oYD+yDRo literal 15400 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 literal 1093 zcma))U2hUW6o%gc>EG7!y;$G@&$s1{34Wux{3Aw+mSo{4f5C zHhv^t_yhb=#&@96CWXMw&Yqcb-shZm=J%hUzX0rE*FZ#I$9F=j@2Q^M4J_M}{eB?* z)4p{ked#(u-+JS82JYcFG7uBEeIkd_@}%!tN1YSL4h0sZ9jc)tAl@_Rc>`DZ0-NUn*aPuLQR9bL1D=0M<;$GP20+}y}ofp3%S-L>> zJJz&#bR?dlEU?Db)+v#r_{J4L`X3;TEo@Wx$*58o{LRlI6(*4KBo#<1l2V$Nv^9&g WGl8^A(sPpbNO>_Y$>MksJo^g_!`H6> diff --git a/bin/net/slipcor/classranks/managers/FormatManager.class b/bin/net/slipcor/classranks/managers/FormatManager.class index 93ffe1e142f788d47b75abc86a581abd98a8e83c..d870436959274b2fee5db78f7f467659f9e3abb8 100644 GIT binary patch literal 5502 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 LYT)mR^B?~O4$C@d diff --git a/bin/net/slipcor/classranks/managers/PlayerClassManager.class b/bin/net/slipcor/classranks/managers/PlayerClassManager.class index 1b7357560b232950b2ab10c157ce340973e7db2d..c3163ba8aa49575034f75619c721c5e4e8a3b924 100644 GIT binary patch delta 103 zcmeyy^NnZ18K$bLiRa3II+gEo+D!eBXBk}Vbh^_3Q{ delta 103 zcmeyy^NnZ18K&amiRa3II^gEo+D!eBC4k}Vbh*xD8> diff --git a/bin/net/slipcor/classranks/managers/PlayerManager.class b/bin/net/slipcor/classranks/managers/PlayerManager.class index d9ef7cc0b412a5ab576c5b48008c82d6b2e341cc..251439dc116f7201a435395f9bb25c24a81f0b43 100644 GIT binary patch literal 6311 zcma)A3w%@M75|?k%}vt_Vxd5RLV2gOB?3~Rg@P?~7E6n?R6!lPq_=Honv^81RNb5D zoH{pr4RkuDqi(XP3NfXKH#hfwsH6LT_a<%92iX3ae)qfQJKs6~ z^FQZ&U!Fbv*a-m3WSs_wpfqg8{jpH6D-enL10f?8iyGmMn7`8q8*OGZ=HC=Ddd=uY z`%!~SFkz?BWB5ZxxXs_NW2YI23*23y?zUi9Ft=_Debq|!W~I7<;;Vw;V7yYW!1pfX zi<$+l>PU;}g%deCH0T1Suc$d2g7G@C;1--y7Yv*A-JLtkXp^xcWD0WYA^{`RY(#_V zIXUTyw+CYa|5)3O?lw)H5HpQvpxs8J-st28i+y!NNHoTy!EjqeQC%e3=HJoX(GiUM z&2T&z?@c0D;l*T3)i6bHZkkM$C8{GI(*)UVX1vji_LxyYo-ad}JzbH58JMY|AXAC` zQpYS5(o!mE2!{xVZ7kg_@D*J?wqZG#gLxX}3Z|wRmSMb(`B)&(sM_{@60IBIyca$! z(omE^5gQmC#VFytxvSd<#cJEak*Ha1#E4?vXee&W#$ueO!JnzBHx@TLbu7VB5+Kq| z;^o;^1S9@U#6Ql>Orx_x!})?K!|ki;4u)FHs0U?&S(gtI^2)-(E{o%Z;YhqNVj)-P z#WJi=R9iWQh0RK$LdPnsCZCP2E;HQ1Y#Pm(5kMskAtRPyjgGYnT2DM;BjrUEn3~ms ziIxMIuIX5>OwziPw;?8+D{OHwcf=+t&1}B})5Z?IU|eI|2y|>Tx~vq@P$!sv2DS*i zb}HCJUO8zj!TrQIq^tc zjUIL^>#7DQ!>p=g@p0Hk*uvDo-G#8ow!-YC)HZDv(l>8d+{mk z)$nN+hBVt#N_5mz%=aV;<(XaDtBWlPM_CtAMR(KN6pSik2NnS^PSa* zB>TGK!I1wVBi7E!##%To5Q&7=MXm~0t29$BG2Nt$W>-;EtGM=njxXX%%7s{i$^oBU z4-V=0GQPs%%4*dbRDhl}*@*}xQ`zpt!#J$rk#}+S%2=r5t19AuzGUy`3R1j^GK^_f9CH+k8lg zkH!uSPZEJNKH8{sM~!$e685)p8~;|LGh};`oc7`*a@0;w>-f5Y*d2`7#-GF~9pA(= zL_HKS*ig?MWwDFeDlMS>&WroPb`JWi-s3(;;$P1l9IOW616O_ym9FG8~#pFdedz-w9>Q8hLRLxDgP(_ zt>It9YG_C1x{m+gzl>a$Iv%b_KS$V?m5MYPCuh?8RdULMx2*#SQ-`Uc2>U-Br!l~C zWVE!bGh2=B5cMxi*PpxsjG~{EI4PowL!4x&-Az~#lIhUMD-`Jv(e@Hwx!onRY$#8EIB$o8OP8Cx}#AR&Zc0e zxiJ_Dse2WRuNe=Y)WoqY)NJD=~ARhvxjGL3p}N*SeFu|&26_Y z#el`S_!WhmF*B~7m*}$8s&z4=hsOi0)ea1uvG++8UXqS3kT5C@1xwO9m;K_*^|pe& znEGdBXdO|GC^dAON-Hm%UorNMXDl9E>I}5(R=4wv9JS{aU&0X{865#ecXH-+od=%e zm3?{U+Ews=6yqM@lLP1QbG)^3K3rHxSsx~FZn7U@AJ zR9@5^Lta0o3$~WKPEVql_!R&PXo((1eDnL=ts%IZ30@x0<0OD%H~XrNII32fd6JvC|B zUVP%fz>B%f!|hx{?Q4l)73R{y5{{SC8iiq@y$>$4?98S&TTw?Va!G}UV$rZLml%8E<-0(&dQP#`;p~5#SUK1mlk2y%v}) z1XI08pf!OIQO%9;!=BldK(__*Zbsxt960^F>kwhKsZ~$<0u6+I6O&^z@oge~no0M| zFqPriz`(RK2G{c3bR!Jh%!}{|&OO6B&~pf406XP;UQ)}@Bx})Sg}GAERjN{{!jVl! zHMbA@xtD{ocj0c@pmVhfy^Fgvh5{q14=o(l-falB5Ye=K+9 zyK>)f9>bse@ee01EzNyPX?utN6Kvr9;&PzebxgdIWc;p4GNJQ^W0G5zmG3I~Z zDW(5%p7PB-=&d_}7oCR)>Qi1Eq_#4Rh zn@~iKFTpL8-b?vgso^%3vO5^WJDDH*m>+jBAMU26d(cX%g>iu2o7{(Ma6iAkI7m%> zxE&9W%MbGR5FW=vyq!G4gYRK+esYWV0mqVY-yj%!ZD))|PJVi4NU${iW fOZhVP2qOdlm$2;v; z1ulVES8AhLAgo0O1Ks^s>OoVWI2KM08WDlT9R>I`OV$@l)=dJAP`|*+LZn&IEqZ@) zFfEyn#CIP*H?p1zv%M0t!#7 zg$L!Rl)OBWOO*-*Zh^86BcgXDNBZ^nX01Q03wS%CK`q>?#SQtM-gKEmMnWJ^NcpV9 zJeNzu6S@`;4q1jz`M$@D8cO(QWKxxnlkfq674R$!%oLe^c{2who8?WVEt46IhLDi4gdLsXn88O$)F9nl?n zyje>S0cYTB6>IPg0e3JOF*PGXUFX*3Fm4{w;ywEIq#gMmlm{uFT{MZ3Vv9#abrcWN;U zzY018N{xX{T4J*{thbx`2z|Jrws5rb1Q?M~#yJ`v3&@ieXS!JeqDRGMY!Ofy^7ags zKy5xMr_S40%Tf|lm!MC@E#RcKockmhNBSzcu^rkvZpK)f+|8FxhJlVL`N9kYD4KlzkBheiz!7kja;3j&kK%1ND zm@00;2U$5-AP0=Wx6`MXKcvhwXb(Pw+ZEjQHfD;vgDUR8otcERjkQ48?#A6j4Ety> z8P-hpI=^&Ah|W-O59@^mZ6g|JGr}zKyRb*ahw%~mjH%tCnOYl(WdLVoI!Kzf$&Gz! z&q`*Am184e4|d}|S-C$Zi-8@l40%rUvUOa+{q#^yF|fUsj8oBQBrrgg0)5&@*tRsi z?ZJM`l#)K7;z1dsVk2QIzaO7c@o9`RY~iTJmQa3z4t30*&vMd`#RdZ%`ludO@dbR5l6qQuTQ6=EsJ5*+nUFLTLpA~}Y=r!Ip61D?Vwouz+360d_$_{C55B$9^Xwwt+O28NSm|JQ z&R6jV1;5W9EXNXT87lsW*BH=XG9KsDu-O>VJB@Hyj`X}%Tu{VI6^fQ_HJ%3ZMmoPR$%r@elly143M;1u<0HCQJA8__vDx;B}Tly1|-JFVxwe^9IRG zK-sbXN93g2X{Ijv?W!Poy{Y0j$2d3{j1w*n86GFck+2mGRXAlmb~8CGN4Z52^DiqR z!9gSJHxkygD-_PMf>)q<`54ZhSgDWjsA7iHr`R5E++rqiZKZ%eq=$7=54lAd!((r8 zyda`PxhlL8lFsydr7C<@kxXzhq2q$lk&Bo~19rUWXWOJq;U<>pN#anZvB0X_o@;+N zb-k98GQ}*&<9bp#Bb6^pkyDf8GgaFHm714oePIXj;u zch)GFuN%n7(-Td`gSu=e%mjNfO1JWrQYi0V@IAs04xGl{ULFIM^7k?xu02`m=qaIPQ6lI8POPoPd9g+M)jQaEcb)Xe6?H#o$+<;Na4 z{^CLSCb729+js=)NOx`u%_+3iKTL*BOSSp53kXo;87RdnEXHay$U7s>!iBsxN;Unq z0%*qtd@Df8%2x)2K`2;Q&m;nEO zqS00DI`#y%H5N6Bdu~t!UuerK7RB6ZmqjwGy2z(k z>nsuZJ#hRbTf~Y9^gGa4TwR>Pz&^~OAG~2&Zhx&Vnn1(>=K;AL=eFwr^>bMc=|Tn9 zjWlW<%CMe$=c5MAbW95;%vL(48RydcRvO+(!?$v+^A?vtFW!qj?Bvd!xD!O&5gL4t0MBQBk%VSh<+@vT&`dv zHImL(@P6`9$<3y^hEy^f8=xE~iCckCP_N+H>^~{E+@V%Fjx)x}$=?;Wbou84xXzBC zb3L^oOvE0#?|MO1XVo7<*&*DR!mayIWc%?h`f(Dw`{bt-?)C0Hf{%7iVt?Nee7vh6 zg$MScZv~&99LL5+m!$H3<{&wL3YEs`T!$sof{7!%rW?S9y3G zizYEhAzzn>@_xg46yKb{_nf$7h4)92^H2Cp;peUi{F;bx9mOk^_|x`E{CVV-qxj33 zqG}hdVkS-CUk>brDKYV1nIu^geK|C5IPfH%O9>GQtts{uPZ2$c#lGVGn4iwL3gKeP z`HEA52$VVJD?X5wBuX5(goG7B<(JI1uPCd!^{tfOY#YQZI!;tbXIK)w85fcFr1Joy za~|=yi8H8tUe3u;K21C&#>6$^I=1Lh<1R6V-QpVFWp?6TaR>H@d+2*vY_2AjiL^|vh&`gp z%9T}YN2iI|%#?G)WujWlVXj<&axquTqjgtUs~WCGt<`+4?njkaApBfC%}H{hwR(YL z@ginT5%p`Mew`?$29iq+^G0TptjYGtCE1g5C3EU*s8!-PtEDTGHM7gxcshxtfT$EmH8{}fCt$>IWZHsNuYE@)}QVO&n3@CV+ zig@9oTsB7A#Av`cMhf&2NehvXctamd&=(&d8Xk>NUrmVP+I#Ah$ay$tpS{;w|G(Dy z*S=hIX?pnkf6iY7=5c%|yu(&Iee)vK)VM6Nn6xRnD_XTP*0rUowIk+nuR7zq8m#64 zkL5h5jyZP*>UqdzrMl?c=6je1^|Mp#G+9(0&8`e*(8wbm&9tcb{<*C9j|F_#?{MG~yY@3E6z>TF82QpoSS2&0Qu?umh@v}gzwZ%g9SEyv+Jr)yT3e8cixYQApEIk%8nI%Mo z`$Xtk>QqyBR;2!>J*kLL$u#gw)PeAfcUbWhk56WSiMSt>|H7I^QlWvOV8uEFDV%9Q;D5b37Zq^&reC)Ue z;Yps7Z$7y^jqcqV`J0TLl+1jtIJ?xtG&zd$>^Q?_VQ7ollwsxwhjlh>!nHiLnkZGK zNn@k9c9F-X|6sKvol?fhvXW&AHl($q&S#XC$I?~NRD4)L=|q?KoATHr0_{p?ol!Qc zOfM4eHbtuOCuoWI$IG;}Mj!VPNU)+T;*9Z}O;g3U`oE%Ll;>*#k%0Lt8fN-AcK4AH z35-yfAaj_~NFbGp4rdDcS<0%PJtk_u& z4D&Ic^9dJ7@CBcW>Q3<;1N^`le&j6I8RR!c_*3lvmRxQyDx-D5w5>kX8=<#P2o|m)QILtT=+_ed`&jrNS2pP4O6#J z9`Bf|W_$>81mQ48)a_ZbDzBs`BqaT98At6LN1Z9k>BsL33{xoRt5i?c%<8KW>zdU6 g7b)DY(v9mkA7{-66J?&|`!x&}EbwgO#l#RJgU?7Z*i(_o)7>t1vn3poTQP>5#4#!1{ zigNXW2b2zohQw51C~OLwL?kg$F=~w8O#EcLg&6&8LagsOt=%GiIhXhUzR&Ysp7(!a z+85J3U;h2kbzm-MFME1zlU-COXrY>(?w+pQ8uJw@j%O9;cLgI`d$#nJ%fWmP^Cx_hI`oiI0ciZj^mat4?so1v#b_L4&BB9Rm=3qqUL28V{ zjshcUo9$e}N}Y#{o3OV+#J`S$)ZLN6UY^$2XH0h%*`Fb5 ztZ*({@T|@nnmqLLyv_kaW-EJZyLLpR8?C&kbC3qHbp#`gfv%wGcUb2LM~zRMhSYyj z=XGj^H)?UEZYg#d3*>s|USr;dt2{8mf+1#lt43LDqvf)k+3?FV)AB4sr-Hj=Hs#g{ zxLHoEQQ|JjuSR9DW!I%DaIgZWyxr6pTiwO;>lMb}@~orf5>ksx9ChlLL_I!Mj)Q)f z2IDh#VRX$noAgRj%CzWLGezD-79FUP_$AA3ChWAVo5n>-)5K;*7=mCHUNOWyqpVd} z6{q07Q65paL2EHrq5xFUe`U(c{U9wv$5#1v1i^geak%IdobqIf5#f zY-78;bC@i4bHH8lHwjxpinMEVqtOCW4^Rm()uCX9#9#J0x}| z*@VZ@P7$lwZNW&JljOExq1HfAM~K95sDne~#&Fw* z$+ZvKtL)WE;|RN~K2;QY!}BgbyJ$UwNmw|7E|?@ zZ`HpnE}tqa`2!S)#TS*#UQoEgA(P)ciIen5GhaBMC{tsJV}dnkwa9GqIf~_ZP}+J( zG{XPsWD`<(+N9BM>3HI8CTO%~B}}0I`nyrZ6is5_@|Y`dhtuRS zlK@$uo(cI0N#+jMBwh;6W)~G3GLz&^H%pb~wUaGcl@&T+?yq~+Fw<0HeWus{l~8|8 zmh{uhw^rAZw^X(a&D@*RW_Shj6fxsuW}*N4^xC)?AduqeNb$@Ntqdf$CC|Jsj9)Tm oEci*VeipI(Dy{lW`hRO2(+t^5^I|ZW9N1kGH92&8_V!k9Jb)N2kWkjO{;Abs5;ZUEf%mr*caqr4@4xXMpsQQ*?B8Qy(uq^|GTrLin6_E{7S+5{EAAXrB2t z@0VkES9-jMbdDscDU|nd_5Oj#(saFFW=2cfrlmU(BMUvLg-~h|c`|TT8+q;6AUlJC zxD=!{bdc-E25|=k2`ET==pb{wAonS;IEAuo*Yxw>kxaaZv-|N#PIMyfXL}Z9LyKDQ$q3k|s_|f|D!)LCOMYJic-!v1g*0 zv88+r9#WBtV8H?wK~U7B5=gM<0tvoT)pPDlT*q-5tBcINzH`s-f1Z>7p8WYYfU78{ zpb5-7GBEtQy=}RkVbx9F_e^KYH#}Lh{Xlxgwz<=gPGB@-u;EsHV|HbAetMjrvvl#c zWw}i!NFgqe-85UKQ8%5Mu~ONT7M&&qX8ILaQUc@Q(!mypS4c@;EqHg*Kgl`Yq|9cfftUxtUu-*8K}lfj1Vk6#v;F8Ax!p|}}w({}9OmcVBI1sO-f zc)r_(HA=ypTa|+lcuB_)^fY2Pts{d`fmpt<#&6E(NMV3?FY6dYTHsWfa(Y8*o%+FS@B|15hMCoBnkw*~j<;|@V8Cxy0?)MQ^+2Op z5A5wawP~_yx9lo~Hn?H>^N!oBZ3tvm1Jl}CGPk3ur0CsBOL}BUyU(2}Z_~EFENf<9 zx5C7*z9$=QOS11XI&Nc@ZiPqezCh2o$u7O>Ha$z;vAHkQ6irX@d{O8Njw8J}{uW3- zg}VY%{SHewyws&frZ|N~fouJ84hw}c$Yyy!==U(a zq`t>EfkJCC@yts#K@exLflY7V&FYRIMfwF#uo+IkcS48@nEWg2Ne2Z7<{5PtwZ9 znzq|zdB4L_YgjrIfq_#zcG{lii;D zq$p=p0*2d38OCK?A&$ViZQd6Yb%K1z758y<@c>$wuwsX>X@&ZkuKuFXVZL*1bS^?C zkfp)8qVj$1M3GuAkzEq`wQrH@CyH$K5_v!(fAlRfeWHllOJtu!9`!Bqep_Ubnw;A? z!!?<>cOQxPZj4JD>uA%z6gVt#rd@|jREH1LZ81c({_r^N4?Vg6^vk_*4EMY5dvYK5 z%e{$@qF$e&Jn+1zJPaSh{a10raXrXGNA$Pav>wyW8&ch_a}fMJ--=I-9T=R4o|?m6e~KmYylCxBD$utc~TQk#!l2J`dG17TyBd2IqI;U7G`jVL*nw}l)6A)r(Se4eL zbXL+b>FLE)MYaUgGNg72IB5eiL^-0YYkF>j;qZj4o2sUy7j;u{CT)+-Z9hZpIaO1w z0fu0Ae2yVBtS>211hGd%1W|^)6J$MA$So?yHEA)cFvKQwS<22yhRUDa$&j_8nhbpt zJ7rrEKJkcT6zfX1kWn>;j_&yOv?E|RAVNTxK_J5^DM!Tili8+(vzDQ1nf@>Yl7!aG zDTb-)S{P3;)SOK9rB0IK%Z4OdG%ICC)QoCT1SG?F6zw=7po5`xJM}~yMH|CD0w1fu zsa@8MoMaKt?vX0AxQpW=x^R#LC4fm?Q#N=Qq=6x2`Rlld1b;31Ukf##OQ|B| z^NO~_&{NH#0>mZN&mqo}xR(n%3h zm?j8v&7xAg?Yjltx_b?M zs8KBAhMf+>dM+D7aa@V8{v=i5~1@KgAn4ZR5B`bw12L78Fy!R}ANN znkCiBmfB@W84LK9;o`0keJRJ#=%AL&)%l8>J{I_s?>&xC{6V^E=nC-jn!c3w(mj1z z(0?60rDwYf zJv4I9!B}&-X^YP^==r5|t1vxOZrWDWv=wcxX|L-woFK|Y9DY#7`iRdy?74m#ov!^| zgy;vP9Q$KaU3-7Jk2>e6d+ITg*Smg0&m;84P8ZSFLst>~oMq4!HfCENqn+rY=WZ&! zgzd3|-V>_pk>3sA0{IN%I4)w4-VV|GFxbCn66h_%Fh*QXCurnK214c0q?y9 zuC8O=b+|wk!pS!$NQ76(0ekou3)d4#?(`Af*xbK*o7e#D#09FMi@uPWJ*UlXNJE53 zu6U^}LUvuPkSiWrOCm{uExEpyJzp#3zDB58N2%N{`2uY5e6@H1wv+}~NB&f-x?a~Q zJRV?A@^{eZRuMO2g(7aDLP3|hGI^)BQc(@S!QnD&mv!HbA|Q=<$dH_{{$Q9AD6Ql*;c*+JUcYBlw2K?`T{gnD6OYrt1f= F{{i=zI%fa? diff --git a/bin/net/slipcor/classranks/register/payment/methods/EE17$EEcoAccount.class b/bin/net/slipcor/classranks/register/payment/methods/EE17$EEcoAccount.class deleted file mode 100644 index fddbeb414e0e38b278d8c49d7dcf7942246111a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3997 zcmcInZEqA+6n@rDf%%AQTnoE>PLFNTC81WV(CV4&9wuW@c-P zC<-RNCw}ogF)_ZNNfQG~A)>}FYQh&a@q@oceeTS3*-Do*O`E27X3o9$+~+yxx#zUE z|M~tW09)`%2muAV4dKM>te#JqRxFj(Y}?X|5j$pyjBY!^isiNOoG_eNPB_D6+Kwd> zo3=M55-D>}DrFW7Cxi+GHD|R^Etb`cOssF{tVq#XsbJS^efPM&8@-3`S3!lL<%ELT zX#qF`Hcwuh7wkREpFhVDGB;9&FIT-*(-Wq_c&%(SS2f~6{| z5Q!j&`&3k;Rza}2WkAl?6-nI?y@lM6u#RX$S(mDr(y{}ZrOR*MSRtt@*gGeb zrI{k>(2&L?rFay<#3OhB4~DRMTK?i@foH3D2vM#d)v^WAcSgao=6Fj9V{cVw1Z&Y4 z!a4=(Qf4kDG|L&@oD(r&+tiG%W$l=j*JD(RVdlnFG~rURXKZ zaVVy;;yEUzah%)l6@gweNq2{)ycLxp)0~qPSAi0jg>NoS7{#ELPRnpTtKy^=uELOG zX(>kNn>SNAJx-Bnub-Jk*2C)%}y9*Au}wkBPw)c70ev= z6Vwft_l*imE;d!<gNNRX9`AN!|qB3El1$8O_m0z53-QeN06G zhlO zmzd(&`Y3HnyhJ6P6>Hcmg8W^C0DsssfSMZFRoK5(+N<4hF~1ISKFH_N)(zLOr1b`B zTHCIp?kY_IEaSMuoj%UZC-^>y2HF}p$1PZn`}ve_@`wN(ufR%<(($LLaCdHAauchP zt>2;UCf3N;D_Grg4eM{A{djHc1~#=#V(TP!PU7)N?Ab7hec!miYf#667<4f-kO**! zqlOv`p`NO0r;H?)sCSBwWfAQw&`l5Zd_L*YOLA2m0{_Y(1SQ1E!=YmZ7xkc*ql9~# za4YysNTlm;qVEbid#7Ob6J~oU%-}?E?x;8Sbdf@EqGH00Pncoupvy4UtpizWIlMEDa$Lfki0%4ug}Tr z3-bDsysnVfSLF3Ic}>g*FTKd?vR^lv{JL@WPGy*(YVc~xdQerYY_;w^ze>wB7UyrV z4wEiEuc|c_?|+kj|08}?^KN}5ly2U7dd-yuWXuK7Edu(1fPN&PpXUVVTvmRV2fRF;FQRCpXQ_q&&zS19T*vpnU4ODoOS{)&1FWg? Y>jG;kP|LSPtgJ6p%Kr*q#$_n~0d#L=wg3PC diff --git a/bin/net/slipcor/classranks/register/payment/methods/EE17.class b/bin/net/slipcor/classranks/register/payment/methods/EE17.class deleted file mode 100644 index 1eb5f5b33121d72d05e6df99bf27eece0237f7b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3162 zcmbVOU31e$6g_J@mTg1`AyA;uQV3wjU_qb+8cGR?p(#$FgocvR4@E4Fh%FgO>A-*J zAE1ArFFe3Z8)!SzXHD7Ptow#1>$V?A&uE#?n$ii3rVQ5HhrUs*o}JQ=5g2)Fes3BL)2SP` zRv$|%(2y0V49d3<@(C2GzE6JJZ1@7>HOp-p()5D0$)+@9`<2nzH7$_6Y&&*vMIc=) zEem93-G{P(GQ4<&7c=*gXWyn zfNA9GGPvE?sN0UfiDGGx-189Ft3yLhKqGw7Y%;qsf;(z11)lBHr*qJ#4)-ie&$nGC zhj&@k3MNo-(3iHVInr6Tl#koF|1$=;G8jcDa+fHY*WgAt? zb=>AN9q-|Na+*zd!y%`b6UeQZ{xxNgFyab}h##nsTWctBM`o4#)d_5=kmV6QV_Aw{ zl&&Y10BcBs>!C~20o=_*(6cl9q&_XvTZ`t^bUN6nuePK z`?t$a#{w1wl$dkUw>-P0x>KOc#@-H-*m&J;NP6ft?r8X&z8(;wV;|nh;V%8%k)nWQ ze5v7H*MN>jijMoLyGG=b4Nlwny5o9s*7T)@uLO>6HxW9MSHsr=dpe?4pIS05G#ee4 zz`#CC?w*&?*C*`3M>4oPieGQyTmj~_DE+ep6RjbzJ9^diY)4`~a8_~v^KXcM zDfKzwCw&+1`T65@2Y(q{1=pd8*U(?_CWT>Mv*E-2+zjZ^28>`ge{n=(53k+epE35b z2Yje6m{yFzr@5-g>CyeY&?5JNs97m$JZ6V&K zqLNZ-OG@Z;XvyJ_^C~?&L-)=mavf{O z84KCjtszP%lYfjWahP_}qWAP}44m{QP%O&(KQLt_L2-2E4QB8CgzQ54Mfq3o->XgB z8eQ7N7tf)W|H8_13}s&M%#_))Y`q6@LHptXF_BBLU04y{;9D{j z81*}tys8p&NY86{kUGFOtFYqCX82b5BtKF96Dz-9tkc#C4lEIPH=$p?9VQ=z8JS^| tKaA-j1FH$K3E8V0zn&xvU5R>lw+5T*LDu+~^)<42G`YH5r%2d>_!nWYxGewx diff --git a/bin/net/slipcor/classranks/register/payment/methods/MCUR$MCurrencyAccount.class b/bin/net/slipcor/classranks/register/payment/methods/MCUR$MCurrencyAccount.class deleted file mode 100644 index 9f78aeedd2b0dba93fd594110489e82e23fd132d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2211 zcmbW2Yi|=r7=_Q+#%ntZgaD?c7fMNsZ6FH)($a)*vBNF40|_w_d_d#%$X?>zjds^= zqyD8zRi&b$eyIAnKdRz=cO7Fkwj7}-dpR@n%$b?+*s%`m!@{C=%XDcT#Y!!6emT%O`+ne*Xa?kUWWA5EEO}FO+8d3tY zZ)9H@UFo!qjpiF=lA0D+IqU?raDw^hHsA`R9BC_ox#|b_R^VAqds!eIbS!`Vs=!k9 zu#=3gf(a{@V+E@M>xEB49JEzzkm<79QdtNb*O5goha^tun8BPtvQTVr%PAciGSs7L zIjY{Xo637Go854!t|_|>=~?_f5L3KVfrp>u^1yM?%C)AXlQL;Oa#YFTOMI>2D}f8P zGNj)LI%79+3eFt8|)AH$(pd9GeF@T3`V@0&W681>HBy>4LbcK2BPQO6RC>6X>ET8gD* z9k*D@cBH@NxV?6V)m0rUtZJlg^p(fjJso#KB5B)BD-tU@?z5P){JLt(!0JaQ8g9ZP z9cy?jaC(emHk|g9?e;?(RUJ>bYi`T!d8T?`aT2p!>kC|X0{UaeQC^up5X#r^Okm-# zH5XO1z|oINTf=jK8;50#)-A;+{{6vuDyby>A3=itsIq|BS*|_$)aj(pgx90=wodIy zx*soHdW&PFzc5?6{1zwwASr>J4m$R5nKa2UJQs3IkRhsnA6}&bs&x#nf*@ zS}yd}AjXRkpZTHBJg#7Yn1Z6a&%RA$-heE#iFfq_E;9FO1eG14vP0DMiKrWK)axmz zrHQB?;wW

efWmPjOUx3TkB{>UJEpGX-^LBI<4&wPJc@M z4gH`q3TkH@{pyc$Ja=~!k|k)SACi0b?mf?W&U0S&?|**(1Hk(zNeD6AF}b7KWuvB7 zEmbdTwry!<$yP01Fl>igYE64y;ijWjxKpei*=jEHbXP)zVcIW*40zFBt^gc&ldoYiWkwWy3U_6^3v;vCk06 zRFAlfF!~h4ATwOe8YbVaSMuC?qUFn+VJKVGwer4Z8RFSLj5tNZW?0O2OSx47q7f@_ z=W)4SFieKwcp@9rBOL?7hyn>w28k|jYZcS8+2aO>~&GQt{jI%*gv?0 zCf$hS>At9rpeU4GnXK1z-NTQVZtD7d#OC>IhbS(BCCHV?Wz%f8gIS{MGW0rU##?;M zw1f=9{nx4FnOq}LK9-Di+!qOc!0;&EHLbSp=pX`hYCnk}Qq&Zp*g=R6rd@MrlcvQJ z*jRg@CvfnmXKo@yX=;N9X$3z+TgZs z88y+83`v>=LsN=| z5B+-R7ZQV?zO?j+!>UgXcM9fK(Bi^h^w?$ybBn>AU)A|!W;D8 zZu~Qbe+(FpbTp=N@r_fo3eVx8v7qVo7SnLk?|28(H-n}V9Ze_jw(s?p?==*98Q?qB zVi{^Wy@5&JauX5K5*U7kse{>H@y;3IL&;O5PH{WP;--srjl`t;K9<>_z;-h^}yacmU@;5wUIK`(!PfzjL4;Vf_7^8z1P?CS)@CAAzFWuCH-HsZf zz(8RR(${Pn86;>gy2~q)R5OqizQkAL@@slWQcOo_{|&zNNv!!KVsptqarg^{&s$b@ r**&Bl-)sSnHGyM3a0nVfhmeO(>o{fSh~~p_Zwv)m4O-X9*$LRc;>495 diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoAccount.class b/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoAccount.class deleted file mode 100644 index ed19c1e0ea82b88b627c14474d11734c898aaa51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2393 zcmbVMO>Y}T7=Fff{MAY8IwUP^LxBcrJ0V-rHc*nbq)AI#oCL@R1&PCWJ+im;?nb+7 zONIjn4jecD|DzHhksxv4io}nqc;EHfnAnl69z3&tX5Qy{Kj)tpfBpsFI-aBu6S(W> z!0;Q^f$4gN*-*akDd(AQc)Di!f%c38)wZ=07`6`TZq+xeb@%2REo-LfHk}}agh1}8 zYAK_koSLy+d8$o9lLD*bQg4RTbDb^X6-cR$g21J+>DnypxOUs{+vJyRME6z%(sj2{ zwVawSFgxt#!|0fzU*lC1@jy0!k?q1uhOrOE*S|x9~O@_&T7J7dDDtvfZM@Jd6%NrAR89 zTUeoyU@j6dXcu%gQTiRzztTqxOqmS9FG3pGxe(C^?mI%*!=;c6NR#pG z5w8An%>JuB`*hEK9t)BE6N--`oMQXGF%f^xA6Jj?PU1Pi@z9mi;T1*ERd5z&Uu09g z$fj@&?-J=!XeD_3ua8!_F`!Z-l{%?dSpRNQe@ZjDy?U_iwum4H;5 zF#(;A7OK# q3O`a6enJjE_c7)p#@D!5&#;^1Y1yOKM*Is{q`s~I diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoBankAccount.class b/bin/net/slipcor/classranks/register/payment/methods/iCo5$iCoBankAccount.class deleted file mode 100644 index e72aa5562112742175ba4074a9ce43cc00410ef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2636 zcmbVMU2_v<6n@?$%@=RmG=+j<0kKLFY8Rp4N1;&CBGt52TPon^X0wwlB)gs6O=kL2 z{Fw2=3om2_n6Y8TuNn0Mb;b)XyzoN(CywXrZbL|d$#9W(H_!W?=Q;bl=bT^v{rY#w`$2eHDQt1~zVT?-*W3NCslilQ<35giuNgTkFF+3q~=>Kh!IEbeN z_LOyZ*A9WhnQX6Yb`Q+4&LN2ek^-Xz!_-&nwW4lssKu%-kSF&)f%O`mqH$t>bh%Fwal@18Hs1{oIrwf`1o?k zb9kBerX{k-Q7sl#s&I{H$os`4PT*t=F9;m$;rOm~63=6X0vz3?+srIxuXEfPNiF!I z56~?~)f#t_fLIh5UUyaP=8C!%7#UVeC5|~KF~>1+r(SezRdX4Sfh68omkM$E-`dfj3Fc)@xRS zJI@nGcVc))U}n%Z^oImhMAx*4;eCPGL3!HSSzzSh;=>r0y-oXJdhX91-$5#O59!?W4)*1yo7lgD$-5rGVOrCO(E1UPeN4fh zU;>}w2q622+8ELQg?^L%FZ8?+(3$z?4xB{LG_~{(*o-a9I<= z8J?sk2gfd^n9XFSz^E1o~b*Pm=cx!n=}WzYCim<{5u zlE3WmIORWiA4B0={Bo>`(-BT3>{&759l1^J-oY5|dX&Di<1J^$@e*Dp(pS7F!P9N7 zzslJzl^s%PlFGe7Rp$GvobOWkhE%>KmG1^sS?I5Fu}kF#Qu&coei~F|vA@bvm&$!o z`I%IH8B~SlQ*is|g4<67mwvgk{C;cWOtkJg5!|)lvGxe6*E^|x??Xky@DWt2om7AH zp`y_lP_?%wwZ~hXOn-VzetSP?&y8063h@Z4=rp(YZhKIlU+KDqzvveJMhgG5F{T5@ dT0Ie>iN^EgDy}gpy$#_y-i>m%yoV1U{sScj^56gf diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo5.class b/bin/net/slipcor/classranks/register/payment/methods/iCo5.class deleted file mode 100644 index 4daf2bdd806246e0f579dc647910e9d89ad102f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3640 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 diff --git a/bin/net/slipcor/classranks/register/payment/methods/iCo6.class b/bin/net/slipcor/classranks/register/payment/methods/iCo6.class deleted file mode 100644 index 71fb29430a533ba40bebae96538939ec6a6896d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmbVOT~pgu5Ixs6$aVxF#z_-WT4+hZIH0CYDAXi@7)WRgNkd8t{gj0;0!wlvxl?`$ z{~-_UOl#6+rqjOmM|HaQN|9~ZbUZv*SGwAB_Uzu>mH+wok3Ru?jJkvv!);6V6t`;B zG}}?Ms_MFqY8|q(;cOz9-F%5DW>in*n6&G6zw?)35KCV^+#2ys#ZmLQa;o* zPeMP#Y_EJ9f{#HWLd!Of88Ri!HU&Sw@Vx><|Ds_T-aUr+RBoFgQMC8;G~yVLkwTi` zV#%=d&AM6Eo#$$~s&g7!Q>)vmWANu-GvOT=F2h`@S9z`Bl8jVE_nubk6~ki4PUSk4 zroeDnhJ+-AM8=z{Nm{sRGfi8bV_20!5)wn2Y_@gBHEb)1>kMp;GP>`mnnycob;YO{ z9tozX*C`46wqvRud6-)1LYT%l-k0zmF+?*c;~l(91gdG*Eh1nm49Nr4eZUV{(C?Do zV1x5_%FU5QqD=NYwH?7wB!phpG|n$!mf>os!9Au5GL_(^o5l4#e)D)VP+kQF)-d%$vidROM$%8KXx*R~yQrdFc z;)yy;Hr%3Z)>O|BT|7EfvYm=jt{)v4o>CL7r}!OM$n9Rh8Xie_NY!?hm5gsU^?Cv>2`#Rh<%E!lr}`s>B{4GOpmQB%boQrimGr#xp#Zu+=s&{YfC> z3*H7p`ir_+b=NDF?dV0-74z*&8DC+Cnw5^E$j36naN95uo22k-uJ9Wggw56zuafxA zp9iyiV)F~1s9entGE|g#`w731uJ>m-<(Lfov@?vHnK3%Jfh|wfjyBXFqv`xKXb6i)c$`!&>z1WEB2wLzU^6WC+7E3-7?%1# zTf<9m7?#e(*izOEmweW?y>xRT(BP&~K)*iv#rW5QKFt^Dp1y5#y+BV2t&G;b=~KwR z&`k`3bnO?Lm&q8AeFF^P5?E12px0MF3MJ;yUwqtMY7Xgu_L ztqXJ{3LWnXeH){J*PDUYSl`Qt-Wx5*Sm>0#Zvk?FQWGak-{dQdMcw8E_zIbjK>+4= z6SyH9et^lSfOu5EOjiL@$OXtbS~-8L19_{(`y1)}B&U%V-fxB+OSH>5i8*>3p`^xDzN^qLrtlQ_+Ip81vtT9B&kHZJaGe_&IzMusx!Dac$Yx znBSRh3jFjG_oDf}+oCZW@@GSh%Xkpg$f6v}J!>ptC1CSNA=jAC|Bh9L1|DagH1PQe zu2Uwr8`#Z!+ralHkn?|I`~-c8m*TMEqNy@S5OkH=Xbod{NF}k_5=K4@BM%LGRx{S`=|s8mIDQ;>HJ?9{|(t@)24;A$JFJe7T#3IoAP;wmZ^mg0y@7udH*+HL^DKV gpCpKy!;!eF!lZSCWLb1twf+=d(CX4UPlO)We^@h|Q2+n{ diff --git a/bin/plugin.yml b/bin/plugin.yml index ce84b8d..7fab4aa 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.6.3 +version: 0.6.1.0 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] @@ -35,6 +35,9 @@ commands: /classadmin change rank [classname] [rankname] [displayname] [color] /classadmin remove class [classname] /classadmin remove rank [classname] [rankname] + /classadmin list {classname} {rankname} + /classadmin config + /classadmin debug [TRUE/FALSE] permissions: classranks.*: description: Gives access to all commands diff --git a/src/config.yml b/src/config.yml index 8bfd115..ce28186 100644 --- a/src/config.yml +++ b/src/config.yml @@ -5,6 +5,8 @@ updatecheck: true # autoupdate, is not implemented now and should always false # autoupdate: false +# use UUID for permissions and player related values +useUUID: false rankpublic: true trackRanks: false defaultrankallworlds: false diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index c26f586..49c91db 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -9,43 +9,53 @@ import org.bukkit.command.CommandSender; //import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; //import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import net.milkbowl.vault.Vault; import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; import net.slipcor.classranks.commands.ClassAdminCommand; import net.slipcor.classranks.commands.ClassCommand; +import net.slipcor.classranks.commands.PlayerCommands; import net.slipcor.classranks.commands.RankdownCommand; import net.slipcor.classranks.commands.RankupCommand; import net.slipcor.classranks.handlers.*; import net.slipcor.classranks.listeners.*; import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.CommandManager; import net.slipcor.classranks.managers.ConfigManager; import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.managers.PlayerManager; import net.slipcor.classranks.register.payment.Method; /** * main plugin class * - * @version v0.3.1 + * @version v0.6.1 * * @author slipcor/krglok */ -public class ClassRanks extends JavaPlugin { - public final CommandManager cmdMgr = new CommandManager(this); - private final CRServerListener serverListener = new CRServerListener(this,cmdMgr); - public final DebugManager db = new DebugManager(this); +public class ClassRanks extends JavaPlugin +{ + // dont chance the order of these moduls ! public ConfigManager config = new ConfigManager(this); + private final PlayerManager pm = new PlayerManager(this); + public final DebugManager db = new DebugManager(this); + public final PlayerCommands cmdMgr = new PlayerCommands(this); + private final CRServerListener serverListener = new CRServerListener(this,cmdMgr); +// private final FormatManager fm = new FormatManager(); public boolean trackRanks = false; public Method method = null; // eConomy access public static Economy economy = null; - public CRHandler perms; // Permissions access + public static Permission permission = null; + public HandleVaultPerms perms; // Permissions access private Map classes; @@ -67,46 +77,44 @@ public void onEnable() { // load the config file config.load_config(); - // load Vault - if (pm.getPlugin("Vault") != null) { + // load Vault + Plugin vaultPlugin = pm.getPlugin("Vault"); + if (vaultPlugin != null) { + log("[ClassRanks] found Vault Economy !",Level.INFO); + RegisteredServiceProvider economyProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + if (economyProvider != null) { + economy = economyProvider.getProvider(); + } + } else { + log("[ClassRanks] didnt find Vault.",Level.WARNING); + log("[ClassRanks] please install the plugin Vault .",Level.INFO); + log("[ClassRanks] will NOT be Enabled",Level.SEVERE); + this.setEnabled(false); + return; + } + if ( vaultPlugin != null) + { db.i("Vault found!"); - if (getConfig().getBoolean("vaultpermissions")) - { +// if (getConfig().getBoolean("vaultpermissions")) this.perms = new HandleVaultPerms(this); log("ClassRank Vault permissions plugin found", Level.INFO); // success! - + RegisteredServiceProvider permissionProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); + permission = permissionProvider.getProvider(); if (this.perms.setupPermissions() == false) { log("ClassRank Vault permissions NOT initialized", Level.SEVERE); // success! } - } - if (getConfig().getBoolean("vaulteconomy")) - { - setupEconomy(); - } +// if (getConfig().getBoolean("vaulteconomy")) +// { +// setupEconomy(); +// } } // backup permissions - if (this.perms == null || (this.perms != null && !this.perms.setupPermissions())) { - - if (pm.getPlugin("bPermissions") != null) { - db.i("bPermissions found!"); - this.perms = new HandleBPerms(this); - } else if (pm.getPlugin("PermissionsEx") != null) { - db.i("PermissionsEX found!"); - this.perms = new HandlePEX(this); - } else { - db.i("No perms found, defaulting to SuperPermissions!"); - this.perms = new HandleSuperPerms(this); - } - this.perms.setupPermissions(); - } if(config.isUpdateCheck()) { log(" UpdateCheck", Level.INFO); // success! - Tracker tracker = new Tracker(this); - tracker.start(); Update.updateCheck(this); } log("Version " + this.getDescription().getVersion() + " init ready", Level.INFO); @@ -114,7 +122,6 @@ public void onEnable() { @Override public void onDisable() { - Tracker.stop(); log("disabled", Level.INFO); } @@ -130,10 +137,34 @@ public void onDisable() { * @param level * the logging level */ - public void log(String message, Level level) { + public static void log(String message, Level level) { Bukkit.getLogger().log(level, "[ClassRanks] " + message); } +// public FormatManager getFormatManager() +// { +// return fm; +// } + + public DebugManager getDebugManager() + { + return db; + } + + public PlayerCommands getCommandMgr() + { + return cmdMgr; + } + + /** + * @return the pm + */ + public PlayerManager getPlayerManager() + { + return pm; + } + + /** * send a message to a player * @@ -142,25 +173,37 @@ public void log(String message, Level level) { * @param string * the string to send */ - public void msg(Player pPlayer, String string) { + public void msg(Player pPlayer, String string) + { pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + ChatColor.WHITE + "] " + string); db.i("to " + pPlayer.getName() + ": " + string); } + + public void error(Player pPlayer, String string) + { + pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + + ChatColor.WHITE + "] " + ChatColor.RED+ string); + db.i("to " + pPlayer.getName() + ": " + string); + } /** * send a message to a commandsender * - * @param sender - * the commandsender to message - * @param string - * the string to send + * @param sender the commandsender to message + * @param string the string to send */ - public void msg(CommandSender sender, String string) { + public void msg(CommandSender sender, String string) + { sender.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + ChatColor.WHITE + "] " + string); } + public void error(CommandSender sender, String string) + { + sender.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") + + ChatColor.WHITE + "] " +ChatColor.RED+ string); + } private boolean setupEconomy() { @@ -172,4 +215,5 @@ private boolean setupEconomy() return (economy != null); } + } diff --git a/src/net/slipcor/classranks/Tracker.java b/src/net/slipcor/classranks/Tracker.java deleted file mode 100644 index a553af2..0000000 --- a/src/net/slipcor/classranks/Tracker.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.slipcor.classranks; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLEncoder; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -/** - * tracker class - * - * - - * - * tracks plugin version - * - * @author slipcor - * - * @version v0.2.2 - * - */ - -public class Tracker implements Runnable { - private static Plugin plugin; - private static int taskID = -1; - - public Tracker(Plugin p) { - plugin = p; - } - - public void start() { - taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this, - 0L, 72000L); - } - - public static void stop() { - Bukkit.getScheduler().cancelTask(taskID); - } - - private void callHome() { - if (!plugin.getConfig().getBoolean("stats", true)) { - return; - } - - String url = null; - try { - url = String - .format("http://www.slipcor.net/stats/call.php?port=%s&name=%s&version=%s", - plugin.getServer().getPort(), - URLEncoder.encode( - plugin.getDescription().getName(), "UTF-8"), - URLEncoder.encode(plugin.getDescription() - .getVersion(), "UTF-8")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - try { - new URL(url).openConnection().getInputStream(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void run() { - callHome(); - } -} diff --git a/src/net/slipcor/classranks/commands/ClassAdminCommand.java b/src/net/slipcor/classranks/commands/ClassAdminCommand.java index ca128f9..f23e3a3 100644 --- a/src/net/slipcor/classranks/commands/ClassAdminCommand.java +++ b/src/net/slipcor/classranks/commands/ClassAdminCommand.java @@ -1,13 +1,20 @@ package net.slipcor.classranks.commands; +import java.util.ArrayList; + import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.CommandManager; +import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.ClassManager; import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.FormatManager; +import org.bukkit.ChatColor; 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; /** * classadmin command class @@ -17,34 +24,432 @@ * @author slipcor */ -public class ClassAdminCommand implements CommandExecutor { +public class ClassAdminCommand implements CommandExecutor +{ private final ClassRanks plugin; - private final CommandManager cmdMgr; - private final DebugManager db; + private DebugManager db; /** * create a class admin command instance * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public ClassAdminCommand(ClassRanks cr, CommandManager cm) { - plugin = cr; - cmdMgr = cm; - db = new DebugManager(cr); + public ClassAdminCommand(ClassRanks plugin, PlayerCommands cm) + { + this.plugin = plugin; + this.db = plugin.getDebugManager(); } @Override - public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { - - if (!(sender instanceof Player)) { - plugin.msg(sender, "Console access is not implemented. If you want that, visit:"); - plugin.msg(sender, "http://dev.bukkit.org/server-mods/classranks/"); + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) + { + if (!(sender instanceof Player)) + { + plugin.msg(sender, "Console access is not implemented. "); + plugin.msg(sender, "Because a player instance is necessary"); return true; } - // admin class command, parse it! db.i("/classadmin detected! parsing..."); - return cmdMgr.parseAdminCommand((Player) sender, args); + return parseAdminCommand((Player) sender, args); + } + + public void cmdNone(Player pPlayer) + { + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"description: Administrate the Classes and Ranks"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: only for Ops and Admin (classrank.admin)"); + plugin.msg(pPlayer, ChatColor.YELLOW+" "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin add class [classname] [permname] [displayname] [color] [item:0] [cost] [exp]"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin add rank [classname] [permname] [displayname] [color] [item:0] [cost] [exp]"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin change class [classname] [newname]"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin change rank [classname] [rankname] [displayname] [color]"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin remove class [classname]"+ChatColor.RED+"Be careful "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin remove rank [classname] [rankname]"+ChatColor.RED+"Be careful "); + plugin.msg(pPlayer, ChatColor.YELLOW+" "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin list {classname} {rankname}"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin config "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/classadmin debug [TRUE/FALSE]"); + + } + + private void cmdList (Player pPlayer, String[] args) + { + + ArrayList classes = ClassManager.getClasses(); + { + + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Class List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + for (Clazz c : classes) + { + if (c.name.startsWith("%") && !pPlayer.isOp()) + { + continue; + } + plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); + } + } + + } + + /** + * printout Class List + * + * @param pPlayer + * @param args + */ + private void cmdListClass (Player pPlayer, String[] args) + { + + ArrayList classes = ClassManager.getClasses(); + if (args.length > 1) + { + for (Clazz c : classes) + { + if (c.name.equalsIgnoreCase(args[1]) ) + { + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Class "+ ChatColor.GREEN + c.name); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + for (Rank r : c.ranks) + { + plugin.msg(pPlayer, "=> "+r.getPermName()+" : " + r.getColor() + r.getDispName()); + } + } + } + } + + } + + + private void cmdListClassRank (Player pPlayer, String[] args) + { + + ArrayList classes = ClassManager.getClasses(); + if (args.length > 1) + { + for (Clazz c : classes) + { + if (c.name.equalsIgnoreCase(args[1]) ) + { + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Class "+ ChatColor.GREEN + c.name); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + for (Rank r : c.ranks) + { + if (r.getPermName().equalsIgnoreCase(args[2])) + { + plugin.msg(pPlayer, "Rank: " + r.getColor() + r.getDispName()); + plugin.msg(pPlayer, "Perm: " + r.getColor() + r.getPermName()); + plugin.msg(pPlayer, "Cost: " + r.getColor() + r.getCost()); + plugin.msg(pPlayer, "Exp : " + r.getColor() + r.getExp()); + plugin.msg(pPlayer, "Items : " ); + if (r.getItems() != null) + { + for (String sItem : r.getItems()) + { + plugin.msg(pPlayer, "=> " + r.getColor() + sItem); + } + for (ItemStack item : r.getItemstacks()) + { + if (item != null) + { + plugin.msg(pPlayer, "=> " + r.getColor() + item.getType()+":"+item.getAmount()); + } + } + } + plugin.msg(pPlayer, " " ); + } + } + } + } + } + + } + + private boolean cmdConfig(Player pPlayer, String[] args) + { + pPlayer.sendMessage(ChatColor.YELLOW+"[ClassRanks] "+ChatColor.GREEN+"Configuration "); + pPlayer.sendMessage(ChatColor.YELLOW+"----------"+"Ver: " + ChatColor.GREEN+plugin.getDescription().getVersion()); + pPlayer.sendMessage(ChatColor.YELLOW+"Debug : "+ChatColor.RED+plugin.config.isDebug()); + pPlayer.sendMessage(ChatColor.YELLOW+"Update : "+ChatColor.GREEN+plugin.config.isUpdateCheck()); + pPlayer.sendMessage(ChatColor.WHITE+"AutoUpdate : "+ChatColor.GREEN+plugin.config.isAutoUpdate()); + pPlayer.sendMessage(ChatColor.YELLOW+"OneClass : "+ChatColor.GREEN+plugin.config.isOnlyoneclass()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckExp : "+ChatColor.GREEN+plugin.config.isCheckexp()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckItem : "+ChatColor.GREEN+plugin.config.isCheckitems()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckMoney: "+ChatColor.GREEN+plugin.config.isCheckprices()); + pPlayer.sendMessage(ChatColor.YELLOW+"CoolDown: "+ChatColor.GREEN+plugin.config.getCoolDown()); + pPlayer.sendMessage(ChatColor.YELLOW+"ClearRanks: "+ChatColor.GREEN+plugin.config.isClearranks()); + pPlayer.sendMessage(ChatColor.YELLOW+"DefaultRankWorld: "+ChatColor.GREEN+plugin.config.isDefaultrankallworlds()); + pPlayer.sendMessage(ChatColor.YELLOW+"RankPublic: "+ChatColor.GREEN+plugin.config.isRankpublic()); + pPlayer.sendMessage(ChatColor.YELLOW+"TrackRanks: "+ChatColor.GREEN+plugin.config.isTrackRanks()); + pPlayer.sendMessage(ChatColor.GREEN+"Default Cost : "); + for(int i=0; i < plugin.config.getMoneyCost().length; i++) + { + pPlayer.sendMessage(ChatColor.YELLOW+"Rank "+(i+1)+": "+ChatColor.GREEN+String.valueOf(plugin.config.getMoneyCost()[i])); + + } + pPlayer.sendMessage(ChatColor.GREEN+"Default Exp : "); + for(int i=0; i < plugin.config.getExpCost().length; i++) + { + pPlayer.sendMessage(ChatColor.YELLOW+"Rank "+(i+1)+": "+ChatColor.GREEN+String.valueOf(plugin.config.getExpCost()[i])); + + } + pPlayer.sendMessage(ChatColor.GREEN+"Default Item : "); + for(int i=0; i < plugin.config.getItemStacks().length; i++) + { + pPlayer.sendMessage(ChatColor.GREEN+"Rank: "+(i+1)); + for (int j=0; j "+ChatColor.GREEN+plugin.config.getItemStacks()[i][j].getType()+" : "+plugin.config.getItemStacks()[i][j].getAmount()); + } + + } + + return true; + } + + private boolean cmdreload (Player player, String[] args) + { + + return false; + } + + private boolean cmdDebug (Player player, String[] args) + { + if (args[1].equalsIgnoreCase("TRUE")) + { + plugin.config.setDebug(true); + plugin.config.save_config(); + } + if (args[1].equalsIgnoreCase("FALSE")) + { + plugin.config.setDebug(false); + plugin.config.save_config(); + } + player.sendMessage(ChatColor.YELLOW+"[ClassRanks] "+ChatColor.GREEN+"DEBUG Mode "); + player.sendMessage(ChatColor.YELLOW+"----------"+"Ver: " + ChatColor.GREEN+plugin.getDescription().getVersion()); + player.sendMessage(ChatColor.YELLOW+"Debug : "+ChatColor.RED+plugin.config.isDebug()); + return true; + } + + private boolean cmdInfo (Player player, String[] args) + { + + return false; + } + + + private boolean cmdAdminRemove (Player player, String[] args) + { + + return false; + } + + private boolean cmdAdminAdd (Player player, String[] args) + { + + return false; + } + + private boolean cmdAdminChange (Player player, String[] args) + { + + return false; + } + + + public boolean parseAdminCommand(Player pPlayer, String[] args) + { + db.i("parsing admin " + pPlayer.getName() + ", command: "+ FormatManager.formatStringArray(args)); + + if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.admin", pPlayer.getWorld().getName())) + { + plugin.msg(pPlayer,"You don't have permission to administrate ranks!"); + return true; + } + + db.i("perm check successful"); + + if (args.length == 0) + { + cmdNone(pPlayer); + return true; + } + + if (args[0].equalsIgnoreCase("debug")) + { + cmdDebug(pPlayer, args); + return true; + } + if (args[0].equalsIgnoreCase("config")) + { + cmdConfig(pPlayer, args); + return true; + } + if (args[0].equalsIgnoreCase("list")) + { + if (args.length == 1) + { + cmdList(pPlayer, args); + return true; + } + if (args.length == 2) + { + cmdListClass(pPlayer,args); + return true; + } + if (args.length == 3) + { + cmdListClassRank(pPlayer,args); + return true; + } + return false; + + } + + if (args.length < 3) + { + plugin.msg(pPlayer, + "Not enough arguments (" + String.valueOf(args.length) + + ")!"); + return false; + } + db.i("enough arguments"); + + if (args[0].equalsIgnoreCase("remove")) + { + /* + * /classadmin remove class *classname* /classadmin remove rank + * *classname* *rankname* + */ + if (args[1].equalsIgnoreCase("class")) { + if (args.length != 3) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configClassRemove(args[2], pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + if (args.length != 4) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configRankRemove(args[2], args[3], pPlayer); + } + // second argument unknown + return false; + } + if (args[0].equalsIgnoreCase("add")) + { + + /* Add Class and first Rank + * /classadmin add class *classname* *rankname* *displayname* + * *color* + * + * Add Rank to Class + * /classadmin add rank *classname* *rankname* *displayname* + * *color* + */ + + if (args.length < 6) + { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ") should be minimum 6 !"); + cmdNone(pPlayer); + return true; + } + ItemStack[] items; + if (args.length >= 7) + { + items = FormatManager.getItemStacksFromCommaString(args[6]); + } else + { + items = null; + } + double cost; + if (args.length >= 8) + { + cost = Double.parseDouble(args[7]); + } else + { + cost = 0.0; + } + int exp; + if (args.length >= 9) + { + exp = Integer.parseInt(args[8]); + } else + { + exp = 0; + } + if (args[1].equalsIgnoreCase("class")) + {// , ItemStack[] isItems, double dCost, int iExp + return ClassManager.configClassAdd( + args[2], + args[3], + args[4], + args[5], + items, + cost, + exp, + null); //pPlayer); + } + if (args[1].equalsIgnoreCase("rank")) + { + return ClassManager.configRankAdd( + args[2], + args[3], + args[4], + args[5], + items, + cost, + exp, + null); //pPlayer); + } + // second argument unknown + return false; + } else if (args[0].equalsIgnoreCase("change")) { + + /* + * /classadmin change rank *classname* *rankname* *displayname* + * *color* /classadmin change class *classname* *newclassname* + */ + + if (args[1].equalsIgnoreCase("class")) { + if (args.length != 4) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager + .configClassChange(args[2], args[3], pPlayer); + } else if (args[1].equalsIgnoreCase("rank")) { + if (args.length != 6) { + plugin.msg( + pPlayer, + "Wrong number of arguments (" + + String.valueOf(args.length) + ")!"); + return false; + } + return ClassManager.configRankChange(args[2], args[3], args[4], + args[5], pPlayer); + } + // second argument unknown + return false; + } + return false; } } diff --git a/src/net/slipcor/classranks/commands/ClassCommand.java b/src/net/slipcor/classranks/commands/ClassCommand.java index 1d873d7..ac3e328 100644 --- a/src/net/slipcor/classranks/commands/ClassCommand.java +++ b/src/net/slipcor/classranks/commands/ClassCommand.java @@ -1,7 +1,6 @@ package net.slipcor.classranks.commands; import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.CommandManager; import net.slipcor.classranks.managers.DebugManager; import org.bukkit.command.Command; @@ -19,7 +18,7 @@ public class ClassCommand implements CommandExecutor { private final ClassRanks plugin; - private final CommandManager cmdMgr; + private final PlayerCommands cmdMgr; private final DebugManager db; /** @@ -27,10 +26,10 @@ public class ClassCommand implements CommandExecutor { * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public ClassCommand(ClassRanks cr, CommandManager cm) { - plugin = cr; - cmdMgr = cm; - db = new DebugManager(cr); + public ClassCommand(ClassRanks plugin, PlayerCommands cm) { + this.plugin = plugin; + cmdMgr = plugin.getCommandMgr(); + db = plugin.getDebugManager(); } @Override diff --git a/src/net/slipcor/classranks/commands/PlayerCommands.java b/src/net/slipcor/classranks/commands/PlayerCommands.java new file mode 100644 index 0000000..ba28f59 --- /dev/null +++ b/src/net/slipcor/classranks/commands/PlayerCommands.java @@ -0,0 +1,1483 @@ +package net.slipcor.classranks.commands; + +import java.util.ArrayList; +import java.util.UUID; +import java.util.logging.Level; + +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.managers.PlayerManager; +import net.slipcor.classranks.register.payment.Method.MethodAccount; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +/** + *

+ * command manager , is the command interpreter for the user commands
+ * 
+ * 
+ * @version v0.4.5
+ * 
+ * @author Krglok
+ * 
+ */ + +public class PlayerCommands { + private final ClassRanks plugin; + private PlayerManager pm; + private DebugManager db; + + public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs + public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP + + Double checkedCost; // checked cost for rank up / add + int checkedExp; // checked Exp Cost for rank up / add + ItemStack[] checkedItems; // checked list of required items for rank up / add + + // Costs +// public boolean rankpublic; // do we spam changed to the public? +// public boolean onlyoneclass; // only maintain oneass +// public ItemStack[][] rankItems; +// public String[] signCheck = { null, null, null }; // SignCheck variable + + public PlayerCommands(ClassRanks plugin) { + this.plugin = plugin; + this.pm = plugin.getPlayerManager(); + this.db = plugin.getDebugManager(); + } + + public boolean rankDown(Player sender, Player player, String className, String world) + { + plugin.db.i("ranking " + player.getName() + " : " + className); + + plugin.db.i("CoolDown Check for " + player.getName()); + int cDown = pm.coolDownCheck(player); + if (cDown > 0) + { + plugin.msg(sender, + "You have to wait " + ChatColor.RED + String.valueOf(cDown) + + ChatColor.WHITE + " seconds!"); + return true; // cooldown timer still counting => OUT! + } + plugin.db.i("cooldown check positive"); + + if ((!plugin.perms.hasPerms(sender, "classranks.rankdown", player.getWorld().getName()))) + { + // if we either are no OP or try to rank down, but we may not + plugin.msg(sender, "You don't have permission to rank down!"); + return true; + } + plugin.db.i("perm check successful"); + + + String playerName = player.getName(); // store the player we want to + + +// Boolean self = true; // we want to change ourselves ... maybe + + // does player have a rank? + Rank rank = null; // actual Rank + if (hasClass(className, player, world)) + { + rank = hasRank( className, player, world); + if (rank == null) + { + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " does not have a class !"); + return true; + } + } else + { + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " not in class "+ className); + return true; + } + + plugin.db.i("rank check successful"); + + Clazz oClass = rank.getSuperClass(); // actual Rank class + + int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank + int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank + plugin.db.i("rank " + rID + " of " + iMaxRank); + + if (rID < 1) + { + // We are at lowest rank + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + " already at lowest rank!"); + return true; + } + if (plugin.config.isDefaultrankallworlds()) + { + plugin.perms.rankRemoveGlobal(player, rank.getPermName()); // do it! + + } else + { + plugin.perms.rankRemove(player, rank.getPermName()); // do it! + } + + Rank tempRank = ClassManager.getPrevRank(rank, rID); + plugin.perms.rankAdd(player, tempRank.getPermName()); + plugin.db.i("Rank Down to" + tempRank.getDispName()); + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " Rank Down to " + tempRank.getDispName()); + return true; + } + /** + * This function provides the main ranking process - including error + * messages when stuff is not right. Parameter check must be done before. + * processes rank up / down + *
+	 * - check cooldown for player
+	 * - get old rank 
+	 * - calculate new rank
+	 * - check money, exp, items for new rank 
+	 * - eventually delete from old rank 
+	 * - add to new rank
+	 * 
+ */ + public boolean rankUp(Player sender, Player player, String className, String world) + { + plugin.db.i("ranking " + player.getName() + " : " + className); + + plugin.db.i("CoolDown Check for " + player.getName()); + int cDown = pm.coolDownCheck(player); + if (cDown > 0) + { + plugin.msg(sender, + "You have to wait " + ChatColor.RED + String.valueOf(cDown) + + ChatColor.WHITE + " seconds!"); + return true; // cooldown timer still counting => OUT! + } + plugin.db.i("cooldown check positive"); + + if ((!plugin.perms.hasPerms(sender, "classranks.rankup", player.getWorld().getName()))) + { + // if we either are no OP or try to rank down, but we may not + plugin.msg(sender, "You don't have permission to rank up!"); + return true; + } + plugin.db.i("perm check successful"); + + + String playerName = player.getName(); // store the player we want to + + +// Boolean self = true; // we want to change ourselves ... maybe + + // does player have a rank? + Rank rank = null; // actual Rank + if (hasClass(className, player, world)) + { + rank = hasRank( className, player, world); + if (rank == null) + { + plugin.msg(player, "Player " + FormatManager.formatPlayer(playerName) + + " does not have a class !"); + return true; + } + } else + { + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " not in class "+ className); + return true; + } + + plugin.db.i("rank check successful"); + + String cDispName = rank.getDispName(); // actual Display rank name + ChatColor c_Color = rank.getColor(); // actual Rank color + Clazz oClass = rank.getSuperClass(); // actual Rank class + + int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank + int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank + plugin.db.i("rank " + rID + " of " + iMaxRank); + // placeholder: cost + double rank_cost = 0; + + // we want to rank up! + if (rID >= iMaxRank) + { + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " is in MaxRank of class "+ className); + return true; + } + // if we rank ourselves, that might cost money + // (otherwise, thats not the players problem ;) ) + try + { + rank_cost = moneyCost[rID + 1]; + } catch (Exception e) + { + ClassRanks.log("cost not set: "+(rID + 1), Level.WARNING); + rank_cost = 0; + } + + Rank tempRank = ClassManager.getNextRank(rank, rID); // New Rank +// if (rNext != null) +// { +// if (rNext.getCost() != -1337D) +// { +// rank_cost = rNext.getCost(); +// } +// } + + // Check for money to rank up + // rankCosts stored in checkedCost + if (checkCost(sender, player , tempRank, rID+1)== false) + { + // not enough money message send to player and to promoter + plugin.msg(player,"You don't have enough money to choose your class! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + plugin.msg(sender,"The player don't have enough money ! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + return true; + + } + plugin.db.i("money check successful"); + + // check for experience to rank up + // expcost stored in checkedExp + if (checkExp(sender, player, tempRank, rID+1) == false) + { + // not enough exp message send to player and to promoter + plugin.msg(player,"You don't have enough experience! You need "+ checkedExp); + plugin.msg(sender,"Player don't have enough experience! You need "+ checkedExp); + return true; + } + plugin.db.i("Exp check done"); + + // check items for rank up + if (!checkitems(sender, player , tempRank, rID+1)) + { + // not enough items message send to player and to promoter + plugin.msg(player,"You don't have enough items!"); + plugin.msg(sender,"Player don't have enough items!"); + return true; + } + + plugin.db.i("item check done"); + +// cPermName = tempRank.getPermName(); // Display new rank name + cDispName = tempRank.getDispName(); // Display new rank name + c_Color = tempRank.getColor(); // new Rank color + + // success! + + // Do Cost and Addrank + if (checkedCost > 0) + { + ClassRanks.economy.withdrawPlayer(player.getName(), checkedCost); + plugin.msg(player, "You paid " + checkedCost + " money !"); + plugin.msg(sender, "Player paid " + checkedCost + " money !"); + } + + if (checkedExp > 0) + { + player.setTotalExperience(player.getTotalExperience() - checkedExp); + plugin.msg(player, "You paid " + checkedExp + " experience points!"); + plugin.msg(player, "Player paid " + checkedExp + " experience points!"); + } + + if (plugin.config.isCheckitems()) + { + pm.takeItems(player, checkedItems); + plugin.msg(player, "You paid the required items!"); + plugin.msg(player, "Player paid the required items!"); + } + + plugin.perms.rankRemove(player, rank.getPermName()); // do it! + + plugin.db.i(">>>> adding new rank..."); + plugin.perms.rankAdd(player, tempRank.getPermName()); + + if ((rank_cost > 0)) + { + // take the money, inform the player + String text = + ChatColor.DARK_GREEN + "[" + ChatColor.WHITE + + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED + + "Your account had " + ChatColor.WHITE + + ClassRanks.economy.format(rank_cost) + ChatColor.RED + + " debited."; + + if (ClassRanks.economy != null) + { + ClassRanks.economy.withdrawPlayer(player.getName(), rank_cost); + sender.sendMessage(text); + } else if (plugin.method != null) + { + MethodAccount ma = plugin.method.getAccount(player.getName()); + ma.subtract(rank_cost); + sender.sendMessage(text); + } else + { + sender.sendMessage("NO Economy found!"); + } + } + + if (plugin.config.isRankpublic()) + { + // we rank ourselves and do NOT want that to be public + plugin.msg(sender, + " Player " + FormatManager.formatPlayer(playerName) + + " now a " + c_Color + cDispName + ChatColor.WHITE + + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + + "!"); + plugin.msg(player, + "You are now a " + c_Color + cDispName + ChatColor.WHITE + + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + + "!"); + } else + { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] Player " + FormatManager.formatPlayer(playerName) + + " now is a " + c_Color + cDispName + + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + + "!"); + } + + return true; + } + + /** + * Send command Info to player + * @param pPlayer + */ + private void cmdCommandInfo (Player pPlayer) + { + plugin.msg(pPlayer, ChatColor.GREEN+"ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"----------------------------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.RED+"/class [classname] | the command is deleted !"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class LIST {classname} | list of class/ranks"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class CONGFIG | list the configuration"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class GROUPS {playername} | list the groups of user"); + plugin.msg(pPlayer, ChatColor.GOLD+"need permissions "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class ADD [playername] [classname] {world} | Add user to a class"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class REMOVE [playername] [classname] {world} | Remove user from a class"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class RANKUP [playername] {world} | Rank user up"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class RANKDOWN [playername] {world} | Rank user down"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class GET [playername] {world} | Show rank of user"); + + } + + /** + * Send command Info for /rank to player + * @param pPlayer + */ + private void cmdRankInfo (Player pPlayer) + { + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/rank [classname] | Choose the class for yourself"); + plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); + + } + + /** + * Send command Info for /rankup to player + * @param pPlayer + */ + private void cmdRankUpInfo (Player pPlayer) + { + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/rankup [classname] | rankup for yourself"); + plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); + + } + + /** + * Send command Info for /rank to player + * @param pPlayer + */ + private void cmdRankDownInfo (Player pPlayer) + { + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/rankdown [classname] | rankdown for yourself"); + plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); + + } + + /** + * printout Classas and/or Clazz Ranks + * + * @param pPlayer + * @param args + */ + private void cmdList (Player pPlayer, String[] args) + { + + ArrayList classes = ClassManager.getClasses(); + if (args.length > 1) + { + for (Clazz c : classes) + { + if (c.name.equalsIgnoreCase(args[1]) ) + { + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz "+ ChatColor.GREEN + c.name); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + for (Rank r : c.ranks) + { + plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); + } + } + } + } else + { + + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + for (Clazz c : classes) + { + if (c.name.startsWith("%") && !pPlayer.isOp()) + { + continue; + } + plugin.msg(pPlayer, "Clazz "+ ChatColor.GREEN + c.name); + } + } + + } + + /** + * printout player Clazz, Rank and world + * + * @param pPlayer + * @param args + */ + private void cmdGet (Player pPlayer, String[] args) + { + String world = pPlayer.getWorld().getName(); + if (args.length > 2) + { + world = args[2]; + } else { + world = "all"; + } + String playerName = pPlayer.getName(); + if (args.length > 1) + { + playerName = args[1]; + } + + plugin.msg(pPlayer, "Player " + FormatManager.formatPlayer(playerName)+ " Get in " + FormatManager.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); + + if (rank == null) + { + plugin.msg(pPlayer, "Player " + playerName + + " has no class in " + FormatManager.formatWorld(world) + "!"); + } else + { + + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color + + plugin.msg(pPlayer, "" + playerName + + " is in " + c_Color + rank.getSuperClass().name + ChatColor.WHITE + + " as " + c_Color + cDispName + ChatColor.WHITE + + " in " + FormatManager.formatWorld(world) + "!"); + } + + } + + private void cmdConfig (Player pPlayer, String[] args) + { + pPlayer.sendMessage(ChatColor.YELLOW+"[ClassRanks] "+ChatColor.GREEN+"Configuration "); + pPlayer.sendMessage(ChatColor.YELLOW+"----------"+"Ver: " + ChatColor.GREEN+plugin.getDescription().getVersion()); + pPlayer.sendMessage(ChatColor.YELLOW+"OneClass : "+ChatColor.GREEN+plugin.config.isOnlyoneclass()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckExp : "+ChatColor.GREEN+plugin.config.isCheckexp()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckItem : "+ChatColor.GREEN+plugin.config.isCheckitems()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckMoney: "+ChatColor.GREEN+plugin.config.isCheckprices()); + pPlayer.sendMessage(ChatColor.YELLOW+"CoolDown: "+ChatColor.GREEN+plugin.config.getCoolDown()); + pPlayer.sendMessage(ChatColor.YELLOW+"ClearRanks: "+ChatColor.GREEN+plugin.config.isClearranks()); + pPlayer.sendMessage(ChatColor.YELLOW+"DefaultRankWorld: "+ChatColor.GREEN+plugin.config.isDefaultrankallworlds()); + pPlayer.sendMessage(ChatColor.YELLOW+"RankPublic: "+ChatColor.GREEN+plugin.config.isRankpublic()); + plugin.msg(pPlayer, ChatColor.YELLOW+" "); + } + + private void cmdUserGroups (Player pPlayer, String[] args) + { + String playerName = pPlayer.getName(); + // is there a player parameter, get it + if (args.length > 1) + { + playerName = args[1]; + } else + { + playerName = pPlayer.getName(); + } + String[] list = plugin.perms.getPlayerGroups(pPlayer); + if (list != null) + { + int max = list.length; + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz "+ "User Groups of "+ChatColor.DARK_GREEN+playerName); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------------------"); + for (int i = 0; i < list.length; i++) + { + plugin.msg(pPlayer, ChatColor.YELLOW+": "+list[i]); + } + plugin.msg(pPlayer, ChatColor.YELLOW+"Count "+max+" ------------"); + } + + } + + private boolean hasAdminPerms(Player player) + { + if (player.isOp()) + { + return true; + } + if (plugin.perms.hasPerms(player,"classranks.admin.addremove", player.getWorld().getName())) + { + return true; + } + // only if we are NOT op or may NOT add/remove classes + return false; + } + + /** + * + * @param className + * @param playerName + * @param world + * @return + */ + private Rank hasRank(String className, Player player, String world) + { + ArrayList classes = ClassManager.getClasses(); + String sPermName = ""; + Rank isRank = null; + for (Clazz oClass : classes) + { + // check Classname + if (className.equalsIgnoreCase(oClass.name)) + { + plugin.db.i("Found : " + oClass.name); +// ArrayList ranks = oClass.ranks; + // check for each Rank the permName in permissionsgroups + for (Rank rank : oClass.ranks) + { + sPermName = rank.getPermName(); + plugin.db.i("Search Perm : " + sPermName); + // pruefe ob Permname als group vorhanden ist + // wenn gefunden , setze reult rank + if (hasPlayerGroup(sPermName, player)) + { + isRank = rank; + return rank; + } + } + + } + } + return isRank; + } + + + private void removeRanks(String className, Player player, String world) + { + ArrayList classes = ClassManager.getClasses(); + String sPermName = ""; + for (Clazz oClass : classes) + { + // check Classname + if (className.equalsIgnoreCase(oClass.name)) + { + plugin.db.i("Found : " + oClass.name); + for (Rank rank : oClass.ranks) + { + sPermName = rank.getPermName(); + plugin.db.i("Search Perm : " + sPermName); + // pruefe ob Permname als group vorhanden ist + // wenn gefunden , remove groups + if (hasPlayerGroup(sPermName, player)) + { + if (plugin.config.isDefaultrankallworlds()) + { + plugin.perms.rankRemoveGlobal(player, sPermName); + } else + { + plugin.perms.rankRemove(player, sPermName); + } + } + } + + } + } + } + + + private boolean hasPlayerGroup(String PermName, Player player) + { + plugin.db.i("Check group : " + PermName); + String[] list = plugin.perms.getPlayerGroups(player); + boolean isPerm = false; + for (int i = 0; i < list.length; i++) + { + plugin.db.i("Check " + i + " : " + list[i]); + if(list[i].equalsIgnoreCase(PermName)) + { + isPerm = true; + } + } + return isPerm; + } + + /** + * Sucht das Clazz Array nach dem Classnamen + * und sucht die Group zu den Raengen + * TRUE , wenn Group gesetzt + * + * @param className + * @param playerName + * @param world + * @return + */ + private boolean hasClass(String className, Player player, String world) + { + ArrayList classes = ClassManager.getClasses(); + String sPermName = ""; + boolean isClass = false; + plugin.db.i("SearchClass : " + className); + for (Clazz oClass : classes) + { + // pruefe ob KLassenname identisch + if (className.equalsIgnoreCase(oClass.name)) + { + plugin.db.i("Found : " + oClass.name); +// ArrayList ranks = oClass.getRanks(); + for (Rank rank : oClass.ranks) + { + sPermName = rank.getPermName(); + plugin.db.i("Search Perm : " + sPermName); + // pruefe ob Permname als group vorhanden ist + // wenn gefunden , setze result + if (hasPlayerGroup(sPermName, player)) + { + plugin.db.i("HasPerm : " + sPermName); + isClass = true; + return true; + } + } + + } + } + return isClass; + } + + + /** + * Durchsucht die ClassList nach dem ClassNamen + * @param ClassRank + * @return + */ + private boolean existClass( String className) + { + ArrayList classes = ClassManager.getClasses(); + for (Clazz oClass : classes) + { + // pruefe ob KLassenname identisch + if (className.equalsIgnoreCase(oClass.name)) + { + return true; + } + } + return false; + } + + +// private void cmdTemp (Player pPlayer, String[] args) { +// +// } + /** + * Remove Player from Rank + * Args[0] = Subcommand + * Args[1] = Playername + * Args[2] = Classname + * Args[3] = Worldname default = all + * + * @param sender + * @param player + * @param args + * @param world + * @return + */ + private boolean cmdRemove(Player sender, String[] args) + { + String world = ""; + String className = ""; + String playerName = ""; + // es müssen mindestens 3 Argumente vorhanden sein + if (args.length < 3) + { + // not enough arguments ;) + plugin.msg(sender,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); + plugin.msg(sender,"/class [remove] [playername] [classname] {world} | Remove user from a class"); + + return false; + } else + { + playerName = args[1]; + className = args[2]; + // Args[4] = world + if (args.length > 3) + { + world = args[3]; + } + } + Player player = plugin.getServer().getPlayer(playerName); + + if (plugin.trackRanks) + { + ClassManager.saveClassProgress(player); + } + + if (hasClass(className, player, world)) + { + +// Rank rank = hasRank( className, player, world); +// if (rank == null) +// { +// plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) +// + " does not have class : " + className); +// return true; +// } +// plugin.perms.rankRemove(world, player, rank.getPermName()); // do it! + removeRanks(className, player, world); + System.out.println("debug : remove ready"); + + if (plugin.config.isRankpublic() ) + { + // self remove successful! + plugin.getServer().broadcastMessage(player+ + " are removed from rank " + ChatColor.RED + + className + ChatColor.WHITE + + " in " + + FormatManager.formatWorld(world) + "!"); + } else + { + // self remove successful! + plugin.msg(player,"You are removed from rank " + ChatColor.RED + + className + ChatColor.WHITE + + " in " + + FormatManager.formatWorld(world) + "!"); + if (!(sender == player)) + { + // self remove successful! + plugin.msg(sender,playerName+" are removed from rank " + ChatColor.RED + + className + ChatColor.WHITE + + " in " + + FormatManager.formatWorld(world) + "!"); + } + } + } + return true; + } + + /** + * Check the Rank cost with default value and individual value + * @param sender , command sneder + * @param player , ranked player + * @param rank , new rank + * @param rID , index of rank in Clazz + * @return true = cost available or not relevant / false = not enough money + */ + private boolean checkCost(Player sender, Player player , Rank rank, int rID) + { + plugin.db.i("Get Rank Cost"); + double rank_cost = 0; // tempvalue + + // get default cost from Config table + rank_cost = plugin.config.getMoneyCost(rID); + + // get individual rank cost + if (rank.getCost() != -1337D) + { + rank_cost = rank.getCost(); + } + plugin.db.i("Get Rank Cost : " + rank_cost); + + // Check if the player has got the money + // check loaded economy + plugin.db.i("Check economy"); + if (ClassRanks.economy != null) + { + plugin.db.i("Economy found : " + ClassRanks.economy.getName() ); + plugin.db.i("isCheckCost : " + plugin.config.isCheckprices()); + // should Cost be checked + if (plugin.config.isCheckprices()) + { + if (ClassRanks.economy.getBalance(player.getName()) < rank_cost) + { + plugin.db.i("money check NOT successful"); + checkedCost = rank_cost; + return false; + } else + { + plugin.db.i("money check NOT successful"); + checkedCost = rank_cost; + return true; + } + } else + { + plugin.db.i("money check successful"); + checkedCost = rank_cost; + return true; + } + } else if (plugin.method != null) + { + plugin.db.i("No economy found, use Method : " + plugin.method.getName()); + plugin.db.i("isCheckCost" + plugin.config.isCheckprices()); + // should cost be checked + if (plugin.config.isCheckprices()) + { + MethodAccount ma = plugin.method.getAccount(player.getName()); + if (!ma.hasEnough(rank_cost)) + { + checkedCost = rank_cost; + return false; + } else + { + plugin.db.i("money check NOT successful"); + checkedCost = rank_cost; + return false; + } + } else + { + plugin.db.i("money check successful"); + checkedCost = rank_cost; + return true; + } + } else + { + plugin.db.i("money check done, NO economy"); + checkedCost = 0.0; + return true; + } + } + + + private boolean checkExp(Player sender, Player player , Rank rank, int rID) + { + int exp_cost = -1; + // get default exp cost from config + exp_cost = plugin.config.getExpCost(rID); + + // get individual expCost from rank + if (rank.getExp() > 0) + { + exp_cost = rank.getExp(); + } + plugin.db.i("Get ExpCost : " + exp_cost); + + plugin.db.i("isCheckExp : " + plugin.config.isCheckexp()); + if (plugin.config.isCheckexp()) + { + if (player.getTotalExperience() < exp_cost) { + plugin.msg(player, + "You don't have enough experience! You need " + + exp_cost); + checkedExp = exp_cost; + return false; + } else + { + plugin.db.i("exp check successful"); + checkedExp = exp_cost; + return true; + } + } else + { + plugin.db.i("exp check not relevant"); + checkedExp = 0; + return true; + } + } + + /** + * Check the default and rank items against player inventory + * + * @param sender , promoter + * @param player , ranked player + * @param rank , new Rank + * @param rID , Index actual Rank + * @return true = items available, not relevant, false = items not available + */ + private boolean checkitems(Player sender, Player player , Rank rank, int rID) + { + + ItemStack[] items = null; + ItemStack[][] rankItems = plugin.config.getRankItems(); // per rank a list of items + + items = rankItems[rID]; + + if (rank.getItemstacks() != null) + { + items = rank.getItemstacks(); + } + + if (plugin.config.isCheckitems()) + { + plugin.db.i("Get Item Cost : " + items.length); + plugin.db.i("isCheckItems : " + plugin.config.isCheckitems()); + plugin.db.i("item check start"); + plugin.db.i("Player "+player.getName()); + if (pm.hasItems(player, items) == false) + { + return false; + } else + { + plugin.db.i("Items found "); + checkedItems = items; + return true; + + } + } else + { + plugin.db.i("No Items found !"); + plugin.db.i("item check NOT relevant"); + checkedItems = null; + return true; + } + + } + + /** + * Add Clazz d first Rank to player + * /class [add] [playername] [classname] {world} | Add user to a class + * + * @param sender of the Command + * @param player to promot ein class + * @param className + * @param world + * @return + */ + private boolean cmdAddRank(Player sender, Player player, String className, String world) + { + /// ADD + // Check for Rank is always given + plugin.db.i("Check hasClass"); + if (hasClass(className, player, world)) + { + plugin.error(sender, + "Player " + FormatManager.formatPlayer(player.getName()) + + " already has the Clazz " + + ChatColor.RED + className + "!"); + plugin.msg(sender,"Use /class [rankup] [playername] {world} | Rank user up"); + return true; + } + + // ADD + plugin.db.i("Get TempRank"); + Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(className)); + + // ClassRank does not exist + if (tempRank == null) + { + plugin.error(sender,"The class you entered does not exist!"+className); + return true; + } + + + int rID = ClassManager.getRankIndex(tempRank, tempRank.getSuperClass()); // Index des Rank + // Track Rank +// if (plugin.trackRanks) +// { +//// rID = ClassManager.loadClassProcess(player, +//// tempRank.getSuperClass()); +// } + plugin.db.i("Get Rank Index : " + rID); + + // Check for money to rank up + // rankCosts stored in checkedCost + if (checkCost(sender, player , tempRank, rID) == false) + { + // not enough money message send to player and to promoter + plugin.error(player,"You don't have enough money to choose your class! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + plugin.error(sender,"The player don't have enough money ! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + return true; + + } + plugin.db.i("money check successful"); + + // check for experience to rank up + // expcost stored in checkedExp + if (checkExp(sender, player, tempRank, rID) == false) + { + // not enough exp message send to player and to promoter + plugin.error(player,"You don't have enough experience! You need "+ checkedExp); + plugin.error(sender,"Player don't have enough experience! You need "+ checkedExp); + return true; + } + plugin.db.i("Exp check done"); + + // check items for rank up + if (checkitems(sender, player , tempRank, rID) == false) + { + // not enough items message send to player and to promoter + plugin.error(player,"You don't have enough items!"); + plugin.error(sender,"Player don't have enough items!"); + return true; + } + + plugin.db.i("item check done"); + + String cPermName = tempRank.getPermName(); // Display rank name + String cDispName = tempRank.getDispName(); // Display rank name + ChatColor c_Color = tempRank.getColor(); // Rank color + + // success! + + // Do Cost and Addrank + if (checkedCost > 0) + { + ClassRanks.economy.withdrawPlayer(player.getName(), checkedCost); + plugin.msg(player, "You paid " + checkedCost + " money !"); + plugin.msg(sender, "Player paid " + checkedCost + " money !"); + } + + if (checkedExp > 0) + { + player.setTotalExperience(player.getTotalExperience() - checkedExp); + plugin.msg(player, "You paid " + checkedExp + " experience points!"); + plugin.msg(player, "Player paid " + checkedExp + " experience points!"); + } + + if (plugin.config.isCheckitems()) + { + pm.takeItems(player, checkedItems); + plugin.msg(player, "You paid the required items!"); + plugin.msg(player, "Player paid the required items!"); + } + + // remove oldRank + plugin.db.i("isClearRanks : " + plugin.config.isClearranks()); + if (plugin.config.isClearranks()) + { + plugin.perms.removeGroups(player); + plugin.error(sender, "The old perms are removed !"); + plugin.db.i("Remove Groups from Permission"); + } + +// world = plugin.config.isDefaultrankallworlds() ? "all" : player.getWorld().getName(); + if (plugin.config.isDefaultrankallworlds()) + { + plugin.perms.rankAddGlobal(player, cPermName); + } else + { + plugin.perms.rankAdd(player, cPermName); + } + plugin.db.i("Added Group to Permission"); + plugin.msg(sender,"Added Perms to Group "+cPermName); + + if (plugin.config.isRankpublic() ) + { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] " + FormatManager.formatPlayer(player.getName()) + + " now is a " + c_Color + cDispName); + return true; + } else + { + plugin.msg(player, "You now are in Class " + c_Color + cDispName); + return true; + } +//END ADD / REMOVE + } + + /** + * Prueft die Command Parameter auf World + * @param args + * @return + */ + private boolean isWorld (String[] args) + { + if (args.length > 3) + { + return true; + } else + { + return false; + } + } + + /** + * Setzt World Parameter oder default wert "all" + * @param world + * @param args + * @return + */ + private String getWorldArg(String world, String[] args) + { + + if (isWorld(args)) + { + // => /class add *player* *classname* world + return args[3]; + } else + { + if (plugin.config.isDefaultrankallworlds()) + { + return "all"; + } else + { + return world; + } + + } + } + + + + + /** + * The main switch for the command usage. Check for known commands, + * permissions, arguments, and commit whatever is wanted. + * + *
+     /class [classname] | Choose the class [classname] for yourself
+     /class [config]  | list the configuration
+     /class [list] {classname} | list of class/ranks
+     /class [groups]  {playername} | list the groups of user
+      
+     /class [add]     [playername] [classname] {world} | Add user to a class
+     /class [remove]  [playername] [classname] {world} | Remove user from a class
+
+     /class [rankup]  [playername] {world} | Rank user up
+     /class [rankdown][playername] {world} | Rank user down
+     /class [get]     [playername] {world} | Show rank of user
+     
+ * @param pPlayer , the sender of the command + * @param args , arguments of the Command /class + * @return + */ + public boolean parseCommand(Player pPlayer, String[] args) + { +// Player player = pPlayer; + plugin.db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); + + boolean isSelf = plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName()); + + if (pPlayer.isOp()) + { + isSelf = true; + } + + if (args.length == 0) + { + //zeigt command description aus Plugi.yml + cmdCommandInfo (pPlayer); + return true; + } + + // LIST + if (args[0].equalsIgnoreCase("list")) { + // Command list of Ranks in the Clazz 3.2 + cmdList(pPlayer,args); + return true; + } + + if (args[0].equalsIgnoreCase("info")) + { + plugin.msg(pPlayer,"Not implementedt yet !"); + } + // GET + if (args[0].equalsIgnoreCase("get")) { + // Command Get 3.2 + cmdGet(pPlayer, args); + return true; + } + // GROUPS + if (args[0].equalsIgnoreCase("groups")) { + // Command list of Ranks in the Clazz 3.2 + cmdUserGroups(pPlayer, args); + return true; + } + + //RANKUP + if ((args[0].equalsIgnoreCase("rankup"))) + { + if (hasAdminPerms(pPlayer)) + { + // rank up or down + if (args.length > 2) + { + String playerName = args[1]; + Player player = PlayerManager.searchPlayerName(playerName); + if ((player == null)) + { + plugin.msg(pPlayer, "Not found player " + playerName); + return true; + } + String world = getWorldArg(pPlayer.getWorld().getName(), args); // store + String className = args[2]; + + return rankUp(pPlayer, player, className, world); + } else + { + plugin.msg(pPlayer,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); + plugin.msg(pPlayer," /class [rankup] [playername] [classname] {world} | Rank user up"); + return true; + } + } else + { + plugin.msg(pPlayer, "You don't have the right permission !"); + } + } + + //RANKDOWN + if ((args[0].equalsIgnoreCase("rankdown"))) + { + if (hasAdminPerms(pPlayer)) + { + // rank up or down + if (args.length > 2) + { + String playerName = args[1]; + Player player = PlayerManager.searchPlayerName(playerName); + if ((player == null)) + { + plugin.msg(pPlayer, "Not found player " + playerName); + return true; + } + String world = getWorldArg(pPlayer.getWorld().getName(), args); // store + String className = args[2]; + + return rankDown(pPlayer, player, className, world); + } else { + plugin.msg(pPlayer,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); + plugin.msg(pPlayer," /class [rankdown] [playername] [classname] {world} | Rank user down"); + return true; + } + + } else + { + plugin.msg(pPlayer, "You don't have the right permission !"); + } + + } + + // preset of World name +// String world = player.getWorld().getName(); +// String PlayerName = getPlayerName(pPlayer, args); + + if (args[0].equalsIgnoreCase("remove")) + { + if (hasAdminPerms(pPlayer)) + { + cmdRemove(pPlayer, args); + } else + { + plugin.msg(pPlayer, "You don't have the right permission !"); + return true; + } + + } + + if ((args[0].equalsIgnoreCase("add"))) + { + String className = ""; + // es müssen mindestens 3 Argumente vorhanden sein + // class [add] [playername] [classname] {world} | Add user to a class + if (args.length < 3) + { + // not enough arguments ;) + plugin.msg(pPlayer,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); + plugin.msg(pPlayer," /class [add] [playername] [classname] {world} | Add user to a class"); + return true; + } else + { + Player player = null; + String PlayerName = args[1]; + String world = ""; + if (hasAdminPerms(pPlayer)) + { + plugin.db.i("perm check successful"); + // get the class of the player we're talking about + // change PlayerObject + player = PlayerManager.searchPlayerName(PlayerName); + if ((player != null)) + { + world = player.getWorld().getName(); + } else + { + plugin.msg(pPlayer, "Not found player " + PlayerName); + return true; + } + } else + { + plugin.msg(pPlayer, "You don't have the right permission !"); + return true; + } + className = args[2]; + + //world name auswerten und setzen + world = getWorldArg(world, args); + plugin.db.i("precheck successful"); + // Add Rank + cmdAddRank(pPlayer,player,className, world); + return true; + } + } + + //--------------------------------------------------------------------------- + // Simple Commands + // + if (args[0].equalsIgnoreCase("config")) + { + if(pPlayer.isOp()) + { + // Command list of Ranks in the Clazz 3.2 + cmdConfig(pPlayer, args); + return true; + } else + { + plugin.msg(pPlayer, "You don't have the right permission !"); + return true; + } + } + + if (args[0].equalsIgnoreCase("get")) + { + // Command Get 3.2 + cmdGet(pPlayer, args); + return true; + } + + + if (args[0].equalsIgnoreCase("reload")) + { + // Command reload + if (pPlayer.isOp()) { + plugin.config.load_config(); + plugin.msg(pPlayer, "Config reloaded!"); + } else + { + plugin.msg(pPlayer, "You don't have the right permission !"); + return true; + } + } + + // /class [classname] + // /class [classname] | Choose the class [classname] for yourself in all worlds + + // command wird nur ausgefuehrt bei permissions + if (isSelf == false) + { + plugin.msg(pPlayer,"You don't have permission to choose your class!"); + return true; + } else + { + String className = args[0]; + if (existClass(className)) + { + String world = "all"; + cmdAddRank(pPlayer, pPlayer, className, world); + return true; + } else + { + plugin.msg(pPlayer,"The class name not exist!"); + plugin.msg(pPlayer,"/class [classname] | Choose the class [classname] for yourself in all worlds"); + return true; + } + } + + } + + public boolean parseSelfRank(Player pPlayer, String[] args) + { + if (args.length == 0) + { + //zeigt command description aus Plugi.yml + cmdRankInfo (pPlayer); + return true; + } + if (plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName())) + { + plugin.msg(pPlayer, "You don't have the right permission !"); + return true; + } + String className = args[0]; + // rank [classname] | Add yourself to a class + String world = ""; + + //world name auswerten und setzen + world = getWorldArg(world, args); + plugin.db.i("precheck successful"); + // Add Rank + cmdAddRank(pPlayer,pPlayer,className, world); + return true; + + } + + public boolean parseSelfRankUp(Player pPlayer, String[] args) + { + if (args.length == 0) + { + //zeigt command description aus Plugi.yml + cmdRankUpInfo (pPlayer); + return true; + } + String className = args[0]; + // rank [classname] | Add yourself to a class + String world = ""; + + //world name auswerten und setzen + world = getWorldArg(world, args); + plugin.db.i("precheck successful"); + // Add Rank + + rankUp(pPlayer, pPlayer, className, world); + return true; + } + + public boolean parseSelfRankDown(Player pPlayer, String[] args) + { + if (args.length == 0) + { + //zeigt command description aus Plugi.yml + cmdRankDownInfo (pPlayer); + return true; + } + String className = args[0]; + // rank [classname] | Add yourself to a class + String world = ""; + + //world name auswerten und setzen + world = getWorldArg(world, args); + plugin.db.i("precheck successful"); + // Add Rank + + rankDown(pPlayer, pPlayer, className, world); + + return true; + } + + + +} diff --git a/src/net/slipcor/classranks/commands/RankdownCommand.java b/src/net/slipcor/classranks/commands/RankdownCommand.java index 4d3da7c..866449d 100644 --- a/src/net/slipcor/classranks/commands/RankdownCommand.java +++ b/src/net/slipcor/classranks/commands/RankdownCommand.java @@ -1,7 +1,6 @@ package net.slipcor.classranks.commands; import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.CommandManager; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; @@ -20,7 +19,7 @@ public class RankdownCommand implements CommandExecutor { private final ClassRanks plugin; - private final CommandManager cmdMgr; + private final PlayerCommands cmdMgr; private final DebugManager db; /** @@ -28,7 +27,7 @@ public class RankdownCommand implements CommandExecutor { * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public RankdownCommand(ClassRanks cr, CommandManager cm) { + public RankdownCommand(ClassRanks cr, PlayerCommands cm) { plugin = cr; cmdMgr = cm; db = new DebugManager(cr); diff --git a/src/net/slipcor/classranks/commands/RankupCommand.java b/src/net/slipcor/classranks/commands/RankupCommand.java index 04df6bf..303a841 100644 --- a/src/net/slipcor/classranks/commands/RankupCommand.java +++ b/src/net/slipcor/classranks/commands/RankupCommand.java @@ -1,7 +1,6 @@ package net.slipcor.classranks.commands; import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.CommandManager; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; @@ -20,7 +19,7 @@ public class RankupCommand implements CommandExecutor { private final ClassRanks plugin; - private final CommandManager cmdMgr; + private final PlayerCommands cmdMgr; private final DebugManager db; /** @@ -28,7 +27,7 @@ public class RankupCommand implements CommandExecutor { * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public RankupCommand(ClassRanks cr, CommandManager cm) { + public RankupCommand(ClassRanks cr, PlayerCommands cm) { plugin = cr; cmdMgr = cm; db = new DebugManager(cr); diff --git a/src/net/slipcor/classranks/core/Class.java b/src/net/slipcor/classranks/core/Clazz.java similarity index 89% rename from src/net/slipcor/classranks/core/Class.java rename to src/net/slipcor/classranks/core/Clazz.java index 07b6bfe..09a4f5b 100644 --- a/src/net/slipcor/classranks/core/Class.java +++ b/src/net/slipcor/classranks/core/Clazz.java @@ -15,7 +15,8 @@ * @author slipcor */ -public class Class { +public class Clazz +{ public final ArrayList ranks = new ArrayList(); public String name; @@ -23,7 +24,7 @@ public class Class { * create a class instance * @param sClassName the class name */ - public Class(String sClassName) { + public Clazz(String sClassName) { this.name = sClassName; } @@ -36,7 +37,8 @@ public Class(String sClassName) { * @param dCost the rank cost * @param iExp the rank exp cost */ - public void add(String sPermName, String sDispName, ChatColor cColor, ItemStack[] isItems, double dCost, int iExp) { + public void add(String sPermName, String sDispName, ChatColor cColor, ItemStack[] isItems, double dCost, int iExp) + { this.ranks.add(new Rank(sPermName, sDispName, cColor, this, isItems, dCost, iExp)); } diff --git a/src/net/slipcor/classranks/core/PlayerClassList.java b/src/net/slipcor/classranks/core/PlayerClassList.java deleted file mode 100644 index e9c2383..0000000 --- a/src/net/slipcor/classranks/core/PlayerClassList.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.slipcor.classranks.core; - -import java.util.ArrayList; -import java.util.Iterator; - -/** - * - * @author Windu - * - * define a player Class Rank List object - * will be used to track player classes - */ -public class PlayerClassList { - - private String playerName; - - private ArrayList playerClassRanks; - - public PlayerClassList(String playerName, - ArrayList playerClassRanks) { - super(); - this.playerName = playerName; - this.playerClassRanks = playerClassRanks; - } - - public void setPlayerName(String playerName) { - this.playerName = playerName; - } - - public String getPlayerName() { - return this.playerName; - } - - public boolean equalsIgnoreCaseName(String playerName) { - return playerName.equalsIgnoreCase(playerName); - } - - public boolean addPlayerClassRank (String className, String rankName) { - - if (playerClassRanks == null) { - playerClassRanks = new ArrayList(); - } - playerClassRanks.add(new PlayerClassRank(className, rankName)); - - return true; - } - - public PlayerClassRank getPlayerClassRank(int index) { - - return playerClassRanks.get(index); - } - - public String getPlayerClass(int index) { - - return playerClassRanks.get(index).className; - } - - public String getPlayerRank(int index) { - - return playerClassRanks.get(index).rankName; - } - - - public boolean equalsIgnoreCaseClass(String className) { - boolean isfound = false; - for (Iterator item = playerClassRanks.iterator(); item.hasNext(); ) { - if ( item.next().className.equalsIgnoreCase(className)) { - isfound = true; - } - } - return isfound; - } - - public boolean equalsIgnoreCaseRank(String rankName) { - boolean isfound = false; - for (Iterator item = playerClassRanks.iterator(); item.hasNext(); ) { - if ( item.next().rankName.equalsIgnoreCase(rankName)) { - isfound = true; - } - } - return isfound; - } - - @SuppressWarnings("null") - public int getClassIndex(String className) { - int found = -1; - PlayerClassRank[] items = null; - if (playerClassRanks.size() > 0) { - playerClassRanks.toArray(items); - for (int i=0; i 0) { - playerClassRanks.toArray(items); - for (int i=0; i +{ + + /** + * + */ + private static final long serialVersionUID = -3071712660629867671L; + + private String playerName; + +// private ArrayList playerClassRanks; + + public PlayerClazzList(String playerName, ArrayList playerClassRanks) + { + super(); + this.playerName = playerName; + this.addAll(playerClassRanks); + } + + public void setPlayerName(String playerName) { + this.playerName = playerName; + } + + public String getPlayerName() { + return this.playerName; + } + + public boolean equalsIgnoreCaseName(String playerName) { + return playerName.equalsIgnoreCase(playerName); + } + + public boolean addPlayerClassRank (String className, String rankName) { + + this.add(new PlayerClazzRank(className, rankName)); + + return true; + } + + public PlayerClazzRank getPlayerClassRank(int index) { + + return this.get(index); + } + + public String getPlayerClass(int index) { + + return this.get(index).className; + } + + public String getPlayerRank(int index) { + + return this.get(index).rankName; + } + + + public boolean equalsIgnoreCaseClass(String className) { + boolean isfound = false; + for (Iterator item = this.iterator(); item.hasNext(); ) { + if ( item.next().className.equalsIgnoreCase(className)) { + isfound = true; + } + } + return isfound; + } + + public boolean equalsIgnoreCaseRank(String rankName) + { + boolean isfound = false; + for (Iterator item = this.iterator(); item.hasNext(); ) + { + if ( item.next().rankName.equalsIgnoreCase(rankName)) + { + isfound = true; + } + } + return isfound; + } + + @SuppressWarnings("null") + public int getClassIndex(String className) + { + int found = -1; + PlayerClazzRank[] items = null; + if (this.size() > 0) + { + this.toArray(items); + for (int i=0; i 0) + { + this.toArray(items); + for (int i=0; i getItems() { - if (items == null) { + public ArrayList getItems() + { + if (items == null) + { return null; } ArrayList result = new ArrayList(); - for (ItemStack i : items) { - if (i == null) { + for (ItemStack item : items) + { + if (item == null) { continue; } - if (i.getDurability() != 0) { - result.add(i.getType().toString() + ":" + i.getDurability() + ":"+i.getAmount()); - } else { - if (i.getAmount() != 0) { - result.add(i.getType().toString() + ":"+i.getAmount()); - } else { - result.add(i.getType().toString()); + if (item.getDurability() != 0) + { + result.add(item.getType().toString() + ":" + item.getDurability() + ":"+item.getAmount()); + } else + { + if (item.getAmount() != 0) + { + result.add(item.getType().toString() + ":"+item.getAmount()); + } else + { + result.add(item.getType().toString()); } } } diff --git a/src/net/slipcor/classranks/handlers/CRHandler.java b/src/net/slipcor/classranks/handlers/CRHandler.java index de64ed1..fb9d92d 100644 --- a/src/net/slipcor/classranks/handlers/CRHandler.java +++ b/src/net/slipcor/classranks/handlers/CRHandler.java @@ -10,18 +10,99 @@ * @author slipcor */ -public abstract class CRHandler { - public abstract boolean isInGroup(String world, String permName, String player); +public abstract class CRHandler +{ + /** + * check if user in group + * use world = null for search in all worlds + * + * @param world + * @param permName + * @param player + * @return + */ + public abstract boolean isInGroup(String world, String permName, Player player); + + /** + * initialize permission provider + * + * @return + */ public abstract boolean setupPermissions(); - public abstract boolean hasPerms(Player comP, String string, String world); - public abstract void classAdd(String world, String player, String cString); - public abstract void classAddGlobal(String player, String cString); - public abstract void rankAdd(String world, String player, String rank); - public abstract void rankAddGlobal(String player, String rank); - public abstract void rankRemove(String world, String player, String cString); - public abstract void rankRemoveGlobal(String player, String cString); - public abstract String getPermNameByPlayer(String world, String player); - public abstract String getPermNameByPlayerGlobal(String player); + + /** + * check permission + * use world = null for check in all worlds + * + * @param player + * @param string + * @param world + * @return + */ + public abstract boolean hasPerms(Player player, String string, String world); + + /** + * Add rank/group to player permission + * use classAddGlobal if congig allWorlds = true + * + * @param world + * @param player + * @param cString + */ + public abstract void classAdd(String world, Player player, String cString); + + /** + * add rank/group to player permission in all worlds + * use world = null + * + * @param player + * @param cString + */ + public abstract void classAddGlobal(Player player, String cString); + + /** + * Add rank/group to player permission + * use rankAddGlobal if congig allWorlds = true + * + * @param world + * @param player + * @param rank + */ + public abstract void rankAdd( Player player, String rank); + + /** + * add rank/group to player permission in all worlds + * use world = null + * + * @param player + * @param rank + */ + public abstract void rankAddGlobal(Player player, String rank); + + /** + * remove rank/group from player + * use rankRemoveGlobal if congig allWorlds = true + * + * @param world + * @param player + * @param cString + */ + public abstract void rankRemove(Player player, String cString); + + /** + * remove rank/group from player permission in all worlds + * use world = null + * + * @param player + * @param cString + */ + public abstract void rankRemoveGlobal(Player player, String cString); + + public abstract String getPermNameByPlayer(String world, Player player); + + public abstract String getPermNameByPlayerGlobal(Player player); + public abstract void removeGroups(Player player); - public abstract String[] getPlayerGroups(String player); + + public abstract String[] getPlayerGroups(Player player); } diff --git a/src/net/slipcor/classranks/handlers/HandleBPerms.java b/src/net/slipcor/classranks/handlers/HandleBPerms.java deleted file mode 100644 index aff0f32..0000000 --- a/src/net/slipcor/classranks/handlers/HandleBPerms.java +++ /dev/null @@ -1,215 +0,0 @@ -package net.slipcor.classranks.handlers; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.DebugManager; -import net.slipcor.classranks.managers.PlayerManager; - -import org.bukkit.World; -import org.bukkit.entity.Player; - -import de.bananaco.bpermissions.api.ApiLayer; -import de.bananaco.bpermissions.api.CalculableType; - -/** - * bPermissions handler class - * - * @version v0.4.3 - * - * @author slipcor - */ - -public class HandleBPerms extends CRHandler { - private final ClassRanks plugin; - private final DebugManager db; - - public HandleBPerms(ClassRanks cr) { - plugin = cr; - db = new DebugManager(cr); - } - - @Override - public boolean isInGroup(String world, String permName, String player) { - //ApiLayer.hasGroup(world, type, name, group) - return ApiLayer.hasGroup(world, CalculableType.USER, player, - permName); - } - - /* - * Function that tries to setup the permissions system, returns result - */ - @Override - public boolean setupPermissions() { - // try to load permissions, return result - try { - ApiLayer al = new ApiLayer(); - plugin.log("<3 bPermissions", Level.INFO); - return (al.toString() != null); - } catch (Exception e) { - db.i("bPerms not found"); - return false; - } - } - - @Override - public boolean hasPerms(Player comP, String string, String world) { - return comP.hasPermission(string); - } - - /* - * Add a user to a given class in the given world - */ - @Override - public void classAdd(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - ApiLayer.addGroup(worlds[i], CalculableType.USER, player, - cString); - db.i("added group " + cString + " to player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - /* - * Add a user to a given rank in the given world - */ - @Override - public void rankAdd(String world, String player, String rank) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - ApiLayer.addGroup(worlds[i], CalculableType.USER, player, rank); - db.i("added rank " + rank + " to player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - /* - * Remove a user from the class he has in the given world - */ - @Override - public void rankRemove(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - try { - - ApiLayer.removeGroup(worlds[i], CalculableType.USER, player, - cString); - db.i("removed rank " + cString + " from player " + player - + " in world " + worlds[i]); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + worlds[i], Level.WARNING); - } - } - } - - @Override - public String getPermNameByPlayer(String world, String player) { - player = PlayerManager.search(player); // auto-complete playername - ArrayList permGroups = new ArrayList(); - - String[] worlds = { world }; - if (world.equalsIgnoreCase("all")) { - List lWorlds = plugin.getServer().getWorlds(); - - worlds = new String[lWorlds.size()]; - for (int i = 0; i < lWorlds.size(); i++) { - worlds[i] = lWorlds.get(i).getName(); - } - } - for (int i = 0; i < worlds.length; i++) { - db.i("checking world "+worlds[i]); - String[] list = ApiLayer.getGroups(worlds[i], CalculableType.USER, - player); - for (String sRank : list) { - db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) { - permGroups.add(sRank); - } - } - - } - - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } - - @Override - public void classAddGlobal(String player, String cString) { - - } - - @Override - public void rankAddGlobal(String player, String rank) { - - } - - @Override - public void rankRemoveGlobal(String player, String cString) { - - } - - @Override - public String getPermNameByPlayerGlobal(String player) { - return null; - } - - @Override - public void removeGroups(Player player) { - String[] list = ApiLayer.getGroups(player.getWorld().getName(), CalculableType.USER, player.getName()); - for (String group : list) { - ApiLayer.removeGroup(player.getWorld().getName(), CalculableType.USER, player.getName(), - group); - } - } - - @Override - public String[] getPlayerGroups(String player) - { - return null; - } -} diff --git a/src/net/slipcor/classranks/handlers/HandlePEX.java b/src/net/slipcor/classranks/handlers/HandlePEX.java deleted file mode 100644 index 440806e..0000000 --- a/src/net/slipcor/classranks/handlers/HandlePEX.java +++ /dev/null @@ -1,219 +0,0 @@ -package net.slipcor.classranks.handlers; - -import java.util.ArrayList; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.DebugManager; -import net.slipcor.classranks.managers.PlayerManager; - -import org.bukkit.entity.Player; - -import ru.tehkode.permissions.PermissionManager; - -/** - * PermissionsEX handler class - * - * @version v0.4.3 - * - * @author slipcor - */ - -public class HandlePEX extends CRHandler { - private final ClassRanks plugin; - private PermissionManager permissionHandler; - private final DebugManager db; - - public HandlePEX(ClassRanks cr) { - plugin = cr; - db = new DebugManager(cr); - } - - @Override - public boolean isInGroup(String world, String permName, String player) { - db.i("isInGroup: player " - + player - + ", world: " - + world - + ", perms: " - + permName - + ": " - + String.valueOf(permissionHandler.getUser(player).inGroup( - permName))); - - return permissionHandler.getUser(player).inGroup(permName); - } - - @Override - public boolean setupPermissions() { - // try to fetch the PEX handler, return result - - permissionHandler = ru.tehkode.permissions.bukkit.PermissionsEx - .getPermissionManager(); - if (permissionHandler == null) { - db.i("PEX not found"); - return false; - } - plugin.log("<3 PEX", Level.INFO); // success! - return true; - } - - @Override - public boolean hasPerms(Player comP, String string, String world) { - db.i("player hasPerms: " - + comP.getName() - + ", world: " - + world - + ", perm: " - + string - + " : " - + String.valueOf(comP.hasPermission(string) ? true - : permissionHandler.has(comP.getName(), string, world))); - return comP.hasPermission(string) ? true : permissionHandler.has( - comP.getName(), string, world); - } - - @Override - public void classAdd(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - if (world.equalsIgnoreCase("all")) { - classAddGlobal(player, cString); - return; - } - try { - permissionHandler.getUser(player).addGroup(cString, world); - db.i("added group " + cString + " to player " + player - + " in world " + world); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + world, Level.WARNING); - } - } - - @Override - public void rankAdd(String world, String player, String rank) { - player = PlayerManager.search(player); // auto-complete playername - - if (world.equalsIgnoreCase("all")) { - rankAddGlobal(player, rank); - return; - } - try { - permissionHandler.getUser(player).addGroup(rank, world); - db.i("added rank " + rank + " to player " + player - + " in world " + world); - } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found in world " + world, Level.WARNING); - } - } - - @Override - public void rankRemove(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - if (world.equalsIgnoreCase("all")) { - rankRemoveGlobal(player, cString); - return; - } - try { - permissionHandler.getUser(player).removeGroup(cString, - world); - db.i("removed rank " + cString + " from player " + player - + " in world " + world); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found in world " + world, Level.WARNING); - } - } - - @Override - public String getPermNameByPlayer(String world, String player) { - ArrayList permGroups = new ArrayList(); - player = PlayerManager.search(player); // auto-complete playername - - if (world.equalsIgnoreCase("all")) { - return getPermNameByPlayerGlobal(player); - } - String[] groups = permissionHandler.getUser(player) - .getGroupsNames(world); - - for (String group : groups) - permGroups.add(group); - - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } - - @Override - public void classAddGlobal(String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - try { - permissionHandler.getUser(player).addGroup(cString); - db.i("added group " + cString + " to player " + player); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found", Level.WARNING); - } - } - - @Override - public void rankAddGlobal(String player, String rank) { - player = PlayerManager.search(player); // auto-complete playername - - try { - permissionHandler.getUser(player).addGroup(rank); - db.i("added rank " + rank + " to player " + player); - } catch (Exception e) { - plugin.log("PermName " + rank + " or user " + player - + " not found", Level.WARNING); - } - } - - @Override - public void rankRemoveGlobal(String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - try { - permissionHandler.getUser(player).removeGroup(cString); - db.i("added rank " + cString + " to player " + player); - } catch (Exception e) { - plugin.log("PermName " + cString + " or user " + player - + " not found", Level.WARNING); - } - } - - @Override - public String getPermNameByPlayerGlobal(String player) { - ArrayList permGroups = new ArrayList(); - player = PlayerManager.search(player); // auto-complete playername - - String[] groups = permissionHandler.getUser(player) - .getGroupsNames(); - - for (String group : groups) - permGroups.add(group); - - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } - - @Override - public void removeGroups(Player player) { - String[] groups = permissionHandler.getUser(player) - .getGroupsNames(); - - for (String group : groups) { - permissionHandler.getUser(player).removeGroup(group); - } - } - - @Override - public String[] getPlayerGroups(String player) - { - return null; - } -} diff --git a/src/net/slipcor/classranks/handlers/HandleSuperPerms.java b/src/net/slipcor/classranks/handlers/HandleSuperPerms.java deleted file mode 100644 index 2ba2f3b..0000000 --- a/src/net/slipcor/classranks/handlers/HandleSuperPerms.java +++ /dev/null @@ -1,155 +0,0 @@ -package net.slipcor.classranks.handlers; - -import java.util.ArrayList; -import java.util.Map; -import java.util.logging.Level; - -import org.bukkit.entity.Player; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.DebugManager; - -/** - * SuperPermissions handler class - * - * @version v0.4.3 - * - * @author slipcor - */ - -public class HandleSuperPerms extends CRHandler { - private final ClassRanks plugin; - private final DebugManager db; - - public HandleSuperPerms(ClassRanks cr) { - plugin = cr; - db = new DebugManager(cr); - } - - @Override - public boolean isInGroup(String world, String permName, String player) { - Map nodes = plugin.getConfig().getConfigurationSection("players." + player).getValues(true); - - if (nodes != null) - for (Object key : nodes.values()) - if (((String) key).equals(permName)) { - - db.i("isInGroup: player " + player + ", world: " + world + ", perms: " + permName + ": " + String.valueOf(true)); - return true; - } - - db.i("isInGroup: player " + player + ", world: " + world + ", perms: " + permName + ": " + String.valueOf(false)); - return false; - } - - - /* - * Function that tries to setup the permissions system, returns result - */ - @Override - public boolean setupPermissions() { - plugin.log("No permissions plugin found, No Permissions are used.", Level.INFO); // success! - return true; - } - - @Override - public boolean hasPerms(Player comP, String string, String world) { - db.i("player hasPerms: " + comP.getName() + ", world: " + world + ", perm: " + string + " : " + String.valueOf( comP.hasPermission(string))); - return comP.hasPermission(string); - } - - - /* - * Add a user to a given class in the given world - */ - @Override - public void classAdd(String world, String player, String cString) { - String firstRank = null; - if (plugin.trackRanks) { - firstRank = ClassManager.getFirstPermNameByClassName(cString, player); - } else { - firstRank = ClassManager.getFirstPermNameByClassName(cString); - } - plugin.getConfig().set("players." + player + "." + cString, firstRank); - db.i("added group " + cString + " to player " + player + ", no world support"); - plugin.saveConfig(); - } - - /* - * Add a user to a given rank in the given world - */ - @Override - public void rankAdd(String world, String player, String rank) { - String cString = ClassManager.getClassNameByPermName(rank); - plugin.getConfig().set("players." + player + "." + cString, rank); - db.i("added rank " + rank + " to player " + player + ", no world support"); - plugin.saveConfig(); - plugin.log("SuperPerm PermName " + rank + ": user " + player + " set " + world, Level.INFO); - } - - /* - * Remove a user from the class he has in the given world - */ - @Override - public void rankRemove(String world, String player, String cString) { - plugin.getConfig().set("players." + player, null); - db.i("removed rank " + cString + " from player " + player + ", no world support"); - plugin.saveConfig(); - } - - @Override - public String getPermNameByPlayer(String world, String player) { - ArrayList permGroups = new ArrayList(); - - Map groups = null; - try { - groups = plugin.getConfig().getConfigurationSection("players." + player).getValues(true); - } catch (Exception e) { - - } - - if (groups == null) { - return ""; - } - - for (Object group : groups.values()) - permGroups.add((String) group); - - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } - - @Override - public void classAddGlobal(String player, String cString) { - classAdd(null, player, cString); - } - - @Override - public void rankAddGlobal(String player, String rank) { - rankAdd(null, player, rank); - plugin.log("SuperPerm PermName " + rank + ": user " + player , Level.INFO); - } - - @Override - public void rankRemoveGlobal(String player, String cString) { - rankRemove(null, player, cString); - } - - @Override - public String getPermNameByPlayerGlobal(String player) { - return getPermNameByPlayer(null, player); - } - - @Override - public void removeGroups(Player player) { - plugin.getConfig().set("players."+player.getName(), null); - plugin.saveConfig(); - } - - @Override - public String[] getPlayerGroups(String player) - { - return null; - } -} diff --git a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java index 8645731..8b65732 100644 --- a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java @@ -7,36 +7,51 @@ import net.milkbowl.vault.permission.Permission; import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.managers.ClassManager; -import net.slipcor.classranks.managers.DebugManager; +//import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.PlayerManager; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; /** * Vault permissions handler class - * + * This will be the default Handler for permissions * @version v0.4.3 * - * @author slipcor + * @author slipcor, Krglok */ public class HandleVaultPerms extends CRHandler { private final ClassRanks plugin; - private final DebugManager db; +// private final DebugManager db; public static Permission permission = null; - public HandleVaultPerms(ClassRanks cr) { - plugin = cr; - db = new DebugManager(cr); + public HandleVaultPerms(ClassRanks plugin) { + this.plugin = plugin; +// db = new DebugManager(cr); } +// public boolean isInGroup(String world, String permName, String player) +// { +// return permission.playerInGroup(world, player, permName); +// } +// @Override - public boolean isInGroup(String world, String permName, String player) { - return permission.playerInGroup(world, player, permName); + public boolean isInGroup(String world, String permName, Player player) + { + if (plugin.config.isDefaultrankallworlds()) + { +// return permission.playerInGroup(world, player, permName); + world = null; + return permission.playerInGroup(world,player.getName(), permName); + } else + { + return permission.playerInGroup(player, permName); + } } - + /* * Function that tries to setup the permissions system, returns result */ @@ -44,24 +59,38 @@ public boolean isInGroup(String world, String permName, String player) { public boolean setupPermissions() { // try to load permissions, return result - RegisteredServiceProvider permissionProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); - if (permissionProvider != null) - { +// RegisteredServiceProvider permissionProvider = Bukkit.getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); try { - permission = permissionProvider.getProvider(); - getPermNameByPlayer(Bukkit.getWorlds().get(0).getName(), "slipcor"); + permission = plugin.permission; + permission.getGroups(); // test for permission is instanced +// getPermNameByPlayer(Bukkit.getWorlds().get(0).getName(), "slipcor"); } catch (Exception e) { - permission = null; + return false; } - } - return (permission != null); + return true; } @Override - public boolean hasPerms(Player comP, String string, String world) { - return permission.has(world, comP.getName(), string); + public boolean hasPerms(Player player, String perm, String world) + { + if (world == null) world = ""; + if (perm == null) return false; + if (permission == null) + { + System.out.println("no VAULT not instance !"); + return false; + } + if (plugin.config.isDefaultrankallworlds()) + { + world = null; + return permission.playerHas(world, player.getName(), perm); + } else + { +// return permission.playerHas(world, player, perm); + return permission.playerHas(player, perm); + } } /* @@ -69,222 +98,236 @@ public boolean hasPerms(Player comP, String string, String world) { * diese funktion ist wahrscheinlich unnötig !! */ @Override - public void classAdd(String world, String player, String cString) + public void classAdd(String world, Player player, String cString) { - player = PlayerManager.search(player); // auto-complete playername +// player = PlayerManager.searchName(player); // auto-complete playername - if (world.equalsIgnoreCase("all")) + if (plugin.config.isDefaultrankallworlds()) { classAddGlobal(player, cString); return; } try { - permission.playerAddGroup(world, player, cString); - db.i("added group " + cString + " to player " + player+ " in world " + world); + +// permission.playerAddGroup(world, player, cString); + permission.playerAddGroup(player, cString); + plugin.db.i("added group " + cString + " to player " + player+ " in world " + world); } catch (Exception e) { - plugin.log("Exception Add Class " + cString + " or user " + player + " not found in world " + world, Level.WARNING); + ClassRanks.log("Exception Add Class " + cString + " or user " + player + " not found in world " + world, Level.WARNING); } } - + + + @Override + /** + * Add Class/rank in all worlds + * world set to null + * + */ + public void classAddGlobal(Player player, String cString) + { +// player = PlayerManager.searchName(player); // auto-complete playername + String world = null; + try + { + if (permission.playerAddGroup(player, cString) == false) + { + ClassRanks.log("ERROR ADD PermName " + cString + " or user " + player + " ", Level.SEVERE); + + } else + { + ClassRanks.log("Vault Global PermName " + cString + ": user " + player , Level.INFO); + plugin.db.i("Added Class/Rank " + cString + " to player " + player); + } + } catch (Exception e) { + ClassRanks.log("Exception Add Class Global " + cString + " or user " + player, Level.SEVERE); + } + } + /* * Add a user to a given rank in the given world * if world = all then rank added without world * stores player Rank also in the config */ @Override - public void rankAdd(String world, String player, String rank) + public void rankAdd(Player player, String rank) { - player = PlayerManager.search(player); // auto-complete playername - if (world.equalsIgnoreCase("all")) + if (plugin.config.isDefaultrankallworlds()) { + System.out.println("CR rankAddGlobal"); rankAddGlobal(player, rank); - return; - } - - try + } else { - if (permission.playerAddGroup(world, player, rank))//(permission.playerAddGroup(world, player, rank)) + try { - db.i("Vault added rank " + rank + " to player " + player + " in world " + world); - String cString = ClassManager.getClassNameByPermName(rank); - plugin.getConfig().set("players." + player + "." + cString, rank); - plugin.getConfig().set("worlds." + world + "." + player, rank); - plugin.saveConfig(); - db.i("Vault PermName " + rank + ": user " + player + " set " + world); - - } else { - db.i("ERROR Vault added rank " + rank + " to player " + player + " in world " + world); + if (permission.playerAddGroup(player, rank)) + { + plugin.db.i("Vault added rank " + rank + " to player " + player + " in world " + player.getWorld().getName()); + String cString = ClassManager.getClassNameByPermName(rank); + plugin.getConfig().set("players." + player + "." + cString, rank); + plugin.getConfig().set("worlds." + player.getWorld().getName() + "." + player, rank); + plugin.saveConfig(); + plugin.db.i("Vault PermName " + rank + ": user " + player + " set " + player.getWorld().getName()); + + } else { + plugin.db.i("ERROR Vault added rank " + rank + " to player " + player + " in world " + player.getWorld().getName()); + } + } catch (Exception e) { + ClassRanks.log("Exception added rank " + rank + " or user " + player + " not found in world " + player.getWorld().getName(), Level.WARNING); } - } catch (Exception e) { - plugin.log("Exception added rank " + rank + " or user " + player + " not found in world " + world, Level.WARNING); } } - /* - * Remove a user from the Rank he has in the given world - * if world = all then rank added without world - * Remove player Rank also in the config + /** + * add rank/group in all worlds + * world set to null */ @Override - public void rankRemove(String world, String player, String cString) { - player = PlayerManager.search(player); // auto-complete playername - - if (world.equalsIgnoreCase("all")) + public void rankAddGlobal(Player player, String rank) + { + ClassRanks.log("ADD PermName " + rank + " or user " + player + " ", Level.INFO); +// player = PlayerManager.searchName(player); // auto-complete playername + String cString = ClassManager.getClassNameByPermName(rank); + String world = null; + try { - rankRemoveGlobal(player, cString); - return; - } - - try { - if (permission.playerRemoveGroup(world, player, cString)) + if (permission.playerAddGroup(world, player.getName(), rank)==false) +// if (permission.playerAddGroup(player, rank)==false) { - db.i("removed rank " + cString + " from player " + player+ " in world " + world); - plugin.getConfig().set("players." + player, null); - plugin.getConfig().set("worlds." + world + "." + player, null); - plugin.saveConfig(); + ClassRanks.log("ERROR ADD PermName " + rank + " or user " + player + " ", Level.SEVERE); + } else { - + ClassRanks.log("Vault Global PermName " + rank + ": user " + player , Level.INFO); + plugin.db.i("Global added rank " + rank + " to player " + player); + + plugin.getConfig().set("players." + player + "." + cString, rank); + plugin.db.i("Vault added rank " + rank + " to player " + player + ", no world support"); + plugin.saveConfig(); } - } catch (Exception e) { - plugin.log("Exception Remove Rank " + cString + " or user " + player+ " not found in world " + world, Level.WARNING); + } catch (Exception e) + { + ClassRanks.log("Exception ADD GLOBAL RANK " + rank + " or user " + player, Level.SEVERE); + ClassRanks.log(e.getMessage(), Level.SEVERE); + ClassRanks.log(e.getClass().getName(), Level.SEVERE); + ClassRanks.log(e.getCause().getMessage(), Level.SEVERE); } } + /* (non-Javadoc) * @see net.slipcor.classranks.handlers.CRHandler#getPermNameByPlayer(java.lang.String, java.lang.String) */ - @SuppressWarnings("unchecked") @Override - public String getPermNameByPlayer(String world, String player) { - Map groups = null; + public String getPermNameByPlayer(String world, Player player) + { + String[] groups = null; String cPerm = ""; - if ((world == "") || (world == "all") ) { + if (plugin.config.isDefaultrankallworlds()) + { try { - groups = plugin.getConfig().getConfigurationSection("players." + player).getValues(true); +// groups = plugin.getConfig().getConfigurationSection("players." + player).getValues(true); +// groups = permission.getPlayerGroups(player); + groups = permission.getPlayerGroups(world,player.getName()); } catch (Exception e) { - db.i("Exception GetPermByPlayer : GetConfigurationSection"); + plugin.db.i("Exception GetPermByPlayer : GetPlayerGroups"); + return ""; } - if (groups == null) { + if (groups.length == 0) + { return ""; } // Set last Value as result - for (Object group : groups.values()) { - cPerm = (String) group; -// permGroups.add((String) group); - } - db.i("player has groups: " + groups.toString()); - } else { + return groups[groups.length]; + } else + { try { - groups = (Map) plugin.getConfig().getConfigurationSection("worlds." + world); +// groups = (Map) plugin.getConfig().getConfigurationSection("worlds." + world); + groups = permission.getPlayerGroups(world,player.getName()); } catch (Exception e) { - db.i("Exception GetPermByPlayer : GetConfigurationSection"); + plugin.db.i("Exception GetPermByPlayer : GetConfigurationSection"); + return ""; } - if (groups == null) { + if (groups.length == 0) + { return ""; } - if (groups.containsKey(player)) { - cPerm = groups.get(player).toString(); - db.i("worlds contains key "+player +" value"+ cPerm); - } else { - db.i("worlds contains NOT key "+player ); - } + return groups[groups.length]; } -// return ClassManager.getLastPermNameByPermGroups(permGroups); - return cPerm; } @Override - public void classAddGlobal(String player, String cString) + public String getPermNameByPlayerGlobal(Player player) { - player = PlayerManager.search(player); // auto-complete playername +// player = PlayerManager.searchName(player); // auto-complete playername + ArrayList permGroups = new ArrayList(); String world = null; - try + String[] list = permission.getPlayerGroups(world,player.getName()); + for (String sRank : list) { - if (permission.playerAddGroup(world,player, cString)==false) - { - plugin.log("ERROR ADD PermName " + cString + " or user " + player + " ", Level.SEVERE); - - } else + plugin.db.i("checking rank "+sRank); + if (ClassManager.rankExists(sRank)) { - plugin.log("Vault Global PermName " + cString + ": user " + player , Level.INFO); - db.i("Global added rank " + cString + " to player " + player); + permGroups.add(sRank); } - } catch (Exception e) { - plugin.log("Exception Add Class Global " + cString + " or user " + player, Level.SEVERE); } + plugin.db.i("player has groups: " + permGroups.toString()); + return ClassManager.getLastPermNameByPermGroups(permGroups); } + + + /** + * Remove a user from the Rank in world that is current + * if world = all then rank added without world + * Remove player Rank also in the config + */ @Override - public void rankAddGlobal(String player, String rank) + public void rankRemove(Player player, String rank) { - plugin.log("ADD PermName " + rank + " or user " + player + " ", Level.INFO); - player = PlayerManager.search(player); // auto-complete playername - String cString = ClassManager.getClassNameByPermName(rank); - String world = null; - try +// player = PlayerManager.searchName(player); // auto-complete playername + if (plugin.config.isDefaultrankallworlds()) { - if (permission.playerAddGroup(world,player, rank)==false) - { - plugin.log("ERROR ADD PermName " + rank + " or user " + player + " ", Level.SEVERE); - - } else + System.out.println("CR rankRemoveGlobal"); + rankRemoveGlobal(player, rank); + } else + { + try { - plugin.log("Vault Global PermName " + rank + ": user " + player , Level.INFO); - db.i("Global added rank " + rank + " to player " + player); - - plugin.getConfig().set("players." + player + "." + cString, rank); - db.i("Vault added rank " + rank + " to player " + player + ", no world support"); - plugin.saveConfig(); + if (permission.playerRemoveGroup(player, rank)) + { + plugin.db.i("removed rank " + rank + " from player " + player+ " in world "); + } else + { + plugin.db.i("NOT removed rank " + rank + " from " + player+ " in world "); + } + } catch (Exception e) { + ClassRanks.log("Exception Remove Rank " + rank + " or user " + player+ " not found in world " , Level.WARNING); } - } catch (Exception e) - { - plugin.log("Exception ADD GLOBAL RANK " + rank + " or user " + player, Level.SEVERE); } } @Override - public void rankRemoveGlobal(String player, String cString) { - - player = PlayerManager.search(player); // auto-complete playername - plugin.getConfig().set("players." + player, null); - plugin.saveConfig(); + public void rankRemoveGlobal(Player player, String rank) + { String world = null; try { - permission.playerRemoveGroup(world,player, cString); - db.i("removed rank " + cString + " from player " + player); + permission.playerRemoveGroup(world,player.getName(), rank); + plugin.db.i("removed rank " + rank + " from player " + player); } catch (Exception e) { - plugin.log("Exception Remove Group Global" + cString + " or user " + player+ " not found ", Level.SEVERE); + ClassRanks.log("Exception Remove Group Global" + rank + " or user " + player+ " not found ", Level.SEVERE); } } - @Override - public String getPermNameByPlayerGlobal(String player) - { - player = PlayerManager.search(player); // auto-complete playername - ArrayList permGroups = new ArrayList(); - - String[] list = permission.getPlayerGroups(Bukkit.getPlayer(player)); - for (String sRank : list) - { - db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) - { - permGroups.add(sRank); - } - } - db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); - } /** * This function remove ALL groups from the player @@ -294,8 +337,10 @@ public String getPermNameByPlayerGlobal(String player) public void removeGroups(Player player) { String[] list = permission.getPlayerGroups(player); - if (list != null) { - for (String sRank : list) { + if (list != null) + { + for (String sRank : list) + { permission.playerRemoveGroup(player, sRank); plugin.getConfig().set("players." + player, null); } @@ -303,10 +348,14 @@ public void removeGroups(Player player) } } + + + @Override - public String[] getPlayerGroups(String player) + public String[] getPlayerGroups(Player player) { String world = null; - return permission.getPlayerGroups(world,player); + return permission.getPlayerGroups(world,player.getName()); +// return permission.getPlayerGroups(player); } } diff --git a/src/net/slipcor/classranks/listeners/CRServerListener.java b/src/net/slipcor/classranks/listeners/CRServerListener.java index 940fa61..d4dca14 100644 --- a/src/net/slipcor/classranks/listeners/CRServerListener.java +++ b/src/net/slipcor/classranks/listeners/CRServerListener.java @@ -4,7 +4,7 @@ import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.Update; -import net.slipcor.classranks.managers.CommandManager; +import net.slipcor.classranks.commands.PlayerCommands; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.register.payment.Methods; @@ -31,17 +31,19 @@ * @author slipcor/krglog */ -public class CRServerListener implements Listener { +public class CRServerListener implements Listener +{ private final Methods methods; private final ClassRanks plugin; - private final CommandManager cmdMgr; + private final PlayerCommands cmdMgr; private final DebugManager db; - public CRServerListener(ClassRanks plugin, CommandManager classes) { + public CRServerListener(ClassRanks plugin, PlayerCommands cmdMgr) + { this.plugin = plugin; this.methods = new Methods(); - cmdMgr = classes; + this.cmdMgr = cmdMgr; db = new DebugManager(plugin); } @@ -75,23 +77,38 @@ public void onPlayerInteract(PlayerInteractEvent event) { } db.i("we clicked a sign!"); // we clicked a sign! - Sign s = (Sign) bBlock.getState(); + Sign sign = (Sign) bBlock.getState(); + db.i("sign 0: "+plugin.config.getSigns()[0]); - if (s.getLine(0).equals(plugin.config.getSigns()[0])) { - db.i("parsing command " + s.getLine(1)); - String[] sArgs = {s.getLine(1)}; // parse the command! + if (sign.getLine(0).equals(plugin.config.getSigns()[0])) + { + db.i("parsing command " + sign.getLine(1)); + String[] sArgs = new String[3]; + sArgs[0] = "ADD"; + sArgs[1] = event.getPlayer().getName(); + sArgs[2] = sign.getLine(1); // parse the command! cmdMgr.parseCommand(event.getPlayer(), sArgs); - } else { + } else + { db.i("searching for rank commands"); - for (int i = 0 ; i <= 3; i++) { - if (s.getLine(i).equals(plugin.config.getSigns()[1])) { + for (int i = 0 ; i <= 3; i++) + { + if (sign.getLine(i).equals(plugin.config.getSigns()[1])) + { db.i("rankup found, parsing..."); - String[] sArgs = {"rankup"}; + String[] sArgs = new String[3]; + sArgs[0] = "RANKUP"; + sArgs[1] = event.getPlayer().getName(); + sArgs[2] = sign.getLine(1); // parse the command! cmdMgr.parseCommand(event.getPlayer(), sArgs); return; - } else if (s.getLine(i).equals(plugin.config.getSigns()[2])) { + } else if (sign.getLine(i).equals(plugin.config.getSigns()[2])) + { db.i("rankup found, parsing"); - String[] sArgs = {"rankdown"}; + String[] sArgs = new String[3]; + sArgs[0] = "RANKDOWN"; + sArgs[1] = event.getPlayer().getName(); + sArgs[2] = sign.getLine(1); // parse the command! cmdMgr.parseCommand(event.getPlayer(), sArgs); return; } diff --git a/src/net/slipcor/classranks/managers/ClassManager.java b/src/net/slipcor/classranks/managers/ClassManager.java index 271b9ab..44a8a49 100644 --- a/src/net/slipcor/classranks/managers/ClassManager.java +++ b/src/net/slipcor/classranks/managers/ClassManager.java @@ -1,9 +1,11 @@ package net.slipcor.classranks.managers; import java.util.ArrayList; +import java.util.logging.Level; import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.core.Class; +import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.Clazz; import net.slipcor.classranks.core.Rank; import org.bukkit.Bukkit; @@ -12,31 +14,35 @@ import org.bukkit.inventory.ItemStack; /** - * class manager class + * Clazz manager Clazz * - Array of Classes * + * used as static to workaround of initialize problems ! + * * @version v0.4.4.2 * * @author slipcor / krglok */ -public class ClassManager { - private static ArrayList classes = new ArrayList(); +public class ClassManager +{ + private static ArrayList clazzes = new ArrayList(); private static ClassRanks plugin; - private static DebugManager db; +// private static DebugManager db; public ClassManager(ClassRanks cr) { ClassManager.plugin = cr; - db = new DebugManager(cr); +// db = new DebugManager(cr); } public void add(String sClassName) { - classes.add(new Class(sClassName)); + clazzes.add(new Clazz(sClassName)); } - public static String getFirstPermNameByClassName(String cString) { + public static String getFirstPermNameByClassName(String cString) + { // standard version: get first rank - for (Class c : classes) { + for (Clazz c : clazzes) { for (Rank r : c.ranks) { if (c.name.equals(cString)) return r.getPermName(); @@ -47,7 +53,7 @@ public static String getFirstPermNameByClassName(String cString) { public static String getFirstPermNameByClassName(String cString, String sPlayer) { // extended version: get rank - for (Class c : classes) { + for (Clazz c : clazzes) { if (c.name.equals(cString)) { return c.ranks.get(ClassManager.loadClassProcess(Bukkit.getPlayer(sPlayer), c)).getPermName(); } @@ -56,7 +62,7 @@ public static String getFirstPermNameByClassName(String cString, String sPlayer) } public static String getClassNameByPermName(String rank) { - for (Class c : classes) { + for (Clazz c : clazzes) { for (Rank r : c.ranks) { if (r.getPermName().equals(rank)) return c.name; @@ -67,9 +73,9 @@ public static String getClassNameByPermName(String rank) { public static String getLastPermNameByPermGroups(ArrayList permGroups) { String sPermName = ""; - for (Class c : classes) { + for (Clazz c : clazzes) { for (Rank r : c.ranks) { - db.i(c.name + " => " + r.getPermName()); + plugin.db.i(c.name + " => " + r.getPermName()); if (permGroups.contains(r.getPermName())) sPermName = r.getPermName(); } @@ -77,9 +83,13 @@ public static String getLastPermNameByPermGroups(ArrayList permGroups) { return sPermName; } - public static Rank getRankByPermName(String sPermName) { - for (Class c : classes) { - for (Rank r : c.ranks) { + public static Rank getRankByPermName(String sPermName) + { + for (Clazz c : clazzes) + { + for (Rank r : c.ranks) + { + if (r.getPermName().equals(sPermName)) return r; } @@ -87,12 +97,47 @@ public static Rank getRankByPermName(String sPermName) { return null; } - public static Rank getNextRank(Rank rank, int rankOffset) { - return rank.getSuperClass().ranks.get(rank.getSuperClass().ranks.indexOf(rank)+rankOffset); + public static Rank getRankByPermName(String[] sPermName) + { + for (Clazz c : clazzes) + { + for (Rank r : c.ranks) + { + for (String permName : sPermName) + { + plugin.db.i("Rank: "+r.getPermName()+" Group: "+permName); + if (r.getPermName().equals(permName)) + return r; + } + } + } + return null; + } + + public static Rank getNextRank(Rank rank, int rankIndex) + { + if (rankIndex+1 < rank.getSuperClass().ranks.size()) + { + return rank.getSuperClass().ranks.get(rankIndex+1); + } else + { + return null; + } + } + + public static Rank getPrevRank(Rank rank, int rankIndex) + { + if (rankIndex > 0) + { + return rank.getSuperClass().ranks.get(rankIndex-1); + } else + { + return null; + } } - private static Class getClassbyClassName(String sClassName) { - for (Class c : classes) { + private static Clazz getClassbyClassName(String sClassName) { + for (Clazz c : clazzes) { if (c.name.equals(sClassName)) return c; } @@ -100,7 +145,7 @@ private static Class getClassbyClassName(String sClassName) { } public static boolean rankExists(String sRank) { - for (Class c : classes) { + for (Clazz c : clazzes) { for (Rank r : c.ranks) { if (r.getPermName().equals(sRank)) return true; @@ -109,24 +154,24 @@ public static boolean rankExists(String sRank) { return false; } - public static ArrayList getClasses() { - return classes; + public static ArrayList getClasses() { + return clazzes; } public static boolean configClassRemove(String sClassName, Player pPlayer) { - Class cClass = getClassbyClassName(sClassName); + Clazz cClass = getClassbyClassName(sClassName); if (cClass != null) { - classes.remove(cClass); - plugin.msg(pPlayer, "Class removed: " + sClassName); + clazzes.remove(cClass); + plugin.msg(pPlayer, "Clazz removed: " + sClassName); plugin.config.save_config(); return true; } - plugin.msg(pPlayer, "Class not found: " + sClassName); + plugin.msg(pPlayer, "Clazz not found: " + sClassName); return true; } public static boolean configRankRemove(String sClassName, String sPermName, Player pPlayer) { - Class cClass = getClassbyClassName(sClassName); + Clazz cClass = getClassbyClassName(sClassName); if (cClass != null) { Rank rank = getRankByPermName(sPermName); if (rank != null) { @@ -139,41 +184,47 @@ public static boolean configRankRemove(String sClassName, String sPermName, Play plugin.msg(pPlayer, "Rank not found: " + sPermName); return true; } - plugin.msg(pPlayer, "Class not found: " + sClassName); + plugin.msg(pPlayer, "Clazz not found: " + sClassName); return true; } public static boolean configClassAdd(String sClassName, String sPermName, String sDispName, String sColor, ItemStack[] isItems, double dCost, int iExp, Player pPlayer) { - Class cClass = getClassbyClassName(sClassName); + Clazz cClass = getClassbyClassName(sClassName); if (cClass == null) { - Class c = new Class(sClassName); + Clazz c = new Clazz(sClassName); c.add(sPermName, sDispName, (FormatManager.formatColor(sColor)), isItems, dCost, iExp); - classes.add(c); + // add Clazz + clazzes.add(c); if (pPlayer == null) - db.i("Class added: " + sClassName); - else - plugin.msg(pPlayer, "Class added: " + sClassName); - plugin.config.save_config(); + { + ClassRanks.log("Clazz added:" + sClassName, Level.INFO); + + //db.i("Clazz added: " + sClassName); + } else + { + plugin.msg(pPlayer, "Clazz added: " + sClassName); + } +// plugin.config.save_config(); return true; - } if (pPlayer == null) - db.i("Class already exists: " + sClassName); + plugin.db.i("Clazz already exists: " + sClassName); else - plugin.msg(pPlayer, "Class already exists for " + pPlayer); + plugin.msg(pPlayer, "Clazz already exists for " + pPlayer); return true; } public static boolean configRankAdd(String sClassName, String sPermName, String sDispName, String sColor, ItemStack[] isItems, double dCost, int iExp, Player pPlayer) { - Class cClass = getClassbyClassName(sClassName); - if (cClass != null) { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass != null) + { cClass.ranks.add(new Rank(sPermName, sDispName, (FormatManager.formatColor(sColor)), cClass, isItems, dCost, iExp)); if (pPlayer == null) { - db.i("Rank added: " + (FormatManager.formatColor(sColor)) + sPermName); - plugin.config.save_config(); +// plugin.db.i("Rank added: " + (FormatManager.formatColor(sColor)) + sPermName); +// plugin.config.save_config(); } else { plugin.msg(pPlayer, "Rank added: " + (FormatManager.formatColor(sColor)) + sPermName +"/"+pPlayer); @@ -182,26 +233,26 @@ public static boolean configRankAdd(String sClassName, String sPermName, String return true; } if (pPlayer == null) - db.i("Class not found: " + sClassName); + plugin.db.i("Clazz not found: " + sClassName); else - plugin.msg(pPlayer, "Class not found: " + sClassName); + plugin.msg(pPlayer, "Clazz not found: " + sClassName); return true; } public static boolean configClassChange(String sClassName, String sClassNewName, Player pPlayer) { - Class cClass = getClassbyClassName(sClassName); + Clazz cClass = getClassbyClassName(sClassName); if (cClass != null) { cClass.name = sClassNewName; - plugin.msg(pPlayer, "Class changed: " + sClassName + " => " + sClassNewName); + plugin.msg(pPlayer, "Clazz changed: " + sClassName + " => " + sClassNewName); plugin.config.save_config(); return true; } - plugin.msg(pPlayer, "Class not found: " + sClassName); + plugin.msg(pPlayer, "Clazz not found: " + sClassName); return true; } public static boolean configRankChange(String sClassName, String sPermName, String sDispName, String sColor, Player pPlayer) { - Class cClass = getClassbyClassName(sClassName); + Clazz cClass = getClassbyClassName(sClassName); if (cClass != null) { Rank rank = getRankByPermName(sPermName); if (rank != null) { @@ -213,55 +264,56 @@ public static boolean configRankChange(String sClassName, String sPermName, Stri } plugin.msg(pPlayer, "Rank not found: " + sPermName); } - plugin.msg(pPlayer, "Class not found: " + sClassName); + plugin.msg(pPlayer, "Clazz not found: " + sClassName); return true; } - public static void saveClassProgress(Player pPlayer) { - db.i("saving class process"); + public static void saveClassProgress(Player pPlayer) + { + plugin.db.i("saving Clazz process"); String s = plugin.getConfig().getString("progress."+pPlayer.getName()); - db.i("progress of "+pPlayer.getName()+": "+s); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(pPlayer.getWorld().getName(), pPlayer.getName())); + plugin.db.i("progress of "+pPlayer.getName()+": "+s); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(pPlayer.getWorld().getName(), pPlayer)); if (rank == null) { - db.i("rank is null!"); + plugin.db.i("rank is null!"); return; } int rankID = rank.getSuperClass().ranks.indexOf(rank); - db.i("rank ID: "+rankID); - int classID = classes.indexOf(rank.getSuperClass()); - db.i("classID: "+classID); + plugin.db.i("rank ID: "+rankID); + int classID = clazzes.indexOf(rank.getSuperClass()); + plugin.db.i("classID: "+classID); - if (s != null && s.length() == classes.size()) { + if (s != null && s.length() == clazzes.size()) { char[] c = s.toCharArray(); c[classID] = String.valueOf(rankID).charAt(0); - db.i("new c[classID]: "+c[classID]); + plugin.db.i("new c[classID]: "+c[classID]); - db.i("saving: "+c.toString()); + plugin.db.i("saving: "+c.toString()); plugin.getConfig().set("progress."+pPlayer.getName(), String.valueOf(c.toString())); return; } - db.i("no entry yet!"); + plugin.db.i("no entry yet!"); String result = ""; - for (int i = 0; i ranks = oClass.ranks; + for (Rank oRank : ranks) + { + if (rank.getPermName().equals(oRank.getPermName())) + { + return rankID; + } else + { + rankID++; + } + } + return rankID; + } catch (Exception e) { + return 0; + } + } + + } diff --git a/src/net/slipcor/classranks/managers/CommandManager.java b/src/net/slipcor/classranks/managers/CommandManager.java deleted file mode 100644 index f4fee4b..0000000 --- a/src/net/slipcor/classranks/managers/CommandManager.java +++ /dev/null @@ -1,1083 +0,0 @@ -package net.slipcor.classranks.managers; - -import java.util.ArrayList; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.core.Class; -import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.PlayerManager; -import net.slipcor.classranks.register.payment.Method.MethodAccount; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -/** - * command manager class - * - * @version v0.4.5 - * - * @author Krglok - */ - -public class CommandManager { - private final ClassRanks plugin; - private final FormatManager fm; - private final PlayerManager pm; - private final DebugManager db; - - public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs - public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP - // Costs -// public boolean rankpublic; // do we spam changed to the public? -// public boolean onlyoneclass; // only maintain oneass -// public ItemStack[][] rankItems; -// public String[] signCheck = { null, null, null }; // SignCheck variable - - public CommandManager(ClassRanks plugin) { - this.plugin = plugin; - this.pm = new PlayerManager(plugin); - this.fm = new FormatManager(); - this.db = new DebugManager(plugin); - } - - /* - * This function provides the main ranking process - including error - * messages when stuff is not right. - * - check if permissions are there - * - get old rank - * - calculate new rank - * - eventually delete from old rank - * - add to new rank - */ - public boolean rank(String[] args, Player comP) { - db.i("ranking " + comP.getName() + " : " + FormatManager.formatStringArray(args)); - int cDown = pm.coolDownCheck(comP); - if (cDown > 0) { - plugin.msg(comP, - "You have to wait " + ChatColor.RED + String.valueOf(cDown) - + ChatColor.WHITE + " seconds!"); - return true; // cooldown timer still counting => OUT! - } - db.i("cooldown check positive"); - - if ((!plugin.perms.hasPerms(comP, "classranks.rankdown", comP - .getWorld().getName())) - && args[0].equalsIgnoreCase("rankdown")) { - // if we either are no OP or try to rank down, but we may not - plugin.msg(comP, "You don't have permission to rank down!"); - return true; - } - - db.i("perm check successful"); - - String World = plugin.config.isDefaultrankallworlds() ? "all" : comP.getWorld().getName(); // store - // the - // player's - // world - String changePlayer = comP.getName(); // store the player we want to - // change - Boolean self = true; // we want to change ourselves ... maybe - - if (args.length > 1) { // we have more than one argument. that means: - changePlayer = PlayerManager.search(args[1]); // we want to change a - // different player - self = false; // we do not want to change ourselves - if (args.length > 2) { // we even have more than two arguments. that - // means: - World = args[2]; // we want to specify a world where we change - } - } - - // does player have a rank? - - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(World, changePlayer)); - - if (rank == null) { - // No Rank - if (self) { - plugin.msg(comP, "You don't have a class!"); - return true; - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " does not have a class !"); - return true; - } - } - - db.i("rank check successful"); - - String cPermName = rank.getPermName(); // Permissions rank name - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - Class cClass = rank.getSuperClass(); // Rank class - int cRank = cClass.ranks.indexOf(rank); // Rank index - int cMaxRank = cClass.ranks.size() - 1; // Classes max tree rank - db.i("rank " + cRank + " of " + cMaxRank); - // placeholder: cost - double rank_cost = 0; - // placeholder: items - ItemStack[] items = null; - - // placeholders for new rank - int rankOffset = 0; - - if (args[0].equalsIgnoreCase("rankup")) { - // we want to rank up! - if (cRank >= cMaxRank) { - // if the player is in the maximum rank - if (self) { - plugin.msg(comP, "You are already at highest rank!"); - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " already at highest rank!"); - } - return true; - } - if (self) { - // if we rank ourselves, that might cost money - // (otherwise, thats not the players problem ;) ) - try { - rank_cost = moneyCost[cRank + 1]; - } catch (Exception e) { - plugin.log("cost not set: "+(cRank + 1), Level.WARNING); - } - - Rank rNext = ClassManager.getNextRank(rank, 1); - if (rNext != null) { - if (rNext.getCost() != -1337D) { - rank_cost = rNext.getCost(); - } - } - - if (ClassRanks.economy != null) { - -// if (ClassRanks.economy.hasAccount(comP.getName())) { -// plugin.log("Account not found: " + comP.getName(), -// Level.SEVERE); -// return true; -// } - if (!ClassRanks.economy.has(comP.getName(), rank_cost)) { - // no money, no ranking! - plugin.msg(comP, - "You don't have enough money to rank up!"); - return true; - } - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(comP.getName()); - if (ma == null) { - plugin.log("Account not found: " + comP.getName(), - Level.SEVERE); - return true; - } - if (!ma.hasEnough(rank_cost)) { - // no money, no ranking! - plugin.msg(comP, - "You don't have enough money to rank up!"); - return true; - } - } - ItemStack[][] rankItems = plugin.config.getRankItems(); - items = rankItems != null ?rankItems[cRank + 1] : null; - - if (rNext.getItemstacks() != null) { - items = rNext.getItemstacks(); - } - } - rankOffset = 1; - } else if (args[0].equalsIgnoreCase("rankdown")) { - if (cRank < 1) { - // We are at lowest rank - if (self) { - plugin.msg(comP, "You are already at lowest rank!"); - } else { - plugin.msg(comP, "Player " + fm.formatPlayer(changePlayer) - + " already at lowest rank!"); - } - return true; - } - rankOffset = -1; - } - - if (rankOffset > 0) { - - if (expCost != null && expCost.length > 0) { - int exp_cost = -1; - - try { - exp_cost = expCost[cRank + 1]; - } catch (Exception e) { - plugin.log("Exp cost not set: "+cRank + 1, Level.WARNING); - } - Rank rNext = ClassManager.getNextRank(rank, 1); - if (rNext != null && rNext.getExp() != -1) { - exp_cost = rNext.getExp(); - } - - if (exp_cost > 0) { - if (comP.getTotalExperience() < exp_cost) { - plugin.msg(comP, - "You don't have enough experience ("+comP.getTotalExperience()+")! You need " - + exp_cost); - return true; - } - int newExp = comP.getTotalExperience() - exp_cost; - comP.setExp(0); - comP.setLevel(0); - comP.giveExp(newExp); - - plugin.msg(comP, "You paid " + exp_cost - + " experience points!"); - } - } - - if ((items != null) - && (!FormatManager.formatItemStacks(items).equals(""))) { - if (!pm.ifHasTakeItems(comP, items)) { - plugin.msg(comP, "You don't have the required items!"); - plugin.msg(comP, - "(" + FormatManager.formatItemStacks(items) + ")"); - return true; - } - } - } - - if (plugin.config.isOnlyoneclass() || rankOffset < 0) { - // up and only OR down - db.i("removing old class..."); - plugin.perms.rankRemove(World, changePlayer, cPermName); - } - - rank = ClassManager.getNextRank(rank, rankOffset); - - cPermName = rank.getPermName(); - cDispName = rank.getDispName(); - c_Color = rank.getColor(); - - db.i("adding new rank..."); - plugin.perms.rankAdd(World, changePlayer, cPermName); - - if ((rank_cost > 0)) { - // take the money, inform the player - - if (ClassRanks.economy != null) { - ClassRanks.economy.withdrawPlayer(comP.getName(), rank_cost); - comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."); - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(comP.getName()); - ma.subtract(rank_cost); - comP.sendMessage(ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + plugin.method.format(rank_cost) + ChatColor.RED - + " debited."); - } - } - - if (self && ! plugin.config.isRankpublic()) { - // we rank ourselves and do NOT want that to be public - plugin.msg(comP, - "You are now a " + c_Color + cDispName + ChatColor.WHITE - + ChatColor.WHITE + " in " + fm.formatWorld(World) - + "!"); - } else { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] Player " + fm.formatPlayer(changePlayer) - + " now is a " + c_Color + cDispName - + ChatColor.WHITE + " in " + fm.formatWorld(World) - + "!"); - } - return true; - } - - /** - * printout Classas and/or Class Ranks - * - * @param pPlayer - * @param args - */ - private void cmdList (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); - plugin.msg(pPlayer, ChatColor.YELLOW+"Class / Rank List"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - for (Class c : classes) { - if (c.name.startsWith("%") && !pPlayer.isOp()) { - continue; - } - if (args[1].equalsIgnoreCase(c.name)) { - plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); - for (Rank r : c.ranks) { - plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); - } - } - } - - } - - /** - * printout player Class, Rank and world - * - * @param pPlayer - * @param args - */ - private void cmdGet (Player pPlayer, String[] args) { - String world = pPlayer.getWorld().getName(); - if (args.length > 2) { - world = args[2]; - } else { - world = "all"; - } - String player = pPlayer.getName(); - if (args.length > 1) { - player = args[1]; - } - - plugin.msg(pPlayer, "Player " + fm.formatPlayer(player)+ " Get in " + fm.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(world, player)); - - if (rank == null) { - plugin.msg(pPlayer, "Player " + player - + " has no class in " + fm.formatWorld(world) + "!"); - } else { - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - plugin.msg(pPlayer, "Player " + player - + " is " + c_Color + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) + "!"); - } - - } - - private void cmdConfig (Player pPlayer, String[] args) - { - plugin.msg(pPlayer, ChatColor.YELLOW+"Class Config Data"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - plugin.msg(pPlayer, ChatColor.RED+"Debug : "+plugin.config.isDebug().toString()); - plugin.msg(pPlayer, ChatColor.YELLOW+"Prices : "+plugin.config.isCheckprices().toString()); - plugin.msg(pPlayer, ChatColor.YELLOW+"Items : "+plugin.config.isCheckitems().toString()); - plugin.msg(pPlayer, ChatColor.YELLOW+"Exp : "+plugin.config.isCheckexp().toString()); - plugin.msg(pPlayer, ChatColor.YELLOW+"CoolDown: "+plugin.config.getCoolDown()); - plugin.msg(pPlayer, ChatColor.GREEN+"OneClass: "+plugin.config.isOnlyoneclass().toString()); - plugin.msg(pPlayer, ChatColor.GREEN+"AllWorlds: "+plugin.config.isDefaultrankallworlds().toString()); - plugin.msg(pPlayer, ChatColor.GREEN+"SignCheck: "+plugin.config.isSigncheck().toString()); - plugin.msg(pPlayer, ChatColor.GREEN+"TrackRank: "+plugin.config.isTrackRanks().toString()); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - Double[] MoneyCost = plugin.config.getMoneyCost(); - - for (int i = 0; i < MoneyCost.length; i++) - { - plugin.msg(pPlayer, ChatColor.YELLOW+": "+MoneyCost[i].toString()); - } - } - - private void cmdUserGroups (Player pPlayer, String[] args) - { - String player = pPlayer.getName(); - // is there a player parameter, get it - if (args.length > 1) - { - player = args[1]; - } - String[] list = plugin.perms.getPlayerGroups(player); - if (list != null) - { - int max = list.length; - plugin.msg(pPlayer, ChatColor.YELLOW+"User Groups "+ChatColor.DARK_GREEN+player); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - for (int i = 0; i < list.length; i++) - { - plugin.msg(pPlayer, ChatColor.YELLOW+": "+list[i]); - } - plugin.msg(pPlayer, ChatColor.YELLOW+"Count "+max+" ---------"); - } - - } - -// private void cmdTemp (Player pPlayer, String[] args) { -// -// } - - - - /* - * The main switch for the command usage. Check for known commands, - * permissions, arguments, and commit whatever is wanted. - */ - public boolean parseCommand(Player pPlayer, String[] args) - { - - db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); - if (args.length > 1) - { - if (args[0].equalsIgnoreCase("list")) { - // Command list of Ranks in the Class 3.2 - cmdList(pPlayer,args); - return true; - - } - if (args[0].equalsIgnoreCase("get")) { - // Command Get 3.2 - cmdGet(pPlayer, args); - return true; - } - - if (args[0].equalsIgnoreCase("groups")) { - // Command list of Ranks in the Class 3.2 - plugin.msg(pPlayer,"groups "+args[1]); - - cmdUserGroups(pPlayer, args); - return true; - } - - // more than /class or /class rankup - if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to change other user's ranks!"); - return true; - } - - if ((!args[0].equalsIgnoreCase("add")) - && (!args[0].equalsIgnoreCase("remove"))) { - if ((args[0].equalsIgnoreCase("rankup")) - || (args[0].equalsIgnoreCase("rankdown"))) { - // rank up or down - if (args.length > 1) { - return rank(args, pPlayer); - } else { - plugin.msg( - pPlayer, - "Not enough arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - } - plugin.msg(pPlayer, "Argument " + args[0] + " unrecognized!"); - return false; - } - - // add / remove - boolean self = true; - // preset of World name - String world = plugin.config.isDefaultrankallworlds() ? "all" : pPlayer.getWorld().getName(); - - if (args[0].equalsIgnoreCase("remove")) { - if (args.length > 2) { - // => /class remove *name* world - world = args[2]; - self = false; - } else if (args.length > 1) { - self = false; - } - } else if (args[0].equalsIgnoreCase("add")) { - if (args.length > 3) { - // => /class add *name* *classname* world - world = args[3]; - } else if (args.length == 3) { - // => /class add *name* *classname* - String[] tArgs = { args[0], args[1] , args[2] }; - - args = tArgs; // override : without world //krglok 01.2013 -// self = false; - } else if (args.length == 2) { - // => /class add *classname* - - String[] tArgs = { args[0], pPlayer.getName(), args[1] }; - - args = tArgs; // override : pretend to have said: //class - // add me class - } else if (args.length < 2) { - // not enough arguments ;) - plugin.msg( - pPlayer, - "Not enough arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - } - db.i("precheck successful"); - - if (!self) { - if (!plugin.perms.hasPerms(pPlayer, - "classranks.admin.addremove", pPlayer.getWorld() - .getName())) { - // only if we are NOT op or may NOT add/remove classes - plugin.msg(pPlayer, - "You don't have permission to add/remove other player's classes!"); - return true; - } - } - db.i("perm check successful"); - - // get the class of the player we're talking about - args[1] = PlayerManager.search(args[1]); - String sPermName = plugin.perms.getPermNameByPlayer(world, args[1]); - if (!sPermName.equals("")) { - if (plugin.trackRanks) { - ClassManager.saveClassProgress(Bukkit.getPlayer(args[1])); - } - int i = 0; // combo breaker - while (!sPermName.equals("")) { - db.i("removing rank " + sPermName); - - Rank tempRank = ClassManager.getRankByPermName(sPermName); - - String cDispName = tempRank.getDispName(); // Display rank - // name - ChatColor c_Color = tempRank.getColor(); // Rank color - - if (args[0].equalsIgnoreCase("add")) { - // only one class per player :p - plugin.msg(pPlayer, - "Player " + fm.formatPlayer(args[1]) - + " already already has the rank " - + c_Color + cDispName + "!"); - } else if (args[0].equalsIgnoreCase("remove")) { - if (plugin.trackRanks) { - ClassManager.saveClassProgress(Bukkit - .getPlayer(args[1])); - } - plugin.perms.rankRemove(world, args[1], - tempRank.getPermName()); // do it! - - if ((!pPlayer.getName().equalsIgnoreCase(args[1]))) { - plugin.msg(pPlayer, - "Player " + fm.formatPlayer(args[1]) - + " removed from rank " + c_Color - + cDispName + ChatColor.WHITE - + " in " + fm.formatWorld(world) - + "!"); - - Player chP = plugin.getServer().getPlayer(args[1]); - try { - if (chP.isOnline()) { - chP.sendMessage("[" + ChatColor.AQUA - + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] You were removed from rank " - + c_Color + cDispName - + ChatColor.WHITE + " in " - + fm.formatWorld(world) + "!"); - } - } catch (Exception e) { - // do nothing, the player is not online - } - } else { - // self remove successful! - if (i == 0) - plugin.msg( - pPlayer, - "You were removed from rank " + c_Color - + cDispName + ChatColor.WHITE - + " in " - + fm.formatWorld(world) + "!"); - } - } - if (++i > 10) { - plugin.log("Infinite loop! More than 10 ranks!?", - Level.SEVERE); - break; - } - sPermName = plugin.perms - .getPermNameByPlayer(world, args[1]); - } - return true; - } - // player has no class - if (!args[0].equalsIgnoreCase("add")) { - // no class and trying to remove - if (pPlayer.getName().equalsIgnoreCase(args[1])) { - plugin.msg(pPlayer, "You don't have a class!"); - return true; - } else { - plugin.msg(pPlayer, "Player " + fm.formatPlayer(args[1]) - + " does not have a class!"); - return true; - } - } - // ADD - Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(args[2])); - - if (tempRank == null) { - plugin.msg(pPlayer, - "The class you have entered does not exist!"+args[2]); - return true; - } - - String cPermName = tempRank.getPermName(); // Display rank name - String cDispName = tempRank.getDispName(); // Display rank name - ChatColor c_Color = tempRank.getColor(); // Rank color - - if (plugin.trackRanks) { - int rID = ClassManager.loadClassProcess( - Bukkit.getPlayer(args[1]), tempRank.getSuperClass()); - - tempRank = tempRank.getSuperClass().ranks.get(rID); - - cPermName = tempRank.getPermName(); // Display rank name - cDispName = tempRank.getDispName(); // Display rank name - c_Color = tempRank.getColor(); // Rank color - - String sRank = tempRank.getPermName(); - plugin.perms.rankAdd(world, args[1], sRank); - } else { - plugin.perms.rankAdd(world, args[1], cPermName); -// plugin.perms.classAdd(world, args[1], cPermName); - } - - if ((plugin.config.isRankpublic()) || (!pPlayer.getName().equalsIgnoreCase(args[1]))) { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] " + fm.formatPlayer(args[1]) - + " now is a " + c_Color + cDispName); - return true; - } else { - plugin.msg(pPlayer, "You now are a " + c_Color + cDispName); - return true; - } - } - - //--------------------------------------------------------------------------- - // Simple Commands - // - if (args.length > 0) - { - // only ONE argument! - if (args[0].equalsIgnoreCase("config")) { - // Command list of Ranks in the Class 3.2 - cmdConfig(pPlayer, args); - return true; - } - - if (args[0].equalsIgnoreCase("get")) { - // Command Get 3.2 - cmdGet(pPlayer, args); - return true; - } - - if (args[0].equalsIgnoreCase("groups")) { - // Command list of Ranks in the Class 3.2 - cmdUserGroups(pPlayer, args); - return true; - } - - if (args[0].equalsIgnoreCase("reload")) { - // Command reload - if (pPlayer.isOp()) { - plugin.config.load_config(); - plugin.msg(pPlayer, "Config reloaded!"); - } else { - plugin.msg(pPlayer, "You don't have permission to reload!"); - } - return true; - } - - if (args[0].equalsIgnoreCase("rankup")) { - // Command rankup - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to rank yourself up!"); - return true; - } - return rank(args, pPlayer); - } else if (args[0].equalsIgnoreCase("rankdown")) { - // Command rank down - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", - pPlayer.getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to rank yourself down!"); - return true; - } - return rank(args, pPlayer); - } else if (args[0].equalsIgnoreCase("remove")) { - // Command remove - if (!plugin.perms.hasPerms(pPlayer, - "classranks.self.addremove", pPlayer.getWorld() - .getName())) { - plugin.msg(pPlayer, - "You don't have permission to add/remove your rank!"); - return true; - } - Rank rank = ClassManager.getRankByPermName(plugin.perms - .getPermNameByPlayer(pPlayer.getWorld().getName(), - pPlayer.getName())); - - if (rank == null) { - plugin.msg(pPlayer, "You don't have a class!"); - return true; - } - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - if (plugin.trackRanks) { - ClassManager.saveClassProgress(pPlayer); - } - plugin.perms.rankRemove(plugin.config.isDefaultrankallworlds() ? "all" : pPlayer - .getWorld().getName(), pPlayer.getName(), rank - .getPermName()); - - plugin.msg( - pPlayer, - "You were removed from rank " - + c_Color - + cDispName - + ChatColor.WHITE - + " in " - + fm.formatWorld(plugin.config.isDefaultrankallworlds() ? "all" - : pPlayer.getWorld().getName()) + "!"); - return true; - } else if (args[0].equalsIgnoreCase("add")) { - // Command add - plugin.msg(pPlayer, ChatColor.RED+"Not enough arguments!"); - plugin.msg(pPlayer, ChatColor.GRAY+"/class [add] {username} {classname} {world} | Add user to a class"); - return true; - - } - if (args[0].equalsIgnoreCase("list")) - { - // Command list Classes - ArrayList classes = ClassManager.getClasses(); - plugin.msg(pPlayer, ChatColor.YELLOW+"Class List"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - for (Class c : classes) { - if (c.name.startsWith("%") && !pPlayer.isOp()) { - continue; - } - plugin.msg(pPlayer, "Class "+ ChatColor.GREEN + c.name); -// for (Rank r : c.ranks) { -// plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); -// } - } - return true; - } - if (args[0].equalsIgnoreCase("info")) - { - - } - - // /class [classname] - if (!plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer - .getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to choose your class!"); - return true; - } - - String sRankInfo = plugin.perms.getPermNameByPlayer(pPlayer - .getWorld().getName(), pPlayer.getName()); - - if (!sRankInfo.equals("")) { - plugin.msg(pPlayer, "You already have the rank " + sRankInfo - + "!"); - return true; - } - - String s = ""; - - if (plugin.trackRanks) { - s = ClassManager.getFirstPermNameByClassName(args[0], - pPlayer.getName()); - } else { - s = ClassManager.getFirstPermNameByClassName(args[0]); - } - - if (s == null || s.equals("")) { - plugin.msg(pPlayer, - "The class you have entered does not exist!"); - return true; - } - Rank rank = ClassManager.getRankByPermName(s); - - if (rank == null) { - plugin.msg(pPlayer, "Internal Error #1!"); - return true; - } - db.i("rank check successful"); - - int rID = 0; - if (plugin.trackRanks) { - rID = ClassManager.loadClassProcess(pPlayer, - rank.getSuperClass()); - } - double rank_cost = 0D; - - try { - rank_cost = moneyCost[rID]; - } catch (Exception e) { - plugin.log("cost not set: "+rID, Level.WARNING); - } - - if (rank.getCost() != -1337D) { - rank_cost = rank.getCost(); - } - // Check if the player has got the money - if (ClassRanks.economy != null) { - if (plugin.getConfig().getBoolean("checkprices") - && ClassRanks.economy.has(pPlayer.getName(), rank_cost)) { - - plugin.msg(pPlayer, - "You don't have enough money to choose your class! (" - + ClassRanks.economy.format(rank_cost) - + ")"); - return true; - } - } else if (plugin.method != null) { - MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); - if (plugin.getConfig().getBoolean("checkprices") - && !ma.hasEnough(rank_cost)) { - - plugin.msg(pPlayer, - "You don't have enough money to choose your class! (" - + plugin.method.format(rank_cost) - + ")"); - return true; - } - } - db.i("money check successful"); - if (expCost != null && expCost.length > 0) { - int exp_cost = -1; - - try { - exp_cost = expCost[rID]; - } catch (Exception e) { - plugin.log("Exp cost not set: "+rID, Level.WARNING); - } - - if (rank.getExp() != -1) { - exp_cost = rank.getExp(); - } - - if (exp_cost > 0) { - if (pPlayer.getTotalExperience() < exp_cost) { - plugin.msg(pPlayer, - "You don't have enough experience! You need " - + exp_cost); - return true; - } - pPlayer.setTotalExperience(pPlayer.getTotalExperience() - - exp_cost); - plugin.msg(pPlayer, "You paid " + exp_cost - + " experience points!"); - } - } - db.i("exp check successful"); - - ItemStack[] items = null; - ItemStack[][] rankItems = plugin.config.getRankItems(); - - if (rankItems != null && (rankItems[rID] != null) - && (!FormatManager.formatItemStacks(rankItems[rID]).equals( - ""))) { - items = rankItems[rID]; - } - - if (rank.getItemstacks() != null) { - items = rank.getItemstacks(); - } - - if (items != null) { - - if (!pm.ifHasTakeItems(pPlayer, items)) { - plugin.msg(pPlayer, "You don't have the required items!"); - plugin.msg( - pPlayer, - "(" - + FormatManager - .formatItemStacks(items) - + ")"); - return true; - } - } - db.i("item check successful"); - - String cPermName = rank.getPermName(); // Display rank name - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - // success! - - if (plugin.getConfig().getBoolean("clearranks")) { - plugin.perms.removeGroups(pPlayer); - } - - plugin.perms.rankAdd(plugin.config.isDefaultrankallworlds() ? "all" : pPlayer - .getWorld().getName(), pPlayer.getName(), cPermName); - if (plugin.config.isRankpublic()) { - plugin.getServer().broadcastMessage( - "Player " + fm.formatPlayer(pPlayer.getName()) - + " has chosen a class, now has the rank " - + c_Color + cDispName); - } else { - plugin.msg(pPlayer, - "You have chosen your class! You now have the rank " - + c_Color + cDispName); - } - - if (plugin.getConfig().getBoolean("checkprices") - && (rank_cost > 0)) { - // if it costs anything at all - - if (ClassRanks.economy != null) { - ClassRanks.economy.withdrawPlayer(pPlayer.getName(), rank_cost); - pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" - + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN - + "] " + ChatColor.RED + "Your account had " - + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."); - } else if ((plugin.method != null)) { - MethodAccount ma = plugin.method.getAccount(pPlayer.getName()); - ma.subtract(rank_cost); - pPlayer.sendMessage(ChatColor.DARK_GREEN + "[" - + ChatColor.WHITE + "Money" + ChatColor.DARK_GREEN - + "] " + ChatColor.RED + "Your account had " - + ChatColor.WHITE - + plugin.method.format(rank_cost) + ChatColor.RED - + " debited."); - } - } - return true; - } - plugin.msg(pPlayer,ChatColor.YELLOW+"Not enough arguments !"); - return false; - } - - public boolean parseAdminCommand(Player pPlayer, String[] args) - { - db.i("parsing admin " + pPlayer.getName() + ", command: " - + FormatManager.formatStringArray(args)); - - if (!plugin.perms.hasPerms(pPlayer, "classranks.admin.admin", pPlayer - .getWorld().getName())) { - plugin.msg(pPlayer, - "You don't have permission to administrate ranks!"); - return true; - } - - db.i("perm check successful"); - - if (args.length < 3) { - plugin.msg(pPlayer, - "Not enough arguments (" + String.valueOf(args.length) - + ")!"); - return false; - } - db.i("enough arguments"); - - if (args[0].equalsIgnoreCase("remove")) { - /* - * /classadmin remove class *classname* /classadmin remove rank - * *classname* *rankname* - */ - if (args[1].equalsIgnoreCase("class")) { - if (args.length != 3) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configClassRemove(args[2], pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - if (args.length != 4) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configRankRemove(args[2], args[3], pPlayer); - } - // second argument unknown - return false; - } - if (args[0].equalsIgnoreCase("add")) { - - /* Add Class and first Rank - * /classadmin add class *classname* *rankname* *displayname* - * *color* - * - * Add Rank to Class - * /classadmin add rank *classname* *rankname* *displayname* - * *color* - */ - if (args.length != 9) - { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ") should be 9 !"); - return false; - } - - if (args[1].equalsIgnoreCase("class")) - {// , ItemStack[] isItems, double dCost, int iExp - - return ClassManager.configClassAdd(args[2], args[3], args[4], - args[5], - FormatManager.getItemStacksFromCommaString(args[6]), - Double.parseDouble(args[7]), Integer.parseInt(args[8]), - null); //pPlayer); - } - if (args[1].equalsIgnoreCase("rank")) - { - - return ClassManager.configRankAdd(args[2], args[3], args[4], - args[5], - FormatManager.getItemStacksFromCommaString(args[6]), - Double.parseDouble(args[7]), Integer.parseInt(args[8]), - null); //pPlayer); - } - // second argument unknown - return false; - } else if (args[0].equalsIgnoreCase("change")) { - - /* - * /classadmin change rank *classname* *rankname* *displayname* - * *color* /classadmin change class *classname* *newclassname* - */ - - if (args[1].equalsIgnoreCase("class")) { - if (args.length != 4) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager - .configClassChange(args[2], args[3], pPlayer); - } else if (args[1].equalsIgnoreCase("rank")) { - if (args.length != 6) { - plugin.msg( - pPlayer, - "Wrong number of arguments (" - + String.valueOf(args.length) + ")!"); - return false; - } - return ClassManager.configRankChange(args[2], args[3], args[4], - args[5], pPlayer); - } - // second argument unknown - return false; - } - return false; - } - - public FormatManager getFormatManager() { - return fm; - } -} diff --git a/src/net/slipcor/classranks/managers/ConfigManager.java b/src/net/slipcor/classranks/managers/ConfigManager.java index 2d7edf7..91cd198 100644 --- a/src/net/slipcor/classranks/managers/ConfigManager.java +++ b/src/net/slipcor/classranks/managers/ConfigManager.java @@ -9,15 +9,18 @@ import org.bukkit.inventory.ItemStack; //import org.bukkit.plugin.Plugin; import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Clazz; import net.slipcor.classranks.core.Rank; /* * this Class read the config and make it persistaned * each config node will be stored here. + * the config data stored in parameters, so not always read from file + * the ClassRank tree are stored in the ClassManager * - * @version v0.4.6 + * @version v0.4.6 * - * @author krglog + * @author krglok * */ public class ConfigManager { @@ -32,17 +35,39 @@ public Map getClasses() { // private void setClasses(Map classes) { // this.classRanks = classes; // } - private Boolean autoUpdate; + private Boolean autoUpdate = new Boolean(false); public Boolean isAutoUpdate() { return autoUpdate; } - private Boolean updateCheck; + private Boolean updateCheck = new Boolean(false); public Boolean isUpdateCheck() { return updateCheck; } + + private boolean useUUID = new Boolean(false); + public Boolean isUUD() + { + return useUUID; + } + + public void setUUID(Boolean value) + { + useUUID = value; + } + + private Boolean clearranks = new Boolean(false); + public Boolean isClearranks() + { + return clearranks; + } + + public void setClearranks(Boolean clearranks) + { + this.clearranks = clearranks; + } private Map players; @@ -50,14 +75,27 @@ public Map getPlayers() { return players; } - private Map playerClassList; +// private Map playerClassList; // should store the playerClasses - private Map playerClassRank; +// private Map playerClassRank; // should store the playerRanks private Double[] moneyCost; + public Double[] getMoneyCost() { return moneyCost; } + + public Double getMoneyCost(int index) + { + if (index <= moneyCost.length) + { + return moneyCost[index]; + } else + { + return moneyCost[moneyCost.length-1]; + } + } + public void setMoneyCost(Double[] moneyCost) { this.moneyCost = moneyCost; } @@ -65,14 +103,28 @@ public void setMoneyCost(Double[] moneyCost) { public int[] getExpCost() { return expCost; } + public int getExpCost(int index) + { + if (index <= expCost.length) + { + return expCost[index]; + } else + { + return expCost[expCost.length-1]; + } + } public ConfigManager(ClassRanks plugin) { super(); this.plugin = plugin; + moneyCost = new Double[1]; + expCost = new int[1]; + signs = new String[3]; + } - private Boolean debug; + private Boolean debug = new Boolean(false); public Boolean isDebug() { return debug; } @@ -80,7 +132,7 @@ public void setDebug(Boolean debug) { this.debug = debug; } - private Boolean checkprices; + private Boolean checkprices = new Boolean(false); public Boolean isCheckprices() { return checkprices; } @@ -96,7 +148,7 @@ public void setPrices(Map prices) { this.prices = prices; } - private Boolean checkexp; + private Boolean checkexp = new Boolean(false); public Boolean isCheckexp() { return checkexp; } @@ -112,7 +164,7 @@ public void setExpprices(Map expprices) { this.expprices = expprices; } - private Boolean trackRanks; + private Boolean trackRanks = new Boolean(false); public Boolean isTrackRanks() { return trackRanks; } @@ -128,7 +180,7 @@ public void setRankpublic(Boolean rankpublic) { this.rankPublic = rankpublic; } - private Boolean signcheck; + private Boolean signcheck = new Boolean(false); public Boolean isSigncheck() { return signcheck; } @@ -136,7 +188,7 @@ public void setSigncheck(Boolean signcheck) { this.signcheck = signcheck; } - private String[] signs; + private String[] signs; // = new String[]; public String[] getSigns() { return signs; } @@ -160,7 +212,7 @@ public void setItemStacks(ItemStack[][] itemStacks) { this.itemStacks = itemStacks; } - private Boolean checkitems; + private Boolean checkitems = new Boolean(false); public Boolean isCheckitems() { return checkitems; } @@ -177,7 +229,8 @@ public void setItems(Map items) { } private ItemStack[][] rankItems; - public ItemStack[][] getRankItems() { + public ItemStack[][] getRankItems() + { return rankItems; } public void setRankItems(ItemStack[][] rankItems) { @@ -192,7 +245,7 @@ public void setDefaultrankallworlds(boolean defaultrankallworlds) { this.defaultRankAllWorlds = defaultrankallworlds; } - private boolean onlyOneClass; + private boolean onlyOneClass = new Boolean(false); public Boolean isOnlyoneclass() { return onlyOneClass; } @@ -200,20 +253,22 @@ public void setOnlyoneclass(boolean onlyoneclass) { this.onlyOneClass = onlyoneclass; } - - + /** + * Load Config file , stores data in parmeters + */ public void load_config() { if (plugin.getConfig() == null || !plugin.getConfig().getString("cversion").equals(debugVersion)) { - plugin.log("creating default config.yml", Level.INFO); + ClassRanks.log("creating default config.yml", Level.INFO); plugin.getConfig().set("cversion", debugVersion); plugin.getConfig().options().copyDefaults(true); plugin.saveConfig(); } // DebugManager.active = plugin.getConfig().getBoolean("debug", false); debug = plugin.getConfig().getBoolean("debug", false); + plugin.db.active = debug; // AutoUpdate Config autoUpdate = plugin.getConfig().getBoolean("autoupdate", false); // UpdateCheck Config @@ -221,14 +276,20 @@ public void load_config() { // check for section is available checkprices = plugin.getConfig().getBoolean("checkprices", false); + + // useUUID + useUUID = plugin.getConfig().getBoolean("useUUID", false); + boolean isSection = false; if (plugin.getConfig().getConfigurationSection("prices") != null) { isSection = true; } - if ( isCheckprices() && isSection) { - plugin.db.i("prices are already set, reading..."); +// if ( isCheckprices() && isSection) + if (isSection) + { + plugin.db.i("Config prices reading..."); // set prices prices = (Map) plugin.getConfig().getConfigurationSection("prices").getValues(true); @@ -243,13 +304,14 @@ public void load_config() { int i = 0; for (String Key : prices.keySet()) { String sVal = (String) prices.get(Key); - try { + try + { moneyCost[i] = Double.parseDouble(sVal); - plugin.db.i("#" + i + " => " - + String.valueOf(Double.parseDouble(sVal))); - } catch (Exception e) { + plugin.db.i("#" + i + " => " + String.valueOf(Double.parseDouble(sVal))); + } catch (Exception e) + { moneyCost[i] = 0.0; - plugin.log("Unrecognized cost key '" + String.valueOf(Key) + "': " + ClassRanks.log("Unrecognized cost key '" + String.valueOf(Key) + "': " + sVal, Level.INFO); } i++; @@ -260,25 +322,37 @@ public void load_config() { checkexp = plugin.getConfig().getBoolean("checkexp", false); isSection = (plugin.getConfig().getConfigurationSection("exp") != null); - if ((isCheckexp()) && (isSection)) { +// if ((isCheckexp()) && (isSection)) + + if (isSection) + { // set exp prices - plugin.db.i("exp costs are set, reading..."); + plugin.db.i("CONFG exp costs reading..."); expprices = (Map) plugin.getConfig().getConfigurationSection("exp").getValues(true); // cmdMgr.expCost = new int[expprices.size()]; int i = 0; - for (String Key : expprices.keySet()) { + // array erweitern, wenn zu klein + if (expCost.length < expprices.size() ) + { + expCost = new int [expprices.size()]; + } + // config in array uebertragen + for (String Key : expprices.keySet()) + { String sVal = (String) expprices.get(Key); - try { - plugin.cmdMgr.expCost[i] = Integer.parseInt(sVal); + ClassRanks.log("ExpPrice : "+sVal, Level.INFO); + try + { + expCost[i] = Integer.parseInt(sVal); plugin.db.i("#" + i + " => " + String.valueOf(Integer.parseInt(sVal))); } catch (Exception e) { expCost = new int[i+1]; expCost[i] = 0; - plugin.log("Unrecognized exp cost key '" + String.valueOf(Key) + ClassRanks.log("Unrecognized exp cost key '" + String.valueOf(Key) + "': " + sVal, Level.INFO); } i++; @@ -286,9 +360,7 @@ public void load_config() { } // set subcolors - plugin.cmdMgr.getFormatManager().setColors("world", - plugin.getConfig().getString("playercolor"), - plugin.getConfig().getString("worldcolor")); + FormatManager.setColors(plugin.getConfig().getString("playercolor"),plugin.getConfig().getString("worldcolor")); // set other variables rankPublic = plugin.getConfig().getBoolean("rankpublic", false); @@ -302,15 +374,16 @@ public void load_config() { // Sign signcheck = plugin.getConfig().getBoolean("signcheck", false); - if (signcheck) { - plugin.db.i("sign check activated!"); + plugin.db.i("sign check Read!"); signs[0] = plugin.getConfig().getString("signchoose", "[choose]"); signs[1] = plugin.getConfig().getString("signrankup", "[rankup]"); signs[2] = plugin.getConfig().getString("signrankdown", "[rankdown]"); - } + + setClearranks(plugin.getConfig().getBoolean("clearranks", false)); + ///PlayerManager.coolDown = plugin.getConfig().getInt("cooldown", 0); coolDown = plugin.getConfig().getInt("cooldown", 0); @@ -319,45 +392,48 @@ public void load_config() { checkitems = plugin.getConfig().getBoolean("checkitems"); // check section is available + plugin.db.i("read items section"); isSection = plugin.getConfig().getConfigurationSection("items") != null; // item read and check - if (isCheckitems() && isSection) { + if (isSection) + { plugin.db.i("items exist, parsing..."); items = (Map) plugin.getConfig() .getConfigurationSection("items").getValues(false); // items error check - if (items == null) { + if (items == null) + { plugin.db.i("items invalid, setting to null"); itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; - } else { + } else + { // for each items => ItemStack[][1,2,3] int iI = 0; itemStacks = new ItemStack[items.size()][]; - for (String isKey : items.keySet()) { + for (String isKey : items.keySet()) + { + plugin.db.i("Item Key : " + isKey.toString()); List values = plugin.getConfig().getList("items." + isKey); itemStacks[iI] = new ItemStack[values.size()]; plugin.db.i("creating itemstack:"); - for (int iJ = 0; iJ < values.size(); iJ++) { + for (int iJ = 0; iJ < values.size(); iJ++) + { String[] vValue = (String.valueOf(values.get(iJ))) .split(":"); - int vAmount = vValue.length > 1 ? Integer - .parseInt(vValue[1]) : 1; - try { + int vAmount = vValue.length > 1 ? Integer.parseInt(vValue[1]) : 1; + try + { itemStacks[iI][iJ] = new ItemStack( Material.valueOf(vValue[0]), vAmount); - } catch (Exception e) { - try { - itemStacks[iI][iJ] = new ItemStack( - Integer.valueOf(vValue[0]), vAmount); - } catch (Exception e2) { + } catch (Exception e) + { - plugin.log("Unrecognized reagent: " + vValue[0], + ClassRanks.log("Unrecognized reagent: " + vValue[0], Level.WARNING); continue; - } } } plugin.db.i(iI + " - " @@ -370,11 +446,21 @@ public void load_config() { // read basis class and ranks initialize the object classes = plugin.getConfig().getConfigurationSection("classes").getValues(false); - for (String sClassName : classes.keySet()) { + for (String sClassName : classes.keySet()) + { Map ranks = ((ConfigurationSection) classes .get(sClassName)).getValues(false); boolean newClass = true; - for (String sRankName : ranks.keySet()) { + for (String sRankName : ranks.keySet()) + { +// Rank definition +// this.sPermissionName = sPermName; +// this.sDisplayName = sDispName; +// this.cColor = cC; +// this.crcSuper = crc; +// this.items = isItems; +// this.cost = dCost; +// this.exp = iExp; String rankName = null; String rankColor = "&f"; @@ -382,27 +468,27 @@ public void load_config() { ItemStack[] rankItems = null; int rankExp = -1; - if (plugin.getConfig().get( - "classes." + sClassName + "." + sRankName + ".name") != null) { + if (plugin.getConfig().get("classes." + sClassName + "." + sRankName + ".name") != null) + { rankName = plugin.getConfig() .getString( "classes." + sClassName + "." + sRankName + ".name"); } - if (plugin.getConfig().get( - "classes." + sClassName + "." + sRankName + ".color") != null) { + if (plugin.getConfig().get("classes." + sClassName + "." + sRankName + ".color") != null) + { rankColor = plugin.getConfig().getString( "classes." + sClassName + "." + sRankName + ".color"); } - if (plugin.getConfig().get( - "classes." + sClassName + "." + sRankName + ".price") != null) { + if (plugin.getConfig().get("classes." + sClassName + "." + sRankName + ".price") != null) + { rankCost = Double.valueOf(plugin.getConfig().getString( "classes." + sClassName + "." + sRankName + ".price")); } - if (plugin.getConfig().get( - "classes." + sClassName + "." + sRankName + ".items") != null) { + if (plugin.getConfig().get("classes." + sClassName + "." + sRankName + ".items") != null) + { rankItems = FormatManager .getItemStacksFromStringList(plugin.getConfig() .getStringList( @@ -410,21 +496,20 @@ public void load_config() { + sRankName + ".items")); } if (plugin.getConfig().get( - "classes." + sClassName + "." + sRankName + ".exp") != null) { + "classes." + sClassName + "." + sRankName + ".exp") != null) + { rankExp = Integer.parseInt(plugin.getConfig().getString( "classes." + sClassName + "." + sRankName + ".exp")); } - if (newClass) { + if (newClass) + { // create class - ClassManager.configClassAdd(sClassName, sRankName, - rankName, rankColor, rankItems, rankCost, rankExp, - null); - + ClassManager.configClassAdd(sClassName, sRankName,rankName, rankColor, rankItems, rankCost, rankExp,null); newClass = false; - } else { - ClassManager.configRankAdd(sClassName, sRankName, rankName, - rankColor, rankItems, rankCost, rankExp, null); + } else + { + ClassManager.configRankAdd(sClassName, sRankName, rankName,rankColor, rankItems, rankCost, rankExp, null); } } } @@ -437,17 +522,21 @@ public void load_config() { /** * */ - public void readPlayerSection() { + public void readPlayerSection() + { boolean isSection = (plugin.getConfig().getConfigurationSection("players") != null); - if (!isSection) { + + if (!isSection) + { players = null; - } else { + } else + { players = plugin.getConfig().getConfigurationSection("players").getValues(false); - for (String sClassName : players.keySet()) { - - - } +// for (String sClassName : players.keySet()) { +// +// +// } } } @@ -457,8 +546,8 @@ public void readPlayerSection() { */ public void save_config() { plugin.db.i("saving config..."); - for (net.slipcor.classranks.core.Class cClass : ClassManager - .getClasses()) { + for (Clazz cClass : ClassManager.getClasses()) + { plugin.db.i(" - " + cClass.name); for (Rank rRank : cClass.ranks) { @@ -496,6 +585,6 @@ public void save_config() { } plugin.saveConfig(); } - + } diff --git a/src/net/slipcor/classranks/managers/DebugManager.java b/src/net/slipcor/classranks/managers/DebugManager.java index 0f79ba8..4d4b797 100644 --- a/src/net/slipcor/classranks/managers/DebugManager.java +++ b/src/net/slipcor/classranks/managers/DebugManager.java @@ -17,10 +17,11 @@ */ public class DebugManager { - public static boolean active; + public static boolean active = false; public final ClassRanks plugin; - public DebugManager(ClassRanks plugin) { + public DebugManager(ClassRanks plugin) + { this.plugin = plugin; } diff --git a/src/net/slipcor/classranks/managers/FormatManager.java b/src/net/slipcor/classranks/managers/FormatManager.java index e8abd5c..8849f6e 100644 --- a/src/net/slipcor/classranks/managers/FormatManager.java +++ b/src/net/slipcor/classranks/managers/FormatManager.java @@ -15,27 +15,32 @@ * @author slipcor */ -public class FormatManager { - private ChatColor colPlayer = ChatColor.YELLOW; // Color: Playername - private ChatColor colWorld = ChatColor.GOLD; // Color: Worldname +public class FormatManager +{ + private static ChatColor colPlayer = ChatColor.YELLOW; // Color: Playername + private static ChatColor colWorld = ChatColor.GOLD; // Color: Worldname /* * Wrap a string in the desired color */ - String formatPlayer(String str) { - String tStr = PlayerManager.search(str); - if (!tStr.equals("")) { + public static String formatPlayer(String playerName) + { + String tStr = PlayerManager.searchName(playerName); + if (tStr.equals("") == false) + { // if a valid playername: replace - str = tStr; + playerName = tStr; } - return colPlayer + str + ChatColor.WHITE; + return colPlayer + playerName + ChatColor.WHITE; } /* * Wrap a string in the desired color */ - String formatWorld(String str) { - if (str.equalsIgnoreCase("all")) { + public static String formatWorld(String str) + { + if (str.equalsIgnoreCase("all")) + { str = "all worlds"; } return colWorld + str + ChatColor.WHITE; @@ -44,7 +49,8 @@ String formatWorld(String str) { /* * read a string and format it with given color code (e.g. '&e') */ - String formatStringByColorCode(String str, String code) { + public static String formatStringByColorCode(String str, String code) + { // remove the color prefix code = code.replace("&", ""); ChatColor cc = formatColor(code); @@ -83,22 +89,28 @@ public static String formatItemStacks(ItemStack[] itemStacks) { return result; } - public static ItemStack[] getItemStacksFromStringList(List stringList) { + public static ItemStack[] getItemStacksFromStringList(List stringList) + { String result = ""; - for (String item : stringList) { - result += result.equals("")?item:","+item; + for (String item : stringList) + { + result += result.equals("") ? item:","+item; } return getItemStacksFromCommaString(result); } - public static ItemStack[] getItemStacksFromCommaString (String string) { + public static ItemStack[] getItemStacksFromCommaString (String string) + { String[] arrStacks = string.split(","); ItemStack[] result = new ItemStack[arrStacks.length]; int i = 0; - for (String stack : arrStacks) { - if (stack.contains(":")) { + for (String stack : arrStacks) + { + if (stack.contains(":")) + { String[] vars = stack.split(":"); - if (vars.length == 2) { + if (vars.length == 2) + { int iAmount = 1; try { iAmount = Integer.parseInt(vars[1]); @@ -149,7 +161,8 @@ public static ItemStack[] getItemStacksFromCommaString (String string) { /* * store the config colors into our private values */ - public void setColors(String sColor, String sPlayerCode, String sWorldCode) { + public static void setColors(String sPlayerCode, String sWorldCode) + { colPlayer = formatColor(sPlayerCode); colWorld = formatColor(sWorldCode); } diff --git a/src/net/slipcor/classranks/managers/PlayerClassManager.java b/src/net/slipcor/classranks/managers/PlayerClassManager.java index 5cf6d53..d791203 100644 --- a/src/net/slipcor/classranks/managers/PlayerClassManager.java +++ b/src/net/slipcor/classranks/managers/PlayerClassManager.java @@ -5,11 +5,16 @@ import java.util.ArrayList; import java.util.Iterator; +/** + * + * @author Windu + * + */ public class PlayerClassManager { - private ArrayList playerClassList; + private ArrayList playerClassList; - public ArrayList getPlayerClassList() { + public ArrayList getPlayerClassList() { return playerClassList; } @@ -19,7 +24,7 @@ public ArrayList getPlayerClassList() { public PlayerClassManager() { super(); - this.playerClassList = new ArrayList(); + this.playerClassList = new ArrayList(); } /* @@ -30,7 +35,7 @@ public void addPlayer(String playerName) { // player not found make player entry if (!checkPlayerName(playerName)) { - playerClassList.add(new PlayerClassList(playerName, null)); + playerClassList.add(new PlayerClazzList(playerName, null)); } } @@ -44,7 +49,7 @@ public boolean checkPlayerName(String playerName) { return false; } boolean isfound = false; - for (Iterator item = playerClassList.iterator(); item.hasNext(); ) { + for (Iterator item = playerClassList.iterator(); item.hasNext(); ) { if ( item.next().equalsIgnoreCaseName(playerName)) { isfound = true; } diff --git a/src/net/slipcor/classranks/managers/PlayerManager.java b/src/net/slipcor/classranks/managers/PlayerManager.java index 7a40c91..65fdef6 100644 --- a/src/net/slipcor/classranks/managers/PlayerManager.java +++ b/src/net/slipcor/classranks/managers/PlayerManager.java @@ -27,98 +27,142 @@ * v0.1.5.1 - cleanup * v0.1.5.0 - more fixes, update to CB #1337 * - * @author slipcor + * @author slipcor / Krglok */ -public class PlayerManager { +public class PlayerManager +{ private final ClassRanks plugin; - private static DebugManager db; -// public static int coolDown; - public PlayerManager(ClassRanks plugin) { + public PlayerManager(ClassRanks plugin) + { this.plugin = plugin; - db = new DebugManager(plugin); + } + + + public static Player searchPlayerName(String name) + { + for (Player player : Bukkit.getServer().getOnlinePlayers()) + { + if (player.getName().equalsIgnoreCase(name)) + { + return player; // gotcha! + } + } + System.out.println("[ClassRank] player not online "+name); + // plugin.db.i("player not online: " + playerName); + // not found online, hope that it was right anyways + return null; } /* * receive a string and search for online usernames containing it */ - public static String search(String player) { + public static String searchName(String playerName) + { Player[] p = Bukkit.getServer().getOnlinePlayers(); for (int i=0;i iiItemsLeftover; - isItemsBackup = new ItemStack[isItems.length]; - - for (int i=0;i= items[i].getAmount()) + { + isContain = true; + plugin.db.i("Found : "+item.getData().getItemType().name() + " : " + item.getAmount()); + //getData().getItemType().name(); + } + } + } + if (isContain == false) + { + plugin.msg(player,"Not found : "+items[i].getData().getItemType().name() + " : " + items[i].getAmount()); + plugin.db.i("Not found : "+items[i].getData().getItemType().name() + " : " + items[i].getAmount()); + return false; + } } + } - // isPlayerItems == Player Inventory - // isPlayerItemsBackup == Backup + return true; + } - iiItemsLeftover = iPlayer.getInventory().removeItem(isItemsBackup); + public boolean takeItems(Player player, ItemStack[] items) + { - if(!iiItemsLeftover.isEmpty()){ - // player does NOT have the stuff - - db.i("player does not have the items"); - iPlayer.getInventory().setContents(isPlayerItemsBackup); - return false; + for (int i=0;i cdx = new HashMap(); cdx.put("slipcor", 0); configCool.addDefault("cooldown", cdx); @@ -127,26 +171,27 @@ int coolDownCheck(Player comP) { Map cds = (Map) configCool.getConfigurationSection("cooldown").getValues(true); int now = Math.round((System.currentTimeMillis() % (60*60*24*1000)) /1000); - if (cds.containsKey(comP.getName())) { - db.i("player cooldown found!"); - // Subtract the seconds waited from the needed seconds - int cd = plugin.config.getCoolDown() - (now - (Integer) cds.get(comP.getName())); - if ((cd <= plugin.config.getCoolDown()) && (cd > 0)) { - db.i("cooldown still is: "+cd); +// if (cds.containsKey(player.getName())) + if (cds.containsKey(player.getUniqueId().toString())) + { + int cd = plugin.config.getCoolDown() - (now - (Integer) cds.get(player.getName())); + if ((cd <= plugin.config.getCoolDown()) && (cd > 0)) + { return cd; // we still have to wait, return how many seconds } - cds.remove(comP.getName()); // delete the value - db.i("value deleted"); + cds.remove(player.getUniqueId().toString()); // delete the value } - cds.put(comP.getName(), now); - db.i("value set"); + cds.put(player.getUniqueId().toString(), now); configCool.set("cooldown", cds); - try { + try + { configCool.save(fConfig); - } catch (IOException e) { - plugin.log("IO Exception!", Level.SEVERE); + } + catch (IOException e) + { + ClassRanks.log("IO Exception!", Level.SEVERE); e.printStackTrace(); } diff --git a/src/net/slipcor/classranks/register/payment/Methods.java b/src/net/slipcor/classranks/register/payment/Methods.java index 57ae92c..de2d330 100644 --- a/src/net/slipcor/classranks/register/payment/Methods.java +++ b/src/net/slipcor/classranks/register/payment/Methods.java @@ -42,14 +42,6 @@ public class Methods { * Implement all methods along with their respective name & class. */ private static void _init() { - addMethod("iConomy", new net.slipcor.classranks.register.payment.methods.iCo6());/* - addMethod("iConomy", new net.slipcor.classranks.register.payment.methods.iCo5()); - addMethod("iConomy", new praxis.classranks.register.payment.methods.iCo4()); - addMethod("BOSEconomy", new praxis.classranks.register.payment.methods.BOSE6()); - addMethod("BOSEconomy", new net.slipcor.classranks.register.payment.methods.BOSE7()); - addMethod("Essentials", new net.slipcor.classranks.register.payment.methods.EE17()); - addMethod("Currency", new net.slipcor.classranks.register.payment.methods.MCUR());*/ - Dependencies.add("MultiCurrency"); } /** diff --git a/src/net/slipcor/classranks/register/payment/methods/BOSE7.java b/src/net/slipcor/classranks/register/payment/methods/BOSE7.java deleted file mode 100644 index b077305..0000000 --- a/src/net/slipcor/classranks/register/payment/methods/BOSE7.java +++ /dev/null @@ -1,206 +0,0 @@ -package net.slipcor.classranks.register.payment.methods; - -import cosine.boseconomy.BOSEconomy; -import net.slipcor.classranks.register.payment.Method; - -import org.bukkit.plugin.Plugin; - - -/** - * BOSEconomy 7 Implementation of Method - * - * @author Acrobot - * @author Nijikokun (@nijikokun) - * @copyright (c) 2011 - * @license AOL license - */ -public class BOSE7 implements Method { - private BOSEconomy BOSEconomy; - - public BOSEconomy getPlugin() { - return this.BOSEconomy; - } - - public String getName() { - return "BOSEconomy"; - } - - public String getVersion() { - return "0.7.0"; - } - - public int fractionalDigits() { - return this.BOSEconomy.getFractionalDigits(); - } - - public String format(double amount) { - String currency = this.BOSEconomy.getMoneyNamePlural(); - - if(amount == 1) - currency = this.BOSEconomy.getMoneyName(); - - return amount + " " + currency; - } - - public boolean hasBanks() { - return true; - } - - public boolean hasBank(String bank) { - return this.BOSEconomy.bankExists(bank); - } - - public boolean hasAccount(String name) { - return this.BOSEconomy.playerRegistered(name, false); - } - - public boolean hasBankAccount(String bank, String name) { - return this.BOSEconomy.isBankOwner(bank, name) || this.BOSEconomy.isBankMember(bank, name); - } - - public MethodAccount getAccount(String name) { - if(!hasAccount(name)) - return null; - return new BOSEAccount(name, this.BOSEconomy); - } - - public MethodBankAccount getBankAccount(String bank, String name) { - if(!hasBankAccount(bank, name)) - return null; - - return new BOSEBankAccount(bank, BOSEconomy); - } - - public boolean isCompatible(Plugin plugin) { - return plugin.getDescription().getName().equalsIgnoreCase("boseconomy") - && plugin instanceof BOSEconomy - && !plugin.getDescription().getVersion().equals("0.6.2"); - } - - public void setPlugin(Plugin plugin) { - BOSEconomy = (BOSEconomy)plugin; - } - - public class BOSEAccount implements MethodAccount { - private String name; - private BOSEconomy BOSEconomy; - - public BOSEAccount(String name, BOSEconomy bOSEconomy) { - this.name = name; - this.BOSEconomy = bOSEconomy; - } - - public double balance() { - return this.BOSEconomy.getPlayerMoneyDouble(this.name); - } - - public boolean set(double amount) { - return this.BOSEconomy.setPlayerMoney(this.name, amount, false); - } - - public boolean add(double amount) { - return this.BOSEconomy.addPlayerMoney(this.name, amount, false); - } - - public boolean subtract(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setPlayerMoney(this.name, (balance - amount), false); - } - - public boolean multiply(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setPlayerMoney(this.name, (balance * amount), false); - } - - public boolean divide(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setPlayerMoney(this.name, (balance / amount), false); - } - - public boolean hasEnough(double amount) { - return (this.balance() >= amount); - } - - public boolean hasOver(double amount) { - return (this.balance() > amount); - } - - public boolean hasUnder(double amount) { - return (this.balance() < amount); - } - - public boolean isNegative() { - return (this.balance() < 0); - } - - public boolean remove() { - return false; - } - } - - public class BOSEBankAccount implements MethodBankAccount { - private String bank; - private BOSEconomy BOSEconomy; - - public BOSEBankAccount(String bank, BOSEconomy bOSEconomy) { - this.bank = bank; - this.BOSEconomy = bOSEconomy; - } - - public String getBankName() { - return this.bank; - } - - public int getBankId() { - return -1; - } - - public double balance() { - return this.BOSEconomy.getBankMoneyDouble(bank); - } - - public boolean set(double amount) { - return this.BOSEconomy.setBankMoney(bank, amount, true); - } - - public boolean add(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setBankMoney(bank, (balance + amount), false); - } - - public boolean subtract(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setBankMoney(bank, (balance - amount), false); - } - - public boolean multiply(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setBankMoney(bank, (balance * amount), false); - } - - public boolean divide(double amount) { - double balance = this.balance(); - return this.BOSEconomy.setBankMoney(bank, (balance / amount), false); - } - - public boolean hasEnough(double amount) { - return (this.balance() >= amount); - } - - public boolean hasOver(double amount) { - return (this.balance() > amount); - } - - public boolean hasUnder(double amount) { - return (this.balance() < amount); - } - - public boolean isNegative() { - return (this.balance() < 0); - } - - public boolean remove() { - return this.BOSEconomy.removeBank(bank); - } - } -} \ No newline at end of file diff --git a/src/net/slipcor/classranks/register/payment/methods/EE17.java b/src/net/slipcor/classranks/register/payment/methods/EE17.java deleted file mode 100644 index 61e1996..0000000 --- a/src/net/slipcor/classranks/register/payment/methods/EE17.java +++ /dev/null @@ -1,219 +0,0 @@ -package net.slipcor.classranks.register.payment.methods; - -import com.earth2me.essentials.Essentials; -import com.earth2me.essentials.api.Economy; -import com.earth2me.essentials.api.NoLoanPermittedException; -import com.earth2me.essentials.api.UserDoesNotExistException; - - -import net.slipcor.classranks.register.payment.Method; - -import org.bukkit.plugin.Plugin; - - -/** - * Essentials 17 Implementation of Method - * - * @author Nijikokun (@nijikokun) - * @author Snowleo - * @author Acrobot - * @author KHobbits - * @copyright (c) 2011 - * @license AOL license - */ -public class EE17 implements Method { - private Essentials Essentials; - - public Essentials getPlugin() { - return this.Essentials; - } - - public String getName() { - return "Essentials"; - } - - public String getVersion() { - return "2.2"; - } - - public int fractionalDigits() { - return -1; - } - - public String format(double amount) { - return Economy.format(amount); - } - - public boolean hasBanks() { - return false; - } - - public boolean hasBank(String bank) { - return false; - } - - public boolean hasAccount(String name) { - return Economy.playerExists(name); - } - - public boolean hasBankAccount(String bank, String name) { - return false; - } - - public MethodAccount getAccount(String name) { - if(!hasAccount(name)) - return null; - - return new EEcoAccount(name); - } - - public MethodBankAccount getBankAccount(String bank, String name) { - return null; - } - - public boolean isCompatible(Plugin plugin) { - try { Class.forName("com.earth2me.essentials.api.Economy"); } - catch(Exception e) { return false; } - - return plugin.getDescription().getName().equalsIgnoreCase("essentials") - && plugin instanceof Essentials; - } - - public void setPlugin(Plugin plugin) { - Essentials = (Essentials)plugin; - } - - public class EEcoAccount implements MethodAccount { - private String name; - - public EEcoAccount(String name) { - this.name = name; - } - - public double balance() { - Double balance = 0.0; - - try { - balance = Economy.getMoney(this.name); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] Failed to grab balance in Essentials Economy: " + ex.getMessage()); - } - - return balance; - } - - public boolean set(double amount) { - try { - Economy.setMoney(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - return false; - } catch (NoLoanPermittedException ex) { - System.out.println("[REGISTER] No loan permitted in Essentials Economy: " + ex.getMessage()); - return false; - } - - return true; - } - - public boolean add(double amount) { - try { - Economy.add(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - return false; - } catch (NoLoanPermittedException ex) { - System.out.println("[REGISTER] No loan permitted in Essentials Economy: " + ex.getMessage()); - return false; - } - - return true; - } - - public boolean subtract(double amount) { - try { - Economy.subtract(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - return false; - } catch (NoLoanPermittedException ex) { - System.out.println("[REGISTER] No loan permitted in Essentials Economy: " + ex.getMessage()); - return false; - } - - return true; - } - - public boolean multiply(double amount) { - try { - Economy.multiply(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - return false; - } catch (NoLoanPermittedException ex) { - System.out.println("[REGISTER] No loan permitted in Essentials Economy: " + ex.getMessage()); - return false; - } - - return true; - } - - public boolean divide(double amount) { - try { - Economy.divide(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - return false; - } catch (NoLoanPermittedException ex) { - System.out.println("[REGISTER] No loan permitted in Essentials Economy: " + ex.getMessage()); - return false; - } - - return true; - } - - public boolean hasEnough(double amount) { - try { - return Economy.hasEnough(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - } - - return false; - } - - public boolean hasOver(double amount) { - try { - return Economy.hasMore(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - } - - return false; - } - - public boolean hasUnder(double amount) { - try { - return Economy.hasLess(name, amount); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - } - - return false; - } - - public boolean isNegative() { - try { - return Economy.isNegative(name); - } catch (UserDoesNotExistException ex) { - System.out.println("[REGISTER] User does not exist in Essentials Economy: " + ex.getMessage()); - } - - return false; - } - - public boolean remove() { - return false; - } - } -} \ No newline at end of file diff --git a/src/net/slipcor/classranks/register/payment/methods/MCUR.java b/src/net/slipcor/classranks/register/payment/methods/MCUR.java deleted file mode 100644 index 0051041..0000000 --- a/src/net/slipcor/classranks/register/payment/methods/MCUR.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.slipcor.classranks.register.payment.methods; - -import me.ashtheking.currency.Currency; -import me.ashtheking.currency.CurrencyList; -import net.slipcor.classranks.register.payment.Method; - -import org.bukkit.plugin.Plugin; - - -/** - * MultiCurrency Method implementation. - * - * @author Acrobot - * @copyright (c) 2011 - * @license AOL license - */ -public class MCUR implements Method { - private Currency currencyList; - - public Object getPlugin() { - return this.currencyList; - } - - public String getName() { - return "MultiCurrency"; - } - - public String getVersion() { - return "0.09"; - } - - public int fractionalDigits() { - return -1; - } - - public String format(double amount) { - return amount + " Currency"; - } - - public boolean hasBanks() { - return false; - } - - public boolean hasBank(String bank) { - return false; - } - - public boolean hasAccount(String name) { - return true; - } - - public boolean hasBankAccount(String bank, String name) { - return false; - } - - public MethodAccount getAccount(String name) { - return new MCurrencyAccount(name); - } - - public MethodBankAccount getBankAccount(String bank, String name) { - return null; - } - - public boolean isCompatible(Plugin plugin) { - return (plugin.getDescription().getName().equalsIgnoreCase("Currency") - || plugin.getDescription().getName().equalsIgnoreCase("MultiCurrency")) - && plugin instanceof Currency; - } - - public void setPlugin(Plugin plugin) { - currencyList = (Currency) plugin; - } - - public class MCurrencyAccount implements MethodAccount{ - private String name; - - public MCurrencyAccount(String name) { - this.name = name; - } - - public double balance() { - return CurrencyList.getValue((String) CurrencyList.maxCurrency(name)[0], name); - } - - public boolean set(double amount) { - CurrencyList.setValue((String) CurrencyList.maxCurrency(name)[0], name, amount); - return true; - } - - public boolean add(double amount) { - return CurrencyList.add(name, amount); - } - - public boolean subtract(double amount) { - return CurrencyList.subtract(name, amount); - } - - public boolean multiply(double amount) { - return CurrencyList.multiply(name, amount); - } - - public boolean divide(double amount) { - return CurrencyList.divide(name, amount); - } - - public boolean hasEnough(double amount) { - return CurrencyList.hasEnough(name, amount); - } - - public boolean hasOver(double amount) { - return CurrencyList.hasOver(name, amount); - } - - public boolean hasUnder(double amount) { - return CurrencyList.hasUnder(name, amount); - } - - public boolean isNegative() { - return CurrencyList.isNegative(name); - } - - public boolean remove() { - return CurrencyList.remove(name); - } - } -} \ No newline at end of file diff --git a/src/net/slipcor/classranks/register/payment/methods/iCo5.java b/src/net/slipcor/classranks/register/payment/methods/iCo5.java deleted file mode 100644 index 6e39ed1..0000000 --- a/src/net/slipcor/classranks/register/payment/methods/iCo5.java +++ /dev/null @@ -1,226 +0,0 @@ -package net.slipcor.classranks.register.payment.methods; - -import com.iConomy.iConomy; -import com.iConomy.system.Account; -import com.iConomy.system.BankAccount; -import com.iConomy.system.Holdings; -import com.iConomy.util.Constants; - - -import net.slipcor.classranks.register.payment.Method; - -import org.bukkit.plugin.Plugin; - - -/** - * iConomy 5 Implementation of Method - * - * @author Nijikokun (@nijikokun) - * @copyright (c) 2011 - * @license AOL license - */ -public class iCo5 implements Method { - private iConomy iConomy; - - public iConomy getPlugin() { - return this.iConomy; - } - - public String getName() { - return "iConomy"; - } - - public String getVersion() { - return "5"; - } - - public int fractionalDigits() { - return 2; - } - - public String format(double amount) { - return com.iConomy.iConomy.format(amount); - } - - public boolean hasBanks() { - return Constants.Banking; - } - - public boolean hasBank(String bank) { - return (hasBanks()) && com.iConomy.iConomy.Banks.exists(bank); - } - - public boolean hasAccount(String name) { - return com.iConomy.iConomy.hasAccount(name); - } - - public boolean hasBankAccount(String bank, String name) { - return (hasBank(bank)) && com.iConomy.iConomy.getBank(bank).hasAccount(name); - } - - public MethodAccount getAccount(String name) { - return new iCoAccount(com.iConomy.iConomy.getAccount(name)); - } - - public MethodBankAccount getBankAccount(String bank, String name) { - return new iCoBankAccount(com.iConomy.iConomy.getBank(bank).getAccount(name)); - } - - public boolean isCompatible(Plugin plugin) { - return plugin.getDescription().getName().equalsIgnoreCase("iconomy") - && plugin.getClass().getName().equals("com.iConomy.iConomy") - && plugin instanceof iConomy; - } - - public void setPlugin(Plugin plugin) { - iConomy = (iConomy)plugin; - } - - public class iCoAccount implements MethodAccount { - private Account account; - private Holdings holdings; - - public iCoAccount(Account account) { - this.account = account; - this.holdings = account.getHoldings(); - } - - public Account getiCoAccount() { - return account; - } - - public double balance() { - return this.holdings.balance(); - } - - public boolean set(double amount) { - if(this.holdings == null) return false; - this.holdings.set(amount); - return true; - } - - public boolean add(double amount) { - if(this.holdings == null) return false; - this.holdings.add(amount); - return true; - } - - public boolean subtract(double amount) { - if(this.holdings == null) return false; - this.holdings.subtract(amount); - return true; - } - - public boolean multiply(double amount) { - if(this.holdings == null) return false; - this.holdings.multiply(amount); - return true; - } - - public boolean divide(double amount) { - if(this.holdings == null) return false; - this.holdings.divide(amount); - return true; - } - - public boolean hasEnough(double amount) { - return this.holdings.hasEnough(amount); - } - - public boolean hasOver(double amount) { - return this.holdings.hasOver(amount); - } - - public boolean hasUnder(double amount) { - return this.holdings.hasUnder(amount); - } - - public boolean isNegative() { - return this.holdings.isNegative(); - } - - public boolean remove() { - if(this.account == null) return false; - this.account.remove(); - return true; - } - } - - public class iCoBankAccount implements MethodBankAccount { - private BankAccount account; - private Holdings holdings; - - public iCoBankAccount(BankAccount account) { - this.account = account; - this.holdings = account.getHoldings(); - } - - public BankAccount getiCoBankAccount() { - return account; - } - - public String getBankName() { - return this.account.getBankName(); - } - - public int getBankId() { - return this.account.getBankId(); - } - - public double balance() { - return this.holdings.balance(); - } - - public boolean set(double amount) { - if(this.holdings == null) return false; - this.holdings.set(amount); - return true; - } - - public boolean add(double amount) { - if(this.holdings == null) return false; - this.holdings.add(amount); - return true; - } - - public boolean subtract(double amount) { - if(this.holdings == null) return false; - this.holdings.subtract(amount); - return true; - } - - public boolean multiply(double amount) { - if(this.holdings == null) return false; - this.holdings.multiply(amount); - return true; - } - - public boolean divide(double amount) { - if(this.holdings == null) return false; - this.holdings.divide(amount); - return true; - } - - public boolean hasEnough(double amount) { - return this.holdings.hasEnough(amount); - } - - public boolean hasOver(double amount) { - return this.holdings.hasOver(amount); - } - - public boolean hasUnder(double amount) { - return this.holdings.hasUnder(amount); - } - - public boolean isNegative() { - return this.holdings.isNegative(); - } - - public boolean remove() { - if(this.account == null) return false; - this.account.remove(); - return true; - } - } -} \ No newline at end of file diff --git a/src/net/slipcor/classranks/register/payment/methods/iCo6.java b/src/net/slipcor/classranks/register/payment/methods/iCo6.java deleted file mode 100644 index cf18bc9..0000000 --- a/src/net/slipcor/classranks/register/payment/methods/iCo6.java +++ /dev/null @@ -1,147 +0,0 @@ -package net.slipcor.classranks.register.payment.methods; - -import com.iCo6.iConomy; -import com.iCo6.system.Account; -import com.iCo6.system.Accounts; -import com.iCo6.system.Holdings; - - -import net.slipcor.classranks.register.payment.Method; - -import org.bukkit.plugin.Plugin; - - -/** - * iConomy 6 Implementation of Method - * - * @author Nijikokun (@nijikokun) - * @copyright (c) 2011 - * @license AOL license - */ -public class iCo6 implements Method { - private iConomy iConomy; - - public iConomy getPlugin() { - return this.iConomy; - } - - public String getName() { - return "iConomy"; - } - - public String getVersion() { - return "6"; - } - - public int fractionalDigits() { - return 2; - } - - public String format(double amount) { - return com.iCo6.iConomy.format(amount); - } - - public boolean hasBanks() { - return false; - } - - public boolean hasBank(String bank) { - return false; - } - - public boolean hasAccount(String name) { - return (new Accounts()).exists(name); - } - - public boolean hasBankAccount(String bank, String name) { - return false; - } - - public MethodAccount getAccount(String name) { - return new iCoAccount((new Accounts()).get(name)); - } - - public MethodBankAccount getBankAccount(String bank, String name) { - return null; - } - - public boolean isCompatible(Plugin plugin) { - return plugin.getDescription().getName().equalsIgnoreCase("iconomy") - && plugin.getClass().getName().equals("com.iCo6.iConomy") - && plugin instanceof iConomy; - } - - public void setPlugin(Plugin plugin) { - iConomy = (iConomy)plugin; - } - - public class iCoAccount implements MethodAccount { - private Account account; - private Holdings holdings; - - public iCoAccount(Account account) { - this.account = account; - this.holdings = account.getHoldings(); - } - - public Account getiCoAccount() { - return account; - } - - public double balance() { - return this.holdings.getBalance(); - } - - public boolean set(double amount) { - if(this.holdings == null) return false; - this.holdings.setBalance(amount); - return true; - } - - public boolean add(double amount) { - if(this.holdings == null) return false; - this.holdings.add(amount); - return true; - } - - public boolean subtract(double amount) { - if(this.holdings == null) return false; - this.holdings.subtract(amount); - return true; - } - - public boolean multiply(double amount) { - if(this.holdings == null) return false; - this.holdings.multiply(amount); - return true; - } - - public boolean divide(double amount) { - if(this.holdings == null) return false; - this.holdings.divide(amount); - return true; - } - - public boolean hasEnough(double amount) { - return this.holdings.hasEnough(amount); - } - - public boolean hasOver(double amount) { - return this.holdings.hasOver(amount); - } - - public boolean hasUnder(double amount) { - return this.holdings.hasUnder(amount); - } - - public boolean isNegative() { - return this.holdings.isNegative(); - } - - public boolean remove() { - if(this.account == null) return false; - this.account.remove(); - return true; - } - } -} diff --git a/src/plugin.yml b/src/plugin.yml index ce84b8d..7fab4aa 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.4.6.3 +version: 0.6.1.0 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] @@ -35,6 +35,9 @@ commands: /classadmin change rank [classname] [rankname] [displayname] [color] /classadmin remove class [classname] /classadmin remove rank [classname] [rankname] + /classadmin list {classname} {rankname} + /classadmin config + /classadmin debug [TRUE/FALSE] permissions: classranks.*: description: Gives access to all commands From 704d785de7151ee60a5c87bdb16d5de7bc9573e0 Mon Sep 17 00:00:00 2001 From: krglok Date: Wed, 25 Feb 2015 07:58:22 +0100 Subject: [PATCH 21/29] V0.6.2 / 1.8 recompiled for Bukkit/Spigot 1.8 --- .classpath | 2 +- bin/.gitignore | 1 - .../classranks/commands/PlayerCommands.class | Bin 0 -> 28422 bytes bin/net/slipcor/classranks/core/Clazz.class | Bin 0 -> 1270 bytes .../classranks/core/PlayerClazzList.class | Bin 0 -> 3290 bytes .../classranks/core/PlayerClazzRank.class | Bin 0 -> 490 bytes bin/plugin.yml | 2 +- src/plugin.yml | 2 +- 8 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 bin/.gitignore create mode 100644 bin/net/slipcor/classranks/commands/PlayerCommands.class create mode 100644 bin/net/slipcor/classranks/core/Clazz.class create mode 100644 bin/net/slipcor/classranks/core/PlayerClazzList.class create mode 100644 bin/net/slipcor/classranks/core/PlayerClazzRank.class diff --git a/.classpath b/.classpath index ae0b110..283aa9f 100644 --- a/.classpath +++ b/.classpath @@ -2,7 +2,7 @@ - + diff --git a/bin/.gitignore b/bin/.gitignore deleted file mode 100644 index b0c8d5c..0000000 --- a/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/net diff --git a/bin/net/slipcor/classranks/commands/PlayerCommands.class b/bin/net/slipcor/classranks/commands/PlayerCommands.class new file mode 100644 index 0000000000000000000000000000000000000000..37bc7ccfdec311d01663e6601c953475a287afd3 GIT binary patch literal 28422 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 literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/core/Clazz.class b/bin/net/slipcor/classranks/core/Clazz.class new file mode 100644 index 0000000000000000000000000000000000000000..345914059ac03a7077c1677cd3a089f25a52aa24 GIT binary patch literal 1270 zcmbtTT~8B16g|@xN|$Q+Dnb>Z;s@OVtDq*PghY!*k_L@c4Eo}9yD3AryJTidgjfAT zCIX2h{s4cJ@y-;12muoNFuix~+%xB%Is5DPkDmbM@i>VXLq6~#NBLsY4W;AyTq((e zrgA9toU+e%c9KXi^lk7h?)W@tIIn6Oo*OZAnS%`3imA0D;X6;I}%zSZPuQPl)V~*34RYKWtYVBrIL{52~N9E8DW$EL| zZ4qpFK@`euXF2j()rh;z($cb?eS%@)BH=BJhJ7in6rQ1*`U82xAMeO$E<(7(2i!Ceg5#a#@4Gp!@E4j@76by|mz!3|o+FiJba zoo3{yrhi$gSp?0fe)I5(uXJ4x)pGWC3>{#6tvEenk0wUCvdMkq_i+3D@jaHovkALs z@LwAGxg-1>?iqYS!xTlDdJYBHX6PJsO&g{;%wU!T&{YTb35Ahxe}{fXeY(@qjEZ}h ZJH=p*#F{@bp>@Q-I%L4`kPu>c^ao1+D-{3$ literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/core/PlayerClazzList.class b/bin/net/slipcor/classranks/core/PlayerClazzList.class new file mode 100644 index 0000000000000000000000000000000000000000..43b22132298e8289c80bb8bdb4610c60850cc16a GIT binary patch literal 3290 zcmbVN-*XdH7(F-LG$brEK+^JCK!s#Wn_3Dgr3Fj@gQcx4v{F>urb}7aZp!XPDKozL zPv|ht_=FEW=nR%oW*DD+_fK%fzrh*7bMJ1KHZ73ylHL2=z2`gM`Of|F=hNSx062y_ zDI^3sT`MU0j=fN=d8Mjj`o3qnxBU{AR%y&J7cH;snD_1t+kTLOCa~j{`K4K^2ewl> z>v`s)+z`n6mS>yJq~-Z`&An0?5)c;!wv=nGADC`1X*zW)`PcRQ{XOl+Y=O*zf*vvF zErIRB3ez#&xza@7+3sAwKnwSz$cqp)^6jI1WnUz`+3PuO#=8Pq+(UTyN=so^Fy z7^gD*gDQ_!uFYB*v|zgq9XkYC3dPAZ1oApE*qq^8hmM`t#X`*4*|Ux#uq)!DXqRh_ zV^sr+)nA+zXdAX&YotCuV|ka&8Apjyt5Q&tvT_{-wcw`h3v@NhST=`RW<#~vNZ*%5 z5F)>>gaYlutI{qmET#$x+uQ;7TPxDtyb|!-o zdZnd~HJxNqn(erb6L^<4BwIFjCB4y^TQr(-Sz2B2P@+xpo=5jD);e~GKu@7kY}RJ# zVn`YTItFo?G>9l^5aPMg5fOo;?ao?vIUyA;FbKF7rfLaj};3@XnUk3BSg5 zn+VM6?MvoDG(gte7b#&VsnV(vc4n1ffx9@REu`U(9p<@m=Sz%C9 z{|W+y!nL)%FRl}#A0knbQV`Cj?rR$|9@Vr{U==#OB1yZEM|fumeN)O+0?EyNv@>*}Kd23!9_(l_Xt?S7T z&;C)WhZEv3=K`osf_iAUPHrZ)VFn$T<>kA4T`khUcM-Ee5;Y8CAeg_ppJIiJBf1Sx&>{;Qtl9|e5TXIa8dgMRky*S;$im(?Bjjyp literal 0 HcmV?d00001 diff --git a/bin/plugin.yml b/bin/plugin.yml index 7fab4aa..be13ec0 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.1.0 +version: 0.6.2.0 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] diff --git a/src/plugin.yml b/src/plugin.yml index 7fab4aa..be13ec0 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.1.0 +version: 0.6.2.0 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From f5158cc8deba6b563165226fac343c04a28d76e7 Mon Sep 17 00:00:00 2001 From: krglok Date: Thu, 4 Jun 2015 07:21:38 +0200 Subject: [PATCH 22/29] redesign command interpreter --- bin/.gitignore | 1 + bin/net/slipcor/classranks/ClassRanks.class | Bin 7647 -> 7484 bytes .../commands/ClassAdminCommand.class | Bin 13446 -> 13331 bytes .../classranks/commands/ClassCommand.class | Bin 1857 -> 19230 bytes .../classranks/commands/PlayerCommands.class | Bin 28422 -> 12824 bytes .../classranks/commands/RankdownCommand.class | Bin 2320 -> 5184 bytes .../classranks/commands/RankupCommand.class | Bin 2314 -> 5172 bytes .../classranks/core/PlayerClazzList.class | Bin 3290 -> 2384 bytes .../handlers/HandleVaultPerms.class | Bin 8491 -> 8010 bytes .../classranks/managers/ConfigManager.class | Bin 15766 -> 18328 bytes .../managers/PlayerClassManager.class | Bin 1654 -> 1651 bytes src/net/slipcor/classranks/ClassRanks.java | 18 +- .../commands/ClassAdminCommand.java | 2 +- .../classranks/commands/ClassCommand.java | 865 +++++++++++- .../classranks/commands/PlayerCommands.java | 1193 ++--------------- .../classranks/commands/RankdownCommand.java | 120 +- .../classranks/commands/RankupCommand.java | 145 +- .../slipcor/classranks/core/ClassRankCore.png | Bin 0 -> 66839 bytes .../classranks/core/PlayerClazzList.java | 146 +- .../classranks/handlers/HandleVaultPerms.java | 21 +- .../classranks/managers/ClassRankCore.mgc | 215 +++ .../classranks/managers/ConfigManager.java | 76 +- 22 files changed, 1597 insertions(+), 1205 deletions(-) create mode 100644 bin/.gitignore create mode 100644 src/net/slipcor/classranks/core/ClassRankCore.png create mode 100644 src/net/slipcor/classranks/managers/ClassRankCore.mgc diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..b0c8d5c --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +/net diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index 1fa2a2b84818d661c01077174e5fac78ab031653..e3ee4e107c71c51fde7329a6a980f8f977cb0838 100644 GIT binary patch delta 2317 zcmbtVYj{-E68+FJY4mIN*d0hQK9)K*)iEu~tkeL=NYRBWwC-DhSR{QTwj_0OGi z_t|^xb=FyT&r7w3YBHWWfAA3i^Jt|48)3R=qa4xd)b>^#b*UP<5mB&FEL3LMuSJiz zMybi_BWN3X&3N1l^+lozVuY$>mBTHjDNcXAj4zAz^_kI-hA1jj^b=hDX0&H;lY#+J zZ_g90oIF*Xk`tHP*ArB^9g1DgfLjT{Nx-Ys%*rjO&`^fY=(qtz1W#|w46WY~i*`l2 zRSXfF9p+%~fCpD%n~u-oX0c0MN}m%is-^Dj_=1942|41L%p9kVFJgx%bC4!y=JsK*bs~LhRvvsUtxmT zbS7Ur%-+GUisw1vU$rS@4uqF&3~%Vs@N4{5!EXqKl9wmBrQep}rFX<@3nAGBB9k1X|;+?d5*I)2A1%DNF=@s^qI3;4~CF%*hs^c~M zL+nbg^}WuX@JFJN0e^qk3~iM-XLP)QQzK{6A14Qc<%%O}?o5I^7Hy2grLZd5xpgS{ z!Zy8=oI1Hk5oa^z_}qlFwacW(+u4=zb$*RJl%|j_YBLM%w^RDa+DwyF59L##LIon2 zRajMoF{Tj@M?;r~`P=B`4t|1tAm*28#X8NvDKIu4t&q?z{rniy_SBvYE0&yxUzgVRO1X?Rg7wUA0EOOMh zt*U3~s8**%v{S>um4PuXXzP*u}#Bp!6zk-(Qbg3+MuD-PS ziYAp-5Nzw1@@4X5mkT}nF3KF)oxPmg?Qp;eP@Q;vYROQ|n!o`pvd|SUdM$L0BPs)% z5`pUyfw&9|CIXuifh{udDH+&@xfVWMZrnJAn`~&EGl76{%P>AairYrS zY@wytidj6!m%t_OXoy?4@T*1(pl}iK;4H>lI13xocm{9dU$8TY4E!7K@Wq})A^wwC zy~|ZoIV-t$ZgTHEUY+N?EI7|&r-CaLtW)q`Tj9HC&Slea2ktVBGZu1nI?3i?_WmLK&RHS(J$#TuEe*S5)PBg_2il z&!TKz*Vw1>|CNkw%PSqqC10w;AhWe|ZLqvzjPh)drbsrL#*NCyXgY!K%u6%*S&_Uw zw#;5Gv0)}Z(-Yh}N8I*2?rNIedHfK~%mbSADGXqe>Hkl-b0<>qvFPlW)o-LRd5 PPr+`5g=yn}joRM_2ADz! delta 2417 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 literal 13446 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 diff --git a/bin/net/slipcor/classranks/commands/ClassCommand.class b/bin/net/slipcor/classranks/commands/ClassCommand.class index 6326cbebe656302dda6fd673aa14e9188fdbce68..adc3f28b5f3a763cfdba31da367c3605df9e2e0a 100644 GIT binary patch literal 19230 zcmd^md3;pW+5hvLJIUNkE{h2PB7(zC7KjU?CWt~yo+mo^#K6 z&a-@~!DW>XJI8~F3Mp_!;iJFFJD49%zVoQ@X4e{pYP^>XoQ!mfz z&7GfoOkK|mEeq8|L$Sp*(-xf>Zb(Zr>l=p6p`_{M>;fB^!Ji%1h z5^Y@^i81w`oM&6T+YF(gj!88xVj7ljD#!~h4kwZ|W5bJD7f&&Fc&n&69t*eC$CD|n zFn=tQKfI#FyPd>T+^{6vur%Cg9+gba9A|92bx|~oB?9i0aVuJw81FdlgGs4ybCRj= z{K;9zjl`CPV>n-1jSSCBg&LM(jlz+USR^%yY0!{-C&)T%#cU>DeY`OoAdAW!Dx-s$ ztRWS%19S-W@l)^ol1lSIFX!^Xp+hN%gDeiG^y4t7?lGjo9JVzTiPnrxBtmVIBgs@< zfcnt@KlNuS)x5|Zc4#0C0&&U6%CIJBQV}r?aj2LaxvF%i6LprWYKQz}2WS`_=BFBP zX}>ad=x{oMsSBvg79!JOAT`h1>EmXP zVvFnM@BOG^o}WfC^~_Q^=vyS!Rx>>sY6~Z9f|k|Q$79KOG#m^yG=!7MU?drg#Z$pZ zb4xVbjOpRVVZljF!M1p7aCs<}3Z|BXQq{p_kz^!QDMNdC&P(l;l$A9I6$Q#12i^`XX<611RKLC07|&A zZ?GklNP-{3h7AkQL^{z=u)^veq7n|BM3Z5?5vH;s9WWIJSD4fi0(k91My?dWnTF;@ zrbG5I70ThbIxso3C>#~V+lxssrBGrq6tA=cQ8RVY_%S8a;%aFCyN+&b6i8&6pCgtW zCCE{;Jx2DTVQ;D`<`qE+hTAlcsdK#mWN=9+si7kP(>l$e1#~)-?LA}~-2qdxd9yzn zM61sLDD6qynAS)XW@8hu-)|H=7@&pJD4;mGnChs>p~bWWqkxU6p=Q{3HxJpgS8}y6 zKxb0aPhi{7{prp4c%nI!N<(Ke!9_Vu`k|pfqxhbb*12$+yXit|ap)`(Zx?E5fr4TG z4p_DKyY9j3Y=YzJ5e!8W;ZS3nhylhL4nh_yR|bn{8LjZsa-2B}4(egd_3>yt;ZPf` zgsRRM2RrPZEspdQ!2LoxM@T$(56X-;@8DD!%6MIMJ@6ZJz13MKr>=q39u|pTp zPnZhAiG;ZOntiG3-rNLwT*7qhDamj!=;FbA2}W9576gOyTQt_iAnygivzNyc(Z+Lw z=LE$rf~|m-U~7wzaH+u9Pi(pz0-O*|1!skuTV#&7(JLLgN+jD0dNV$fNT#NT6V0MP zW7@Q$%cab_#-VHJI;Mj#Pu?BV=1pW8(V-~w=odn&aE+`0nf{b%;4FwyBcFz00p&!v zG1wRn8>|kmfHwwr*U(x&-N+Q&-?9#^qniL3pmSzxOE{rVfqn8jPfd~5B&fk5^fQNU zpqc!8qEFHW&;!qdr8lVmIxSt-&iLy;t>d;1NNA%jLgVfofXsZdw#un3Ndcsdz z;Kt;D``*i;C+R6blL0qzjbry_Kh$+AV&|HmEd7i_&(d=ylpGTR)-_ykh}mOsj%rK0IOJqG48x92YYRL1&C%Opfw?wY}JuYQ)^VzrC1~6fI+o3-QT_&Z7Nd92cyWmg9l<5h5ZF-OC(7XhAlRiMKE7v(&uAx6U^k>25 zVpz3@T!JbeJM@Y7d~77yV(@Ma?QrNX^ch%(`Pz#h)&zuP*-^%Mh(>(w&|m3qIPLOC zYDr@vwA>KdaYz6y*uPfJ2q#+*zJ{TA|A3_nYg$5)#-L6A4YFLj16TeBP~~z(k4rT0 zl|x@kf>HwNXT?*YC}iLYSBC%P(6{t&3@7&*MkEICf!EoEU@VxCYOp09iKUW##iGA= zXg5@q3Sp{E5k$r{`G7B-mmm@M3{ z$HWovhho^n=767zfVCN~>JB~I(E3R`b!K9Hjs-g`%b!ElK~ zrPM9J-MG7-%MRd>IZHU)gL^{YsnF8!Bry%9QTu@Q{bt>OZ${p%ZA&YN1Wt+YS*;Oq zw659kAsO4sKdFz{76RaKC?UQpDQ*j*3_9G`lZ%WcWK1~O-{Ao~5U~%GPtI{fK0R52 zs!CMK78CWwZ1D(UrAdf!Fjx3_2-4p?o+|IV4p(v&q?`yh$CrgCB;u_tprQ9ZcnQ7d zp@@Y9edE!_pe8#QN(jGXjmBVKn~}u#o}q7pX3bzzBHkPnawExPBpwr%9PaQD!jkTh z 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 KmwL3Y=zjr|2cC2Q delta 766 zcmZuuOK%cU6#g!E%3~O4p+aGJl(DvjfkI31MX@h@Rc+#m#GM2tNK(K6iE-7RV8~5e zxWI*rZn|kAn7A-@>)xFU{Q++L0j6gLVxn;|=X~eRx!?DlbBC|lxp(f%?~k7VY~s)X z8$(9y%`S)(4-85jhrQOSA2zxo7moyMomQ*buJ>|}kE$GB|t+Jn%E{WUAr45_O|*)cQtUOFXZ3d(Czuo6X9& zj++kLm~1Q|zDZtQ#FqFeMQM;**l}Q6yo#&Y|L?7*U>AD~ipgk9$75I*S~Mcw@_=y7 zoQPk`@ndK-7pHHAqTgH-J(k}b)54GF8BB+#yqB0e5lF+Cc&LaX`~Oumo6)8Xpq0;n4+9Fo@9r diff --git a/bin/net/slipcor/classranks/commands/PlayerCommands.class b/bin/net/slipcor/classranks/commands/PlayerCommands.class index 37bc7ccfdec311d01663e6601c953475a287afd3..cbba387de05d3cfe4a6bf830f9ba098d651a2b1c 100644 GIT binary patch literal 12824 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

+rg z;$uih8Z->4^l|vIGlECbXg;1M@Ch`DPox^8NAvk4x&oEcwLF%#;qNXkr+Z-hVJJ(`7WsZY7}Y{@#G{#BZU=4fDZhJX%*rY z^Mv<6VfejaHf#64h)GC=yoMZjC*LhuXOO=JlCOjsgZyYr0eIn#pdr zT+QB{H~T?%_7C#f_PK43sJ8niBJezlgiS@ZRu#Y`Vm;vmqOrLRgS=k_v)pE=r1Q>H zmEmV={ZfkP6Dvc$kSg>+hT!Z{Y4LvC3pehCXDx0HL-e2=1VN`}l zNBme1CQ(LK6&!FIIg)1gae!-gzq>LY>}M8;F4gD6kgfor zQV+Gko9coEK=2~9;D0P}&-hPu#_}xs9gM#-a7l53LNNZ9nmsi;d$j0K#mM(uZ5~37 zGElc;HszFkI3wZ%N~+||Xz;(0NaAXJ6DunrDA-B_b=J~67_1)qm8wAvl}HYt;B1u+ z@i$O264!&eX5rVVbMW)fMw*A4fd$+`OL#tA$P4jf#l^H5X-E$*#Si9|qxxHk-zA0d zOQJUVHrt@KE_w)g`okPW-X5dp`4UvRNqUJ>^cucSy^fDjUS5lca~WdKdLF|YxPq@h z47w5-`&Hb<*W%mOjrjWXc|6^WFFm*7E6r{A;_^k_%wNW*gWK_mU?cCxx0eI>=JFzF z@O{2ZJAv=kPUL&F@qE8FmA7l>@DA-f{+?FP-`AQsqs`~N+H!tKyOpV7ASer-2Dt3A#Kv>)?x+H?H8_B(z-dzF8o9pYbVhxwqVgkSWO z@=KoK{E8>UuX;}7KX_{RHP4y+H_v(ehNqGL;c4NwJQwggp5^?m=OTXJvx-0T^zva( zLeo5-(R`lkG{5H-P4|3NGdy=`0ndF}sb`xO^laBgdiH9gJP&Ch&!gIjp8eWMo&(w# z&q3{E&u_JI&!4q%UcYvV3L6KO=2U*qG^gLer6^dXSdRb<@h%@Y`ak zo_z>T$El>#k8otFDqH7Uvg7!U+_?R@aR;*Fw2SElHN&fIMVYPE)3(v|njvYbwjH+! zlFsU$M^WRb`rUH?7oO7QQ>p7xI_VIART``a20x_Ps&+4XkH$?4^nV*;9->zC9;Rth kg{dlkw0Q(!u&(^b literal 28422 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 diff --git a/bin/net/slipcor/classranks/commands/RankdownCommand.class b/bin/net/slipcor/classranks/commands/RankdownCommand.class index 4657d3d110767db00585aa2ac2be151a41650dc8..0c09d2d645e3d22647ad5576324871edc2a1cab8 100644 GIT binary patch literal 5184 zcmb7HX?PRY6+O?Ekt|O_qEHe;Xa|#G%d#ynNogg*X0x~v;M&v_T-uDKu{BtlQD#O4 z7f6~e(1x@rp`nHDZMwTlQYs*6XwtpuzVAu5bV>K+N58foU(Xu}S;m&3z$fOtci($= zIrrTA9zXxkIRGp0Pd{n|qNeUfos5x7T6Q#<(HzIt%uy$rw6a;vOgYg$4pY`%v#U7a zhfkpGQk%NuL8To6b5` z+>)^Dk?2r9aW062@))^64c{z@lW^8yMfM*G` zr(HJ}i$+uWSVz&79nw}ux5sq5J!=t*75MaHvA|UqpB2OsJll^OrY?;;uAWt}6wQpA zX4~3$(#nksw6;{ZdE3w)J?X}KW|-;;4+IfL#E({i1r-4(!RbP%6||vUz(1n9TeU1P zIp#RBo+;by&}Q)N(nd4z-v`%V~Q{_QwP0 z=H6!2wWO^ZvDuGJQ_xV1vw|KOs(@=16%F7P0pWRPa}Zn6>&Le0JXdx=WndJ%Ksr?z zK?b;A!FIe*K=J%uX2NAt5@bsL&YbhK#qkJ4plKEgDUl5GFqx&xuAfDeaaBsVO=v@U zMl$KeV4{pqvq#9J*US(&F1qxZz!m+jmK@!pM@M8A0&}^6$#cwR_d}cmaV|R9y(*^hD2i94uScV7M7*r^3;q3Q1&9+l(Ktz zI!@w-Du>%I_m8B=+a&kV4bfQ)o$gx6b}kdR*DE*bWKmHEbUUWXgU1x?#Xf;6NhIC6 zleCSTYgjBz5%NiecZwB@{4Wbvh2Tabqtg{H!vR0`Gy5)ci-LnPCxX0{syMtcfI9?k z$U9`Am^!#yy;-&O+wz7@B2o7r$9rA4Qi$7PacVyy9Urf!V zdU`P$z-!nz$OL3bRdZgIq@s5TG_|IhCNkE=YeAgA zTl_dFu&fF#S5;2ITk$qtp4J>sS%G!`7i4Du@vZ>g!Nk=vnE>7;0BPiV6x@&Zk{t|Z zTh7bsU6Kmlui#c_GQU5l;6pNtYx_2I2Qb0R*~#`JWtq*cn%2hjiug3V@lpmkCjQTcZqk>POz@(&gW@g+n zbuZYmidM49dW%h$X7ZLZc*u{lEQpirT3S@_u=JBMRFoaiGI>3KN62bh*`n#Dl^;o~ z`W?V$*;a(o)am*swK# zFOfl1FGusaDH*zduf*g*W~!ubHP4<)&F5tB9#`-ce3jUd+1Jg?78sljI~Ay%nvv5n zG<_yaRDGS@`>d!aQ%nUeWNv&@!ME^jCOlKD$Pk-sE1zRF&&JQ;8R}aQ-^KU+_}*pI z|1SB?Dfd4=zz-R2-Y>nleq82Su@781bN^E%kNFbQy=NCe^ke+gkDmyrmy%WRGfCbJ z()!Z9(vBw;{2ad^vN-Q4D;26#jZd;ke3mdY1FR$#ex=~oc!~u=-)A_*)2j54jN@Y4!l!0J(;%V1VK zfIFnSu$ca+r{8jny^!Y8&f( z9G^i`V_j`q0WJNM?06WRJ3}{~#&a5dXYjlN)`YtF(^yx)203^>e+ozxu%$KfC_-|+ zZ-Oe-dWtVaJ-=IMT$qZrVj&_}geaQ%fLVd%i1Rm%8$F{|(+sLxHp;;OcF-6(_af}{ zOm?sfgP!XgycoObzGfuw5`NX;rQWS#5d~Q>N?v$^3(}*ZI1g0(bq9rj^8?n8G)#E+Mq za~!Y2t7)T<4~3$wH795*Q6!E@15V+P7rDbUC?c(WEpKfrMz9nwPwGe{bWh|gjtZQ` zeF6o%d3EURF<2eokUQA@_oLEMJLfzc9`dn56JUBT(-(LQB>d~ z1w2r|>66IF?TH!od`jv>z@6j&q0f{Lm@4@>dHNU2i@u4rbH4i#X!CW(d~LOzvAWhs zq>=C~;LFu?`&z~BqHag%lW&~CcVcrI=M?axGkAjMNbvsh1g@Gqa7WRWNEtYuslO>7 zH&s(_@pn@fLr)iw^G#;NAtpbF?4`u?8lt+3h~7jj_Y%c@gzXNbIMO*vV+eb22S#xx zaySZ`-JQ!ao+nq2;Yl{=PvHQb#_jkErT$GooW~)t5QmupcZqf!5i4=GSj*1z7ThDY z;9ju@$HZYal1B+ENh6z!aJc{~ajXO?LdeUm8mtl9@kjiL8P_Fx@n^!)#|LqOHx8nX rcMRjN_#2@sb8i6x=g}wpQ2DQ+=|9*VoZIwYMExv70)MAO4gT>z&%x(s delta 1001 zcmZ8g%Tg0j5Ir|D$xJ2#2?HU9ha{kRLwE^F5W>r65EP8!0|`ltL6TSyqpbJl>&*{@WbL@MqDW89SJOa>%{FXB0u&pFY ziSTM7p9#+_ucVVj2_}YiJ|;BDQ!mrW=f%PrZ)80dQ!+EV`BfU0J z$mJ6G)Ov)!5(a7+OvBlHwm8BN_feID4>1eV%g6sK_s1E;i9#x^KtP>}8fXlH&mT8~ zp+SWNS@#-Mn4w5G#Sqfr-V1iC0tcG(j%EhWUlz66+N#0=b!#Uj8;?1k zL)I+F@bj-MY7U}PLWsd#olvo<=t7wIbL$y~L0?Q4&z~`wYqgpfm(j!D7<&8r82(w- zTyZU%&nP&DK?wsVQyc5WbWX*2T;M+p5mN*gB@FWsp-mXUC|?rXCJAE<4*tvJps6PK z7r|wTVoFzaiNVfowGC=q!4+JSaFwC6s@=?EqE)z#7+(~lauhdI%wU$k6C;ziX!TxK zvEcIR3!PVS8>0+zu}~dT#vKMmxhUrK{oPY>UuR-j1rPB^!XiT#ovHrhnN%zx!B>sn zc!$-$$zUXGO}`C&KAL`+%1aBU*Ffj0K`mJ;MOlbc3p5AzU<(9yQ6C8H!X7w)V8L>IL2 zJxn^qeOxYMTD!SP)@dwbPLJYb%D7v`0#)0C$MEQ>2irs~kP^T{N&qh{%ZEDnY1jZ- z=`-^pOn+WCBIv;r^j0*ER7WO_Rf#1mBUzDHLJDb;NP-Z0j7()2C2G|7>!s_jkY~ix O3N34;o>g)U$o&SDK(Sf? diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class index 56380bb2452dab59d9b2f33f643852ca30894553..431d0beddb1617c2cb9d13a09701507b08f20dbc 100644 GIT binary patch literal 5172 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 nZ-lPQy*UV delta 1066 zcmZ8gNmCP15dPlGgh|3AKtc=?g9Om*%H~QCf^or>O{2IENeqE36vU_}i^wk$3CO{`M9yw^S5{dIp|zj+&e;cET->-`RZA(T}}42Su;L*Mw> z?pL8Ov@RMoqpxU`^L>-^i@8iyMH530KP~&(&ppj$9#<8Xsd{Q&P=Y#aI({IAWT19a{qVBi3ibP;HP zK)T^W4|yQZgrR$_n_NPqfR(xktCuDaeGlT$pT0i`s)=H?*e3*ELXWJ~X($M7s=`ad8!=Q^{Ev%2yQ7wWj`nqH$*x70B! zyfhtk+^S=avOTd~1V!lXCbgD{2@oVEK#0T&qYV)nHi}MqRw4A!uiK9V2C#rZljCS( wWa8MMSi?LrCdC@E$Pq;%g!m)mO)+XzDD(}{vsfg{f+e#p>!g|@nG#CB0n=j0ZvX%Q diff --git a/bin/net/slipcor/classranks/core/PlayerClazzList.class b/bin/net/slipcor/classranks/core/PlayerClazzList.class index 43b22132298e8289c80bb8bdb4610c60850cc16a..7f68d5a4c23d5be9bef554afc93f4c2c31f67ed4 100644 GIT binary patch literal 2384 zcmbVOTUQfT7~Lm?41oa!Ay}=_D?$=TEov2%Uea3bq7kgr)*iwv7#SyYX5uRTj=tE{ z_rCa`YqfOIhps;Ny?>!UqjsM&lgWg%tCyFVbNSAmz4!NhC;9b{pMC}~1!*89P;jlF z(P<$bHKzJM!`4CEE`Sqy_pP$VakN4{WD2C;gpexhHVk zw>(=q>z3!+HFs_PLjkcM&|9v#ejwdoT{?BE^SAp$-=5A**#hZ$-QE%ySkhRIbhk^D zz_Z=$8G+1I+qHvPfpcT++wCjk>x3)UwybV+;J67B{Q@0h06;OEu0!^H@a~i@0hrZi^M*9kZF=z zTXALk{w>z~zpl0ofvoP5@cUh=S;Aq{#t^W@fCjaM0dekzjxuDw`Mz@WeG?y`%$C@- z_AAQN{zmq7`*CTe2Or^M1J~(TvoE<}Vh-~HU3Or3GN^e1xt6o@(K-PZv20+8wlo16 zyCzm}L-mgJ6~EqEdr?l+`I{zgp~5oVk^YJfWdqWwwxlU%l(2OZckl^?JyI6~yW?aF zxpK{M*oeGJNN+>w`;=f!dd+=uQyE~pRBCmvYF)Qg9}dRZ4ezZK;R` zgqcWQV^`ag)4no0!=_=4^9D`f6grXN%+RwguJE?uSV=U|%V!^F_ZY3>2l7ASSibNB z2Lpq}1LW>J*XK^DJ*4@3na?xG;w<_xg40}iB|OQUGn}b7^#wK@M`t-oaXiAP@Jl7W z)m~@*dkj3|Kv9II2#jh#GYp6Tg}MQv!?TP|sc22HNv&J2PEu+~Bjm!Um{KO9B=CBS zwLsbmt1n+Tz#EjyS5j`DmUV%c7irU_1a4o9+ouI8L8Gz2n?zLtbA&v=xhKdB6rSnv z#4k9n6nALFA^tS2yvjt(CY0wQ{3#tPlpPmHBJ^*X@Y;d``CfX;kfed-1kFrLGZWLi zg6Rlnku+4sv-yI~bGiu?x;e*^ST5W&R*iFPQtZ0b%gEHh7KT1ZCd-ONMKQ qxch$?N;0gHp+$z040ry9p|YBP4ao4`KQK(;GqO+NbKKYOFa880J>A*> literal 3290 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 delta 3018 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 diff --git a/bin/net/slipcor/classranks/managers/PlayerClassManager.class b/bin/net/slipcor/classranks/managers/PlayerClassManager.class index c3163ba8aa49575034f75619c721c5e4e8a3b924..73576eaed1478a13181a09241a0e790cf4213102 100644 GIT binary patch delta 30 mcmeyy^OH5JXMVWc&o3}IVX9fVSBMT}3 delta 21 dcmey&^NnXiKNF+Y830|_2n_%L diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 49c91db..566e7c5 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -44,7 +44,7 @@ public class ClassRanks extends JavaPlugin { // dont chance the order of these moduls ! public ConfigManager config = new ConfigManager(this); - private final PlayerManager pm = new PlayerManager(this); + public final PlayerManager pm = new PlayerManager(this); public final DebugManager db = new DebugManager(this); public final PlayerCommands cmdMgr = new PlayerCommands(this); private final CRServerListener serverListener = new CRServerListener(this,cmdMgr); @@ -69,10 +69,10 @@ public void onEnable() { ClassManager cm = new ClassManager(this); // register commands - getCommand("class").setExecutor(new ClassCommand(this, cmdMgr)); - getCommand("classadmin").setExecutor(new ClassAdminCommand(this, cmdMgr)); - getCommand("rankup").setExecutor(new RankupCommand(this, cmdMgr)); - getCommand("rankdown").setExecutor(new RankdownCommand(this, cmdMgr)); + getCommand("class").setExecutor(new PlayerCommands(this)); + getCommand("classadmin").setExecutor(new ClassAdminCommand(this)); + getCommand("rankup").setExecutor(new RankupCommand(this)); + getCommand("rankdown").setExecutor(new RankdownCommand(this)); // load the config file config.load_config(); @@ -175,15 +175,15 @@ public PlayerManager getPlayerManager() */ public void msg(Player pPlayer, String string) { - pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") - + ChatColor.WHITE + "] " + string); +// pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") +// + ChatColor.WHITE + "] " + string); + pPlayer.sendMessage(string); db.i("to " + pPlayer.getName() + ": " + string); } public void error(Player pPlayer, String string) { - pPlayer.sendMessage("[" + ChatColor.AQUA + getConfig().getString("prefix") - + ChatColor.WHITE + "] " + ChatColor.RED+ string); + pPlayer.sendMessage(ChatColor.RED+ string); db.i("to " + pPlayer.getName() + ": " + string); } diff --git a/src/net/slipcor/classranks/commands/ClassAdminCommand.java b/src/net/slipcor/classranks/commands/ClassAdminCommand.java index f23e3a3..af333dc 100644 --- a/src/net/slipcor/classranks/commands/ClassAdminCommand.java +++ b/src/net/slipcor/classranks/commands/ClassAdminCommand.java @@ -34,7 +34,7 @@ public class ClassAdminCommand implements CommandExecutor * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public ClassAdminCommand(ClassRanks plugin, PlayerCommands cm) + public ClassAdminCommand(ClassRanks plugin) { this.plugin = plugin; this.db = plugin.getDebugManager(); diff --git a/src/net/slipcor/classranks/commands/ClassCommand.java b/src/net/slipcor/classranks/commands/ClassCommand.java index ac3e328..a772f0b 100644 --- a/src/net/slipcor/classranks/commands/ClassCommand.java +++ b/src/net/slipcor/classranks/commands/ClassCommand.java @@ -1,12 +1,22 @@ package net.slipcor.classranks.commands; +import java.util.ArrayList; +import java.util.logging.Level; + import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.ClassManager; import net.slipcor.classranks.managers.DebugManager; +import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.register.payment.Method.MethodAccount; +import org.bukkit.ChatColor; 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; /** * class command class @@ -16,24 +26,35 @@ * @author slipcor */ -public class ClassCommand implements CommandExecutor { - private final ClassRanks plugin; - private final PlayerCommands cmdMgr; - private final DebugManager db; +public abstract class ClassCommand implements CommandExecutor +{ + protected final ClassRanks plugin; +// protected final PlayerCommands cmdMgr; + protected final DebugManager db; + + protected double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs + protected int[] expCost = new int[ClassManager.getClasses().size()]; // EXP + + protected Double checkedCost; // checked cost for rank up / add + protected int checkedExp; // checked Exp Cost for rank up / add + protected ItemStack[] checkedItems; // checked list of required items for rank up / add + /** * create a class command instance * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public ClassCommand(ClassRanks plugin, PlayerCommands cm) { + public ClassCommand(ClassRanks plugin) + { this.plugin = plugin; - cmdMgr = plugin.getCommandMgr(); +// cmdMgr = plugin.getCommandMgr(); db = plugin.getDebugManager(); } @Override - public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) + { if (!(sender instanceof Player)) { plugin.msg(sender, "Console access is not implemented. If you want that, visit:"); @@ -42,7 +63,835 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, } // standard class command, parse it! db.i("/class detected! parsing..."); - return cmdMgr.parseCommand((Player) sender, args); + return false; //cmdMgr.parseCommand((Player) sender, args); + } + + + + /** + * Add Clazz d first Rank to player + * /class [add] [playername] [classname] {world} | Add user to a class + * + * @param sender of the Command + * @param player to promot ein class + * @param className + * @param world + * @return + */ + protected boolean cmdAddRank(Player sender, Player player, String className, String world) + { + /// ADD + // Check for Rank is always given + plugin.db.i("Check hasClass"); + if (hasClass(className, player, world)) + { + plugin.error(sender, + "Player " + FormatManager.formatPlayer(player.getName()) + + " already has the Clazz " + + ChatColor.RED + className + "!"); + plugin.msg(sender,"Use /class [rankup] [playername] {world} | Rank user up"); + return true; + } + + // ADD + plugin.db.i("Get TempRank"); + Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(className)); + + // ClassRank does not exist + if (tempRank == null) + { + plugin.error(sender,"The class you entered does not exist!"+className); + return true; + } + + + int rID = ClassManager.getRankIndex(tempRank, tempRank.getSuperClass()); // Index des Rank + // Track Rank +// if (plugin.trackRanks) +// { +//// rID = ClassManager.loadClassProcess(player, +//// tempRank.getSuperClass()); +// } + plugin.db.i("Get Rank Index : " + rID); + + // Check for money to rank up + // rankCosts stored in checkedCost + if (checkCost(sender, player , tempRank, rID) == false) + { + // not enough money message send to player and to promoter + plugin.error(player,"You don't have enough money to choose your class! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + plugin.error(sender,"The player don't have enough money ! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + return true; + + } + plugin.db.i("money check successful"); + + // check for experience to rank up + // expcost stored in checkedExp + if (checkExp(sender, player, tempRank, rID) == false) + { + // not enough exp message send to player and to promoter + plugin.error(player,"You don't have enough experience! You need "+ checkedExp); + plugin.error(sender,"Player don't have enough experience! You need "+ checkedExp); + return true; + } + plugin.db.i("Exp check done"); + + // check items for rank up + if (checkitems(sender, player , tempRank, rID) == false) + { + // not enough items message send to player and to promoter + plugin.error(player,"You don't have enough items!"); + plugin.error(sender,"Player don't have enough items!"); + return true; + } + + plugin.db.i("item check done"); + + String cPermName = tempRank.getPermName(); // Display rank name + String cDispName = tempRank.getDispName(); // Display rank name + ChatColor c_Color = tempRank.getColor(); // Rank color + + // success! + + // Do Cost and Addrank + if (checkedCost > 0) + { + ClassRanks.economy.withdrawPlayer(player.getName(), checkedCost); + plugin.msg(player, "You paid " + checkedCost + " money !"); + plugin.msg(sender, "Player paid " + checkedCost + " money !"); + } + + if (checkedExp > 0) + { + player.setTotalExperience(player.getTotalExperience() - checkedExp); + plugin.msg(player, "You paid " + checkedExp + " experience points!"); + plugin.msg(player, "Player paid " + checkedExp + " experience points!"); + } + + if (plugin.config.isCheckitems()) + { + plugin.pm.takeItems(player, checkedItems); + plugin.msg(player, "You paid the required items!"); + plugin.msg(player, "Player paid the required items!"); + } + + // remove oldRank + plugin.db.i("isClearRanks : " + plugin.config.isClearranks()); + if (plugin.config.isClearranks()) + { + plugin.perms.removeGroups(player); + plugin.error(sender, "The old perms are removed !"); + plugin.db.i("Remove Groups from Permission"); + } + +// world = plugin.config.isDefaultrankallworlds() ? "all" : player.getWorld().getName(); + if (plugin.config.isDefaultrankallworlds()) + { + plugin.perms.rankAddGlobal(player, cPermName); + } else + { + plugin.perms.rankAdd(player, cPermName); + } + plugin.config.playerSectionWrite(player, className, cPermName); + + plugin.db.i("Added Class + Rank to config"); + plugin.db.i("Added Group to Permission"); + plugin.msg(sender,"Added Perms to Group "+cPermName); + + if (plugin.config.isRankpublic() ) + { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] " + FormatManager.formatPlayer(player.getName()) + + " now is a " + c_Color + cDispName); + return true; + } else + { + plugin.msg(player, "You now are in Class " + c_Color + cDispName); + return true; + } +//END ADD / REMOVE + } + + /** + * Send command Info for /rank to player + * @param pPlayer + */ + protected void cmdRankDownInfo (Player pPlayer) + { + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/rankdown [classname] | rankdown for yourself"); + plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); + + } + + + /** + * Prueft die Command Parameter auf World + * @param args + * @return + */ + protected boolean isWorld (String[] args) + { + if (args.length > 3) + { + return true; + } else + { + return false; + } + } + + /** + * Setzt World Parameter oder default wert "all" + * @param world + * @param args + * @return + */ + protected String getWorldArg(String world, String[] args) + { + + if (isWorld(args)) + { + // => /class add *player* *classname* world + return args[3]; + } else + { + if (plugin.config.isDefaultrankallworlds()) + { + return "all"; + } else + { + return world; + } + + } + } + + + protected boolean hasAdminPerms(Player player) + { + if (player.isOp()) + { + return true; + } + if (plugin.perms.hasPerms(player,"classranks.admin.addremove", player.getWorld().getName())) + { + return true; + } + // only if we are NOT op or may NOT add/remove classes + return false; + } + + protected String getClassName(String className) + { + for (Clazz oClass : ClassManager.getClasses()) + { + // check Classname + if (className.equalsIgnoreCase(oClass.name)) + { + return oClass.name; + } + } + return ""; + } + + /** + * + * @param className + * @param playerName + * @param world + * @return + */ + protected Rank hasRank(String className, Player player, String world) + { + ArrayList classes = ClassManager.getClasses(); + String sPermName = ""; + Rank isRank = null; + for (Clazz oClass : classes) + { + // check Classname + if (className.equalsIgnoreCase(oClass.name)) + { + plugin.db.i("Found : " + oClass.name); +// ArrayList ranks = oClass.ranks; + // check for each Rank the permName in permissionsgroups + for (Rank rank : oClass.ranks) + { + sPermName = rank.getPermName(); + plugin.db.i("Search Perm : " + sPermName); + // pruefe ob Permname als group vorhanden ist + // wenn gefunden , setze reult rank + if (hasPlayerGroup(sPermName, player)) + { + isRank = rank; + return rank; + } + } + + } + } + return isRank; + } + + + protected void removeRanks(String className, Player player, String world) + { + ArrayList classes = ClassManager.getClasses(); + String sPermName = ""; + for (Clazz oClass : classes) + { + // check Classname + if (className.equalsIgnoreCase(oClass.name)) + { + plugin.db.i("Found : " + oClass.name); + for (Rank rank : oClass.ranks) + { + sPermName = rank.getPermName(); + plugin.db.i("Search Perm : " + sPermName); + // pruefe ob Permname als group vorhanden ist + // wenn gefunden , remove groups + if (hasPlayerGroup(sPermName, player)) + { + if (plugin.config.isDefaultrankallworlds()) + { + plugin.perms.rankRemoveGlobal(player, sPermName); + } else + { + plugin.perms.rankRemove(player, sPermName); + } + } + } + + } + } + } + + + protected boolean hasPlayerGroup(String PermName, Player player) + { + plugin.db.i("Check group : " + PermName); + String[] list = plugin.perms.getPlayerGroups(player); + boolean isPerm = false; + for (int i = 0; i < list.length; i++) + { + plugin.db.i("Check " + i + " : " + list[i]); + if(list[i].equalsIgnoreCase(PermName)) + { + isPerm = true; + } + } + return isPerm; + } + + /** + * Sucht das Clazz Array nach dem Classnamen + * und sucht die Group zu den Raengen + * TRUE , wenn Group gesetzt + * + * @param className + * @param playerName + * @param world + * @return + */ + protected boolean hasClass(String className, Player player, String world) + { + ArrayList classes = ClassManager.getClasses(); + String sPermName = ""; + boolean isClass = false; + plugin.db.i("SearchClass : " + className); + for (Clazz oClass : classes) + { + // pruefe ob KLassenname identisch + if (className.equalsIgnoreCase(oClass.name)) + { + plugin.db.i("Found : " + oClass.name); +// ArrayList ranks = oClass.getRanks(); + for (Rank rank : oClass.ranks) + { + sPermName = rank.getPermName(); + plugin.db.i("Search Perm : " + sPermName); + // pruefe ob Permname als group vorhanden ist + // wenn gefunden , setze result + if (hasPlayerGroup(sPermName, player)) + { + plugin.db.i("HasPerm : " + sPermName); + isClass = true; + return true; + } + } + + } + } + return isClass; + } + + + /** + * Durchsucht die ClassList nach dem ClassNamen + * @param ClassRank + * @return + */ + protected boolean existClass( String className) + { + ArrayList classes = ClassManager.getClasses(); + for (Clazz oClass : classes) + { + // pruefe ob KLassenname identisch + if (className.equalsIgnoreCase(oClass.name)) + { + return true; + } + } + return false; + } + + + + /** + * Check the Rank cost with default value and individual value + * @param sender , command sneder + * @param player , ranked player + * @param rank , new rank + * @param rID , index of rank in Clazz + * @return true = cost available or not relevant / false = not enough money + */ + protected boolean checkCost(Player sender, Player player , Rank rank, int rID) + { + plugin.db.i("Get Rank Cost"); + double rank_cost = 0; // tempvalue + + // get default cost from Config table + rank_cost = plugin.config.getMoneyCost(rID); + + // get individual rank cost + if (rank.getCost() != -1337D) + { + rank_cost = rank.getCost(); + } + plugin.db.i("Get Rank Cost : " + rank_cost); + + // Check if the player has got the money + // check loaded economy + plugin.db.i("Check economy"); + if (ClassRanks.economy != null) + { + plugin.db.i("Economy found : " + ClassRanks.economy.getName() ); + plugin.db.i("isCheckCost : " + plugin.config.isCheckprices()); + // should Cost be checked + if (plugin.config.isCheckprices()) + { + if (ClassRanks.economy.getBalance(player.getName()) < rank_cost) + { + plugin.db.i("money check NOT successful"); + checkedCost = rank_cost; + plugin.error(player,"You don't have enough money! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + return false; + } else + { + plugin.db.i("money check NOT successful"); + checkedCost = rank_cost; + return true; + } + } else + { + plugin.db.i("money check successful"); + checkedCost = rank_cost; + return true; + } + } else if (plugin.method != null) + { + plugin.db.i("No economy found, use Method : " + plugin.method.getName()); + plugin.db.i("isCheckCost" + plugin.config.isCheckprices()); + // should cost be checked + if (plugin.config.isCheckprices()) + { + MethodAccount ma = plugin.method.getAccount(player.getName()); + if (!ma.hasEnough(rank_cost)) + { + checkedCost = rank_cost; + return false; + } else + { + plugin.db.i("money check NOT successful"); + checkedCost = rank_cost; + return false; + } + } else + { + plugin.db.i("money check successful"); + checkedCost = rank_cost; + return true; + } + } else + { + plugin.db.i("money check done, NO economy"); + checkedCost = 0.0; + return true; + } + } + + + protected boolean checkExp(Player sender, Player player , Rank rank, int rID) + { + int exp_cost = -1; + // get default exp cost from config + exp_cost = plugin.config.getExpCost(rID); + + // get individual expCost from rank + if (rank.getExp() > 0) + { + exp_cost = rank.getExp(); + } + plugin.db.i("Get ExpCost : " + exp_cost); + + plugin.db.i("isCheckExp : " + plugin.config.isCheckexp()); + if (plugin.config.isCheckexp()) + { + if (player.getTotalExperience() < exp_cost) { + plugin.error(player, + "You don't have enough experience! You need " + + exp_cost); + checkedExp = exp_cost; + return false; + } else + { + plugin.db.i("exp check successful"); + checkedExp = exp_cost; + return true; + } + } else + { + plugin.db.i("exp check not relevant"); + checkedExp = 0; + return true; + } + } + + /** + * Check the default and rank items against player inventory + * + * @param sender , promoter + * @param player , ranked player + * @param rank , new Rank + * @param rID , Index actual Rank + * @return true = items available, not relevant, false = items not available + */ + protected boolean checkitems(Player sender, Player player , Rank rank, int rID) + { + + ItemStack[] items = null; + ItemStack[][] rankItems = plugin.config.getRankItems(); // per rank a list of items + + items = rankItems[rID]; + + if (rank.getItemstacks() != null) + { + items = rank.getItemstacks(); + } + + if (plugin.config.isCheckitems()) + { + plugin.db.i("Get Item Cost : " + items.length); + plugin.db.i("isCheckItems : " + plugin.config.isCheckitems()); + plugin.db.i("item check start"); + plugin.db.i("Player "+player.getName()); + if (plugin.pm.hasItems(player, items) == false) + { + plugin.error(player,"You don't have enough items!"); + return false; + } else + { + plugin.db.i("Items found "); + checkedItems = items; + return true; + + } + } else + { + plugin.db.i("No Items found !"); + plugin.db.i("item check NOT relevant"); + checkedItems = null; + return true; + } + + } + + /** + * This function provides the main ranking process - including error + * messages when stuff is not right. Parameter check must be done before. + * processes rank up / down + *

+	 * - check cooldown for player
+	 * - get old rank 
+	 * - calculate new rank
+	 * - check money, exp, items for new rank 
+	 * - eventually delete from old rank 
+	 * - add to new rank
+	 * 
+ */ + protected boolean rankUp(Player sender, Player player, String className, String world) + { + plugin.db.i("ranking " + player.getName() + " : " + className); + + plugin.db.i("CoolDown Check for " + player.getName()); + int cDown = plugin.pm.coolDownCheck(player); + if (cDown > 0) + { + plugin.error(sender, + "You have to wait " + ChatColor.RED + String.valueOf(cDown) + + ChatColor.WHITE + " seconds!"); + return true; // cooldown timer still counting => OUT! + } + plugin.db.i("cooldown check positive"); + + if ((!plugin.perms.hasPerms(sender, "classranks.rankup", player.getWorld().getName()))) + { + // if we either are no OP or try to rank down, but we may not + plugin.msg(sender, "You don't have permission to rank up!"); + return true; + } + plugin.db.i("perm check successful"); + + + String playerName = player.getName(); // store the player we want to + + +// Boolean self = true; // we want to change ourselves ... maybe + + // does player have a rank? + Rank rank = null; // actual Rank + if (hasClass(className, player, world)) + { + rank = hasRank( className, player, world); + if (rank == null) + { + plugin.msg(player, "You " + " are not in this class !"); + return true; + } + } else + { + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " not in class "+ className); + return true; + } + + plugin.db.i("rank check successful"); + + String cDispName = rank.getDispName(); // actual Display rank name + ChatColor c_Color = rank.getColor(); // actual Rank color + Clazz oClass = rank.getSuperClass(); // actual Rank class + + int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank + int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank + plugin.db.i("rank " + rID + " of " + iMaxRank); + // placeholder: cost +// double rank_cost = 0; + + // we want to rank up! + if (rID >= iMaxRank) + { + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " is in MaxRank of class "+ className); + return true; + } + + Rank tempRank = ClassManager.getNextRank(rank, rID); // New Rank + + // Check for money to rank up + // rankCosts stored in checkedCost + if (checkCost(sender, player , tempRank, rID+1)== false) + { + // not enough money message send to player and to promoter + plugin.msg(sender,"The player don't have enough money ! (" + + ClassRanks.economy.format(checkedCost) + +"/ "+ClassRanks.economy.getBalance(player.getName()) + + ")"); + return true; + + } + plugin.db.i("money check successful"); + + // check for experience to rank up + // expcost stored in checkedExp + if (checkExp(sender, player, tempRank, rID+1) == false) + { + // not enough exp message send to player and to promoter + plugin.error(sender,"Player don't have enough experience! Need "+ checkedExp); + return true; + } + plugin.db.i("Exp check done"); + + // check items for rank up + if (!checkitems(sender, player , tempRank, rID+1)) + { + // not enough items message send to player and to promoter + plugin.error(sender,"Player don't have enough items!"); + return true; + } + + plugin.db.i("item check done"); + +// cPermName = tempRank.getPermName(); // Display new rank name + cDispName = tempRank.getDispName(); // Display new rank name + c_Color = tempRank.getColor(); // new Rank color + + // success! + + // Do Cost and Addrank + if (checkedCost > 0) + { + ClassRanks.economy.withdrawPlayer(player.getName(), checkedCost); + plugin.msg(player, "You paid " + checkedCost + " money !"); + plugin.msg(sender, "Player paid " + checkedCost + " money !"); + } + + if (checkedExp > 0) + { + player.setTotalExperience(player.getTotalExperience() - checkedExp); + plugin.msg(player, "You paid " + checkedExp + " experience points!"); + plugin.msg(player, "Player paid " + checkedExp + " experience points!"); + } + + if (plugin.config.isCheckitems()) + { + plugin.pm.takeItems(player, checkedItems); + plugin.msg(player, "You paid the required items!"); + plugin.msg(player, "Player paid the required items!"); + } + + plugin.db.i(">>>> remove old rank..."); + plugin.perms.rankRemove(player, rank.getPermName()); // do it! + + plugin.db.i(">>>> adding new rank..."); + plugin.perms.rankAdd(player, tempRank.getPermName()); + plugin.config.playerSectionWrite(player, className, tempRank.getPermName()); + + + if (plugin.config.isRankpublic()) + { + // we rank ourselves and do NOT want that to be public + plugin.msg(sender, + " Player " + FormatManager.formatPlayer(playerName) + + " now a " + c_Color + cDispName + ChatColor.WHITE + + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + + "!"); + plugin.msg(player, + "You are now a " + c_Color + cDispName + ChatColor.WHITE + + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + + "!"); + } else + { + plugin.getServer().broadcastMessage( + "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE + + "] Player " + FormatManager.formatPlayer(playerName) + + " now is a " + c_Color + cDispName + + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + + "!"); + } + + return true; } + + + /** + * rankdown a player in the given Clazz and Wold + * + * @param sender + * @param player + * @param className + * @param world + * @return + */ + protected boolean rankDown(Player sender, Player player, String className, String world) + { + plugin.db.i("ranking " + player.getName() + " : " + className); + + plugin.db.i("CoolDown Check for " + player.getName()); + int cDown = plugin.pm.coolDownCheck(player); + if (cDown > 0) + { + plugin.error(sender, + "You have to wait " + ChatColor.RED + String.valueOf(cDown) + + ChatColor.WHITE + " seconds!"); + return true; // cooldown timer still counting => OUT! + } + plugin.db.i("cooldown check positive"); + + if ((!plugin.perms.hasPerms(sender, "classranks.rankdown", player.getWorld().getName()))) + { + // if we either are no OP or try to rank down, but we may not + plugin.error(sender, "You don't have permission to rank down!"); + return true; + } + plugin.db.i("perm check successful"); + + String playerName = player.getName(); // store the player we want to + + +// Boolean self = true; // we want to change ourselves ... maybe + + // does player have a rank? + Rank rank = null; // actual Rank + if (hasClass(className, player, world)) + { + rank = hasRank( className, player, world); + if (rank == null) + { + plugin.error(sender, "Player " + FormatManager.formatPlayer(playerName) + + " does not have a class !"); + return true; + } + } else + { + plugin.error(sender, "Player " + FormatManager.formatPlayer(playerName) + + " not in class "+ className); + return true; + } + + plugin.db.i("rank check successful"); + + Clazz oClass = rank.getSuperClass(); // actual Rank class + + int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank + int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank + plugin.db.i("rank " + rID + " of " + iMaxRank); + + if (rID < 1) + { + // We are at lowest rank + plugin.error(sender, "Player " + FormatManager.formatPlayer(playerName) + " already at lowest rank!"); + return true; + } + if (plugin.config.isDefaultrankallworlds()) + { + plugin.perms.rankRemoveGlobal(player, rank.getPermName()); // do it! + + } else + { + plugin.perms.rankRemove(player, rank.getPermName()); // do it! + } + + Rank tempRank = ClassManager.getPrevRank(rank, rID); + plugin.perms.rankAdd(player, tempRank.getPermName()); + plugin.config.playerSectionWrite(player, className, tempRank.getPermName()); + plugin.db.i("Rank Down to" + tempRank.getDispName()); + plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + + " Rank Down to " + tempRank.getDispName()); + return true; + } + } diff --git a/src/net/slipcor/classranks/commands/PlayerCommands.java b/src/net/slipcor/classranks/commands/PlayerCommands.java index ba28f59..09a5d70 100644 --- a/src/net/slipcor/classranks/commands/PlayerCommands.java +++ b/src/net/slipcor/classranks/commands/PlayerCommands.java @@ -15,6 +15,8 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -29,17 +31,10 @@ * */ -public class PlayerCommands { - private final ClassRanks plugin; - private PlayerManager pm; - private DebugManager db; +public class PlayerCommands extends ClassCommand +{ - public double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs - public int[] expCost = new int[ClassManager.getClasses().size()]; // EXP - Double checkedCost; // checked cost for rank up / add - int checkedExp; // checked Exp Cost for rank up / add - ItemStack[] checkedItems; // checked list of required items for rank up / add // Costs // public boolean rankpublic; // do we spam changed to the public? @@ -47,310 +42,26 @@ public class PlayerCommands { // public ItemStack[][] rankItems; // public String[] signCheck = { null, null, null }; // SignCheck variable - public PlayerCommands(ClassRanks plugin) { - this.plugin = plugin; - this.pm = plugin.getPlayerManager(); - this.db = plugin.getDebugManager(); - } - - public boolean rankDown(Player sender, Player player, String className, String world) + public PlayerCommands(ClassRanks plugin) { - plugin.db.i("ranking " + player.getName() + " : " + className); - - plugin.db.i("CoolDown Check for " + player.getName()); - int cDown = pm.coolDownCheck(player); - if (cDown > 0) - { - plugin.msg(sender, - "You have to wait " + ChatColor.RED + String.valueOf(cDown) - + ChatColor.WHITE + " seconds!"); - return true; // cooldown timer still counting => OUT! - } - plugin.db.i("cooldown check positive"); - - if ((!plugin.perms.hasPerms(sender, "classranks.rankdown", player.getWorld().getName()))) - { - // if we either are no OP or try to rank down, but we may not - plugin.msg(sender, "You don't have permission to rank down!"); - return true; - } - plugin.db.i("perm check successful"); - - - String playerName = player.getName(); // store the player we want to - - -// Boolean self = true; // we want to change ourselves ... maybe - - // does player have a rank? - Rank rank = null; // actual Rank - if (hasClass(className, player, world)) - { - rank = hasRank( className, player, world); - if (rank == null) - { - plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) - + " does not have a class !"); - return true; - } - } else - { - plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) - + " not in class "+ className); - return true; - } - - plugin.db.i("rank check successful"); - - Clazz oClass = rank.getSuperClass(); // actual Rank class - - int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank - int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank - plugin.db.i("rank " + rID + " of " + iMaxRank); - - if (rID < 1) - { - // We are at lowest rank - plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) + " already at lowest rank!"); - return true; - } - if (plugin.config.isDefaultrankallworlds()) - { - plugin.perms.rankRemoveGlobal(player, rank.getPermName()); // do it! - - } else - { - plugin.perms.rankRemove(player, rank.getPermName()); // do it! - } + super(plugin); + } - Rank tempRank = ClassManager.getPrevRank(rank, rID); - plugin.perms.rankAdd(player, tempRank.getPermName()); - plugin.db.i("Rank Down to" + tempRank.getDispName()); - plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) - + " Rank Down to " + tempRank.getDispName()); - return true; - } - /** - * This function provides the main ranking process - including error - * messages when stuff is not right. Parameter check must be done before. - * processes rank up / down - *
-	 * - check cooldown for player
-	 * - get old rank 
-	 * - calculate new rank
-	 * - check money, exp, items for new rank 
-	 * - eventually delete from old rank 
-	 * - add to new rank
-	 * 
- */ - public boolean rankUp(Player sender, Player player, String className, String world) + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { - plugin.db.i("ranking " + player.getName() + " : " + className); - - plugin.db.i("CoolDown Check for " + player.getName()); - int cDown = pm.coolDownCheck(player); - if (cDown > 0) - { - plugin.msg(sender, - "You have to wait " + ChatColor.RED + String.valueOf(cDown) - + ChatColor.WHITE + " seconds!"); - return true; // cooldown timer still counting => OUT! - } - plugin.db.i("cooldown check positive"); - - if ((!plugin.perms.hasPerms(sender, "classranks.rankup", player.getWorld().getName()))) - { - // if we either are no OP or try to rank down, but we may not - plugin.msg(sender, "You don't have permission to rank up!"); - return true; - } - plugin.db.i("perm check successful"); - - - String playerName = player.getName(); // store the player we want to - - -// Boolean self = true; // we want to change ourselves ... maybe - - // does player have a rank? - Rank rank = null; // actual Rank - if (hasClass(className, player, world)) - { - rank = hasRank( className, player, world); - if (rank == null) - { - plugin.msg(player, "Player " + FormatManager.formatPlayer(playerName) - + " does not have a class !"); - return true; - } - } else - { - plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) - + " not in class "+ className); - return true; - } - - plugin.db.i("rank check successful"); - - String cDispName = rank.getDispName(); // actual Display rank name - ChatColor c_Color = rank.getColor(); // actual Rank color - Clazz oClass = rank.getSuperClass(); // actual Rank class - - int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank - int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank - plugin.db.i("rank " + rID + " of " + iMaxRank); - // placeholder: cost - double rank_cost = 0; - - // we want to rank up! - if (rID >= iMaxRank) - { - plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) - + " is in MaxRank of class "+ className); - return true; - } - // if we rank ourselves, that might cost money - // (otherwise, thats not the players problem ;) ) - try - { - rank_cost = moneyCost[rID + 1]; - } catch (Exception e) - { - ClassRanks.log("cost not set: "+(rID + 1), Level.WARNING); - rank_cost = 0; - } - - Rank tempRank = ClassManager.getNextRank(rank, rID); // New Rank -// if (rNext != null) -// { -// if (rNext.getCost() != -1337D) -// { -// rank_cost = rNext.getCost(); -// } -// } - - // Check for money to rank up - // rankCosts stored in checkedCost - if (checkCost(sender, player , tempRank, rID+1)== false) - { - // not enough money message send to player and to promoter - plugin.msg(player,"You don't have enough money to choose your class! (" - + ClassRanks.economy.format(checkedCost) - +"/ "+ClassRanks.economy.getBalance(player.getName()) - + ")"); - plugin.msg(sender,"The player don't have enough money ! (" - + ClassRanks.economy.format(checkedCost) - +"/ "+ClassRanks.economy.getBalance(player.getName()) - + ")"); - return true; - - } - plugin.db.i("money check successful"); - - // check for experience to rank up - // expcost stored in checkedExp - if (checkExp(sender, player, tempRank, rID+1) == false) - { - // not enough exp message send to player and to promoter - plugin.msg(player,"You don't have enough experience! You need "+ checkedExp); - plugin.msg(sender,"Player don't have enough experience! You need "+ checkedExp); - return true; - } - plugin.db.i("Exp check done"); - - // check items for rank up - if (!checkitems(sender, player , tempRank, rID+1)) - { - // not enough items message send to player and to promoter - plugin.msg(player,"You don't have enough items!"); - plugin.msg(sender,"Player don't have enough items!"); - return true; - } - - plugin.db.i("item check done"); - -// cPermName = tempRank.getPermName(); // Display new rank name - cDispName = tempRank.getDispName(); // Display new rank name - c_Color = tempRank.getColor(); // new Rank color - - // success! - - // Do Cost and Addrank - if (checkedCost > 0) - { - ClassRanks.economy.withdrawPlayer(player.getName(), checkedCost); - plugin.msg(player, "You paid " + checkedCost + " money !"); - plugin.msg(sender, "Player paid " + checkedCost + " money !"); - } - - if (checkedExp > 0) - { - player.setTotalExperience(player.getTotalExperience() - checkedExp); - plugin.msg(player, "You paid " + checkedExp + " experience points!"); - plugin.msg(player, "Player paid " + checkedExp + " experience points!"); - } - - if (plugin.config.isCheckitems()) - { - pm.takeItems(player, checkedItems); - plugin.msg(player, "You paid the required items!"); - plugin.msg(player, "Player paid the required items!"); - } - - plugin.perms.rankRemove(player, rank.getPermName()); // do it! - - plugin.db.i(">>>> adding new rank..."); - plugin.perms.rankAdd(player, tempRank.getPermName()); - - if ((rank_cost > 0)) - { - // take the money, inform the player - String text = - ChatColor.DARK_GREEN + "[" + ChatColor.WHITE - + "Money" + ChatColor.DARK_GREEN + "] " + ChatColor.RED - + "Your account had " + ChatColor.WHITE - + ClassRanks.economy.format(rank_cost) + ChatColor.RED - + " debited."; - - if (ClassRanks.economy != null) - { - ClassRanks.economy.withdrawPlayer(player.getName(), rank_cost); - sender.sendMessage(text); - } else if (plugin.method != null) - { - MethodAccount ma = plugin.method.getAccount(player.getName()); - ma.subtract(rank_cost); - sender.sendMessage(text); - } else - { - sender.sendMessage("NO Economy found!"); - } - } - - if (plugin.config.isRankpublic()) - { - // we rank ourselves and do NOT want that to be public - plugin.msg(sender, - " Player " + FormatManager.formatPlayer(playerName) - + " now a " + c_Color + cDispName + ChatColor.WHITE - + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) - + "!"); - plugin.msg(player, - "You are now a " + c_Color + cDispName + ChatColor.WHITE - + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) - + "!"); - } else - { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] Player " + FormatManager.formatPlayer(playerName) - + " now is a " + c_Color + cDispName - + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) - + "!"); - } - - return true; + if (!(sender instanceof Player)) + { + plugin.msg(sender, "Console access is not implemented. "); + plugin.msg(sender, "Because a player instance is necessary"); + return true; + } + // admin class command, parse it! + db.i("/classadmin detected! parsing..."); + return parseCommand((Player) sender, args); } + /** * Send command Info to player @@ -367,348 +78,14 @@ private void cmdCommandInfo (Player pPlayer) plugin.msg(pPlayer, ChatColor.YELLOW+"/class GROUPS {playername} | list the groups of user"); plugin.msg(pPlayer, ChatColor.GOLD+"need permissions "); plugin.msg(pPlayer, ChatColor.YELLOW+"/class ADD [playername] [classname] {world} | Add user to a class"); - plugin.msg(pPlayer, ChatColor.YELLOW+"/class REMOVE [playername] [classname] {world} | Remove user from a class"); - plugin.msg(pPlayer, ChatColor.YELLOW+"/class RANKUP [playername] {world} | Rank user up"); - plugin.msg(pPlayer, ChatColor.YELLOW+"/class RANKDOWN [playername] {world} | Rank user down"); - plugin.msg(pPlayer, ChatColor.YELLOW+"/class GET [playername] {world} | Show rank of user"); - - } - - /** - * Send command Info for /rank to player - * @param pPlayer - */ - private void cmdRankInfo (Player pPlayer) - { - plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); - plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); - plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); - plugin.msg(pPlayer, ChatColor.YELLOW+"/rank [classname] | Choose the class for yourself"); - plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); - - } - - /** - * Send command Info for /rankup to player - * @param pPlayer - */ - private void cmdRankUpInfo (Player pPlayer) - { - plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); - plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); - plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); - plugin.msg(pPlayer, ChatColor.YELLOW+"/rankup [classname] | rankup for yourself"); - plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); - - } - - /** - * Send command Info for /rank to player - * @param pPlayer - */ - private void cmdRankDownInfo (Player pPlayer) - { - plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); - plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); - plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); - plugin.msg(pPlayer, ChatColor.YELLOW+"/rankdown [classname] | rankdown for yourself"); - plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); - - } - - /** - * printout Classas and/or Clazz Ranks - * - * @param pPlayer - * @param args - */ - private void cmdList (Player pPlayer, String[] args) - { - - ArrayList classes = ClassManager.getClasses(); - if (args.length > 1) - { - for (Clazz c : classes) - { - if (c.name.equalsIgnoreCase(args[1]) ) - { - plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz "+ ChatColor.GREEN + c.name); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - for (Rank r : c.ranks) - { - plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); - } - } - } - } else - { - - plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz List"); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); - - for (Clazz c : classes) - { - if (c.name.startsWith("%") && !pPlayer.isOp()) - { - continue; - } - plugin.msg(pPlayer, "Clazz "+ ChatColor.GREEN + c.name); - } - } - - } - - /** - * printout player Clazz, Rank and world - * - * @param pPlayer - * @param args - */ - private void cmdGet (Player pPlayer, String[] args) - { - String world = pPlayer.getWorld().getName(); - if (args.length > 2) - { - world = args[2]; - } else { - world = "all"; - } - String playerName = pPlayer.getName(); - if (args.length > 1) - { - playerName = args[1]; - } - - plugin.msg(pPlayer, "Player " + FormatManager.formatPlayer(playerName)+ " Get in " + FormatManager.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); - - if (rank == null) - { - plugin.msg(pPlayer, "Player " + playerName - + " has no class in " + FormatManager.formatWorld(world) + "!"); - } else - { - - String cDispName = rank.getDispName(); // Display rank name - ChatColor c_Color = rank.getColor(); // Rank color - - plugin.msg(pPlayer, "" + playerName - + " is in " + c_Color + rank.getSuperClass().name + ChatColor.WHITE - + " as " + c_Color + cDispName + ChatColor.WHITE - + " in " + FormatManager.formatWorld(world) + "!"); - } - - } - - private void cmdConfig (Player pPlayer, String[] args) - { - pPlayer.sendMessage(ChatColor.YELLOW+"[ClassRanks] "+ChatColor.GREEN+"Configuration "); - pPlayer.sendMessage(ChatColor.YELLOW+"----------"+"Ver: " + ChatColor.GREEN+plugin.getDescription().getVersion()); - pPlayer.sendMessage(ChatColor.YELLOW+"OneClass : "+ChatColor.GREEN+plugin.config.isOnlyoneclass()); - pPlayer.sendMessage(ChatColor.YELLOW+"CheckExp : "+ChatColor.GREEN+plugin.config.isCheckexp()); - pPlayer.sendMessage(ChatColor.YELLOW+"CheckItem : "+ChatColor.GREEN+plugin.config.isCheckitems()); - pPlayer.sendMessage(ChatColor.YELLOW+"CheckMoney: "+ChatColor.GREEN+plugin.config.isCheckprices()); - pPlayer.sendMessage(ChatColor.YELLOW+"CoolDown: "+ChatColor.GREEN+plugin.config.getCoolDown()); - pPlayer.sendMessage(ChatColor.YELLOW+"ClearRanks: "+ChatColor.GREEN+plugin.config.isClearranks()); - pPlayer.sendMessage(ChatColor.YELLOW+"DefaultRankWorld: "+ChatColor.GREEN+plugin.config.isDefaultrankallworlds()); - pPlayer.sendMessage(ChatColor.YELLOW+"RankPublic: "+ChatColor.GREEN+plugin.config.isRankpublic()); - plugin.msg(pPlayer, ChatColor.YELLOW+" "); - } - - private void cmdUserGroups (Player pPlayer, String[] args) - { - String playerName = pPlayer.getName(); - // is there a player parameter, get it - if (args.length > 1) - { - playerName = args[1]; - } else - { - playerName = pPlayer.getName(); - } - String[] list = plugin.perms.getPlayerGroups(pPlayer); - if (list != null) - { - int max = list.length; - plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz "+ "User Groups of "+ChatColor.DARK_GREEN+playerName); - plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------------------"); - for (int i = 0; i < list.length; i++) - { - plugin.msg(pPlayer, ChatColor.YELLOW+": "+list[i]); - } - plugin.msg(pPlayer, ChatColor.YELLOW+"Count "+max+" ------------"); - } - - } - - private boolean hasAdminPerms(Player player) - { - if (player.isOp()) - { - return true; - } - if (plugin.perms.hasPerms(player,"classranks.admin.addremove", player.getWorld().getName())) - { - return true; - } - // only if we are NOT op or may NOT add/remove classes - return false; - } - - /** - * - * @param className - * @param playerName - * @param world - * @return - */ - private Rank hasRank(String className, Player player, String world) - { - ArrayList classes = ClassManager.getClasses(); - String sPermName = ""; - Rank isRank = null; - for (Clazz oClass : classes) - { - // check Classname - if (className.equalsIgnoreCase(oClass.name)) - { - plugin.db.i("Found : " + oClass.name); -// ArrayList ranks = oClass.ranks; - // check for each Rank the permName in permissionsgroups - for (Rank rank : oClass.ranks) - { - sPermName = rank.getPermName(); - plugin.db.i("Search Perm : " + sPermName); - // pruefe ob Permname als group vorhanden ist - // wenn gefunden , setze reult rank - if (hasPlayerGroup(sPermName, player)) - { - isRank = rank; - return rank; - } - } - - } - } - return isRank; - } - - - private void removeRanks(String className, Player player, String world) - { - ArrayList classes = ClassManager.getClasses(); - String sPermName = ""; - for (Clazz oClass : classes) - { - // check Classname - if (className.equalsIgnoreCase(oClass.name)) - { - plugin.db.i("Found : " + oClass.name); - for (Rank rank : oClass.ranks) - { - sPermName = rank.getPermName(); - plugin.db.i("Search Perm : " + sPermName); - // pruefe ob Permname als group vorhanden ist - // wenn gefunden , remove groups - if (hasPlayerGroup(sPermName, player)) - { - if (plugin.config.isDefaultrankallworlds()) - { - plugin.perms.rankRemoveGlobal(player, sPermName); - } else - { - plugin.perms.rankRemove(player, sPermName); - } - } - } - - } - } - } - - - private boolean hasPlayerGroup(String PermName, Player player) - { - plugin.db.i("Check group : " + PermName); - String[] list = plugin.perms.getPlayerGroups(player); - boolean isPerm = false; - for (int i = 0; i < list.length; i++) - { - plugin.db.i("Check " + i + " : " + list[i]); - if(list[i].equalsIgnoreCase(PermName)) - { - isPerm = true; - } - } - return isPerm; - } - - /** - * Sucht das Clazz Array nach dem Classnamen - * und sucht die Group zu den Raengen - * TRUE , wenn Group gesetzt - * - * @param className - * @param playerName - * @param world - * @return - */ - private boolean hasClass(String className, Player player, String world) - { - ArrayList classes = ClassManager.getClasses(); - String sPermName = ""; - boolean isClass = false; - plugin.db.i("SearchClass : " + className); - for (Clazz oClass : classes) - { - // pruefe ob KLassenname identisch - if (className.equalsIgnoreCase(oClass.name)) - { - plugin.db.i("Found : " + oClass.name); -// ArrayList ranks = oClass.getRanks(); - for (Rank rank : oClass.ranks) - { - sPermName = rank.getPermName(); - plugin.db.i("Search Perm : " + sPermName); - // pruefe ob Permname als group vorhanden ist - // wenn gefunden , setze result - if (hasPlayerGroup(sPermName, player)) - { - plugin.db.i("HasPerm : " + sPermName); - isClass = true; - return true; - } - } - - } - } - return isClass; + plugin.msg(pPlayer, ChatColor.YELLOW+"/class REMOVE [playername] [classname] {world} | Remove user from a class"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class RANKUP [playername] {world} | Rank user up"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class RANKDOWN [playername] {world} | Rank user down"); + plugin.msg(pPlayer, ChatColor.YELLOW+"/class GET [playername] {world} | Show rank of user"); + } - - /** - * Durchsucht die ClassList nach dem ClassNamen - * @param ClassRank - * @return - */ - private boolean existClass( String className) - { - ArrayList classes = ClassManager.getClasses(); - for (Clazz oClass : classes) - { - // pruefe ob KLassenname identisch - if (className.equalsIgnoreCase(oClass.name)) - { - return true; - } - } - return false; - } - - -// private void cmdTemp (Player pPlayer, String[] args) { -// -// } + /** * Remove Player from Rank * Args[0] = Subcommand @@ -754,37 +131,30 @@ private boolean cmdRemove(Player sender, String[] args) if (hasClass(className, player, world)) { - -// Rank rank = hasRank( className, player, world); -// if (rank == null) -// { -// plugin.msg(sender, "Player " + FormatManager.formatPlayer(playerName) -// + " does not have class : " + className); -// return true; -// } -// plugin.perms.rankRemove(world, player, rank.getPermName()); // do it! + className = getClassName(className); removeRanks(className, player, world); - System.out.println("debug : remove ready"); + plugin.config.playerSectionRemove(player, className); + // show public message if (plugin.config.isRankpublic() ) { // self remove successful! plugin.getServer().broadcastMessage(player+ - " are removed from rank " + ChatColor.RED + " are removed from class " + ChatColor.RED + className + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + "!"); } else { // self remove successful! - plugin.msg(player,"You are removed from rank " + ChatColor.RED + plugin.msg(player,ChatColor.GREEN+"Class removed " + ChatColor.RED + className + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + "!"); - if (!(sender == player)) + if ((sender.getUniqueId() != player.getUniqueId())) { // self remove successful! - plugin.msg(sender,playerName+" are removed from rank " + ChatColor.RED + plugin.msg(sender,playerName+" are removed from class " + ChatColor.RED + className + ChatColor.WHITE + " in " + FormatManager.formatWorld(world) + "!"); @@ -794,363 +164,133 @@ private boolean cmdRemove(Player sender, String[] args) return true; } + + /** - * Check the Rank cost with default value and individual value - * @param sender , command sneder - * @param player , ranked player - * @param rank , new rank - * @param rID , index of rank in Clazz - * @return true = cost available or not relevant / false = not enough money + * printout Classas and/or Clazz Ranks + * + * @param pPlayer + * @param args */ - private boolean checkCost(Player sender, Player player , Rank rank, int rID) + private void cmdList (Player pPlayer, String[] args) { - plugin.db.i("Get Rank Cost"); - double rank_cost = 0; // tempvalue - // get default cost from Config table - rank_cost = plugin.config.getMoneyCost(rID); - - // get individual rank cost - if (rank.getCost() != -1337D) - { - rank_cost = rank.getCost(); - } - plugin.db.i("Get Rank Cost : " + rank_cost); - - // Check if the player has got the money - // check loaded economy - plugin.db.i("Check economy"); - if (ClassRanks.economy != null) + ArrayList classes = ClassManager.getClasses(); + if (args.length > 1) { - plugin.db.i("Economy found : " + ClassRanks.economy.getName() ); - plugin.db.i("isCheckCost : " + plugin.config.isCheckprices()); - // should Cost be checked - if (plugin.config.isCheckprices()) + for (Clazz c : classes) { - if (ClassRanks.economy.getBalance(player.getName()) < rank_cost) - { - plugin.db.i("money check NOT successful"); - checkedCost = rank_cost; - return false; - } else + if (c.name.equalsIgnoreCase(args[1]) ) { - plugin.db.i("money check NOT successful"); - checkedCost = rank_cost; - return true; + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz "+ ChatColor.GREEN + c.name); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + for (Rank r : c.ranks) + { + plugin.msg(pPlayer, "=> " + r.getColor() + r.getDispName()); + } } - } else - { - plugin.db.i("money check successful"); - checkedCost = rank_cost; - return true; } - } else if (plugin.method != null) + } else { - plugin.db.i("No economy found, use Method : " + plugin.method.getName()); - plugin.db.i("isCheckCost" + plugin.config.isCheckprices()); - // should cost be checked - if (plugin.config.isCheckprices()) + + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Clazz List"); + plugin.msg(pPlayer, ChatColor.YELLOW+"--------------------"); + + for (Clazz c : classes) { - MethodAccount ma = plugin.method.getAccount(player.getName()); - if (!ma.hasEnough(rank_cost)) - { - checkedCost = rank_cost; - return false; - } else + if (c.name.startsWith("%") && !pPlayer.isOp()) { - plugin.db.i("money check NOT successful"); - checkedCost = rank_cost; - return false; + continue; } - } else - { - plugin.db.i("money check successful"); - checkedCost = rank_cost; - return true; + plugin.msg(pPlayer, "Clazz "+ ChatColor.GREEN + c.name); } - } else - { - plugin.db.i("money check done, NO economy"); - checkedCost = 0.0; - return true; - } - } - - - private boolean checkExp(Player sender, Player player , Rank rank, int rID) - { - int exp_cost = -1; - // get default exp cost from config - exp_cost = plugin.config.getExpCost(rID); - - // get individual expCost from rank - if (rank.getExp() > 0) - { - exp_cost = rank.getExp(); } - plugin.db.i("Get ExpCost : " + exp_cost); - plugin.db.i("isCheckExp : " + plugin.config.isCheckexp()); - if (plugin.config.isCheckexp()) - { - if (player.getTotalExperience() < exp_cost) { - plugin.msg(player, - "You don't have enough experience! You need " - + exp_cost); - checkedExp = exp_cost; - return false; - } else - { - plugin.db.i("exp check successful"); - checkedExp = exp_cost; - return true; - } - } else - { - plugin.db.i("exp check not relevant"); - checkedExp = 0; - return true; - } } - - /** - * Check the default and rank items against player inventory - * - * @param sender , promoter - * @param player , ranked player - * @param rank , new Rank - * @param rID , Index actual Rank - * @return true = items available, not relevant, false = items not available - */ - private boolean checkitems(Player sender, Player player , Rank rank, int rID) - { - - ItemStack[] items = null; - ItemStack[][] rankItems = plugin.config.getRankItems(); // per rank a list of items - - items = rankItems[rID]; - if (rank.getItemstacks() != null) - { - items = rank.getItemstacks(); - } - - if (plugin.config.isCheckitems()) - { - plugin.db.i("Get Item Cost : " + items.length); - plugin.db.i("isCheckItems : " + plugin.config.isCheckitems()); - plugin.db.i("item check start"); - plugin.db.i("Player "+player.getName()); - if (pm.hasItems(player, items) == false) - { - return false; - } else - { - plugin.db.i("Items found "); - checkedItems = items; - return true; - - } - } else - { - plugin.db.i("No Items found !"); - plugin.db.i("item check NOT relevant"); - checkedItems = null; - return true; - } - - } - /** - * Add Clazz d first Rank to player - * /class [add] [playername] [classname] {world} | Add user to a class + * printout player Clazz, Rank and world * - * @param sender of the Command - * @param player to promot ein class - * @param className - * @param world - * @return + * @param pPlayer + * @param args */ - private boolean cmdAddRank(Player sender, Player player, String className, String world) + private void cmdGet (Player pPlayer, String[] args) { - /// ADD - // Check for Rank is always given - plugin.db.i("Check hasClass"); - if (hasClass(className, player, world)) - { - plugin.error(sender, - "Player " + FormatManager.formatPlayer(player.getName()) - + " already has the Clazz " - + ChatColor.RED + className + "!"); - plugin.msg(sender,"Use /class [rankup] [playername] {world} | Rank user up"); - return true; - } - - // ADD - plugin.db.i("Get TempRank"); - Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(className)); - - // ClassRank does not exist - if (tempRank == null) - { - plugin.error(sender,"The class you entered does not exist!"+className); - return true; - } - - - int rID = ClassManager.getRankIndex(tempRank, tempRank.getSuperClass()); // Index des Rank - // Track Rank -// if (plugin.trackRanks) -// { -//// rID = ClassManager.loadClassProcess(player, -//// tempRank.getSuperClass()); -// } - plugin.db.i("Get Rank Index : " + rID); - - // Check for money to rank up - // rankCosts stored in checkedCost - if (checkCost(sender, player , tempRank, rID) == false) - { - // not enough money message send to player and to promoter - plugin.error(player,"You don't have enough money to choose your class! (" - + ClassRanks.economy.format(checkedCost) - +"/ "+ClassRanks.economy.getBalance(player.getName()) - + ")"); - plugin.error(sender,"The player don't have enough money ! (" - + ClassRanks.economy.format(checkedCost) - +"/ "+ClassRanks.economy.getBalance(player.getName()) - + ")"); - return true; - - } - plugin.db.i("money check successful"); - - // check for experience to rank up - // expcost stored in checkedExp - if (checkExp(sender, player, tempRank, rID) == false) + String world = pPlayer.getWorld().getName(); + if (args.length > 2) { - // not enough exp message send to player and to promoter - plugin.error(player,"You don't have enough experience! You need "+ checkedExp); - plugin.error(sender,"Player don't have enough experience! You need "+ checkedExp); - return true; + world = args[2]; + } else { + world = "all"; } - plugin.db.i("Exp check done"); - - // check items for rank up - if (checkitems(sender, player , tempRank, rID) == false) + String playerName = pPlayer.getName(); + if (args.length > 1) { - // not enough items message send to player and to promoter - plugin.error(player,"You don't have enough items!"); - plugin.error(sender,"Player don't have enough items!"); - return true; + playerName = args[1]; } - - plugin.db.i("item check done"); - - String cPermName = tempRank.getPermName(); // Display rank name - String cDispName = tempRank.getDispName(); // Display rank name - ChatColor c_Color = tempRank.getColor(); // Rank color - // success! + plugin.msg(pPlayer, "Player " + FormatManager.formatPlayer(playerName)+ " Get in " + FormatManager.formatWorld(world) + "!"); + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); - // Do Cost and Addrank - if (checkedCost > 0) + if (rank == null) { - ClassRanks.economy.withdrawPlayer(player.getName(), checkedCost); - plugin.msg(player, "You paid " + checkedCost + " money !"); - plugin.msg(sender, "Player paid " + checkedCost + " money !"); - } - - if (checkedExp > 0) + plugin.msg(pPlayer, "Player " + playerName + + " has no class in " + FormatManager.formatWorld(world) + "!"); + } else { - player.setTotalExperience(player.getTotalExperience() - checkedExp); - plugin.msg(player, "You paid " + checkedExp + " experience points!"); - plugin.msg(player, "Player paid " + checkedExp + " experience points!"); - } - if (plugin.config.isCheckitems()) - { - pm.takeItems(player, checkedItems); - plugin.msg(player, "You paid the required items!"); - plugin.msg(player, "Player paid the required items!"); - } - - // remove oldRank - plugin.db.i("isClearRanks : " + plugin.config.isClearranks()); - if (plugin.config.isClearranks()) - { - plugin.perms.removeGroups(player); - plugin.error(sender, "The old perms are removed !"); - plugin.db.i("Remove Groups from Permission"); - } + String cDispName = rank.getDispName(); // Display rank name + ChatColor c_Color = rank.getColor(); // Rank color -// world = plugin.config.isDefaultrankallworlds() ? "all" : player.getWorld().getName(); - if (plugin.config.isDefaultrankallworlds()) - { - plugin.perms.rankAddGlobal(player, cPermName); - } else - { - plugin.perms.rankAdd(player, cPermName); + plugin.msg(pPlayer, "" + playerName + + " is in " + c_Color + rank.getSuperClass().name + ChatColor.WHITE + + " as " + c_Color + cDispName + ChatColor.WHITE + + " in " + FormatManager.formatWorld(world) + "!"); } - plugin.db.i("Added Group to Permission"); - plugin.msg(sender,"Added Perms to Group "+cPermName); - if (plugin.config.isRankpublic() ) - { - plugin.getServer().broadcastMessage( - "[" + ChatColor.AQUA + plugin.getConfig().getString("prefix") + ChatColor.WHITE - + "] " + FormatManager.formatPlayer(player.getName()) - + " now is a " + c_Color + cDispName); - return true; - } else - { - plugin.msg(player, "You now are in Class " + c_Color + cDispName); - return true; - } -//END ADD / REMOVE } - - /** - * Prueft die Command Parameter auf World - * @param args - * @return - */ - private boolean isWorld (String[] args) + + private void cmdConfig (Player pPlayer, String[] args) { - if (args.length > 3) - { - return true; - } else - { - return false; - } + pPlayer.sendMessage(ChatColor.YELLOW+"[ClassRanks] "+ChatColor.GREEN+"Configuration "); + pPlayer.sendMessage(ChatColor.YELLOW+"----------"+"Ver: " + ChatColor.GREEN+plugin.getDescription().getVersion()); + pPlayer.sendMessage(ChatColor.YELLOW+"OneClass : "+ChatColor.GREEN+plugin.config.isOnlyoneclass()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckExp : "+ChatColor.GREEN+plugin.config.isCheckexp()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckItem : "+ChatColor.GREEN+plugin.config.isCheckitems()); + pPlayer.sendMessage(ChatColor.YELLOW+"CheckMoney: "+ChatColor.GREEN+plugin.config.isCheckprices()); + pPlayer.sendMessage(ChatColor.YELLOW+"CoolDown: "+ChatColor.GREEN+plugin.config.getCoolDown()); + pPlayer.sendMessage(ChatColor.YELLOW+"ClearRanks: "+ChatColor.GREEN+plugin.config.isClearranks()); + pPlayer.sendMessage(ChatColor.YELLOW+"DefaultRankWorld: "+ChatColor.GREEN+plugin.config.isDefaultrankallworlds()); + pPlayer.sendMessage(ChatColor.YELLOW+"RankPublic: "+ChatColor.GREEN+plugin.config.isRankpublic()); + plugin.msg(pPlayer, ChatColor.YELLOW+" "); } - /** - * Setzt World Parameter oder default wert "all" - * @param world - * @param args - * @return - */ - private String getWorldArg(String world, String[] args) + private void cmdUserGroups (Player pPlayer, String[] args) { - - if (isWorld(args)) + String playerName = pPlayer.getName(); + // is there a player parameter, get it + if (args.length > 1) { - // => /class add *player* *classname* world - return args[3]; + playerName = args[1]; } else { - if (plugin.config.isDefaultrankallworlds()) - { - return "all"; - } else + playerName = pPlayer.getName(); + } + String[] list = plugin.perms.getPlayerGroups(pPlayer); + if (list != null) + { + int max = list.length; + plugin.msg(pPlayer, ChatColor.YELLOW+"-------------------------------------------"); + plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Class "+ "User Groups of "+ChatColor.DARK_GREEN+playerName); + for (int i = 0; i < list.length; i++) { - return world; + plugin.msg(pPlayer, ChatColor.YELLOW+": "+list[i]); } - + plugin.msg(pPlayer, ChatColor.YELLOW+"Count "+max+" ------------"); } + } + @@ -1176,6 +316,7 @@ private String getWorldArg(String world, String[] args) * @param args , arguments of the Command /class * @return */ + public boolean parseCommand(Player pPlayer, String[] args) { // Player player = pPlayer; @@ -1204,7 +345,7 @@ public boolean parseCommand(Player pPlayer, String[] args) if (args[0].equalsIgnoreCase("info")) { - plugin.msg(pPlayer,"Not implementedt yet !"); + plugin.msg(pPlayer,ChatColor.RED+"Not implementedt yet !"); } // GET if (args[0].equalsIgnoreCase("get")) { @@ -1240,13 +381,13 @@ public boolean parseCommand(Player pPlayer, String[] args) return rankUp(pPlayer, player, className, world); } else { - plugin.msg(pPlayer,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); - plugin.msg(pPlayer," /class [rankup] [playername] [classname] {world} | Rank user up"); + plugin.msg(pPlayer,ChatColor.RED+"Not enough arguments ( 2 )!"); + plugin.msg(pPlayer,ChatColor.GREEN+" /class [rankup] [playername] [classname] {world} | Rank user up"); return true; } } else { - plugin.msg(pPlayer, "You don't have the right permission !"); + plugin.error(pPlayer, "You don't have the right permission !"); } } @@ -1270,14 +411,14 @@ public boolean parseCommand(Player pPlayer, String[] args) return rankDown(pPlayer, player, className, world); } else { - plugin.msg(pPlayer,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); - plugin.msg(pPlayer," /class [rankdown] [playername] [classname] {world} | Rank user down"); + plugin.msg(pPlayer,ChatColor.RED+"Not enough arguments ( 2 )!"); + plugin.msg(pPlayer,ChatColor.GREEN+" /class [rankdown] [playername] [classname] {world} | Rank user down"); return true; } } else { - plugin.msg(pPlayer, "You don't have the right permission !"); + plugin.error(pPlayer, "You don't have the right permission !"); } } @@ -1293,7 +434,7 @@ public boolean parseCommand(Player pPlayer, String[] args) cmdRemove(pPlayer, args); } else { - plugin.msg(pPlayer, "You don't have the right permission !"); + plugin.error(pPlayer, "You don't have the right permission !"); return true; } @@ -1307,8 +448,8 @@ public boolean parseCommand(Player pPlayer, String[] args) if (args.length < 3) { // not enough arguments ;) - plugin.msg(pPlayer,"Not enough arguments ("+ String.valueOf(args.length) + ")!"); - plugin.msg(pPlayer," /class [add] [playername] [classname] {world} | Add user to a class"); + plugin.msg(pPlayer,ChatColor.RED+"Not enough arguments ( 2 )!"); + plugin.msg(pPlayer,ChatColor.GREEN+" /class [add] [playername] [classname] {world} | Add user to a class"); return true; } else { @@ -1326,12 +467,12 @@ public boolean parseCommand(Player pPlayer, String[] args) world = player.getWorld().getName(); } else { - plugin.msg(pPlayer, "Not found player " + PlayerName); + plugin.error(pPlayer, "Not found player " + PlayerName); return true; } } else { - plugin.msg(pPlayer, "You don't have the right permission !"); + plugin.error(pPlayer, "You don't have the right permission !"); return true; } className = args[2]; @@ -1357,7 +498,7 @@ public boolean parseCommand(Player pPlayer, String[] args) return true; } else { - plugin.msg(pPlayer, "You don't have the right permission !"); + plugin.error(pPlayer, "You don't have the right permission !"); return true; } } @@ -1378,7 +519,7 @@ public boolean parseCommand(Player pPlayer, String[] args) plugin.msg(pPlayer, "Config reloaded!"); } else { - plugin.msg(pPlayer, "You don't have the right permission !"); + plugin.error(pPlayer, "You don't have the right permission !"); return true; } } @@ -1389,7 +530,7 @@ public boolean parseCommand(Player pPlayer, String[] args) // command wird nur ausgefuehrt bei permissions if (isSelf == false) { - plugin.msg(pPlayer,"You don't have permission to choose your class!"); + plugin.error(pPlayer,"You don't have permission to choose your class!"); return true; } else { @@ -1401,83 +542,13 @@ public boolean parseCommand(Player pPlayer, String[] args) return true; } else { - plugin.msg(pPlayer,"The class name not exist!"); - plugin.msg(pPlayer,"/class [classname] | Choose the class [classname] for yourself in all worlds"); + plugin.error(pPlayer,"The class name not exist!"); + plugin.msg(pPlayer,ChatColor.GREEN+"/class [classname] | Choose the class [classname] for yourself in all worlds"); return true; } } } - public boolean parseSelfRank(Player pPlayer, String[] args) - { - if (args.length == 0) - { - //zeigt command description aus Plugi.yml - cmdRankInfo (pPlayer); - return true; - } - if (plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName())) - { - plugin.msg(pPlayer, "You don't have the right permission !"); - return true; - } - String className = args[0]; - // rank [classname] | Add yourself to a class - String world = ""; - - //world name auswerten und setzen - world = getWorldArg(world, args); - plugin.db.i("precheck successful"); - // Add Rank - cmdAddRank(pPlayer,pPlayer,className, world); - return true; - - } - - public boolean parseSelfRankUp(Player pPlayer, String[] args) - { - if (args.length == 0) - { - //zeigt command description aus Plugi.yml - cmdRankUpInfo (pPlayer); - return true; - } - String className = args[0]; - // rank [classname] | Add yourself to a class - String world = ""; - - //world name auswerten und setzen - world = getWorldArg(world, args); - plugin.db.i("precheck successful"); - // Add Rank - - rankUp(pPlayer, pPlayer, className, world); - return true; - } - - public boolean parseSelfRankDown(Player pPlayer, String[] args) - { - if (args.length == 0) - { - //zeigt command description aus Plugi.yml - cmdRankDownInfo (pPlayer); - return true; - } - String className = args[0]; - // rank [classname] | Add yourself to a class - String world = ""; - - //world name auswerten und setzen - world = getWorldArg(world, args); - plugin.db.i("precheck successful"); - // Add Rank - - rankDown(pPlayer, pPlayer, className, world); - - return true; - } - - } diff --git a/src/net/slipcor/classranks/commands/RankdownCommand.java b/src/net/slipcor/classranks/commands/RankdownCommand.java index 866449d..08d0442 100644 --- a/src/net/slipcor/classranks/commands/RankdownCommand.java +++ b/src/net/slipcor/classranks/commands/RankdownCommand.java @@ -1,9 +1,13 @@ package net.slipcor.classranks.commands; import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.ClassManager; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.managers.PlayerManager; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -17,20 +21,17 @@ * @author slipcor */ -public class RankdownCommand implements CommandExecutor { - private final ClassRanks plugin; - private final PlayerCommands cmdMgr; - private final DebugManager db; +public class RankdownCommand extends ClassCommand +{ /** * create a rankdown command instance * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public RankdownCommand(ClassRanks cr, PlayerCommands cm) { - plugin = cr; - cmdMgr = cm; - db = new DebugManager(cr); + public RankdownCommand(ClassRanks plugin) + { + super(plugin); } @Override @@ -46,8 +47,109 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] tStr = new String[args.length+1]; System.arraycopy(args, 0, tStr, 1, args.length); tStr[0] = cmd.getName(); + db.i("shortcut detected, parsed '" + FormatManager.formatStringArray(args) + "' to '" + tStr.toString() + "'"); - return cmdMgr.parseCommand((Player) sender, tStr); + return parseCommand((Player) sender, tStr); } + + /** + * Send command Info for /rank to player + * @param pPlayer + */ + private void cmdRankInfo (Player pPlayer) + { + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/rankdown [classname] | Choose the class for yourself"); + plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); + + } + + + + /** + * The main switch for the command usage. Check for known commands, + * permissions, arguments, and commit whatever is wanted. + * + *
+     /class [rankdown][playername] {world} | Rank user down
+     
+ * @param pPlayer , the sender of the command + * @param args , arguments of the Command /class + * @return + */ + public boolean parseCommand(Player pPlayer, String[] args) + { +// Player player = pPlayer; + plugin.db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); + + boolean isSelf = plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName()); + String world = "all"; + String className = ""; + + if (pPlayer.isOp()) + { + isSelf = true; + } + + if (args.length == 0) + { + //zeigt command description aus Plugi.yml + cmdRankInfo (pPlayer); + return true; + } + + if (isSelf == false) + { + plugin.msg(pPlayer,ChatColor.RED+"You don't have permission to choose your class!"); + return true; + } + + //RANKDOWN + //RANKUP for multiClasses + if (plugin.config.isOnlyoneclass() == false) + { + if (args.length == 0) + { + plugin.msg(pPlayer,ChatColor.RED+"Not enough arguments ("+ String.valueOf(args.length) + ")!"); + plugin.msg(pPlayer,ChatColor.GREEN+" /rankup [classname] {world} | Rank user up"); + return true; + } + + // rank up or down + if (args.length > 1) + { + world = args[1]; + } + className = args[0]; + return rankDown(pPlayer, pPlayer, className, world); + } + + + + if (isSelf == false) + { + plugin.msg(pPlayer,ChatColor.RED+"You don't have permission to rankdown your class!"); + return true; + } else + { + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); + className = ClassManager.getClassNameByPermName(rank.getPermName()); + if (existClass(className)) + { + rankDown(pPlayer, pPlayer, className, world); + return true; + } else + { + plugin.msg(pPlayer,ChatColor.RED+"The class name are not found!"); + plugin.msg(pPlayer,ChatColor.RED+"Are have any class or rank ?"); + plugin.msg(pPlayer,"/class info show your class and rank"); + return true; + } + } + + } + } diff --git a/src/net/slipcor/classranks/commands/RankupCommand.java b/src/net/slipcor/classranks/commands/RankupCommand.java index 303a841..db95689 100644 --- a/src/net/slipcor/classranks/commands/RankupCommand.java +++ b/src/net/slipcor/classranks/commands/RankupCommand.java @@ -1,9 +1,13 @@ package net.slipcor.classranks.commands; import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Rank; +import net.slipcor.classranks.managers.ClassManager; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; +import net.slipcor.classranks.managers.PlayerManager; +import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -17,20 +21,17 @@ * @author slipcor */ -public class RankupCommand implements CommandExecutor { - private final ClassRanks plugin; - private final PlayerCommands cmdMgr; - private final DebugManager db; +public class RankupCommand extends ClassCommand +{ /** * create a rankup command instance * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public RankupCommand(ClassRanks cr, PlayerCommands cm) { - plugin = cr; - cmdMgr = cm; - db = new DebugManager(cr); + public RankupCommand(ClassRanks plugin) + { + super(plugin); } @Override @@ -47,7 +48,133 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, System.arraycopy(args, 0, tStr, 1, args.length); tStr[0] = cmd.getName(); db.i("shortcut detected, parsed '" + FormatManager.formatStringArray(args) + "' to '" + tStr.toString() + "'"); - return cmdMgr.parseCommand((Player) sender, tStr); + return parseCommand((Player) sender, tStr); } + /** + * Send command Info for /rank to player + * @param pPlayer + */ + private void cmdRankInfo (Player pPlayer) + { + plugin.msg(pPlayer, ChatColor.YELLOW+"-----------------------------------------"); + plugin.msg(pPlayer, "Plugin ClassRanks Ver: " + plugin.getDescription().getVersion()); + plugin.msg(pPlayer, ChatColor.YELLOW+"usage: [] = required {} = optional "); + plugin.msg(pPlayer, ChatColor.YELLOW+"/rankup [classname] | Choose the class for yourself"); + plugin.msg(pPlayer, ChatColor.YELLOW+"need permissions "); + + } + +// public boolean parseSelfRankUp(Player pPlayer, String[] args) +// { +// String className = ""; +// if (plugin.config.isOnlyoneclass() == false) +// { +// if (args.length == 0) +// { +// //zeigt command description aus Plugi.yml +// cmdRankUpInfo (pPlayer); +// return true; +// } +// className = args[0]; +// // rankUp [classname] | Add yourself to a class +// } else +// { +// +// } +// String world = ""; +// +// //world name auswerten und setzen +// world = getWorldArg(world, args); +// plugin.db.i("precheck successful"); +// // Add Rank +// +// rankUp(pPlayer, pPlayer, className, world); +// return true; +// } + + + /** + *
*/ -public class PlayerCommands extends ClassCommand +public class PlayerCommands extends AbstractClassCommand { diff --git a/src/net/slipcor/classranks/commands/RankdownCommand.java b/src/net/slipcor/classranks/commands/RankdownCommand.java index 08d0442..1ee089a 100644 --- a/src/net/slipcor/classranks/commands/RankdownCommand.java +++ b/src/net/slipcor/classranks/commands/RankdownCommand.java @@ -21,7 +21,7 @@ * @author slipcor */ -public class RankdownCommand extends ClassCommand +public class RankdownCommand extends AbstractClassCommand { /** diff --git a/src/net/slipcor/classranks/commands/RankupCommand.java b/src/net/slipcor/classranks/commands/RankupCommand.java index db95689..28db2fb 100644 --- a/src/net/slipcor/classranks/commands/RankupCommand.java +++ b/src/net/slipcor/classranks/commands/RankupCommand.java @@ -21,7 +21,7 @@ * @author slipcor */ -public class RankupCommand extends ClassCommand +public class RankupCommand extends AbstractClassCommand { /** diff --git a/src/plugin.yml b/src/plugin.yml index be13ec0..8762284 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,10 +1,17 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.2.0 +version: 0.6.3.0 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] commands: + classranks: + description: Lets users choose a class / change classes + usage: | + /class ,player command for choose the class + /rankup ,player rankup his class + /rankdown ,player rankdown his class + /classadmin , admin or op command for configuration class: description: Lets users choose a class / change classes usage: | From e761b54ac19636a369b3b888deb6a2e6c8d2bd49 Mon Sep 17 00:00:00 2001 From: krglok Date: Wed, 10 Jun 2015 21:35:46 +0200 Subject: [PATCH 24/29] v0.6.3.1 fixe console error, when player user /rankup /rankdown, when he has no class --- .../classranks/commands/RankdownCommand.class | Bin 5192 -> 5290 bytes .../classranks/commands/RankupCommand.class | Bin 5180 -> 5282 bytes bin/plugin.yml | 2 +- .../classranks/commands/RankdownCommand.java | 18 +++++++++++---- .../classranks/commands/RankupCommand.java | 21 +++++++++++++----- src/plugin.yml | 2 +- 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/bin/net/slipcor/classranks/commands/RankdownCommand.class b/bin/net/slipcor/classranks/commands/RankdownCommand.class index f700af483a4a95c71b6a8c2b7f30d89ed3b43df1..0ff22d055935034d5c5b7c59cea811c9d0ad4e78 100644 GIT binary patch delta 214 zcmXAhJxfAi0EM69%`R#ZUgse0AcaH_jX^_*4uRpCmo~x4pWu?47xle zI5%FRU(koz<_+m3;SA4#bDr_m9{JB%KuF3ev>1utC zmJYa3j!T_zr4nt`=%`6o9eV0iluRK~?J^oDYg( Y5Z3XSH-Z(n&%Bc`*z41)o>=&Q0*iSk7ytkO diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class index 0a350b4a243cbecd6fd74cd9b84f4b335841dbb4..245e09692562a1bda5156a5f23bf090e2b55ea00 100644 GIT binary patch delta 237 zcmXAh!7D>?0LMSy_cqUrCv#S>9oB@D9F<9HZnP`QX|&Ty9GrIHL^-@NagZH|!q$wG zv!jEf#6Q5W9iQYE^*wyP_5FVCl9j>gmfPt~t>nG+;+ntXCPK^k)#3WB`)Wl3!Z@Ip z`cdDg?0X9SLu|=!#%Aq(5`L<`P#WV{6Pzf`spdFSmU9)k&^DLarK&xy)S#h9uJz0f zQDEj@N;f^G89f_pqCZ+7hsC50dE*_MX&umHo)8(8`7jjL2sJ+WqJzaD^B*AcLskx+ YNi-gi>*|evGw$#dkT%|y8CkS{0km>E?EnA( delta 211 zcmZ3axkqC|Hy?|PV^Qkl$$V-onR#jXoA>hFXX2d6z{5#>qE@Qg|2` z7?>HjfMgqk;^cne%zAT%rHl>?%Ne~HRxtW9tY*w&Si{)Pu$FNm!#W0TpgIqT2@E_8 zyg(k%EQS__Rt82eD~2JKfr-JMF@)g_!&{)a&Wr&J?--&PSQy+HeHh*YS*(n@3~3A> w7(OzvF~kG4OEGZ#V+dkoXHWnlZl&K0BC%ZjN`Dyi*%@vD4gCaE!o=_y0Amd-`~Uy| diff --git a/bin/plugin.yml b/bin/plugin.yml index 8762284..32b7d35 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.3.0 +version: 0.6.3.1 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] diff --git a/src/net/slipcor/classranks/commands/RankdownCommand.java b/src/net/slipcor/classranks/commands/RankdownCommand.java index 1ee089a..e41080c 100644 --- a/src/net/slipcor/classranks/commands/RankdownCommand.java +++ b/src/net/slipcor/classranks/commands/RankdownCommand.java @@ -136,11 +136,21 @@ public boolean parseCommand(Player pPlayer, String[] args) } else { Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); - className = ClassManager.getClassNameByPermName(rank.getPermName()); - if (existClass(className)) + if (rank != null) { - rankDown(pPlayer, pPlayer, className, world); - return true; + + className = ClassManager.getClassNameByPermName(rank.getPermName()); + if (existClass(className)) + { + rankDown(pPlayer, pPlayer, className, world); + return true; + } else + { + plugin.msg(pPlayer,ChatColor.RED+"The class name are not found!"); + plugin.msg(pPlayer,ChatColor.RED+"Are have any class or rank ?"); + plugin.msg(pPlayer,"/class info show your class and rank"); + return true; + } } else { plugin.msg(pPlayer,ChatColor.RED+"The class name are not found!"); diff --git a/src/net/slipcor/classranks/commands/RankupCommand.java b/src/net/slipcor/classranks/commands/RankupCommand.java index 28db2fb..4323406 100644 --- a/src/net/slipcor/classranks/commands/RankupCommand.java +++ b/src/net/slipcor/classranks/commands/RankupCommand.java @@ -161,16 +161,25 @@ public boolean parseCommand(Player pPlayer, String[] args) } else { Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); - className = ClassManager.getClassNameByPermName(rank.getPermName()); - if (existClass(className)) + if (rank != null) { - rankUp(pPlayer, pPlayer, className, world); - return true; + className = ClassManager.getClassNameByPermName(rank.getPermName()); + if (existClass(className)) + { + rankUp(pPlayer, pPlayer, className, world); + return true; + } else + { + plugin.msg(pPlayer,ChatColor.RED+"The class name are not found!"); + plugin.msg(pPlayer,ChatColor.RED+"Are you have any class or rank ?"); + plugin.msg(pPlayer,"/class get, show your class and rank"); + return true; + } } else { plugin.msg(pPlayer,ChatColor.RED+"The class name are not found!"); - plugin.msg(pPlayer,ChatColor.RED+"Are have any class or rank ?"); - plugin.msg(pPlayer,"/class info show your class and rank"); + plugin.msg(pPlayer,ChatColor.RED+"Are you have any class or rank ?"); + plugin.msg(pPlayer,"/class get, show your class and rank"); return true; } } diff --git a/src/plugin.yml b/src/plugin.yml index 8762284..32b7d35 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.3.0 +version: 0.6.3.1 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From 27b64b14fccad46ccbf65c310e17678fbdc367cc Mon Sep 17 00:00:00 2001 From: krglok Date: Thu, 11 Jun 2015 08:00:05 +0200 Subject: [PATCH 25/29] v0.6.3.2 fix console error, when player use /class remove fix error message when player has not selfrank permmission --- .../classranks/commands/PlayerCommands.class | Bin 12832 -> 13012 bytes .../classranks/commands/RankdownCommand.class | Bin 5290 -> 5308 bytes .../classranks/commands/RankupCommand.class | Bin 5282 -> 5300 bytes .../classranks/managers/ConfigManager.class | Bin 18328 -> 18347 bytes bin/plugin.yml | 2 +- .../classranks/commands/PlayerCommands.java | 5 ++++- .../classranks/commands/RankdownCommand.java | 2 +- .../classranks/commands/RankupCommand.java | 2 +- .../classranks/managers/ConfigManager.java | 13 ++++++++----- src/plugin.yml | 2 +- 10 files changed, 16 insertions(+), 10 deletions(-) diff --git a/bin/net/slipcor/classranks/commands/PlayerCommands.class b/bin/net/slipcor/classranks/commands/PlayerCommands.class index bb3534a856a9040f04819f6308d6a3d0f2b486bc..9dcb17306a7c7ad7b34ee3c5f42624b3fa26c628 100644 GIT binary patch delta 3373 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 diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class index 245e09692562a1bda5156a5f23bf090e2b55ea00..ab4a237a9a4d1cc2ff1b02f54df876ec343f2254 100644 GIT binary patch delta 78 zcmZ3axkYnBAD5$JL26NMW^r+5ex5>dPGWI!QDR+$T$F>8 z+DTHxX{D5da&mKX@ka0A_ddVgkJCIa^Sny>z4vfi0i#WKh!iq@XWWGr%RZC=3c{@( zG%JLFdJ$9~!s>^kLA2UTW#bDGOy~=MV5i@8b77=Y3D_b-?q0H-4n{4wZHQub7V{<3fkcAyfm3p-ue= zYXDKX7}g*Xilfu+TmKvALbq+!m9Gr=H)T-+Aq+=D)~L8`?+dArK)pOPYaG2wVpJ0t z(-cxlp`d9Tn1^Oy*{No5p;_E(4i9EYX*_Bk&+_qVmTiBxHy`%lm$IzV0_)5Mvr!p3 zT4a-!*rH|jD94!Tx?16gg$b>4Qfo|WoqNjj$UN2tPb@prCNH(cD{Zr+9X^>a+GW|Y SHzoNgkKfwoj|xR6TKom6A42p1 diff --git a/bin/plugin.yml b/bin/plugin.yml index 32b7d35..0e8d77e 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.3.1 +version: 0.6.3.2 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] diff --git a/src/net/slipcor/classranks/commands/PlayerCommands.java b/src/net/slipcor/classranks/commands/PlayerCommands.java index 14b3fb2..aa8cead 100644 --- a/src/net/slipcor/classranks/commands/PlayerCommands.java +++ b/src/net/slipcor/classranks/commands/PlayerCommands.java @@ -252,6 +252,8 @@ private void cmdGet (Player pPlayer, String[] args) private void cmdConfig (Player pPlayer, String[] args) { + boolean isSelf = plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName()); + pPlayer.sendMessage(ChatColor.YELLOW+"[ClassRanks] "+ChatColor.GREEN+"Configuration "); pPlayer.sendMessage(ChatColor.YELLOW+"----------"+"Ver: " + ChatColor.GREEN+plugin.getDescription().getVersion()); pPlayer.sendMessage(ChatColor.YELLOW+"OneClass : "+ChatColor.GREEN+plugin.config.isOnlyoneclass()); @@ -262,6 +264,7 @@ private void cmdConfig (Player pPlayer, String[] args) pPlayer.sendMessage(ChatColor.YELLOW+"ClearRanks: "+ChatColor.GREEN+plugin.config.isClearranks()); pPlayer.sendMessage(ChatColor.YELLOW+"DefaultRankWorld: "+ChatColor.GREEN+plugin.config.isDefaultrankallworlds()); pPlayer.sendMessage(ChatColor.YELLOW+"RankPublic: "+ChatColor.GREEN+plugin.config.isRankpublic()); + pPlayer.sendMessage(ChatColor.YELLOW+"SelfRank : "+ChatColor.GREEN+isSelf); plugin.msg(pPlayer, ChatColor.YELLOW+" "); } @@ -530,7 +533,7 @@ public boolean parseCommand(Player pPlayer, String[] args) // command wird nur ausgefuehrt bei permissions if (isSelf == false) { - plugin.error(pPlayer,"You don't have permission to choose your class!"); + plugin.msg(pPlayer,ChatColor.RED+"permission classranks.self.rank not set to you , call your admin!"); return true; } else { diff --git a/src/net/slipcor/classranks/commands/RankdownCommand.java b/src/net/slipcor/classranks/commands/RankdownCommand.java index e41080c..181ffe7 100644 --- a/src/net/slipcor/classranks/commands/RankdownCommand.java +++ b/src/net/slipcor/classranks/commands/RankdownCommand.java @@ -103,7 +103,7 @@ public boolean parseCommand(Player pPlayer, String[] args) if (isSelf == false) { - plugin.msg(pPlayer,ChatColor.RED+"You don't have permission to choose your class!"); + plugin.msg(pPlayer,ChatColor.RED+"permission classranks.self.rank not set to you , call your admin!"); return true; } diff --git a/src/net/slipcor/classranks/commands/RankupCommand.java b/src/net/slipcor/classranks/commands/RankupCommand.java index 4323406..4a8e138 100644 --- a/src/net/slipcor/classranks/commands/RankupCommand.java +++ b/src/net/slipcor/classranks/commands/RankupCommand.java @@ -131,7 +131,7 @@ public boolean parseCommand(Player pPlayer, String[] args) if (isSelf == false) { - plugin.msg(pPlayer,ChatColor.RED+"You don't have permission to choose your class!"); + plugin.msg(pPlayer,ChatColor.RED+"permission classranks.self.rank not set to you , call your admin!"); return true; } diff --git a/src/net/slipcor/classranks/managers/ConfigManager.java b/src/net/slipcor/classranks/managers/ConfigManager.java index 8157de6..0fc931a 100644 --- a/src/net/slipcor/classranks/managers/ConfigManager.java +++ b/src/net/slipcor/classranks/managers/ConfigManager.java @@ -584,11 +584,14 @@ public void playerSectionWrite(Player player, String className, String rank) public void playerSectionRemove(Player player, String className) { - plugin.db.i("Remove config " + player.getUniqueId().toString() + " : "+className); - PlayerClazzList playerClazz = playersClazzList.get(player.getUniqueId().toString()); - playerClazz.remove(className); - plugin.db.i("Save player section after remove " ); - playerSectionWrite(); + if (className != null) + { + plugin.db.i("Remove config " + player.getUniqueId().toString() + " : "+className); + PlayerClazzList playerClazz = playersClazzList.get(player.getUniqueId().toString()); + playerClazz.remove(className); + plugin.db.i("Save player section after remove " ); + playerSectionWrite(); + } } diff --git a/src/plugin.yml b/src/plugin.yml index 32b7d35..0e8d77e 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.3.1 +version: 0.6.3.2 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From 8b7e20a67e66ca47ce3f1af7874047a19d93c603 Mon Sep 17 00:00:00 2001 From: krglok Date: Mon, 7 Mar 2016 06:23:36 +0100 Subject: [PATCH 26/29] update 1.9 hasItem expanded with new ItemList --- .classpath | 2 +- .../classranks/managers/PlayerManager.class | Bin 6311 -> 6561 bytes src/net/slipcor/classranks/core/Item.java | 64 ++++ src/net/slipcor/classranks/core/ItemList.java | 290 ++++++++++++++++++ .../classranks/managers/PlayerManager.java | 9 +- 5 files changed, 360 insertions(+), 5 deletions(-) create mode 100644 src/net/slipcor/classranks/core/Item.java create mode 100644 src/net/slipcor/classranks/core/ItemList.java diff --git a/.classpath b/.classpath index 283aa9f..ab4f93a 100644 --- a/.classpath +++ b/.classpath @@ -3,6 +3,6 @@ - + diff --git a/bin/net/slipcor/classranks/managers/PlayerManager.class b/bin/net/slipcor/classranks/managers/PlayerManager.class index 251439dc116f7201a435395f9bb25c24a81f0b43..04ed89bb38e1f7eed768d3d819ffdd99b60b6677 100644 GIT binary patch literal 6561 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 delta 3189 zcmZ`*33yc175>l6n|ZUmEDVI~aRMPs77|DxKrrm44h;z+i$N?5$q>d&G9ek3s5P~< zTB@jUMaybaEU^_UA{~ffv1%z=t#+ff1zWAHwY8!J-W?&rh z)d|bk93KjG6bO=U4r~mRh6AllrPoK>L#<5)icqXBT8id7QG$s&O0Qhh*%1x47?^}I zfiYXl`V+mgNNKHbQf;Q;-NhIPS)W zgXS(BZrp)y7}$?T)n4c3tH$6l1K+~81zM=1&Sb||u)>K|IB4Jrd`FeIs_chwSjSTo zdf9}hO~OpX^CFS({K%$O9p5FKA*ED@!pvb6jv6?IUiF%5TxOpjp@EAVxwxaGvnA}p z5u7k3c~T|2ecH2xtKKxy)lzqw_Y~ab^z#N@Fd^AP9Rm?h;k1Dt;EdYp&dzyBkYo;f zTZc%e0GNXILt_}_P@^88=LYwB(Hc+V>Q#K2GSGbR>}keU*odSFDF`p`YnRlsUE zi`RAhLM=AN_nm-!j+yPQ78wkl(9}gpB%^@s5E%;x!WOudS}r@h8EEIBy%Gp>XN7fsS!-Bzcm_c3R1v-$3N88guE<#fPd-ukXSE; zWHJX>W zlEykp#BFdzf+|fanKDvRbQvW`jBgZ2Lw&9@WVECTZ0)8fnWL||z|R7abVD*EQ*BQg zmz&K}l$;^Yc-Bjo`scgxfp`tcl`-n|r14I^Ktry%L3sI zLDQkgkYZu4v9||XA{(i>Q&M6`Df)TN9l@yiKFN?WoO!x4S(nt&HIarucv*l|v?d%h zD{YBssM|;Eb&i9E@o>VY@;n7ykMYgM=3adaDZR)P)K_XJXIiUzkddxsmDLpWB3Dot z!}y)B6&p(!BQ1oy5Vc(4j17vx5co2aCJ8-w3&rR zkZ=S8vA@dL<^o2(H-`I%g2#P^L*Hqa6nl!^-M=S$7g|jBqBt;hIk3y!i|5DT4ujiq z`Ii6R>q@81YD7wQR~;Ez#P+wC3@_m^FXP$YfHbnWfc&i^RkyK&-h%+P^7=c;u`|5g zUPcK0xLGEnSt_tZW}_{B8Z%8@$y|(}KKMs#KsKhe6T7&Vg==?X4^PdY_ljg5k;ZM7 zVK4Sk>I>9~l(eETIvx>T!W7pdz{gl==||KQ90vyH7)tPU+_ZgkPBPC$JAtNpYjJkj z^}Xm;C8M*uHZs~K9(*Tqv5{i9Ee^1dyMY241W0QTAgw`wRJAD_Yg{-ESU-VHGR@t- zi35C6-~}U)SF{5#5~U&#qouGI8}cX->WT- z;kljgPvH0Wdr(oSd0sq>A0ESx)3q3W&LZK+uP%+8>w$+OzqvH>rswU$_yZk!Fs2Xh zGU%TxwRFw%p7j|1+KYc$v3!E(qx3F@`-Db}-1LfOL8W#~T%#m${U}Lp*>X%g6}EJ( zs8`YiG0Ezct1Kj-_EH`x@oBTY^vYNZp2dZjjBjkLu&3BBE!q!vihUnAcJPW|g_bTX zzicGMb_F;sCKJejOf<8z59e!-;hgm#xt)e8miXED_hMdf=6fUFl4(*!`JCqpvx#kI z>jLhkV7E}P_o9FjorL?jdONDRpcvvoc8rI3kPlPeJE`y8)bk#O+K06iPb<3ln`=LA z#iRV)bbz6Humg`#ijVXEAdcfn-rP^|T01Ou91$m(${-yR(I?YzQmWY3XX9CF`#D*F z=cNv(<088S2D+$@A(hb@P+5Waq@1$1V3K%c3QNaIfC(~{;WWZCt?9JZ#;rjq% l4b0Lyd!3H+{JfRu%DISUoj03&gybMc6IqON>1>gC{{_D|-Z%gN diff --git a/src/net/slipcor/classranks/core/Item.java b/src/net/slipcor/classranks/core/Item.java new file mode 100644 index 0000000..88528be --- /dev/null +++ b/src/net/slipcor/classranks/core/Item.java @@ -0,0 +1,64 @@ +package net.slipcor.classranks.core; + + +import org.bukkit.Material; + +/** + *
+ * Independent type for blocks and items
+ * make it possible to separate the model from the minecraft server
+ * property:
+ *  String sRef;
+ *  Integer iValue;
+ * @author krglok
+ *
+ * 
+ */ + + +public class Item +{ + private Material sRef; + private Integer iValue; + + public Item() + { + sRef = Material.AIR; + iValue = 0; + } + + public Item(Material itemRef, int value) + { + this.sRef = itemRef; + this.iValue = value; + + } + + public Material ItemRef() + { + return sRef; + } + + public Integer value() + { +// System.out.println(iValue); + return iValue; + } + + public void setItemRef(Material itemRef) + { + sRef = itemRef; + } + + public void setValue(int value) + { + iValue = value; + } + + public void addValue(int value) + { + iValue = iValue + value; + } + +} + diff --git a/src/net/slipcor/classranks/core/ItemList.java b/src/net/slipcor/classranks/core/ItemList.java new file mode 100644 index 0000000..869bd3f --- /dev/null +++ b/src/net/slipcor/classranks/core/ItemList.java @@ -0,0 +1,290 @@ +package net.slipcor.classranks.core; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; + +/** + * list of items, hold each item type unique + * if item exists the value are added + * + * @author oduda + * + */ +public class ItemList extends HashMap +{ +/** + * + */ + private static final long serialVersionUID = -3351533128792676311L; + // private Map itemList; + protected int itemCount; + + public ItemList() + { +// itemList = new HashMap(); + itemCount = 0; + } + +// public Map getItemList() { +// return itemList; +// } +// +// public void setItemList(Map itemList) { +// this.itemList = itemList; +// } + + /** + * add item to the list + * if exist values are add to exiting items + * @param item + */ + public boolean addItem(Item item) + { + if (this.containsKey(item.ItemRef())) + { + Item exist = this.get(item.ItemRef()); + exist.setValue(exist.value()+item.value()); + } else + { + this.put(item.ItemRef(), item); + } + itemCount = itemCount + item.value(); +// Item item = new Item(itemRef, iValue); + return true; + } + + /** + * add item to the list + * if exist values are overwrite + * @param itemRef + * @param iValue + * @return added item or null + */ + public boolean addItem(Material itemRef, int iValue) + { + if (this.containsKey(itemRef)) + { + Item exist = this.get(itemRef); + exist.setValue(exist.value()+iValue); + } else + { + this.put(itemRef, new Item(itemRef, iValue)); + } + itemCount = itemCount + iValue; +// Item item = new Item(itemRef, iValue); + return true; + } + + /** + * add value to the item in the list + * if not exist add item + * @param itemRef + * @param iValue + * @return + */ + public Item putItem(Material itemRef, int iValue) + { + Item item; + if (this.containsKey(itemRef)) + { + item = this.get(itemRef); + item.setValue(item.value()+iValue); + itemCount = itemCount + iValue; + return item; + } + item = new Item(itemRef,iValue); + this.addItem(item); + return item; + } + + /** + * + * @param itemRef + * @return + */ + public Item getItem(Material itemRef) + { + return this.get(itemRef); + } + +// public Boolean isEmpty() +// { +// return itemList.isEmpty(); +// } + + /** + * add value to item value + * if item not exist in list it will be created + * @param itemRef + * @param value + */ + public void depositItem(Material itemRef, int iValue) + { + Item item; + if (containsKey(itemRef)) + { + item = this.get(itemRef); +// System.out.println("deposit: "+iValue); + item.setValue(item.value()+iValue); +// put(itemRef, get(itemRef)+value); + } else + { + this.addItem(itemRef, iValue); + } + itemCount = itemCount + iValue; + } + + /** + * bucht value von item ab , + * wenn bestand > 0 + * @param itemRef + * @param value + * @return + */ + public Boolean withdrawItem(Material itemRef, int value) + { + int actual = 0; + if(this.containsKey(itemRef)) + { + actual = this.get(itemRef).value(); + } + if ((actual-value) >= 0) + { + value = value * -1; +// System.out.println("withdraw: "+value); + this.depositItem(itemRef, (value)); + return true; + } + + return false; + } + + public int getValue(Material itemRef) + { + Item item = get(itemRef); + if (item != null) + { + return item.value(); + } else + { + return 0; + } + } + + public void setValue(Material itemRef, int value) + { + putItem(itemRef, value); + } + + + + public int getItemCount() + { + return itemCount; + } + + /** + * calculate item count new form item values + */ + public void setItemCount() + { + itemCount = 0; + for (Item item : this.values()) + { + itemCount = itemCount + item.value(); + } + } + + public ArrayList sortItems() + { + ArrayList sortedItems = new ArrayList(); + for (Material s : this.keySet()) + { + sortedItems.add(s); + } + if (sortedItems.size() > 1) + { + Collections.sort + (sortedItems); + } + return sortedItems; + } + + public void addAll(ItemList newList) + { + for (Item item : newList.values()) + { + put(item.ItemRef(), item); + } + } + + + /** + * make a dowb count for required list by the amopunt + * + */ + public void reduceRequired() + { + ArrayList deleteList = new ArrayList(); + for (Item item : this.values()) + { + if (item.value() > 0) + { + item.setValue(item.value()-1); + } else + { + deleteList.add(item.ItemRef()); + } + } + for (Material key : deleteList ) + { + this.remove(key); + } + } + + public String asString() + { + int count = 0; + String value =""; + for (Material key : this.keySet()) + { + if (count == 0) + { + value = key.name(); + } else + { + value = value + ", "+key.name() ; + } + } + return value; + } + + public void addList( ItemStack[] items) + { + if (items == null) + { + return; + } + for (int i=0;i players = Bukkit.getServer().getOnlinePlayers(); + for (Player p : players) { - if (p[i].getName().toLowerCase().contains(playerName.toLowerCase())) + if (p.getName().toLowerCase().contains(playerName.toLowerCase())) { - return p[i].getName(); // gotcha! + return p.getName(); // gotcha! } } // db.i("player not online: " + player); From 2e7c0d8f2affbb7497ac6636fb606046a8423ce3 Mon Sep 17 00:00:00 2001 From: krglok Date: Wed, 16 Mar 2016 06:21:56 +0100 Subject: [PATCH 27/29] update to MC 1.9 fix stack size limit of 64 --- .classpath | 2 ++ .../managers => Doc}/ClassRankCore.mgc | 0 .../classranks/core => Doc}/ClassRankCore.png | Bin bin/.gitignore | 1 - .../commands/AbstractClassCommand.class | Bin 0 -> 19254 bytes bin/net/slipcor/classranks/core/Item.class | Bin 0 -> 1203 bytes .../slipcor/classranks/core/ItemList.class | Bin 0 -> 5412 bytes .../classranks/managers/PlayerManager.class | Bin 6561 -> 6949 bytes bin/plugin.yml | 2 +- bin/unittest/PlayerManagerTest.class | Bin 0 -> 700 bytes bin/unittest/package-info.class | Bin 0 -> 114 bytes .../classranks/managers/PlayerManager.java | 13 +++++++++---- src/plugin.yml | 2 +- 13 files changed, 13 insertions(+), 7 deletions(-) rename {src/net/slipcor/classranks/managers => Doc}/ClassRankCore.mgc (100%) rename {src/net/slipcor/classranks/core => Doc}/ClassRankCore.png (100%) delete mode 100644 bin/.gitignore create mode 100644 bin/net/slipcor/classranks/commands/AbstractClassCommand.class create mode 100644 bin/net/slipcor/classranks/core/Item.class create mode 100644 bin/net/slipcor/classranks/core/ItemList.class create mode 100644 bin/unittest/PlayerManagerTest.class create mode 100644 bin/unittest/package-info.class diff --git a/.classpath b/.classpath index ab4f93a..c216219 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,10 @@ + + diff --git a/src/net/slipcor/classranks/managers/ClassRankCore.mgc b/Doc/ClassRankCore.mgc similarity index 100% rename from src/net/slipcor/classranks/managers/ClassRankCore.mgc rename to Doc/ClassRankCore.mgc diff --git a/src/net/slipcor/classranks/core/ClassRankCore.png b/Doc/ClassRankCore.png similarity index 100% rename from src/net/slipcor/classranks/core/ClassRankCore.png rename to Doc/ClassRankCore.png diff --git a/bin/.gitignore b/bin/.gitignore deleted file mode 100644 index b0c8d5c..0000000 --- a/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/net diff --git a/bin/net/slipcor/classranks/commands/AbstractClassCommand.class b/bin/net/slipcor/classranks/commands/AbstractClassCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..1afcfb22aa4aaf0272d3a9d688033f65fb2d05fa GIT binary patch literal 19254 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 W;YvNEq#J{Odw}nId#gu^Oa2!l#i%F% literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/core/Item.class b/bin/net/slipcor/classranks/core/Item.class new file mode 100644 index 0000000000000000000000000000000000000000..038217dd5e2f2015a47d633ef7bf00a82894efe4 GIT binary patch literal 1203 zcmah{TTj$L6#iy!rM1dlxEFB+l-(j!*#}KT5@KRfvq*x5#KZ@?%ZP>2HEoyQr3Tda z;1BRe8PA!mg+LRt$xP?We3$c`{r%_XF902MG!z7yp-h}O@IUnjk<$;nIF7vVICkhL z9XF9D8cG7yBk$C60xvvtc6&#%p9qxVJ^4XkvO9H*iW1tFOiY&1y2Pk{=OFs zr9h*5fpx<~9?FQXH~r90wgif;_CAq49~?*nMcg!@!_YB~nuaQ&bJ$JPQ6c2EyQf27 z!bBMr15=pMFfCBKre|Una{}5aJK81FQ!TfhV~g45O=uVs81MR_d^J4j$>@#O3#gHL zchL8OeUBQXb6PAVAN^QhvHQOmspr{NZdNV_p!pQF3bd?T3J8~~JOEXlZnbm4GyuA} z)-kCWu}m`fOujTLkI}nyR3(aqE8f9@s&J<3CLBDZq96WyMk6C{#_Pc_>dO~CXQQ*y zI@`cq3b9Ckumb&PF6xUCrCp;N8ZNCj==75A1?>~|cbN89+&V|YF8;veIjk=Vb(_{Y zO0>?VRF=>BX{gd=K|iC5LvtE8Ayie5Q{A*zyRla>-^nv$=$o9I$m2yp{`Yp`C)aNUFe6 zHuratmZ7Q}lzT@pOpRV;{Z!I^1Z=FPT-zy^Zd+Gl8qqzb;XS!Tr)PA!3WY;>kkPpm kAzQ22Z_i+T!fJiA0&%V>ET%S0;hNQJub7m+K;uK)l5 literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/core/ItemList.class b/bin/net/slipcor/classranks/core/ItemList.class new file mode 100644 index 0000000000000000000000000000000000000000..28cdbf34d93dc9a2ac40172f4d97cbb4e3512fce GIT binary patch literal 5412 zcma)AYj9L&8GgRq4ZB$mkP9RPLbyYAHzAapg#Z?)w1FfPLP5Y<4%q`aWV4&@g-fkU zZELNq)_QA8TP%u=RJ35rauut#pjGfPI{vWZ^p~TIqvK4cqYe_E_d91Vfo0;4Y|c5~ zci#7TpZ9s+_uGBv`q>Kr=HrSV9)%fkE8UWc+5O##WJ`C_q(DwmTKn8ii4-67f{pjHfr5 zv5Zyrn}^rTYtwBscy&n@5rVQu7z$7%#gP7l7?Nq3347DecyIOW+dVB43ONW`(7)cOsrP?RaXfwO?UeW4k6jX2y55tlP2M>P~A6Oq+q3m_^=pS)_7SseL!UD&QLp zgb-FJ+aswF7onn!ZSl0V%SsYb6Xy8QoXfff;4T_y!CZxa?WR{JuT5;vGbpPCTuNC^ z=9$sPw$LUCaFKxz;dbur&k*qKB>)$}$c1|IBU%&*DNGwaTMW|LNA*&VU1_tsmx^^& zQrB2A5p7O>KP=+AL*bUYs8qk8&{-W<(iEj_Yw>d{BX%UV?b0epz)JwObQbZk%u82|8q2UKk9;QET?Ufsa(Mc9#gl4`gg! z3MnK);duiGWgv`5T78K<%yBSk#jLdDyyazHC{r`ll}_4mDt4&IoTse;ysW@+djQ`w z@GTq?Nt%63+P5hzO|h1wvwLO6jzz6x5Cb^s$9H%ZxN(OR`m4haC)arpM{rC!@Aqz) zd+vH@Qvk0ic$%ij&JzZHfY*i1{(dXY@@y`iD7jaP=Eo4w>{Lf^(m+;X45SmzBIiZ7 zb2O>C=|%Ub;IKKPaa(bv*zrA9oW;LipO^HgX_cXO9vA%hp+ZBExJ&Fc@FRUrV9(k} zRY@{`Y~XINqn*c34ZJ0SFX!rtK0zmg_M(AHdeBl!ZeJ{83+kgxrw$8^Coh}w=t^Xg z-PUSbj#8u8iS$8lj^vQDph(j0S+BI9haWV{TY0cy0rSY|A@VYe;GJLJ1>lpj9j`0+ zjORUmj^^D`?xYS844=Z7u=gY?Pw4&C{2Z+5#g%*+n&X30~n=u@X^A};Vo~VGPg(^zGF1z zg#c;LLChumd2~1*VJtv17Rez8cVUSJHpOx70wWA8=86EUMk}v83>6H;(<~=lPG1-H zDHqnS3WI0NnE#ls(aW9~t1f!FBxw;v5oo3z3 z_X6&fu*6H4Lbk|DAnzrRPfdWFNJS}pj5X+_p@siNV`X7B90{RV zc;~f2r^}VO1{I4V*Ds%OK`qj~GMvT7&tM0WJb+0}XV9a-&e48jE8|LB;o#tV1;y3q zVtR|8Z=;?AriuR-;^*4CBl|_J_j-10rh<> zf5m&1ggU%i{{Q_G^9{zCxY-mL2%_?7_cd9{*63hg^pUunT+^}~Bg~-c z__r`0*q;l;J4$_*6W~wu`!4I`y&~+9yoMt98vBn-ieQma32Bg8aFDtgsOGM(=LDkW zxZwJVn9qZpTL9@6(IHgl2BR;kN1`D);ruM5fxnXA ztEByJl>gtErhhPme=-4Au@>)B%^&ca*8BV-^e-K{(<=Jh&;xAwFSu!&?uLFJ6Zql{ z36x#A1TIF|O$i)iOL8;H%GNm@B&;Dxt{6k^USjuh68mp*Co^WfcWKo(I`WcT;v2xi zI$ut-of8jYB!}2x7G1+R9NE%z8n2wfcdNdi#c_Gge_6cIA#Z3|Uur6}&sl6yz%@$o zzjSq74uky8VC#E%0m4?LU=*+r{oaMq>ak956y{}d zE{iuin=fI8d+UsLS+T8m@JzDMgHI%ooW<{ER(I>YyF(=tet{KUhh(au}&ZS=lvu YxQ2z)z<*FKWB(Tn&4XXM{p#}n08bO3DF6Tf literal 0 HcmV?d00001 diff --git a/bin/net/slipcor/classranks/managers/PlayerManager.class b/bin/net/slipcor/classranks/managers/PlayerManager.class index 04ed89bb38e1f7eed768d3d819ffdd99b60b6677..52558f828748c5ee0f2efe2cf06bf0b95387af45 100644 GIT binary patch delta 2961 zcmaJ@4R}-K6@E{C?#<6_lcuDll-2|&q|i1{q(b?XVj--wQlJn-AZood222uj`BU|pk%z*Xw9;9hK# zaUUU9oHOPc72J;pM6Wc_yaQD-9wfNLX~}iH2|Ee;K?9-Sn|PRDZV1M1Y>Ku;7>?eP z@3Wu`k0_|XqlDoepGY+fH@D+)8IKVP20)~`_P|G=ked0E3cd{&L0TUOw*^~e?B#G= zqj<7L7Iffg1;V-4z3|&dh#oxEe+nmt zR-=M7;SfKSbMEz8QOb}|6YnMziZuImVwfSd*o0oLc4ai?T9eexb;(Gii3 z>lu!6J&Qczp|qjmyfruZPU7Y)9rP^=2$2iQAlPlur;?Z2NuNw zb&ZQ#0(C(XnK?OMl`E;}wvbiz$ja$gJo>7V+a^jSWcVV?#ZbL?L$S+bSJl(R2TG}q z(#5cpVY4riQ=ts>b1!_A z$SWFBYo!S^QKn+?PHM6KdYU8*wmj(ug(lM!;k6Y_nn^dxG>ed`MbT!8M{=z~v#E@S zu0*;2Db+JQ0=4T3f+S9FK@K(C38Lu7zZ;7 z#3;uD&I!oIM0hX>V=;lH$?##SIO%xIS;jhZkb`oJ$2{D?@+>S6ZRxAxH^T@MKuh#9 z3XZkIsP8(8h`$@nrG_lSxL&Ly^rDTBz*qGp#!ebj;4~JWq8$Bv1bP5Zz zqy(NCuc z=Nhna97*8S{{i^;wJBa}_5X}^>$~nYlG9jltfT*op^M*_df50{11Db>L5IbBIMi@M zmcfCzA0x1wd$s~ztmLk(LLF9P3u>_oK|GBH?892T$7}DS2_N#i)`4c4%YE@-IW6K- z&dzScSXu@@NRv+D6bIF@?i+ZM!8oW4r|}juCy$E!*n{sg1-3A%Wwyo?RtFMu!XaWuj^qTlJVGkXlL z;$FYLAg6dyFWwbJ898a2Io=(xA`Uk;Gga>rD>B^iL741UMWokon4rG|BW0@&e}bR# z)ePu9W$0?Uex~QoxWBLu^ywD~{CbeVXZ`9@0v|j6*o{9gIEp@|^e2@C3H*IGDhm1j z&rVD(H8}o#5dZ1HB?GyES*SKmr|}S+0w~zkcO~PCq^BmOn*0J zsk4$!!}L8gyq8>hEG6~-x{}^hXNz=Ldd-5< z_$72TTnO^3DN5<_WZDv^t?%L*PsVi2qJeugS+(aNpXf6g@LYa2XuRHqQOua_$iRab z%B0PQU>ZNn+K;mRZa!$*F&mF#KKHd6Pcr*Ea4YsE$=!@jwBflpQ}B7*$zL!O;A*l zBxk}uI1~9ao>tJU%+d+up_R0X$u=AD6k1II&S^1HS*m5JL6hoO+J>Q2PeGOr;8|Lu zNhk0KHE6SQ0Ulb*lEe@OY$e>r05UklfMqCYsY>dEO@flagEa<*!Qt`Ztc*S$Br+_N e$y&{?PMg)$kFd;d1-c0P8eX-5NcF6v#{U9LY{#Ae delta 2604 zcmah~d3;pW75>i5oA+jUlVy@g9AYqO2qusP5*b2(6cUI|fP^JLgLWB`AsI5sWSJy@ zVoFN|6_j#CFd{T4rq*C(agre#u?jBL8trPWTJ1ttm11oRlz83?3Gvtde*Q6U&OP^> z?`+?__prM=-~P(wlY;>AsZxPKoU^4Jo%VsrY(Wss3Yx?;WwNmat)faPNNOXf)pfq= zdQZsLkW!dpMF%!2*g%*l&Y32fRBXbn;&mn8vKbW$ZYQLO_mq@4GrmbMUUB%Aif?19 zC^9F=cc@s5ZDNf%RlXByj z>~9^x9KtVE{0eUgyFGd0+k|LMozln+(CbgN;2pfD;9c&$XtpOZ7k-QPMUDOX*dTtV z;`jIiQy>tmCFF>M(Js+$kF#g4vf?cMtl&?CWKrNqUZmnLP#L_b#oriO5%N~oSGIVo zeP;ZPtMF8$EZk7-YYO>;jj2|AsCj?Y7O|Cs)H?7CZ$0k z8nq618*6htjUivHuSF#zN#fI}^dy@Gd;AT^lO3@S} z?v0*h9wLWIaTG6xqSsmy=o*C*3EBE+l49abD!FKaXoyLduT?3TCW?JAIWs2FWQEcR zQF=H%CFXjaO4m~c!PKHrlMBr#&GhhjqA4m(r7UqVCOtKWPblS%dg`UGTpVy{DaPU zY%?FpDB=Bun91@yl!=$)zuuV+6YqhFjYV05T`(DYjc%!jva_60-Wf_W7EL(;`w27- zprpzX>cfrNMi}j3+!jWeqmw@)nk`{`Cyeqiwoi>Q#gKov>mU~d`GCSqG zLX*pM29+*T7<)B8_TT#`7HaD)S8%%FmOdBtL5`{!aLk9o_}*w(-DfQ5R+*f#Q|TVw zpWKB8E$OLx%8!gsdA$2bw9c`#A01!l7kG_1Z8!FAmB=Y&4R&9CQ|jf*--u}bmLrb8 zOJTq=z8zL@hgY(GH4;#TYp@1oxEXc$DsJn=_?FJy7U7)&cO_9+lwQdgv#DK@C4JNj_=qX;z=I!8g`lm z=oRTwWie%y!GmJDF1st<3LXNB?82jI!(|6laLT_`zz zeGI?p#|JKn+4aXBOk&kvM^$0`y$24~e0){&563@`;a}|0gR}u$VAM;6l1p;@*VvEY z2$_snogGIumlP(uCWI+gijdQQLaCpU;_15PcuH-!v!Bx3CYLldLYagxWk;xUnt`9w z@~f3N^?mSV5uqClIHlPY)YQ0Tr+n4uVc4AV0kE$3b7->-SUpbRH2qI@Mcf3Muhl2( z6?bY~khx@IFSoY3T8Mcmhxc~qF diff --git a/bin/plugin.yml b/bin/plugin.yml index 0e8d77e..d89fe56 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.3.2 +version: 0.7. author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] diff --git a/bin/unittest/PlayerManagerTest.class b/bin/unittest/PlayerManagerTest.class new file mode 100644 index 0000000000000000000000000000000000000000..018fb20cb94d1b45bec269529d0ae4af9245a0cf GIT binary patch literal 700 zcmZ{i&u$Yj5XQgRrrl%-&7Zb`mO@hwRayyr=rIVXs>Fq*pcX~q=xj}J*!4!XgVe|3 zR79md01t&2Cy^oqxy801DVL~%4?MRFRMg-mc z7;VA}qr7mro@AvJSuUNk(tLHIm=Eawo;N`Y+d=;h;i#9cs67vu%Yf-052|=X*t#fv z_eS}yE+)Aul=131!7iS}*kff&VQ0=M>+9IZQy%KG)Hz|Nmo8uT%3Ezl%q3JOi!Bhu zDk=XTgC8upDyKG6Z*+M0&Ob|i89L$+ygmL4fQY|%YiwhV1bbq?esYWI_gOk&8`3}x z57^e{7uY}Kh_K1o2#v+9Ci?(-%lL?W;|{G)bc?OD-T8sXOXTLPe}kbdMzm+>&b(xS Rt}*x-4!8xO%cuy4e*mH5r$PV# literal 0 HcmV?d00001 diff --git a/bin/unittest/package-info.class b/bin/unittest/package-info.class new file mode 100644 index 0000000000000000000000000000000000000000..64f0343a0d426ad418c70a21458b0bd453e44687 GIT binary patch literal 114 zcmX^0Z`VEs1_omWc6J6PMh4N+yv&l4)Z!BTg2d$P#Pn3%%)GRGb_Nzk27#=^vPAuy z#JqHU|D>$c&UdLYGO3=E76%s|sYfRTX}NHQ_70RVul B9IgNW literal 0 HcmV?d00001 diff --git a/src/net/slipcor/classranks/managers/PlayerManager.java b/src/net/slipcor/classranks/managers/PlayerManager.java index cad4e3b..7086e75 100644 --- a/src/net/slipcor/classranks/managers/PlayerManager.java +++ b/src/net/slipcor/classranks/managers/PlayerManager.java @@ -9,6 +9,9 @@ import java.util.logging.Level; import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Item; +import net.slipcor.classranks.core.ItemList; + import org.bukkit.Bukkit; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; @@ -82,21 +85,23 @@ public boolean hasItems(Player player, ItemStack[] items) { return false; } + ItemList playerItems = new ItemList(); + playerItems.addList(player.getInventory().getContents()); for (int i=0;i= items[i].getAmount()) + if (item.value() >= items[i].getAmount()) { isContain = true; - plugin.db.i("Found : "+item.getData().getItemType().name() + " : " + item.getAmount()); + plugin.db.i("Found : "+item.ItemRef() + " : " + item.value()); //getData().getItemType().name(); } } diff --git a/src/plugin.yml b/src/plugin.yml index 0e8d77e..d89fe56 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.3.2 +version: 0.7. author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From 9dc347c3ab9d7957b1390ee52e3244ce37e60f55 Mon Sep 17 00:00:00 2001 From: krglok Date: Tue, 29 Mar 2016 07:15:03 +0200 Subject: [PATCH 28/29] fix rankup issue incomplete due to some other errors --- .settings/org.eclipse.jdt.ui.prefs | 3 +++ bin/.gitignore | 1 + .../classranks/commands/PlayerCommands.class | Bin 13012 -> 13012 bytes .../classranks/managers/ConfigManager.class | Bin 18347 -> 18383 bytes bin/plugin.yml | 2 +- bin/unittest/PlayerManagerTest.class | Bin 700 -> 0 bytes bin/unittest/package-info.class | Bin 114 -> 0 bytes .../classranks/commands/PlayerCommands.java | 4 +++- .../classranks/managers/ConfigManager.java | 11 +++++++---- src/plugin.yml | 2 +- 10 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 bin/.gitignore delete mode 100644 bin/unittest/PlayerManagerTest.class delete mode 100644 bin/unittest/package-info.class diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..5e726f6 --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.ui.javadoc=false +org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 0000000..b0c8d5c --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +/net diff --git a/bin/net/slipcor/classranks/commands/PlayerCommands.class b/bin/net/slipcor/classranks/commands/PlayerCommands.class index 9dcb17306a7c7ad7b34ee3c5f42624b3fa26c628..38006d24b507201a11c55af77df7c7887a9b37ee 100644 GIT binary patch delta 821 zcmWNNduSJQ6vfZy-d|4l$XQl+(DoG57CO9q29wy=<-4Ijh zA-3%~^`YWguLf1+J;2bIJ_O5+g?AVUMmQZ|ojC^;HVu3{mwX~9=H z`C3hZ;sNW3s*}RRykUDIWfQ~dGaAoiJZs%(pU^}Vt?cA9)%3F4GT38T)YxDWHiG>& znmQZH0ehN5HkHFRjjyekBlaRkZ9d=IDjIDU$89&w_8Bb}=Y-YLYGnub$&S))Kk&2t z$S?K>r|c}h*&R;Xe{_03&UgyvJe>=k$wiNH$zyc+NUr%<{`N`y>(9~S)9LkMZu@Nh z_l0KuhPf}cBwu04zQ$6#!cx7`(!9$0dyS=g+%mk@vI@M#vc1(F^LESi4$Jd%mhas* T$gf(|Z`+VarVUMeF(S%6ZM4{R delta 821 zcmWNOduSDO6vw}xbFR9lXzAEyYfiS6h@=;h#DB~nH8pJ_GBd64rYUNP_(*hvObbOf z#V1=cXZYw6(~Hd|wqCYsZcLntCYz}vGn|iH`K*5boO8bC9KL+d_q4`ZV>R)-sq3^+ zAE`p?6%SRtHt83Y>5R&CL7VkQ=-t#7-O)CBX*>P2gZ|pda{))Si_xlNras{vRk2XJ zSru@p_9htcm~n>{Q9>y?qFmK#up*CfxU0J%M99>p{u4s@tG(^`lE9hOMKea?R!cCp3 z40(6ZUmf%x)L%NJE`6uJ1H(VMt9vA=i&Q;K+$n6b;rdV6pcgPL#q}8xwbBizJ5hS@ zCP|c$Og$-dl4^ZOvnc6_u7SfD(OW%uQt9+nZ!*+}O!XsM&jz~&lcOk4Ycjbi4c4t? zfZ`$7lCMiVlbAi|K&0fQusT+wd0FF`povUU5k;ED6csZ~F^V;x=~}?+TEVRFg|}4A zY#kt`&x1X+%+qn^tDZ%{w)b?JB|6ViwXsYcEZ243C&J2b$0{;eO%A0D2b^O8q3W0X3O#xd&e|%ZEsnO)^ILyTP=J8Pl$8cOf?^@*h2q$eg!IYy#L&bsSy1H6=`lZr8Iwc1)4lTJcr%3%d(a8{q^Uie%B=M{{Y#w=;e z+uCTJU%au&z1YgbH{$t^=gs_qEOHU4o;y^nHG)mrKj0wGx*tp zG3>c6x@ojb)&*oILOEGbK}+EyFV<28)>9=m(A)A7gV;i^h^`=&n@VVfL{bH{2oooF zJ0%CmOL^EJ?rBsltd%(a7X^vYPDP?CmVyCctwj9iR6iZk&o~bo=&Tswd!CzI$TWej zHEF@;ykc86e?P`=6prFOgI62u6NdynVtLgv!UNA+(x!xOiGg0zXwX+lqkgr_KHqd@ z^DnZ>@quLUD3wU!L%Q4REXp8xoRTEdK$rR=K4M^S9H;cTUY93><@c$qL*u;BpkKvu z4ri%EA1cc!%wYI?%5ZL+!zsgsJG9)?zmP%yWJ-S_B_7frdgo_)!2h+P&t3Ua{4JV^ zDssb5uOmR45v1*?AwNPCM=kXTCItJ08<1~0h@CWsI=U@5fqJ@&2KojO`cCk^#1BOC zGc@`Qjcmm`JVWpq!P(Gw4w~477{7>Sehn>LF6fJ67jF`BtNhkgXyY2}=63AiUcm#{ z%l*O~MmrCqgD)b^6X@ix1@EDY?+f=60{jS7{0F-E33`&_=#nv$K}wIKo4>>*T$VB0 z%-y(xtLY)!L0OZOtG~Hwwx`R+9x`v5WQD9YVjE1(hD4GrnUn!e(|YeJr|p^yG4ScX DKqfy3 delta 1214 zcma)*Yitx{6o%jP((cslKnQgy5JI;hskPKqV@-%9)&vS9g{25ol$K^~x649zTenLo zm+k_xa?w)S0ZLI2i&!pdLTIK{BQ`N1gha*ogTzEb43Q8u;RpWmQqOc3G=?9|Waj<8 z_dCxyXEJBL>6Q!K;=cCxrUQG)}*-4i9YA5lE49Y?(aFBi3bav8#{$29H_4dS^a)9Onf_ORO;*4K%x@k?)v1A)7RNyk%*y zV^v(Mh8+A|lc)HeRaQ86dWxq_zVCo8ZK1NG)j9v*Ql#+lY&m_YujtO~$ybr37f@Gv z1?#M?g^QCfl?-9$5dO?#yDig7hS_mZ&nKZwpL1XUtU?x-<7xU)$rY$#HP&(^YPlNE zYD`HwAIh;ncbb_S7>10mHX;W^CGz>Al9SM&ZZ_l()IzuoJ`JGO;Yv+Gn!hLP|1^9>0Hay=o*pLHh!KUcqa{x=jS2KuNiu69v$J^Rz;;Z=`{Jj zTEC&s`6*9VE)7Kz(eZad%&Mb!zXRI`>6cb*FWJF z{__e}#p0)u>oA$MDCBxnupTuG;1xC?z(yn)L`rp^YPWj5Y(hUn80H3it~#nCa*Z4D zH8A1L1S*R8MhgcY(^zlb&9Ho%`$_n;^k}d7-RB0+oVd>pJZItsJWJ#rJn85 z#4Xav4mqIO#jVn#-eGQ&0dALb+##dvl&@5;Ga)zB`=0f3i?#9_cga2O9-n5fPATN~ z%rqCummK6-9n%`w!*e{Jnc+IP#*lACmUv1NhLpm&F(xLm4TwRFq*pcX~q=xj}J*!4!XgVe|3 zR79md01t&2Cy^oqxy801DVL~%4?MRFRMg-mc z7;VA}qr7mro@AvJSuUNk(tLHIm=Eawo;N`Y+d=;h;i#9cs67vu%Yf-052|=X*t#fv z_eS}yE+)Aul=131!7iS}*kff&VQ0=M>+9IZQy%KG)Hz|Nmo8uT%3Ezl%q3JOi!Bhu zDk=XTgC8upDyKG6Z*+M0&Ob|i89L$+ygmL4fQY|%YiwhV1bbq?esYWI_gOk&8`3}x z57^e{7uY}Kh_K1o2#v+9Ci?(-%lL?W;|{G)bc?OD-T8sXOXTLPe}kbdMzm+>&b(xS Rt}*x-4!8xO%cuy4e*mH5r$PV# diff --git a/bin/unittest/package-info.class b/bin/unittest/package-info.class deleted file mode 100644 index 64f0343a0d426ad418c70a21458b0bd453e44687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmX^0Z`VEs1_omWc6J6PMh4N+yv&l4)Z!BTg2d$P#Pn3%%)GRGb_Nzk27#=^vPAuy z#JqHU|D>$c&UdLYGO3=E76%s|sYfRTX}NHQ_70RVul B9IgNW diff --git a/src/net/slipcor/classranks/commands/PlayerCommands.java b/src/net/slipcor/classranks/commands/PlayerCommands.java index aa8cead..8dd3db8 100644 --- a/src/net/slipcor/classranks/commands/PlayerCommands.java +++ b/src/net/slipcor/classranks/commands/PlayerCommands.java @@ -128,11 +128,13 @@ private boolean cmdRemove(Player sender, String[] args) { ClassManager.saveClassProgress(player); } - + // suche plass in permissions if (hasClass(className, player, world)) { className = getClassName(className); + // remove permission group removeRanks(className, player, world); + // remove playerSection plugin.config.playerSectionRemove(player, className); // show public message diff --git a/src/net/slipcor/classranks/managers/ConfigManager.java b/src/net/slipcor/classranks/managers/ConfigManager.java index 0fc931a..c9e922d 100644 --- a/src/net/slipcor/classranks/managers/ConfigManager.java +++ b/src/net/slipcor/classranks/managers/ConfigManager.java @@ -109,7 +109,7 @@ public int[] getExpCost() { } public int getExpCost(int index) { - if (index <= expCost.length) + if (index < expCost.length) { return expCost[index]; } else @@ -588,9 +588,12 @@ public void playerSectionRemove(Player player, String className) { plugin.db.i("Remove config " + player.getUniqueId().toString() + " : "+className); PlayerClazzList playerClazz = playersClazzList.get(player.getUniqueId().toString()); - playerClazz.remove(className); - plugin.db.i("Save player section after remove " ); - playerSectionWrite(); + if(playerClazz.containsKey(className)) + { + playerClazz.remove(className); + plugin.db.i("Save player section after remove " ); + playerSectionWrite(); + } } } diff --git a/src/plugin.yml b/src/plugin.yml index d89fe56..7fa3fb6 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.7. +version: 0.7.1 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] From b2680e36ec0d31f38ce2547785b19c30042ab7e3 Mon Sep 17 00:00:00 2001 From: krglok Date: Tue, 29 Mar 2016 22:55:36 +0200 Subject: [PATCH 29/29] restructuring internal datalist for 0.7.1 inclomplete --- bin/net/slipcor/classranks/ClassRanks.class | Bin 8537 -> 8531 bytes .../commands/AbstractClassCommand.class | Bin 19254 -> 7151 bytes .../commands/ClassAdminCommand.class | Bin 13331 -> 9146 bytes .../classranks/commands/PlayerCommands.class | Bin 13012 -> 10149 bytes .../classranks/commands/RankdownCommand.class | Bin 5308 -> 3270 bytes .../classranks/commands/RankupCommand.class | Bin 5300 -> 3262 bytes bin/net/slipcor/classranks/core/Clazz.class | Bin 1270 -> 3948 bytes .../classranks/core/PlayerClazzList.class | Bin 2384 -> 2427 bytes .../classranks/core/PlayerClazzRank.class | Bin 490 -> 490 bytes bin/net/slipcor/classranks/core/Rank.class | Bin 3163 -> 3163 bytes .../handlers/HandleVaultPerms.class | Bin 8010 -> 7051 bytes .../classranks/managers/ClassManager.class | Bin 11576 -> 0 bytes .../classranks/managers/ConfigManager.class | Bin 18383 -> 11608 bytes .../managers/PlayerClassManager.class | Bin 1651 -> 2216 bytes .../classranks/managers/PlayerManager.class | Bin 6949 -> 6949 bytes src/net/slipcor/classranks/ClassRanks.java | 4 +- .../commands/AbstractClassCommand.java | 30 +- .../commands/ClassAdminCommand.java | 20 +- .../classranks/commands/PlayerCommands.java | 8 +- .../classranks/commands/RankdownCommand.java | 6 +- .../classranks/commands/RankupCommand.java | 6 +- src/net/slipcor/classranks/core/Clazz.java | 190 ++++++- .../classranks/core/PlayerClazzList.java | 6 +- .../classranks/core/PlayerClazzRank.java | 7 +- src/net/slipcor/classranks/core/Rank.java | 32 +- .../classranks/handlers/HandleVaultPerms.java | 10 +- .../classranks/managers/ClassManager.java | 349 ------------ .../classranks/managers/ClazzList.java | 521 ++++++++++++++++++ .../classranks/managers/ConfigManager.java | 12 +- .../managers/PlayerClassManager.java | 91 ++- .../classranks/managers/PlayerManager.java | 3 +- 31 files changed, 827 insertions(+), 468 deletions(-) delete mode 100644 bin/net/slipcor/classranks/managers/ClassManager.class delete mode 100644 src/net/slipcor/classranks/managers/ClassManager.java create mode 100644 src/net/slipcor/classranks/managers/ClazzList.java diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index 9cbd7dbab5570ebefd45ea4b61036638ffb05fac..0cfa74d995fd52cd2152cfa1da43cd10e69cf2ed 100644 GIT binary patch delta 50 zcmccVblGV`4jZH9j@(0syGD B5G4Qr delta 56 zcmccYbkk`=4jZG+y{2sDvsg!EY@D03tmS A`~Uy| diff --git a/bin/net/slipcor/classranks/commands/AbstractClassCommand.class b/bin/net/slipcor/classranks/commands/AbstractClassCommand.class index 1afcfb22aa4aaf0272d3a9d688033f65fb2d05fa..d91bf04677394ab344e97af2ed272542c4a4dcbe 100644 GIT binary patch literal 7151 zcmeHLU3U{j7=9;&CJlvR1q2aYKrvD1svtsJ(2y3WrlnfIBRyVBcBjeE>`cz=q&6IX zi2uZ+o`d&Z`w#dD9xuG{_|9%hS29_eQ-UA#BH5kUnP=Y5nP=W#{`~PF0Gx-kevQCnzo955 ztuqz6v#i#xFT^dJH5y34Iu#jeL|B<6kYgLI&E`CTeO`lkYs`REqC2*$LPlJTArMm>O z73s4a93wEkCDWWzQsv<|8P#`$VxerVGv7fkwRn?iE``%l5~U8pDW@=6p+ZRQ1ayr# z)Co0?@EpZfnPS3Yj+TyYFh@vnuKO)ux*>h1&SF2auvl_dl?2mIdYvThYE)(MLUj+-nqaCGchMu9TUxyX2Y1o1W^>DwJ<8sQH~dfYmH%y zb|V{S^AICcWBjgi*7OG&I^6ibZSo=DVL-LlnA()ylbHWX$7yquhK&WZQ0g#kYvyCJXmBK+AP;SdAQKS zId`6;N=u5ZZ&#%P9EB5Oa2Q@EaJZP@itz?NZFt*wl?%4m4r)x@HisL5iK_Hy^Db4~ zw7Z>I-QdU_FZN@Dsm$B(S}D4On!su?NkF?ZH~IE5L#m*rQ$|epDzehsRl1jlGe~yR zc_-3NLzn}M9a>I5!Za?3WcHzo+| zZ_u#p2V59hjv1CJ+&#R^ZQgbaZ;$S0J)u|XT_+D02{}I8$oo%|Z}d7kBHjXO7I!B1 zqo<{QssARam}}OU&chTT{2%wni*hHxgjFoSo1QT~CRur>9>!hb0LDvvF5FPEjinZM zAkY%#avmX~ta%0!AzXoN;1#V4Xg%-oOvIAXA1`d&ArFaaVR7~BUdlO;lJ9+re^`p_ zCii^g+i0Pv1{W9Pu-;(y_Ys95c&C+z&j|cJTt}E-e@=y$L5McSy|IBgkMpqjf3m_L z+#J(&S+ESgmW;tZG_*f z2rj&rK-iOJ2a>fSybm8F5K^@u$E*nF(Tg^3e%NbCQnDg^1eX#B*~eO3wjf-wB22@~ zwh_LzB3yy1350Y@errYe7(PiLq-*h=6`>5*5(rzqs95aq(26hz*Aob-c|m@)BHY+M sLdKSxS-3d>!je^n`98V%X|EkJKUfi}eGnFU5%w?(0)bl?g&A1-3wxSl1^@s6 literal 19254 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 W;YvNEq#J{Odw}nId#gu^Oa2!l#i%F% diff --git a/bin/net/slipcor/classranks/commands/ClassAdminCommand.class b/bin/net/slipcor/classranks/commands/ClassAdminCommand.class index 014fb0c988bcfbead1c0d6964b2101018c8436fe..9ead8f876b8f73d6b983c71be647972374735e8f 100644 GIT binary patch literal 9146 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 diff --git a/bin/net/slipcor/classranks/commands/PlayerCommands.class b/bin/net/slipcor/classranks/commands/PlayerCommands.class index 38006d24b507201a11c55af77df7c7887a9b37ee..0017dae2c74d084e2b8429180b1917aa12698818 100644 GIT binary patch literal 10149 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 F{{s9!4_W{K literal 13012 zcmcIq34B!LwLj<1b~CvV%z!c=a)YATAQG+CM5vIkL_&gurGVQcxk&~lGjSFqT9>-l zE>G>E;I1gGrL9^VKwDf|_qx=j)!JIoTC084*0x%O!uy}^-kHphnZWD&y)NY5Z#m!j z&hkIYou~Iau!D$>)kgbBW11GVl68qlc%Um5uj`705{Y;yx+YQA73=R0MY|Jqiz1;x zE8gV1`pC_6-2V2=>P#f#p{`_;&~vsjc~1&Q!^xRUM^&~Kp`bP_76uxtmNB`TV%?UX zTvTF^hrCRqTEkJRE!E#?#g~LSBNkJ6Ypg32Sr&?i<=q){C;P$)relg7Q{-}u;Bg?5 z>J3MkjwrS_hef86STuXRp32r(ytl41wPsB?nUPfDyRCTR2rC*}SBKVy>LQ_N zZ(T<+9**`lt{Og6wbDlcrg1qZSar3E zGn_D^v7{O9ABb4}*l2Z6GyN2#2|gOnRIy*J7<3p-WODTs*?6sI)V6CBEE1sxpwmMV2 z3+=Z?ou)9Ewqb|5`@>PQ+e%tpxOjy*5Q--t=4sQW`RQn?@=+yIZ4nU^q;60()i7}w zGOsM4t7U$0Kh>aVRL5k!{Vo(>D^9k!WJM#MCE1T%6B4La)T?`Aq|grzWd z!|{aHP^T3UXBwt1IAJK>3ug)xutuh`j%287&BD-t<9P?+ROgN@(ViI7#1ZaUwaiB+ zF&(<^p|exr2)xBljWkmn{|mTHW!170nng`Mn$0vO$NZc6Ldm9BBo;TQndUHg<}IEx zr;X{5+?!_?H44#r2F<4y2sAV>0FgpRx!P;*Tnz(htQsZ@hb`FD0;bVJIAAWb;tg=4 zMp`I@adsX($C-=M69-&m(5bYT>7ZUK*=!}c;^Bd0I0hW5sjSMqhz(D0c0s9}g>%CZ z3wK*W5b08;qjLl_(iVf3(-)ciI2D&js1wKF#C=J;49y1oS^Lm4MSXn5#}VXP9y8>{K{zb(`jS z=i@b|Bp8aAVmG}8^~q7L#dDf_{w2z7QgnLu* zkmy;b0fbd&@w~DIlDw(>YADoHJ)NH=C=54m>?iF6W&Si$}VJiCNv<>Qpls z18^&nIt?% zQUf}j&vbmww&wQbZRY-WcE`?v@GoRK*4aC6&XQugI{ISgm?FW9?3sK6c6!7#KG#e0 z;T&lKP|?1yPM0!~PL~6q+7OAYXe`y+X98kV5|0yRrQpbwf_gQ6x{AK$qpt#N_Vq`D zzE0o3@oPhol-1rN@u#JL*XndN!e$lB_gba}&J9<^mFS`3{p-7!mc;YFWze_jJGdOc zqr-}?wc^4?9$MMMjiq!wZSc{0rh{{E$(}Um2D;HEk`d*!Tr|$2XU@)i@s@y>n+>{! zZUvA@+POvy0}+c?`ssGs=%YIhAg(tF3^-YXL3dIEm`#M%T55bzJk}dWLL%{elR@95 z?*Rq-LJ2hqCn~^jadRkuhG3NG`vz^MA0Q?}o{DfAJYOZt`)a>HYyveR{?FVY@CNC}25q7Hfz@3x!7Tv(eiJd|o>-a5#Qe0Cw)jjv_T)xhw$xi(n4U4 zfwx2Q=(ITFfV98S-+lBE#5F`FGi%U4=$|lwsI?Av%Fm}9iTUW0;`J6vajOnDIrrQW z`j|d7=rj79kOLlwCUzV2Z`uR>Bi{){5-q(^tZxb>is^r)4$GmkRZ2Dr6izpF*5J$P z3_QERWudeS$FtX9AA^D?Zlmg0+pqHF*63qD>Z~G;t?nZS>ukWKX3RAGT*3z#Jc>s{ z*n)SGz{ANP>>QlW$=b2L+~9zupJJ`e;lzL#5!AqA4L(FX*9SmugT!?n2V1bOCMwq% zr7cf^m4}QRt3^s*=JDg}o9_H&3gB2rUAW6|iz>t<;>rG4iNt`}MRAZwAc&c{J&OH~2X0p{?0gIo9%#1T*v%bqw?W!cjz~m-BP=rbR9*~^#@QVy$P#vtfH5*DPqLV>`vgca$TCXb?y(+obH5uqg^Qc6+@ zQI0|7r)xQ3*~#sOk5mD&&XSO&G6<(eGR5{f4epYjOR4lioUo@ekk3DaUpgZ_@u;F) zm)?xg9<|dr)08rOE3Yv)B00lB@b_qBFc!7c-E>C9R@T&Kb*-7RZa@~R)dL2fEvxFfW;Vh6XfCUxm!9B{2GTF08rC~Tm z=W8M74%mwfn~qQ$8O6hV{wv7VQ*SsSBtRTCxfE5e?YcVOfCkBs z;`jTc^G$ZtL*AzIEdT={X4=%GszWu+w;6o9By;}eS&J8(sk%uzZ$ur{fIWA~{#YuS z#PfH-kC}TW94eyH7*~G?O6L|yoGWzxAr5kyjhSYr&i6p0wV7svi1%5(&)^^P7GQu4 zqqZ9LL2ne>=nkeYFH0yf*#XHVHt>O}}o%IY4d2>lPcu`CR}Z15|LoLQ0w zWze(Y0ErU|6mA8vyP%j~HTX6DjU$JpNE}v;kiF*SHUAkPB2k}ExMg70o2c>m4W^Tw zR=2sz*3E$x`Qn+V?fcPx5z62S;f8tFR4!@YgUoQ{%NfgS+AW$@cl zoq4QyJQmma9fScnS=uTh_IC~blZZ$S3Z&`$K2viZm$LSM$){}589BVyF39Al4-C4P z>U93ABr4tAI)9XV5JnE@j6w}A{s#&xgxP+xOJakWNU4u0J*kM!A4_E#xAvV7hW=&n zr*d~cFbiY_|8&|SGrJA`qWI7rb%6+qI7B6l45Z{=fQib$nO!RM>6#06ZihjXZZd-} z7rN#_j1`XT?w*}1h};uHp;>+CNx-YosvCqpfi(bXd5oK?0SE=M<});1WyIDxAeTxc zbPcI|aEWw6Re>8t{-=nkB{&>8d~2qcq?X7E>7F+A#bWrPqq>`FYi@HDn5GVw+(9xK zVa5&{5YdniZ zNxv6Q8u{_BUyasb_e1PeWKbF2uwK5Gfd)iP2RpQG#R(qFO|N-`$~RE3dJB!I zDL*7l;tlFOb2_@aXb#CdOB7yIUTD$r!G4klujTwXbFAPF`9t9%`Jb33EZ5oP|Q6@ zjVrd&jQi;1G|eqPB~7g|oTm0Pb>JmUE7EjY{>n3DW#>qf-9;vQWM{a@q$0a!q{;q~ zCSye=&z3WjMJCmmYe$+~H`3&}BTas3q{$1ilS8K00MjCT6so2cnn$NlH!YwqQ!Cv} z3+X{>qgSb&{z;3toKEFBd;n^t4i3{2zMPf~nJQnAu@O97g#AcH1ng|(Yd67;VE%k@ z`6X@Tmo&KXe^2cW@9lI$R+ZKW$}cWk4tfXDLx$}*}JlwSjLaBZ%2*JGcjzQK*n z8_8Get#7mK=9@v!cDhcZ2Cuwtp_|r|9`tUb+p2@^pm%DT?pn`YJg4dI26txchxXe0 zf?kT#Bfx+d{Ca>+qBsyBMNPC8maz_2a4s#T^Qn_A#HugT*>ox1E~m@rO8N%+ zJvXB9wwbP`hv*u5nyy9j@0;`+`WC&1u@BLM|A?;V(de#Epbc!&4X~r@QN7>Dv*{K- z16}bj-NsSWtmotXBDzc2)qLAxvUYVbut)3)Rz!j`8oBsFdQ)MK50%PJJh`cq&!M;Q zQ6&_6>&mNlTqpR%y1$NWnJ}Tcu7wrP;n&h93slJb`It~eMqd&IQ?r?9U zCtyDBH+VMDy<%ht-Vf8q4ep?O3;hcQnWkOq>AI{|%J)Jg_mOyb0BNq6h(MfLZCge` zU<6u|QqyxouYtu%?Y(^O#4D*6cxqKAGh>}xCjK7xOrK`;C{dK}HrCm5}5u0Tio z^C(an>3LYxQ`|={ z_85z|7%&oh{n1!2aqdAX*$cM4K4RFDk1KuX-ulpbrM>VWJ$KkgAIpTAJZ3KvgMyn3 za_4RmI&%xJ1bewF9r9Q|Ie#LYaP-HdJcAmxr`}b@lKM=QV z6ZrysY#S!g=N0^gW9Wj%?i^(wFIMT^#-E2-1-KFa?t_Ys?Qh{3HEEu;jpsFZf}SU+ zei#i!U_n6wn`lkY1B-9)%Ac|ZUv@K0SD|u%7h-47C%%Ct?Qm4Q+gKf7$uI0VAo>Uh z4qnAH?L_GeIuy^pg8{sOuM%$}Kii4I`7I<%f1oLlVGX?tczU1Cg!W_f7fJ&5uB5-x zP565&lzs>L?RO)L-b;58oOTm0g{gW#Kg7#0=EW&1c{$C2;>ASAk!LprfqSmquu!^cH^qHivWt45e3hv~#df z4#>^)winvem$!Ti-IwOoI7uRFq2>Le!W%fB|la>=CfnUVaa=v9$uIm;)e`I{M*b6qSG+`faAn0MU7 zE@Mo$RHT@qxz0I@hB&9Kv^)tGN_?9D_gLGHnbWq}B5%UUYdJ@Y(?LM}A2=ZG5uhwjb~W-10kP8M_AXNc4W3 z(n0r*<2{A0wjq19>}+0KzY+5RzF9=Yw?dc*kB%r@$0PpLW_M+sCBS!JP0&5oi-f^h zd#RVlBJAz)w7Ajy@D>{$@n?Pk+d0qw<3_e3EUUNQ7IOXEK_Cf%!nIfwzz#r;{<11REd!A zJyqV-(+~M>{ys#02}-|eJlQGMSizYw02uEcT8&7^T=^+L5kH8`)B)ZPu?fkQdxBhe z3vZS@Ho!kX*rS50p6;T zveN3B+O53J8GAsDRpd*$N1ghU%yFlw-8*u2KkV#&G-vGR&e-E>?CxrWvL}%Os#w{f zLZZaLU)Z5-Que?A|5Am=>|v()?>^8uEM@Iz(rmg13QQ{%l&ZJF} zxDR1~qj#@EnRn)?1*}UwTOIT%15n9~I^dtGWdlQSBU#~3mOFR+Ox>{phJ$Q-J=r$C zYhRM$1cl7_-)i^t%x>EaB|h!7rKxFv^L=GIaRVKZZ)nO4HFu7zU|p)NPHW!vG!~g+ zgQvQt2D}5ngm;I02@Elxl(Jc^G=~&$N#$I87YbA2`9QN%@Qd13{G_#w7P9;XbqOu! zrL=-q;0KngXbqo6{d^{VcOv{dg=ST8fX`xpK?Dvgb!rTaDraqwJ4|8 z(HlHS@9??wK7R>6EjXXOd?CKcU&IsnVy@!Lcpg4SS$qXP(|r}+&9CMQ@R8_pd=2^< zU&q(*_4x04e5kpBxAKj=oo~j6g=*R|dJTWt@&=_=u!u2O#6HJbnE3i7+Iqxd~nJ-_cdj{oL5 zng8x;;g4PI{E6#S{>*h6?{b~NdtIwF%{8F8Tyf3kx0uFy(d*Jy_8MyH|fSsUlNM;q^YPMhF*K|9>_iZ;phhF0NvTbu0qKs&X zu%3w|c(R*7GG<4T*{;`|!2JdqOm^=24t@_UCAtT(>tL1HdJ(w{Rm%JLn#?-v%dC4Q zyY7X|I_)faS?zFZn^4OudfH~XQY({OSi1+U3TYDfT(6*zQcVKa+vuvwm`CNuE9tP^ zFs#x*RUq(hnyVTF<)6~z8UFmYiN$ABVhml diff --git a/bin/net/slipcor/classranks/commands/RankdownCommand.class b/bin/net/slipcor/classranks/commands/RankdownCommand.class index 3be8f966406cf157aee2004e6c5e4d2ccecd6ea1..4612af7370aaff9341f82fd6ed70cbeb8079c661 100644 GIT binary patch delta 374 zcmbV_KT88a5XIk};KkDzwGh%xC8m%F3W7GlU?(Dqg^0qMn=2-PTW8KX@OR~~*2l;Kn-9ge7`WjjuUjkTh-(WeQ^be+P9s!&Q>lA^^VD7EgQ zMuzKbSk;)UCfj6ES}l!sl5JB*)L^?ORBN*v?Xrf_ux6M>d zM3!yGsr`T2V0LJ!}**zk*eaxdOsx^bY4PAJKnz%17up4$rZVNyn+- O9J-!&%EPszkDFhARB;Rd delta 1999 zcmZ`)Yitx%6#j0R?M}CYz)~O^X>wZ)?XpW&s?pFI8YoRMDbOqiq^0V#JKZkb&TM9O zi$!!}qM(9eS>#cWisHLI%41s|);B7?5Z{QPB0li__$7vT?rg!fLb92ix#yhkp7VX* z%st@Q?{ytKv$r3><@l?|bwZwz0}lc+?qnDhQ%x(Phj}cjwreJraW_M*pEnw zJ zumum$PR*)ix56+ZRp*?dRWDK7)Ie0#!-4s6ljbe+*2?H&7@^ zsj1Q>$sr*HyOCzNh+5U7?S`&3MpcW%8AsIqH|fJiiEuMl&2T}YRny}ZFLr_B1qCnSB?f1kNT1gvHohj+A&qU6 z@d`thm*#B3YYGksz8qD-%F4Mi-eBZ!2Fk^@#}#~uuSl-cp`7s&!=&O=QYsq9a6-X1ILYABZi-lOyPeb+ zX+n~${~bgAwaps0XXio#QdqOi+hip4P=Sme7$(l3HJd+GZy(4tOq)JlF5^drO9L5% zh~8vytJzpOh*D191v{5~9mO4>}n3;C_ZQ zHcoeMEtT94mO5zpAx3gLr0M?tPPiufdhw{#o!^NZ{LFv|lvU--mwscfWiNU})y60{-=LL8;r{FKvhHmr6<{|A>-O$7G++ z<4Ag>G~T>Wckc`;&osA+Sb47xACzW$vJW8Q$xh?5J{%)7k0Xt*H(|65YojjAOf+ob zZ_i;0#N@E(_d}vS_o*}nh#8hR6lPfP{3vurjev`;otQ+|1$4bGiE=DL1!_@+#i+sc z2tvg|gy>15r)D%@36f~RZHS=*CLJSj`Zy)%ZE3@CEW=4G$0^*3Un%Qv+>SF?!7j#1 zmQRP>6s%$;bhurOHLQ}{QiHWDNQN=6o~@>{Xg!h}*+y((yXjy#jIHb_y6CI`W@ju3 z1taN+%t^p^(DzE*Ek-@EP|mvW6Mm+ND%fWHf;vd3VjHN9Iyh+K9{h&ik&PRuJRdn{ h5M)kp`sEg$M!joP;Xk;-i6bLVqmpp{psXzX`7go~L^%Ke diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class index ab4a237a9a4d1cc2ff1b02f54df876ec343f2254..01732b111b777e1d4d34336319da0006e823ec3f 100644 GIT binary patch delta 389 zcmbu2Jxc>Y5Qg77(Zo}U*ofU&X^Id;MX-_tI}uSVL@d_Jq04QNs2a;pv=0BkPJ83 zunL*1Cfj0CT2+2#l5I;jC}O)SRJ)emA$f7nnpj1LM`danEr)kDPnqh8=ytc_ z%>K*fzGT_Ar&_9?tf5PRf>wE-`WAGgBFyS~k PtOJ*)T<77+(Z}@{B~N!c delta 1980 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 AnE(I) diff --git a/bin/net/slipcor/classranks/core/PlayerClazzList.class b/bin/net/slipcor/classranks/core/PlayerClazzList.class index 7f68d5a4c23d5be9bef554afc93f4c2c31f67ed4..d85dcbc0869ca0c80ec66ca87c55dedac76a7414 100644 GIT binary patch literal 2427 zcmbVNTUQfT7~Llc83+T)Eg)8ly$MM$TCAcVwT)VVfJy`^w%Q@g3IpSWW+txU@92wN zeea78cCAVmedy|Q-}@K(GivuaGnq_CyLx#bb1vW6-`@K>-{IFke)<`}6t*cUaluPKP<~9O`qJn~b z=~fRT{3=UGX~ejWcknKE2;RDr)se%bKzF(7c!uS;i{`#S3v$DljZWkR=(oTH9q(g` z#u889y(o`Hbi0ijKH#l7dOJv}blk)(Hpi~HUy`QwHL9<=l1nq)xQzu3^K`7)uH4YEh@wEJ<(W0ZtJc^HEobM0 zbpkBou7*3br3uj3)o~9ivUkj{n7#Gx1vQoD@9S6v@0hl2xXUV(tw^WZiYA?r!XD_@ zz(WdqD&Grs$4CpgLe;j}h+iZJr+E?agaE1cnd|2ZcMF*0cX`IE-$v?h3YRp%MUn#W* zz5G4K*)~tebEBCbaXgcKg@H`w2MoQ!P^N!4cYqV?->b8y_?sp&a0&^WMi<^hAI5Nk znNM?d%tzts7-z&&S=odfonhV>^Sy<)gRFUea$X6ja zJjdvmj8=4;^ipc|JV{o09RDd?k0?(E_?J|y zkak=q0l#Wj39l^3lJAul42c?eGeR>N(oBXlXK^jSStJcv{jN+_)jH9H^4(nEH7Y7N zzreEWV?4kkWZbPZcHzUIz}N9n0DLVVNZHSDl?1+d{d-)>@D29w>^g?=fYcw-gLP!^C?Y8rO3DS2 zhIvs&lq6~XAY!js`-BFe@d?-Xv|xZT*Z-2?r-%6L|1d0*p-CncGAxtf&fhSURtv_a T@c17X#_$E%$6#Pnean9WXzb?4 literal 2384 zcmbVOTUQfT7~Lm?41oa!Ay}=_D?$=TEov2%Uea3bq7kgr)*iwv7#SyYX5uRTj=tE{ z_rCa`YqfOIhps;Ny?>!UqjsM&lgWg%tCyFVbNSAmz4!NhC;9b{pMC}~1!*89P;jlF z(P<$bHKzJM!`4CEE`Sqy_pP$VakN4{WD2C;gpexhHVk zw>(=q>z3!+HFs_PLjkcM&|9v#ejwdoT{?BE^SAp$-=5A**#hZ$-QE%ySkhRIbhk^D zz_Z=$8G+1I+qHvPfpcT++wCjk>x3)UwybV+;J67B{Q@0h06;OEu0!^H@a~i@0hrZi^M*9kZF=z zTXALk{w>z~zpl0ofvoP5@cUh=S;Aq{#t^W@fCjaM0dekzjxuDw`Mz@WeG?y`%$C@- z_AAQN{zmq7`*CTe2Or^M1J~(TvoE<}Vh-~HU3Or3GN^e1xt6o@(K-PZv20+8wlo16 zyCzm}L-mgJ6~EqEdr?l+`I{zgp~5oVk^YJfWdqWwwxlU%l(2OZckl^?JyI6~yW?aF zxpK{M*oeGJNN+>w`;=f!dd+=uQyE~pRBCmvYF)Qg9}dRZ4ezZK;R` zgqcWQV^`ag)4no0!=_=4^9D`f6grXN%+RwguJE?uSV=U|%V!^F_ZY3>2l7ASSibNB z2Lpq}1LW>J*XK^DJ*4@3na?xG;w<_xg40}iB|OQUGn}b7^#wK@M`t-oaXiAP@Jl7W z)m~@*dkj3|Kv9II2#jh#GYp6Tg}MQv!?TP|sc22HNv&J2PEu+~Bjm!Um{KO9B=CBS zwLsbmt1n+Tz#EjyS5j`DmUV%c7irU_1a4o9+ouI8L8Gz2n?zLtbA&v=xhKdB6rSnv z#4k9n6nALFA^tS2yvjt(CY0wQ{3#tPlpPmHBJ^*X@Y;d``CfX;kfed-1kFrLGZWLi zg6Rlnku+4sv-yI~bGiu?x;e*^ST5W&R*iFPQtZ0b%gEHh7KT1ZCd-ONMKQ qxch$?N;0gHp+$z040ry9p|YBP4ao4`KQK(;GqO+NbKKYOFa880J>A*> diff --git a/bin/net/slipcor/classranks/core/PlayerClazzRank.class b/bin/net/slipcor/classranks/core/PlayerClazzRank.class index bf13d0927bb8eb47c79616f4a6dab6c40d19d0c9..a5f25d37667635894b4406ca9eb9a84819d9c508 100644 GIT binary patch delta 25 gcmaFG{EB(QT1H+m1{MZ!22KVE20jMK$-5X008zDF6Tf diff --git a/bin/net/slipcor/classranks/core/Rank.class b/bin/net/slipcor/classranks/core/Rank.class index af81895979d97aab47d9fb6f194363d291f068f7..c8290178902e4adc6e5662eedec4cd739f9068c4 100644 GIT binary patch delta 175 zcmcaDaa&@;DRxC|1{MZg22KV&20jLT24MyR21y1(26+Y}1`P&dps2~@*X&JdK)3xTYn$(uRd7|SOA;(TLS&A`r33pBT$ zL6D(=L6xD2L6f1GL5HCYXle&T3PUGDIzu-@9z!p~WQIP5X$%t>76H|*W|%Tro_i(Z WjL9dtZ5ZcFX5+D7TtC^KM+N{#G%2V6 delta 175 zcmcaDaa&@;DRxC&1{MZ=22KV820jKu24Myx21y2E26+Y(1`P&N20aF|$*AymvX+6Jp&n>% zBZDAA6N4&43xg&@D}xS02hj8`h7^WwhIEErhCGIThRF;Q7^X2yVps%Jx0+$vWO?qD XjI$=6L@|+RBg$Wf~a&+Jt4%V5*xCCMM9MVm5NwUAW$e2O89>Y<^QMrX}B}CLrYT@ppovpci(;I zopauunUC-53Cy2+;wXS9Np47l4$&#CIMzCEkvVzRe7p=g?J$~k4HDl2lq+IW*ZX6QM4 zt2vohWiH*b=f+II^m=g&yF|jb&Gn)WFX4oE$T#SCh0r2e{0$=HuccQ-#D5o^68HFT zDthoXk?Y@86#kD4L(z5)>}Fzx<(O~2fck&-N=((REk-sPhB9e+&{y&(erb~kUW?d} zn$ss#58fkOmKc)%P9?MYb|vct;R7E&M4Aw|crl8PeE1kKLR~(q6em@qgqJk*U3m{a zA@~jZfKeM+_TV#4l`f7qaJ^iEHhkg3m*^za@{MoG6s#5NqCNPUfm1i%#?4}}Tmt!) z;3|Q5@I7JW!0r(>Z)U{WK+uaHEk->a{3Ln;jS_wlTLT;1_`~XiKgENAZoebT1`(Wv zA=dxs$-w=tK6ImsAHaJA$A*K?9>)BWJd;q%(ZwDBPhkZ|pFQ?sC06l_@H}1+t3zFZ zWCF>(88~Hn-U2$cx z5mUGqNmgdr+ivNks}P_FR#Owg)Qm=IM=Nz;m^yJMMKMKJV?SMk8S1swHkTBYuYt88 zj_X*jHF_F-?AU&+!}Yj<&)C3OFPx3B)_%5k9jIuvbJ^ar4CLg3G^N;#HWu4TVC_F_ zIbY!NhE%+0k2!2{XDc@ByTFE@OSaA8;A6ONhR-cZ=w*%-{cE@xKym)%ZbTjRqn8qh z(exsMQa1_+4~{!xB!5Tf&1roa26#(12%;|3qai>6R)aZbAr*V SPwY%MOvi<@A#OpkD*6jj@vy4^ delta 2371 zcmZ`*YfM{Z7=GUNw5OCqDU6peDO{R$V%e>$3^D=dtqRtK9b57}CYSOgd<$a&`d7tn3 zzVyz9nP%_I=_d~YsH5{`*a$UZm91d+bs2kWZgVen;RQlg>)N$yw;mnp(uQ=^jTiBf zj2S|RBbS9DS}fM74QqXRRKd%5g^=H;kF7D5jrg{S`Aouc(Jq(88{MeGYYGO@;KCb( z-1f*wj}}q2ty}f2YE&B@R9$$BP;|*nz53|bz{s#_5NPk%(AL_aZfxzkj5)O9u!486 zis0sIoq8ivh~Vne;}$o9Z)LFKOqfZS zseOWK8J`le&)PCdey-pPd}*SLtdrxh)y{ zq9^k@=l2SJz>nfkX18>dP$4c=O2h?+C;}d zY|M>W_*^(i@bvcUy@Lb8eU^5{`J7U48gs0Tq2?twad?d2Unx{a-W8lkq>zp51UqYP zY%I{hlB+RzwTm2Fc{HL;=ux#_i>ZClk?o_gFpEEn+qnw46v`ksp;#QqDlQ}hQ#gx> ziqDk1I8zyA1GSqFT+u4HIIxi*MVKnV5!=YT*+?BDy;|f-EjnOmwrOHi-((E9(tqVQ zE$HHku_z1D*vy!Q2JXR)`q0R@?joP?dIApeE0iy)JcV&8R49NjA;;>}iZgk-sF=MU zH52E3N$2pAdP8(%NKGk|iApL_NHwhJVJog3h#5PE^<7lTxLq4Isb_(lM{rsob{8!d z)1D=6T50fTa8bE9>RD!^kjTkyaZ?Rjgc!M6tjb;@c4Ye>zc2e9r^I#nZmRjLX6fGxJUH zi7yZjIFfjKAMR%WWB6_oAD@|hmc&=qY%drM2|UbK!440X51Zf5;5AA_BEh2vkxBX|=p;Vr(fZ{sT*#xcB$Y|d{so4EQo@=?H3?uVBy<}$|U5Sn0P z*cnXn$j;y|ppi!s!>z-5TnYzTIMNU46m%Jn@aH62+hnw#WQK%q@tug|*Lsh1C6E_( zls|#IClJZ~Nj#cga`xiS;^X}LGk;}fcIGsU9_KRc<5g|D=9PvS^e3P@YRu7mZmz22EXL%`*C)~1P=2k_T^j2W7b zCvjU6I|Gg>{5=VGh}Q`5%{!gsclzZA=B88ZjU*pQoE1uvGo2TjBKa|9BAEwL4mYz? z;G!(J$%6o8ql$8{o^o+H<>4xx_fP?DrNRZruq%BEyHckRci|SwWFQ*@-fW6*M*tCq zJ;tS~P|n~@a4;O8uqal%m*ZP_MTLD1E07@@5?0EXHP7e-h^Hrj8XJ#t(4P{sg%Ksr znzA}ANXQ)%ZlRsPJ{D)i=0%PEk2IF;5~vAFR*%7yAh~xg)Wb&=mW0+z5I3Fz8yliI ztwE7-m8qHkL9`-=+R#XA&_Zi5NbAgg&$mdX`;DagjimauVOz>#EvPU%m(0!su+4F> zG;brm=c22~*&Jf~RIiz*& C!8Anx diff --git a/bin/net/slipcor/classranks/managers/ClassManager.class b/bin/net/slipcor/classranks/managers/ClassManager.class deleted file mode 100644 index 8049949dec7f718b63458bbbb68d2ef0019555f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11576 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 Kw{!0bx#KsjeMF@I diff --git a/bin/net/slipcor/classranks/managers/ConfigManager.class b/bin/net/slipcor/classranks/managers/ConfigManager.class index 40ea6329361aff99b259da6d13aa0975d026e6ff..747718e2164308516e06542f58c0bcc251a9b0a2 100644 GIT binary patch delta 3443 zcmd5;Yj9L&8GfF#NzPsl*(IBh-CR!)nuKh^CD7tRxinDZDkcJjw7?;Ik}TQmrn@JR zpmwq1SnZFhXVkIdOvfJ%^CnKjb`rfy|)YuMD&nRI8#HfmbKnS?%MT0JQvmoxLZwsw6mn;9)ST9ad@E{3B= zw>qz98j#R%&YiMBo~n@kVI^f&pRFB&#m=4hW~42<;O71I-$amg>HC(~9; z-x-3>{mi+ zV3p%jt+9sl>@Uq-&=euqC52_3#(FjoJ{b^Kt;9+>8nvHkoMTS}!am{Cq_LU0UD>d< zH6WSI*Z2{1xK?o?-~#%1ib?+7hvly56E-pqMIMiSUHo)l#r z=SmG*`A&O(XukbWQ$_VEFIP#vamg~7D~Zs4qv1%oH!GsEQ;l7IrxfqfxS3n*q}Cnb zHjUdMO#C@x!t5yyH?h9WKHpSlpKfgRb0>RMzDKgLA8L%0YwY8D?TV%a^SPVVD)$hT zGdb+qwRwXN=ebwoKK9$^=iI!;%e#oWJ^^>GEcf=%jYL9jK8KU;dKJDu?V~7lUBbm-^H7AK02~u6V&v7`a@%`+U7G{e`UVhO2Oml0Vd5yO_ zMG81YI^g1ac`ub){x2?aJ(EsN>dE5NnYxr9s~c(E$Yza6JyTpuu9o3E8<|1fX;+u? zAaxbzR4!z{FKvuU-P{-FkSWhh>2Z?N$y{Du8B5-v!K9f=6km=T9PrwB>HJ%fyUzDU zxbA-I^1NLJUpd!uFqp@3cp$eS{AcjQ-l`{0;k#d#Z;I>#6^@0U#|l|%t`}BewR|I< zMwfgp20WE0gI~7tiyp(V0-mXQu7KyyLM=OiGSBMz2N77rljuLegR>nxQ~0TZ{Px&c zZvHZUUG-7{e~eAx&%_k|PQ>N(7o%lU_!sdwj_)`_&)&{3%TG~_mzQwP(7!iK?G!6J z3k((*mbfl#ydqjL3(I=~8=~GTSaEgce0~-{n6&~ERb4EJRbVvki#sIS1rJ%Yd% z;=$?Da=yPaD)t3?grd8-$Js2fZHh6M{oyO@>DeLt7Q1OxoWLfBo10cVUtYvnA}PjI zDT9-eI4?iVTO_S8;|?PU6f7-EmBObUmClqEJGURT(!^@iDDx0iB4|>g zXi@61TxrBgr5WoK9sSCDw6&K_=?va&`5!}fQ;^^TrtmH=7D;KcNqE*GGCBu1+I*TDRS-EhUzzvA) zqtL?ZcnKP(MW5v=NL7AhsJIMFV=H{69TmrAPi5Y7)qD}_rcr&}nYw92pk6sd@xJVW zT}00`eAjt9JBs5hOcdwJb|(Z|N;4KI39sroS1g+r<(-k?R;O|9$W@9flr;z`Yf-DL zn>BioE2GETxuXPpQrcZ6XN?l@%tUld@!dp$yNcRzgdLMVnGsRfCdd0R-XY#?qW?Qf z0~F?dap@@VV3-50bAe_NnOp6fdb;z{;Sq@}@tBgvD8<#NtmFz|nwb)-XG^Ti*jWtB z#F9{B66#uJ*%@YTu>M(g>v3mxg!uU9P}do&DR9ymGlzSaA8`Cn@gDo-o}TPgW@d@m vMl`!JD$1f9yoiL5Ja)AwD@r{HIQL$dANtRWPdPBF`hly}|FC4O@c6$0Gn|OH literal 18383 zcmbVT34B!5x&OX1%e_f1C`6F3lz>~nkgzKWvKT-R2o?m&qBtZ&GBC`^&mYdY_blJ} zpYMF@IX6H4{F#G9G)g^TkYXAZ3#V$6(MVfUJW<;e4JDI_P;6DQc6BHgY6&NjwGHvu zib%_B`_&*n)5$AC9iiH2DArOtXZgx-Q;I3r7Hw~d#F$Q-RfJxHke(}~>zS*-_{&Tfk?Th&-w9qG#rYdOIf>aZfFfRtpcF-WO)Ak8B>^eF@`sx zQ$q6!9BGS&)?qbRp{PMm4<%b|;1_$qI<R5or=e2Qv?*uEr3s8o!z9 z(o`bUv`TLx7$9rE2;?J8=#|8V=s}<@&!ATB1>$b2*#!1ZiLb%7Gk}yvQsLF}QXq>F zgO@Cs6;HI(E^lA8Dw3*=#5%&UR6Mb+c1EU??3_blsd-SPLSPIld_xiA7Qqn0!@37BKl6;>}@`M&N1q=;6alh-s8X z2ALv&kyyB~ef9Ei;^GkaDH0oR3Pl%$5)pZKDob0!DNS8?*`sQRXRqzuKPSJg(B5ZN z!4+1)QfE;Kl>%Is<>2#q%*v=kV^bSdjX3{LkUq>j~9-gy;sdv?4hch`d zqf0WJvh}NXl}Cg#(1t9KX)dzp%QP3OS#E3T0wJrn5IPyqljx;3xY{W&7g*F&F9}m* zTOdo=Fv%o?$%4^=?+Fe^4W zINnj5GpmY8p;iNJDC%Y3d=#^271hWNw#n1wLTvGn1wuV(QD5pVPwf`vH^)%@~8O&#ASIk&ODPMT6-ygT9s# zUGE;3(q@90G9t+-;;vvbz(wZ~%AwUFV;Z}QWO;3AiHMfAt1{1R7WEhHEkQTC7B<9@ zay_LO2-$#h^C}C;Sysnf3n4>$=h~!oZLVE%uxfi=mI12YMDVcR_9_JEofdsbfQrDl z4O*iv_SpVzX!X9sw#a6;X>TB8?z5;eqj1?4$XCMc2Imt=iXYeZ+@8_%Y66+O+KTBF z*Q_f63a3l1Ks!BzDPA;;vp@h;y#&svI{tW>7+lmMrMJkFt4e@4na%l75ariKZjpEK|&V&l73~wv89d)Rxzug z8BsjCs+2a-YZm>QeglgdzPvpY)uQg{=xFzl#U{PZ)UPQK#*$(!l}>z9X)m;9-Rfuw zy+QwN(C@HwdTMP_qVX1lmZuPPif3WB+dK*p^ z6qsrXET`yjG4`*}pDcQZ{tN;T0;aQy67ZxD+D*Jd?^^U%`WtL+yiIlw9H~3;&7EV9 z#ajNC-ZSVQOk+=QR~-r#y-y!Nf12WL>l}3eqIwBn{(l5Ddq1-1pHu@|m<)9|QfX3O z;oBz`eM(1cFYJUp5-)i~!V#y%Ll&1{qyBBt=hVfdnwMjriuqzUBGj(SN#yEFnAvAA zGQjF0I#+O<#eOjm!BA5w(h)W}2(*$&*_o2bh?bqKNt<<(`k8dHN&T@r?q+d!J_$1F z>aL@W^N>U8M6jX2T93i&9F=y6)SC=^ee9-6+p$$bbDE(FH8nM*Sa!L^r*JRi9}x+p zj^^%=1!a6HR~Xy}>2cAGE;PBteYu})4Rl}%Y3b>PyRM%v;{iO-;4i^bWVICmfW?*c zD0DO#Ss#`@gDpOdPY1JCh1bm!P0GzFP*q>XXL6On;&ig4&|vWp9tr~oR{}d2PlyD}v|3!t!vQE3UW?gJ$x!gBt>7GK@hBb*b;rKunZJw)^Dx<| zDy3_Ati|W>xsaH)P$C(&W3?h%GDZ3$2b#%9WqMUjDG>b{d|t->X@s_}oZlXaHir`? zPsE0wR?6dfG6GQUB~J|&PvNN|&24SrSTj@q+^{-_0tD*<@S^g(36(N-hK#)s0#ZnT zJj>0c0i(~eWEHcIT7{$9LVJ$I7x9;|eW|!zo6mfwugUYU;`y;exGCNegVZ#`CnQsq zkeAA{WUBcx6(WlqmsDU+TzX%@E}m6aDN?c6;w6%48LgpYBLu*t0VZFHb_9+lU&hq8 zVNT<;3o7xdXH9yv%w!m(GQ^KM)~&1q$C`PC!Qo7ptv6^!EEUEPlf^CEip6RnKwS|D zm>~;VDGS0`OkV!u;$ICvnZu6^I-4gZ$3@!o2})Bu8i!b14g;nGApKs-Np3e77>;`` zHZ7i59ZEUo)Zz|aV~6(*LKljE9Jl8{9LZ^Rc8u`?b@-& zNQ%rQ_RA$E-zb4307ykM&TmY<8U1y;yk25b&r)LEYSBV!G@eYjG4; zT`7WPTYr=9XZn)eh|{G|G}2s+u_+x^rQ(&b_Gq+}zs(OC{J%+3l_h~FUcWdTQmaPg|sN=aKw?`QvLz| z$lxCWf(Pbo9PZ+X4$<#SMs_izAQKAo$9C=K{}4a%Qv}OZ-e@mFvL3mj$w(r4=hz#_ zWD5>0>nahF^D7qrT%vAc;pDlEGa4^2`IoStmBU~Tll-d1uko*;>npS&kuA-fgO0)R zj0aT#W*1Um(Z1hWbda7lsl?YL1I&$_y`N z2wfz#&bb|^AF^0b`Yja@l-+EUb78pw5^|ypOPP{`^ss%Q6FZBmF;r>BMrju^b!}5v z=Tq=*IIqb>>ONQ>301L65G45ZUY<3%V-TyU$P9g8tosLHa@*x}{A9a#b_1j%qN!kq zv+YL56W8pQrT70go%WgKM*?!bF0@@d&w^ZA=9|+pW zkXHmJSZ5xL@k1xn8+4kfPD3x7HOUfnhC0hoXXc(Du1i9?ELEk3K%?XB!09j`60b$j z6BD@%hgR2{>TCpW_8GGVEMP0OxT;~Q)==04+au%-wA64(Q4AVmY>lZ9XPeHFYNWo-QuS&)+-Rt|IS*f9v+LPlM~oq5v{_BC)I>E2 zY-kfUWDYR3@HmFTGqOPN=~M}+^DWg=H6VS<@uJwps4aK(Wojz&9W@O+&3dS8JJ!X6 z4#`mrKu$P zmo|Hik}s)dFn(@$b-V+xYEOvsaQzCIM0b01h6ScVGU3xP*=Ab;QzEh$5&0}jr?qE9*=7F9u>Q0!1u3$m8@617onveY~><>>}X^-)L$9E+A0$r=iI zLFKVbk(jtrwOQS0shjjcSF>E7XsamIw^-^{QA-iPi^7T3q9js(o29m8>Ze4KZBlQl z?Qkz=O7k}?b%**Uj2MPFc3sSbN6H&oLv{;9_fB=Uq3(j2DAaDLd*qv`?~v zV3T7OihdrE-3yqKKtfoE`|x9$AnAk7rSszLiKeg|aYI!aykBe7h>fH{1gS&>*cT

0GxHQt`Ag9FToPNh`jV^J&qDx%==@NG!IdpK}q3dyr zp-Ws2q8x+O4x<|Mti{`zDCNIk&*4we$US&cG+N$u{UG#~8p7LHItNcSch1#gYf&qs z14EytaZl)u*`a6Xp_bi&>S??tavn`UjZEwvJTZUpu!4gp7aV+k{@_ss2TySak91(0 zfIYR7F32B0&NJS0keV>5-F`Et0oET4O=;9kT-)XP0l zb=k%h)Z)pyGdewVAFUqxEKOhJ+eh)eG|}^XzWZ!Tx%&!1^E@X!&neGyhv#{% z=Xt&7`AYX$Pq9IS_?n^q19a_P?6?29(!E%H@BnSvOE;kF=0*Ex%U)WN-KYy8#za?O zHABIO;rOgzEbeS4!%|&G4Rj;Tp}S}a?ZzfOOG$d2uBOlE7P^wYPFJC21MNi3qjU}J zrHvjYrd{btYabySePcm=P2_L%^#wQjro#G~$S%Y-9GfxS*E~SH5+}|?fZSXVNGc!5 z%>{wnQW!`oAIMe!xvdBg@n!<#)?@mEt@(g%F9>KGwjyJFwrlHi5#GfHXp6R0fZ57! zbLg7@wxb9z+r8e75w_O}LLB6Y=^F)k){zhKo`MkXD9p2te4gD0X!jR^CZ1k^eDjz* z+mR3G!GeJ9IyTRC~w&9yC9JD`9Ka71oA*(AnWsi90HK% zivW>0P&o1+J%r!`7XAyPZ_im$Z`J?liroZ^p^!J7K>xV-#y*~D(>0emkUP?&S)AX5iNgy_SiYe2poC9vR ziP=iStvo+lS>jfvvX!M$iLA{x-kG1uZC+y=%{nLDYIZsRTbf?cuJf^u3Fn7`Dx}YB3 zU546Y=3>mSPQDnu%6Xw4W)HCUW|LxpvIw8KcEz&mTb=>@b+#ZL%GRuhT0k^6WNWT)2d>RlUg=h@ca~hvSII^^O*i;l5LcJ;#x!3i5O46i zwKtUW=1i>!oDFzOIp3sf-I`mRInsPl{=yv;7j`&DFpQB=(=+pTF8titxPr7#U&NT1xzr>F!AlSv{K**${7O(@n zTVUx|k5I9hD^yvfdR#U-&EIu}LMFoo+G6m8-D+#tlUh6XK+yJcn&|-V&**14KMQ2O zvB6!mq9V{MxStOwg4UJup)`NL&ZsaB`X8Wf6^4IgCpSTZ{A1+@)4Q3vGinTiU8^gT<%XTUCbz1%$(y z5p~8cRa0SP#?%G5&MfEusw+8#e>biapRK8}-2}PI=r;kp8c@sm_xP;{>c_V-*#CH# zMtt$^^m3hW_c+A=d}72i-9fzM_{87!5I^UOcNdHCw>1A_Th+Fh|>I|N*#_~ek+b&j3yi_Il619ad zQ@3+SJ;BS>L6pyPlRC^{^`E>#y~-`>Pu!~BNBI%Tf1y0WE7j+`*oV*ed}naNSH~&e zEbj1K%4>Z|zQVVeukzi_8+;G&)xKRQck?yAXLzIU0Lth2THnijo$nVYU*qe2f90?F zKIa?#KEBC+D&Oiqowxeyc$~Z)@EkuMc#&TWyv{ELKIR_;j_?nI_^>Hx z@sENh@sESm{HtIszZx9PuLZ~PuY=?HH^GVgdN9Us1l#$)gSYUT!R;vT;NJ!BMBUx| z``}Obt>Dl3?clro$KZP?Kg9bd{Ekt@e=%zLU1K``)o4WdWxOxtzZ*C5d&V~Yz<7v1 zH1?o;n%_6}q3#*}hw&W$(|CbDHr_`0E`MUY&!3v7@F!+}{M4^L)rv^rJw$5Tmg9OfFJaNHCe59CAnF|vXam8Aw^j&3Ar zA?`{XOqHN!&tO5vadOXFscK;LXS9Wn&@`h9*KPp=T*5^pR}*#70{L4vyc@I$HTWeq zRLSrzoI>PwEFmQwiK-^?XLKQV;ruwa$Et#)#vX&z5w4vCT#a4$E2>;ttz>v%;mbe5 z`Sa<98Z-$r51^8~Rx}{>1M*L(pX#D>^T@g2yKvI&*XwZBKaxy&b(W8h&@+s=g1Y54 zxE#U*{@`IZ5FMeVM`-yGT84l9yRel-Xu;lQ=fveZKAEz!U0)CEQYm)nTE`WYtHC)D z-<`;a5HT*<#mjSg*a5`s>cf2Dlj`(x1+!m`=)w&okZ(NbiQS%6BNh!SSEKf+F*+J^ zoxD278>%@WWL>ZVv6xHC+(lC=OgAVoyk65C??fPm?fx(oV&b}zia>=?QIb~U7778K zFG+N|WEc_=b>2cjs4FE|U6NLl_p2#(s<$!&UX5rRmR1+oIUoYX3j~@SQq=`Cndy=M z8sLHif9N{{5u}di5JV!~!;g+9r&l=Gz$u}j=iTcf*e2P%_KLWV!(BAAx;M1AFLZSv zv~)1Ea;zFab{e&dtE!6L#PeU&+4K?GyYM|$KYV&M2H#sv zQloe^p4XsmqpH&<25oX}$k#g7t2ak&>jm#SQ_X@zD4@7Q&4&K_@K>%|RHK@MlaE`d zMO}o}Ans+xs4t_{pjYv6mRO7u?ng`2T=ett7+4^Dg8_RtiH7M`BV#9=8RQP#re=W} z>;!$4tW!j@E$G*9TYU_;dq+)X+8T!%M-9{nxAh23a_x#+*|!US>Z^5F#z^mKo7NF( z=)zHmR(H3z)Hvpalzf=t90tvli${Q~$O^xf6mrf(5aVRdOZAPWnm|3&MCzj^X)fEB z85ItfSzWB=JB0UQul*PsatQ0hK@0QQ`xXAsA+45b!I7|90&JWW3`^UyW)2qAGDmgF zRR}%KPOGMJwZiV}rf?pBJ!L{Qg=*APTBN4YW$FSAa;Oc&0SQQ|RYmlwLuw^9QEqfX zY89Tq3l&wXohAGd<75fp>ci9|%W#3k04!%2sx7+=8`_d=yGk4qC96)WR>3Wo#QQnHWZBU;bkgx- zKdCkj;B&h&l-*JG!smE>RFW%IiqBH*JVAB9BDW(CS%dr|#b3eqcFWW{``Lf!`uc7X@_>}Q2wT%C!Ht~nbzUr=oMnSk8 z4H?8Qs7KXqDE9*1q#jd`qgCwkB^2y}L-HYj$Qa{M+Ikvlqia;Vki3aSwd)MES)1+p WE}H78&I~W{5QDyb2a_oE-TwpKCo@F= diff --git a/bin/net/slipcor/classranks/managers/PlayerClassManager.class b/bin/net/slipcor/classranks/managers/PlayerClassManager.class index 73576eaed1478a13181a09241a0e790cf4213102..a1ed8755abaf77e1515e0f081e68f7c1af4048f5 100644 GIT binary patch delta 617 zcmZvZPiqrV6vcmUI@2-3R2zw{RUxHHY?FpatRSs5(ulE|q)A&f{)Mp&A!VBCOcc^h zzJfBVihEtSs31XINZq;-{3`BkZ(6}pgvWb_d+#~--1~mp@1xd_KVQEA7kTp0s_OC6 zb+>h+;RmgX>#voaHFvI^_naW;LB-|pm6qrfSDlwm#&eqW%u>s5H0v`Kqs-gf;gc1uTWyRoOF`Ei;iM!8VI9@PcZ?5}p-U-}Zk42j$I+8tcIJ;-E zS8~VZF836DVndM_KhS&O>8iWZnmK6aZ%7eY`8TB*?E6<(&qQ})qu2;UD_v~5txVv( z9*TzRS}d&Td1Zue^{hG>{?rSRF?7yyjB{b!s7BHpA;SpSux(`3_wa*JIG-RQtDeT< z3N}|cN=_=~nBY1o!INBLib6QlU+WZ5QUjmSFyzf8KQYkd!nFR5; x0mU3qjth{^)Fi0((0xIgP|xsyha#Ag=rG!jST#(PNl6YSmmndON0QcfybGNdiYNd8 delta 115 zcmZ1>_?d_6)W2Q(7#J9g89X*}1+q*&#_GVxGMSyth*4;=6`MP!6ax!`Gy^|_%;YY% zKu%Q#4hA&_Ne0cyPk<`+P8Mf(S5^XwF)$b~a4{G%@Bq!>V=w`#FlEqWFk{dLvP~E) PC%3Xkure?(F}MQ&xegSI diff --git a/bin/net/slipcor/classranks/managers/PlayerManager.class b/bin/net/slipcor/classranks/managers/PlayerManager.class index 52558f828748c5ee0f2efe2cf06bf0b95387af45..5a8c6dc1ea830f5f2a14117aed5f92301520c66e 100644 GIT binary patch delta 330 zcmWNL%PWL&6o#LlNE4B{xuvjTA`E>fB8|SrLK&lpNl0!Rh7y}`$xf1dQcNTaBG)OA zl%~*#g@x59Dft^Loz3a=_PlRTSPN?xV-}NxL`pDGYD`;}Y)*2iq6iHKPAaLzO`VZ# z4cT16G?Rx;xn$MyH_{r3SzlF~mjpUU#wSQ8X1XZEFC*QQ(L)8j^wYD;S)9+XB@HSnlhJSjbmXR(Ya4=>8co8ij&{s;RPOmhGL delta 330 zcmX|*%`3wJ7{@=4NQ=m3^OnNNP%IfG5z9lQ{`v#TjZ7v0 diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 3b72e5e..5b51635 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -26,7 +26,7 @@ import net.slipcor.classranks.commands.RankupCommand; import net.slipcor.classranks.handlers.*; import net.slipcor.classranks.listeners.*; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; import net.slipcor.classranks.managers.ConfigManager; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; @@ -67,7 +67,7 @@ public void onEnable() { pm.registerEvents(serverListener, this); @SuppressWarnings("unused") - ClassManager cm = new ClassManager(this); + ClazzList cm = new ClazzList(this); // register commands // getCommand("classranks").setExecutor(new PlayerCommands(this)); diff --git a/src/net/slipcor/classranks/commands/AbstractClassCommand.java b/src/net/slipcor/classranks/commands/AbstractClassCommand.java index 131a590..132ada5 100644 --- a/src/net/slipcor/classranks/commands/AbstractClassCommand.java +++ b/src/net/slipcor/classranks/commands/AbstractClassCommand.java @@ -6,7 +6,7 @@ import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.core.Clazz; import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; import net.slipcor.classranks.register.payment.Method.MethodAccount; @@ -32,8 +32,8 @@ public abstract class AbstractClassCommand implements CommandExecutor // protected final PlayerCommands cmdMgr; protected final DebugManager db; - protected double[] moneyCost = new double[ClassManager.getClasses().size()]; // Costs - protected int[] expCost = new int[ClassManager.getClasses().size()]; // EXP + protected double[] moneyCost = new double[ClazzList.getClasses().size()]; // Costs + protected int[] expCost = new int[ClazzList.getClasses().size()]; // EXP protected Double checkedCost; // checked cost for rank up / add protected int checkedExp; // checked Exp Cost for rank up / add @@ -95,7 +95,7 @@ protected boolean cmdAddRank(Player sender, Player player, String className, Str // ADD plugin.db.i("Get TempRank"); - Rank tempRank = ClassManager.getRankByPermName( ClassManager.getFirstPermNameByClassName(className)); + Rank tempRank = ClazzList.getRankByPermName( ClazzList.getFirstPermNameByClassName(className)); // ClassRank does not exist if (tempRank == null) @@ -105,11 +105,11 @@ protected boolean cmdAddRank(Player sender, Player player, String className, Str } - int rID = ClassManager.getRankIndex(tempRank, tempRank.getSuperClass()); // Index des Rank + int rID = ClazzList.getRankIndex(tempRank, tempRank.getSuperClass()); // Index des Rank // Track Rank // if (plugin.trackRanks) // { -//// rID = ClassManager.loadClassProcess(player, +//// rID = ClazzList.loadClassProcess(player, //// tempRank.getSuperClass()); // } plugin.db.i("Get Rank Index : " + rID); @@ -294,7 +294,7 @@ protected boolean hasAdminPerms(Player player) protected String getClassName(String className) { - for (Clazz oClass : ClassManager.getClasses()) + for (Clazz oClass : ClazzList.getClasses()) { // check Classname if (className.equalsIgnoreCase(oClass.name)) @@ -314,7 +314,7 @@ protected String getClassName(String className) */ protected Rank hasRank(String className, Player player, String world) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); String sPermName = ""; Rank isRank = null; for (Clazz oClass : classes) @@ -346,7 +346,7 @@ protected Rank hasRank(String className, Player player, String world) protected void removeRanks(String className, Player player, String world) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); String sPermName = ""; for (Clazz oClass : classes) { @@ -405,7 +405,7 @@ protected boolean hasPlayerGroup(String PermName, Player player) */ protected boolean hasClass(String className, Player player, String world) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); String sPermName = ""; boolean isClass = false; plugin.db.i("SearchClass : " + className); @@ -443,7 +443,7 @@ protected boolean hasClass(String className, Player player, String world) */ protected boolean existClass( String className) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); for (Clazz oClass : classes) { // pruefe ob KLassenname identisch @@ -694,7 +694,7 @@ protected boolean rankUp(Player sender, Player player, String className, String ChatColor c_Color = rank.getColor(); // actual Rank color Clazz oClass = rank.getSuperClass(); // actual Rank class - int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank + int rID = ClazzList.getRankIndex(rank, oClass ); // Index des Rank int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank plugin.db.i("rank " + rID + " of " + iMaxRank); // placeholder: cost @@ -708,7 +708,7 @@ protected boolean rankUp(Player sender, Player player, String className, String return true; } - Rank tempRank = ClassManager.getNextRank(rank, rID); // New Rank + Rank tempRank = ClazzList.getNextRank(rank, rID); // New Rank // Check for money to rank up // rankCosts stored in checkedCost @@ -866,7 +866,7 @@ protected boolean rankDown(Player sender, Player player, String className, Strin Clazz oClass = rank.getSuperClass(); // actual Rank class - int rID = ClassManager.getRankIndex(rank, oClass ); // Index des Rank + int rID = ClazzList.getRankIndex(rank, oClass ); // Index des Rank int iMaxRank = oClass.ranks.size() - 1; // Classes max tree rank plugin.db.i("rank " + rID + " of " + iMaxRank); @@ -885,7 +885,7 @@ protected boolean rankDown(Player sender, Player player, String className, Strin plugin.perms.rankRemove(player, rank.getPermName()); // do it! } - Rank tempRank = ClassManager.getPrevRank(rank, rID); + Rank tempRank = ClazzList.getPrevRank(rank, rID); plugin.perms.rankAdd(player, tempRank.getPermName()); plugin.config.playerSectionWrite(player, className, tempRank.getPermName()); plugin.db.i("Rank Down to" + tempRank.getDispName()); diff --git a/src/net/slipcor/classranks/commands/ClassAdminCommand.java b/src/net/slipcor/classranks/commands/ClassAdminCommand.java index af333dc..88cd518 100644 --- a/src/net/slipcor/classranks/commands/ClassAdminCommand.java +++ b/src/net/slipcor/classranks/commands/ClassAdminCommand.java @@ -5,7 +5,7 @@ import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.core.Clazz; import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; @@ -78,7 +78,7 @@ public void cmdNone(Player pPlayer) private void cmdList (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); { plugin.msg(pPlayer, "[ClassRanks] "+ChatColor.YELLOW+"Class List"); @@ -105,7 +105,7 @@ private void cmdList (Player pPlayer, String[] args) private void cmdListClass (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); if (args.length > 1) { for (Clazz c : classes) @@ -128,7 +128,7 @@ private void cmdListClass (Player pPlayer, String[] args) private void cmdListClassRank (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); if (args.length > 1) { for (Clazz c : classes) @@ -333,7 +333,7 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) + String.valueOf(args.length) + ")!"); return false; } - return ClassManager.configClassRemove(args[2], pPlayer); + return ClazzList.configClassRemove(args[2], pPlayer); } else if (args[1].equalsIgnoreCase("rank")) { if (args.length != 4) { plugin.msg( @@ -342,7 +342,7 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) + String.valueOf(args.length) + ")!"); return false; } - return ClassManager.configRankRemove(args[2], args[3], pPlayer); + return ClazzList.configRankRemove(args[2], args[3], pPlayer); } // second argument unknown return false; @@ -394,7 +394,7 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) } if (args[1].equalsIgnoreCase("class")) {// , ItemStack[] isItems, double dCost, int iExp - return ClassManager.configClassAdd( + return ClazzList.configClassAdd( args[2], args[3], args[4], @@ -406,7 +406,7 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) } if (args[1].equalsIgnoreCase("rank")) { - return ClassManager.configRankAdd( + return ClazzList.configRankAdd( args[2], args[3], args[4], @@ -433,7 +433,7 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) + String.valueOf(args.length) + ")!"); return false; } - return ClassManager + return ClazzList .configClassChange(args[2], args[3], pPlayer); } else if (args[1].equalsIgnoreCase("rank")) { if (args.length != 6) { @@ -443,7 +443,7 @@ public boolean parseAdminCommand(Player pPlayer, String[] args) + String.valueOf(args.length) + ")!"); return false; } - return ClassManager.configRankChange(args[2], args[3], args[4], + return ClazzList.configRankChange(args[2], args[3], args[4], args[5], pPlayer); } // second argument unknown diff --git a/src/net/slipcor/classranks/commands/PlayerCommands.java b/src/net/slipcor/classranks/commands/PlayerCommands.java index 8dd3db8..7d8725d 100644 --- a/src/net/slipcor/classranks/commands/PlayerCommands.java +++ b/src/net/slipcor/classranks/commands/PlayerCommands.java @@ -7,7 +7,7 @@ import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.core.Clazz; import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; import net.slipcor.classranks.managers.PlayerManager; @@ -126,7 +126,7 @@ private boolean cmdRemove(Player sender, String[] args) if (plugin.trackRanks) { - ClassManager.saveClassProgress(player); + ClazzList.saveClassProgress(player); } // suche plass in permissions if (hasClass(className, player, world)) @@ -177,7 +177,7 @@ private boolean cmdRemove(Player sender, String[] args) private void cmdList (Player pPlayer, String[] args) { - ArrayList classes = ClassManager.getClasses(); + ArrayList classes = ClazzList.getClasses(); if (args.length > 1) { for (Clazz c : classes) @@ -232,7 +232,7 @@ private void cmdGet (Player pPlayer, String[] args) } plugin.msg(pPlayer, "Player " + FormatManager.formatPlayer(playerName)+ " Get in " + FormatManager.formatWorld(world) + "!"); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); + Rank rank = ClazzList.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); if (rank == null) { diff --git a/src/net/slipcor/classranks/commands/RankdownCommand.java b/src/net/slipcor/classranks/commands/RankdownCommand.java index 181ffe7..2f694be 100644 --- a/src/net/slipcor/classranks/commands/RankdownCommand.java +++ b/src/net/slipcor/classranks/commands/RankdownCommand.java @@ -2,7 +2,7 @@ import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; import net.slipcor.classranks.managers.PlayerManager; @@ -135,11 +135,11 @@ public boolean parseCommand(Player pPlayer, String[] args) return true; } else { - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); + Rank rank = ClazzList.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); if (rank != null) { - className = ClassManager.getClassNameByPermName(rank.getPermName()); + className = ClazzList.getClassNameByPermName(rank.getPermName()); if (existClass(className)) { rankDown(pPlayer, pPlayer, className, world); diff --git a/src/net/slipcor/classranks/commands/RankupCommand.java b/src/net/slipcor/classranks/commands/RankupCommand.java index 4a8e138..6b843ec 100644 --- a/src/net/slipcor/classranks/commands/RankupCommand.java +++ b/src/net/slipcor/classranks/commands/RankupCommand.java @@ -2,7 +2,7 @@ import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.core.Rank; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.FormatManager; import net.slipcor.classranks.managers.PlayerManager; @@ -160,10 +160,10 @@ public boolean parseCommand(Player pPlayer, String[] args) return true; } else { - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); + Rank rank = ClazzList.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); if (rank != null) { - className = ClassManager.getClassNameByPermName(rank.getPermName()); + className = ClazzList.getClassNameByPermName(rank.getPermName()); if (existClass(className)) { rankUp(pPlayer, pPlayer, className, world); diff --git a/src/net/slipcor/classranks/core/Clazz.java b/src/net/slipcor/classranks/core/Clazz.java index 09a4f5b..44bfb40 100644 --- a/src/net/slipcor/classranks/core/Clazz.java +++ b/src/net/slipcor/classranks/core/Clazz.java @@ -1,52 +1,196 @@ package net.slipcor.classranks.core; import java.util.ArrayList; +import java.util.HashMap; import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; /** - * class class - * - ClassName - * - Array of Ranks + * realize a objekt with multiple ranks. Each rank is a name of a + * permissionGroup + * - ClassName + * - [0] = Rankname 0 + * - [1] = Rankname 1 + * - [2] = Rankname 2 + * - [3] = Rankname 3 + * and so on. The rank is given by position in the list. + * You can go rankUp or rankDown in the list. + * A player can have one rank in each Clazz. * - * @version v0.3.0 + * a Clazzname be unique + * a Rankname must be unique in all Clazzes * + * @version v 0.7.1 krglok + * * + * @version v0.3.0 * @author slipcor */ -public class Clazz +public class Clazz { - public final ArrayList ranks = new ArrayList(); - public String name; - + public HashMap ranks = new HashMap(); + public String clazzName; + /** * create a class instance - * @param sClassName the class name + * + * @param sClassName + * the class name */ - public Clazz(String sClassName) { - this.name = sClassName; + public Clazz(String sClassName) + { + this.clazzName = sClassName; + } + + public boolean containRank(String sPermName) + { + for (Rank rank : ranks.values()) + { + if (rank.sPermissionName.equalsIgnoreCase(sPermName) == true) + { + return true; + } + } + return false; } /** * add a rank to class - * @param sPermName the rank permissions name - * @param sDispName the rank display name - * @param cColor the rank color - * @param isItems the rank items cost - * @param dCost the rank cost - * @param iExp the rank exp cost + * + * @param sPermName the rank permissions name + * @param sDispName the rank display name + * @param cColor the rank color + * @param isItems the array of rank items cost + * @param dCost the rank cost (money) + * @param iExp the rank exp cost */ - public void add(String sPermName, String sDispName, ChatColor cColor, ItemStack[] isItems, double dCost, int iExp) + public void add(String sPermName, String sDispName, ChatColor cColor, + ItemStack[] isItems, double dCost, int iExp) { - this.ranks.add(new Rank(sPermName, sDispName, cColor, this, isItems, dCost, iExp)); + if (containRank(sPermName) == false) + { + int nextIndex = this.ranks.size()+1; + this.ranks.put(nextIndex,new Rank(sPermName, sDispName, cColor, this, isItems, + dCost, iExp)); + } } - + /** * remove a string from class - * @param sPermName the rank name to remove + * be carefull, this reindex the ranks !!! + * + * @param sPermName the rank name to remove */ - public void remove(String sPermName) { - this.ranks.remove(sPermName); + public void remove(String sPermName) + { + if (containRank(sPermName)) + { + HashMap newRanks = new HashMap(); + for (Rank rank : ranks.values()) + { + if (rank.sPermissionName.equalsIgnoreCase(sPermName) == false) + { + int nextIndex = this.ranks.size()+1; + newRanks.put(nextIndex, rank); + } + } + ranks = newRanks; + } + } + + /** + * search for next rank in ranklist + * + * @param sPermName + * @return sPermissionName or null + */ + public String nextRankPerm(String sPermName) + { + int lastIndex = 0; + for (Integer key : this.ranks.keySet()) + { + + if (key < lastIndex) + { + Rank rank = this.ranks.get(key+1); + return rank.sPermissionName; + } + } + return null; + } + + + public Rank nextRank(String sPermName) + { + int lastIndex = 0; + for (Integer key : this.ranks.keySet()) + { + + if (key < lastIndex) + { + Rank rank = this.ranks.get(key+1); + return rank; + } + } + return null; + } + + /** + * search for prev rank in ranklist + * + * @param sPermName + * @return sPermissionName or null + */ + public String prevRankName(String sPermName) + { + for (Integer key : this.ranks.keySet()) + { + Rank rank = this.ranks.get(key); + if (rank.sPermissionName.equalsIgnoreCase(sPermName)) + { + if (key > 1) + { + rank = this.ranks.get(key-1); + return rank.sPermissionName; + } + return null; + } + } + return null; + } + + + public Rank prevRank(String sPermName) + { + for (Integer key : this.ranks.keySet()) + { + Rank rank = this.ranks.get(key); + if (rank.sPermissionName.equalsIgnoreCase(sPermName)) + { + if (key > 1) + { + rank = this.ranks.get(key-1); + return rank; + } + return null; + } + } + return null; + } + + + public int getIndexOf(Rank rRank) + { + String sPermName = rRank.getPermName(); + for (Integer key : this.ranks.keySet()) + { + Rank rank = this.ranks.get(key); + if (rank.sPermissionName.equalsIgnoreCase(sPermName)) + { + return key; + } + } + return 0; } } diff --git a/src/net/slipcor/classranks/core/PlayerClazzList.java b/src/net/slipcor/classranks/core/PlayerClazzList.java index e640e81..cbc3321 100644 --- a/src/net/slipcor/classranks/core/PlayerClazzList.java +++ b/src/net/slipcor/classranks/core/PlayerClazzList.java @@ -8,8 +8,8 @@ * * @author Windu * - * define a player Class Rank List object will be used to track player - * classes + * define a player Class Rank List object will be used to track player + * classes */ public class PlayerClazzList extends HashMap { @@ -20,6 +20,7 @@ public class PlayerClazzList extends HashMap private static final long serialVersionUID = -3071712660629867671L; private String uuid; + private String playername; // private ArrayList playerClassRanks; @@ -27,6 +28,7 @@ public PlayerClazzList(String uuid, String playerName) { super(); this.uuid =uuid; + this.playername = playername; this.put("name", playerName); } diff --git a/src/net/slipcor/classranks/core/PlayerClazzRank.java b/src/net/slipcor/classranks/core/PlayerClazzRank.java index e444421..7b18cb4 100644 --- a/src/net/slipcor/classranks/core/PlayerClazzRank.java +++ b/src/net/slipcor/classranks/core/PlayerClazzRank.java @@ -4,7 +4,12 @@ * * @author Windu * - * define a Player Class Rank, will be used to track player clases + * define a Player Rank in a Clazz , will be used to track player clazzes + * - className = name of the ClassRank + * - rankName = name of the rank or permissionGroup + * The player can go rankUp or rankDown in the Clazz + * A player can have only one rank in each Clazz, given by this key/value + * */ public class PlayerClazzRank { diff --git a/src/net/slipcor/classranks/core/Rank.java b/src/net/slipcor/classranks/core/Rank.java index 3f2161c..e754e96 100644 --- a/src/net/slipcor/classranks/core/Rank.java +++ b/src/net/slipcor/classranks/core/Rank.java @@ -6,11 +6,16 @@ import org.bukkit.inventory.ItemStack; /** - * rank class - * - rank parameter + * the class define a rank for a clazz. there multiple parameter for a rank. + * @param sPermName the permission name to use + * @param sDispName the display name + * @param cC the name ChatColor + * @param crc the class to add to + * @param isItems the rank items cost is a array of Items + * @param dCost the rank cost + * @param iExp the rank experience cost * * @version v0.3.0 - * * @author slipcor */ public class Rank @@ -27,20 +32,13 @@ public class Rank /** * create a rank instance * - * @param sPermName - * the permission name to use - * @param sDispName - * the display name - * @param cC - * the name ChatColor - * @param crc - * the class to add to - * @param isItems - * the rank items cost - * @param dCost - * the rank cost - * @param iExp - * the rank experience cost + * @param sPermName the permission name to use + * @param sDispName the display name + * @param cC the name ChatColor + * @param crc the class to add to + * @param isItems the rank items cost + * @param dCost the rank cost + * @param iExp the rank experience cost */ public Rank(String sPermName, String sDispName, ChatColor cC, Clazz crc, ItemStack[] isItems, double dCost, int iExp) { diff --git a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java index d53c269..c9e09b0 100644 --- a/src/net/slipcor/classranks/handlers/HandleVaultPerms.java +++ b/src/net/slipcor/classranks/handlers/HandleVaultPerms.java @@ -6,7 +6,7 @@ import net.milkbowl.vault.permission.Permission; import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.managers.ClassManager; +import net.slipcor.classranks.managers.ClazzList; //import net.slipcor.classranks.managers.DebugManager; import net.slipcor.classranks.managers.PlayerManager; @@ -166,7 +166,7 @@ public void rankAdd(Player player, String rank) if (permission.playerAddGroup(player, rank)) { plugin.db.i("Vault added rank " + rank + " to player " + player + " in world " + player.getWorld().getName()); -// String cString = ClassManager.getClassNameByPermName(rank); +// String cString = ClazzList.getClassNameByPermName(rank); // plugin.getConfig().set("players." + player + "." + cString, rank); // plugin.getConfig().set("worlds." + player.getWorld().getName() + "." + player, rank); // plugin.saveConfig(); @@ -190,7 +190,7 @@ public void rankAddGlobal(Player player, String rank) { ClassRanks.log("ADD PermName " + rank + " or user " + player + " ", Level.INFO); // player = PlayerManager.searchName(player); // auto-complete playername - String cString = ClassManager.getClassNameByPermName(rank); + String cString = ClazzList.getClassNameByPermName(rank); String world = null; try { @@ -271,13 +271,13 @@ public String getPermNameByPlayerGlobal(Player player) for (String sRank : list) { plugin.db.i("checking rank "+sRank); - if (ClassManager.rankExists(sRank)) + if (ClazzList.rankExists(sRank)) { permGroups.add(sRank); } } plugin.db.i("player has groups: " + permGroups.toString()); - return ClassManager.getLastPermNameByPermGroups(permGroups); + return ClazzList.getLastPermNameByPermGroups(permGroups); } diff --git a/src/net/slipcor/classranks/managers/ClassManager.java b/src/net/slipcor/classranks/managers/ClassManager.java deleted file mode 100644 index 44a8a49..0000000 --- a/src/net/slipcor/classranks/managers/ClassManager.java +++ /dev/null @@ -1,349 +0,0 @@ -package net.slipcor.classranks.managers; - -import java.util.ArrayList; -import java.util.logging.Level; - -import net.slipcor.classranks.ClassRanks; -import net.slipcor.classranks.core.Clazz; -import net.slipcor.classranks.core.Clazz; -import net.slipcor.classranks.core.Rank; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -/** - * Clazz manager Clazz - * - Array of Classes - * - * used as static to workaround of initialize problems ! - * - * @version v0.4.4.2 - * - * @author slipcor / krglok - */ - -public class ClassManager -{ - private static ArrayList clazzes = new ArrayList(); - private static ClassRanks plugin; -// private static DebugManager db; - - public ClassManager(ClassRanks cr) { - ClassManager.plugin = cr; -// db = new DebugManager(cr); - } - - public void add(String sClassName) { - clazzes.add(new Clazz(sClassName)); - } - - public static String getFirstPermNameByClassName(String cString) - { - // standard version: get first rank - for (Clazz c : clazzes) { - for (Rank r : c.ranks) { - if (c.name.equals(cString)) - return r.getPermName(); - } - } - return null; - } - - public static String getFirstPermNameByClassName(String cString, String sPlayer) { - // extended version: get rank - for (Clazz c : clazzes) { - if (c.name.equals(cString)) { - return c.ranks.get(ClassManager.loadClassProcess(Bukkit.getPlayer(sPlayer), c)).getPermName(); - } - } - return null; - } - - public static String getClassNameByPermName(String rank) { - for (Clazz c : clazzes) { - for (Rank r : c.ranks) { - if (r.getPermName().equals(rank)) - return c.name; - } - } - return null; - } - - public static String getLastPermNameByPermGroups(ArrayList permGroups) { - String sPermName = ""; - for (Clazz c : clazzes) { - for (Rank r : c.ranks) { - plugin.db.i(c.name + " => " + r.getPermName()); - if (permGroups.contains(r.getPermName())) - sPermName = r.getPermName(); - } - } - return sPermName; - } - - public static Rank getRankByPermName(String sPermName) - { - for (Clazz c : clazzes) - { - for (Rank r : c.ranks) - { - - if (r.getPermName().equals(sPermName)) - return r; - } - } - return null; - } - - public static Rank getRankByPermName(String[] sPermName) - { - for (Clazz c : clazzes) - { - for (Rank r : c.ranks) - { - for (String permName : sPermName) - { - plugin.db.i("Rank: "+r.getPermName()+" Group: "+permName); - if (r.getPermName().equals(permName)) - return r; - } - } - } - return null; - } - - public static Rank getNextRank(Rank rank, int rankIndex) - { - if (rankIndex+1 < rank.getSuperClass().ranks.size()) - { - return rank.getSuperClass().ranks.get(rankIndex+1); - } else - { - return null; - } - } - - public static Rank getPrevRank(Rank rank, int rankIndex) - { - if (rankIndex > 0) - { - return rank.getSuperClass().ranks.get(rankIndex-1); - } else - { - return null; - } - } - - private static Clazz getClassbyClassName(String sClassName) { - for (Clazz c : clazzes) { - if (c.name.equals(sClassName)) - return c; - } - return null; - } - - public static boolean rankExists(String sRank) { - for (Clazz c : clazzes) { - for (Rank r : c.ranks) { - if (r.getPermName().equals(sRank)) - return true; - } - } - return false; - } - - public static ArrayList getClasses() { - return clazzes; - } - - public static boolean configClassRemove(String sClassName, Player pPlayer) { - Clazz cClass = getClassbyClassName(sClassName); - if (cClass != null) { - clazzes.remove(cClass); - plugin.msg(pPlayer, "Clazz removed: " + sClassName); - plugin.config.save_config(); - return true; - } - plugin.msg(pPlayer, "Clazz not found: " + sClassName); - return true; - } - - public static boolean configRankRemove(String sClassName, String sPermName, Player pPlayer) { - Clazz cClass = getClassbyClassName(sClassName); - if (cClass != null) { - Rank rank = getRankByPermName(sPermName); - if (rank != null) { - ChatColor cColor = rank.getColor(); - cClass.ranks.remove(rank); - plugin.msg(pPlayer, "Rank removed: " + cColor + sPermName); - plugin.config.save_config(); - return true; - } - plugin.msg(pPlayer, "Rank not found: " + sPermName); - return true; - } - plugin.msg(pPlayer, "Clazz not found: " + sClassName); - return true; - } - - - public static boolean configClassAdd(String sClassName, String sPermName, String sDispName, String sColor, ItemStack[] isItems, double dCost, int iExp, Player pPlayer) { - Clazz cClass = getClassbyClassName(sClassName); - if (cClass == null) - { - Clazz c = new Clazz(sClassName); - c.add(sPermName, sDispName, (FormatManager.formatColor(sColor)), isItems, dCost, iExp); - // add Clazz - clazzes.add(c); - if (pPlayer == null) - { - ClassRanks.log("Clazz added:" + sClassName, Level.INFO); - - //db.i("Clazz added: " + sClassName); - } else - { - plugin.msg(pPlayer, "Clazz added: " + sClassName); - } -// plugin.config.save_config(); - return true; - } - if (pPlayer == null) - plugin.db.i("Clazz already exists: " + sClassName); - else - plugin.msg(pPlayer, "Clazz already exists for " + pPlayer); - return true; - } - - public static boolean configRankAdd(String sClassName, String sPermName, String sDispName, String sColor, ItemStack[] isItems, double dCost, int iExp, Player pPlayer) { - Clazz cClass = getClassbyClassName(sClassName); - if (cClass != null) - { - cClass.ranks.add(new Rank(sPermName, sDispName, (FormatManager.formatColor(sColor)), cClass, isItems, dCost, iExp)); - if (pPlayer == null) - { -// plugin.db.i("Rank added: " + (FormatManager.formatColor(sColor)) + sPermName); -// plugin.config.save_config(); - } else - { - plugin.msg(pPlayer, "Rank added: " + (FormatManager.formatColor(sColor)) + sPermName +"/"+pPlayer); - plugin.config.save_config(); - } - return true; - } - if (pPlayer == null) - plugin.db.i("Clazz not found: " + sClassName); - else - plugin.msg(pPlayer, "Clazz not found: " + sClassName); - return true; - } - - public static boolean configClassChange(String sClassName, String sClassNewName, Player pPlayer) { - Clazz cClass = getClassbyClassName(sClassName); - if (cClass != null) { - cClass.name = sClassNewName; - plugin.msg(pPlayer, "Clazz changed: " + sClassName + " => " + sClassNewName); - plugin.config.save_config(); - return true; - } - plugin.msg(pPlayer, "Clazz not found: " + sClassName); - return true; - } - - public static boolean configRankChange(String sClassName, String sPermName, String sDispName, String sColor, Player pPlayer) { - Clazz cClass = getClassbyClassName(sClassName); - if (cClass != null) { - Rank rank = getRankByPermName(sPermName); - if (rank != null) { - rank.setDispName(sDispName); - rank.setColor((FormatManager.formatColor(sColor))); - plugin.msg(pPlayer, "Rank updated: " + (FormatManager.formatColor(sColor)) + sPermName); - plugin.config.save_config(); - return true; - } - plugin.msg(pPlayer, "Rank not found: " + sPermName); - } - plugin.msg(pPlayer, "Clazz not found: " + sClassName); - return true; - } - - public static void saveClassProgress(Player pPlayer) - { - plugin.db.i("saving Clazz process"); - String s = plugin.getConfig().getString("progress."+pPlayer.getName()); - plugin.db.i("progress of "+pPlayer.getName()+": "+s); - Rank rank = ClassManager.getRankByPermName(plugin.perms.getPermNameByPlayer(pPlayer.getWorld().getName(), pPlayer)); - if (rank == null) { - plugin.db.i("rank is null!"); - return; - } - - int rankID = rank.getSuperClass().ranks.indexOf(rank); - plugin.db.i("rank ID: "+rankID); - int classID = clazzes.indexOf(rank.getSuperClass()); - plugin.db.i("classID: "+classID); - - if (s != null && s.length() == clazzes.size()) { - - char[] c = s.toCharArray(); - c[classID] = String.valueOf(rankID).charAt(0); - plugin.db.i("new c[classID]: "+c[classID]); - - plugin.db.i("saving: "+c.toString()); - plugin.getConfig().set("progress."+pPlayer.getName(), String.valueOf(c.toString())); - - return; - } - - plugin.db.i("no entry yet!"); - String result = ""; - for (int i = 0; i ranks = oClass.ranks; - for (Rank oRank : ranks) - { - if (rank.getPermName().equals(oRank.getPermName())) - { - return rankID; - } else - { - rankID++; - } - } - return rankID; - } catch (Exception e) { - return 0; - } - } - - -} diff --git a/src/net/slipcor/classranks/managers/ClazzList.java b/src/net/slipcor/classranks/managers/ClazzList.java new file mode 100644 index 0000000..a6f9fec --- /dev/null +++ b/src/net/slipcor/classranks/managers/ClazzList.java @@ -0,0 +1,521 @@ +package net.slipcor.classranks.managers; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.logging.Level; + +import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.Rank; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +/** + * This class hold the list of defined Clazzes + * + * - List of Clazzes as Key / Value + * - key = ClazzName + * - value = Clazz + * + * + * @version v0.7.1 + * + * @author krglok + */ + +public class ClazzList +{ + private HashMap clazzes = new HashMap(); + private ClassRanks plugin; + + // private static DebugManager db; + + public ClazzList(ClassRanks cr) + { + this.plugin = cr; + // db = new DebugManager(cr); + } + + public int getIndex(Clazz cClazz) + { + int index = 0; + for (Clazz clazz : clazzes.values()) + { + if (clazz.clazzName.equalsIgnoreCase(cClazz.clazzName)) + { + return index; + } + index++; + } + return 0; + } + + /** + * search for ClazzName with ignoreCase + * + * @param sClassname + * @return true if found + */ + public boolean containClazz(String sClassname) + { + for (String key : clazzes.keySet()) + { + if (key.equalsIgnoreCase(sClassname)) + { + return true; + } + } + return false; + } + + /** + * create new Clazz and add to the List of clazzes + * check if clazzName are always available + * the key is uppercase , ignoreCase in the list + * + * @param sClassName + */ + public void add(String sClassName) + { + if (this.containClazz(sClassName) == false) + { + String key = sClassName.toUpperCase(); + clazzes.put(key,new Clazz(sClassName)); + } + } + + public String getFirstPermNameByClassName(String sClassName) + { + // standard version: get first rank + if (this.containClazz(sClassName)) + { + String key = sClassName.toUpperCase(); + Clazz clazz = this.clazzes.get(key); + if (clazz.ranks.size() > 0) + { + return clazz.ranks.get(1).getPermName(); + } + } + return null; + } + +// public static String getFirstPermNameByClassName(String cString, String sPlayer) +// { +// // extended version: get rank +// for (Clazz c : clazzes) +// { +// if (c.name.equals(cString)) +// { +// return c.ranks +// .get(ClazzList.loadClassProcess( +// Bukkit.getPlayer(sPlayer), c)).getPermName(); +// } +// } +// return null; +// } + + /** + * search for classname by Rank / sPermname + * + * @param rank + * @return clazzName or null + */ + public String getClassNameByPermName(String permName) + { + for (Clazz clazz : clazzes.values()) + { + for (Rank r : clazz.ranks.values()) + { + if (r.getPermName().equalsIgnoreCase(permName)) + return clazz.clazzName; + } + } + return null; + } + + /** + * search permissionName in permissionGroup (via Vault) + * + * @param permGroups + * @return permissionName or emptyString + */ + public String getLastPermNameByPermGroups( + ArrayList permGroups) + { + String sPermName = ""; + for (Clazz clazz : clazzes.values()) + { + for (Rank rank : clazz.ranks.values()) + { + plugin.db.i(clazz.clazzName + " => " + rank.getPermName()); + if (permGroups.contains(rank.getPermName())) + { + sPermName = rank.getPermName(); + } + } + } + return sPermName; + } + + + /** + * search for Rank by permissionName + * + * @param sPermName + * @return Rank or null + */ + public Rank getRankByPermName(String sPermName) + { + for (Clazz clazz : clazzes.values()) + { + for (Rank rank : clazz.ranks.values()) + { + if (rank.getPermName().equals(sPermName)) + { + return rank; + } + } + } + return null; + } + + /** + * search for Rank in a List of PermissionName + * + * @param sPermName + * @return Rank or null + */ + public Rank getRankByPermName(String[] sPermName) + { + for (Clazz clazz : clazzes.values()) + { + for (Rank rank : clazz.ranks.values()) + { + for (String permName : sPermName) + { + plugin.db.i("Rank: " + rank.getPermName() + " Group: "+ permName); + if (rank.getPermName().equals(permName)) + { + return rank; + } + } + } + } + return null; + } + + public Clazz getClazzByRank(Rank rank) + { + for (Clazz clazz : this.clazzes.values()) + { + if (clazz.clazzName.equalsIgnoreCase(rank.getSuperClass().clazzName)) + { + return clazz; + } + } + return null; + } + + public Rank getNextRank(Rank rank, int rankIndex) + { + Clazz clazz = getClazzByRank(rank); + if (clazz != null) + { + return clazz.nextRank(rank.getPermName()); + } + +// if (rankIndex + 1 < rank.getSuperClass().ranks.size()) +// { +// return rank.getSuperClass().ranks.get(rankIndex + 1); +// } else +// { +// return null; +// } + return null; + } + + public Rank getPrevRank(Rank rank, int rankIndex) + { + Clazz clazz = getClazzByRank(rank); + if (clazz != null) + { + return clazz.prevRank(rank.getPermName()); + } +// if (rankIndex > 0) +// { +// return rank.getSuperClass().ranks.get(rankIndex - 1); +// } else +// { +// return null; +// } + return null; + } + + private Clazz getClassbyClassName(String sClassName) + { + if (this.containClazz(sClassName)) + { + sClassName = sClassName.toUpperCase(); + return this.getClassbyClassName(sClassName); + } +// for (Clazz c : clazzes) +// { +// if (c.name.equals(sClassName)) +// return c; +// } + return null; + } + + public boolean rankExists(String sRank) + { + for (Clazz clazz : clazzes.values()) + { + for (Rank r : clazz.ranks.values()) + { + if (r.getPermName().equals(sRank)) + { + return true; + } + } + } + return false; + } + + public HashMap getClasses() + { + return clazzes; + } + + public boolean configClassRemove(String sClassName, Player pPlayer) + { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass != null) + { + clazzes.remove(cClass); + plugin.msg(pPlayer, "Clazz removed: " + sClassName); + plugin.config.save_config(); + return true; + } + plugin.msg(pPlayer, "Clazz not found: " + sClassName); + return true; + } + + public boolean configRankRemove(String sClassName, String sPermName, + Player pPlayer) + { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass != null) + { + Rank rank = getRankByPermName(sPermName); + if (rank != null) + { + ChatColor cColor = rank.getColor(); + cClass.ranks.remove(rank); + plugin.msg(pPlayer, "Rank removed: " + cColor + sPermName); + plugin.config.save_config(); + return true; + } + plugin.msg(pPlayer, "Rank not found: " + sPermName); + return true; + } + plugin.msg(pPlayer, "Clazz not found: " + sClassName); + return true; + } + + public boolean configClassAdd(String sClassName, String sPermName, + String sDispName, String sColor, ItemStack[] isItems, double dCost, + int iExp, Player pPlayer) + { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass == null) + { + Clazz clazz = new Clazz(sClassName); + clazz.add(sPermName, sDispName, (FormatManager.formatColor(sColor)), + isItems, dCost, iExp); + // add Clazz to ClazzList + String key = clazz.clazzName.toUpperCase(); + clazzes.put(key,clazz); + if (pPlayer == null) + { + ClassRanks.log("Clazz added:" + sClassName, Level.INFO); + + // db.i("Clazz added: " + sClassName); + } else + { + plugin.msg(pPlayer, "Clazz added: " + sClassName); + } + // plugin.config.save_config(); + return true; + } + if (pPlayer == null) + plugin.db.i("Clazz already exists: " + sClassName); + else + plugin.msg(pPlayer, "Clazz already exists for " + pPlayer); + return true; + } + + public boolean configRankAdd(String sClassName, String sPermName, + String sDispName, String sColor, ItemStack[] isItems, double dCost, + int iExp, Player pPlayer) + { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass != null) + { + int nextIndex = cClass.ranks.size()+1; + cClass.ranks.put(nextIndex, new Rank(sPermName, sDispName, (FormatManager + .formatColor(sColor)), cClass, isItems, dCost, iExp)); + if (pPlayer == null) + { + // plugin.db.i("Rank added: " + + // (FormatManager.formatColor(sColor)) + sPermName); + // plugin.config.save_config(); + } else + { + plugin.msg(pPlayer, + "Rank added: " + (FormatManager.formatColor(sColor)) + + sPermName + "/" + pPlayer); + plugin.config.save_config(); + } + return true; + } + if (pPlayer == null) + plugin.db.i("Clazz not found: " + sClassName); + else + plugin.msg(pPlayer, "Clazz not found: " + sClassName); + return true; + } + + public boolean configClassChange(String sClassName, + String sClassNewName, Player pPlayer) + { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass != null) + { + cClass.clazzName = sClassNewName; + plugin.msg(pPlayer, "Clazz changed: " + sClassName + " => " + + sClassNewName); + plugin.config.save_config(); + return true; + } + plugin.msg(pPlayer, "Clazz not found: " + sClassName); + return true; + } + + public boolean configRankChange(String sClassName, String sPermName, + String sDispName, String sColor, Player pPlayer) + { + Clazz cClass = getClassbyClassName(sClassName); + if (cClass != null) + { + Rank rank = getRankByPermName(sPermName); + if (rank != null) + { + rank.setDispName(sDispName); + rank.setColor((FormatManager.formatColor(sColor))); + plugin.msg(pPlayer, + "Rank updated: " + (FormatManager.formatColor(sColor)) + + sPermName); + plugin.config.save_config(); + return true; + } + plugin.msg(pPlayer, "Rank not found: " + sPermName); + } + plugin.msg(pPlayer, "Clazz not found: " + sClassName); + return true; + } + + public void saveClassProgress(Player pPlayer) + { + plugin.db.i("saving Clazz process"); + String s = plugin.getConfig() + .getString("progress." + pPlayer.getName()); + plugin.db.i("progress of " + pPlayer.getName() + ": " + s); + Rank rank = getRankByPermName(plugin.perms.getPermNameByPlayer(pPlayer.getWorld().getName(), pPlayer)); + if (rank == null) + { + plugin.db.i("rank is null!"); + return; + } + + int rankID = rank.getSuperClass().getIndexOf(rank); + plugin.db.i("rank ID: " + rankID); + int classID = this.getIndex(rank.getSuperClass()); + plugin.db.i("classID: " + classID); + + if (s != null && s.length() == clazzes.size()) + { + + char[] c = s.toCharArray(); + c[classID] = String.valueOf(rankID).charAt(0); + plugin.db.i("new c[classID]: " + c[classID]); + + plugin.db.i("saving: " + c.toString()); + plugin.getConfig().set("progress." + pPlayer.getName(), + String.valueOf(c.toString())); + + return; + } + + plugin.db.i("no entry yet!"); + String result = ""; + for (int i = 0; i < clazzes.size(); i++) + { + if (i == classID) + { + result += String.valueOf(rankID); + } else + { + result += "0"; + } + } + plugin.db.i("setting: " + result); + plugin.getConfig().set("progress." + pPlayer.getName(), + String.valueOf(result)); + plugin.saveConfig(); + } + + public int loadClassProcess(Player pPlayer, Clazz cClass) + { + try + { + String s = plugin.getConfig().getString( + "progress." + pPlayer.getName()); + int classID = this.getIndex(cClass); + + int rankID = Integer.parseInt(String.valueOf(s.charAt(classID))); + return rankID; + } catch (Exception e) + { + return 0; + } + } + + public int getRankIndex(Rank rank, Clazz clazz) + { + // init with 0 to set default to first Rank in Clazz + return clazz.getIndexOf(rank); +// try +// { +// ArrayList ranks = oClass.ranks; +// for (Rank oRank : ranks) +// { +// if (rank.getPermName().equals(oRank.getPermName())) +// { +// return rankID; +// } else +// { +// rankID++; +// } +// } +// return rankID; +// } catch (Exception e) +// { +// return 0; +// } + } + +} diff --git a/src/net/slipcor/classranks/managers/ConfigManager.java b/src/net/slipcor/classranks/managers/ConfigManager.java index c9e922d..7ae03b2 100644 --- a/src/net/slipcor/classranks/managers/ConfigManager.java +++ b/src/net/slipcor/classranks/managers/ConfigManager.java @@ -20,7 +20,7 @@ * this Class read the config and make it persistaned * each config node will be stored here. * the config data stored in parameters, so not always read from file - * the ClassRank tree are stored in the ClassManager + * the ClassRank tree are stored in the ClazzList * * @version v0.4.6 * @@ -103,7 +103,7 @@ public Double getMoneyCost(int index) public void setMoneyCost(Double[] moneyCost) { this.moneyCost = moneyCost; } - private int[] expCost; //= new int[ClassManager.getClasses().size()]; // EXP + private int[] expCost; //= new int[ClazzList.getClasses().size()]; // EXP public int[] getExpCost() { return expCost; } @@ -409,7 +409,7 @@ public void load_config() { if (items == null) { plugin.db.i("items invalid, setting to null"); - itemStacks = new ItemStack[ClassManager.getClasses().size()][1]; + itemStacks = new ItemStack[ClazzList.getClasses().size()][1]; } else { // for each items => ItemStack[][1,2,3] @@ -509,11 +509,11 @@ public void load_config() { if (newClass) { // create class - ClassManager.configClassAdd(sClassName, sRankName,rankName, rankColor, rankItems, rankCost, rankExp,null); + ClazzList.configClassAdd(sClassName, sRankName,rankName, rankColor, rankItems, rankCost, rankExp,null); newClass = false; } else { - ClassManager.configRankAdd(sClassName, sRankName, rankName,rankColor, rankItems, rankCost, rankExp, null); + ClazzList.configRankAdd(sClassName, sRankName, rankName,rankColor, rankItems, rankCost, rankExp, null); } } } @@ -604,7 +604,7 @@ public void playerSectionRemove(Player player, String className) public void save_config() { plugin.db.i("saving config..."); - for (Clazz cClass : ClassManager.getClasses()) + for (Clazz cClass : ClazzList.getClasses()) { plugin.db.i(" - " + cClass.name); for (Rank rRank : cClass.ranks) { diff --git a/src/net/slipcor/classranks/managers/PlayerClassManager.java b/src/net/slipcor/classranks/managers/PlayerClassManager.java index d791203..5af0d33 100644 --- a/src/net/slipcor/classranks/managers/PlayerClassManager.java +++ b/src/net/slipcor/classranks/managers/PlayerClassManager.java @@ -5,59 +5,96 @@ import java.util.ArrayList; import java.util.Iterator; +import org.bukkit.Bukkit; + /** + * hold PlayerClazzRank List. + * this list are load from config and realize a player tracking * * @author Windu - * + * */ -public class PlayerClassManager { - - private ArrayList playerClassList; +public class PlayerClassManager +{ + + private ArrayList playerClassList; - public ArrayList getPlayerClassList() { + public ArrayList getPlayerClassList() + { return playerClassList; } -// public void setPlayerClassList(ArrayList playerClassList) { -// this.playerClassList = playerClassList; -// } + // public void setPlayerClassList(ArrayList + // playerClassList) { + // this.playerClassList = playerClassList; + // } - public PlayerClassManager() { + public PlayerClassManager() + { super(); this.playerClassList = new ArrayList(); } /* - * add player to list - * prevent double entrys + * add player to list prevent double entrys */ - public void addPlayer(String playerName) { - - // player not found make player entry - if (!checkPlayerName(playerName)) { + public void addPlayer(String playerName) + { + + // player not found make player entry + if (!checkPlayerName(playerName)) + { playerClassList.add(new PlayerClazzList(playerName, null)); } - + } - + /* * checks for playername in list */ - public boolean checkPlayerName(String playerName) { - - if (playerClassList.isEmpty()) { + public boolean checkPlayerName(String playerName) + { + + if (playerClassList.isEmpty()) + { return false; } boolean isfound = false; - for (Iterator item = playerClassList.iterator(); item.hasNext(); ) { - if ( item.next().equalsIgnoreCaseName(playerName)) { - isfound = true; - } + for (Iterator item = playerClassList.iterator(); item + .hasNext();) + { + if (item.next().equalsIgnoreCaseName(playerName)) + { + isfound = true; + } } return isfound; - + + } + + public String getFirstPermNameByClassName(String className, String sPlayer) + { + // extended version: get rank + for (PlayerClazzList pClazzList : playerClassList) + { + if (pClazzList.getPlayerName().equalsIgnoreCase(sPlayer)) + { + if (pClazzList.equalsIgnoreCaseClass(className)) + { + return pClazzList.get(className); + } + } + } +// for (Clazz c : clazzes) +// { +// if (c.name.equals(cString)) +// { +// return c.ranks +// .get(ClazzList.loadClassProcess( +// Bukkit.getPlayer(sPlayer), c)).getPermName(); +// } +// } + return null; } - - } diff --git a/src/net/slipcor/classranks/managers/PlayerManager.java b/src/net/slipcor/classranks/managers/PlayerManager.java index 7086e75..b1e9bf9 100644 --- a/src/net/slipcor/classranks/managers/PlayerManager.java +++ b/src/net/slipcor/classranks/managers/PlayerManager.java @@ -9,6 +9,7 @@ import java.util.logging.Level; import net.slipcor.classranks.ClassRanks; +import net.slipcor.classranks.core.Clazz; import net.slipcor.classranks.core.Item; import net.slipcor.classranks.core.ItemList; @@ -203,6 +204,6 @@ public int coolDownCheck(Player player) return 0; } - + }

+	 * The main switch for the command usage. Check for known commands,
+	 * permissions, arguments, and commit whatever is wanted.
+	 * 
+	 * 
+
+     /class [rankup]  [playername] {world} | Rank user up
+
+	 * @param pPlayer , the sender of the command
+	 * @param args , arguments of the Command /class
+	 * @return
+     * 
+ */ + public boolean parseCommand(Player pPlayer, String[] args) + { +// Player player = pPlayer; + plugin.db.i("parsing player " + pPlayer + ", command: " + FormatManager.formatStringArray(args)); + + boolean isSelf = plugin.perms.hasPerms(pPlayer, "classranks.self.rank", pPlayer.getWorld().getName()); + String world = "all"; + String className = ""; + + if (pPlayer.isOp()) + { + isSelf = true; + } + + if (args.length == 0) + { + //zeigt command description aus Plugi.yml + cmdRankInfo (pPlayer); + return true; + } + + if (isSelf == false) + { + plugin.msg(pPlayer,ChatColor.RED+"You don't have permission to choose your class!"); + return true; + } + + + //RANKUP for multiClasses + if (plugin.config.isOnlyoneclass() == false) + { + // rank up or down + if (args.length == 0) + { + plugin.msg(pPlayer,ChatColor.RED+"Not enough arguments ("+ String.valueOf(args.length) + ")!"); + plugin.msg(pPlayer,ChatColor.GREEN+" /rankup [classname] {world} | Rank user up"); + return true; + } + if (args.length > 1) + { + world = args[1]; + } + className = args[0]; + return rankUp(pPlayer, pPlayer, className, world); + } else + { + if (isSelf == false) + { + plugin.msg(pPlayer,ChatColor.RED+"You don't have permission to rankup your class!"); + return true; + } else + { + Rank rank = ClassManager.getRankByPermName(plugin.perms.getPlayerGroups(pPlayer)); + className = ClassManager.getClassNameByPermName(rank.getPermName()); + if (existClass(className)) + { + rankUp(pPlayer, pPlayer, className, world); + return true; + } else + { + plugin.msg(pPlayer,ChatColor.RED+"The class name are not found!"); + plugin.msg(pPlayer,ChatColor.RED+"Are have any class or rank ?"); + plugin.msg(pPlayer,"/class info show your class and rank"); + return true; + } + } + } + } + } diff --git a/src/net/slipcor/classranks/core/ClassRankCore.png b/src/net/slipcor/classranks/core/ClassRankCore.png new file mode 100644 index 0000000000000000000000000000000000000000..3626ba4f910cb37a4449a28d98e1be7db3b68f19 GIT binary patch literal 66839 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

u51L=(DV8H)Z;7BX25&By>)-&D!S7&OqA<0LCp8 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 S=@6dq{UZf6`O^DlFaHmi-N;!0 literal 0 HcmV?d00001 diff --git a/src/net/slipcor/classranks/core/PlayerClazzList.java b/src/net/slipcor/classranks/core/PlayerClazzList.java index 7add5e3..e640e81 100644 --- a/src/net/slipcor/classranks/core/PlayerClazzList.java +++ b/src/net/slipcor/classranks/core/PlayerClazzList.java @@ -1,128 +1,108 @@ package net.slipcor.classranks.core; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; /** * * @author Windu - * - * define a player Class Rank List object - * will be used to track player classes + * + * define a player Class Rank List object will be used to track player + * classes */ -public class PlayerClazzList extends ArrayList +public class PlayerClazzList extends HashMap { - + /** * */ private static final long serialVersionUID = -3071712660629867671L; - - private String playerName; - -// private ArrayList playerClassRanks; - public PlayerClazzList(String playerName, ArrayList playerClassRanks) + private String uuid; + + // private ArrayList playerClassRanks; + + public PlayerClazzList(String uuid, String playerName) { super(); - this.playerName = playerName; - this.addAll(playerClassRanks); - } - - public void setPlayerName(String playerName) { - this.playerName = playerName; - } - - public String getPlayerName() { - return this.playerName; + this.uuid =uuid; + this.put("name", playerName); } - public boolean equalsIgnoreCaseName(String playerName) { - return playerName.equalsIgnoreCase(playerName); + /** + * @return the uuid + */ + public String getUuid() + { + return uuid; } - - public boolean addPlayerClassRank (String className, String rankName) { - - this.add(new PlayerClazzRank(className, rankName)); - - return true; + + /** + * @param uuid the uuid to set + */ + public void setUuid(String uuid) + { + this.uuid = uuid; } - - public PlayerClazzRank getPlayerClassRank(int index) { - - return this.get(index); + + + public void setPlayerName(String playerName) + { + this.setUuid(playerName); + this.put("name", playerName); } - public String getPlayerClass(int index) { - - return this.get(index).className; + public String getPlayerName() + { + if (this.containsKey("name")) + { + return ""; + } + return this.get("name"); } - public String getPlayerRank(int index) { - - return this.get(index).rankName; + public boolean equalsIgnoreCaseName(String playerName) + { + return playerName.equalsIgnoreCase(playerName); } - - - public boolean equalsIgnoreCaseClass(String className) { - boolean isfound = false; - for (Iterator item = this.iterator(); item.hasNext(); ) { - if ( item.next().className.equalsIgnoreCase(className)) { - isfound = true; - } - } - return isfound; + + public boolean addPlayerClassRank(String className, String rankName) + { + this.put(className, rankName); + + return true; } - public boolean equalsIgnoreCaseRank(String rankName) + public String getPlayerRank(String className) { - boolean isfound = false; - for (Iterator item = this.iterator(); item.hasNext(); ) - { - if ( item.next().rankName.equalsIgnoreCase(rankName)) - { - isfound = true; - } - } - return isfound; + + return this.get(className); } - @SuppressWarnings("null") - public int getClassIndex(String className) + public boolean equalsIgnoreCaseClass(String className) { - int found = -1; - PlayerClazzRank[] items = null; - if (this.size() > 0) + for (String name : this.keySet()) { - this.toArray(items); - for (int i=0; i 0) + for (String rank : this.values()) { - this.toArray(items); - for (int i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/net/slipcor/classranks/managers/ConfigManager.java b/src/net/slipcor/classranks/managers/ConfigManager.java index 91cd198..8157de6 100644 --- a/src/net/slipcor/classranks/managers/ConfigManager.java +++ b/src/net/slipcor/classranks/managers/ConfigManager.java @@ -1,15 +1,19 @@ package net.slipcor.classranks.managers; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; //import org.bukkit.plugin.Plugin; import net.slipcor.classranks.ClassRanks; import net.slipcor.classranks.core.Clazz; +import net.slipcor.classranks.core.PlayerClazzList; +import net.slipcor.classranks.core.PlayerClazzRank; import net.slipcor.classranks.core.Rank; /* @@ -69,10 +73,10 @@ public void setClearranks(Boolean clearranks) this.clearranks = clearranks; } - private Map players; + private HashMap playersClazzList; - public Map getPlayers() { - return players; + public HashMap getPlayers() { + return playersClazzList; } // private Map playerClassList; // should store the playerClasses @@ -121,7 +125,7 @@ public ConfigManager(ClassRanks plugin) { moneyCost = new Double[1]; expCost = new int[1]; signs = new String[3]; - + playersClazzList = new HashMap(); } private Boolean debug = new Boolean(false); @@ -515,6 +519,7 @@ public void load_config() { } // getConfig().getString("progress."+pPlayer.getName()); + playerSectionRead() ; plugin.saveConfig(); } @@ -522,29 +527,76 @@ public void load_config() { /** * */ - public void readPlayerSection() + public void playerSectionRead() { boolean isSection = (plugin.getConfig().getConfigurationSection("players") != null); if (!isSection) { - players = null; + playersClazzList = null; } else { - players = plugin.getConfig().getConfigurationSection("players").getValues(false); + Map playerList = plugin.getConfig().getConfigurationSection("players").getValues(false); + + if (playerList != null) + { + System.out.println("PlayerClassRank List"); + for (String playerName : playerList.keySet()) + { + PlayerClazzList playerClazzList = new PlayerClazzList(playerName,""); + + Map playerClass = plugin.getConfig().getConfigurationSection("players."+playerName).getValues(false); + for (String clazzName : playerClass.keySet()) + { + String rankName = plugin.getConfig().getString("players."+playerName+"."+clazzName,""); + playerClazzList.addPlayerClassRank(clazzName, rankName); + + } + playersClazzList.put(playerName, playerClazzList); + } + // Test output + for (PlayerClazzList playerClazz : playersClazzList.values()) + { + for (String name : playerClazz.keySet()) + { + String rankName = playerClazz.get(name); + System.out.println(playerClazz.getUuid()+":"+name+":"+rankName); + } + } + } -// for (String sClassName : players.keySet()) { -// -// -// } } } + + private void playerSectionWrite() + { + plugin.getConfig().set("players",playersClazzList); + plugin.saveConfig(); + } + + public void playerSectionWrite(Player player, String className, String rank) + { + plugin.getConfig().set("players." + player.getUniqueId().toString() + "." + className, rank); + plugin.db.i("Save to config added rank " + rank + " to player " + player + ", no world support"); + plugin.saveConfig(); + } + public void playerSectionRemove(Player player, String className) + { + plugin.db.i("Remove config " + player.getUniqueId().toString() + " : "+className); + PlayerClazzList playerClazz = playersClazzList.get(player.getUniqueId().toString()); + playerClazz.remove(className); + plugin.db.i("Save player section after remove " ); + playerSectionWrite(); + + } + /** * save the classrank map to the config */ - public void save_config() { + public void save_config() + { plugin.db.i("saving config..."); for (Clazz cClass : ClassManager.getClasses()) { From 9b0721db7c64ac4ff3607e3f4ba05ea88db149ec Mon Sep 17 00:00:00 2001 From: krglok Date: Sun, 7 Jun 2015 10:03:54 +0200 Subject: [PATCH 23/29] Update 0.6.3 compile for 1.8.3 rankup / rankdown coerrected command classranks show info --- bin/net/slipcor/classranks/ClassRanks.class | Bin 7484 -> 8537 bytes .../classranks/commands/ClassCommand.class | Bin 19230 -> 0 bytes .../classranks/commands/PlayerCommands.class | Bin 12824 -> 12832 bytes .../classranks/commands/RankdownCommand.class | Bin 5184 -> 5192 bytes .../classranks/commands/RankupCommand.class | Bin 5172 -> 5180 bytes bin/plugin.yml | 9 +++++- src/net/slipcor/classranks/ClassRanks.java | 26 +++++++++++++++++- ...Command.java => AbstractClassCommand.java} | 4 +-- .../classranks/commands/PlayerCommands.java | 2 +- .../classranks/commands/RankdownCommand.java | 2 +- .../classranks/commands/RankupCommand.java | 2 +- src/plugin.yml | 9 +++++- 12 files changed, 46 insertions(+), 8 deletions(-) delete mode 100644 bin/net/slipcor/classranks/commands/ClassCommand.class rename src/net/slipcor/classranks/commands/{ClassCommand.java => AbstractClassCommand.java} (99%) diff --git a/bin/net/slipcor/classranks/ClassRanks.class b/bin/net/slipcor/classranks/ClassRanks.class index e3ee4e107c71c51fde7329a6a980f8f977cb0838..9cbd7dbab5570ebefd45ea4b61036638ffb05fac 100644 GIT binary patch delta 2202 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 z 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 KmwL3Y=zjr|2cC2Q diff --git a/bin/net/slipcor/classranks/commands/PlayerCommands.class b/bin/net/slipcor/classranks/commands/PlayerCommands.class index cbba387de05d3cfe4a6bf830f9ba098d651a2b1c..bb3534a856a9040f04819f6308d6a3d0f2b486bc 100644 GIT binary patch delta 28 kcmbP{vLI!GGo#7mLSe~?|JXSklZs1<5|c|drfe|;0G#g&1poj5 delta 19 bcmZ3GG9zVzGo#MrgG}NRqd7O`Y%v4?Ocn=a diff --git a/bin/net/slipcor/classranks/commands/RankdownCommand.class b/bin/net/slipcor/classranks/commands/RankdownCommand.class index 0c09d2d645e3d22647ad5576324871edc2a1cab8..f700af483a4a95c71b6a8c2b7f30d89ed3b43df1 100644 GIT binary patch delta 24 fcmX@0aYAE)3!}+I0R;}nq~emI#N?8VskemzYJUjh delta 15 WcmX@1aX@2&3!~0N0fmjZw}k;NqXnk` diff --git a/bin/net/slipcor/classranks/commands/RankupCommand.class b/bin/net/slipcor/classranks/commands/RankupCommand.class index 431d0beddb1617c2cb9d13a09701507b08f20dbc..0a350b4a243cbecd6fd74cd9b84f4b335841dbb4 100644 GIT binary patch delta 28 kcmdm@u}5Qq6QjxGMqbH@f7v-4lZs1<5|c|dCSMc=0GD10%K!iX delta 24 fcmdm^u|;Eo(_{ly3C`sF+}y;xlw$pj*%yTYZVCwf diff --git a/bin/plugin.yml b/bin/plugin.yml index be13ec0..8762284 100644 --- a/bin/plugin.yml +++ b/bin/plugin.yml @@ -1,10 +1,17 @@ name: ClassRanks main: net.slipcor.classranks.ClassRanks -version: 0.6.2.0 +version: 0.6.3.0 author: slipcor website: http://dev.bukkit.org/server-mods/classranks/ soft-depends: [bPermissions,iConomy,BOSEconomy,MultiCurrency,Essentials,PermissionsEx,Vault] commands: + classranks: + description: Lets users choose a class / change classes + usage: | + /class ,player command for choose the class + /rankup ,player rankup his class + /rankdown ,player rankdown his class + /classadmin , admin or op command for configuration class: description: Lets users choose a class / change classes usage: | diff --git a/src/net/slipcor/classranks/ClassRanks.java b/src/net/slipcor/classranks/ClassRanks.java index 566e7c5..3b72e5e 100644 --- a/src/net/slipcor/classranks/ClassRanks.java +++ b/src/net/slipcor/classranks/ClassRanks.java @@ -5,6 +5,7 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.Command; //import org.bukkit.Material; import org.bukkit.command.CommandSender; //import org.bukkit.configuration.ConfigurationSection; @@ -19,7 +20,7 @@ import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.permission.Permission; import net.slipcor.classranks.commands.ClassAdminCommand; -import net.slipcor.classranks.commands.ClassCommand; +import net.slipcor.classranks.commands.AbstractClassCommand; import net.slipcor.classranks.commands.PlayerCommands; import net.slipcor.classranks.commands.RankdownCommand; import net.slipcor.classranks.commands.RankupCommand; @@ -69,6 +70,7 @@ public void onEnable() { ClassManager cm = new ClassManager(this); // register commands +// getCommand("classranks").setExecutor(new PlayerCommands(this)); getCommand("class").setExecutor(new PlayerCommands(this)); getCommand("classadmin").setExecutor(new ClassAdminCommand(this)); getCommand("rankup").setExecutor(new RankupCommand(this)); @@ -125,6 +127,28 @@ public void onDisable() { log("disabled", Level.INFO); } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) + { + if (!(sender instanceof Player)) + { + msg(sender, "Console access is not implemented. "); + msg(sender, "Because a player instance is necessary"); + return true; + } + // admin class command, parse it! + db.i("/classrank detected! parsing..."); + msg(sender, ChatColor.GREEN+"ClassRanks Ver: " + getDescription().getVersion()); + msg(sender, ChatColor.GOLD+"----------------------------------------"); + msg(sender, ChatColor.GOLD+"/class ,player command for choose the class"); + msg(sender, ChatColor.GOLD+"/rankup ,player rankup his class"); + msg(sender, ChatColor.GOLD+"/rankdown ,player rankdown his class"); + msg(sender, ChatColor.GOLD+"/classadmin , admin or op command for configuration"); + msg(sender, ChatColor.GREEN+"for help type command without parameter"); + return true; + } + /** * (re)load the config */ diff --git a/src/net/slipcor/classranks/commands/ClassCommand.java b/src/net/slipcor/classranks/commands/AbstractClassCommand.java similarity index 99% rename from src/net/slipcor/classranks/commands/ClassCommand.java rename to src/net/slipcor/classranks/commands/AbstractClassCommand.java index a772f0b..131a590 100644 --- a/src/net/slipcor/classranks/commands/ClassCommand.java +++ b/src/net/slipcor/classranks/commands/AbstractClassCommand.java @@ -26,7 +26,7 @@ * @author slipcor */ -public abstract class ClassCommand implements CommandExecutor +public abstract class AbstractClassCommand implements CommandExecutor { protected final ClassRanks plugin; // protected final PlayerCommands cmdMgr; @@ -45,7 +45,7 @@ public abstract class ClassCommand implements CommandExecutor * @param cr the plugin instance to hand over * @param cm the command manager instance to hand over */ - public ClassCommand(ClassRanks plugin) + public AbstractClassCommand(ClassRanks plugin) { this.plugin = plugin; // cmdMgr = plugin.getCommandMgr(); diff --git a/src/net/slipcor/classranks/commands/PlayerCommands.java b/src/net/slipcor/classranks/commands/PlayerCommands.java index 09a5d70..14b3fb2 100644 --- a/src/net/slipcor/classranks/commands/PlayerCommands.java +++ b/src/net/slipcor/classranks/commands/PlayerCommands.java @@ -31,7 +31,7 @@ *