diff --git a/src/com/projectkorra/projectkorra/command/AddCommand.java b/src/com/projectkorra/projectkorra/command/AddCommand.java index 7134055a..66377496 100644 --- a/src/com/projectkorra/projectkorra/command/AddCommand.java +++ b/src/com/projectkorra/projectkorra/command/AddCommand.java @@ -78,6 +78,7 @@ public class AddCommand extends PKCommand { sender.sendMessage(ChatColor.DARK_AQUA + target.getName() + color + " is also an " + Character.toString(element.charAt(0)).toUpperCase() + element.substring(1) + "bender."); } } + GeneralMethods.saveElements(bPlayer); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, type, Result.ADD)); return; } else { diff --git a/src/com/projectkorra/projectkorra/command/PresetCommand.java b/src/com/projectkorra/projectkorra/command/PresetCommand.java index 10b9c22e..7688e05d 100644 --- a/src/com/projectkorra/projectkorra/command/PresetCommand.java +++ b/src/com/projectkorra/projectkorra/command/PresetCommand.java @@ -78,9 +78,11 @@ public class PresetCommand extends PKCommand { sender.sendMessage(ChatColor.RED + "You don't have a preset with that name."); return; } - - Preset.bindPreset(player, name); + boolean boundAll = Preset.bindPreset(player, name); sender.sendMessage(ChatColor.GREEN + "Your bound slots have been set to match the " + ChatColor.YELLOW + name + ChatColor.GREEN + " preset."); + if (!boundAll) { + sender.sendMessage(ChatColor.RED + "Some abilities were not bound because you cannot bend the required element."); + } return; } else if (Arrays.asList(createaliases).contains(args.get(0)) && hasPermission(sender, "create")) { //bending preset create name int limit = GeneralMethods.getMaxPresets(player); diff --git a/src/com/projectkorra/projectkorra/command/WhoCommand.java b/src/com/projectkorra/projectkorra/command/WhoCommand.java index 67d6aece..ef2da3f5 100644 --- a/src/com/projectkorra/projectkorra/command/WhoCommand.java +++ b/src/com/projectkorra/projectkorra/command/WhoCommand.java @@ -217,17 +217,20 @@ public class WhoCommand extends PKCommand { String element = rs2.getString("element"); messages.add(playerName + " - "); - if (element.contains("a")) - messages.add(AirMethods.getAirColor() + "- Airbender"); - if (element.contains("w")) - messages.add(WaterMethods.getWaterColor() + "- Waterbender"); - if (element.contains("e")) - messages.add(EarthMethods.getEarthColor() + "- Earthbender"); - if (element.contains("f")) - messages.add(FireMethods.getFireColor() + "- Firebender"); - if (element.contains("c")) - messages.add(ChiMethods.getChiColor() + "- Chiblocker"); - + if (element == null) { + messages.add(" - Nonbender"); + } else { + if (element.contains("a")) + messages.add(AirMethods.getAirColor() + "- Airbender"); + if (element.contains("w")) + messages.add(WaterMethods.getWaterColor() + "- Waterbender"); + if (element.contains("e")) + messages.add(EarthMethods.getEarthColor() + "- Earthbender"); + if (element.contains("f")) + messages.add(FireMethods.getFireColor() + "- Firebender"); + if (element.contains("c")) + messages.add(ChiMethods.getChiColor() + "- Chiblocker"); + } if (GeneralMethods.hasRPG()) { if (RPGMethods.isCurrentAvatar(uuid)) { messages.add(GeneralMethods.getAvatarColor() + "Current Avatar"); diff --git a/src/com/projectkorra/projectkorra/object/Preset.java b/src/com/projectkorra/projectkorra/object/Preset.java index 7c54e074..e2db9d0e 100644 --- a/src/com/projectkorra/projectkorra/object/Preset.java +++ b/src/com/projectkorra/projectkorra/object/Preset.java @@ -8,6 +8,7 @@ import com.projectkorra.projectkorra.storage.DBConnection; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; @@ -29,6 +30,12 @@ public class Preset { * presets}, keyed to their UUID */ public static ConcurrentHashMap> presets = new ConcurrentHashMap>(); + static String loadQuery = "SELECT * FROM pk_presets WHERE uuid = ?"; + static String loadNameQuery = "SELECT * FROM pk_presets WHERE uuid = ? AND name = ?"; + static String deleteQuery = "DELETE FROM pk_presets WHERE uuid = ? AND name = ?"; + static String insertQuery = "INSERT INTO pk_presets (uuid, name) VALUES (?, ?)"; + static String updateQuery1 = "UPDATE pk_presets SET slot"; + static String updateQuery2 = " = ? WHERE uuid = ? AND name = ?"; UUID uuid; HashMap abilities; @@ -74,21 +81,23 @@ public class Preset { 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. + PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(loadQuery); + ps.setString(1, uuid.toString()); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { // Presets exist. int i = 0; do { HashMap moves = new HashMap(); for (int total = 1; total <= 9; total++) { - String slot = rs2.getString("slot" + total); + String slot = rs.getString("slot" + total); if (slot != null) moves.put(total, slot); } - new Preset(uuid, rs2.getString("name"), moves); + new Preset(uuid, rs.getString("name"), moves); i++; } - while (rs2.next()); + while (rs.next()); ProjectKorra.log.info("Loaded " + i + " presets for " + player.getName()); } } @@ -104,19 +113,33 @@ public class Preset { * * @param player The Player the Preset should be bound for * @param name The name of the Preset that should be bound + * @return True if all abilities were successfully bound, or false otherwise */ @SuppressWarnings("unchecked") - public static void bindPreset(Player player, String name) { + public static boolean bindPreset(Player player, String name) { BendingPlayer bPlayer = GeneralMethods.getBendingPlayer(player.getName()); if (bPlayer == null) - return; + return false; if (!presets.containsKey(player.getUniqueId())) - return; + return false; + HashMap abilities = null; for (Preset preset : presets.get(player.getUniqueId())) { if (preset.name.equalsIgnoreCase(name)) { // We found it - bPlayer.setAbilities((HashMap) preset.abilities.clone()); + abilities = (HashMap) preset.abilities.clone(); } } + if (abilities == null) { + + } + boolean boundAll = true; + for (int i = 1; i <= 9; i++) { + if (!GeneralMethods.canBend(player.getName(), abilities.get(i))) { + abilities.remove(i); + boundAll = false; + } + } + bPlayer.setAbilities(abilities); + return boundAll; } /** @@ -177,8 +200,16 @@ public class Preset { * Deletes the Preset from the database. */ public void delete() { - DBConnection.sql.modifyQuery("DELETE FROM pk_presets WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); - presets.get(uuid).remove(this); + try { + PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(deleteQuery); + ps.setString(1, uuid.toString()); + ps.setString(2, name); + ps.execute(); + presets.get(uuid).remove(this); + } + catch (SQLException e) { + e.printStackTrace(); + } } /** @@ -194,26 +225,39 @@ public class Preset { * Saves the Preset to the database. */ public void save() { - if (ProjectKorra.plugin.getConfig().getString("Storage.engine").equalsIgnoreCase("mysql")) { - DBConnection.sql.modifyQuery("INSERT INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "') " + "ON DUPLICATE KEY UPDATE name=VALUES(name)"); - } else { - // DBConnection.sql.modifyQuery("INSERT OR IGNORE INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')"); - // DBConnection.sql.modifyQuery("UPDATE pk_presets SET uuid = '" + uuid.toString() + "', name = '" + name + "'"); - DBConnection.sql.modifyQuery("INSERT OR REPLACE INTO pk_presets (uuid, name) VALUES ('" + uuid.toString() + "', '" + name + "')"); - } - - /* - * Now we know the preset exists in the SQL table, so we can manipulate - * it normally. - */ - new BukkitRunnable() { - @Override - public void run() { - for (Integer i : abilities.keySet()) { - DBConnection.sql.modifyQuery("UPDATE pk_presets SET slot" + i + " = '" + abilities.get(i) + "' WHERE uuid = '" + uuid.toString() + "' AND name = '" + name + "'"); - } + try { + PreparedStatement ps = DBConnection.sql.getConnection().prepareStatement(loadNameQuery); + ps.setString(1, uuid.toString()); + ps.setString(2, name); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { //if the preset doesn't exist in the DB, create it + ps = DBConnection.sql.getConnection().prepareStatement(insertQuery); + ps.setString(1, uuid.toString()); + ps.setString(2, name); + ps.execute(); } - }.runTaskAsynchronously(ProjectKorra.plugin); - } + } + catch (SQLException e) { + e.printStackTrace(); + } + for (Integer i : abilities.keySet()) { + new BukkitRunnable() { + PreparedStatement ps; + @Override + public void run() { + try { + ps = DBConnection.sql.getConnection().prepareStatement(updateQuery1 + i + updateQuery2); + ps.setString(1, abilities.get(i)); + ps.setString(2, uuid.toString()); + ps.setString(3, name); + ps.execute(); + } + catch (SQLException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(ProjectKorra.plugin); + } + } } diff --git a/src/com/projectkorra/projectkorra/storage/DBConnection.java b/src/com/projectkorra/projectkorra/storage/DBConnection.java index 74580b71..ca4ef2b1 100644 --- a/src/com/projectkorra/projectkorra/storage/DBConnection.java +++ b/src/com/projectkorra/projectkorra/storage/DBConnection.java @@ -28,13 +28,13 @@ public class DBConnection { if (!sql.tableExists("pk_players")) { ProjectKorra.log.info("Creating pk_players table"); - String query = "CREATE TABLE `pk_players` (" + "`id` int(32) NOT NULL AUTO_INCREMENT," + "`uuid` varchar(255)," + "`player` varchar(255)," + "`element` varchar(255)," + "`permaremoved` varchar(5)," + "`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));"; + String query = "CREATE TABLE `pk_players` (" + "`uuid` varchar(36) NOT NULL," + "`player` varchar(16) NOT NULL," + "`element` varchar(5)," + "`permaremoved` varchar(5)," + "`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 (uuid));"; 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));"; + String query = "CREATE TABLE `pk_presets` (" + "`uuid` varchar(36) NOT NULL," + "`name` varchar(255) NOT NULL," + "`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 (uuid, name));"; sql.modifyQuery(query); } } else { @@ -48,13 +48,13 @@ public class DBConnection { isOpen = true; if (!sql.tableExists("pk_players")) { ProjectKorra.log.info("Creating pk_players table."); - String query = "CREATE TABLE `pk_players` (" + "`id` INTEGER PRIMARY KEY," + "`uuid` TEXT(255)," + "`player` TEXT(255)," + "`element` TEXT(255)," + "`permaremoved` TEXT(5)," + "`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));"; + String query = "CREATE TABLE `pk_players` (" + "`uuid` TEXT(36) PRIMARY KEY," + "`player` TEXT(16)," + "`element` TEXT(255)," + "`permaremoved` TEXT(5)," + "`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); } 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));"; + String query = "CREATE TABLE `pk_presets` (" + "`uuid` TEXT(36)," + "`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)," + "PRIMARY KEY (uuid, name));"; sql.modifyQuery(query); } }