From 82b030409197479c7a14b1bbb617440122febb45 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Fri, 26 Feb 2021 15:28:50 -0800 Subject: [PATCH] Don't set smelt stacks to above item's max stack size --- Changelog.txt | 1 + .../nossr50/listeners/InventoryListener.java | 3 +- .../skills/smelting/SmeltingManager.java | 30 +++++++++++++------ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 80ebd177f..0ad9d4d38 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,4 +1,5 @@ Version 2.1.175 + Fixed a bug where mcMMO would occasionally give a 65 item stack from a double smelt on a furnace Version 2.1.174 Some legacy color codes in our locale file were swapped to &-code equivalents (thanks ViaSnake) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index bf78964d6..c3a0aa838 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -116,7 +116,8 @@ public class InventoryListener implements Listener { //Profile doesn't exist if(offlineProfile != null) { - event.setResult(offlineProfile.getSmeltingManager().smeltProcessing(smelting, event.getResult())); + //Process smelting + offlineProfile.getSmeltingManager().smeltProcessing(event); } } } diff --git a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java index 518718765..0ad1a4803 100644 --- a/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java @@ -12,7 +12,9 @@ import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.event.inventory.FurnaceBurnEvent; +import org.bukkit.event.inventory.FurnaceSmeltEvent; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; public class SmeltingManager extends SkillManager { public SmeltingManager(McMMOPlayer mcMMOPlayer) { @@ -108,19 +110,29 @@ public class SmeltingManager extends SkillManager { } } - public ItemStack smeltProcessing(ItemStack smelting, ItemStack result) { + public void smeltProcessing(@NotNull FurnaceSmeltEvent furnaceSmeltEvent) { + ItemStack sourceItemStack = furnaceSmeltEvent.getSource(); + ItemStack resultItemStack = furnaceSmeltEvent.getResult(); - applyXpGain(Smelting.getResourceXp(smelting), XPGainReason.PVE, XPGainSource.PASSIVE); + applyXpGain(Smelting.getResourceXp(sourceItemStack), XPGainReason.PVE, XPGainSource.PASSIVE); //Add XP + int itemLimit = resultItemStack.getMaxStackSize(); - if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, result.getType()) - && isSecondSmeltSuccessful() && result.getAmount() < 64) { - ItemStack newResult = result.clone(); + processDoubleSmelt(furnaceSmeltEvent, resultItemStack, itemLimit); + } - newResult.setAmount(result.getAmount() + 1); - return newResult; + private void processDoubleSmelt(@NotNull FurnaceSmeltEvent furnaceSmeltEvent, @NotNull ItemStack resultItemStack, int itemLimit) { + //TODO: Permission check work around, could store it as NBT on the furnace + //We don't do permission checks because this can be for an offline player and Bukkit has nothing to grab permissions for offline players + + //Process double smelt + if (Config.getInstance().getDoubleDropsEnabled(PrimarySkillType.SMELTING, resultItemStack.getType()) + && resultItemStack.getAmount() < itemLimit + && isSecondSmeltSuccessful()) { + + ItemStack newResult = resultItemStack.clone(); + newResult.setAmount(Math.min(resultItemStack.getAmount() + 1, itemLimit)); //Don't go over max stack limits + furnaceSmeltEvent.setResult(newResult); } - - return result; } public int vanillaXPBoost(int experience) {