From 51a373db4f9d7df28bc6efe3edb1258fb2178094 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 17 Sep 2019 18:59:44 -0700 Subject: [PATCH] Fixing an Acrobatics exploit --- Changelog.txt | 7 ++++++ pom.xml | 2 +- src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../skills/acrobatics/AcrobaticsManager.java | 24 ++++++++++++++++--- .../nossr50/util/skills/CombatUtils.java | 3 ++- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3ad719b6c..6c40ee51b 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,10 @@ +Version 2.1.108 + Fixed an amusing exploit for easy leveling in Acrobatics + + NOTES: + Mobs will now only reward Dodge XP a certain amount of times + You can turn off this exploit prevention by disabling ExploitFix.Acrobatics in experience.yml + Version 2.1.107 Fixed an exploit that allowed automated XP gain for Excavation Fixed encoding of russian translation diff --git a/pom.xml b/pom.xml index 884e0d8a5..636e62cb1 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.1.107 + 2.1.108-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 301df2ca9..fef601957 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -109,6 +109,7 @@ public class mcMMO extends JavaPlugin { /* Metadata Values */ public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; + public static final String DODGE_TRACKER = "mcMMO: Dodge Tracker"; public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage"; public static final String COTW_TEMPORARY_SUMMON = "mcMMO: COTW Entity"; public final static String entityMetadataKey = "mcMMO: Spawned Entity"; 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 1ff6fa3b2..c241cd946 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -7,6 +7,7 @@ import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -20,6 +21,8 @@ import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; public class AcrobaticsManager extends SkillManager { @@ -81,7 +84,7 @@ public class AcrobaticsManager extends SkillManager { * @param damage The amount of damage initially dealt by the event * @return the modified event damage if the ability was successful, the original event damage otherwise */ - public double dodgeCheck(double damage) { + public double dodgeCheck(Entity attacker, double damage) { double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier); Player player = getPlayer(); @@ -92,11 +95,26 @@ public class AcrobaticsManager extends SkillManager { NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Combat.Proc"); } - //Check respawn to prevent abuse if (SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) { - applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVP); + if(!(attacker instanceof Player)) { + //Check to see how many dodge XP rewards this mob has handed out + if(attacker.hasMetadata(mcMMO.DODGE_TRACKER) && ExperienceConfig.getInstance().isAcrobaticsExploitingPrevented()) { + //If Dodge XP has been handed out 5 times then consider it being exploited + MetadataValue metadataValue = attacker.getMetadata(mcMMO.DODGE_TRACKER).get(0); + int count = attacker.getMetadata(mcMMO.DODGE_TRACKER).get(0).asInt(); + + if(count <= 5) { + applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE); + attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, count + 1)); + } + } else { + applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVE); + attacker.setMetadata(mcMMO.DODGE_TRACKER, new FixedMetadataValue(mcMMO.p, 1)); + } + } } + //Check respawn to prevent abuse return modifiedDamage; } diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 2995b9d4e..a59c238e7 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -268,11 +268,12 @@ public final class CombatUtils { if (!UserManager.hasPlayerDataKey(player)) { return; } + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); AcrobaticsManager acrobaticsManager = mcMMOPlayer.getAcrobaticsManager(); if (acrobaticsManager.canDodge(target)) { - event.setDamage(acrobaticsManager.dodgeCheck(event.getDamage())); + event.setDamage(acrobaticsManager.dodgeCheck(attacker, event.getDamage())); } if (ItemUtils.isSword(player.getInventory().getItemInMainHand())) {