From 6a4b5927bf96b1e717ddc84dcc56e6bb034c157f Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 19 Dec 2021 12:40:09 +0000 Subject: [PATCH] Correctly instantiate blocks with their BE type Previously new blocks were being passed their BlockEntityType directly when constructed. However, due to the circular dependency between block entities and blocks, the BlocKEntityType was null. Normally this'd mean that no BE was created when the block is placed. However, Block.newBlockEntity was overridden on all subclasses to ensure that the correct BE was created, /except/ for command computers, which just returned a normal computer TE. This changes all the block constructrs to accept a Supplier>, and always uses this to create the block entity. Fixes #23. --- .../shared/ComputerCraftRegistry.java | 20 ++++++++-------- .../shared/common/BlockGeneric.java | 16 ++++++------- .../shared/computer/blocks/BlockComputer.java | 23 ++----------------- .../computer/blocks/BlockComputerBase.java | 11 ++++++++- .../peripheral/diskdrive/BlockDiskDrive.java | 9 +------- .../peripheral/modem/wired/BlockCable.java | 9 +------- .../modem/wired/BlockWiredModemFull.java | 14 ++--------- .../modem/wireless/BlockWirelessModem.java | 21 ++--------------- .../peripheral/monitor/BlockMonitor.java | 11 ++------- .../peripheral/printer/BlockPrinter.java | 9 +------- .../peripheral/speaker/BlockSpeaker.java | 10 +------- .../shared/turtle/blocks/BlockTurtle.java | 12 +++------- 12 files changed, 42 insertions(+), 123 deletions(-) diff --git a/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java b/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java index ffc9e7b87..f0c0d1809 100644 --- a/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java +++ b/src/main/java/dan200/computercraft/shared/ComputerCraftRegistry.java @@ -95,31 +95,31 @@ public final class ComputerCraftRegistry public static final class ModBlocks { public static final BlockComputer COMPUTER_NORMAL = register( "computer_normal", - new BlockComputer( properties(), ComputerFamily.NORMAL, ComputerCraftRegistry.ModTiles.COMPUTER_NORMAL ) ); + new BlockComputer( properties(), ComputerFamily.NORMAL, () -> ComputerCraftRegistry.ModTiles.COMPUTER_NORMAL ) ); public static final BlockComputer COMPUTER_ADVANCED = register( "computer_advanced", new BlockComputer( properties(), ComputerFamily.ADVANCED, - ComputerCraftRegistry.ModTiles.COMPUTER_ADVANCED ) ); + () -> ComputerCraftRegistry.ModTiles.COMPUTER_ADVANCED ) ); public static final BlockComputer COMPUTER_COMMAND = register( "computer_command", new BlockComputer( FabricBlockSettings.copyOf( Blocks.STONE ) .strength( -1, 6000000.0F ), ComputerFamily.COMMAND, - ComputerCraftRegistry.ModTiles.COMPUTER_COMMAND ) ); + () -> ComputerCraftRegistry.ModTiles.COMPUTER_COMMAND ) ); public static final BlockTurtle TURTLE_NORMAL = register( "turtle_normal", - new BlockTurtle( turtleProperties(), ComputerFamily.NORMAL, ComputerCraftRegistry.ModTiles.TURTLE_NORMAL ) ); + new BlockTurtle( turtleProperties(), ComputerFamily.NORMAL, () -> ModTiles.TURTLE_NORMAL ) ); public static final BlockTurtle TURTLE_ADVANCED = register( "turtle_advanced", - new BlockTurtle( turtleProperties(), ComputerFamily.ADVANCED, ComputerCraftRegistry.ModTiles.TURTLE_ADVANCED ) ); + new BlockTurtle( turtleProperties(), ComputerFamily.ADVANCED, () -> ModTiles.TURTLE_ADVANCED ) ); public static final BlockSpeaker SPEAKER = register( "speaker", new BlockSpeaker( properties() ) ); public static final BlockDiskDrive DISK_DRIVE = register( "disk_drive", new BlockDiskDrive( properties() ) ); public static final BlockPrinter PRINTER = register( "printer", new BlockPrinter( properties() ) ); - public static final BlockMonitor MONITOR_NORMAL = register( "monitor_normal", new BlockMonitor( properties(), ModTiles.MONITOR_NORMAL, false ) ); - public static final BlockMonitor MONITOR_ADVANCED = register( "monitor_advanced", new BlockMonitor( properties(), ModTiles.MONITOR_ADVANCED, true ) ); + public static final BlockMonitor MONITOR_NORMAL = register( "monitor_normal", new BlockMonitor( properties(), () -> ModTiles.MONITOR_NORMAL, false ) ); + public static final BlockMonitor MONITOR_ADVANCED = register( "monitor_advanced", new BlockMonitor( properties(), () -> ModTiles.MONITOR_ADVANCED, true ) ); public static final BlockWirelessModem WIRELESS_MODEM_NORMAL = register( "wireless_modem_normal", - new BlockWirelessModem( properties(), ComputerCraftRegistry.ModTiles.WIRELESS_MODEM_NORMAL, ComputerFamily.NORMAL ) ); + new BlockWirelessModem( properties(), () -> ModTiles.WIRELESS_MODEM_NORMAL, ComputerFamily.NORMAL ) ); public static final BlockWirelessModem WIRELESS_MODEM_ADVANCED = register( "wireless_modem_advanced", - new BlockWirelessModem( properties(), ComputerCraftRegistry.ModTiles.WIRELESS_MODEM_ADVANCED, ComputerFamily.ADVANCED ) ); + new BlockWirelessModem( properties(), () -> ModTiles.WIRELESS_MODEM_ADVANCED, ComputerFamily.ADVANCED ) ); public static final BlockWiredModemFull WIRED_MODEM_FULL = register( "wired_modem_full", - new BlockWiredModemFull( modemProperties(), ComputerCraftRegistry.ModTiles.WIRED_MODEM_FULL ) ); + new BlockWiredModemFull( modemProperties(), () -> ModTiles.WIRED_MODEM_FULL ) ); public static final BlockCable CABLE = register( "cable", new BlockCable( modemProperties() ) ); private static BlockBehaviour.Properties properties() diff --git a/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java b/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java index 3ed0c90c7..7dee1ea0e 100644 --- a/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java +++ b/src/main/java/dan200/computercraft/shared/common/BlockGeneric.java @@ -23,20 +23,22 @@ import net.minecraft.world.phys.BlockHitResult; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Random; +import java.util.function.Supplier; public abstract class BlockGeneric extends BaseEntityBlock { - private final BlockEntityType type; + private final Supplier> type; - public BlockGeneric( Properties settings, BlockEntityType type ) + public BlockGeneric( Properties settings, @Nonnull Supplier> type ) { super( settings ); this.type = type; } + @Nonnull public BlockEntityType getType() { - return type; + return type.get(); } @Override @@ -98,12 +100,8 @@ public abstract class BlockGeneric extends BaseEntityBlock @Nullable @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) + public final BlockEntity newBlockEntity( @Nonnull BlockPos pos, @Nonnull BlockState state ) { - if( this.type != null ) - { - return type.create( pos, state ); - } - return null; + return type.get().create( pos, state ); } } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java index 5e5f2ceda..af892ff05 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputer.java @@ -6,16 +6,13 @@ package dan200.computercraft.shared.computer.blocks; -import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.computer.items.ComputerItemFactory; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -25,13 +22,14 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.function.Supplier; public class BlockComputer extends BlockComputerBase { public static final EnumProperty STATE = EnumProperty.create( "state", ComputerState.class ); public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING; - public BlockComputer( Properties settings, ComputerFamily family, BlockEntityType type ) + public BlockComputer( Properties settings, ComputerFamily family, Supplier> type ) { super( settings, family, type ); registerDefaultState( defaultBlockState().setValue( FACING, Direction.NORTH ) @@ -59,21 +57,4 @@ public class BlockComputer extends BlockComputerBase { return tile instanceof TileComputer ? ComputerItemFactory.create( (TileComputer) tile ) : ItemStack.EMPTY; } - - public BlockEntityType getTypeByFamily( ComputerFamily family ) - { - return switch( family ) - { - case COMMAND -> ComputerCraftRegistry.ModTiles.COMPUTER_COMMAND; - case ADVANCED -> ComputerCraftRegistry.ModTiles.COMPUTER_ADVANCED; - default -> ComputerCraftRegistry.ModTiles.COMPUTER_NORMAL; - }; - } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileComputer( getFamily(), getTypeByFamily( getFamily() ), pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java index 00dd5a4ea..947735d0a 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/BlockComputerBase.java @@ -33,6 +33,7 @@ import net.minecraft.world.phys.Vec3; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.function.Supplier; public abstract class BlockComputerBase extends BlockGeneric implements IBundledRedstoneBlock { @@ -40,12 +41,20 @@ public abstract class BlockComputerBase extends Bloc private final ComputerFamily family; - protected BlockComputerBase( Properties settings, ComputerFamily family, BlockEntityType type ) + protected BlockComputerBase( Properties settings, ComputerFamily family, Supplier> type ) { super( settings, type ); this.family = family; } + @Nonnull + @Override + @SuppressWarnings( "unchecked" ) + public BlockEntityType getType() + { + return (BlockEntityType) super.getType(); + } + @Override @Deprecated public void onPlace( @Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState oldState, boolean isMoving ) diff --git a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java index 3839d391c..6e6288e95 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/diskdrive/BlockDiskDrive.java @@ -37,7 +37,7 @@ public class BlockDiskDrive extends BlockGeneric public BlockDiskDrive( Properties settings ) { - super( settings, ComputerCraftRegistry.ModTiles.DISK_DRIVE ); + super( settings, () -> ComputerCraftRegistry.ModTiles.DISK_DRIVE ); registerDefaultState( getStateDefinition().any() .setValue( FACING, Direction.NORTH ) .setValue( STATE, DiskDriveState.EMPTY ) ); @@ -97,11 +97,4 @@ public class BlockDiskDrive extends BlockGeneric { properties.add( FACING, STATE ); } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileDiskDrive( ComputerCraftRegistry.ModTiles.DISK_DRIVE, pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java index f338e29b4..05c5997f5 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockCable.java @@ -66,7 +66,7 @@ public class BlockCable extends BlockGeneric implements SimpleWaterloggedBlock, public BlockCable( Properties settings ) { - super( settings, ComputerCraftRegistry.ModTiles.CABLE ); + super( settings, () -> ComputerCraftRegistry.ModTiles.CABLE ); registerDefaultState( getStateDefinition().any() .setValue( MODEM, CableModemVariant.None ) @@ -270,11 +270,4 @@ public class BlockCable extends BlockGeneric implements SimpleWaterloggedBlock, .setValue( DOWN, false ); } } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileCable( ComputerCraftRegistry.ModTiles.CABLE, pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java index 2f14df974..1483df080 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wired/BlockWiredModemFull.java @@ -6,24 +6,21 @@ package dan200.computercraft.shared.peripheral.modem.wired; -import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BooleanProperty; -import javax.annotation.Nullable; +import java.util.function.Supplier; public class BlockWiredModemFull extends BlockGeneric { public static final BooleanProperty MODEM_ON = BooleanProperty.create( "modem" ); public static final BooleanProperty PERIPHERAL_ON = BooleanProperty.create( "peripheral" ); - public BlockWiredModemFull( Properties settings, BlockEntityType type ) + public BlockWiredModemFull( Properties settings, Supplier> type ) { super( settings, type ); registerDefaultState( getStateDefinition().any() @@ -36,11 +33,4 @@ public class BlockWiredModemFull extends BlockGeneric { builder.add( MODEM_ON, PERIPHERAL_ON ); } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileWiredModemFull( ComputerCraftRegistry.ModTiles.WIRED_MODEM_FULL, pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java index b3a03e8a6..dedd69ff5 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/modem/wireless/BlockWirelessModem.java @@ -6,7 +6,6 @@ package dan200.computercraft.shared.peripheral.modem.wireless; -import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.peripheral.modem.ModemShapes; @@ -18,7 +17,6 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SimpleWaterloggedBlock; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -31,6 +29,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.function.Supplier; import static dan200.computercraft.shared.util.WaterloggableHelpers.*; @@ -41,7 +40,7 @@ public class BlockWirelessModem extends BlockGeneric implements SimpleWaterlogge private final ComputerFamily family; - public BlockWirelessModem( Properties settings, BlockEntityType type, ComputerFamily family ) + public BlockWirelessModem( Properties settings, Supplier> type, ComputerFamily family ) { super( settings, type ); this.family = family; @@ -101,20 +100,4 @@ public class BlockWirelessModem extends BlockGeneric implements SimpleWaterlogge { builder.add( FACING, ON, WATERLOGGED ); } - - public BlockEntityType getTypeByFamily( ComputerFamily family ) - { - return switch( family ) - { - case ADVANCED -> ComputerCraftRegistry.ModTiles.WIRELESS_MODEM_ADVANCED; - default -> ComputerCraftRegistry.ModTiles.WIRELESS_MODEM_NORMAL; - }; - } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileWirelessModem( getTypeByFamily( family ), family == ComputerFamily.ADVANCED, pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java b/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java index b760dfce8..cb9994af9 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/monitor/BlockMonitor.java @@ -7,7 +7,6 @@ package dan200.computercraft.shared.peripheral.monitor; import dan200.computercraft.api.turtle.FakePlayer; -import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -26,6 +25,7 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.function.Supplier; public class BlockMonitor extends BlockGeneric { @@ -37,7 +37,7 @@ public class BlockMonitor extends BlockGeneric public boolean advanced; - public BlockMonitor( Properties settings, BlockEntityType type, boolean advanced ) + public BlockMonitor( Properties settings, Supplier> type, boolean advanced ) { super( settings, type ); this.advanced = advanced; @@ -100,11 +100,4 @@ public class BlockMonitor extends BlockGeneric { builder.add( ORIENTATION, FACING, STATE ); } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileMonitor( advanced ? ComputerCraftRegistry.ModTiles.MONITOR_ADVANCED : ComputerCraftRegistry.ModTiles.MONITOR_NORMAL, advanced, pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java b/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java index dffbedde4..f5fd6e852 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/printer/BlockPrinter.java @@ -36,7 +36,7 @@ public class BlockPrinter extends BlockGeneric public BlockPrinter( Properties settings ) { - super( settings, ComputerCraftRegistry.ModTiles.PRINTER ); + super( settings, () -> ComputerCraftRegistry.ModTiles.PRINTER ); registerDefaultState( getStateDefinition().any() .setValue( FACING, Direction.NORTH ) .setValue( TOP, false ) @@ -88,11 +88,4 @@ public class BlockPrinter extends BlockGeneric { properties.add( FACING, TOP, BOTTOM ); } - - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TilePrinter( ComputerCraftRegistry.ModTiles.PRINTER, pos, state ); - } } diff --git a/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java b/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java index 73ac34bfc..84836d317 100644 --- a/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java +++ b/src/main/java/dan200/computercraft/shared/peripheral/speaker/BlockSpeaker.java @@ -8,7 +8,6 @@ package dan200.computercraft.shared.peripheral.speaker; import dan200.computercraft.shared.ComputerCraftRegistry; import dan200.computercraft.shared.common.BlockGeneric; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; @@ -29,7 +28,7 @@ public class BlockSpeaker extends BlockGeneric public BlockSpeaker( Properties settings ) { - super( settings, ComputerCraftRegistry.ModTiles.SPEAKER ); + super( settings, () -> ComputerCraftRegistry.ModTiles.SPEAKER ); registerDefaultState( getStateDefinition().any() .setValue( FACING, Direction.NORTH ) ); } @@ -49,13 +48,6 @@ public class BlockSpeaker extends BlockGeneric properties.add( FACING ); } - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileSpeaker( ComputerCraftRegistry.ModTiles.SPEAKER, pos, state ); - } - @Nullable @Override public BlockEntityTicker getTicker( Level world, BlockState state, BlockEntityType type ) diff --git a/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java b/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java index 72b3f477b..ae6315f1d 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java +++ b/src/main/java/dan200/computercraft/shared/turtle/blocks/BlockTurtle.java @@ -42,6 +42,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.function.Supplier; import static dan200.computercraft.shared.util.WaterloggableHelpers.*; import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED; @@ -52,7 +53,7 @@ public class BlockTurtle extends BlockComputerBase implements Simple private static final VoxelShape DEFAULT_SHAPE = Shapes.box( 0.125, 0.125, 0.125, 0.875, 0.875, 0.875 ); - public BlockTurtle( Properties settings, ComputerFamily family, BlockEntityType type ) + public BlockTurtle( Properties settings, ComputerFamily family, Supplier> type ) { super( settings, family, type ); registerDefaultState( getStateDefinition().any() @@ -191,17 +192,10 @@ public class BlockTurtle extends BlockComputerBase implements Simple return ComputerCraftRegistry.ModTiles.TURTLE_NORMAL; } - @Nullable - @Override - public BlockEntity newBlockEntity( BlockPos pos, BlockState state ) - { - return new TileTurtle( getTypeByFamily( getFamily() ), pos, state, getFamily() ); - } - @Nullable @Override public BlockEntityTicker getTicker( Level world, BlockState state, BlockEntityType type ) { - return world.isClientSide ? BlockTurtle.createTickerHelper( type, getTypeByFamily( getFamily() ), ( world1, pos, state1, computer ) -> computer.clientTick() ) : super.getTicker( world, state, type ); + return world.isClientSide ? BlockTurtle.createTickerHelper( type, getType(), ( world1, pos, state1, computer ) -> computer.clientTick() ) : super.getTicker( world, state, type ); } }