Jump to content

Eedelia01

Members
  • Posts

    9
  • Joined

  • Last visited

Converted

  • Gender
    Undisclosed
  • Personal Text
    I am new!

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Eedelia01's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. Apologies for not posting code, I've been learning a lot about how the Forge works and I've been changing a lot of things as I go. I think I have it to the point where it is trying to register my block in the right place in the right way, but it is complaining now that it isn't able to complete initializing it because apparently it believes the BlockStateContainer is Air? Even though I've looked through all that to make sure all my "this" statements is good. I'm wondering if I just haven't wrapped my head in which the order of this replacement happens and it may be possible that doing when it goes to register my item over BloockDoor. BlockInit (sans all the other types of doors for simplicity) package encom.grid.rezcraft; import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; public class BlockInit { public static final List<Block> BLOCKS = new ArrayList<Block>(); //Vanilla Door Replacer public static final BlockDoor ACACIA_DOOR = new TestDoor("acacia_door", Material.WOOD); } TestDoor package encom.grid.rezcraft; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.BlockHorizontal; import net.minecraft.block.BlockPlanks; import net.minecraft.block.material.EnumPushReaction; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.IStringSerializable; import net.minecraft.util.Mirror; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Rotation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TestDoor extends BlockDoor { public static final PropertyDirection FACING = BlockHorizontal.FACING; public static final PropertyBool OPEN = PropertyBool.create("open"); public static final PropertyEnum<TestDoor.EnumHingePosition> HINGE = PropertyEnum.<TestDoor.EnumHingePosition>create("hinge", TestDoor.EnumHingePosition.class); public static final PropertyBool POWERED = PropertyBool.create("powered"); public static final PropertyEnum<TestDoor.EnumDoorHalf> HALF = PropertyEnum.<TestDoor.EnumDoorHalf>create("half", TestDoor.EnumDoorHalf.class); protected static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D); protected static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D); public TestDoor(String name, Material materialIn) { super(materialIn); BlockInit.BLOCKS.add(this); setUnlocalizedName(name); setHardness(3.0F); setRegistryName((new ResourceLocation("minecraft", "acacia_door"))); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(OPEN, Boolean.valueOf(false)).withProperty(HINGE, TestDoor.EnumHingePosition.LEFT).withProperty(POWERED, Boolean.valueOf(false)).withProperty(HALF, TestDoor.EnumDoorHalf.LOWER)); } public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { state = state.getActualState(source, pos); EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); boolean flag = !((Boolean)state.getValue(OPEN)).booleanValue(); boolean flag1 = state.getValue(HINGE) == TestDoor.EnumHingePosition.RIGHT; switch (enumfacing) { case EAST: default: return flag ? EAST_AABB : (flag1 ? NORTH_AABB : SOUTH_AABB); case SOUTH: return flag ? SOUTH_AABB : (flag1 ? EAST_AABB : WEST_AABB); case WEST: return flag ? WEST_AABB : (flag1 ? SOUTH_AABB : NORTH_AABB); case NORTH: return flag ? NORTH_AABB : (flag1 ? WEST_AABB : EAST_AABB); } } /** * Gets the localized name of this block. Used for the statistics page. */ public String getLocalizedName() { return I18n.translateToLocal((this.getUnlocalizedName() + ".name").replaceAll("tile", "item")); } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube(IBlockState state) { return false; } /** * Determines if an entity can path through this block */ public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return isOpen(combineMetadata(worldIn, pos)); } public boolean isFullCube(IBlockState state) { return false; } private int getCloseSound() { return this.blockMaterial == Material.IRON ? 1011 : 1012; } private int getOpenSound() { return this.blockMaterial == Material.IRON ? 1005 : 1006; } /** * Get the MapColor for this Block and the given BlockState */ public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos) { if (state.getBlock() == Blocks.IRON_DOOR) { return MapColor.IRON; } else if (state.getBlock() == Blocks.OAK_DOOR) { return BlockPlanks.EnumType.OAK.getMapColor(); } else if (state.getBlock() == Blocks.SPRUCE_DOOR) { return BlockPlanks.EnumType.SPRUCE.getMapColor(); } else if (state.getBlock() == Blocks.BIRCH_DOOR) { return BlockPlanks.EnumType.BIRCH.getMapColor(); } else if (state.getBlock() == Blocks.JUNGLE_DOOR) { return BlockPlanks.EnumType.JUNGLE.getMapColor(); } else if (state.getBlock() == Blocks.ACACIA_DOOR) { return BlockPlanks.EnumType.ACACIA.getMapColor(); } else { return state.getBlock() == Blocks.DARK_OAK_DOOR ? BlockPlanks.EnumType.DARK_OAK.getMapColor() : super.getMapColor(state, worldIn, pos); } } /** * Called when the block is right clicked by a player. */ public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (this.blockMaterial == Material.IRON) { return false; } else { BlockPos blockpos = state.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER ? pos : pos.down(); IBlockState iblockstate = pos.equals(blockpos) ? state : worldIn.getBlockState(blockpos); if (iblockstate.getBlock() != this) { return false; } else { state = iblockstate.cycleProperty(OPEN); worldIn.setBlockState(blockpos, state, 10); worldIn.markBlockRangeForRenderUpdate(blockpos, pos); worldIn.playEvent(playerIn, ((Boolean)state.getValue(OPEN)).booleanValue() ? this.getOpenSound() : this.getCloseSound(), pos, 0); return true; } } } public void toggleDoor(World worldIn, BlockPos pos, boolean open) { IBlockState iblockstate = worldIn.getBlockState(pos); if (iblockstate.getBlock() == this) { BlockPos blockpos = iblockstate.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER ? pos : pos.down(); IBlockState iblockstate1 = pos == blockpos ? iblockstate : worldIn.getBlockState(blockpos); if (iblockstate1.getBlock() == this && ((Boolean)iblockstate1.getValue(OPEN)).booleanValue() != open) { worldIn.setBlockState(blockpos, iblockstate1.withProperty(OPEN, Boolean.valueOf(open)), 10); worldIn.markBlockRangeForRenderUpdate(blockpos, pos); worldIn.playEvent((EntityPlayer)null, open ? this.getOpenSound() : this.getCloseSound(), pos, 0); } } } /** * Called when a neighboring block was changed and marks that this state should perform any checks during a neighbor * change. Cases may include when redstone power is updated, cactus blocks popping off due to a neighboring solid * block, etc. */ public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) { if (state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER) { BlockPos blockpos = pos.down(); IBlockState iblockstate = worldIn.getBlockState(blockpos); if (iblockstate.getBlock() != this) { worldIn.setBlockToAir(pos); } else if (blockIn != this) { iblockstate.neighborChanged(worldIn, blockpos, blockIn, fromPos); } } else { boolean flag1 = false; BlockPos blockpos1 = pos.up(); IBlockState iblockstate1 = worldIn.getBlockState(blockpos1); if (iblockstate1.getBlock() != this) { worldIn.setBlockToAir(pos); flag1 = true; } if (!worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos.down(), EnumFacing.UP)) { worldIn.setBlockToAir(pos); flag1 = true; if (iblockstate1.getBlock() == this) { worldIn.setBlockToAir(blockpos1); } } if (flag1) { if (!worldIn.isRemote) { this.dropBlockAsItem(worldIn, pos, state, 0); } } else { boolean flag = worldIn.isBlockPowered(pos) || worldIn.isBlockPowered(blockpos1); if (blockIn != this && (flag || blockIn.getDefaultState().canProvidePower()) && flag != ((Boolean)iblockstate1.getValue(POWERED)).booleanValue()) { worldIn.setBlockState(blockpos1, iblockstate1.withProperty(POWERED, Boolean.valueOf(flag)), 2); if (flag != ((Boolean)state.getValue(OPEN)).booleanValue()) { worldIn.setBlockState(pos, state.withProperty(OPEN, Boolean.valueOf(flag)), 2); worldIn.markBlockRangeForRenderUpdate(pos, pos); worldIn.playEvent((EntityPlayer)null, flag ? this.getOpenSound() : this.getCloseSound(), pos, 0); } } } } } /** * Get the Item that this Block should drop when harvested. */ // public Item getItemDropped(IBlockState state, Random rand, int fortune) // { // return state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER ? Items.AIR : this.getItem(); // } /** * Checks if this block can be placed exactly at the given position. */ public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { if (pos.getY() >= worldIn.getHeight() - 1) { return false; } else { IBlockState state = worldIn.getBlockState(pos.down()); return (state.isTopSolid() || state.getBlockFaceShape(worldIn, pos.down(), EnumFacing.UP) == BlockFaceShape.SOLID) && super.canPlaceBlockAt(worldIn, pos) && super.canPlaceBlockAt(worldIn, pos.up()); } } public EnumPushReaction getMobilityFlag(IBlockState state) { return EnumPushReaction.DESTROY; } public static int combineMetadata(IBlockAccess worldIn, BlockPos pos) { IBlockState iblockstate = worldIn.getBlockState(pos); int i = iblockstate.getBlock().getMetaFromState(iblockstate); boolean flag = isTop(i); IBlockState iblockstate1 = worldIn.getBlockState(pos.down()); int j = iblockstate1.getBlock().getMetaFromState(iblockstate1); int k = flag ? j : i; IBlockState iblockstate2 = worldIn.getBlockState(pos.up()); int l = iblockstate2.getBlock().getMetaFromState(iblockstate2); int i1 = flag ? i : l; boolean flag1 = (i1 & 1) != 0; boolean flag2 = (i1 & 2) != 0; return removeHalfBit(k) | (flag ? 8 : 0) | (flag1 ? 16 : 0) | (flag2 ? 32 : 0); } public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) { return new ItemStack(this.getItem()); } private Item getItem() { if (this == Blocks.IRON_DOOR) { return Items.IRON_DOOR; } else if (this == Blocks.SPRUCE_DOOR) { return Items.SPRUCE_DOOR; } else if (this == Blocks.BIRCH_DOOR) { return Items.BIRCH_DOOR; } else if (this == Blocks.JUNGLE_DOOR) { return Items.JUNGLE_DOOR; } else if (this == Blocks.ACACIA_DOOR) { return Items.ACACIA_DOOR; } else { return this == Blocks.DARK_OAK_DOOR ? Items.DARK_OAK_DOOR : Items.OAK_DOOR; } } /** * Called before the Block is set to air in the world. Called regardless of if the player's tool can actually * collect this block */ public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { BlockPos blockpos = pos.down(); BlockPos blockpos1 = pos.up(); if (player.capabilities.isCreativeMode && state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER && worldIn.getBlockState(blockpos).getBlock() == this) { worldIn.setBlockToAir(blockpos); } if (state.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER && worldIn.getBlockState(blockpos1).getBlock() == this) { if (player.capabilities.isCreativeMode) { worldIn.setBlockToAir(pos); } worldIn.setBlockToAir(blockpos1); } } @SideOnly(Side.CLIENT) public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT; } /** * Get the actual Block state of this Block at the given position. This applies properties not visible in the * metadata, such as fence connections. */ public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { if (state.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER) { IBlockState iblockstate = worldIn.getBlockState(pos.up()); if (iblockstate.getBlock() == this) { state = state.withProperty(HINGE, iblockstate.getValue(HINGE)).withProperty(POWERED, iblockstate.getValue(POWERED)); } } else { IBlockState iblockstate1 = worldIn.getBlockState(pos.down()); if (iblockstate1.getBlock() == this) { state = state.withProperty(FACING, iblockstate1.getValue(FACING)).withProperty(OPEN, iblockstate1.getValue(OPEN)); } } return state; } /** * Returns the blockstate with the given rotation from the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withRotation(IBlockState state, Rotation rot) { return state.getValue(HALF) != TestDoor.EnumDoorHalf.LOWER ? state : state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); } /** * Returns the blockstate with the given mirror of the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return mirrorIn == Mirror.NONE ? state : state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))).cycleProperty(HINGE); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return (meta & 8) > 0 ? this.getDefaultState().withProperty(HALF, TestDoor.EnumDoorHalf.UPPER).withProperty(HINGE, (meta & 1) > 0 ? TestDoor.EnumHingePosition.RIGHT : TestDoor.EnumHingePosition.LEFT).withProperty(POWERED, Boolean.valueOf((meta & 2) > 0)) : this.getDefaultState().withProperty(HALF, TestDoor.EnumDoorHalf.LOWER).withProperty(FACING, EnumFacing.getHorizontal(meta & 3).rotateYCCW()).withProperty(OPEN, Boolean.valueOf((meta & 4) > 0)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { int i = 0; if (state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER) { i = i | 8; if (state.getValue(HINGE) == TestDoor.EnumHingePosition.RIGHT) { i |= 1; } if (((Boolean)state.getValue(POWERED)).booleanValue()) { i |= 2; } } else { i = i | ((EnumFacing)state.getValue(FACING)).rotateY().getHorizontalIndex(); if (((Boolean)state.getValue(OPEN)).booleanValue()) { i |= 4; } } return i; } protected static int removeHalfBit(int meta) { return meta & 7; } public static boolean isOpen(IBlockAccess worldIn, BlockPos pos) { return isOpen(combineMetadata(worldIn, pos)); } public static EnumFacing getFacing(IBlockAccess worldIn, BlockPos pos) { return getFacing(combineMetadata(worldIn, pos)); } public static EnumFacing getFacing(int combinedMeta) { return EnumFacing.getHorizontal(combinedMeta & 3).rotateYCCW(); } protected static boolean isOpen(int combinedMeta) { return (combinedMeta & 4) != 0; } protected static boolean isTop(int meta) { return (meta & 8) != 0; } protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {HALF, FACING, OPEN, HINGE, POWERED}); } /** * Get the geometry of the queried face at the given position and state. This is used to decide whether things like * buttons are allowed to be placed on the face, or how glass panes connect to the face, among other things. * <p> * Common values are {@code SOLID}, which is the default, and {@code UNDEFINED}, which represents something that * does not fit the other descriptions and will generally cause other things not to connect to the face. * * @return an approximation of the form of the given face */ public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { return BlockFaceShape.UNDEFINED; } public static enum EnumDoorHalf implements IStringSerializable { UPPER, LOWER; public String toString() { return this.getName(); } public String getName() { return this == UPPER ? "upper" : "lower"; } } public static enum EnumHingePosition implements IStringSerializable { LEFT, RIGHT; public String toString() { return this.getName(); } public String getName() { return this == LEFT ? "left" : "right"; } } } RegistryHandler package encom.grid.rezcraft; import net.minecraft.block.Block; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @EventBusSubscriber public class RegistryHandler { @SubscribeEvent public static void registerBlocks(RegistryEvent.Register<Block> event) { event.getRegistry().registerAll(BlockInit.BLOCKS.toArray(new Block[0])); } } Error Caused by: java.lang.IllegalArgumentException: Cannot set property PropertyEnum{name=hinge, clazz=class net.minecraft.block.BlockDoor$EnumHingePosition, values=[left, right]} as it does not exist in BlockStateContainer{block=minecraft:air, properties=[facing, half, hinge, open, powered]} at net.minecraft.block.state.BlockStateContainer$StateImplementation.withProperty(BlockStateContainer.java:221) ~[BlockStateContainer$StateImplementation.class:?] at net.minecraft.block.BlockDoor.<init>(BlockDoor.java:48) ~[BlockDoor.class:?] at encom.grid.rezcraft.TestDoor.<init>(TestDoor.java:53) ~[TestDoor.class:?] at encom.grid.rezcraft.BlockInit.<clinit>(BlockInit.java:16) ~[BlockInit.class:?]
  2. So I hear what you're saying, so after tinkering with it all day I decided to blow it away, copy BlockDoor and modify it only so that classes and methods referred to it as TestDoor. now this causes problems because in the middle of BlockDoor it wants to run some comparisons between this = this.Blocks.ACACIA_DOOR, etc, to determine what item to drop.The comparison fails because TestDoor and BlockDoor can't be compared, as ACACIA_DOOR is defined as type BlockDoor in Blocks.java. I've been working on a way to add this functionality via my own BlocksInit second, but for the time being I just commented those 3 sections of code out. I wanted to see if it would render them or throw compile errors if it was just up to a watered down TestDoor and an EventSubscriber as listed above. Essentially, it threw the same error. I think this error is basically saying listen, you can't take TestDoor and stick it into Blocks.ACACIA_DOOR. I'm guessing it wants to see a type BlockDoor for this. I make a TestDoor that's an actual extension of BlockDoor add in a Initializer, I'll get no build errors, but the same result. Purple Checkered Doors. I read on a troubleshooting guide that this can be caused by: Your Block registration is not being called (must be called during preInitialisation) You have passed the wrong block to registerBlock, or the block instance is null. You haven't set the appropriate creative tab in your Block I've made sure all the setCreativeTab stuff works, that part is fine. If I make TestDoor an extension of BlockDoor and code accordingly, it seems to register the block but doesn't render correctly. If I make TestDoor an extention of door, it looks like it considers that the wrong type of block for the field and won't let me overwrite the vanilla one. I'm still not sure if I should or shot not be extending but I imagine it's way more mod/user friendly if I did. I've tried following some guides on how to do custom doors online with the goal of perhaps creating a "custom" door that is basically like the vanilla one and then overloading the vanilla one with it but this method doesn't seem to be working. The upswing is I now know doors in vanilla are instantiated and created, but I'm stuck for the time being on figuring it out any further.
  3. Caused by: java.lang.IllegalArgumentException: Can not set static net.minecraft.block.BlockDoor field net.minecraft.init.Blocks.ACACIA_DOOR to encom.grid.rezcraft.TestDoor This is definitely my root cause now. The problem is I'm not sure if this means that I've malformed my setRegistry command or if it's just telling me that I can't do this.
  4. I'm 2 days in on revamping my 1.8 basemod to work as a 1.12.2 standalone mod and I am in so far over my head. My basemod worked as a kind of total conversion mod which basically forced Minecraft to start handling transparency renderings on vanilla Ore blocks, doors, and some other items, so I could make them look like glass with a fancy texture. To be clear, I want the base game to let it's base models support transparencies. That's all. Without a good way to get MCP working for 1.12.2, I decided to try and make a mod for this. It's been rough. My path has been to basically clone the .java of a given file, mod it enough so that it's essentially packaged like a custom block and then try to use an event handler to slip in my version of the vanilla block instead of its version during Registration. Is that the right way to do this? I have no idea. I managed to clone BlockOre and package it as a TestOre.java and then use some of the code I found here to load it in. Handler: package encom.grid.rezcraft; import encom.grid.rezcraft.TestOre; import encom.grid.rezcraft.TestDoor; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.ResourceLocation; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = TestOre.MODID) public final class EventSubscriber { @SubscribeEvent static void onBlockRegister(final RegistryEvent.Register<Block> event) { event.getRegistry().register(new TestOre().setHardness(3.0F).setResistance(5.0F).setUnlocalizedName("oreIron").setRegistryName(new ResourceLocation("minecraft", "iron_ore"))); event.getRegistry().register(new TestOre().setHardness(3.0F).setResistance(5.0F).setUnlocalizedName("oreDiamond").setRegistryName(new ResourceLocation("minecraft", "diamond_ore"))); event.getRegistry().register(new TestDoor(Material.WOOD).setHardness(3.0F).setUnlocalizedName("doorAcacia").setRegistryName(new ResourceLocation("minecraft", "acacia_door"))); } } The ore part works great, the door not so much. Cloning the BlockDoor.java file has been quite an undertaking. package encom.grid.rezcraft; import java.util.Random; import init.BlockInit; import net.minecraft.block.Block; import net.minecraft.block.BlockHorizontal; import net.minecraft.block.BlockPlanks; import net.minecraft.block.material.EnumPushReaction; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.IStringSerializable; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TestDoor extends Block { public static final PropertyDirection FACING = BlockHorizontal.FACING; public static final PropertyBool OPEN = PropertyBool.create("open"); public static final PropertyEnum<TestDoor.EnumHingePosition> HINGE = PropertyEnum.<TestDoor.EnumHingePosition>create("hinge", TestDoor.EnumHingePosition.class); public static final PropertyBool POWERED = PropertyBool.create("powered"); public static final PropertyEnum<TestDoor.EnumDoorHalf> HALF = PropertyEnum.<TestDoor.EnumDoorHalf>create("half", TestDoor.EnumDoorHalf.class); protected static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D); protected static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D); public TestDoor(Material materialIn) { super(materialIn); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(OPEN, Boolean.valueOf(false)).withProperty(HINGE, TestDoor.EnumHingePosition.LEFT).withProperty(POWERED, Boolean.valueOf(false)).withProperty(HALF, TestDoor.EnumDoorHalf.LOWER)); } public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { state = state.getActualState(source, pos); EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); boolean flag = !((Boolean)state.getValue(OPEN)).booleanValue(); boolean flag1 = state.getValue(HINGE) == TestDoor.EnumHingePosition.RIGHT; switch (enumfacing) { case EAST: default: return flag ? EAST_AABB : (flag1 ? NORTH_AABB : SOUTH_AABB); case SOUTH: return flag ? SOUTH_AABB : (flag1 ? EAST_AABB : WEST_AABB); case WEST: return flag ? WEST_AABB : (flag1 ? SOUTH_AABB : NORTH_AABB); case NORTH: return flag ? NORTH_AABB : (flag1 ? WEST_AABB : EAST_AABB); } } /** * Gets the localized name of this block. Used for the statistics page. */ public String getLocalizedName() { return I18n.translateToLocal((this.getUnlocalizedName() + ".name").replaceAll("tile", "item")); } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube(IBlockState state) { return false; } /** * Determines if an entity can path through this block */ public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return isOpen(combineMetadata(worldIn, pos)); } public boolean isFullCube(IBlockState state) { return false; } private int getCloseSound() { return this.blockMaterial == Material.IRON ? 1011 : 1012; } private int getOpenSound() { return this.blockMaterial == Material.IRON ? 1005 : 1006; } /** * Get the MapColor for this Block and the given BlockState */ public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos) { if (state.getBlock() == Blocks.IRON_DOOR) { return MapColor.IRON; } else if (state.getBlock() == Blocks.OAK_DOOR) { return BlockPlanks.EnumType.OAK.getMapColor(); } else if (state.getBlock() == Blocks.SPRUCE_DOOR) { return BlockPlanks.EnumType.SPRUCE.getMapColor(); } else if (state.getBlock() == Blocks.BIRCH_DOOR) { return BlockPlanks.EnumType.BIRCH.getMapColor(); } else if (state.getBlock() == Blocks.JUNGLE_DOOR) { return BlockPlanks.EnumType.JUNGLE.getMapColor(); } else if (state.getBlock() == Blocks.ACACIA_DOOR) { return BlockPlanks.EnumType.ACACIA.getMapColor(); } else { return state.getBlock() == Blocks.DARK_OAK_DOOR ? BlockPlanks.EnumType.DARK_OAK.getMapColor() : super.getMapColor(state, worldIn, pos); } } /** * Called when the block is right clicked by a player. */ public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (this.blockMaterial == Material.IRON) { return false; } else { BlockPos blockpos = state.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER ? pos : pos.down(); IBlockState iblockstate = pos.equals(blockpos) ? state : worldIn.getBlockState(blockpos); if (iblockstate.getBlock() != this) { return false; } else { state = iblockstate.cycleProperty(OPEN); worldIn.setBlockState(blockpos, state, 10); worldIn.markBlockRangeForRenderUpdate(blockpos, pos); worldIn.playEvent(playerIn, ((Boolean)state.getValue(OPEN)).booleanValue() ? this.getOpenSound() : this.getCloseSound(), pos, 0); return true; } } } public void toggleDoor(World worldIn, BlockPos pos, boolean open) { IBlockState iblockstate = worldIn.getBlockState(pos); if (iblockstate.getBlock() == this) { BlockPos blockpos = iblockstate.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER ? pos : pos.down(); IBlockState iblockstate1 = pos == blockpos ? iblockstate : worldIn.getBlockState(blockpos); if (iblockstate1.getBlock() == this && ((Boolean)iblockstate1.getValue(OPEN)).booleanValue() != open) { worldIn.setBlockState(blockpos, iblockstate1.withProperty(OPEN, Boolean.valueOf(open)), 10); worldIn.markBlockRangeForRenderUpdate(blockpos, pos); worldIn.playEvent((EntityPlayer)null, open ? this.getOpenSound() : this.getCloseSound(), pos, 0); } } } /** * Called when a neighboring block was changed and marks that this state should perform any checks during a neighbor * change. Cases may include when redstone power is updated, cactus blocks popping off due to a neighboring solid * block, etc. */ public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) { if (state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER) { BlockPos blockpos = pos.down(); IBlockState iblockstate = worldIn.getBlockState(blockpos); if (iblockstate.getBlock() != this) { worldIn.setBlockToAir(pos); } else if (blockIn != this) { iblockstate.neighborChanged(worldIn, blockpos, blockIn, fromPos); } } else { boolean flag1 = false; BlockPos blockpos1 = pos.up(); IBlockState iblockstate1 = worldIn.getBlockState(blockpos1); if (iblockstate1.getBlock() != this) { worldIn.setBlockToAir(pos); flag1 = true; } if (!worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos.down(), EnumFacing.UP)) { worldIn.setBlockToAir(pos); flag1 = true; if (iblockstate1.getBlock() == this) { worldIn.setBlockToAir(blockpos1); } } if (flag1) { if (!worldIn.isRemote) { this.dropBlockAsItem(worldIn, pos, state, 0); } } else { boolean flag = worldIn.isBlockPowered(pos) || worldIn.isBlockPowered(blockpos1); if (blockIn != this && (flag || blockIn.getDefaultState().canProvidePower()) && flag != ((Boolean)iblockstate1.getValue(POWERED)).booleanValue()) { worldIn.setBlockState(blockpos1, iblockstate1.withProperty(POWERED, Boolean.valueOf(flag)), 2); if (flag != ((Boolean)state.getValue(OPEN)).booleanValue()) { worldIn.setBlockState(pos, state.withProperty(OPEN, Boolean.valueOf(flag)), 2); worldIn.markBlockRangeForRenderUpdate(pos, pos); worldIn.playEvent((EntityPlayer)null, flag ? this.getOpenSound() : this.getCloseSound(), pos, 0); } } } } } /** * Get the Item that this Block should drop when harvested. */ public Item getItemDropped(IBlockState state, Random rand, int fortune) { return state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER ? Items.AIR : this.getItem(); } /** * Checks if this block can be placed exactly at the given position. */ public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { if (pos.getY() >= worldIn.getHeight() - 1) { return false; } else { IBlockState state = worldIn.getBlockState(pos.down()); return (state.isTopSolid() || state.getBlockFaceShape(worldIn, pos.down(), EnumFacing.UP) == BlockFaceShape.SOLID) && super.canPlaceBlockAt(worldIn, pos) && super.canPlaceBlockAt(worldIn, pos.up()); } } public EnumPushReaction getMobilityFlag(IBlockState state) { return EnumPushReaction.DESTROY; } public static int combineMetadata(IBlockAccess worldIn, BlockPos pos) { IBlockState iblockstate = worldIn.getBlockState(pos); int i = iblockstate.getBlock().getMetaFromState(iblockstate); boolean flag = isTop(i); IBlockState iblockstate1 = worldIn.getBlockState(pos.down()); int j = iblockstate1.getBlock().getMetaFromState(iblockstate1); int k = flag ? j : i; IBlockState iblockstate2 = worldIn.getBlockState(pos.up()); int l = iblockstate2.getBlock().getMetaFromState(iblockstate2); int i1 = flag ? i : l; boolean flag1 = (i1 & 1) != 0; boolean flag2 = (i1 & 2) != 0; return removeHalfBit(k) | (flag ? 8 : 0) | (flag1 ? 16 : 0) | (flag2 ? 32 : 0); } public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) { return new ItemStack(this.getItem()); } private Item getItem() { if (this == BlockInit.IRON_DOOR) { return Items.IRON_DOOR; } else if (this == BlockInit.SPRUCE_DOOR) { return Items.SPRUCE_DOOR; } else if (this == BlockInit.BIRCH_DOOR) { return Items.BIRCH_DOOR; } else if (this == BlockInit.JUNGLE_DOOR) { return Items.JUNGLE_DOOR; } else if (this == BlockInit.ACACIA_DOOR) { return Items.ACACIA_DOOR; } else { return this == BlockInit.DARK_OAK_DOOR ? Items.DARK_OAK_DOOR : Items.OAK_DOOR; } } /** * Called before the Block is set to air in the world. Called regardless of if the player's tool can actually * collect this block */ public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { BlockPos blockpos = pos.down(); BlockPos blockpos1 = pos.up(); if (player.capabilities.isCreativeMode && state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER && worldIn.getBlockState(blockpos).getBlock() == this) { worldIn.setBlockToAir(blockpos); } if (state.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER && worldIn.getBlockState(blockpos1).getBlock() == this) { if (player.capabilities.isCreativeMode) { worldIn.setBlockToAir(pos); } worldIn.setBlockToAir(blockpos1); } } @Override @SideOnly(Side.CLIENT) public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.TRANSLUCENT; } /** * Get the actual Block state of this Block at the given position. This applies properties not visible in the * metadata, such as fence connections. */ public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { if (state.getValue(HALF) == TestDoor.EnumDoorHalf.LOWER) { IBlockState iblockstate = worldIn.getBlockState(pos.up()); if (iblockstate.getBlock() == this) { state = state.withProperty(HINGE, iblockstate.getValue(HINGE)).withProperty(POWERED, iblockstate.getValue(POWERED)); } } else { IBlockState iblockstate1 = worldIn.getBlockState(pos.down()); if (iblockstate1.getBlock() == this) { state = state.withProperty(FACING, iblockstate1.getValue(FACING)).withProperty(OPEN, iblockstate1.getValue(OPEN)); } } return state; } /** * Returns the blockstate with the given rotation from the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withRotation(IBlockState state, Rotation rot) { return state.getValue(HALF) != TestDoor.EnumDoorHalf.LOWER ? state : state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); } /** * Returns the blockstate with the given mirror of the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return mirrorIn == Mirror.NONE ? state : state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))).cycleProperty(HINGE); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return (meta & 8) > 0 ? this.getDefaultState().withProperty(HALF, TestDoor.EnumDoorHalf.UPPER).withProperty(HINGE, (meta & 1) > 0 ? TestDoor.EnumHingePosition.RIGHT : TestDoor.EnumHingePosition.LEFT).withProperty(POWERED, Boolean.valueOf((meta & 2) > 0)) : this.getDefaultState().withProperty(HALF, TestDoor.EnumDoorHalf.LOWER).withProperty(FACING, EnumFacing.getHorizontal(meta & 3).rotateYCCW()).withProperty(OPEN, Boolean.valueOf((meta & 4) > 0)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { int i = 0; if (state.getValue(HALF) == TestDoor.EnumDoorHalf.UPPER) { i = i | 8; if (state.getValue(HINGE) == TestDoor.EnumHingePosition.RIGHT) { i |= 1; } if (((Boolean)state.getValue(POWERED)).booleanValue()) { i |= 2; } } else { i = i | ((EnumFacing)state.getValue(FACING)).rotateY().getHorizontalIndex(); if (((Boolean)state.getValue(OPEN)).booleanValue()) { i |= 4; } } return i; } protected static int removeHalfBit(int meta) { return meta & 7; } public static boolean isOpen(IBlockAccess worldIn, BlockPos pos) { return isOpen(combineMetadata(worldIn, pos)); } public static EnumFacing getFacing(IBlockAccess worldIn, BlockPos pos) { return getFacing(combineMetadata(worldIn, pos)); } public static EnumFacing getFacing(int combinedMeta) { return EnumFacing.getHorizontal(combinedMeta & 3).rotateYCCW(); } protected static boolean isOpen(int combinedMeta) { return (combinedMeta & 4) != 0; } protected static boolean isTop(int meta) { return (meta & 8) != 0; } protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {HALF, FACING, OPEN, HINGE, POWERED}); } /** * Get the geometry of the queried face at the given position and state. This is used to decide whether things like * buttons are allowed to be placed on the face, or how glass panes connect to the face, among other things. * <p> * Common values are {@code SOLID}, which is the default, and {@code UNDEFINED}, which represents something that * does not fit the other descriptions and will generally cause other things not to connect to the face. * * @return an approximation of the form of the given face */ public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { return BlockFaceShape.UNDEFINED; } public static enum EnumDoorHalf implements IStringSerializable { UPPER, LOWER; public String toString() { return this.getName(); } public String getName() { return this == UPPER ? "upper" : "lower"; } } public static enum EnumHingePosition implements IStringSerializable { LEFT, RIGHT; public String toString() { return this.getName(); } public String getName() { return this == LEFT ? "left" : "right"; } } } Because BlockDoor.java does some comparison with some of the information in Blocks.*class* and a comparison between BlockDoor and TestDoor was invalid, writing an Init for it seemed to fix that particular problem. package init; import java.util.ArrayList; import java.util.List; import encom.grid.rezcraft.TestDoor; import net.minecraft.block.Block; import net.minecraft.block.material.Material; public class BlockInit { public static final List<Block> Blocks = new ArrayList<Block>(); //Vanilla Door Replacer public static final Block IRON_DOOR = new TestDoor(Material.IRON); public static final Block ACACIA_DOOR = new TestDoor(Material.WOOD); public static final Block SPRUCE_DOOR = new TestDoor(Material.WOOD); public static final Block JUNGLE_DOOR = new TestDoor(Material.WOOD); public static final Block BIRCH_DOOR = new TestDoor(Material.WOOD); public static final Block DARK_OAK_DOOR = new TestDoor(Material.WOOD); } All of these files seem to check out, however when I run the game, I get a really ugly error and doors show up as checkered rectangles. The error: [07:19:56] [Client thread/WARN] [FML]: Unable to set public static net.minecraft.block.BlockDoor net.minecraft.init.Blocks.ACACIA_DOOR with value Block{minecraft:acacia_door} (minecraft:acacia_door) is confusing. I don't know if that means that I *can't* load a value there or if I was just bad about telling it about it. [07:19:56] [Client thread/WARN] [FML]: Unable to set public static net.minecraft.block.BlockDoor net.minecraft.init.Blocks.ACACIA_DOOR with value Block{minecraft:acacia_door} (minecraft:acacia_door) java.lang.reflect.InvocationTargetException: null at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.registries.ObjectHolderRef$FinalFieldHelper.setField(ObjectHolderRef.java:180) ~[ObjectHolderRef$FinalFieldHelper.class:?] at net.minecraftforge.registries.ObjectHolderRef.apply(ObjectHolderRef.java:146) [ObjectHolderRef.class:?] at net.minecraftforge.registries.ObjectHolderRegistry.applyObjectHolders(ObjectHolderRegistry.java:170) [ObjectHolderRegistry.class:?] at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:848) [GameData.class:?] at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:630) [Loader.class:?] at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252) [FMLClientHandler.class:?] at net.minecraft.client.Minecraft.init(Minecraft.java:514) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:422) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:25) [start/:?] Caused by: java.lang.IllegalArgumentException: Can not set static net.minecraft.block.BlockDoor field net.minecraft.init.Blocks.ACACIA_DOOR to encom.grid.rezcraft.TestDoor at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[?:1.8.0_231] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[?:1.8.0_231] at sun.reflect.UnsafeStaticObjectFieldAccessorImpl.set(UnsafeStaticObjectFieldAccessorImpl.java:79) ~[?:1.8.0_231] ... 24 more [07:19:56] [Client thread/INFO] [FML]: Holder lookups applied [07:19:56] [Client thread/INFO] [FML]: Applying holder lookups [07:19:56] [Client thread/WARN] [FML]: Unable to set public static net.minecraft.block.BlockDoor net.minecraft.init.Blocks.ACACIA_DOOR with value Block{minecraft:acacia_door} (minecraft:acacia_door) java.lang.reflect.InvocationTargetException: null at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.registries.ObjectHolderRef$FinalFieldHelper.setField(ObjectHolderRef.java:180) ~[ObjectHolderRef$FinalFieldHelper.class:?] at net.minecraftforge.registries.ObjectHolderRef.apply(ObjectHolderRef.java:146) [ObjectHolderRef.class:?] at net.minecraftforge.registries.ObjectHolderRegistry.applyObjectHolders(ObjectHolderRegistry.java:170) [ObjectHolderRegistry.class:?] at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:853) [GameData.class:?] at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:630) [Loader.class:?] at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252) [FMLClientHandler.class:?] at net.minecraft.client.Minecraft.init(Minecraft.java:514) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:422) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:25) [start/:?] Caused by: java.lang.IllegalArgumentException: Can not set static net.minecraft.block.BlockDoor field net.minecraft.init.Blocks.ACACIA_DOOR to encom.grid.rezcraft.TestDoor at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[?:1.8.0_231] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[?:1.8.0_231] at sun.reflect.UnsafeStaticObjectFieldAccessorImpl.set(UnsafeStaticObjectFieldAccessorImpl.java:79) ~[?:1.8.0_231] ... 24 more [07:19:56] [Client thread/INFO] [FML]: Holder lookups applied [07:19:56] [Client thread/INFO] [FML]: Applying holder lookups [07:19:56] [Client thread/WARN] [FML]: Unable to set public static net.minecraft.block.BlockDoor net.minecraft.init.Blocks.ACACIA_DOOR with value Block{minecraft:acacia_door} (minecraft:acacia_door) java.lang.reflect.InvocationTargetException: null at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.registries.ObjectHolderRef$FinalFieldHelper.setField(ObjectHolderRef.java:180) ~[ObjectHolderRef$FinalFieldHelper.class:?] at net.minecraftforge.registries.ObjectHolderRef.apply(ObjectHolderRef.java:146) [ObjectHolderRef.class:?] at net.minecraftforge.registries.ObjectHolderRegistry.applyObjectHolders(ObjectHolderRegistry.java:170) [ObjectHolderRegistry.class:?] at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:861) [GameData.class:?] at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:630) [Loader.class:?] at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252) [FMLClientHandler.class:?] at net.minecraft.client.Minecraft.init(Minecraft.java:514) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:422) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:25) [start/:?] Caused by: java.lang.IllegalArgumentException: Can not set static net.minecraft.block.BlockDoor field net.minecraft.init.Blocks.ACACIA_DOOR to encom.grid.rezcraft.TestDoor at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[?:1.8.0_231] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[?:1.8.0_231] at sun.reflect.UnsafeStaticObjectFieldAccessorImpl.set(UnsafeStaticObjectFieldAccessorImpl.java:79) ~[?:1.8.0_231] ... 24 more [07:19:56] [Client thread/INFO] [FML]: Holder lookups applied [07:19:56] [Client thread/INFO] [FML]: Applying holder lookups [07:19:56] [Client thread/WARN] [FML]: Unable to set public static net.minecraft.block.BlockDoor net.minecraft.init.Blocks.ACACIA_DOOR with value Block{minecraft:acacia_door} (minecraft:acacia_door) java.lang.reflect.InvocationTargetException: null at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source) ~[?:?] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.registries.ObjectHolderRef$FinalFieldHelper.setField(ObjectHolderRef.java:180) ~[ObjectHolderRef$FinalFieldHelper.class:?] at net.minecraftforge.registries.ObjectHolderRef.apply(ObjectHolderRef.java:146) [ObjectHolderRef.class:?] at net.minecraftforge.registries.ObjectHolderRegistry.applyObjectHolders(ObjectHolderRegistry.java:170) [ObjectHolderRegistry.class:?] at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:632) [Loader.class:?] at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252) [FMLClientHandler.class:?] at net.minecraft.client.Minecraft.init(Minecraft.java:514) [Minecraft.class:?] at net.minecraft.client.Minecraft.run(Minecraft.java:422) [Minecraft.class:?] at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_231] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_231] at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?] at GradleStart.main(GradleStart.java:25) [start/:?] Caused by: java.lang.IllegalArgumentException: Can not set static net.minecraft.block.BlockDoor field net.minecraft.init.Blocks.ACACIA_DOOR to encom.grid.rezcraft.TestDoor at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[?:1.8.0_231] at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[?:1.8.0_231] at sun.reflect.UnsafeStaticObjectFieldAccessorImpl.set(UnsafeStaticObjectFieldAccessorImpl.java:79) ~[?:1.8.0_231] ... 23 more Anyway, I just want some translucent doors. Would someone be able to kind of give me an idea if I'm doing the right thing or if I need to change something?
  5. This event handler I created works great in registering my replacement of BlockOre so that I can load in some additional methods to enable transparent texture support. The problem is when I try to do much the same thing with BlockDoor I run into a problem. The very last line in the EventSubscriber will not dompile, stating that it "Cannot invoke setHardness(float) on the primitive type void". I actually cant set anything about the new object. I'm a little confused because I looked back over my BlockOre replacer and didn't notice it was returning anything that I could see. I don't see why BlockDoor should have to. I also don't know why it's considering TestDoor a void class/method? I've tried removing most of the code out of TestDoor and saving, extending to just Block, anything to make this line go away but I cant. package grid.encom.rezcraft; import grid.encom.rezcraft.TestOre; import grid.encom.rezcraft.TestDoor; import net.minecraft.block.Block; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.util.ResourceLocation; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid = TestOre.MODID) public final class EventSubscriber { @SubscribeEvent static void onBlockRegister(final RegistryEvent.Register<Block> event) { event.getRegistry().register(new TestOre().setHardness(3.0F).setResistance(5.0F).setUnlocalizedName("oreIron").setRegistryName(new ResourceLocation("minecraft", "iron_ore"))); event.getRegistry().register(new TestDoor(Material.WOOD)).setHardness(3.0F).setUnlocalizedName("doorAcacia").setRegistryName(new ResourceLocation("minecraft", "acacia_door")); } } Here is my replacement BlockDoor.java - it's just a copy of BlockDoor but it's been modified as TestDoor and is an extension of BlockDoor. This was done to get access to some private methods that weren't easy to get otherwise. package encom.grid.rezcraft; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.BlockHorizontal; import net.minecraft.block.BlockPlanks; import net.minecraft.block.material.EnumPushReaction; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.IStringSerializable; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; public class TestDoor extends BlockDoor { public static final PropertyDirection FACING = BlockHorizontal.FACING; public static final PropertyBool OPEN = PropertyBool.create("open"); public static final PropertyEnum<BlockDoor.EnumHingePosition> HINGE = PropertyEnum.<BlockDoor.EnumHingePosition>create("hinge", BlockDoor.EnumHingePosition.class); public static final PropertyBool POWERED = PropertyBool.create("powered"); public static final PropertyEnum<BlockDoor.EnumDoorHalf> HALF = PropertyEnum.<BlockDoor.EnumDoorHalf>create("half", BlockDoor.EnumDoorHalf.class); protected static final AxisAlignedBB SOUTH_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D); protected static final AxisAlignedBB NORTH_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB WEST_AABB = new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB EAST_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D); public TestDoor(Material materialIn) { super(materialIn); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH).withProperty(OPEN, Boolean.valueOf(false)).withProperty(HINGE, BlockDoor.EnumHingePosition.LEFT).withProperty(POWERED, Boolean.valueOf(false)).withProperty(HALF, BlockDoor.EnumDoorHalf.LOWER)); } public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { state = state.getActualState(source, pos); EnumFacing enumfacing = (EnumFacing)state.getValue(FACING); boolean flag = !((Boolean)state.getValue(OPEN)).booleanValue(); boolean flag1 = state.getValue(HINGE) == BlockDoor.EnumHingePosition.RIGHT; switch (enumfacing) { case EAST: default: return flag ? EAST_AABB : (flag1 ? NORTH_AABB : SOUTH_AABB); case SOUTH: return flag ? SOUTH_AABB : (flag1 ? EAST_AABB : WEST_AABB); case WEST: return flag ? WEST_AABB : (flag1 ? SOUTH_AABB : NORTH_AABB); case NORTH: return flag ? NORTH_AABB : (flag1 ? WEST_AABB : EAST_AABB); } } /** * Gets the localized name of this block. Used for the statistics page. */ public String getLocalizedName() { return I18n.translateToLocal((this.getUnlocalizedName() + ".name").replaceAll("tile", "item")); } /** * Used to determine ambient occlusion and culling when rebuilding chunks for render */ public boolean isOpaqueCube(IBlockState state) { return false; } /** * Determines if an entity can path through this block */ public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return isOpen(combineMetadata(worldIn, pos)); } public boolean isFullCube(IBlockState state) { return false; } private int getCloseSound() { return this.blockMaterial == Material.IRON ? 1011 : 1012; } private int getOpenSound() { return this.blockMaterial == Material.IRON ? 1005 : 1006; } /** * Get the MapColor for this Block and the given BlockState */ public MapColor getMapColor(IBlockState state, IBlockAccess worldIn, BlockPos pos) { if (state.getBlock() == Blocks.IRON_DOOR) { return MapColor.IRON; } else if (state.getBlock() == Blocks.OAK_DOOR) { return BlockPlanks.EnumType.OAK.getMapColor(); } else if (state.getBlock() == Blocks.SPRUCE_DOOR) { return BlockPlanks.EnumType.SPRUCE.getMapColor(); } else if (state.getBlock() == Blocks.BIRCH_DOOR) { return BlockPlanks.EnumType.BIRCH.getMapColor(); } else if (state.getBlock() == Blocks.JUNGLE_DOOR) { return BlockPlanks.EnumType.JUNGLE.getMapColor(); } else if (state.getBlock() == Blocks.ACACIA_DOOR) { return BlockPlanks.EnumType.ACACIA.getMapColor(); } else { return state.getBlock() == Blocks.DARK_OAK_DOOR ? BlockPlanks.EnumType.DARK_OAK.getMapColor() : super.getMapColor(state, worldIn, pos); } } /** * Called when the block is right clicked by a player. */ public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) { if (this.blockMaterial == Material.IRON) { return false; } else { BlockPos blockpos = state.getValue(HALF) == BlockDoor.EnumDoorHalf.LOWER ? pos : pos.down(); IBlockState iblockstate = pos.equals(blockpos) ? state : worldIn.getBlockState(blockpos); if (iblockstate.getBlock() != this) { return false; } else { state = iblockstate.cycleProperty(OPEN); worldIn.setBlockState(blockpos, state, 10); worldIn.markBlockRangeForRenderUpdate(blockpos, pos); worldIn.playEvent(playerIn, ((Boolean)state.getValue(OPEN)).booleanValue() ? this.getOpenSound() : this.getCloseSound(), pos, 0); return true; } } } public void toggleDoor(World worldIn, BlockPos pos, boolean open) { IBlockState iblockstate = worldIn.getBlockState(pos); if (iblockstate.getBlock() == this) { BlockPos blockpos = iblockstate.getValue(HALF) == BlockDoor.EnumDoorHalf.LOWER ? pos : pos.down(); IBlockState iblockstate1 = pos == blockpos ? iblockstate : worldIn.getBlockState(blockpos); if (iblockstate1.getBlock() == this && ((Boolean)iblockstate1.getValue(OPEN)).booleanValue() != open) { worldIn.setBlockState(blockpos, iblockstate1.withProperty(OPEN, Boolean.valueOf(open)), 10); worldIn.markBlockRangeForRenderUpdate(blockpos, pos); worldIn.playEvent((EntityPlayer)null, open ? this.getOpenSound() : this.getCloseSound(), pos, 0); } } } /** * Called when a neighboring block was changed and marks that this state should perform any checks during a neighbor * change. Cases may include when redstone power is updated, cactus blocks popping off due to a neighboring solid * block, etc. */ public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) { if (state.getValue(HALF) == BlockDoor.EnumDoorHalf.UPPER) { BlockPos blockpos = pos.down(); IBlockState iblockstate = worldIn.getBlockState(blockpos); if (iblockstate.getBlock() != this) { worldIn.setBlockToAir(pos); } else if (blockIn != this) { iblockstate.neighborChanged(worldIn, blockpos, blockIn, fromPos); } } else { boolean flag1 = false; BlockPos blockpos1 = pos.up(); IBlockState iblockstate1 = worldIn.getBlockState(blockpos1); if (iblockstate1.getBlock() != this) { worldIn.setBlockToAir(pos); flag1 = true; } if (!worldIn.getBlockState(pos.down()).isSideSolid(worldIn, pos.down(), EnumFacing.UP)) { worldIn.setBlockToAir(pos); flag1 = true; if (iblockstate1.getBlock() == this) { worldIn.setBlockToAir(blockpos1); } } if (flag1) { if (!worldIn.isRemote) { this.dropBlockAsItem(worldIn, pos, state, 0); } } else { boolean flag = worldIn.isBlockPowered(pos) || worldIn.isBlockPowered(blockpos1); if (blockIn != this && (flag || blockIn.getDefaultState().canProvidePower()) && flag != ((Boolean)iblockstate1.getValue(POWERED)).booleanValue()) { worldIn.setBlockState(blockpos1, iblockstate1.withProperty(POWERED, Boolean.valueOf(flag)), 2); if (flag != ((Boolean)state.getValue(OPEN)).booleanValue()) { worldIn.setBlockState(pos, state.withProperty(OPEN, Boolean.valueOf(flag)), 2); worldIn.markBlockRangeForRenderUpdate(pos, pos); worldIn.playEvent((EntityPlayer)null, flag ? this.getOpenSound() : this.getCloseSound(), pos, 0); } } } } } /** * Get the Item that this Block should drop when harvested. */ public Item getItemDropped(IBlockState state, Random rand, int fortune) { return state.getValue(HALF) == BlockDoor.EnumDoorHalf.UPPER ? Items.AIR : this.getItem(); } /** * Checks if this block can be placed exactly at the given position. */ public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { if (pos.getY() >= worldIn.getHeight() - 1) { return false; } else { IBlockState state = worldIn.getBlockState(pos.down()); return (state.isTopSolid() || state.getBlockFaceShape(worldIn, pos.down(), EnumFacing.UP) == BlockFaceShape.SOLID) && super.canPlaceBlockAt(worldIn, pos) && super.canPlaceBlockAt(worldIn, pos.up()); } } public EnumPushReaction getMobilityFlag(IBlockState state) { return EnumPushReaction.DESTROY; } public static int combineMetadata(IBlockAccess worldIn, BlockPos pos) { IBlockState iblockstate = worldIn.getBlockState(pos); int i = iblockstate.getBlock().getMetaFromState(iblockstate); boolean flag = isTop(i); IBlockState iblockstate1 = worldIn.getBlockState(pos.down()); int j = iblockstate1.getBlock().getMetaFromState(iblockstate1); int k = flag ? j : i; IBlockState iblockstate2 = worldIn.getBlockState(pos.up()); int l = iblockstate2.getBlock().getMetaFromState(iblockstate2); int i1 = flag ? i : l; boolean flag1 = (i1 & 1) != 0; boolean flag2 = (i1 & 2) != 0; return removeHalfBit(k) | (flag ? 8 : 0) | (flag1 ? 16 : 0) | (flag2 ? 32 : 0); } public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) { return new ItemStack(this.getItem()); } private Item getItem() { if (this == Blocks.IRON_DOOR) { return Items.IRON_DOOR; } else if (this == Blocks.SPRUCE_DOOR) { return Items.SPRUCE_DOOR; } else if (this == Blocks.BIRCH_DOOR) { return Items.BIRCH_DOOR; } else if (this == Blocks.JUNGLE_DOOR) { return Items.JUNGLE_DOOR; } else if (this == Blocks.ACACIA_DOOR) { return Items.ACACIA_DOOR; } else { return this == Blocks.DARK_OAK_DOOR ? Items.DARK_OAK_DOOR : Items.OAK_DOOR; } } /** * Called before the Block is set to air in the world. Called regardless of if the player's tool can actually * collect this block */ public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) { BlockPos blockpos = pos.down(); BlockPos blockpos1 = pos.up(); if (player.capabilities.isCreativeMode && state.getValue(HALF) == BlockDoor.EnumDoorHalf.UPPER && worldIn.getBlockState(blockpos).getBlock() == this) { worldIn.setBlockToAir(blockpos); } if (state.getValue(HALF) == BlockDoor.EnumDoorHalf.LOWER && worldIn.getBlockState(blockpos1).getBlock() == this) { if (player.capabilities.isCreativeMode) { worldIn.setBlockToAir(pos); } worldIn.setBlockToAir(blockpos1); } } @SideOnly(Side.CLIENT) public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.CUTOUT; } /** * Get the actual Block state of this Block at the given position. This applies properties not visible in the * metadata, such as fence connections. */ public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { if (state.getValue(HALF) == BlockDoor.EnumDoorHalf.LOWER) { IBlockState iblockstate = worldIn.getBlockState(pos.up()); if (iblockstate.getBlock() == this) { state = state.withProperty(HINGE, iblockstate.getValue(HINGE)).withProperty(POWERED, iblockstate.getValue(POWERED)); } } else { IBlockState iblockstate1 = worldIn.getBlockState(pos.down()); if (iblockstate1.getBlock() == this) { state = state.withProperty(FACING, iblockstate1.getValue(FACING)).withProperty(OPEN, iblockstate1.getValue(OPEN)); } } return state; } /** * Returns the blockstate with the given rotation from the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withRotation(IBlockState state, Rotation rot) { return state.getValue(HALF) != BlockDoor.EnumDoorHalf.LOWER ? state : state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); } /** * Returns the blockstate with the given mirror of the passed blockstate. If inapplicable, returns the passed * blockstate. */ public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return mirrorIn == Mirror.NONE ? state : state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))).cycleProperty(HINGE); } /** * Convert the given metadata into a BlockState for this Block */ public IBlockState getStateFromMeta(int meta) { return (meta & 8) > 0 ? this.getDefaultState().withProperty(HALF, BlockDoor.EnumDoorHalf.UPPER).withProperty(HINGE, (meta & 1) > 0 ? BlockDoor.EnumHingePosition.RIGHT : BlockDoor.EnumHingePosition.LEFT).withProperty(POWERED, Boolean.valueOf((meta & 2) > 0)) : this.getDefaultState().withProperty(HALF, BlockDoor.EnumDoorHalf.LOWER).withProperty(FACING, EnumFacing.getHorizontal(meta & 3).rotateYCCW()).withProperty(OPEN, Boolean.valueOf((meta & 4) > 0)); } /** * Convert the BlockState into the correct metadata value */ public int getMetaFromState(IBlockState state) { int i = 0; if (state.getValue(HALF) == BlockDoor.EnumDoorHalf.UPPER) { i = i | 8; if (state.getValue(HINGE) == BlockDoor.EnumHingePosition.RIGHT) { i |= 1; } if (((Boolean)state.getValue(POWERED)).booleanValue()) { i |= 2; } } else { i = i | ((EnumFacing)state.getValue(FACING)).rotateY().getHorizontalIndex(); if (((Boolean)state.getValue(OPEN)).booleanValue()) { i |= 4; } } return i; } protected static int removeHalfBit(int meta) { return meta & 7; } public static boolean isOpen(IBlockAccess worldIn, BlockPos pos) { return isOpen(combineMetadata(worldIn, pos)); } public static EnumFacing getFacing(IBlockAccess worldIn, BlockPos pos) { return getFacing(combineMetadata(worldIn, pos)); } public static EnumFacing getFacing(int combinedMeta) { return EnumFacing.getHorizontal(combinedMeta & 3).rotateYCCW(); } protected static boolean isOpen(int combinedMeta) { return (combinedMeta & 4) != 0; } protected static boolean isTop(int meta) { return (meta & 8) != 0; } protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {HALF, FACING, OPEN, HINGE, POWERED}); } /** * Get the geometry of the queried face at the given position and state. This is used to decide whether things like * buttons are allowed to be placed on the face, or how glass panes connect to the face, among other things. * <p> * Common values are {@code SOLID}, which is the default, and {@code UNDEFINED}, which represents something that * does not fit the other descriptions and will generally cause other things not to connect to the face. * * @return an approximation of the form of the given face */ public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { return BlockFaceShape.UNDEFINED; } public static enum EnumDoorHalf implements IStringSerializable { UPPER, LOWER; public String toString() { return this.getName(); } public String getName() { return this == UPPER ? "upper" : "lower"; } } public static enum EnumHingePosition implements IStringSerializable { LEFT, RIGHT; public String toString() { return this.getName(); } public String getName() { return this == LEFT ? "left" : "right"; } } }
  6. I started cooking up a class that would extend from BlockOre, and then use @Override to get the rendering rules I want loaded into BlockOre.java , but although my eventHandler was able to try to do it's thing, I received dozens of errors complaining that minecraft:blockore didn't have a json or a model. I understand that I need to get my event handler into a separate file, setup a github, etc. I'd like to know however, if I'm on the right track? I suspect that what I will in fact be doing is that since there are listings in Block like registerBlock(14, "gold_ore", (new BlockOre()).setHardness(3.0F).setResistance(5.0F).setSoundType(SoundType.STONE).setUnlocalizedName("oreGold")); that what I may want to do is try to register my overrides to the vanilla ore types instead, as they have jsons and models?
  7. A very long time ago, around 1.8, I created a base mod by recompiling minecraft and editing some class files so that ore blocks would handle rendering transparent textures like how glass does. I've recently set up an Eclipse workspace and am ready to get started but most guides for first time users are looking to create items that are new and don't already exist. I'll admit, I feel just a bit out of my element getting started on this. If someone would know what methods I could use to get a change like this to occur, or has a mod that modifies vanilla blocks that I could look to as an example, I would be extremely grateful. I was able to use this transparent feature on a number of different placable items with quite interesting effect. Here's some doors I made with transparent textures for example: https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/mod-packs/2587422-rezcraft-rerez-x64-1-8-craft-the-grid#
  8. Having the exact same problem - did you find a solution?
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.