From 3e0cc358d0e346c904dce216d1731a55f4416d4a Mon Sep 17 00:00:00 2001 From: GJ Date: Mon, 12 Mar 2012 01:45:08 -0400 Subject: [PATCH] Fix for Acrobatics leveling exploit - Fixes MCCORE-74 --- Changelog.txt | 1 + .../com/gmail/nossr50/skills/Acrobatics.java | 176 ++++++++++-------- 2 files changed, 103 insertions(+), 74 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 278212b3e..d4045ef7b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -24,6 +24,7 @@ Version 2.0.00-dev = Fixed bug where Green Terra didn't work on Stone Brick = Fixed bug where Tree Feller could be used without permissions = Fixed exploit where falling sand & gravel weren't tracked + = Fixed exploit where Acrobatics could be leveled via Dodge on party members. ! Changed PTP to prevent teleporting if you've been hurt in the last 30 seconds (configurable) ! Changed Chimera Wing failure check to use the maxWorldHeight. ! Changed inspect failed message to say inspect rather than whois diff --git a/src/main/java/com/gmail/nossr50/skills/Acrobatics.java b/src/main/java/com/gmail/nossr50/skills/Acrobatics.java index 92ce1a822..aca38c0e0 100644 --- a/src/main/java/com/gmail/nossr50/skills/Acrobatics.java +++ b/src/main/java/com/gmail/nossr50/skills/Acrobatics.java @@ -9,81 +9,109 @@ import com.gmail.nossr50.mcPermissions; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.mcLocale; - +import com.gmail.nossr50.party.Party; public class Acrobatics { - public static void acrobaticsCheck(Player player, EntityDamageEvent event) - { - PlayerProfile PP = Users.getProfile(player); - int acrovar = PP.getSkillLevel(SkillType.ACROBATICS); - - if(player.isSneaking()) - acrovar = acrovar * 2; - - if(Math.random() * 1000 <= acrovar) - { - int threshold = 7; - - if(player.isSneaking()) - threshold = 14; - - int newDamage = event.getDamage() - threshold; - - if(newDamage < 0) - newDamage = 0; - - /* - * Check for death - */ - if(player.getHealth() - newDamage >= 1) - { - PP.addXP(SkillType.ACROBATICS, (event.getDamage() * 8)*10, player); - Skills.XpCheckSkill(SkillType.ACROBATICS, player); - event.setDamage(newDamage); - if(event.getDamage() <= 0) - event.setCancelled(true); - if(player.isSneaking()){ - player.sendMessage(mcLocale.getString("Acrobatics.GracefulRoll")); - } else { - player.sendMessage(mcLocale.getString("Acrobatics.Roll")); - } - } - } - else if(player.getHealth() - event.getDamage() >= 1) - { - PP.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*10, player); - Skills.XpCheckSkill(SkillType.ACROBATICS, player); - } + + /** + * Check for fall damage reduction. + * + * @param player The player whose fall damage to modify + * @param event The event to check + */ + public static void acrobaticsCheck(Player player, EntityDamageEvent event) { + final int ROLL_XP_MODIFIER = 80; + final int FALL_XP_MODIFIER = 120; + + PlayerProfile PP = Users.getProfile(player); + int acrovar = PP.getSkillLevel(SkillType.ACROBATICS); + boolean gracefulRoll = player.isSneaking(); + int damage = event.getDamage(); + + if (gracefulRoll) { + acrovar = acrovar * 2; + } + + if (acrovar > 1000 || Math.random() * 1000 <= acrovar) { + int threshold = 7; + + if (gracefulRoll) { + threshold = threshold * 2; + } + + int newDamage = damage - threshold; + + if (newDamage < 0) { + newDamage = 0; + } + + /* Check for death */ + if (player.getHealth() - damage >= 1) { + PP.addXP(SkillType.ACROBATICS, damage * ROLL_XP_MODIFIER, player); + Skills.XpCheckSkill(SkillType.ACROBATICS, player); + + event.setDamage(newDamage); + + if (event.getDamage() <= 0) { + event.setCancelled(true); + } + + if (gracefulRoll) { + player.sendMessage(mcLocale.getString("Acrobatics.GracefulRoll")); + } + else { + player.sendMessage(mcLocale.getString("Acrobatics.Roll")); + } + } + } + else if (player.getHealth() - damage >= 1) { + PP.addXP(SkillType.ACROBATICS, event.getDamage() * FALL_XP_MODIFIER, player); + Skills.XpCheckSkill(SkillType.ACROBATICS, player); + } + } + + /** + * Check for dodge damage reduction. + * + * @param event The event to check + */ + public static void dodgeChecks(EntityDamageByEntityEvent event) { + final int DODGE_MODIFIER = 120; + + Player attacker = (Player) event.getDamager(); + Player defender = (Player) event.getEntity(); + PlayerProfile PPd = Users.getProfile(defender); + + /* PARTY CHECK */ + if (Party.getInstance().inSameParty(defender, attacker)) { + return; + } + + if (mcPermissions.getInstance().acrobatics(defender)) { + int skillCheck = 0; + + if (PPd.getSkillLevel(SkillType.ACROBATICS) <= 800) { + skillCheck = PPd.getSkillLevel(SkillType.ACROBATICS); + } + else { + skillCheck = 800; + } + + if (Math.random() * 4000 <= skillCheck) { + defender.sendMessage(mcLocale.getString("Acrobatics.Dodge")); + + if (System.currentTimeMillis() >= 5000 + PPd.getRespawnATS() && defender.getHealth() >= 1) { + PPd.addXP(SkillType.ACROBATICS, event.getDamage() * DODGE_MODIFIER, defender); + Skills.XpCheckSkill(SkillType.ACROBATICS, defender); + } + + event.setDamage(event.getDamage() / 2); + + //Needs to do minimal damage + if (event.getDamage() <= 0) { + event.setDamage(1); + } + } + } } - public static void dodgeChecks(EntityDamageByEntityEvent event){ - Player defender = (Player) event.getEntity(); - PlayerProfile PPd = Users.getProfile(defender); - - if(mcPermissions.getInstance().acrobatics(defender)){ - if(PPd.getSkillLevel(SkillType.ACROBATICS) <= 800){ - if(Math.random() * 4000 <= PPd.getSkillLevel(SkillType.ACROBATICS)){ - defender.sendMessage(mcLocale.getString("Acrobatics.Dodge")); - if(System.currentTimeMillis() >= 5000 + PPd.getRespawnATS() && defender.getHealth() >= 1){ - PPd.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*1, defender); - Skills.XpCheckSkill(SkillType.ACROBATICS, defender); - } - event.setDamage(event.getDamage() / 2); - //Needs to do minimal damage - if(event.getDamage() <= 0) - event.setDamage(1); - } - } else if(Math.random() * 4000 <= 800) { - defender.sendMessage(mcLocale.getString("Acrobatics.Dodge")); - if(System.currentTimeMillis() >= 5000 + PPd.getRespawnATS() && defender.getHealth() >= 1){ - PPd.addXP(SkillType.ACROBATICS, (event.getDamage() * 12)*10, defender); - Skills.XpCheckSkill(SkillType.ACROBATICS, defender); - } - event.setDamage(event.getDamage() / 2); - //Needs to deal minimal damage - if(event.getDamage() <= 0) - event.setDamage(1); - } - } - } - }