From 7b3fb46a9aea181c5a1424b366ff7b02c4e86773 Mon Sep 17 00:00:00 2001 From: TfT_02 Date: Fri, 25 Oct 2013 22:01:49 +0200 Subject: [PATCH] Improved AFK Acrobatics prevention mechanism --- Changelog.txt | 1 + .../java/com/gmail/nossr50/config/Config.java | 1 + .../nossr50/skills/acrobatics/Acrobatics.java | 1 - .../skills/acrobatics/AcrobaticsManager.java | 28 ++++++++++++++++++- src/main/resources/config.yml | 1 + 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index d58b8ab1f..6f22f0ab6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -69,6 +69,7 @@ Version 1.4.07-dev ! Admin and Party chat prefixes are now customizable ! Changed the color of party leader names in Party chat ! Improved "Tree Feller" algorithm (Thanks Riking!) + ! Improved AFK Acrobatics prevention mechanism ! Improved profile saving ! Improved partial name matcher ! Improved update checker diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 2673641d2..1eab5ba52 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -430,6 +430,7 @@ public class Config extends AutoUpdateConfigLoader { /* AFK Leveling */ public boolean getAcrobaticsAFKDisabled() { return config.getBoolean("Skills.Acrobatics.Prevent_AFK_Leveling", true); } + public int getAcrobaticsAFKMaxTries() { return config.getInt("Skills.Acrobatics.Max_Tries_At_Same_Location", 3); } public boolean getHerbalismAFKDisabled() { return config.getBoolean("Skills.Herbalism.Prevent_AFK_Leveling", true); } /* Level Caps */ diff --git a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java index f0536af30..36d5c9486 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java @@ -23,7 +23,6 @@ public final class Acrobatics { public static double featherFallXPModifier = ExperienceConfig.getInstance().getFeatherFallXPModifier(); - public static boolean afkLevelingDisabled = Config.getInstance().getAcrobaticsAFKDisabled(); public static boolean dodgeLightningDisabled = Config.getInstance().getDodgeLightningDisabled(); private Acrobatics() {}; 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 438946144..ad9af3c95 100644 --- a/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.skills.acrobatics; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; @@ -7,6 +8,7 @@ import org.bukkit.entity.LightningStrike; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.locale.LocaleLoader; @@ -18,6 +20,9 @@ import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.gmail.nossr50.util.skills.SkillUtils; public class AcrobaticsManager extends SkillManager { + private int fallTries = 0; + Location lastFallLocation; + public AcrobaticsManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, SkillType.ACROBATICS); } @@ -25,7 +30,7 @@ public class AcrobaticsManager extends SkillManager { public boolean canRoll() { Player player = getPlayer(); - return (player.getItemInHand().getType() != Material.ENDER_PEARL) && !(Acrobatics.afkLevelingDisabled && player.isInsideVehicle()) && Permissions.roll(player); + return (player.getItemInHand().getType() != Material.ENDER_PEARL) && !exploitPrevention() && Permissions.roll(player); } public boolean canDodge(Entity damager) { @@ -93,6 +98,8 @@ public class AcrobaticsManager extends SkillManager { applyXpGain(calculateRollXP(damage, false)); } + lastFallLocation = player.getLocation(); + return damage; } @@ -118,6 +125,25 @@ public class AcrobaticsManager extends SkillManager { return damage; } + public boolean exploitPrevention() { + if (!Config.getInstance().getAcrobaticsAFKDisabled()) { + return false; + } + + if (getPlayer().isInsideVehicle()) { + return true; + } + + Location fallLocation = getPlayer().getLocation(); + + boolean sameLocation = (lastFallLocation != null && Misc.isNear(lastFallLocation, fallLocation, 2)); + + fallTries = sameLocation ? fallTries + 1 : Math.max(fallTries - 1, 0); + lastFallLocation = fallLocation; + + return fallTries > Config.getInstance().getAcrobaticsAFKMaxTries(); + } + private boolean isSuccessfulRoll(double maxChance, int maxLevel) { return (maxChance / maxLevel) * Math.min(getSkillLevel(), maxLevel) > Misc.getRandom().nextInt(activationChance); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 50de24b51..5e159cf6c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -231,6 +231,7 @@ Skills: Enabled_For_PVP: true Enabled_For_PVE: true Prevent_AFK_Leveling: true + Max_Tries_At_Same_Location: 3 Prevent_Dodge_Lightning: false Prevent_XP_After_Teleport: true Level_Cap: 0