diff --git a/src/com/projectkorra/ProjectKorra/BendingPlayer.java b/src/com/projectkorra/ProjectKorra/BendingPlayer.java index af343412..8a621f48 100644 --- a/src/com/projectkorra/ProjectKorra/BendingPlayer.java +++ b/src/com/projectkorra/ProjectKorra/BendingPlayer.java @@ -14,7 +14,7 @@ public class BendingPlayer { UUID uuid; String player; ArrayList elements; - HashMap abilities; + private HashMap abilities; ConcurrentHashMap cooldowns; boolean permaRemoved; boolean isToggled; @@ -26,7 +26,7 @@ public class BendingPlayer { this.uuid = uuid; this.player = player; this.elements = elements; - this.abilities = abilities; + this.setAbilities(abilities); cooldowns = new ConcurrentHashMap(); this.permaRemoved = permaRemoved; isToggled = true; @@ -107,4 +107,8 @@ public class BendingPlayer { public boolean isChiBlocked() { return blockedChi; } + + public void setAbilities(HashMap abilities) { + this.abilities = abilities; + } } diff --git a/src/com/projectkorra/ProjectKorra/Commands.java b/src/com/projectkorra/ProjectKorra/Commands.java index f336e4eb..40e42bf9 100644 --- a/src/com/projectkorra/ProjectKorra/Commands.java +++ b/src/com/projectkorra/ProjectKorra/Commands.java @@ -26,6 +26,7 @@ import org.bukkit.scheduler.BukkitTask; import com.projectkorra.ProjectKorra.Ability.AbilityModuleManager; import com.projectkorra.ProjectKorra.Ability.StockAbilities; +import com.projectkorra.ProjectKorra.Objects.Preset; import com.projectkorra.ProjectKorra.Utilities.GrapplingHookAPI; public class Commands { @@ -36,7 +37,7 @@ public class Commands { this.plugin = plugin; init(); } - + /* * Element Aliases */ @@ -64,15 +65,16 @@ public class Commands { String[] importaliases = {"import", "i"}; String[] givealiases = {"give", "g", "spawn"}; String[] invinciblealiases = {"invincible", "inv"}; + String[] presetaliases = {"preset", "presets", "pre", "set"}; /* * Item Aliases */ - + public static Set invincible = new HashSet(); - + String[] grapplinghookaliases = {"grapplinghook", "grapplehook", "hook", "ghook"}; - + public static boolean debug = ProjectKorra.plugin.getConfig().getBoolean("debug"); public static boolean isToggledForAll = false; @@ -91,22 +93,122 @@ public class Commands { s.sendMessage(ChatColor.RED + "/bending bind [Ability] # " + ChatColor.YELLOW + "Bind an ability."); return true; } - if (Arrays.asList(invinciblealiases).contains(args[0].toLowerCase())) { - if (!s.hasPermission("bending.command.invincible")) { - s.sendMessage(ChatColor.RED + "You don't have permission to do that."); - return true; - } - + if (Arrays.asList(presetaliases).contains(args[0].toLowerCase())) { if (!(s instanceof Player)) { s.sendMessage(ChatColor.RED + "This command is only usable by players."); return true; } + Player player = (Player) s; + + String[] deletealiases = {"delete", "d", "del"}; + String[] createaliases = {"create", "c"}; + String[] listaliases = {"list", "l"}; + if (args.length == 2 && Arrays.asList(listaliases).contains(args[1].toLowerCase())) { + if (!s.hasPermission("bending.command.preset.list")) { + s.sendMessage(ChatColor.RED + "You don't have permission to do that."); + return true; + } + + List listnames = Preset.presets.get(player.getUniqueId()); + List ln2 = new ArrayList(); + + if (listnames == null || listnames.isEmpty()) { + s.sendMessage(ChatColor.RED + "You don't have any presets."); + return true; + } + + for (Preset preset: listnames) { + ln2.add(preset.getName()); + } + + s.sendMessage(ChatColor.GREEN + "Your Presets: " + ChatColor.DARK_AQUA + ln2.toString()); + return true; + + }else if (args.length != 3) { // bending preset bind|create|delete {name} + s.sendMessage(ChatColor.GOLD + "Proper Usage: /bending preset create|bind|list|delete [name]"); + return true; + } + + String name = args[2]; + + if (Arrays.asList(deletealiases).contains(args[1].toLowerCase())) { + if (!s.hasPermission("bending.command.preset.delete")) { + s.sendMessage(ChatColor.RED + "You don't have permission to do that."); + return true; + } + if (!Preset.presetExists(player, name)) { + s.sendMessage(ChatColor.RED + "You don't have a preset with that name."); + return true; + } + + Preset preset = Preset.getPreset(player, name); + preset.delete(); + s.sendMessage(ChatColor.GREEN + "You have deleted your preset named: " + name); + } + + if (Arrays.asList(bindaliases).contains(args[1].toLowerCase())) { + if (!s.hasPermission("bending.command.preset.bind")) { + s.sendMessage(ChatColor.RED + "You don't have permission to do that."); + return true; + } + + if (!Preset.presetExists(player, name)) { + s.sendMessage(ChatColor.RED + "You don't have a preset with that name."); + return true; + } + + Preset.bindPreset(player, name); + s.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + name + " preset."); + return true; + } + + if (Arrays.asList(createaliases).contains(args[1].toLowerCase())) { + if (!s.hasPermission("bending.command.preset.create")) { + s.sendMessage(ChatColor.RED + "You don't have permission to do that."); + return true; + } + + int limit = Methods.getMaxPresets(player); + + if (Preset.presets.get(player) != null && Preset.presets.get(player).size() >= limit) { + s.sendMessage(ChatColor.RED + "You have reached your max number of Presets."); + return true; + } + + if (Preset.presetExists(player, name)) { + s.sendMessage(ChatColor.RED + "A preset with that name already exists."); + return true; + } + + BendingPlayer bPlayer = Methods.getBendingPlayer(player.getName()); + + if (bPlayer == null) return true; + + HashMap abilities = bPlayer.getAbilities(); + Preset preset = new Preset(player.getUniqueId(), name, abilities); + preset.save(); + s.sendMessage(ChatColor.GREEN + "Created preset with the name: " + name); + return true; + } + + } + if (Arrays.asList(invinciblealiases).contains(args[0].toLowerCase())) { + if (!s.hasPermission("bending.command.invincible")) { + s.sendMessage(ChatColor.RED + "You don't have permission to do that."); + return true; + } + + if (!(s instanceof Player)) { + s.sendMessage(ChatColor.RED + "This command is only usable by players."); + return true; + } + if (args.length != 1) { s.sendMessage(ChatColor.GOLD + "Proper Usage: /bending invincible"); return true; } - + if (!invincible.contains(s.getName())) { /* * Player is not invincible. @@ -124,19 +226,19 @@ public class Commands { s.sendMessage(ChatColor.RED + "You don't have permission to do that."); return true; } - + if (args.length < 3) { s.sendMessage(ChatColor.GOLD + "Proper Usage: /bending give [Player] [Item] "); return true; } - + Player player = Bukkit.getPlayer(args[1]); - + if (player == null) { s.sendMessage(ChatColor.RED + "That player is not online."); return true; } - + if (Arrays.asList(grapplinghookaliases).contains(args[2])) { /* * They are spawning in a grappling hook. @@ -150,7 +252,7 @@ public class Commands { s.sendMessage(ChatColor.GOLD + "Example: /bending give " + s.getName() + " grapplinghook 25"); return true; } - + ItemStack hook = GrapplingHookAPI.createHook(uses); player.getInventory().addItem(hook); s.sendMessage(ChatColor.GREEN + "A grappling hook with " + uses + " uses has been added to your inventory."); @@ -192,7 +294,7 @@ public class Commands { } BendingPlayer bPlayer = Methods.getBendingPlayer(s.getName()); if (args.length == 1) { - bPlayer.abilities.clear(); + bPlayer.getAbilities().clear(); for (int i = 1; i <= 9; i++) { Methods.saveAbility(bPlayer, i, null); } @@ -207,8 +309,8 @@ public class Commands { s.sendMessage(ChatColor.RED + "The slot must be an integer between 0 and 9."); return true; } - if (bPlayer.abilities.get(slot) != null) { - bPlayer.abilities.remove(slot); + if (bPlayer.getAbilities().get(slot) != null) { + bPlayer.getAbilities().remove(slot); Methods.saveAbility(bPlayer, slot, null); } s.sendMessage("You have cleared slot #" + slot); @@ -404,7 +506,7 @@ public class Commands { if (bPlayer.hasElement(Element.Fire)) elements.append("f"); if (bPlayer.hasElement(Element.Chi)) elements.append("c"); - HashMap abilities = bPlayer.abilities; + HashMap abilities = bPlayer.getAbilities(); ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_players WHERE uuid = '" + bPlayer.uuid.toString() + "'"); @@ -533,7 +635,7 @@ public class Commands { return true; } BendingPlayer bPlayer = Methods.getBendingPlayer(s.getName()); - HashMap abilities = bPlayer.abilities; + HashMap abilities = bPlayer.getAbilities(); if (abilities.isEmpty()) { s.sendMessage("You don't have any bound abilities."); @@ -611,7 +713,7 @@ public class Commands { } if (args.length == 2) { - + Player p = Bukkit.getPlayer(args[1]); if (p == null) { s.sendMessage(ChatColor.GREEN + "You are running a lookup of an offline player, this may take a second."); @@ -802,14 +904,14 @@ public class Commands { } BendingPlayer bPlayer = Methods.getBendingPlayer(player.getName()); - + if (bPlayer.isPermaRemoved()) { bPlayer.permaRemoved = false; Methods.savePermaRemoved(bPlayer); s.sendMessage(ChatColor.RED + "You have restored the bending of: " + ChatColor.DARK_AQUA + player.getName()); return true; } - + bPlayer.elements.clear(); Methods.removeUnusableAbilities(player.getName()); Methods.saveElements(bPlayer); diff --git a/src/com/projectkorra/ProjectKorra/DBConnection.java b/src/com/projectkorra/ProjectKorra/DBConnection.java index ff77a023..65464e80 100644 --- a/src/com/projectkorra/ProjectKorra/DBConnection.java +++ b/src/com/projectkorra/ProjectKorra/DBConnection.java @@ -40,6 +40,25 @@ public class DBConnection { + " PRIMARY KEY (id));"; sql.modifyQuery(query); } + + if (!sql.tableExists("pk_presets")) { + ProjectKorra.log.info("Creating pk_presets table"); + String query = "CREATE TABLE `pk_presets` (" + + "`id` int(32) NOT NULL AUTO_INCREMENT," + + "`uuid` varchar(255)," + + "`name` varchar(255)," + + "`slot1` varchar(255)," + + "`slot2` varchar(255)," + + "`slot3` varchar(255)," + + "`slot4` varchar(255)," + + "`slot5` varchar(255)," + + "`slot6` varchar(255)," + + "`slot7` varchar(255)," + + "`slot8` varchar(255)," + + "`slot9` varchar(255)," + + " PRIMARY KEY (id));"; + sql.modifyQuery(query); + } } else { sql = new SQLite(ProjectKorra.log, "[ProjectKorra] Establishing SQLite Connection.", "projectkorra.db", ProjectKorra.plugin.getDataFolder().getAbsolutePath()); ((SQLite) sql).open(); @@ -63,6 +82,24 @@ public class DBConnection { + "`slot9` TEXT(255));"; sql.modifyQuery(query); } + + if (!sql.tableExists("pk_presets")) { + ProjectKorra.log.info("Creating pk_presets table"); + String query = "CREATE TABLE `pk_presets` (" + + "`id` INTEGER PRIMARY KEY," + + "`uuid` TEXT(255)," + + "`name` TEXT(255)," + + "`slot1` TEXT(255)," + + "`slot2` TEXT(255)," + + "`slot3` TEXT(255)," + + "`slot4` TEXT(255)," + + "`slot5` TEXT(255)," + + "`slot6` TEXT(255)," + + "`slot7` TEXT(255)," + + "`slot8` TEXT(255)," + + "`slot9` TEXT(255));"; + sql.modifyQuery(query); + } } } } \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index 4344980e..75aa21c1 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -36,6 +36,7 @@ import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.LivingEntity; @@ -172,7 +173,7 @@ public class Methods { public static void bindAbility(Player player, String ability) { int slot = player.getInventory().getHeldItemSlot() + 1; BendingPlayer bPlayer = getBendingPlayer(player.getName()); - bPlayer.abilities.put(slot, ability); + bPlayer.getAbilities().put(slot, ability); if (isAirAbility(ability)) { player.sendMessage(getAirColor() + "Succesfully bound " + ability + " to slot " + slot); } @@ -203,7 +204,7 @@ public class Methods { */ public static void bindAbility(Player player, String ability, int slot) { BendingPlayer bPlayer = getBendingPlayer(player.getName()); - bPlayer.abilities.put(slot, ability); + bPlayer.getAbilities().put(slot, ability); if (isAirAbility(ability)) { player.sendMessage(getAirColor() + "Succesfully bound " + ability + " to slot " + slot); } @@ -545,7 +546,7 @@ public class Methods { if (bPlayer == null) return null; int slot = player.getInventory().getHeldItemSlot() + 1; - return bPlayer.abilities.get(slot); + return bPlayer.getAbilities().get(slot); } public static long getGlobalCooldown() { @@ -1669,7 +1670,7 @@ public class Methods { finalabilities.put(i, slots.get(i)); } } - bPlayer.abilities = finalabilities; + bPlayer.setAbilities(finalabilities); } catch (Exception ex) { } @@ -1792,7 +1793,7 @@ public class Methods { if (bPlayer == null) return; String uuid = bPlayer.uuid.toString(); - HashMap abilities = bPlayer.abilities; + HashMap abilities = bPlayer.getAbilities(); DBConnection.sql.modifyQuery("UPDATE pk_players SET slot" + slot + " = '" + (abilities.get(slot) == null ? null : abilities.get(slot)) + "' WHERE uuid = '" + uuid + "'"); } @@ -1967,5 +1968,14 @@ public class Methods { } return null; } + + public static int getMaxPresets(Player player) { + if (player.isOp()) return 500; + int cap = 0; + for (int i = 0; i <= 500; i++) { + if (player.hasPermission("bending.command.presets.create." + i)) cap = i; + } + return cap; + } } diff --git a/src/com/projectkorra/ProjectKorra/Objects/Preset.java b/src/com/projectkorra/ProjectKorra/Objects/Preset.java new file mode 100644 index 00000000..9b6abcda --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Objects/Preset.java @@ -0,0 +1,128 @@ +package com.projectkorra.ProjectKorra.Objects; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +import org.bukkit.entity.Player; + +import com.projectkorra.ProjectKorra.BendingPlayer; +import com.projectkorra.ProjectKorra.DBConnection; +import com.projectkorra.ProjectKorra.Methods; +import com.projectkorra.ProjectKorra.ProjectKorra; + +public class Preset { + + public static ConcurrentHashMap> presets = new ConcurrentHashMap>(); + + UUID uuid; + HashMap abilities; + String name; + + public Preset(UUID uuid, String name, HashMap abilities) { + this.uuid = uuid; + this.name = name; + this.abilities = abilities; + if (!presets.containsKey(uuid)) { + presets.put(uuid, new ArrayList()); + } + presets.get(uuid).add(this); + } + + public static void loadPresets(Player player) { + UUID uuid = player.getUniqueId(); + if (uuid == null) return; + ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_presets WHERE uuid = '" + uuid.toString() + "'"); + try { + if (rs2.next()) { // Presets exist. + int i = 0; + do { + HashMap moves = new HashMap(); + for (int total = 1; total <= 9; total++) { + String slot = rs2.getString("slot" + total); + if (slot != null) moves.put(total, slot); + } + new Preset(uuid, rs2.getString("name"), moves); + i++; + } while (rs2.next()); + ProjectKorra.log.info("Loaded " + i + " presets for " + player.getName()); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + + public static void bindPreset(Player player, String name) { + BendingPlayer bPlayer = Methods.getBendingPlayer(player.getName()); + if (bPlayer == null) return; + if (!presets.containsKey(player.getUniqueId())) return; + for (Preset preset: presets.get(player.getUniqueId())) { + if (preset.name.equalsIgnoreCase(name)) { // We found it + bPlayer.setAbilities(preset.abilities); + } + } + } + + public static boolean presetExists(Player player, String name) { + if (!presets.containsKey(player.getUniqueId())) return false; + boolean exists = false; + for (Preset preset: presets.get(player.getUniqueId())) { + if (preset.name.equalsIgnoreCase(name)) exists = true; + } + return exists; + } + + public static Preset getPreset(Player player, String name) { + if (!presets.containsKey(player.getUniqueId())) return null; + for (Preset preset: presets.get(player.getUniqueId())) { + if (preset.name.equalsIgnoreCase(name)) return preset; + } + return null; + } + + public void delete() { + ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_presets WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); + try { + if (rs2.next()) { + DBConnection.sql.modifyQuery("DELETE FROM pk_presets WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + presets.remove(uuid); + } + + public String getName() { + return this.name; + } + + public void save() { + ResultSet rs2 = DBConnection.sql.readQuery("SELECT * FROM pk_presets WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); + try { + if (!rs2.next()) { // Preset doesn't already exists. + DBConnection.sql.modifyQuery("INSERT INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')"); + } + } catch (SQLException ex) { + ex.printStackTrace(); + } + + /* + * Now we know the preset exists in the SQL table, so we can manipulate it normally. + */ + + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot1 = '" + abilities.get(1) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot2 = '" + abilities.get(2) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot3 = '" + abilities.get(3) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot4 = '" + abilities.get(4) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot5 = '" + abilities.get(5) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot6 = '" + abilities.get(6) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot7 = '" + abilities.get(7) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot8 = '" + abilities.get(8) + "'"); + DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot9 = '" + abilities.get(9) + "'"); + } + +} diff --git a/src/com/projectkorra/ProjectKorra/PKListener.java b/src/com/projectkorra/ProjectKorra/PKListener.java index 8f11ed4d..89d9edcd 100644 --- a/src/com/projectkorra/ProjectKorra/PKListener.java +++ b/src/com/projectkorra/ProjectKorra/PKListener.java @@ -61,6 +61,7 @@ import org.bukkit.util.Vector; import com.projectkorra.ProjectKorra.Ability.AvatarState; import com.projectkorra.ProjectKorra.CustomEvents.PlayerGrappleEvent; +import com.projectkorra.ProjectKorra.Objects.Preset; import com.projectkorra.ProjectKorra.Utilities.GrapplingHookAPI; import com.projectkorra.ProjectKorra.airbending.AirBlast; import com.projectkorra.ProjectKorra.airbending.AirBubble; @@ -282,8 +283,9 @@ public class PKListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent e) { - Methods.createBendingPlayer(e.getPlayer().getUniqueId(), e.getPlayer().getName()); Player player = e.getPlayer(); + Methods.createBendingPlayer(e.getPlayer().getUniqueId(), player.getName()); + Preset.loadPresets(player); String append = ""; boolean chatEnabled = ProjectKorra.plugin.getConfig().getBoolean("Properties.Chat.Enable"); if ((player.hasPermission("bending.avatar") || Methods.getBendingPlayer(player.getName()).elements.size() > 1) && chatEnabled) { diff --git a/src/com/projectkorra/ProjectKorra/ProjectKorra.java b/src/com/projectkorra/ProjectKorra/ProjectKorra.java index 29b14677..50d74584 100644 --- a/src/com/projectkorra/ProjectKorra/ProjectKorra.java +++ b/src/com/projectkorra/ProjectKorra/ProjectKorra.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import com.projectkorra.ProjectKorra.Ability.AbilityModuleManager; +import com.projectkorra.ProjectKorra.Objects.Preset; import com.projectkorra.ProjectKorra.Utilities.CraftingRecipes; import com.projectkorra.ProjectKorra.airbending.AirbendingManager; import com.projectkorra.ProjectKorra.chiblocking.ChiblockingManager; @@ -49,6 +50,7 @@ public class ProjectKorra extends JavaPlugin { DBConnection.init(); for (Player player: Bukkit.getOnlinePlayers()) { Methods.createBendingPlayer(player.getUniqueId(), player.getName()); + Preset.loadPresets(player); } getServer().getPluginManager().registerEvents(new PKListener(this), this); getServer().getPluginManager().registerEvents(new TagAPIListener(this), this); diff --git a/src/plugin.yml b/src/plugin.yml index fe1396f2..c8b4f66b 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -36,6 +36,11 @@ permissions: bending.command.help: true bending.command.clear: true bending.command.who: true + bending.command.preset.list: true + bending.command.preset.create.2: true + bending.command.preset.create: true + bending.command.preset.bind: true + bending.command.preset.delete: true bending.air: true bending.water: true bending.earth: true