diff --git a/src/main/java/mcjty/xnet/blocks/cables/ConnectorBlock.java b/src/main/java/mcjty/xnet/blocks/cables/ConnectorBlock.java index 8144b7c0..09a8b58c 100644 --- a/src/main/java/mcjty/xnet/blocks/cables/ConnectorBlock.java +++ b/src/main/java/mcjty/xnet/blocks/cables/ConnectorBlock.java @@ -30,6 +30,7 @@ import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -41,6 +42,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.IBlockAccess; @@ -448,4 +450,32 @@ public static boolean isAdvancedConnector(World world, BlockPos pos) { public boolean isAdvancedConnector() { return false; } + + @Override + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean isActualState) { + IBlockState mimicBlock = getMimicBlock(worldIn, pos); + if (mimicBlock != null) { + mimicBlock = mimicBlock.getActualState(worldIn, pos); + mimicBlock.getBlock().addCollisionBoxToList(mimicBlock, worldIn, pos, entityBox, collidingBoxes, entityIn, true); + return; + } + + addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_CENTER); + + for (EnumFacing facing : EnumFacing.VALUES) { + ConnectorType connectorType = getConnectorType(state.getValue(COLOR), worldIn, pos, facing); + if (connectorType == ConnectorType.CABLE) { + addCollisionBoxToList(pos, entityBox, collidingBoxes, AABBS[facing.getIndex()]); + } else if (connectorType == ConnectorType.BLOCK) { + addCollisionBoxToList(pos, entityBox, collidingBoxes, AABBS_CONNECTOR[facing.getIndex()]); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) { + IBlockState mimicBlock = getMimicBlock(worldIn, pos); + return mimicBlock != null ? mimicBlock.getSelectedBoundingBox(worldIn, pos) : super.getSelectedBoundingBox(state, worldIn, pos); + } } diff --git a/src/main/java/mcjty/xnet/blocks/cables/NetCableBlock.java b/src/main/java/mcjty/xnet/blocks/cables/NetCableBlock.java index 36de8446..95274323 100644 --- a/src/main/java/mcjty/xnet/blocks/cables/NetCableBlock.java +++ b/src/main/java/mcjty/xnet/blocks/cables/NetCableBlock.java @@ -9,10 +9,12 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -21,6 +23,8 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; public class NetCableBlock extends GenericCableBlock { @@ -80,4 +84,14 @@ protected ConnectorType getConnectorType(@Nonnull CableColor color, IBlockAccess } } + @Override + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean isActualState) { + addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_CENTER); + + for (EnumFacing facing : EnumFacing.VALUES) { + if (getConnectorType(state.getValue(COLOR), worldIn, pos, facing) != ConnectorType.NONE) { + addCollisionBoxToList(pos, entityBox, collidingBoxes, AABBS[facing.getIndex()]); + } + } + } } diff --git a/src/main/java/mcjty/xnet/blocks/facade/FacadeBlock.java b/src/main/java/mcjty/xnet/blocks/facade/FacadeBlock.java index c2aa9d06..d5950bcc 100644 --- a/src/main/java/mcjty/xnet/blocks/facade/FacadeBlock.java +++ b/src/main/java/mcjty/xnet/blocks/facade/FacadeBlock.java @@ -12,6 +12,7 @@ import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -22,9 +23,8 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.client.model.ModelLoader; @@ -35,6 +35,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; +import java.util.List; public class FacadeBlock extends NetCableBlock implements ITileEntityProvider { @@ -60,13 +61,6 @@ protected void initTileEntity() { GameRegistry.registerTileEntity(FacadeTileEntity.class, XNet.MODID + "_facade"); } - @Nullable - @Override - public RayTraceResult collisionRayTrace(IBlockState blockState, World world, BlockPos pos, Vec3d start, Vec3d end) { - // We do not want the raytracing that happens in the GenericCableBlock - return super.originalCollisionRayTrace(blockState, world, pos, start, end); - } - @Override public TileEntity createNewTileEntity(World world, int i) { return null; @@ -116,8 +110,6 @@ public void breakBlock(World world, BlockPos pos, IBlockState state) { originalBreakBlock(world, pos, state); } - - @Override @SideOnly(Side.CLIENT) public void initModel() { @@ -149,6 +141,24 @@ public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAc return mimicBlock == null ? true : mimicBlock.shouldSideBeRendered(blockAccess, pos, side); } + @Override + public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean isActualState) { + IBlockState mimicBlock = getMimicBlock(worldIn, pos); + if (mimicBlock != null) { + mimicBlock = mimicBlock.getActualState(worldIn, pos); + mimicBlock.getBlock().addCollisionBoxToList(mimicBlock, worldIn, pos, entityBox, collidingBoxes, entityIn, true); + return; + } + super.addCollisionBoxToList(state, worldIn, pos, entityBox, collidingBoxes, entityIn, isActualState); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) { + IBlockState mimicBlock = getMimicBlock(worldIn, pos); + return mimicBlock != null ? mimicBlock.getSelectedBoundingBox(worldIn, pos) : super.getSelectedBoundingBox(state, worldIn, pos); + } + @Override @SideOnly(Side.CLIENT) public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer) { @@ -175,6 +185,4 @@ public boolean doesSideBlockRendering(IBlockState state, IBlockAccess world, Blo public boolean isFullCube(IBlockState state) { return true; } - - } diff --git a/src/main/java/mcjty/xnet/blocks/generic/GenericCableBlock.java b/src/main/java/mcjty/xnet/blocks/generic/GenericCableBlock.java index 6ce466ec..3b65bf54 100644 --- a/src/main/java/mcjty/xnet/blocks/generic/GenericCableBlock.java +++ b/src/main/java/mcjty/xnet/blocks/generic/GenericCableBlock.java @@ -25,6 +25,7 @@ import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; 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.client.renderer.block.model.ModelResourceLocation; @@ -184,9 +185,9 @@ public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, Bl @Nullable @Override public RayTraceResult collisionRayTrace(IBlockState blockState, World world, BlockPos pos, Vec3d start, Vec3d end) { - if (getMimicBlock(world, pos) != null) { - // In mimic mode we use original raytrace mode - return originalCollisionRayTrace(blockState, world, pos, start, end); + IBlockState mimicBlock = getMimicBlock(world, pos); + if (mimicBlock != null) { + return mimicBlock.getBlock().collisionRayTrace(mimicBlock, world, pos, start, end); } Vec3d vec3d = start.subtract(pos.getX(), pos.getY(), pos.getZ()); Vec3d vec3d1 = end.subtract(pos.getX(), pos.getY(), pos.getZ()); @@ -219,10 +220,6 @@ private RayTraceResult checkIntersect(BlockPos pos, Vec3d vec3d, Vec3d vec3d1, A return raytraceresult == null ? null : new RayTraceResult(raytraceresult.hitVec.addVector(pos.getX(), pos.getY(), pos.getZ()), raytraceresult.sideHit, pos); } - protected RayTraceResult originalCollisionRayTrace(IBlockState blockState, World world, BlockPos pos, Vec3d start, Vec3d end) { - return super.collisionRayTrace(blockState, world, pos, start, end); - } - @Override @SideOnly(Side.CLIENT) @Optional.Method(modid = "waila") @@ -311,6 +308,11 @@ public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAc return false; } + @Override + public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) { + return BlockFaceShape.UNDEFINED; + } + @Override public boolean isBlockNormalCube(IBlockState blockState) { return false;