diff --git a/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java b/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java index c76ec8469..10fdebe7f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java @@ -48,12 +48,13 @@ public class PlayerProfile { private boolean abilityuse = true; /* Timestamps */ - private int xpGainATS = 0; - private int recentlyHurt = 0; + private int xpGainATS; + private int recentlyHurt; + private int respawnATS; /* mySQL STUFF */ - private int lastlogin = 0; - private int userid = 0; + private int lastlogin; + private int userid; HashMap skills = new HashMap(); //Skills and Levels HashMap skillsXp = new HashMap(); //Skills and XP @@ -68,6 +69,7 @@ public class PlayerProfile { hud = SpoutConfig.getInstance().defaulthud; this.player = player; this.playerName = player.getName(); + lastlogin = ((Long) (System.currentTimeMillis() / 1000)).intValue(); party = PartyManager.getInstance().getPlayerParty(playerName); @@ -92,8 +94,6 @@ public class PlayerProfile { addPlayer(); loaded = true; } - - lastlogin = ((Long) (System.currentTimeMillis() / 1000)).intValue(); } public Player getPlayer() { @@ -913,6 +913,18 @@ public class PlayerProfile { } } + /* + * Exploit Prevention + */ + + public int getRespawnATS() { + return respawnATS; + } + + public void ActualizeRespawnATS() { + respawnATS = (int) (System.currentTimeMillis() / 1000); + } + /* * XP Functions */ diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index 004222d37..46270fffd 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -19,6 +19,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; import com.gmail.nossr50.mcMMO; @@ -123,7 +124,7 @@ public class PlayerListener implements Listener { */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerLogin(PlayerLoginEvent event) { - Users.addUser(event.getPlayer()); + Users.addUser(event.getPlayer()).ActualizeRespawnATS(); } /** @@ -192,8 +193,11 @@ public class PlayerListener implements Listener { if (XprateCommand.xpevent) { player.sendMessage(LocaleLoader.getString("XPRate.Event", new Object[] {Config.getInstance().xpGainMultiplier})); } + } - + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerRespawn(PlayerRespawnEvent event) { + Users.getProfile(event.getPlayer()).ActualizeRespawnATS(); } /** diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java index e23de2aae..c3f29d4a1 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -58,7 +58,10 @@ public class AcrobaticsManager { if (Acrobatics.getRandom().nextInt(4000) <= eventHandler.skillModifier && !eventHandler.isFatal(eventHandler.modifiedDamage)) { eventHandler.modifyEventDamage(); eventHandler.sendAbilityMessage(); - eventHandler.processXPGain(eventHandler.damage * Acrobatics.DODGE_XP_MODIFIER); + + if (System.currentTimeMillis() >= profile.getRespawnATS() + 5) { + eventHandler.processXPGain(eventHandler.damage * Acrobatics.DODGE_XP_MODIFIER); + } } } diff --git a/src/main/java/com/gmail/nossr50/util/Combat.java b/src/main/java/com/gmail/nossr50/util/Combat.java index 3b6c57d96..d580151a5 100644 --- a/src/main/java/com/gmail/nossr50/util/Combat.java +++ b/src/main/java/com/gmail/nossr50/util/Combat.java @@ -462,7 +462,7 @@ public class Combat { Player defender = (Player) target; - if (defender.getHealth() >= 1) { + if (System.currentTimeMillis() >= Users.getProfile(defender).getRespawnATS() + 5) { baseXP = 20 * configInstance.getPlayerVersusPlayerXP(); } } diff --git a/src/main/java/com/gmail/nossr50/util/Users.java b/src/main/java/com/gmail/nossr50/util/Users.java index 693a53c2c..c043b944e 100644 --- a/src/main/java/com/gmail/nossr50/util/Users.java +++ b/src/main/java/com/gmail/nossr50/util/Users.java @@ -40,8 +40,9 @@ public class Users { * Add a new user. * * @param player The player to create a user record for + * @return the player's profile */ - public static void addUser(Player player) { + public static PlayerProfile addUser(Player player) { String playerName = player.getName(); for (Iterator it = profiles.iterator() ; it.hasNext() ; ) { @@ -50,12 +51,15 @@ public class Users { if (playerProfile.getPlayerName().equals(playerName)) { //The player object is different on each reconnection and must be updated playerProfile.setPlayer(player); - return; + return playerProfile; } } //New player, or already removed from the list - profiles.add(new PlayerProfile(player, true)); + PlayerProfile playerProfile = new PlayerProfile(player, true); + + profiles.add(playerProfile); + return playerProfile; } /**