I encountered the problem that I need custom propeties on blocks to fulfill its functions. But when I tried to implement them the registry object of the block couldn't be use for a BlockItem and so it wasn't created at first. I try to code this mod for 1.18.1.
public class Gate extends Block {
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public static final BooleanProperty INPUT_LEFT = BooleanProperty.create("Input_Left"); // First Custom Property
public static final BooleanProperty INPUT_RIGHT = BooleanProperty.create("Input_Right"); // Second Custom Property
public static final BooleanProperty OUTPUT = BooleanProperty.create("Output"); // Third Custom Property
private static final VoxelShape SHAPE_N = Block.box(0, 0, 0, 16, 1, 16);
private static final VoxelShape SHAPE_S = Block.box(0, 0, 0, 16, 1, 16);
private static final VoxelShape SHAPE_W = Block.box(0, 0, 0, 16, 1, 16);
private static final VoxelShape SHAPE_E = Block.box(0, 0, 0, 16, 1, 16);
public Gate() {
super(Properties.of(Material.HEAVY_METAL, MaterialColor.METAL)
.sound(SoundType.METAL)
.strength(3.0f)
.requiresCorrectToolForDrops()
);
this.defaultBlockState().setValue(FACING, Direction.NORTH);
}
@Override
public @NotNull BlockState mirror(BlockState state, Mirror mirrorIn) {
return state.rotate(mirrorIn.getRotation(state.getValue(FACING)));
}
@Override
public @NotNull BlockState rotate(BlockState state, Rotation rotation) {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)));
}
@Nullable
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection())
.setValue(INPUT_LEFT, false)
.setValue(INPUT_RIGHT, false)
.setValue(OUTPUT, false);
}
@Override
protected void createBlockStateDefinition(StateDefinition.@NotNull Builder<Block, BlockState> builder) {
super.createBlockStateDefinition(builder);
builder.add(FACING);
builder.add(INPUT_LEFT);
builder.add(INPUT_RIGHT);
builder.add(OUTPUT);
}
@Override
public @NotNull VoxelShape getShape(BlockState state, @NotNull BlockGetter getter, @NotNull BlockPos pos, @NotNull CollisionContext context) {
return switch (state.getValue(FACING)) {
case SOUTH -> SHAPE_S;
case WEST -> SHAPE_W;
case EAST -> SHAPE_E;
default -> SHAPE_N;
};
}
}
(I cutted the imports out so the code isn't to long)
I don't know what else it needs to generate the Block (and so the BlockItem) properly... Can somebody say me what I miss to implement them correctly?
This is the RegistryHandler where the error occures (also cutted imports out):
public class RegistryHandler {
// DeferredRegister
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Main.MOD_ID);
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Main.MOD_ID);
// Items
// Blocks
public static final RegistryObject<Block> AND_GATE = BLOCKS.register("and_gate", Gate::new);
// Block Items
public static final RegistryObject<Item> AND_GATE_ITEM = ITEMS.register("and_gate", () -> new BlockItem(AND_GATE.get(), new Item.Properties().tab(Main.LOGICBOARD)));
}