Made block entity ticking a little nicer.

This commit is contained in:
Florian Nücke
2022-01-28 13:26:01 +01:00
parent 4793aee54a
commit dc6089d347
9 changed files with 98 additions and 39 deletions

View File

@@ -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 <T extends BlockEntity> BlockEntityTicker<T> getTicker(final Level level, final BlockState state, final BlockEntityType<T> type) {
return BlockEntityUtils.createTicker(type, BlockEntities.CHARGER.get(), ChargerBlockEntity::tick);
return TickableBlockEntity.createTicker(level, type, BlockEntities.CHARGER.get());
}
///////////////////////////////////////////////////////////////////

View File

@@ -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 <T extends BlockEntity> BlockEntityTicker<T> getTicker(final Level level, final BlockState state, final BlockEntityType<T> type) {
return BlockEntityUtils.createTicker(type, BlockEntities.COMPUTER.get(), ComputerBlockEntity::tick);
return TickableBlockEntity.createTicker(level, type, BlockEntities.COMPUTER.get());
}
///////////////////////////////////////////////////////////////////

View File

@@ -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 <T extends BlockEntity> BlockEntityTicker<T> getTicker(final Level level, final BlockState state, final BlockEntityType<T> type) {
return level.isClientSide ? null : BlockEntityUtils.createTicker(type, BlockEntities.CREATIVE_ENERGY.get(), CreativeEnergyBlockEntity::serverTick);
return TickableBlockEntity.createServerTicker(level, type, BlockEntities.CREATIVE_ENERGY.get());
}
}

View File

@@ -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 <T extends BlockEntity> BlockEntityTicker<T> getTicker(final Level level, final BlockState state, final BlockEntityType<T> type) {
return level.isClientSide ? null : BlockEntityUtils.createTicker(type, BlockEntities.NETWORK_CONNECTOR.get(), NetworkConnectorBlockEntity::serverTick);
return TickableBlockEntity.createServerTicker(level, type, BlockEntities.NETWORK_CONNECTOR.get());
}
///////////////////////////////////////////////////////////////////

View File

@@ -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> 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() {

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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.
* <p>
* 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.
* <p>
* 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 <THave extends BlockEntity, TWant extends BlockEntity & TickableBlockEntity> BlockEntityTicker<THave> createClientTicker(final Level level, final BlockEntityType<THave> haveType, final BlockEntityType<TWant> 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 <THave extends BlockEntity, TWant extends BlockEntity & TickableBlockEntity> BlockEntityTicker<THave> createServerTicker(final Level level, final BlockEntityType<THave> haveType, final BlockEntityType<TWant> 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 <THave extends BlockEntity, TWant extends BlockEntity & TickableBlockEntity> BlockEntityTicker<THave> createTicker(final Level level, final BlockEntityType<THave> haveType, final BlockEntityType<TWant> 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());
}
}
}