Good day fellow Modders,
I'm trying to create Conduits like those for example from Thermal Expansion. I've taken a look a the SixWayBlock class and implemented my Conduit class like this:
package me.danieldererbauer.danielspowerfulmachines.blocks.conduits;
import com.google.common.collect.Maps;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.state.BooleanProperty;
import net.minecraft.state.IProperty;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction;
import net.minecraft.util.Util;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
import net.minecraft.world.IBlockReader;
import javax.annotation.Nullable;
import java.util.Map;
public class EnergyConduit extends Block {
private static final Direction[] FACING_VALUES = Direction.values();
public static final BooleanProperty NORTH;
public static final BooleanProperty EAST;
public static final BooleanProperty SOUTH;
public static final BooleanProperty WEST;
public static final BooleanProperty UP;
public static final BooleanProperty DOWN;
public static final Map<Direction, BooleanProperty> FACING_TO_PROPERTY_MAP;
protected VoxelShape[] shapes;
public EnergyConduit() {
super(Properties
.create(Material.IRON)
.sound(SoundType.METAL)
.hardnessAndResistance(2.0f)
.lightValue(14)
);
setRegistryName("energy_conduit");
shapes = makeShapes(0.25f);
this.setDefaultState(getDefaultState().with(NORTH, false).with(EAST, false).with(SOUTH, false).with(WEST, false).with(UP, false).with(DOWN, false));
}
@Override
public boolean hasTileEntity(BlockState state) {
return true;
}
@Nullable
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return new EnergyConduitTile();
}
@Override
public boolean isNormalCube(BlockState p_220081_1_, IBlockReader p_220081_2_, BlockPos p_220081_3_) {
return false;
}
@Override
public BlockRenderLayer getRenderLayer() {
return BlockRenderLayer.CUTOUT;
}
@Override
public VoxelShape getShape(BlockState blockState, IBlockReader iBlockReader, BlockPos blockPos, ISelectionContext iSelectionContext) {
return this.shapes[this.getShapeIndex(blockState)];
}
//SixWayBlock class
private VoxelShape[] makeShapes(float size) {
float corner_1 = 0.5F - size;
float corner_2 = 0.5F + size;
VoxelShape center_shape = Block.makeCuboidShape((double)(corner_1 * 16.0F), (double)(corner_1 * 16.0F), (double)(corner_1 * 16.0F), (double)(corner_2 * 16.0F), (double)(corner_2 * 16.0F), (double)(corner_2 * 16.0F));
VoxelShape[] outerShapeParts = new VoxelShape[FACING_VALUES.length];
for(int i = 0; i < FACING_VALUES.length; ++i) {
Direction direction = FACING_VALUES[i];
outerShapeParts[i] = VoxelShapes.create(0.5D + Math.min((double)(-size), (double)direction.getXOffset() * 0.5D), 0.5D + Math.min((double)(-size), (double)direction.getYOffset() * 0.5D), 0.5D + Math.min((double)(-size), (double)direction.getZOffset() * 0.5D), 0.5D + Math.max((double)size, (double)direction.getXOffset() * 0.5D), 0.5D + Math.max((double)size, (double)direction.getYOffset() * 0.5D), 0.5D + Math.max((double)size, (double)direction.getZOffset() * 0.5D));
}
VoxelShape[] shapeVariations = new VoxelShape[64];
for(int index = 0; index < 64; ++index) {
VoxelShape shapeToAdd = center_shape;
for(int shift = 0; shift < FACING_VALUES.length; ++shift) {
if ((index & 1 << shift) != 0) {
shapeToAdd = VoxelShapes.or(shapeToAdd, outerShapeParts[shift]);
}
}
shapeVariations[index] = shapeToAdd;
}
return shapeVariations;
}
protected int getShapeIndex(BlockState blockState) {
int shapeIndex = 0;
for(int i = 0; i < FACING_VALUES.length; ++i) {
if ((Boolean)blockState.get((IProperty)FACING_TO_PROPERTY_MAP.get(FACING_VALUES[i]))) {
shapeIndex |= 1 << i;
}
}
return shapeIndex;
}
static {
NORTH = BlockStateProperties.NORTH;
EAST = BlockStateProperties.EAST;
SOUTH = BlockStateProperties.SOUTH;
WEST = BlockStateProperties.WEST;
UP = BlockStateProperties.UP;
DOWN = BlockStateProperties.DOWN;
FACING_TO_PROPERTY_MAP = Util.make(Maps.newEnumMap(Direction.class), (map) -> {
map.put(Direction.NORTH, NORTH);
map.put(Direction.EAST, EAST);
map.put(Direction.SOUTH, SOUTH);
map.put(Direction.WEST, WEST);
map.put(Direction.UP, UP);
map.put(Direction.DOWN, DOWN);
});
}
//
}
(Note: Everything after SixWayBlock class is taken directly from said class)
However when I'm starting the game, this exception gets thrown:
[12:39:43.547] [Client thread/ERROR] [ne.mi.fm.ja.FMLModContainer/]: Exception caught during firing event: Cannot set property BooleanProperty{name=north, clazz=class java.lang.Boolean, values=[true, false]} as it does not exist in Block{minecraft:air}
Index: 1
Listeners:
0: NORMAL
1: ASM: class me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents onBlocksRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
2: ASM: class me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents onItemsRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
3: ASM: class me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents onTileEntityRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
4: ASM: class me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents onContainerRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
5: ASM: class me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents onIRecipeSerializerRegistry(Lnet/minecraftforge/event/RegistryEvent$Register;)V
java.lang.IllegalArgumentException: Cannot set property BooleanProperty{name=north, clazz=class java.lang.Boolean, values=[true, false]} as it does not exist in Block{minecraft:air}
at net.minecraft.state.StateHolder.with(SourceFile:106)
at me.danieldererbauer.danielspowerfulmachines.blocks.conduits.EnergyConduit.<init>(EnergyConduit.java:45)
at me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents.onBlocksRegistry(DanielsPowerfulMachines.java:88)
at net.minecraftforge.eventbus.ASMEventHandler_3_RegistryEvents_onBlocksRegistry_Register.invoke(.dynamic)
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:80)
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:258)
at net.minecraftforge.fml.javafmlmod.FMLModContainer.fireEvent(FMLModContainer.java:106)
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65)
at net.minecraftforge.fml.ModContainer.transitionState(ModContainer.java:112)
at net.minecraftforge.fml.ModList.lambda$dispatchSynchronousEvent$4(ModList.java:110)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at net.minecraftforge.fml.ModList.dispatchSynchronousEvent(ModList.java:110)
at net.minecraftforge.fml.ModList.lambda$static$0(ModList.java:81)
at net.minecraftforge.fml.LifecycleEventProvider.dispatch(LifecycleEventProvider.java:71)
at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:173)
at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$21(ModLoader.java:165)
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:915)
at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:165)
at net.minecraftforge.fml.client.ClientModLoader.lambda$begin$2(ClientModLoader.java:67)
at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:82)
at net.minecraftforge.fml.client.ClientModLoader.begin(ClientModLoader.java:67)
at net.minecraft.client.Minecraft.init(Minecraft.java:454)
at net.minecraft.client.Minecraft.run(Minecraft.java:365)
at net.minecraft.client.main.Main.main(SourceFile:154)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55)
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37)
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:50)
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:68)
at cpw.mods.modlauncher.Launcher.run(Launcher.java:77)
at cpw.mods.modlauncher.Launcher.main(Launcher.java:62)
at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:101)
[12:39:43.574] [Client thread/ERROR] [ne.mi.fm.ja.FMLModContainer/LOADING]: Caught exception during event RegistryEvent.Register<minecraft:block> dispatch for modid danielspowerfulmachines
java.lang.IllegalArgumentException: Cannot set property BooleanProperty{name=north, clazz=class java.lang.Boolean, values=[true, false]} as it does not exist in Block{minecraft:air}
at net.minecraft.state.StateHolder.with(SourceFile:106) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at me.danieldererbauer.danielspowerfulmachines.blocks.conduits.EnergyConduit.<init>(EnergyConduit.java:45) ~[classes/:?] {}
at me.danieldererbauer.danielspowerfulmachines.DanielsPowerfulMachines$RegistryEvents.onBlocksRegistry(DanielsPowerfulMachines.java:88) ~[classes/:?] {}
at net.minecraftforge.eventbus.ASMEventHandler_3_RegistryEvents_onBlocksRegistry_Register.invoke(.dynamic) ~[?:?] {}
at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:80) ~[eventbus-0.10.3-milestone.0.1+1a5fa31-service.jar:?] {}
at net.minecraftforge.eventbus.EventBus.post(EventBus.java:258) ~[eventbus-0.10.3-milestone.0.1+1a5fa31-service.jar:?] {}
at net.minecraftforge.fml.javafmlmod.FMLModContainer.fireEvent(FMLModContainer.java:106) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:27.0] {}
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65) ~[?:1.8.0_212] {}
at java.util.function.Consumer.lambda$andThen$0(Consumer.java:65) ~[?:1.8.0_212] {}
at net.minecraftforge.fml.ModContainer.transitionState(ModContainer.java:112) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.ModList.lambda$dispatchSynchronousEvent$4(ModList.java:110) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[?:1.8.0_212] {}
at net.minecraftforge.fml.ModList.dispatchSynchronousEvent(ModList.java:110) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.ModList.lambda$static$0(ModList.java:81) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.LifecycleEventProvider.dispatch(LifecycleEventProvider.java:71) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.ModLoader.dispatchAndHandleError(ModLoader.java:173) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.ModLoader.lambda$gatherAndInitializeMods$21(ModLoader.java:165) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:915) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.ModLoader.gatherAndInitializeMods(ModLoader.java:165) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at net.minecraftforge.fml.client.ClientModLoader.lambda$begin$2(ClientModLoader.java:67) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {pl:runtimedistcleaner:A}
at net.minecraftforge.fml.client.ClientModLoader.lambda$createRunnableWithCatch$5(ClientModLoader.java:82) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {pl:runtimedistcleaner:A}
at net.minecraftforge.fml.client.ClientModLoader.begin(ClientModLoader.java:67) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.init(Minecraft.java:454) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.Minecraft.run(Minecraft.java:365) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {pl:accesstransformer:B,pl:runtimedistcleaner:A}
at net.minecraft.client.main.Main.main(SourceFile:154) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {pl:runtimedistcleaner:A}
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_212] {}
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_212] {}
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_212] {}
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_212] {}
at net.minecraftforge.userdev.FMLUserdevClientLaunchProvider.lambda$launchService$0(FMLUserdevClientLaunchProvider.java:55) ~[forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:37) [modlauncher-2.1.5.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:50) [modlauncher-2.1.5.jar:?] {}
at cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:68) [modlauncher-2.1.5.jar:?] {}
at cpw.mods.modlauncher.Launcher.run(Launcher.java:77) [modlauncher-2.1.5.jar:?] {}
at cpw.mods.modlauncher.Launcher.main(Launcher.java:62) [modlauncher-2.1.5.jar:?] {}
at net.minecraftforge.userdev.LaunchTesting.main(LaunchTesting.java:101) [forge-1.14.3-27.0.43_mapped_snapshot_20190709-1.14.3.jar:?] {}
Cannot set property BooleanProperty{name=north, clazz=class java.lang.Boolean, values=[true, false]} as it does not exist in Block{minecraft:air}
I'm not sure whether this is a bug in forge or a problem in my class, so I decided to first post in the Forum instead of filing a bug report on GitHub.
If there are any other advises on how to create Conduit-like Blocks in 1.14.3, any help is welcome.
Thanks in advance.