Jump to content

IBlockAccess vanilla-mod, Fences, Walls and Gates... Oh My! 1.10.2 (Unresolved)


jjattack

Recommended Posts

Not sure if what I want to happen is possible or not, so here's an attempt at explaining.

 

uurualM.png

In the top picture, the new Wall and fence gates class accept each other, and the fence gate shows "in_wall" as true, as it should be.

WoSNkZF.png

And in the second, the normal spruce gate fence is accepted by the wall class, but my wall isn't accepted by the vanilla fence gate.

 

 

The Wall Class:

 

public class CoeBlockWall extends Block implements ItemModelProvider{

protected String thisname;
public static Material blockMaterial;
public static final PropertyBool UP = PropertyBool.create("up");
    public static final PropertyBool NORTH = PropertyBool.create("north");
    public static final PropertyBool EAST = PropertyBool.create("east");
    public static final PropertyBool SOUTH = PropertyBool.create("south");
    public static final PropertyBool WEST = PropertyBool.create("west");
    protected static final AxisAlignedBB[] AABB_BY_INDEX = new AxisAlignedBB[] {new AxisAlignedBB(0.25D, 0.0D, 0.25D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.25D, 0.0D, 0.25D, 0.75D, 1.0D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.25D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.0D, 0.0D, 0.25D, 0.75D, 1.0D, 1.0D), new AxisAlignedBB(0.25D, 0.0D, 0.0D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.3125D, 0.0D, 0.0D, 0.6875D, 0.875D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.75D, 1.0D, 0.75D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.75D, 1.0D, 1.0D), new AxisAlignedBB(0.25D, 0.0D, 0.25D, 1.0D, 1.0D, 0.75D), new AxisAlignedBB(0.25D, 0.0D, 0.25D, 1.0D, 1.0D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.3125D, 1.0D, 0.875D, 0.6875D), new AxisAlignedBB(0.0D, 0.0D, 0.25D, 1.0D, 1.0D, 1.0D), new AxisAlignedBB(0.25D, 0.0D, 0.0D, 1.0D, 1.0D, 0.75D), new AxisAlignedBB(0.25D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.75D), new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D)};
    protected static final AxisAlignedBB[] CLIP_AABB_BY_INDEX = new AxisAlignedBB[] {AABB_BY_INDEX[0].setMaxY(1.5D), AABB_BY_INDEX[1].setMaxY(1.5D), AABB_BY_INDEX[2].setMaxY(1.5D), AABB_BY_INDEX[3].setMaxY(1.5D), AABB_BY_INDEX[4].setMaxY(1.5D), AABB_BY_INDEX[5].setMaxY(1.5D), AABB_BY_INDEX[6].setMaxY(1.5D), AABB_BY_INDEX[7].setMaxY(1.5D), AABB_BY_INDEX[8].setMaxY(1.5D), AABB_BY_INDEX[9].setMaxY(1.5D), AABB_BY_INDEX[10].setMaxY(1.5D), AABB_BY_INDEX[11].setMaxY(1.5D), AABB_BY_INDEX[12].setMaxY(1.5D), AABB_BY_INDEX[13].setMaxY(1.5D), AABB_BY_INDEX[14].setMaxY(1.5D), AABB_BY_INDEX[15].setMaxY(1.5D)};


public CoeBlockWall(Material blockMaterialIn, MapColor blockMapColorIn,String name) {
	super(blockMaterialIn, blockMapColorIn);
	this.blockMaterial = blockMaterialIn;
        this.thisname = name;
	this.setUnlocalizedName(name);
	this.setRegistryName(name);
}

@Override
public void registerItemModel(Item item) {
	CoeMod.proxy.registerItemRenderer(item, 0, thisname);
}

@Override
public CoeBlockWall setCreativeTab(CreativeTabs tab) {
	super.setCreativeTab(tab);
	return this;
}

@Override
public CoeBlockWall setLightLevel(float value)
    {
        this.lightValue = (int)(15.0F * value);
        return this;
    }

public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
    {
        state = this.getActualState(state, source, pos);
        return AABB_BY_INDEX[getAABBIndex(state)];
    }

    @Nullable
    public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos)
    {
        blockState = this.getActualState(blockState, worldIn, pos);
        return CLIP_AABB_BY_INDEX[getAABBIndex(blockState)];
    }

    private static int getAABBIndex(IBlockState state)
    {
        int i = 0;

        if (((Boolean)state.getValue(NORTH)).booleanValue())
        {
            i |= 1 << EnumFacing.NORTH.getHorizontalIndex();
        }

        if (((Boolean)state.getValue(EAST)).booleanValue())
        {
            i |= 1 << EnumFacing.EAST.getHorizontalIndex();
        }

        if (((Boolean)state.getValue(SOUTH)).booleanValue())
        {
            i |= 1 << EnumFacing.SOUTH.getHorizontalIndex();
        }

        if (((Boolean)state.getValue(WEST)).booleanValue())
        {
            i |= 1 << EnumFacing.WEST.getHorizontalIndex();
        }

        return i;
    }
    
    public boolean isFullCube(IBlockState state)
    {
        return false;
    }

    public boolean isPassable(IBlockAccess worldIn, BlockPos pos)
    {
        return false;
    }

    /**
     * Used to determine ambient occlusion and culling when rebuilding chunks for render
     */
    public boolean isOpaqueCube(IBlockState state)
    {
        return false;
    }

    private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos)
    {
        IBlockState iblockstate = worldIn.getBlockState(pos);
        Block block = iblockstate.getBlock();
        return block == Blocks.BARRIER ? false : ((!(block instanceof CoeBlockWall)) && !(block instanceof BlockFenceGate) && !(block instanceof CoeBasicFence) && !(block instanceof BlockWall) && !(block instanceof CoeBasicFenceGate) ? (CoeBlockWall.blockMaterial.isOpaque() && iblockstate.isFullCube() ? CoeBlockWall.blockMaterial != Material.GOURD : false) : true);
    }

    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side)
    {
        return side == EnumFacing.DOWN ? super.shouldSideBeRendered(blockState, blockAccess, pos, side) : true;
    }
    
    public int getMetaFromState(IBlockState state)
    {
        return 0;
    }
    
    public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
    {
        boolean flag = this.canConnectTo(worldIn, pos.north());
        boolean flag1 = this.canConnectTo(worldIn, pos.east());
        boolean flag2 = this.canConnectTo(worldIn, pos.south());
        boolean flag3 = this.canConnectTo(worldIn, pos.west());
        boolean flag4 = flag && !flag1 && flag2 && !flag3 || !flag && flag1 && !flag2 && flag3;
        return state.withProperty(UP, Boolean.valueOf(!flag4 || !worldIn.isAirBlock(pos.up()))).withProperty(NORTH, Boolean.valueOf(flag)).withProperty(EAST, Boolean.valueOf(flag1)).withProperty(SOUTH, Boolean.valueOf(flag2)).withProperty(WEST, Boolean.valueOf(flag3));
    }

    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {UP, NORTH, EAST, WEST, SOUTH});
    }
}

 

 

 

So, i need to be able to reproduce the behaviour of

 

private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos)

    {

        IBlockState iblockstate = worldIn.getBlockState(pos);

        Block block = iblockstate.getBlock();

        return block == Blocks.BARRIER ? false : ((!(block instanceof CoeBlockWall)) && !(block instanceof BlockFenceGate) && !(block instanceof CoeBasicFence) && !(block instanceof BlockWall) && !(block instanceof CoeBasicFenceGate) ? (CoeBlockWall.blockMaterial.isOpaque() && iblockstate.isFullCube() ? CoeBlockWall.blockMaterial != Material.GOURD : false) : true);

    }

 

for the Vanilla fences, walls and fence gates as it is in the modded versions.

 

I'm going to guess you can't change vanilla block behavior in this way?  If not, would it be possible to add code into the wall class that would detect if the neighbor was a vanilla gate/wall and give it access that way? 

 

Link to comment
Share on other sites

Extend the Vanilla Block Fence stuff, that should make it connect.

Not really. You would have to extend
BlockFenceGate

, which is pretty stupid for a wall block to do.

 

@jjattack: The proper way to do this would be to submit a PullRequest to forge adding a method

Block#canWallConnectTo

which

BlockWall

then uses. And while you are at it, you could do the same for

BlockFence

.

Doesn't BlockFence check to see if the surrounding Block(s) are an instance of BlockFence or BlockFenceGate. And when I said "Block Fence Stuff" I meant if it is a Fence then BlockFence and if it was a gate then BlockFenceGate.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

The basic fence class i use is:

 

 

public class CoeBasicFence extends BlockFence implements ItemModelProvider {

 

protected String thisname;

public static Material blockMaterial;

 

    public CoeBasicFence(Material blockMaterialIn, MapColor blockMapColorIn, String name)

    {

        super(blockMaterialIn, blockMapColorIn);

        this.setDefaultState(this.blockState.getBaseState().withProperty(NORTH, Boolean.valueOf(false)).withProperty(EAST, Boolean.valueOf(false)).withProperty(SOUTH, Boolean.valueOf(false)).withProperty(WEST, Boolean.valueOf(false)));

this.blockMaterial = blockMaterialIn;

        this.thisname = name;

this.setUnlocalizedName(name);

this.setRegistryName(name);

}

 

@Override

public void registerItemModel(Item item) {

CoeMod.proxy.registerItemRenderer(item, 0, thisname);

}

 

@Override

public CoeBasicFence setCreativeTab(CreativeTabs tab) {

super.setCreativeTab(tab);

return this;

}

 

@Override

public CoeBasicFence setLightLevel(float value)

    {

        this.lightValue = (int)(15.0F * value);

        return this;

    }

 

@Override

public boolean canConnectTo(IBlockAccess worldIn, BlockPos pos)

    {

 

        IBlockState iblockstate = worldIn.getBlockState(pos);

        Block block = iblockstate.getBlock();

        return block == Blocks.BARRIER ? false : ((!(block instanceof CoeBasicFence)) && !(block instanceof CoeBasicFenceGate) && !(block instanceof CoeBlockWall) && !(block instanceof BlockFence) && !(block instanceof BlockFenceGate) ? (CoeBasicFence.blockMaterial.isOpaque() && iblockstate.isFullCube() ? CoeBasicFence.blockMaterial != Material.GOURD : false) : true);

    }

}

 

 

which works fine for the mods new fences. The problem lies with the existing ones in minecraft connecting to the new ones. I will do some research into the pull request and get back if i cant find the answer.

Link to comment
Share on other sites

Yes, for fences I guess the instanceof check suffices, because vanilla's BlockFence is pretty abstract.

But BlockWall is hardcoded to have the variant property, so an extension is not appropriate here.

Alright until forge does add a hook there, people will have to choose whether there "fence" block connects to walls or fences. Choose by extending there classes, and extend BlockFenceGate for gates.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

The fence gates walls and fences all connect to each other with the method i use there, which is a little odd with walls and fences connecting but i'm sticking with it for now.

Lol, i found out what the pull request was. So there is no way to do it then?

Link to comment
Share on other sites

The fence gates walls and fences all connect to each other with the method i use there, which is a little odd with walls and fences connecting but i'm sticking with it for now.

Doesn't this mean it works?

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

No, it works fine with my new blocks, but they aren't compatible with the vanilla blocks in minecraft.

 

fy3i69h.png

 

 

The code that makes them connect

private boolean canConnectTo(IBlockAccess worldIn, BlockPos pos)
    {
        IBlockState iblockstate = worldIn.getBlockState(pos);
        Block block = iblockstate.getBlock();
        return block == Blocks.BARRIER ? false : ((!(block instanceof CoeBlockWall)) && !(block instanceof BlockFenceGate) && !(block instanceof CoeBasicFence) && !(block instanceof BlockWall) && !(block instanceof CoeBasicFenceGate) ? (CoeBlockWall.blockMaterial.isOpaque() && iblockstate.isFullCube() ? CoeBlockWall.blockMaterial != Material.GOURD : false) : true);
    }

is only in the extended fence wall and gate classes. The original fences/walls/gates classes therefore don't connect.

 

I'm grasping at straws, and i really don't know the lingo as you are about to see but could there be a way to detect the blocks neighbor and send it a false message? I.e. If neighbor is VanillaFence - pass argument that it is also a Vanilla Fence? ... or something like that lol.

Link to comment
Share on other sites

I assume that the reason it doesn't connect is because FenceGates connecting is hardcoded aswell with the variant system.

 

*Edit does your Fence Gate extend BlockFenceGate?

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

No it's here

 

public class CoeBasicFenceGate extends BlockHorizontal implements ItemModelProvider{


	protected String thisname;
    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");
    protected static final AxisAlignedBB AABB_COLLIDE_ZAXIS = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 1.0D, 0.625D);
    protected static final AxisAlignedBB AABB_COLLIDE_XAXIS = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 1.0D, 1.0D);
    protected static final AxisAlignedBB AABB_COLLIDE_ZAXIS_INWALL = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 0.8125D, 0.625D);
    protected static final AxisAlignedBB AABB_COLLIDE_XAXIS_INWALL = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 0.8125D, 1.0D);
    protected static final AxisAlignedBB AABB_CLOSED_SELECTED_ZAXIS = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 1.5D, 0.625D);
    protected static final AxisAlignedBB AABB_CLOSED_SELECTED_XAXIS = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 1.5D, 1.0D);

    public CoeBasicFenceGate(Material blockMaterialIn, MapColor blockMapColorIn, String name)
    {
        super(blockMaterialIn, blockMapColorIn);
        this.setDefaultState(this.blockState.getBaseState().withProperty(OPEN, Boolean.valueOf(false)).withProperty(POWERED, Boolean.valueOf(false)).withProperty(IN_WALL, Boolean.valueOf(false)));
        this.thisname = name;
		this.setUnlocalizedName(name);
		this.setRegistryName(name);

	}

	@Override
	public void registerItemModel(Item item) {
		CoeMod.proxy.registerItemRenderer(item, 0, thisname);
	}

	@Override
	public CoeBasicFenceGate setCreativeTab(CreativeTabs tab) {
		super.setCreativeTab(tab);
		return this;
	}

	@Override
	public CoeBasicFenceGate setLightLevel(float value)
    {
        this.lightValue = (int)(15.0F * value);
        return this;
    }

	@Override
	public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
        state = this.getActualState(state, source, pos);
        return ((Boolean) state.getValue(IN_WALL)).booleanValue()
                ? (((EnumFacing) state.getValue(FACING)).getAxis() == EnumFacing.Axis.X ? AABB_COLLIDE_XAXIS_INWALL
                        : AABB_COLLIDE_ZAXIS_INWALL)
                : (((EnumFacing) state.getValue(FACING)).getAxis() == EnumFacing.Axis.X ? AABB_COLLIDE_XAXIS
                        : AABB_COLLIDE_ZAXIS);
    }

    /**
     * Get the actual Block state of this Block at the given position. This applies properties not visible in the
     * metadata, such as fence connections.
     */
    @Override
    public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos) {
        EnumFacing.Axis enumfacing$axis = ((EnumFacing) state.getValue(FACING)).getAxis();

        if (enumfacing$axis == EnumFacing.Axis.Z
                && (worldIn.getBlockState(pos.west()).getBlock() == Blocks.COBBLESTONE_WALL
                        || worldIn.getBlockState(pos.east()).getBlock() == Blocks.COBBLESTONE_WALL
                        || worldIn.getBlockState(pos.west()).getBlock() == CoeBlocks.coe_wall_stone
                        || worldIn.getBlockState(pos.east()).getBlock() == CoeBlocks.coe_wall_stone)
                || enumfacing$axis == EnumFacing.Axis.X
                        && (worldIn.getBlockState(pos.north()).getBlock() == Blocks.COBBLESTONE_WALL
                                || worldIn.getBlockState(pos.south()).getBlock() == Blocks.COBBLESTONE_WALL
    	                        || worldIn.getBlockState(pos.north()).getBlock() == CoeBlocks.coe_wall_stone
    	                        || worldIn.getBlockState(pos.south()).getBlock() == CoeBlocks.coe_wall_stone)) {
            state = state.withProperty(IN_WALL, Boolean.valueOf(true));
        }

        return state;
    }

    /**
     * Returns the blockstate with the given rotation from the passed blockstate. If inapplicable, returns the passed
     * blockstate.
     */
    @Override
    public IBlockState withRotation(IBlockState state, Rotation rot)
    {
        return 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.
     */
    @Override
    public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
    {
        return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING)));
    }
    
    @Override
    public boolean canPlaceBlockAt(World worldIn, BlockPos pos)
    {
        return worldIn.getBlockState(pos.down()).getMaterial().isSolid() ? super.canPlaceBlockAt(worldIn, pos) : false;
    }

    @Nullable
    public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, World worldIn, BlockPos pos) {
        return ((Boolean) blockState.getValue(OPEN)).booleanValue() ? NULL_AABB
                : (((EnumFacing) blockState.getValue(FACING)).getAxis() == EnumFacing.Axis.Z
                        ? AABB_CLOSED_SELECTED_ZAXIS : AABB_CLOSED_SELECTED_XAXIS);
    }

    /**
     * Used to determine ambient occlusion and culling when rebuilding chunks for render
     */
    @Override
    public boolean isOpaqueCube(IBlockState state)
    {
        return false;
    }
    
    @Override
    public boolean isFullCube(IBlockState state)
    {
        return false;
    }
    
    @Override
    public boolean isPassable(IBlockAccess worldIn, BlockPos pos)
    {
        return ((Boolean)worldIn.getBlockState(pos).getValue(OPEN)).booleanValue();
    }

    /**
     * Called by ItemBlocks just before a block is actually set in the world, to allow for adjustments to the
     * IBlockstate
     */
    @Override
    public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ,
            int meta, EntityLivingBase placer) {
        return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing())
                .withProperty(OPEN, Boolean.valueOf(false)).withProperty(POWERED, Boolean.valueOf(false))
                .withProperty(IN_WALL, Boolean.valueOf(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 (((Boolean) state.getValue(OPEN)).booleanValue()) {
            state = state.withProperty(OPEN, Boolean.valueOf(false));
            worldIn.setBlockState(pos, state, 10);
        } else {
            EnumFacing enumfacing = EnumFacing.fromAngle((double) playerIn.rotationYaw);

            if (state.getValue(FACING) == enumfacing.getOpposite()) {
                state = state.withProperty(FACING, enumfacing);
            }

            state = state.withProperty(OPEN, Boolean.valueOf(true));
            worldIn.setBlockState(pos, state, 10);
        }

        worldIn.playEvent(playerIn, ((Boolean) state.getValue(OPEN)).booleanValue() ? 1008 : 1014, pos, 0);
        return true;
    }

    /**
     * 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.
     */
    @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 && !((Boolean) state.getValue(OPEN)).booleanValue()
                        && !((Boolean) state.getValue(POWERED)).booleanValue()) {
                    worldIn.setBlockState(pos, state.withProperty(OPEN, Boolean.valueOf(true)).withProperty(POWERED,
                            Boolean.valueOf(true)), 2);
                    worldIn.playEvent((EntityPlayer) null, 1008, pos, 0);
                } else if (!flag && ((Boolean) state.getValue(OPEN)).booleanValue()
                        && ((Boolean) state.getValue(POWERED)).booleanValue()) {
                    worldIn.setBlockState(pos, state.withProperty(OPEN, Boolean.valueOf(false)).withProperty(POWERED,
                            Boolean.valueOf(false)), 2);
                    worldIn.playEvent((EntityPlayer) null, 1014, pos, 0);
                } else if (flag != ((Boolean) state.getValue(POWERED)).booleanValue()) {
                    worldIn.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(flag)), 2);
                }
            }
        }
    }

    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side)
    {
        return true;
    }

    /**
     * Convert the given metadata into a BlockState for this Block
     */
    @Override
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta)).withProperty(OPEN, Boolean.valueOf((meta & 4) != 0)).withProperty(POWERED, Boolean.valueOf((meta &  != 0));
    }

    /**
     * Convert the BlockState into the correct metadata value
     */
    @Override
    public int getMetaFromState(IBlockState state)
    {
        int i = 0;
        i = i | ((EnumFacing)state.getValue(FACING)).getHorizontalIndex();

        if (((Boolean)state.getValue(POWERED)).booleanValue())
        {
            i |= 8;
        }

        if (((Boolean)state.getValue(OPEN)).booleanValue())
        {
            i |= 4;
        }

        return i;
    }
    
    @Override
    protected BlockStateContainer createBlockState()
    {
        return new BlockStateContainer(this, new IProperty[] {FACING, OPEN, POWERED, IN_WALL});
    }
    
    @Override
    public EnumBlockRenderType getRenderType(IBlockState state)
    {
        return EnumBlockRenderType.MODEL;
    }
}

 

 

Link to comment
Share on other sites

As long as you already override the methods that use the enumtype you should be able to pass in null.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

That is because Walls are hardcoded to only connect to BlockFenceGate and itself, sorry you won't be able to make it do that until Forge takes that pull request.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

I'm going to move onto slabs which i have been avoiding... although something tells me there has to be a work around for this, either by duping the vanilla class blocks into believing the new ones are acceptable blocks or, maybe, doing something in the subscribe placeblock event. I don't know java very well obviously, but it doesn't seem an overly complex thing to do in terms of things it can do. I'l mark this as unresolved for now.

Link to comment
Share on other sites

The thing to do is to make a PullRequest to forge :D

 

It seems as though i should make a topic on how to do that too :P  not quite sure where to begin after iv forked the repository. I'm inclined to just let fences be fences and walls be walls really at this point haha.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

Important Information

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