diff --git a/Common/src/main/java/me/hypherionmc/craterlib/systems/SimpleInventory.java b/Common/src/main/java/me/hypherionmc/craterlib/systems/SimpleInventory.java new file mode 100644 index 0000000..8731c6c --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/systems/SimpleInventory.java @@ -0,0 +1,77 @@ +package me.hypherionmc.craterlib.systems; + +import com.google.common.base.Preconditions; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.Clearable; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +/** + * @author HypherionSA + * @date 24/09/2022 + */ +public class SimpleInventory implements Clearable { + + private final SimpleContainer itemHandler; + private final int size; + + private final int stackSize; + + public SimpleInventory(int size, int maxStackSize) { + itemHandler = new SimpleContainer(size) { + @Override + public int getMaxStackSize() { + return maxStackSize; + } + }; + this.size = size; + this.stackSize = maxStackSize; + } + + private static void copyToInv(NonNullList src, Container dest) { + Preconditions.checkArgument(src.size() == dest.getContainerSize()); + for (int i = 0; i < src.size(); i++) { + dest.setItem(i, src.get(i)); + } + } + + private static NonNullList copyFromInv(Container inv) { + NonNullList ret = NonNullList.withSize(inv.getContainerSize(), ItemStack.EMPTY); + for (int i = 0; i < inv.getContainerSize(); i++) { + ret.set(i, inv.getItem(i)); + } + return ret; + } + + public void readNBT(CompoundTag tag) { + NonNullList tmp = NonNullList.withSize(size, ItemStack.EMPTY); + ContainerHelper.loadAllItems(tag, tmp); + copyToInv(tmp, itemHandler); + } + + public void writeNBT(CompoundTag tag) { + ContainerHelper.saveAllItems(tag, copyFromInv(itemHandler)); + } + + public final int inventorySize() { + return getItemHandler().getContainerSize(); + } + + public int getStackSize() { + return stackSize; + } + + @Override + public void clearContent() { + getItemHandler().clearContent(); + } + + public final Container getItemHandler() { + return itemHandler; + } + +} diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/systems/inventory/ForgeInventoryWrapper.java b/Forge/src/main/java/me/hypherionmc/craterlib/systems/inventory/ForgeInventoryWrapper.java new file mode 100644 index 0000000..bacf84d --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/craterlib/systems/inventory/ForgeInventoryWrapper.java @@ -0,0 +1,91 @@ +package me.hypherionmc.craterlib.systems.inventory; + +import com.google.common.base.Suppliers; +import me.hypherionmc.craterlib.systems.SimpleInventory; +import net.minecraft.core.Direction; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; +import java.util.stream.IntStream; + +/** + * @author HypherionSA + * @date 24/09/2022 + */ +public class ForgeInventoryWrapper implements WorldlyContainer { + + private final SimpleInventory inventory; + private final Supplier slots = Suppliers.memoize(() -> IntStream.range(0, getContainerSize()).toArray()); + + public ForgeInventoryWrapper(SimpleInventory inventory) { + this.inventory = inventory; + } + + @Override + public int[] getSlotsForFace(Direction side) { + return slots.get(); + } + + @Override + public boolean canPlaceItemThroughFace(int slot, ItemStack stack, @Nullable Direction side) { + if (canPlaceItem(slot, stack)) { + ItemStack existing = getItem(slot); + return existing.getCount() < getMaxStackSize(); + } + + return false; + } + + @Override + public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction side) { + return true; + } + + @Override + public int getContainerSize() { + return inventory.getItemHandler().getContainerSize(); + } + + @Override + public boolean isEmpty() { + return inventory.getItemHandler().isEmpty(); + } + + @Override + public ItemStack getItem(int slot) { + return inventory.getItemHandler().getItem(slot); + } + + @Override + public ItemStack removeItem(int p_18942_, int p_18943_) { + return inventory.getItemHandler().removeItem(p_18942_, p_18943_); + } + + @Override + public ItemStack removeItemNoUpdate(int slot) { + return inventory.getItemHandler().removeItemNoUpdate(slot); + } + + @Override + public void setItem(int slot, ItemStack stack) { + inventory.getItemHandler().setItem(slot, stack); + } + + @Override + public void setChanged() { + inventory.getItemHandler().setChanged(); + } + + @Override + public boolean stillValid(Player player) { + return inventory.getItemHandler().stillValid(player); + } + + @Override + public void clearContent() { + inventory.getItemHandler().clearContent(); + } +}