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; }