Sfoglia il codice sorgente

Fixing an Acrobatics exploit

nossr50 5 anni fa
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
 Version 2.1.107
     Fixed an exploit that allowed automated XP gain for Excavation
     Fixed an exploit that allowed automated XP gain for Excavation
     Fixed encoding of russian translation
     Fixed encoding of russian translation

+ 1 - 1
pom.xml

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

+ 1 - 0
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -109,6 +109,7 @@ public class mcMMO extends JavaPlugin {
 
 
     /* Metadata Values */
     /* Metadata Values */
     public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker";
     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 CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage";
     public static final String COTW_TEMPORARY_SUMMON = "mcMMO: COTW Entity";
     public static final String COTW_TEMPORARY_SUMMON = "mcMMO: COTW Entity";
     public final static String entityMetadataKey   = "mcMMO: Spawned 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.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Permissions;
@@ -20,6 +21,8 @@ import org.bukkit.Location;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.LightningStrike;
 import org.bukkit.entity.LightningStrike;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.metadata.MetadataValue;
 
 
 public class AcrobaticsManager extends SkillManager {
 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
      * @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
      * @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);
         double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier);
         Player player = getPlayer();
         Player player = getPlayer();
 
 
@@ -92,11 +95,26 @@ public class AcrobaticsManager extends SkillManager {
                 NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Combat.Proc");
                 NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Combat.Proc");
             }
             }
 
 
-            //Check respawn to prevent abuse
             if (SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)) {
             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;
             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)) {
             if (!UserManager.hasPlayerDataKey(player)) {
                 return;
                 return;
             }
             }
+
             McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
             McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
             AcrobaticsManager acrobaticsManager = mcMMOPlayer.getAcrobaticsManager();
             AcrobaticsManager acrobaticsManager = mcMMOPlayer.getAcrobaticsManager();
 
 
             if (acrobaticsManager.canDodge(target)) {
             if (acrobaticsManager.canDodge(target)) {
-                event.setDamage(acrobaticsManager.dodgeCheck(event.getDamage()));
+                event.setDamage(acrobaticsManager.dodgeCheck(attacker, event.getDamage()));
             }
             }
 
 
             if (ItemUtils.isSword(player.getInventory().getItemInMainHand())) {
             if (ItemUtils.isSword(player.getInventory().getItemInMainHand())) {