package com.thebrokenrail.reliccraft.block; import com.thebrokenrail.reliccraft.RelicCraft; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.Inventories; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Tickable; import net.minecraft.util.collection.DefaultedList; import java.util.Objects; public class DragonEggHolderBlockEntity extends BlockEntity implements Inventory, Tickable { public DragonEggHolderBlockEntity() { super(RelicCraft.DRAGON_EGG_HOLDER_BLOCK_ENTITY); } @Override public void fromTag(BlockState state, CompoundTag tag) { super.fromTag(state, tag); DefaultedList list = DefaultedList.ofSize(size(), ItemStack.EMPTY); Inventories.fromTag(tag, list); stack = list.get(0); } @Override public CompoundTag toTag(CompoundTag tag) { DefaultedList list = DefaultedList.ofSize(size(), ItemStack.EMPTY); list.set(0, stack); Inventories.toTag(tag, list); return super.toTag(tag); } private ItemStack stack = ItemStack.EMPTY; @Override public int size() { return 1; } @Override public int getMaxCountPerStack() { return 1; } @Override public boolean isEmpty() { return stack.isEmpty(); } @Override public ItemStack getStack(int slot) { return stack; } @Override public ItemStack removeStack(int slot, int amount) { ItemStack newStack = getStack(0).split(amount); markDirty(); return newStack; } @Override public ItemStack removeStack(int slot) { ItemStack newStack = getStack(0).copy(); setStack(0, ItemStack.EMPTY); return newStack; } @Override public void setStack(int slot, ItemStack stack) { this.stack = stack; if (stack.getCount() > getMaxCountPerStack()) { stack.setCount(getMaxCountPerStack()); } markDirty(); } @Override public boolean canPlayerUse(PlayerEntity player) { return true; } @Override public void clear() { setStack(0, ItemStack.EMPTY); } @Override public void tick() { if (hasWorld()) { assert getWorld() != null; Block block = getWorld().getBlockState(getPos()).getBlock(); if (block instanceof AbstractDragonEggHolderBlock && !getWorld().isClient()) { ((AbstractDragonEggHolderBlock) block).tick(getWorld(), getPos()); } } } @Override public boolean isValid(int slot, ItemStack stack) { return stack.getItem() == Items.DRAGON_EGG; } @Override public void markDirty() { super.markDirty(); if (hasWorld() && !Objects.requireNonNull(getWorld()).isClient()) { updateBlockState(); } } private void updateBlockState() { if (hasWorld()) { assert getWorld() != null; BlockState state = getWorld().getBlockState(pos); boolean active = !getStack(0).isEmpty(); if (state.get(TeleportationRestrictorBlock.ACTIVE) != active) { getWorld().setBlockState(getPos(), state.with(TeleportationRestrictorBlock.ACTIVE, active)); RelicCraft.playInteractTeleportRestrictorSound(getWorld(), getPos()); } } } }