Made block entity ticking a little nicer.
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user