1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-09-01 18:17:55 +00:00

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<BlockEntityType<?>>, and always uses this to create the block
entity.

Fixes #23.
This commit is contained in:
Jonathan Coates
2021-12-19 12:40:09 +00:00
parent 7f2758c3ef
commit 6a4b5927bf
12 changed files with 42 additions and 123 deletions

View File

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

View File

@@ -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<? extends TileGeneric> type;
private final Supplier<? extends BlockEntityType<? extends TileGeneric>> type;
public BlockGeneric( Properties settings, BlockEntityType<? extends TileGeneric> type )
public BlockGeneric( Properties settings, @Nonnull Supplier<? extends BlockEntityType<? extends TileGeneric>> type )
{
super( settings );
this.type = type;
}
@Nonnull
public BlockEntityType<? extends TileGeneric> 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 );
}
}

View File

@@ -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<TileComputer>
{
public static final EnumProperty<ComputerState> STATE = EnumProperty.create( "state", ComputerState.class );
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public BlockComputer( Properties settings, ComputerFamily family, BlockEntityType<? extends TileComputer> type )
public BlockComputer( Properties settings, ComputerFamily family, Supplier<BlockEntityType<? extends TileComputer>> type )
{
super( settings, family, type );
registerDefaultState( defaultBlockState().setValue( FACING, Direction.NORTH )
@@ -59,21 +57,4 @@ public class BlockComputer extends BlockComputerBase<TileComputer>
{
return tile instanceof TileComputer ? ComputerItemFactory.create( (TileComputer) tile ) : ItemStack.EMPTY;
}
public BlockEntityType<? extends TileComputer> 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 );
}
}

View File

@@ -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<T extends TileComputerBase> extends BlockGeneric implements IBundledRedstoneBlock
{
@@ -40,12 +41,20 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
private final ComputerFamily family;
protected BlockComputerBase( Properties settings, ComputerFamily family, BlockEntityType<? extends T> type )
protected BlockComputerBase( Properties settings, ComputerFamily family, Supplier<BlockEntityType<? extends T>> type )
{
super( settings, type );
this.family = family;
}
@Nonnull
@Override
@SuppressWarnings( "unchecked" )
public BlockEntityType<? extends T> getType()
{
return (BlockEntityType<? extends T>) super.getType();
}
@Override
@Deprecated
public void onPlace( @Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState oldState, boolean isMoving )

View File

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

View File

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

View File

@@ -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<? extends TileWiredModemFull> type )
public BlockWiredModemFull( Properties settings, Supplier<BlockEntityType<? extends TileWiredModemFull>> 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 );
}
}

View File

@@ -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<? extends TileWirelessModem> type, ComputerFamily family )
public BlockWirelessModem( Properties settings, Supplier<BlockEntityType<? extends TileWirelessModem>> 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<? extends TileWirelessModem> 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 );
}
}

View File

@@ -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<? extends TileMonitor> type, boolean advanced )
public BlockMonitor( Properties settings, Supplier<BlockEntityType<? extends TileMonitor>> 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 );
}
}

View File

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

View File

@@ -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 <T extends BlockEntity> BlockEntityTicker<T> getTicker( Level world, BlockState state, BlockEntityType<T> type )

View File

@@ -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<TileTurtle> 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<? extends TileTurtle> type )
public BlockTurtle( Properties settings, ComputerFamily family, Supplier<BlockEntityType<? extends TileTurtle>> type )
{
super( settings, family, type );
registerDefaultState( getStateDefinition().any()
@@ -191,17 +192,10 @@ public class BlockTurtle extends BlockComputerBase<TileTurtle> 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 <T extends BlockEntity> BlockEntityTicker<T> getTicker( Level world, BlockState state, BlockEntityType<T> 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 );
}
}