From 1d509259fbf246d9d18f771ae4f1dee7d8fff895 Mon Sep 17 00:00:00 2001 From: Simp Date: Thu, 19 Mar 2020 16:04:36 -0400 Subject: [PATCH] fixes - Make sure to match the type of the result of Attribute Modification is the same as the old value, otherwise it errors - Change where calls to save players are made. Now they only happen on the plugin disable, when a player leaves, and when a player is kicked. - --- .../projectkorra/BendingPlayer.java | 8 +-- .../projectkorra/GeneralMethods.java | 35 +++++++----- .../projectkorra/projectkorra/PKListener.java | 53 +++++++++++++++++-- .../projectkorra/ProjectKorra.java | 7 ++- .../attribute/AttributeModifier.java | 15 +++++- .../projectkorra/command/AddCommand.java | 5 -- .../projectkorra/command/BindCommand.java | 6 ++- .../projectkorra/command/ChooseCommand.java | 3 -- .../command/PermaremoveCommand.java | 3 -- .../projectkorra/command/RemoveCommand.java | 19 ++----- 10 files changed, 103 insertions(+), 51 deletions(-) diff --git a/src/com/projectkorra/projectkorra/BendingPlayer.java b/src/com/projectkorra/projectkorra/BendingPlayer.java index ce1aed51..b6dc0ff9 100644 --- a/src/com/projectkorra/projectkorra/BendingPlayer.java +++ b/src/com/projectkorra/projectkorra/BendingPlayer.java @@ -828,12 +828,8 @@ public class BendingPlayer { * * @param abilities The abilities to set/save */ - public void setAbilities(final HashMap abilities) { - this.abilities = abilities; - - for (int i = 1; i <= 9; i++) { - DBConnection.sql.modifyQuery("UPDATE pk_players SET slot" + i + " = '" + abilities.get(i) + "' WHERE uuid = '" + this.uuid + "'"); - } + public void setAbilities(final Map abilities) { + this.abilities = new HashMap<>(abilities); } /** diff --git a/src/com/projectkorra/projectkorra/GeneralMethods.java b/src/com/projectkorra/projectkorra/GeneralMethods.java index d16fa96d..c7a7faba 100644 --- a/src/com/projectkorra/projectkorra/GeneralMethods.java +++ b/src/com/projectkorra/projectkorra/GeneralMethods.java @@ -200,24 +200,26 @@ public class GeneralMethods { * @param slot * @see #bindAbility(Player, String) */ - public static void bindAbility(final Player player, final String ability, final int slot) { + public static boolean bindAbility(final Player player, final String ability, final int slot) { if (MultiAbilityManager.playerAbilities.containsKey(player)) { GeneralMethods.sendBrandingMessage(player, ChatColor.RED + "You can't edit your binds right now!"); - return; + return false; } + final PlayerBindChangeEvent event = new PlayerBindChangeEvent(player, ability, slot, true); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } + final BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player.getName()); - final CoreAbility coreAbil = CoreAbility.getAbility(ability); if (bPlayer == null) { - return; + return true; } + bPlayer.getAbilities().put(slot, ability); - - if (coreAbil != null) { - GeneralMethods.sendBrandingMessage(player, coreAbil.getElement().getColor() + ConfigManager.languageConfig.get().getString("Commands.Bind.SuccessfullyBound").replace("{ability}", ability).replace("{slot}", String.valueOf(slot))); - } - saveAbility(bPlayer, slot, ability); + return true; } /** @@ -2024,11 +2026,6 @@ public class GeneralMethods { } final String uuid = bPlayer.getUUIDString(); - final PlayerBindChangeEvent event = new PlayerBindChangeEvent(Bukkit.getPlayer(UUID.fromString(uuid)), ability, slot, false); - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } // Temp code to block modifications of binds, Should be replaced when bind event is added. if (MultiAbilityManager.playerAbilities.containsKey(Bukkit.getPlayer(bPlayer.getUUID()))) { return; @@ -2144,6 +2141,16 @@ public class GeneralMethods { final boolean permaRemoved = bPlayer.isPermaRemoved(); DBConnection.sql.modifyQuery("UPDATE pk_players SET permaremoved = '" + (permaRemoved ? "true" : "false") + "' WHERE uuid = '" + uuid + "'"); } + + public static void savePlayer(final BendingPlayer bPlayer) { + for (int slot : bPlayer.getAbilities().keySet()) { + saveAbility(bPlayer, slot, bPlayer.getAbilities().get(slot)); + } + + saveElements(bPlayer); + saveSubElements(bPlayer); + savePermaRemoved(bPlayer); + } public static void setVelocity(final Entity entity, final Vector velocity) { if (entity instanceof TNTPrimed) { diff --git a/src/com/projectkorra/projectkorra/PKListener.java b/src/com/projectkorra/projectkorra/PKListener.java index 648046b6..bd333621 100644 --- a/src/com/projectkorra/projectkorra/PKListener.java +++ b/src/com/projectkorra/projectkorra/PKListener.java @@ -7,8 +7,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import co.aikar.timings.lib.MCTiming; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; @@ -191,6 +189,8 @@ import com.projectkorra.projectkorra.waterbending.multiabilities.WaterArms; import com.projectkorra.projectkorra.waterbending.passive.FastSwim; import com.projectkorra.projectkorra.waterbending.passive.HydroSink; +import co.aikar.timings.lib.MCTiming; + public class PKListener implements Listener { ProjectKorra plugin; @@ -1221,7 +1221,52 @@ public class PKListener implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerKick(final PlayerKickEvent event) { - JUMPS.remove(event.getPlayer()); + final Player player = event.getPlayer(); + final BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player); + + if (ProjectKorra.isStatisticsEnabled()) { + Manager.getManager(StatisticsManager.class).store(player.getUniqueId()); + } + + if (bPlayer != null) { + GeneralMethods.savePlayer(bPlayer); + if (ProjectKorra.isDatabaseCooldownsEnabled()) { + bPlayer.saveCooldowns(); + } + + if (TOGGLED_OUT.contains(player.getUniqueId()) && bPlayer.isToggled()) { + TOGGLED_OUT.remove(player.getUniqueId()); + } + + if (!bPlayer.isToggled()) { + TOGGLED_OUT.add(player.getUniqueId()); + } + } + + if (Commands.invincible.contains(player.getName())) { + Commands.invincible.remove(player.getName()); + } + + Preset.unloadPreset(player); + + if (TempArmor.hasTempArmor(player)) { + for (final TempArmor armor : TempArmor.getTempArmorList(player)) { + armor.revert(); + } + } + + if (MetalClips.isControlled(event.getPlayer())) { + MetalClips.removeControlledEnitity(event.getPlayer()); + } + + MultiAbilityManager.remove(player); + JUMPS.remove(player); + + for (final CoreAbility ca : CoreAbility.getAbilities()) { + if (CoreAbility.getAbility(event.getPlayer(), ca.getClass()) != null) { + CoreAbility.getAbility(event.getPlayer(), ca.getClass()).remove(); + } + } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -1333,7 +1378,9 @@ public class PKListener implements Listener { if (ProjectKorra.isStatisticsEnabled()) { Manager.getManager(StatisticsManager.class).store(player.getUniqueId()); } + if (bPlayer != null) { + GeneralMethods.savePlayer(bPlayer); if (ProjectKorra.isDatabaseCooldownsEnabled()) { bPlayer.saveCooldowns(); } diff --git a/src/com/projectkorra/projectkorra/ProjectKorra.java b/src/com/projectkorra/projectkorra/ProjectKorra.java index 4ddfe988..e5343a0d 100644 --- a/src/com/projectkorra/projectkorra/ProjectKorra.java +++ b/src/com/projectkorra/projectkorra/ProjectKorra.java @@ -162,7 +162,12 @@ public class ProjectKorra extends JavaPlugin { Manager.getManager(StatisticsManager.class).save(player.getUniqueId(), false); } final BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player); - if (bPlayer != null && isDatabaseCooldownsEnabled()) { + if (bPlayer == null) { + continue; + } + + GeneralMethods.savePlayer(bPlayer); + if (isDatabaseCooldownsEnabled()) { bPlayer.saveCooldowns(); } } diff --git a/src/com/projectkorra/projectkorra/attribute/AttributeModifier.java b/src/com/projectkorra/projectkorra/attribute/AttributeModifier.java index d865988b..e52ca216 100644 --- a/src/com/projectkorra/projectkorra/attribute/AttributeModifier.java +++ b/src/com/projectkorra/projectkorra/attribute/AttributeModifier.java @@ -62,7 +62,20 @@ public enum AttributeModifier { if (this == DIVISION && modifier.doubleValue() == 0) { throw new IllegalArgumentException("Attribute modifier for DIVISION cannot be zero!"); } - return this.modifier.performModification(oldValue, modifier); + + Number result = this.modifier.performModification(oldValue, modifier); + + if (oldValue instanceof Double) { + return result.doubleValue(); + } else if (oldValue instanceof Float) { + return result.floatValue(); + } else if (oldValue instanceof Long) { + return result.longValue(); + } else if (oldValue instanceof Integer) { + return result.intValue(); + } + + return result; } /** diff --git a/src/com/projectkorra/projectkorra/command/AddCommand.java b/src/com/projectkorra/projectkorra/command/AddCommand.java index edd03fe3..a11f2975 100644 --- a/src/com/projectkorra/projectkorra/command/AddCommand.java +++ b/src/com/projectkorra/projectkorra/command/AddCommand.java @@ -118,8 +118,6 @@ public class AddCommand extends PKCommand { } } - GeneralMethods.saveElements(bPlayer); - GeneralMethods.saveSubElements(bPlayer); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, e, Result.ADD)); } } @@ -192,8 +190,6 @@ public class AddCommand extends PKCommand { } } - GeneralMethods.saveElements(bPlayer); - GeneralMethods.saveSubElements(bPlayer); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, e, Result.ADD)); return; @@ -225,7 +221,6 @@ public class AddCommand extends PKCommand { GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", sub.getName() + sub.getType().getBender())); } } - GeneralMethods.saveSubElements(bPlayer); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeSubElementEvent(sender, target, sub, com.projectkorra.projectkorra.event.PlayerChangeSubElementEvent.Result.ADD)); return; diff --git a/src/com/projectkorra/projectkorra/command/BindCommand.java b/src/com/projectkorra/projectkorra/command/BindCommand.java index 980d2284..dc830c31 100644 --- a/src/com/projectkorra/projectkorra/command/BindCommand.java +++ b/src/com/projectkorra/projectkorra/command/BindCommand.java @@ -109,7 +109,11 @@ public class BindCommand extends PKCommand { } final String name = coreAbil != null ? coreAbil.getName() : null; - GeneralMethods.bindAbility((Player) sender, name, slot); + if (GeneralMethods.bindAbility((Player) sender, name, slot)) { + GeneralMethods.sendBrandingMessage(sender, coreAbil.getElement().getColor() + ConfigManager.languageConfig.get().getString("Commands.Bind.SuccessfullyBound").replace("{ability}", ability).replace("{slot}", String.valueOf(slot))); + } else { + GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + "Unable to bind ability!"); + } } @Override diff --git a/src/com/projectkorra/projectkorra/command/ChooseCommand.java b/src/com/projectkorra/projectkorra/command/ChooseCommand.java index feee50ef..9bd77ac6 100644 --- a/src/com/projectkorra/projectkorra/command/ChooseCommand.java +++ b/src/com/projectkorra/projectkorra/command/ChooseCommand.java @@ -169,7 +169,6 @@ public class ChooseCommand extends PKCommand { } else { GeneralMethods.sendBrandingMessage(target, color + this.chosenCFW.replace("{element}", sub.getName() + sub.getType().getBender())); } - GeneralMethods.saveSubElements(bPlayer); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeSubElementEvent(sender, target, sub, com.projectkorra.projectkorra.event.PlayerChangeSubElementEvent.Result.CHOOSE)); } else { bPlayer.setElement(element); @@ -194,8 +193,6 @@ public class ChooseCommand extends PKCommand { GeneralMethods.sendBrandingMessage(target, color + this.chosenAE.replace("{element}", element.getName() + element.getType().getBender())); } } - GeneralMethods.saveElements(bPlayer); - GeneralMethods.saveSubElements(bPlayer); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, target, element, Result.CHOOSE)); } diff --git a/src/com/projectkorra/projectkorra/command/PermaremoveCommand.java b/src/com/projectkorra/projectkorra/command/PermaremoveCommand.java index aadd9d92..c154fc6e 100644 --- a/src/com/projectkorra/projectkorra/command/PermaremoveCommand.java +++ b/src/com/projectkorra/projectkorra/command/PermaremoveCommand.java @@ -69,16 +69,13 @@ public class PermaremoveCommand extends PKCommand { if (bPlayer.isPermaRemoved()) { bPlayer.setPermaRemoved(false); - GeneralMethods.savePermaRemoved(bPlayer); GeneralMethods.sendBrandingMessage(player, ChatColor.GREEN + this.restored); if (!(sender instanceof Player) || !sender.getName().equalsIgnoreCase(target)) { GeneralMethods.sendBrandingMessage(sender, ChatColor.GREEN + this.restoredConfirm.replace("{target}", ChatColor.DARK_AQUA + player.getName() + ChatColor.GREEN)); } } else { bPlayer.getElements().clear(); - GeneralMethods.saveElements(bPlayer); bPlayer.setPermaRemoved(true); - GeneralMethods.savePermaRemoved(bPlayer); GeneralMethods.removeUnusableAbilities(player.getName()); GeneralMethods.sendBrandingMessage(player, ChatColor.RED + this.removed); if (!(sender instanceof Player) || !sender.getName().equalsIgnoreCase(target)) { diff --git a/src/com/projectkorra/projectkorra/command/RemoveCommand.java b/src/com/projectkorra/projectkorra/command/RemoveCommand.java index cd867a16..9fd1b5ac 100644 --- a/src/com/projectkorra/projectkorra/command/RemoveCommand.java +++ b/src/com/projectkorra/projectkorra/command/RemoveCommand.java @@ -55,13 +55,13 @@ public class RemoveCommand extends PKCommand { if (e instanceof SubElement) { if (senderBPlayer.hasElement(e)) { senderBPlayer.getSubElements().remove(e); - GeneralMethods.saveSubElements(senderBPlayer); GeneralMethods.removeUnusableAbilities(sender.getName()); GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementSelf.replace("{element}", e.getName() + e.getType().getBending()).replace("{sender}", ChatColor.DARK_AQUA + sender.getName() + e.getColor())); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeSubElementEvent(sender, player, (SubElement) e, com.projectkorra.projectkorra.event.PlayerChangeSubElementEvent.Result.REMOVE)); } else { GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + this.wrongElementSelf); } + return; } else if (e instanceof Element) { if (senderBPlayer.hasElement(e)) { @@ -69,8 +69,6 @@ public class RemoveCommand extends PKCommand { for (final SubElement sub : Element.getSubElements(e)) { senderBPlayer.getSubElements().remove(sub); } - GeneralMethods.saveElements(senderBPlayer); - GeneralMethods.saveSubElements(senderBPlayer); GeneralMethods.removeUnusableAbilities(sender.getName()); GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementSelf.replace("{element}", e.getName() + e.getType().getBending())); @@ -79,16 +77,14 @@ public class RemoveCommand extends PKCommand { } else { GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + this.wrongElementSelf); } - { - return; - } + + return; } } else { GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + this.invalidElement); } - { - return; - } + + return; } GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + this.playerOffline); return; @@ -112,14 +108,11 @@ public class RemoveCommand extends PKCommand { } if (e instanceof SubElement) { bPlayer.getSubElements().remove(e); - GeneralMethods.saveSubElements(bPlayer); } else { bPlayer.getElements().remove(e); for (final SubElement sub : Element.getSubElements(e)) { bPlayer.getSubElements().remove(sub); } - GeneralMethods.saveElements(bPlayer); - GeneralMethods.saveSubElements(bPlayer); } GeneralMethods.removeUnusableAbilities(player.getName()); @@ -131,8 +124,6 @@ public class RemoveCommand extends PKCommand { } else if (args.size() == 1) { bPlayer.getElements().clear(); bPlayer.getSubElements().clear(); - GeneralMethods.saveElements(bPlayer); - GeneralMethods.saveSubElements(bPlayer); GeneralMethods.removeUnusableAbilities(player.getName()); if (!player.getName().equalsIgnoreCase(sender.getName())) { GeneralMethods.sendBrandingMessage(sender, ChatColor.YELLOW + this.succesfullyRemovedAllElementsTargetConfirm.replace("{target}", ChatColor.DARK_AQUA + player.getName() + ChatColor.YELLOW));