diff --git a/CHANGELOG.md b/CHANGELOG.md index eb17f3978..ff1986c1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ * Fixed #2593 * Fixed #2937 * Fixed #3007 +* Fixed #3012 ## Release Candidate 22 (18 Apr 2021) https://thebusybiscuit.github.io/builds/TheBusyBiscuit/Slimefun4/stable/#22 diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/multiblocks/MultiBlockMachine.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/multiblocks/MultiBlockMachine.java index 38269e041..cfed6f6c2 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/multiblocks/MultiBlockMachine.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/multiblocks/MultiBlockMachine.java @@ -3,6 +3,7 @@ package io.github.thebusybiscuit.slimefun4.core.multiblocks; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -13,8 +14,6 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.block.Chest; import org.bukkit.block.data.type.Dispenser; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -28,11 +27,9 @@ import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem; import io.github.thebusybiscuit.slimefun4.core.handlers.MultiBlockInteractionHandler; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.OutputChest; -import io.papermc.lib.PaperLib; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; /** @@ -46,8 +43,6 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; */ public abstract class MultiBlockMachine extends SlimefunItem implements NotPlaceable, RecipeDisplayItem { - private static final BlockFace[] outputFaces = { BlockFace.UP, BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST }; - protected final List recipes; protected final List displayRecipes; protected final MultiBlock multiblock; @@ -158,46 +153,20 @@ public abstract class MultiBlockMachine extends SlimefunItem implements NotPlace @Nullable @ParametersAreNonnullByDefault protected Inventory findOutputInventory(ItemStack product, Block dispBlock, Inventory dispInv, Inventory placeCheckerInv) { - Inventory outputInv = findOutputChest(dispBlock, product); + Optional outputChest = OutputChest.findOutputChestFor(dispBlock, product); /* * This if-clause will trigger if no suitable output chest was found. * It's functionally the same as the old fit check for the dispenser, * only refactored. */ - if (outputInv == null && InvUtils.fits(placeCheckerInv, product)) { + if (!outputChest.isPresent() && InvUtils.fits(placeCheckerInv, product)) { return dispInv; } else { - return outputInv; + return outputChest.orElse(null); } } - @Nullable - protected Inventory findOutputChest(@Nonnull Block b, @Nonnull ItemStack output) { - for (BlockFace face : outputFaces) { - Block potentialOutput = b.getRelative(face); - - if (potentialOutput.getType() == Material.CHEST) { - SlimefunItem slimefunItem = BlockStorage.check(potentialOutput); - - if (slimefunItem instanceof OutputChest) { - // Found the output chest! Now, let's check if we can fit the product in it. - BlockState state = PaperLib.getBlockState(potentialOutput, false).getState(); - - if (state instanceof Chest) { - Inventory inv = ((Chest) state).getInventory(); - - if (InvUtils.fits(inv, output)) { - return inv; - } - } - } - } - } - - return null; - } - @Nonnull private static Material[] convertItemStacksToMaterial(@Nonnull ItemStack[] items) { List materials = new ArrayList<>(); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/Composter.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/Composter.java index 183eb3fc3..f5d7a858d 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/Composter.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/Composter.java @@ -4,6 +4,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Optional; +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Material; @@ -11,13 +14,10 @@ import org.bukkit.Sound; import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.block.Chest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.cscorelib2.scheduling.TaskQueue; import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem; @@ -25,17 +25,15 @@ import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; -import io.papermc.lib.PaperLib; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class Composter extends SimpleSlimefunItem implements RecipeDisplayItem { - private static final BlockFace[] outputFaces = { BlockFace.UP, BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST }; private final List recipes; + @ParametersAreNonnullByDefault public Composter(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe); @@ -120,29 +118,10 @@ public class Composter extends SimpleSlimefunItem implements Re } } + @Nonnull + @ParametersAreNonnullByDefault private Optional findOutputChest(Block b, ItemStack output) { - for (BlockFace face : outputFaces) { - Block potentialOutput = b.getRelative(face); - - if (potentialOutput.getType() == Material.CHEST) { - String id = BlockStorage.checkID(potentialOutput); - - if (id != null && id.equals("OUTPUT_CHEST")) { - // Found the output chest! Now, let's check if we can fit the product in it. - BlockState state = PaperLib.getBlockState(potentialOutput, false).getState(); - - if (state instanceof Chest) { - Inventory inv = ((Chest) state).getInventory(); - - if (InvUtils.fits(inv, output)) { - return Optional.of(inv); - } - } - } - } - } - - return Optional.empty(); + return OutputChest.findOutputChestFor(b, output); } private ItemStack getOutput(Player p, ItemStack input) { diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/OutputChest.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/OutputChest.java index f8c27467c..fb4a5d380 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/OutputChest.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/OutputChest.java @@ -1,15 +1,26 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.blocks; +import java.util.Optional; + +import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; import org.bukkit.block.Chest; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlockMachine; import io.github.thebusybiscuit.slimefun4.implementation.handlers.VanillaInventoryDropHandler; +import io.papermc.lib.PaperLib; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; /** @@ -22,6 +33,16 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; */ public class OutputChest extends SlimefunItem { + // @formatter:off + private static final BlockFace[] possibleFaces = { + BlockFace.UP, + BlockFace.NORTH, + BlockFace.EAST, + BlockFace.SOUTH, + BlockFace.WEST + }; + // @formatter:on + @ParametersAreNonnullByDefault public OutputChest(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe); @@ -29,4 +50,33 @@ public class OutputChest extends SlimefunItem { addItemHandler(new VanillaInventoryDropHandler<>(Chest.class)); } + @Nonnull + public static Optional findOutputChestFor(@Nonnull Block b, @Nonnull ItemStack item) { + for (BlockFace face : possibleFaces) { + Block potentialOutput = b.getRelative(face); + + // Check if the target block is a Chest + if (potentialOutput.getType() == Material.CHEST) { + SlimefunItem slimefunItem = BlockStorage.check(potentialOutput); + + // Fixes #3012 - Check if the OutputChest is not disabled here. + if (slimefunItem instanceof OutputChest && !slimefunItem.isDisabledIn(b.getWorld())) { + // Found the output chest! Now, let's check if we can fit the product in it. + BlockState state = PaperLib.getBlockState(potentialOutput, false).getState(); + + if (state instanceof Chest) { + Inventory inv = ((Chest) state).getInventory(); + + // Check if the Item fits into that inventory. + if (InvUtils.fits(inv, item)) { + return Optional.of(inv); + } + } + } + } + } + + return Optional.empty(); + } + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AutomatedPanningMachine.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AutomatedPanningMachine.java index 59f047855..f2545c710 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AutomatedPanningMachine.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AutomatedPanningMachine.java @@ -2,6 +2,7 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.multiblocks; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import javax.annotation.ParametersAreNonnullByDefault; @@ -20,6 +21,7 @@ import io.github.thebusybiscuit.cscorelib2.scheduling.TaskQueue; import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlockMachine; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.OutputChest; import io.github.thebusybiscuit.slimefun4.implementation.items.tools.GoldPan; import io.github.thebusybiscuit.slimefun4.implementation.items.tools.NetherGoldPan; import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; @@ -74,10 +76,10 @@ public class AutomatedPanningMachine extends MultiBlockMachine { queue.thenRun(20, () -> { if (output.getType() != Material.AIR) { - Inventory outputChest = findOutputChest(b.getRelative(BlockFace.DOWN), output); + Optional outputChest = OutputChest.findOutputChestFor(b.getRelative(BlockFace.DOWN), output); - if (outputChest != null) { - outputChest.addItem(output.clone()); + if (outputChest.isPresent()) { + outputChest.get().addItem(output.clone()); } else { b.getWorld().dropItemNaturally(b.getLocation(), output.clone()); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/TableSaw.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/TableSaw.java index 315734586..8fc6dafce 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/TableSaw.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/TableSaw.java @@ -21,6 +21,7 @@ import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import io.github.thebusybiscuit.cscorelib2.materials.MaterialConverter; import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlockMachine; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.implementation.items.blocks.OutputChest; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; @@ -99,10 +100,10 @@ public class TableSaw extends MultiBlockMachine { } private void outputItems(@Nonnull Block b, @Nonnull ItemStack output) { - Inventory outputChest = findOutputChest(b, output); + Optional outputChest = OutputChest.findOutputChestFor(b, output); - if (outputChest != null) { - outputChest.addItem(output); + if (outputChest.isPresent()) { + outputChest.get().addItem(output); } else { b.getWorld().dropItemNaturally(b.getLocation(), output); }