Implement Simple Cross Loader Inventory System
This commit is contained in:
@@ -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<ItemStack> 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<ItemStack> copyFromInv(Container inv) {
|
||||
NonNullList<ItemStack> 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<ItemStack> 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;
|
||||
}
|
||||
|
||||
}
|
@@ -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<int[]> 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();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user