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())) {