Posted November 2, 20168 yr I am trying to add my own Fence Gates and saw that Vanilla uses a different block for each gate. Would it be possible to use a variant property to have more than one gate per block? [spoiler=Abstract Fence Gate Class] public abstract class BlockNetherExFenceGate extends BlockNetherEx { public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); public static final PropertyBool OPEN = PropertyBool.create("open"); public static final PropertyBool POWERED = PropertyBool.create("powered"); public static final PropertyBool IN_WALL = PropertyBool.create("in_wall"); private static final AxisAlignedBB AABB_COLLIDE_ZAXIS = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 1.0D, 0.625D); private static final AxisAlignedBB AABB_COLLIDE_XAXIS = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 1.0D, 1.0D); private static final AxisAlignedBB AABB_COLLIDE_ZAXIS_INWALL = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 0.8125D, 0.625D); private static final AxisAlignedBB AABB_COLLIDE_XAXIS_INWALL = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 0.8125D, 1.0D); private static final AxisAlignedBB AABB_CLOSED_SELECTED_ZAXIS = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 1.5D, 0.625D); private static final AxisAlignedBB AABB_CLOSED_SELECTED_XAXIS = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 1.5D, 1.0D); public BlockNetherExFenceGate(String name, Material material) { super(name, material); } @Override public boolean isOpaqueCube(IBlockState state) { return false; } @Override public boolean isFullCube(IBlockState state) { return false; } @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) { return true; } @Override public boolean isPassable(IBlockAccess worldIn, BlockPos pos) { return worldIn.getBlockState(pos).getValue(OPEN); } @Override public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { state = getActualState(state, source, pos); return state.getValue(IN_WALL) ? (state.getValue(FACING).getAxis() == EnumFacing.Axis.X ? AABB_COLLIDE_XAXIS_INWALL : AABB_COLLIDE_ZAXIS_INWALL) : (state.getValue(FACING).getAxis() == EnumFacing.Axis.X ? AABB_COLLIDE_XAXIS : AABB_COLLIDE_ZAXIS); } @Nullable public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) { return blockState.getValue(OPEN) ? NULL_AABB : (blockState.getValue(FACING).getAxis() == EnumFacing.Axis.Z ? AABB_CLOSED_SELECTED_ZAXIS : AABB_CLOSED_SELECTED_XAXIS); } @Override public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn) { if (!worldIn.isRemote) { boolean flag = worldIn.isBlockPowered(pos); if (flag || blockIn.getDefaultState().canProvidePower()) { if (flag && !state.getValue(OPEN) && !state.getValue(POWERED)) { worldIn.setBlockState(pos, state.withProperty(OPEN, true).withProperty(POWERED, true), 2); worldIn.playEvent(null, 1008, pos, 0); } else if (!flag && state.getValue(OPEN) && state.getValue(POWERED)) { worldIn.setBlockState(pos, state.withProperty(OPEN, false).withProperty(POWERED, false), 2); worldIn.playEvent(null, 1014, pos, 0); } else if (flag != state.getValue(POWERED)) { worldIn.setBlockState(pos, state.withProperty(POWERED, flag), 2); } } } } @Override public boolean canPlaceBlockAt(World worldIn, BlockPos pos) { return worldIn.getBlockState(pos.down()).getMaterial().isSolid() && super.canPlaceBlockAt(worldIn, pos); } @Override public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { return getDefaultState().withProperty(FACING, placer.getHorizontalFacing()).withProperty(OPEN, false).withProperty(POWERED, false).withProperty(IN_WALL, false); } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { if (state.getValue(OPEN)) { state = state.withProperty(OPEN, false); worldIn.setBlockState(pos, state, 10); } else { EnumFacing facing = EnumFacing.fromAngle((double)playerIn.rotationYaw); if (state.getValue(FACING) == facing.getOpposite()) { state = state.withProperty(FACING, facing); } state = state.withProperty(OPEN, true); worldIn.setBlockState(pos, state, 10); } worldIn.playEvent(playerIn, state.getValue(OPEN) ? 1008 : 1014, pos, 0); return true; } @Override public IBlockState withRotation(IBlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate(state.getValue(FACING))); } @Override public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return state.withRotation(mirrorIn.toRotation(state.getValue(FACING))); } @Override public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) { EnumFacing.Axis facing = state.getValue(FACING).getAxis(); if(facing == EnumFacing.Axis.Z && (worldIn.getBlockState(pos.west()).getBlock() == Blocks.COBBLESTONE_WALL || worldIn.getBlockState(pos.east()).getBlock() == Blocks.COBBLESTONE_WALL) || facing == EnumFacing.Axis.X && (worldIn.getBlockState(pos.north()).getBlock() == Blocks.COBBLESTONE_WALL || worldIn.getBlockState(pos.south()).getBlock() == Blocks.COBBLESTONE_WALL)) { state = state.withProperty(IN_WALL, true); } return state; } } [spoiler=Variant Fence Gate Class] public static final PropertyEnum<BlockNetherExStone.EnumType> TYPE = PropertyEnum.create("type", BlockNetherExStone.EnumType.class); public BlockNetherExStoneFenceGate() { super("stone_fence_gate", Material.ROCK); } @Override public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) { for(BlockNetherExStone.EnumType type : BlockNetherExStone.EnumType.values()) { list.add(new ItemStack(itemIn, 1, type.ordinal())); } } @Override public int damageDropped(IBlockState state) { return state.getValue(TYPE).ordinal(); } //How Would I Edit These @Override public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta)).withProperty(OPEN, (meta & 4) != 0).withProperty(POWERED, (meta & != 0); } //How Would I Edit These @Override public int getMetaFromState(IBlockState state) { int i = 0; i = i | (state.getValue(FACING)).getHorizontalIndex(); if (state.getValue(POWERED)) { i |= 8; } if (state.getValue(OPEN)) { i |= 4; } return i; } @Override protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, FACING, OPEN, POWERED, IN_WALL, TYPE); }
November 2, 20168 yr You are saving 3 states in meta: FACING (4 possibilities), POWERED(2 possibilities) and OPEN(2 possibilities). This results in 4x2x2 = 16 different meta values, thus no more fit in there, unless you are able to get by with saving one less property in metadata. Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support. 1.12 -> 1.13 primer by williewillus. 1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support. http://www.howoldisminecraft1710.today/
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.