package com.thebrokenrail.twine.util; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.util.collection.DefaultedList; public abstract class ItemInventory implements Inventory { private final int size; private final ItemStack stack; private final DefaultedList inv; public ItemInventory(int size, ItemStack stack) { this.size = size; this.stack = stack; inv = load(); } protected ItemStack getHolder() { return stack; } private DefaultedList load() { DefaultedList list = DefaultedList.ofSize(size, ItemStack.EMPTY); Inventories.fromTag(stack.getOrCreateTag().getCompound("BlockEntityTag"), list); return list; } private void save(DefaultedList list) { Inventories.toTag(stack.getOrCreateTag().getCompound("BlockEntityTag"), list); } @Override public int size() { return size; } @Override public boolean isEmpty() { for (ItemStack item : inv) { if (item != ItemStack.EMPTY) { return false; } } return true; } @Override public ItemStack getStack(int slot) { return inv.get(slot); } @Override public ItemStack removeStack(int slot, int amount) { return inv.get(slot).split(amount); } @Override public ItemStack removeStack(int slot) { ItemStack item = inv.get(slot); return item.split(item.getCount()); } @Override public void setStack(int slot, ItemStack stack) { inv.set(slot, stack); } @Override public void markDirty() { save(inv); } @Override public abstract boolean canPlayerUse(PlayerEntity player); @Override public void clear() { for (int i = 0; i < size; i++) { inv.set(i, ItemStack.EMPTY); } } }