From dc6089d34786aa4eb09a558a5d1c08b2237d760f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 28 Jan 2022 13:26:01 +0100 Subject: [PATCH] Made block entity ticking a little nicer. --- .../li/cil/oc2/common/block/ChargerBlock.java | 5 +- .../cil/oc2/common/block/ComputerBlock.java | 4 +- .../oc2/common/block/CreativeEnergyBlock.java | 5 +- .../common/block/NetworkConnectorBlock.java | 4 +- .../blockentity/ChargerBlockEntity.java | 13 ++-- .../blockentity/ComputerBlockEntity.java | 17 ++--- .../CreativeEnergyBlockEntity.java | 10 +-- .../NetworkConnectorBlockEntity.java | 9 +-- .../blockentity/TickableBlockEntity.java | 70 +++++++++++++++++++ 9 files changed, 98 insertions(+), 39 deletions(-) create mode 100644 src/main/java/li/cil/oc2/common/blockentity/TickableBlockEntity.java diff --git a/src/main/java/li/cil/oc2/common/block/ChargerBlock.java b/src/main/java/li/cil/oc2/common/block/ChargerBlock.java index aa58fd35..5f375068 100644 --- a/src/main/java/li/cil/oc2/common/block/ChargerBlock.java +++ b/src/main/java/li/cil/oc2/common/block/ChargerBlock.java @@ -1,8 +1,7 @@ package li.cil.oc2.common.block; import li.cil.oc2.common.blockentity.BlockEntities; -import li.cil.oc2.common.blockentity.ChargerBlockEntity; -import li.cil.oc2.common.util.BlockEntityUtils; +import li.cil.oc2.common.blockentity.TickableBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; @@ -57,7 +56,7 @@ public final class ChargerBlock extends HalfTransparentBlock implements EntityBl @Nullable @Override public BlockEntityTicker getTicker(final Level level, final BlockState state, final BlockEntityType type) { - return BlockEntityUtils.createTicker(type, BlockEntities.CHARGER.get(), ChargerBlockEntity::tick); + return TickableBlockEntity.createTicker(level, type, BlockEntities.CHARGER.get()); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/block/ComputerBlock.java b/src/main/java/li/cil/oc2/common/block/ComputerBlock.java index 6e91570f..41680520 100644 --- a/src/main/java/li/cil/oc2/common/block/ComputerBlock.java +++ b/src/main/java/li/cil/oc2/common/block/ComputerBlock.java @@ -5,10 +5,10 @@ import li.cil.oc2.api.capabilities.RedstoneEmitter; import li.cil.oc2.common.Config; import li.cil.oc2.common.blockentity.BlockEntities; import li.cil.oc2.common.blockentity.ComputerBlockEntity; +import li.cil.oc2.common.blockentity.TickableBlockEntity; import li.cil.oc2.common.capabilities.Capabilities; import li.cil.oc2.common.integration.Wrenches; import li.cil.oc2.common.item.Items; -import li.cil.oc2.common.util.BlockEntityUtils; import li.cil.oc2.common.util.NBTUtils; import li.cil.oc2.common.util.TooltipUtils; import li.cil.oc2.common.util.VoxelShapeUtils; @@ -210,7 +210,7 @@ public final class ComputerBlock extends ImmutableHorizontalBlock implements Ent @Nullable @Override public BlockEntityTicker getTicker(final Level level, final BlockState state, final BlockEntityType type) { - return BlockEntityUtils.createTicker(type, BlockEntities.COMPUTER.get(), ComputerBlockEntity::tick); + return TickableBlockEntity.createTicker(level, type, BlockEntities.COMPUTER.get()); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java b/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java index 283d52b2..fdd5f3af 100644 --- a/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java +++ b/src/main/java/li/cil/oc2/common/block/CreativeEnergyBlock.java @@ -1,8 +1,7 @@ package li.cil.oc2.common.block; import li.cil.oc2.common.blockentity.BlockEntities; -import li.cil.oc2.common.blockentity.CreativeEnergyBlockEntity; -import li.cil.oc2.common.util.BlockEntityUtils; +import li.cil.oc2.common.blockentity.TickableBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -37,6 +36,6 @@ public final class CreativeEnergyBlock extends Block implements EntityBlock { @Nullable @Override public BlockEntityTicker getTicker(final Level level, final BlockState state, final BlockEntityType type) { - return level.isClientSide ? null : BlockEntityUtils.createTicker(type, BlockEntities.CREATIVE_ENERGY.get(), CreativeEnergyBlockEntity::serverTick); + return TickableBlockEntity.createServerTicker(level, type, BlockEntities.CREATIVE_ENERGY.get()); } } diff --git a/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java b/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java index 5655749c..7502cc2a 100644 --- a/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java +++ b/src/main/java/li/cil/oc2/common/block/NetworkConnectorBlock.java @@ -2,7 +2,7 @@ package li.cil.oc2.common.block; import li.cil.oc2.common.blockentity.BlockEntities; import li.cil.oc2.common.blockentity.NetworkConnectorBlockEntity; -import li.cil.oc2.common.util.BlockEntityUtils; +import li.cil.oc2.common.blockentity.TickableBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.BlockGetter; @@ -88,7 +88,7 @@ public final class NetworkConnectorBlock extends FaceAttachedHorizontalDirection @Nullable @Override public BlockEntityTicker getTicker(final Level level, final BlockState state, final BlockEntityType type) { - return level.isClientSide ? null : BlockEntityUtils.createTicker(type, BlockEntities.NETWORK_CONNECTOR.get(), NetworkConnectorBlockEntity::serverTick); + return TickableBlockEntity.createServerTicker(level, type, BlockEntities.NETWORK_CONNECTOR.get()); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/blockentity/ChargerBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/ChargerBlockEntity.java index 147b78c2..453d681e 100644 --- a/src/main/java/li/cil/oc2/common/blockentity/ChargerBlockEntity.java +++ b/src/main/java/li/cil/oc2/common/blockentity/ChargerBlockEntity.java @@ -13,7 +13,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -28,7 +27,7 @@ import java.util.function.Predicate; import static java.util.Collections.singletonList; -public final class ChargerBlockEntity extends ModBlockEntity implements NamedDevice { +public final class ChargerBlockEntity extends ModBlockEntity implements NamedDevice, TickableBlockEntity { private static final Predicate ENTITY_PREDICATE = EntitySelector.NO_SPECTATORS .and(EntitySelector.ENTITY_STILL_ALIVE); @@ -46,8 +45,14 @@ public final class ChargerBlockEntity extends ModBlockEntity implements NamedDev /////////////////////////////////////////////////////////////////// - public static void tick(final Level ignoredLevel, final BlockPos ignoredPos, final BlockState ignoredState, final ChargerBlockEntity charger) { - charger.tick(); + @Override + public void clientTick() { + tick(); + } + + @Override + public void serverTick() { + tick(); } private void tick() { diff --git a/src/main/java/li/cil/oc2/common/blockentity/ComputerBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/ComputerBlockEntity.java index 1f2c6862..9ee369e3 100644 --- a/src/main/java/li/cil/oc2/common/blockentity/ComputerBlockEntity.java +++ b/src/main/java/li/cil/oc2/common/blockentity/ComputerBlockEntity.java @@ -32,7 +32,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; 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.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.capabilities.Capability; @@ -48,7 +47,7 @@ import java.util.*; import static li.cil.oc2.common.Constants.BLOCK_ENTITY_TAG_NAME_IN_ITEM; import static li.cil.oc2.common.Constants.ITEMS_TAG_NAME; -public final class ComputerBlockEntity extends ModBlockEntity implements TerminalUserProvider { +public final class ComputerBlockEntity extends ModBlockEntity implements TerminalUserProvider, TickableBlockEntity { private static final String BUS_ELEMENT_TAG_NAME = "busElement"; private static final String DEVICES_TAG_NAME = "devices"; private static final String TERMINAL_TAG_NAME = "terminal"; @@ -164,19 +163,13 @@ public final class ComputerBlockEntity extends ModBlockEntity implements Termina return LazyOptional.empty(); } - public static void tick(final Level level, final BlockPos ignoredPos, final BlockState ignoredState, final ComputerBlockEntity computer) { - if (level.isClientSide()) { - computer.clientTick(); - } else { - computer.serverTick(); - } - } - - private void clientTick() { + @Override + public void clientTick() { terminal.clientTick(); } - private void serverTick() { + @Override + public void serverTick() { if (level == null) { return; } diff --git a/src/main/java/li/cil/oc2/common/blockentity/CreativeEnergyBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/CreativeEnergyBlockEntity.java index 176444b9..75e4816a 100644 --- a/src/main/java/li/cil/oc2/common/blockentity/CreativeEnergyBlockEntity.java +++ b/src/main/java/li/cil/oc2/common/blockentity/CreativeEnergyBlockEntity.java @@ -4,11 +4,10 @@ import li.cil.oc2.common.capabilities.Capabilities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -public final class CreativeEnergyBlockEntity extends ModBlockEntity { +public final class CreativeEnergyBlockEntity extends ModBlockEntity implements TickableBlockEntity { private final Direction[] SIDES = Direction.values(); /////////////////////////////////////////////////////////////////// @@ -19,11 +18,8 @@ public final class CreativeEnergyBlockEntity extends ModBlockEntity { /////////////////////////////////////////////////////////////////// - public static void serverTick(final Level ignoredLevel, final BlockPos ignoredPos, final BlockState ignoredState, final CreativeEnergyBlockEntity creativeEnergy) { - creativeEnergy.serverTick(); - } - - private void serverTick() { + @Override + public void serverTick() { if (level == null) { return; } diff --git a/src/main/java/li/cil/oc2/common/blockentity/NetworkConnectorBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/NetworkConnectorBlockEntity.java index b567caef..134a604f 100644 --- a/src/main/java/li/cil/oc2/common/blockentity/NetworkConnectorBlockEntity.java +++ b/src/main/java/li/cil/oc2/common/blockentity/NetworkConnectorBlockEntity.java @@ -35,7 +35,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -public final class NetworkConnectorBlockEntity extends ModBlockEntity { +public final class NetworkConnectorBlockEntity extends ModBlockEntity implements TickableBlockEntity { public enum ConnectionResult { SUCCESS, FAILURE, @@ -170,11 +170,8 @@ public final class NetworkConnectorBlockEntity extends ModBlockEntity { NetworkCableRenderer.invalidateConnections(); } - public static void serverTick(final Level ignoredLevel, final BlockPos ignoredPos, final BlockState ignoredState, final NetworkConnectorBlockEntity networkConnector) { - networkConnector.serverTick(); - } - - private void serverTick() { + @Override + public void serverTick() { if (level == null) { return; } diff --git a/src/main/java/li/cil/oc2/common/blockentity/TickableBlockEntity.java b/src/main/java/li/cil/oc2/common/blockentity/TickableBlockEntity.java new file mode 100644 index 00000000..5df8bdc5 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/blockentity/TickableBlockEntity.java @@ -0,0 +1,70 @@ +package li.cil.oc2.common.blockentity; + +import li.cil.oc2.common.util.BlockEntityUtils; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; + +import javax.annotation.Nullable; + +/** + * Convenience interface for enabling side-specific ticking of {@link BlockEntity}s using + * {@link BlockEntityTicker}s. Provides factory methods for all variants, working with + * any block entity implementing this interface. + */ +public interface TickableBlockEntity { + /** + * Called on the client when this {@link BlockEntity} should tick. + *

+ * Only called when registered using {@link #createTicker(Level, BlockEntityType, BlockEntityType)} or + * {@link #createClientTicker(Level, BlockEntityType, BlockEntityType)}. + */ + default void clientTick() { + } + + /** + * Called on the server when this {@link BlockEntity} should tick. + *

+ * Only called when registered using {@link #createTicker(Level, BlockEntityType, BlockEntityType)} or + * {@link #createServerTicker(Level, BlockEntityType, BlockEntityType)}. + */ + default void serverTick() { + } + + /** + * Creates a ticker that will only run on the client. + */ + @Nullable + static BlockEntityTicker createClientTicker(final Level level, final BlockEntityType haveType, final BlockEntityType wantType) { + if (level.isClientSide()) { + return BlockEntityUtils.createTicker(haveType, wantType, (ignoredLevel, blockPos, state, blockEntity) -> blockEntity.clientTick()); + } else { + return null; + } + } + + /** + * Creates a ticker that will only run on the server. + */ + @Nullable + static BlockEntityTicker createServerTicker(final Level level, final BlockEntityType haveType, final BlockEntityType wantType) { + if (level.isClientSide()) { + return null; + } else { + return BlockEntityUtils.createTicker(haveType, wantType, (ignoredLevel, blockPos, state, blockEntity) -> blockEntity.serverTick()); + } + } + + /** + * Creates a ticker for either the client and the server. + */ + @Nullable + static BlockEntityTicker createTicker(final Level level, final BlockEntityType haveType, final BlockEntityType wantType) { + if (level.isClientSide()) { + return BlockEntityUtils.createTicker(haveType, wantType, (ignoredLevel, blockPos, state, blockEntity) -> blockEntity.clientTick()); + } else { + return BlockEntityUtils.createTicker(haveType, wantType, (ignoredLevel, blockPos, state, blockEntity) -> blockEntity.serverTick()); + } + } +}