129 lines
3.6 KiB
Java
129 lines
3.6 KiB
Java
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<ItemStack> list = DefaultedList.ofSize(size(), ItemStack.EMPTY);
|
|
Inventories.fromTag(tag, list);
|
|
stack = list.get(0);
|
|
}
|
|
|
|
@Override
|
|
public CompoundTag toTag(CompoundTag tag) {
|
|
DefaultedList<ItemStack> 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());
|
|
}
|
|
}
|
|
}
|
|
}
|