1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00
This commit is contained in:
TheBusyBiscuit 2021-05-03 13:05:22 +02:00
parent fd877211ec
commit c29d0e5530
6 changed files with 71 additions and 69 deletions

View File

@ -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

View File

@ -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<>();

View File

@ -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) {

View File

@ -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();
}
}

View File

@ -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());
}

View File

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