From c27088bb3ba8e83d9fd4b5bd0d944be54c1482b2 Mon Sep 17 00:00:00 2001 From: Uko Kokņevičs Date: Wed, 10 Jan 2024 02:05:34 +0100 Subject: Move out common chest logic to separate files --- .../block/entity/AlchemicalChestBlockEntity.java | 174 +----------------- .../block/entity/ChestLikeBlockEntity.java | 200 +++++++++++++++++++++ 2 files changed, 208 insertions(+), 166 deletions(-) create mode 100644 src/main/java/lv/enes/mc/eris_alchemy/block/entity/ChestLikeBlockEntity.java (limited to 'src/main/java/lv/enes/mc/eris_alchemy/block/entity') diff --git a/src/main/java/lv/enes/mc/eris_alchemy/block/entity/AlchemicalChestBlockEntity.java b/src/main/java/lv/enes/mc/eris_alchemy/block/entity/AlchemicalChestBlockEntity.java index 1e881f8..bac49b6 100644 --- a/src/main/java/lv/enes/mc/eris_alchemy/block/entity/AlchemicalChestBlockEntity.java +++ b/src/main/java/lv/enes/mc/eris_alchemy/block/entity/AlchemicalChestBlockEntity.java @@ -3,202 +3,44 @@ package lv.enes.mc.eris_alchemy.block.entity; import jakarta.annotation.Nonnull; import lv.enes.mc.eris_alchemy.ErisAlchemyRegistry; import lv.enes.mc.eris_alchemy.menu.AlchemicalChestMenu; +import lv.enes.mc.eris_alchemy.menu.ChestLikeBlockMenu; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.Container; -import net.minecraft.world.ContainerHelper; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; -import net.minecraft.world.level.block.entity.ChestLidController; -import net.minecraft.world.level.block.entity.ContainerOpenersCounter; -import net.minecraft.world.level.block.entity.LidBlockEntity; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -public class AlchemicalChestBlockEntity extends BaseContainerBlockEntity implements LidBlockEntity { +public class AlchemicalChestBlockEntity extends ChestLikeBlockEntity { private final static int WIDTH = 13; private final static int HEIGHT = 8; - private final static int EVENT = 1; - private final NonNullList items = NonNullList.withSize(WIDTH * HEIGHT, ItemStack.EMPTY); - private final ChestLidController lidController = new ChestLidController(); - private final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { - @Override - protected void onOpen(Level world, BlockPos pos, BlockState state) { - // TODO: Sound effects? - world.playSound( - null, - pos.getX() + 0.5, - pos.getY() + 0.5, - pos.getZ() + 0.5, - SoundEvents.ENDER_CHEST_OPEN, - SoundSource.BLOCKS, - 0.5f, - world.random.nextFloat() * 0.1f + 0.9f - ); - } - - @Override - protected void onClose(Level world, BlockPos pos, BlockState state) { - // TODO: Sound effects? - world.playSound( - null, - pos.getX() + 0.5, - pos.getY() + 0.5, - pos.getZ() + 0.5, - SoundEvents.ENDER_CHEST_CLOSE, - SoundSource.BLOCKS, - 0.5f, - world.random.nextFloat() * 0.1f + 0.9f - ); - } - - @Override - protected void openerCountChanged( - Level world, - BlockPos pos, - BlockState state, - int oldViewerCount, - int newViewerCount - ) { - world.blockEvent(worldPosition, ErisAlchemyRegistry.Blocks.ALCHEMICAL_CHEST, EVENT, newViewerCount); - } - - @Override - protected boolean isOwnContainer(Player player) { - if (player.containerMenu instanceof AlchemicalChestMenu menu) { - return menu.getContainer() == AlchemicalChestBlockEntity.this; - } - return false; - } - }; public AlchemicalChestBlockEntity(BlockPos pos, BlockState state) { super(ErisAlchemyRegistry.BlockEntities.ALCHEMICAL_CHEST, pos, state); } - @Override - public void clearContent() { - items.clear(); - } - @Nonnull @Override - protected AbstractContainerMenu createMenu(int syncId, Inventory playerInventory) { + protected ChestLikeBlockMenu createMenu(int syncId, Inventory playerInventory) { return new AlchemicalChestMenu(syncId, playerInventory, this); } - @Override - public int getContainerSize() { - return items.size(); - } - @Nonnull @Override protected Component getDefaultName() { return Component.translatable("container.eris_alchemy.alchemical_chest"); } - @Nonnull - @Override - public ItemStack getItem(int slot) { - return items.get(slot); - } - - @Override - public float getOpenNess(float tickDelta) { - return lidController.getOpenness(tickDelta); - } - - @Override - public boolean isEmpty() { - return items.stream().allMatch(ItemStack::isEmpty); - } - - @Override - public void load(CompoundTag nbt) { - super.load(nbt); - ContainerHelper.loadAllItems(nbt, items); - } - - private void recheckOpen() { - if (!remove) { - openersCounter.recheckOpeners(getLevel(), getBlockPos(), getBlockState()); - } - } - - @Nonnull - @Override - public ItemStack removeItem(int slot, int amount) { - var stack = ContainerHelper.removeItem(items, slot, amount); - if (!stack.isEmpty()) { - this.setChanged(); - } - return stack; - } - - @Nonnull - @Override - public ItemStack removeItemNoUpdate(int slot) { - return ContainerHelper.takeItem(items, slot); - } - - @Override - protected void saveAdditional(CompoundTag nbt) { - super.saveAdditional(nbt); - ContainerHelper.saveAllItems(nbt, items); - } - @Override - public void setItem(int slot, ItemStack stack) { - items.set(slot, stack); - if (stack.getCount() > getMaxStackSize()) { - stack.setCount(getMaxStackSize()); - } - this.setChanged(); + protected NonNullList getItems() { + return items; } @Override - public void startOpen(Player player) { - if (!remove && !player.isSpectator()) { - openersCounter.incrementOpeners(player, getLevel(), getBlockPos(), getBlockState()); - } - } - - @Override - public boolean stillValid(Player player) { - return Container.stillValidBlockEntity(this, player); - } - - @Override - public void stopOpen(Player player) { - if (!remove && !player.isSpectator()) { - openersCounter.decrementOpeners(player, getLevel(), getBlockPos(), getBlockState()); - } - } - - public void tick(Level world, BlockPos ignoredPos, BlockState ignoredState) { - if (world.isClientSide) { - lidController.tickLid(); - } - recheckOpen(); - } - - @Override - public boolean triggerEvent(int type, int data) { - if (type == EVENT) { - lidController.shouldBeOpen(data > 0); - return true; - } - - return super.triggerEvent(type, data); + protected Block getParent() { + return ErisAlchemyRegistry.Blocks.ALCHEMICAL_CHEST; } } diff --git a/src/main/java/lv/enes/mc/eris_alchemy/block/entity/ChestLikeBlockEntity.java b/src/main/java/lv/enes/mc/eris_alchemy/block/entity/ChestLikeBlockEntity.java new file mode 100644 index 0000000..48b3ad7 --- /dev/null +++ b/src/main/java/lv/enes/mc/eris_alchemy/block/entity/ChestLikeBlockEntity.java @@ -0,0 +1,200 @@ +package lv.enes.mc.eris_alchemy.block.entity; + +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; +import lv.enes.mc.eris_alchemy.menu.ChestLikeBlockMenu; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.*; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class ChestLikeBlockEntity extends BaseContainerBlockEntity implements LidBlockEntity { + protected static final int EVENT_INTERACTED = 1; + + protected final ChestLidController lidController = new ChestLidController(); + protected final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { + @Override + protected void onOpen(Level world, BlockPos pos, BlockState state) { + ChestLikeBlockEntity.this.onOpen(world, pos); + } + + @Override + protected void onClose(Level world, BlockPos pos, BlockState state) { + ChestLikeBlockEntity.this.onClose(world, pos); + } + + @Override + protected void openerCountChanged(Level world, BlockPos pos, BlockState state, int oldViewerCount, int newViewerCount) { + world.blockEvent(worldPosition, getParent(), EVENT_INTERACTED, newViewerCount); + } + + @Override + protected boolean isOwnContainer(Player player) { + if (player.containerMenu instanceof ChestLikeBlockMenu menu) { + return menu.getContainer() == ChestLikeBlockEntity.this; + } + return false; + } + }; + + public ChestLikeBlockEntity( + BlockEntityType type, + BlockPos pos, + BlockState state + ) { + super(type, pos, state); + } + + protected abstract Block getParent(); + protected abstract NonNullList getItems(); + + @Override + public void clearContent() { + getItems().clear(); + } + + @Override + public int getContainerSize() { + return getItems().size(); + } + + @Nonnull + @Override + public ItemStack getItem(int slot) { + return getItems().get(slot); + } + + @Override + public float getOpenNess(float tickDelta) { + return lidController.getOpenness(tickDelta); + } + + @Override + public boolean isEmpty() { + return getItems().stream().allMatch(ItemStack::isEmpty); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + ContainerHelper.loadAllItems(nbt, getItems()); + } + + protected void onClose(@Nullable Level world, BlockPos pos) { + if (world == null) { + return; + } + + world.playSound( + null, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + SoundEvents.CHEST_OPEN, + SoundSource.BLOCKS, + 0.5f, + world.random.nextFloat() * 0.1f + 0.9f + ); + } + + protected void onOpen(@Nullable Level world, BlockPos pos) { + if (world == null) { + return; + } + + world.playSound( + null, + pos.getX() + 0.5, + pos.getY() + 0.5, + pos.getZ() + 0.5, + SoundEvents.CHEST_CLOSE, + SoundSource.BLOCKS, + 0.5f, + world.random.nextFloat() * 0.1f + 0.9f + ); + } + + private void recheckOpen() { + if (!remove) { + openersCounter.recheckOpeners(getLevel(), getBlockPos(), getBlockState()); + } + } + + @Nonnull + @Override + public ItemStack removeItem(int slot, int amount) { + var stack = ContainerHelper.removeItem(getItems(), slot, amount); + if (!stack.isEmpty()) { + this.setChanged(); + } + return stack; + } + + @Nonnull + @Override + public ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(getItems(), slot); + } + + @Override + protected void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); + ContainerHelper.saveAllItems(nbt, getItems()); + } + + @Override + public void setItem(int slot, ItemStack stack) { + getItems().set(slot, stack); + if (stack.getCount() > getMaxStackSize()) { + stack.setCount(getMaxStackSize()); + } + this.setChanged(); + } + + @Override + public void startOpen(Player player) { + if (!remove && !player.isSpectator()) { + openersCounter.incrementOpeners(player, getLevel(), getBlockPos(), getBlockState()); + } + } + + @Override + public boolean stillValid(Player player) { + return Container.stillValidBlockEntity(this, player); + } + + @Override + public void stopOpen(Player player) { + if (!remove && !player.isSpectator()) { + openersCounter.decrementOpeners(player, getLevel(), getBlockPos(), getBlockState()); + } + } + + public void tick(Level world, BlockPos ignoredPos, BlockState ignoredState) { + if (world.isClientSide) { + lidController.tickLid(); + } + recheckOpen(); + } + + + @Override + public boolean triggerEvent(int type, int data) { + if (type == EVENT_INTERACTED) { + lidController.shouldBeOpen(data > 0); + return true; + } + + return super.triggerEvent(type, data); + } +} + -- cgit v1.2.3