2
0
Эх сурвалжийг харах

Fixing an Acrobatics exploit

nossr50 5 жил өмнө
parent
commit
51a373db4f

+ 7 - 0
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

+ 1 - 1
pom.xml

@@ -2,7 +2,7 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.gmail.nossr50.mcMMO</groupId>
     <artifactId>mcMMO</artifactId>
-    <version>2.1.107</version>
+    <version>2.1.108-SNAPSHOT</version>
     <name>mcMMO</name>
     <url>https://github.com/mcMMO-Dev/mcMMO</url>
     <scm>

+ 1 - 0
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";

+ 21 - 3
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;
         }
 

+ 2 - 1
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())) {