Implement Simple Cross Loader Inventory System

This commit is contained in:
2022-09-25 01:52:21 +02:00
parent 570321b274
commit f5e34d0ffa
2 changed files with 168 additions and 0 deletions

View File

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

View File

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