diff --git a/Changelog.txt b/Changelog.txt
index 1d360743d..1333e46e2 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,9 @@
+Version 2.1.158
+ Fixed a bug where Lure level 4 and above would break fishing with the new Master Angler
+
+ NOTES:
+ Master Angler will emulate the effects of Lure if the level is higher than 3 instead of attempting to stack with it to avoid a vanilla Minecraft bug where fish are never caught
+
Version 2.1.157
Fixed a NPE that prevented mctop (Leaderboards) from working
diff --git a/pom.xml b/pom.xml
index 3c1fb5ae8..a775af69e 100755
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.gmail.nossr50.mcMMO
mcMMO
- 2.1.157
+ 2.1.158-SNAPSHOT
mcMMO
https://github.com/mcMMO-Dev/mcMMO
diff --git a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
index 0c12bcdc1..0f34e84b1 100644
--- a/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
+++ b/src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
@@ -92,7 +92,7 @@ public class FishingCommand extends SkillCommand {
// MASTER ANGLER
if (canMasterAngler) {
maMinWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMinWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false));
- maMaxWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMaxWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false));
+ maMaxWaitTime = StringUtils.ticksToSeconds(fishingManager.getMasterAnglerTickMaxWaitReduction(RankUtils.getRank(player, SubSkillType.FISHING_MASTER_ANGLER), false, 0));
}
}
diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
index 1aa393a22..c0fb6da54 100644
--- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
+++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
@@ -35,6 +35,7 @@ import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
+import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.*;
import org.bukkit.entity.minecart.PoweredMinecart;
import org.bukkit.event.Event;
@@ -387,7 +388,21 @@ public class PlayerListener implements Listener {
switch (event.getState()) {
case FISHING:
if (fishingManager.canMasterAngler()) {
- fishingManager.masterAngler(event.getHook());
+ int lureLevel = 0;
+ ItemStack inHand = player.getInventory().getItemInMainHand();
+
+ //Grab lure level
+ if(inHand != null && inHand.getType().getKey().getKey().equalsIgnoreCase("fishing_rod")) {
+ if(inHand.getItemMeta().hasEnchants()) {
+ for(Enchantment enchantment : inHand.getItemMeta().getEnchants().keySet()) {
+ if(enchantment.toString().toLowerCase().contains("lure")) {
+ lureLevel = inHand.getEnchantmentLevel(enchantment);
+ }
+ }
+ }
+ }
+
+ fishingManager.masterAngler(event.getHook(), lureLevel);
fishingManager.setFishingTarget();
}
return;
diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java
index 720243f1c..0f652e02c 100644
--- a/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java
+++ b/src/main/java/com/gmail/nossr50/runnables/skills/MasterAnglerTask.java
@@ -8,14 +8,16 @@ import org.jetbrains.annotations.NotNull;
public class MasterAnglerTask extends BukkitRunnable {
private final @NotNull FishHook fishHook;
private final @NotNull FishingManager fishingManager;
+ private final int lureLevel;
- public MasterAnglerTask(@NotNull FishHook fishHook, @NotNull FishingManager fishingManager) {
+ public MasterAnglerTask(@NotNull FishHook fishHook, @NotNull FishingManager fishingManager, int lureLevel) {
this.fishHook = fishHook;
this.fishingManager = fishingManager;
+ this.lureLevel = lureLevel;
}
@Override
public void run() {
- fishingManager.processMasterAngler(fishHook);
+ fishingManager.processMasterAngler(fishHook, lureLevel);
}
}
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 f0733588c..9d76097b6 100644
--- a/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
+++ b/src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
@@ -247,8 +247,8 @@ public class FishingManager extends SkillManager {
EventUtils.callFakeFishEvent(getPlayer(), hook);
}
- public void masterAngler(@NotNull FishHook hook) {
- new MasterAnglerTask(hook, this).runTaskLater(mcMMO.p, 0); //We run later to get the lure bonus applied
+ public void masterAngler(@NotNull FishHook hook, int lureLevel) {
+ new MasterAnglerTask(hook, this, lureLevel).runTaskLater(mcMMO.p, 0); //We run later to get the lure bonus applied
}
/**
@@ -256,7 +256,7 @@ public class FishingManager extends SkillManager {
* Reduced tick time on fish hook, etc
* @param fishHook target fish hook
*/
- public void processMasterAngler(@NotNull FishHook fishHook) {
+ public void processMasterAngler(@NotNull FishHook fishHook, int lureLevel) {
MasterAnglerCompatibilityLayer masterAnglerCompatibilityLayer = (MasterAnglerCompatibilityLayer) mcMMO.getCompatibilityManager().getMasterAnglerCompatibilityLayer();
if(masterAnglerCompatibilityLayer != null) {
@@ -264,10 +264,17 @@ public class FishingManager extends SkillManager {
int minWaitTicks = masterAnglerCompatibilityLayer.getMinWaitTime(fishHook);
int masterAnglerRank = RankUtils.getRank(mmoPlayer, SubSkillType.FISHING_MASTER_ANGLER);
+ int convertedLureBonus = 0;
+
+ //This avoids a Minecraft bug where lure levels above 3 break fishing
+ if(lureLevel > 3) {
+ masterAnglerCompatibilityLayer.setApplyLure(fishHook, false);
+ convertedLureBonus = lureLevel * 100;
+ }
boolean boatBonus = isInBoat();
int minWaitReduction = getMasterAnglerTickMinWaitReduction(masterAnglerRank, boatBonus);
- int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus);
+ int maxWaitReduction = getMasterAnglerTickMaxWaitReduction(masterAnglerRank, boatBonus, convertedLureBonus);
//Ticks for minWait and maxWait never go below this value
int bonusCapMin = AdvancedConfig.getInstance().getFishingReductionMinWaitCap();
@@ -276,9 +283,21 @@ public class FishingManager extends SkillManager {
int reducedMinWaitTime = getReducedTicks(minWaitTicks, minWaitReduction, bonusCapMin);
int reducedMaxWaitTime = getReducedTicks(maxWaitTicks, maxWaitReduction, bonusCapMax);
+ boolean badValuesFix = false;
+
+ //If we find bad values correct it
+ if(reducedMaxWaitTime < reducedMinWaitTime) {
+ reducedMaxWaitTime = reducedMinWaitTime + 100;
+ badValuesFix = true;
+ }
+
if(mmoPlayer.isDebugMode()) {
mmoPlayer.getPlayer().sendMessage(ChatColor.GOLD + "Master Angler Debug");
+ if(badValuesFix) {
+ mmoPlayer.getPlayer().sendMessage(ChatColor.RED + "Bad values were applied and corrected, check your configs, max wait should never be lower than min wait.");
+ }
+
mmoPlayer.getPlayer().sendMessage("ALLOW STACK WITH LURE: " + masterAnglerCompatibilityLayer.getApplyLure(fishHook));
mmoPlayer.getPlayer().sendMessage("MIN TICK REDUCTION: " + minWaitReduction);
mmoPlayer.getPlayer().sendMessage("MAX TICK REDUCTION: " + maxWaitReduction);
@@ -321,13 +340,15 @@ public class FishingManager extends SkillManager {
return mmoPlayer.getPlayer().isInsideVehicle() && mmoPlayer.getPlayer().getVehicle() instanceof Boat;
}
- public int getMasterAnglerTickMaxWaitReduction(int masterAnglerRank, boolean boatBonus) {
+ public int getMasterAnglerTickMaxWaitReduction(int masterAnglerRank, boolean boatBonus, int emulatedLureBonus) {
int totalBonus = AdvancedConfig.getInstance().getFishingReductionMaxWaitTicks() * masterAnglerRank;
if(boatBonus) {
totalBonus += getFishingBoatMaxWaitReduction();
}
+ totalBonus += emulatedLureBonus;
+
return totalBonus;
}