Allow connectable blocks to choose what they can connect to (#3437)

This commit is contained in:
LogicTechCorp 2016-11-30 18:51:36 -07:00 committed by LexManos
parent 249c468a75
commit 0b9988bf45
5 changed files with 152 additions and 6 deletions

View File

@ -197,7 +197,7 @@
public SoundType func_185467_w()
{
return this.field_149762_H;
@@ -908,6 +932,1153 @@
@@ -908,6 +932,1166 @@
{
}
@ -1346,12 +1346,25 @@
+ return func_180642_a(world, pos, facing, hitX, hitY, hitZ, meta, placer);
+ }
+
+ /**
+ * Determines if another block can connect to this block
+ *
+ * @param world The current world
+ * @param pos The position of this block
+ * @param facing The side the connecting block is on
+ * @return True to allow another block to connect to this block
+ */
+ public boolean canBeConnectedTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ return false;
+ }
+
+ /* ========================================= FORGE END ======================================*/
+
public static void func_149671_p()
{
func_176215_a(0, field_176230_a, (new BlockAir()).func_149663_c("air"));
@@ -1201,14 +2372,7 @@
@@ -1201,14 +2385,7 @@
}
else
{

View File

@ -0,0 +1,49 @@
--- ../src-base/minecraft/net/minecraft/block/BlockFence.java
+++ ../src-work/minecraft/net/minecraft/block/BlockFence.java
@@ -153,7 +153,10 @@
public IBlockState func_176221_a(IBlockState p_176221_1_, IBlockAccess p_176221_2_, BlockPos p_176221_3_)
{
- return p_176221_1_.func_177226_a(field_176526_a, Boolean.valueOf(this.func_176524_e(p_176221_2_, p_176221_3_.func_177978_c()))).func_177226_a(field_176525_b, Boolean.valueOf(this.func_176524_e(p_176221_2_, p_176221_3_.func_177974_f()))).func_177226_a(field_176527_M, Boolean.valueOf(this.func_176524_e(p_176221_2_, p_176221_3_.func_177968_d()))).func_177226_a(field_176528_N, Boolean.valueOf(this.func_176524_e(p_176221_2_, p_176221_3_.func_177976_e())));
+ return p_176221_1_.func_177226_a(field_176526_a, canFenceConnectTo(p_176221_2_, p_176221_3_, EnumFacing.NORTH))
+ .func_177226_a(field_176525_b, canFenceConnectTo(p_176221_2_, p_176221_3_, EnumFacing.EAST))
+ .func_177226_a(field_176527_M, canFenceConnectTo(p_176221_2_, p_176221_3_, EnumFacing.SOUTH))
+ .func_177226_a(field_176528_N, canFenceConnectTo(p_176221_2_, p_176221_3_, EnumFacing.WEST));
}
public IBlockState func_185499_a(IBlockState p_185499_1_, Rotation p_185499_2_)
@@ -188,4 +191,34 @@
{
return new BlockStateContainer(this, new IProperty[] {field_176526_a, field_176525_b, field_176528_N, field_176527_M});
}
+
+ /* ======================================== FORGE START ======================================== */
+
+ @Override
+ public boolean canBeConnectedTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block connector = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+
+ if(connector instanceof BlockFence)
+ {
+ if(this != Blocks.field_150386_bk && connector == Blocks.field_150386_bk)
+ {
+ return false;
+ }
+ else if(this == Blocks.field_150386_bk && connector != Blocks.field_150386_bk)
+ {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private boolean canFenceConnectTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block block = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return block.canBeConnectedTo(world, pos.func_177972_a(facing), facing.func_176734_d()) || func_176524_e(world, pos.func_177972_a(facing));
+ }
+
+ /* ======================================== FORGE END ======================================== */
}

View File

@ -0,0 +1,33 @@
--- ../src-base/minecraft/net/minecraft/block/BlockFenceGate.java
+++ ../src-work/minecraft/net/minecraft/block/BlockFenceGate.java
@@ -50,7 +50,7 @@
{
EnumFacing.Axis enumfacing$axis = ((EnumFacing)p_176221_1_.func_177229_b(field_185512_D)).func_176740_k();
- if (enumfacing$axis == EnumFacing.Axis.Z && (p_176221_2_.func_180495_p(p_176221_3_.func_177976_e()).func_177230_c() == Blocks.field_150463_bK || p_176221_2_.func_180495_p(p_176221_3_.func_177974_f()).func_177230_c() == Blocks.field_150463_bK) || enumfacing$axis == EnumFacing.Axis.X && (p_176221_2_.func_180495_p(p_176221_3_.func_177978_c()).func_177230_c() == Blocks.field_150463_bK || p_176221_2_.func_180495_p(p_176221_3_.func_177968_d()).func_177230_c() == Blocks.field_150463_bK))
+ if (enumfacing$axis == EnumFacing.Axis.Z && (canFenceGateConnectTo(p_176221_2_, p_176221_3_, EnumFacing.WEST) || canFenceGateConnectTo(p_176221_2_, p_176221_3_, EnumFacing.EAST)) || enumfacing$axis == EnumFacing.Axis.X && (canFenceGateConnectTo(p_176221_2_, p_176221_3_, EnumFacing.NORTH) || canFenceGateConnectTo(p_176221_2_, p_176221_3_, EnumFacing.SOUTH)))
{
p_176221_1_ = p_176221_1_.func_177226_a(field_176467_M, Boolean.valueOf(true));
}
@@ -175,4 +175,21 @@
{
return new BlockStateContainer(this, new IProperty[] {field_185512_D, field_176466_a, field_176465_b, field_176467_M});
}
+
+ /* ======================================== FORGE START ======================================== */
+
+ @Override
+ public boolean canBeConnectedTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block connector = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return connector instanceof BlockFence || connector instanceof BlockWall;
+ }
+
+ private boolean canFenceGateConnectTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block block = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return block.canBeConnectedTo(world, pos.func_177972_a(facing), facing.func_176734_d());
+ }
+
+ /* ======================================== FORGE END ======================================== */
}

View File

@ -12,15 +12,25 @@
}
public Item func_180660_a(IBlockState p_180660_1_, Random p_180660_2_, int p_180660_3_)
@@ -184,4 +187,11 @@
@@ -184,4 +187,21 @@
{
return new BlockStateContainer(this, new IProperty[] {field_176241_b, field_176242_M, field_176244_O, field_176243_N});
}
+
+ /* ======================================== FORGE START ======================================== */
+
+ @Override
+ public boolean canBeConnectedTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block connector = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return connector instanceof BlockPane;
+ }
+
+ public boolean canPaneConnectTo(IBlockAccess world, BlockPos pos, EnumFacing dir)
+ {
+ BlockPos off = pos.func_177972_a(dir);
+ IBlockState state = world.func_180495_p(off);
+ return func_150098_a(state.func_177230_c()) || state.isSideSolid(world, off, dir.func_176734_d());
+ IBlockState state = world.func_180495_p(pos.func_177972_a(dir));
+ return state.func_177230_c().canBeConnectedTo(world, pos.func_177972_a(dir), dir.func_176734_d()) || func_150098_a(state.func_177230_c()) || state.isSideSolid(world, pos.func_177972_a(dir), dir.func_176734_d());
+ }
+
+ /* ======================================== FORGE END ======================================== */
}

View File

@ -0,0 +1,41 @@
--- ../src-base/minecraft/net/minecraft/block/BlockWall.java
+++ ../src-work/minecraft/net/minecraft/block/BlockWall.java
@@ -141,10 +141,10 @@
public IBlockState func_176221_a(IBlockState p_176221_1_, IBlockAccess p_176221_2_, BlockPos p_176221_3_)
{
- boolean flag = this.func_176253_e(p_176221_2_, p_176221_3_.func_177978_c());
- boolean flag1 = this.func_176253_e(p_176221_2_, p_176221_3_.func_177974_f());
- boolean flag2 = this.func_176253_e(p_176221_2_, p_176221_3_.func_177968_d());
- boolean flag3 = this.func_176253_e(p_176221_2_, p_176221_3_.func_177976_e());
+ boolean flag = canWallConnectTo(p_176221_2_, p_176221_3_, EnumFacing.NORTH);
+ boolean flag1 = canWallConnectTo(p_176221_2_, p_176221_3_, EnumFacing.EAST);
+ boolean flag2 = canWallConnectTo(p_176221_2_, p_176221_3_, EnumFacing.SOUTH);
+ boolean flag3 = canWallConnectTo(p_176221_2_, p_176221_3_, EnumFacing.WEST);
boolean flag4 = flag && !flag1 && flag2 && !flag3 || !flag && flag1 && !flag2 && flag3;
return p_176221_1_.func_177226_a(field_176256_a, Boolean.valueOf(!flag4 || !p_176221_2_.func_175623_d(p_176221_3_.func_177984_a()))).func_177226_a(field_176254_b, Boolean.valueOf(flag)).func_177226_a(field_176257_M, Boolean.valueOf(flag1)).func_177226_a(field_176258_N, Boolean.valueOf(flag2)).func_177226_a(field_176259_O, Boolean.valueOf(flag3));
}
@@ -154,6 +154,23 @@
return new BlockStateContainer(this, new IProperty[] {field_176256_a, field_176254_b, field_176257_M, field_176259_O, field_176258_N, field_176255_P});
}
+ /* ======================================== FORGE START ======================================== */
+
+ @Override
+ public boolean canBeConnectedTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block connector = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return connector instanceof BlockWall || connector instanceof BlockFenceGate;
+ }
+
+ private boolean canWallConnectTo(IBlockAccess world, BlockPos pos, EnumFacing facing)
+ {
+ Block block = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return block.canBeConnectedTo(world, pos.func_177972_a(facing), facing.func_176734_d()) || func_176253_e(world, pos.func_177972_a(facing));
+ }
+
+ /* ======================================== FORGE END ======================================== */
+
public static enum EnumType implements IStringSerializable
{
NORMAL(0, "cobblestone", "normal"),