mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-19 19:25:48 +00:00
Fixed #3012
This commit is contained in:
parent
fd877211ec
commit
c29d0e5530
@ -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
|
||||
|
@ -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<ItemStack[]> recipes;
|
||||
protected final List<ItemStack> 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<Inventory> 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<Material> materials = new ArrayList<>();
|
||||
|
@ -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<BlockUseHandler> implements RecipeDisplayItem {
|
||||
|
||||
private static final BlockFace[] outputFaces = { BlockFace.UP, BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST };
|
||||
private final List<ItemStack> 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<BlockUseHandler> implements Re
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@ParametersAreNonnullByDefault
|
||||
private Optional<Inventory> 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) {
|
||||
|
@ -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<Inventory> 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<Inventory> 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());
|
||||
}
|
||||
|
@ -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<Inventory> 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user