118 lines
3.4 KiB
Java
118 lines
3.4 KiB
Java
package com.thebrokenrail.twine.item;
|
|
|
|
import com.thebrokenrail.twine.Twine;
|
|
import net.fabricmc.fabric.api.container.ContainerProviderRegistry;
|
|
import net.minecraft.entity.player.PlayerEntity;
|
|
import net.minecraft.inventory.Inventories;
|
|
import net.minecraft.inventory.Inventory;
|
|
import net.minecraft.item.DyeableItem;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.ActionResult;
|
|
import net.minecraft.util.Hand;
|
|
import net.minecraft.util.TypedActionResult;
|
|
import net.minecraft.util.collection.DefaultedList;
|
|
import net.minecraft.world.World;
|
|
|
|
public class BackpackItem extends Item implements DyeableItem {
|
|
public static class ItemInventory implements Inventory {
|
|
private final int size;
|
|
private final ItemStack stack;
|
|
private final Hand hand;
|
|
private final DefaultedList<ItemStack> inv;
|
|
|
|
public ItemInventory(int size, ItemStack stack, Hand hand) {
|
|
this.size = size;
|
|
this.stack = stack;
|
|
this.hand = hand;
|
|
inv = getInv();
|
|
}
|
|
|
|
public ItemStack getHolder() {
|
|
return stack;
|
|
}
|
|
|
|
private DefaultedList<ItemStack> getInv() {
|
|
DefaultedList<ItemStack> list = DefaultedList.ofSize(size, ItemStack.EMPTY);
|
|
Inventories.fromTag(stack.getOrCreateTag(), list);
|
|
return list;
|
|
}
|
|
|
|
private void setInv(DefaultedList<ItemStack> list) {
|
|
Inventories.toTag(stack.getOrCreateTag(), 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() {
|
|
setInv(inv);
|
|
}
|
|
|
|
@Override
|
|
public boolean canPlayerUse(PlayerEntity player) {
|
|
return player.getStackInHand(hand) == stack;
|
|
}
|
|
|
|
@Override
|
|
public void clear() {
|
|
for (int i = 0; i < size; i++) {
|
|
inv.set(i, ItemStack.EMPTY);
|
|
}
|
|
}
|
|
}
|
|
|
|
private final boolean large;
|
|
|
|
public BackpackItem(boolean large) {
|
|
super(new Settings().maxCount(1).group(Twine.ITEM_GROUP));
|
|
this.large = large;
|
|
}
|
|
|
|
@Override
|
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
|
|
ItemStack stack = user.getStackInHand(hand);
|
|
if (!world.isClient()) {
|
|
ContainerProviderRegistry.INSTANCE.openContainer(Twine.BACKPACK_SCREEN, user, buf -> {
|
|
buf.writeBoolean(large);
|
|
buf.writeEnumConstant(hand);
|
|
});
|
|
}
|
|
return new TypedActionResult<>(ActionResult.CONSUME, stack);
|
|
}
|
|
}
|