This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
Twine/src/main/java/com/thebrokenrail/twine/item/BackpackItem.java

135 lines
4.5 KiB
Java
Raw Normal View History

2020-06-14 03:04:21 +00:00
package com.thebrokenrail.twine.item;
import com.thebrokenrail.twine.Twine;
import com.thebrokenrail.twine.component.StageDataComponent;
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.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.LiteralText;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.ChunkPos;
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);
});
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) world);
ChunkPos chunkPos = new ChunkPos(user.getBlockPos());
int stage = component.findStageOfChunk(chunkPos);
user.sendMessage(new LiteralText("Global Stage: " + stage), false);
StageDataComponent.StageData[] personalData = component.getData(user.getUuid());
int personalStage = StageDataComponent.findStageOfChunk(chunkPos, personalData);
user.sendMessage(new LiteralText("Personal Stage: " + personalStage), false);
user.sendMessage(new LiteralText("Personal Center Chunk X: " + personalData[personalStage].x + " Personal Center Chunk Z: " + personalData[personalStage].z), false);
user.sendMessage(new LiteralText("Time To Personal Stage Increase: " + (Twine.STAGE_TIME - personalData[personalStage].time) + " Ticks"), false);
}
return new TypedActionResult<>(ActionResult.CONSUME, stack);
}
}