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