diff --git a/Changelog.txt b/Changelog.txt
index 93248c7e7..466bfb1f5 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -7,6 +7,12 @@ Key:
! Change
- Removal
+Version 2.1.20
+ Players can now fish in the same spot about 3 times before mcMMO will mark the area as being over-fished (over-fishing is to prevent abuse)
+ Added a toggle to turn off the fishing exploit detection to experience.yml "ExploitFix.Fishing"
+ Note: The new config update is coming soon and will use a different setting, putting this out as a band-aid fix for people that don't like the new fishing exploit prevention stuff
+ Added a message to warn players that their next fishing attempt will result in over-fishing (Locale: Fishing.LowResources)
+
Version 2.1.19
Greatly Improved Fishing AFK/Exploit Detection
Fixed a bug where Fishing AFK detection did not work on a new exploit
diff --git a/pom.xml b/pom.xml
index 75ccf688a..2cd9ae2cd 100755
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.gmail.nossr50.mcMMO
mcMMO
- 2.1.19
+ 2.1.20
mcMMO
https://github.com/mcMMO-Dev/mcMMO
diff --git a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java
index 22c7de84d..6f4f86fb3 100644
--- a/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java
+++ b/src/main/java/com/gmail/nossr50/config/experience/ExperienceConfig.java
@@ -144,6 +144,7 @@ public class ExperienceConfig extends AutoUpdateConfigLoader {
/* EXPLOIT TOGGLES */
public boolean isEndermanEndermiteFarmingPrevented() { return config.getBoolean("ExploitFix.EndermanEndermiteFarms", true); }
+ public boolean isFishingExploitingPrevented() { return config.getBoolean("ExploitFix.Fishing", true); }
/* Curve settings */
public FormulaType getFormulaType() { return FormulaType.getFormulaType(config.getString("Experience_Formula.Curve")); }
public boolean getCumulativeCurveEnabled() { return config.getBoolean("Experience_Formula.Cumulative_Curve", false); }
diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
index 567202e7b..55c1a8776 100644
--- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
+++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
@@ -324,23 +324,26 @@ public class PlayerListener implements Listener {
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
//Track the hook
- if(event.getHook().getMetadata(mcMMO.FISH_HOOK_REF_METAKEY).size() == 0)
+ if(ExperienceConfig.getInstance().isFishingExploitingPrevented())
{
- fishingManager.setFishHookReference(event.getHook());
- }
-
- //Spam Fishing
- if(event.getState() == PlayerFishEvent.State.CAUGHT_FISH && fishingManager.isFishingTooOften())
- {
- event.setExpToDrop(0);
-
- if(caught instanceof Item)
+ if(event.getHook().getMetadata(mcMMO.FISH_HOOK_REF_METAKEY).size() == 0)
{
- Item caughtItem = (Item) caught;
- caughtItem.remove();
+ fishingManager.setFishHookReference(event.getHook());
}
- return;
+ //Spam Fishing
+ if(event.getState() == PlayerFishEvent.State.CAUGHT_FISH && fishingManager.isFishingTooOften())
+ {
+ event.setExpToDrop(0);
+
+ if(caught instanceof Item)
+ {
+ Item caughtItem = (Item) caught;
+ caughtItem.remove();
+ }
+
+ return;
+ }
}
switch (event.getState()) {
@@ -351,12 +354,16 @@ public class PlayerListener implements Listener {
}
return;
case CAUGHT_FISH:
- if(fishingManager.isExploitingFishing(event.getHook().getLocation().toVector()))
+ if(ExperienceConfig.getInstance().isFishingExploitingPrevented())
{
- event.setExpToDrop(0);
- Item caughtItem = (Item) caught;
- caughtItem.remove();
- return;
+ if(fishingManager.isExploitingFishing(event.getHook().getLocation().toVector()))
+ {
+ player.sendMessage(LocaleLoader.getString("Fishing.Scarcity"));
+ event.setExpToDrop(0);
+ Item caughtItem = (Item) caught;
+ caughtItem.remove();
+ return;
+ }
}
fishingManager.handleFishing((Item) caught);
diff --git a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
index 5fe8dd366..61a670599 100644
--- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
+++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
@@ -45,6 +45,7 @@ import java.util.*;
public class FishingManager extends SkillManager {
public static final int FISHING_ROD_CAST_CD_MILLISECONDS = 200;
+ public static final int OVERFISH_LIMIT = 4;
private final long FISHING_COOLDOWN_SECONDS = 1000L;
private long fishingRodCastTimestamp = 0L;
@@ -55,6 +56,7 @@ public class FishingManager extends SkillManager {
private BoundingBox lastFishingBoundingBox;
private Item fishingCatch;
private Location hookLocation;
+ private int fishCaughtCounter = 1;
public FishingManager(McMMOPlayer mcMMOPlayer) {
super(mcMMOPlayer, PrimarySkillType.FISHING);
@@ -131,15 +133,21 @@ public class FishingManager extends SkillManager {
boolean sameTarget = lastFishingBoundingBox != null && lastFishingBoundingBox.overlaps(newCastBoundingBox);
+ if(sameTarget)
+ fishCaughtCounter++;
+ else
+ fishCaughtCounter = 1;
+
+ if(fishCaughtCounter + 1 == OVERFISH_LIMIT)
+ {
+ getPlayer().sendMessage(LocaleLoader.getString("Fishing.LowResources"));
+ }
+
//If the new bounding box does not intersect with the old one, then update our bounding box reference
if(!sameTarget)
lastFishingBoundingBox = newCastBoundingBox;
- else
- {
- getPlayer().sendMessage(LocaleLoader.getString("Fishing.Scarcity"));
- }
- return sameTarget;
+ return sameTarget && fishCaughtCounter >= OVERFISH_LIMIT;
}
public static BoundingBox makeBoundingBox(Vector centerOfCastVector) {
diff --git a/src/main/resources/experience.yml b/src/main/resources/experience.yml
index dd8119e1e..0e2f41b6b 100644
--- a/src/main/resources/experience.yml
+++ b/src/main/resources/experience.yml
@@ -23,6 +23,8 @@
#SOLID
# The bar is one solid piece
ExploitFix:
+ # Prevent many exploits related to fishing
+ Fishing: true
EndermanEndermiteFarms: true
Experience_Bars:
# Turn this to false if you wanna disable XP bars
diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties
index 10fd7767b..133ef89b7 100644
--- a/src/main/resources/locale/locale_en_US.properties
+++ b/src/main/resources/locale/locale_en_US.properties
@@ -220,6 +220,7 @@ Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used
Fishing.Scarcity=[[YELLOW]]&oThis area is suffering from overfishing, try fishing in a new area.
Fishing.Scared=[[GRAY]]&oChaotic movements will scare fish!
Fishing.Exhausting=[[RED]]&oImproper use of the fishing rod will cause fatigue and wear out the rod!
+Fishing.LowResources=[[GRAY]]You sense that there might not be many fish left in this area.
Fishing.Ability.Info=Magic Hunter: [[GRAY]] **Improves With Treasure Hunter Rank**
Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE)
Fishing.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (ICE FISHING)