From 7b888559b8807f2a937ab3b7a884afa184034271 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 6 Apr 2014 16:57:34 +0300 Subject: [PATCH 01/12] Register BlockHighlightHandler class --- common/buildcraft/BuildCraftEnergy.java | 1 + 1 file changed, 1 insertion(+) diff --git a/common/buildcraft/BuildCraftEnergy.java b/common/buildcraft/BuildCraftEnergy.java index 93bfef34..733b04a1 100644 --- a/common/buildcraft/BuildCraftEnergy.java +++ b/common/buildcraft/BuildCraftEnergy.java @@ -244,6 +244,7 @@ public class BuildCraftEnergy extends BuildCraftMod { } MinecraftForge.EVENT_BUS.register(this); + MinecraftForge.EVENT_BUS.register(new BlockHighlightHandler()); } @EventHandler From 17e5e266cfd8319216299ee65d415a395b0473f2 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 6 Apr 2014 16:58:06 +0300 Subject: [PATCH 02/12] Create BlockHighlightHandler.java --- .../energy/render/BlockHighlightHandler.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 common/buildcraft/energy/render/BlockHighlightHandler.java diff --git a/common/buildcraft/energy/render/BlockHighlightHandler.java b/common/buildcraft/energy/render/BlockHighlightHandler.java new file mode 100644 index 00000000..71cc8489 --- /dev/null +++ b/common/buildcraft/energy/render/BlockHighlightHandler.java @@ -0,0 +1,42 @@ +package buildcraft.energy.render; + +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import buildcraft.energy.BlockEngine; +import buildcraft.energy.TileEngine; +import net.minecraft.util.Vec3; +import org.lwjgl.opengl.GL11; + +public class BlockHighlightHandler{ + + @SubscribeEvent + public void handleBlockHighlight(DrawBlockHighlightEvent e){ + if (e.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK){ + TileEntity tile = e.player.worldObj.getTileEntity(e.target.blockX, e.target.blockY, e.target.blockZ); + if (tile instanceof TileEngine) { + AxisAlignedBB[] aabbs = BlockEngine.boxes[((TileEngine)tile).orientation.ordinal()]; + Vec3 pos = e.player.getPosition(e.partialTicks); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + for (AxisAlignedBB aabb : aabbs) { + RenderGlobal.drawOutlinedBoundingBox(aabb.copy().expand(0.02, 0.02, 0.02) + .offset(tile.xCoord, tile.yCoord, tile.zCoord) + .offset(-pos.xCoord, -pos.yCoord, -pos.zCoord), -1); + } + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + e.setCanceled(true); + } + } + } +} From 5d762c6f6d1a208acfebb4f85a9af8fc877ff2b4 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 6 Apr 2014 16:59:11 +0300 Subject: [PATCH 03/12] Raytrace check and proper collision boxes. --- common/buildcraft/energy/BlockEngine.java | 48 ++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/common/buildcraft/energy/BlockEngine.java b/common/buildcraft/energy/BlockEngine.java index b4d784ae..08926689 100644 --- a/common/buildcraft/energy/BlockEngine.java +++ b/common/buildcraft/energy/BlockEngine.java @@ -28,10 +28,23 @@ import buildcraft.core.BlockBuildCraft; import buildcraft.core.CreativeTabBuildCraft; import buildcraft.core.IItemPipe; import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import cpw.mods.fml.relauncher.SideOnly;import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; + +import static net.minecraft.util.AxisAlignedBB.getBoundingBox; public class BlockEngine extends BlockBuildCraft { + public static final AxisAlignedBB[][] boxes = { + {getBoundingBox(0.0, 0.5, 0.0, 1.0, 1.0, 1.0), getBoundingBox(0.25, 0.0, 0.25, 0.75, 0.5, 0.75)},// -Y + {getBoundingBox(0.0, 0.0, 0.0, 1.0, 0.5, 1.0), getBoundingBox(0.25, 0.5, 0.25, 0.75, 1.0, 0.75)},// +Y + {getBoundingBox(0.0, 0.0, 0.5, 1.0, 1.0, 1.0), getBoundingBox(0.25, 0.25, 0.0, 0.75, 0.75, 0.5)},// -Z + {getBoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 0.5), getBoundingBox(0.25, 0.25, 0.5, 0.75, 0.75, 1.0)},// +Z + {getBoundingBox(0.5, 0.0, 0.0, 1.0, 1.0, 1.0), getBoundingBox(0.0, 0.25, 0.25, 0.5, 0.75, 0.75)},// -X + {getBoundingBox(0.0, 0.0, 0.0, 0.5, 1.0, 1.0), getBoundingBox(0.5, 0.25, 0.25, 1.0, 0.75, 0.75)} // +X + }; + private static IIcon woodTexture; private static IIcon stoneTexture; private static IIcon ironTexture; @@ -121,6 +134,39 @@ public class BlockEngine extends BlockBuildCraft { return false; } + @Override + public void addCollisionBoxesToList(World wrd, int x, int y, int z, AxisAlignedBB full, List list, Entity ent) { + TileEntity tile = wrd.getTileEntity(x, y, z); + if (tile instanceof TileEngine){ + AxisAlignedBB[] aabbs = boxes[((TileEngine)tile).orientation.ordinal()]; + for (AxisAlignedBB aabb : aabbs) { + list.add(aabb); + } + } else { + super.addCollisionBoxesToList(wrd, x, y, z, full, list, ent); + } + } + + @Override + public MovingObjectPosition collisionRayTrace(World wrd, int x, int y, int z, Vec3 origin, Vec3 direction) { + TileEntity tile = wrd.getTileEntity(x, y, z); + if (tile instanceof TileEngine){ + AxisAlignedBB[] aabbs = boxes[((TileEngine)tile).orientation.ordinal()]; + for(AxisAlignedBB aabb : aabbs){ + MovingObjectPosition mop = aabb.getOffsetBoundingBox(x, y, z).calculateIntercept(origin, direction); + if(mop != null){ + mop.blockX = x; + mop.blockY = y; + mop.blockZ = z; + return mop; + } + } + return null; + } else { + return super.collisionRayTrace(wrd, x, y, z, origin, direction); + } + } + @Override public void onPostBlockPlaced(World world, int x, int y, int z, int par5) { TileEngine tile = (TileEngine) world.getTileEntity(x, y, z); From b7a7cd0120bc92ebe9f26c1affda49fce6aeda81 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 6 Apr 2014 17:00:21 +0300 Subject: [PATCH 04/12] >_< --- common/buildcraft/energy/BlockEngine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/buildcraft/energy/BlockEngine.java b/common/buildcraft/energy/BlockEngine.java index 08926689..6fee9bc7 100644 --- a/common/buildcraft/energy/BlockEngine.java +++ b/common/buildcraft/energy/BlockEngine.java @@ -28,7 +28,8 @@ import buildcraft.core.BlockBuildCraft; import buildcraft.core.CreativeTabBuildCraft; import buildcraft.core.IItemPipe; import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly;import net.minecraft.util.MovingObjectPosition; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; From ca1eb0b4eeb18c05fe7dd187faa8504218637239 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 6 Apr 2014 17:39:51 +0300 Subject: [PATCH 05/12] Fix collision boxes. --- common/buildcraft/energy/BlockEngine.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/buildcraft/energy/BlockEngine.java b/common/buildcraft/energy/BlockEngine.java index 6fee9bc7..694501a0 100644 --- a/common/buildcraft/energy/BlockEngine.java +++ b/common/buildcraft/energy/BlockEngine.java @@ -141,7 +141,10 @@ public class BlockEngine extends BlockBuildCraft { if (tile instanceof TileEngine){ AxisAlignedBB[] aabbs = boxes[((TileEngine)tile).orientation.ordinal()]; for (AxisAlignedBB aabb : aabbs) { - list.add(aabb); + aabb = aabb.getOffsetBoundingBox(x, y, z); + if (mask.intersectsWith(aabb)){ + list.add(aabb); + } } } else { super.addCollisionBoxesToList(wrd, x, y, z, full, list, ent); From 84b1d5832003a43f7a5983bff08fbcb4ed1bb2f7 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 6 Apr 2014 17:42:07 +0300 Subject: [PATCH 06/12] Fix incorrect block placing on engines --- common/buildcraft/energy/BlockEngine.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/common/buildcraft/energy/BlockEngine.java b/common/buildcraft/energy/BlockEngine.java index 694501a0..521308a6 100644 --- a/common/buildcraft/energy/BlockEngine.java +++ b/common/buildcraft/energy/BlockEngine.java @@ -31,6 +31,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.entity.Entity; import net.minecraft.util.Vec3; import static net.minecraft.util.AxisAlignedBB.getBoundingBox; @@ -156,16 +157,23 @@ public class BlockEngine extends BlockBuildCraft { TileEntity tile = wrd.getTileEntity(x, y, z); if (tile instanceof TileEngine){ AxisAlignedBB[] aabbs = boxes[((TileEngine)tile).orientation.ordinal()]; + MovingObjectPosition closest = null; for(AxisAlignedBB aabb : aabbs){ MovingObjectPosition mop = aabb.getOffsetBoundingBox(x, y, z).calculateIntercept(origin, direction); if(mop != null){ mop.blockX = x; mop.blockY = y; mop.blockZ = z; - return mop; + if (closest != null) { + if (mop.hitVec.distanceTo(origin) < closest.hitVec.distanceTo(origin)) { + closest = mop; + } + } else { + closest = mop; + } } } - return null; + return closest; } else { return super.collisionRayTrace(wrd, x, y, z, origin, direction); } From 7936fcece860a84dffccf64d0319950638f3fac4 Mon Sep 17 00:00:00 2001 From: Anton Date: Tue, 8 Apr 2014 17:08:39 +0300 Subject: [PATCH 07/12] Whooooops =/ --- common/buildcraft/energy/BlockEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/buildcraft/energy/BlockEngine.java b/common/buildcraft/energy/BlockEngine.java index 521308a6..68873794 100644 --- a/common/buildcraft/energy/BlockEngine.java +++ b/common/buildcraft/energy/BlockEngine.java @@ -137,7 +137,7 @@ public class BlockEngine extends BlockBuildCraft { } @Override - public void addCollisionBoxesToList(World wrd, int x, int y, int z, AxisAlignedBB full, List list, Entity ent) { + public void addCollisionBoxesToList(World wrd, int x, int y, int z, AxisAlignedBB mask, List list, Entity ent) { TileEntity tile = wrd.getTileEntity(x, y, z); if (tile instanceof TileEngine){ AxisAlignedBB[] aabbs = boxes[((TileEngine)tile).orientation.ordinal()]; From f8f449cd93b1ed0f59bc5f4b8faf6fd9e0f6f3a7 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 9 Apr 2014 01:13:50 +0300 Subject: [PATCH 08/12] Create ICustomHighlight.java --- common/buildcraft/core/ICustomHighlight.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 common/buildcraft/core/ICustomHighlight.java diff --git a/common/buildcraft/core/ICustomHighlight.java b/common/buildcraft/core/ICustomHighlight.java new file mode 100644 index 00000000..453dc521 --- /dev/null +++ b/common/buildcraft/core/ICustomHighlight.java @@ -0,0 +1,12 @@ +package buildcraft.core; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; + +public interface ICustomHighlight{ + + public AxisAlignedBB[] getBoxes(World wrd, int x, int y, int z, EntityPlayer player); + + public double getExpansion(); +} From 409d28e45deffc1652a2360948ffd4525e8c16ed Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 9 Apr 2014 01:15:20 +0300 Subject: [PATCH 09/12] Recreate BlockHighlightHandler in core package --- .../core/render/BlockHighlightHandler.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 common/buildcraft/core/render/BlockHighlightHandler.java diff --git a/common/buildcraft/core/render/BlockHighlightHandler.java b/common/buildcraft/core/render/BlockHighlightHandler.java new file mode 100644 index 00000000..0690a9fa --- /dev/null +++ b/common/buildcraft/core/render/BlockHighlightHandler.java @@ -0,0 +1,45 @@ +package buildcraft.core.render; + +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.util.MovingObjectPosition; +import buildcraft.core.ICustomHighlight; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.block.Block; +import net.minecraft.util.Vec3; +import org.lwjgl.opengl.GL11; + +public class BlockHighlightHandler{ + + @SubscribeEvent + public void handleBlockHighlight(DrawBlockHighlightEvent e){ + if (e.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK){ + int x = e.target.blockX; + int y = e.target.blockY; + int z = e.target.blockZ; + Block block = e.player.worldObj.getBlock(x, y, z); + if (block instanceof ICustomHighlight) { + AxisAlignedBB[] aabbs = ((ICustomHighlight)block).getBoxes(e.player.worldObj, x, y, z, e.player); + Vec3 pos = e.player.getPosition(e.partialTicks); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + double exp = ((ICustomHighlight)block).getExpansion(); + for (AxisAlignedBB aabb : aabbs) { + RenderGlobal.drawOutlinedBoundingBox(aabb.copy().expand(exp, exp, exp) + .offset(x, y, z) + .offset(-pos.xCoord, -pos.yCoord, -pos.zCoord), -1); + } + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + e.setCanceled(true); + } + } + } +} From 9599cc0594dcbcc6e69c4bf5df938f0e12508ac2 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 9 Apr 2014 01:15:45 +0300 Subject: [PATCH 10/12] Delete old BlockHighlightHandler --- .../energy/render/BlockHighlightHandler.java | 42 ------------------- 1 file changed, 42 deletions(-) delete mode 100644 common/buildcraft/energy/render/BlockHighlightHandler.java diff --git a/common/buildcraft/energy/render/BlockHighlightHandler.java b/common/buildcraft/energy/render/BlockHighlightHandler.java deleted file mode 100644 index 71cc8489..00000000 --- a/common/buildcraft/energy/render/BlockHighlightHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -package buildcraft.energy.render; - -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraftforge.client.event.DrawBlockHighlightEvent; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import net.minecraft.client.renderer.RenderGlobal; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import buildcraft.energy.BlockEngine; -import buildcraft.energy.TileEngine; -import net.minecraft.util.Vec3; -import org.lwjgl.opengl.GL11; - -public class BlockHighlightHandler{ - - @SubscribeEvent - public void handleBlockHighlight(DrawBlockHighlightEvent e){ - if (e.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK){ - TileEntity tile = e.player.worldObj.getTileEntity(e.target.blockX, e.target.blockY, e.target.blockZ); - if (tile instanceof TileEngine) { - AxisAlignedBB[] aabbs = BlockEngine.boxes[((TileEngine)tile).orientation.ordinal()]; - Vec3 pos = e.player.getPosition(e.partialTicks); - GL11.glEnable(GL11.GL_BLEND); - OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); - GL11.glLineWidth(2.0F); - GL11.glDisable(GL11.GL_TEXTURE_2D); - GL11.glDepthMask(false); - for (AxisAlignedBB aabb : aabbs) { - RenderGlobal.drawOutlinedBoundingBox(aabb.copy().expand(0.02, 0.02, 0.02) - .offset(tile.xCoord, tile.yCoord, tile.zCoord) - .offset(-pos.xCoord, -pos.yCoord, -pos.zCoord), -1); - } - GL11.glDepthMask(true); - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDisable(GL11.GL_BLEND); - e.setCanceled(true); - } - } - } -} From bcf148e90dca6b5eca00f1036b45c70fd6cd95d4 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 9 Apr 2014 01:17:02 +0300 Subject: [PATCH 11/12] 'Generalize' engines. --- common/buildcraft/energy/BlockEngine.java | 37 +++++++++++++++++------ 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/common/buildcraft/energy/BlockEngine.java b/common/buildcraft/energy/BlockEngine.java index 68873794..f64a9c94 100644 --- a/common/buildcraft/energy/BlockEngine.java +++ b/common/buildcraft/energy/BlockEngine.java @@ -30,15 +30,16 @@ import buildcraft.core.IItemPipe; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.MovingObjectPosition; +import buildcraft.core.ICustomHighlight; import net.minecraft.util.AxisAlignedBB; import net.minecraft.entity.Entity; import net.minecraft.util.Vec3; import static net.minecraft.util.AxisAlignedBB.getBoundingBox; -public class BlockEngine extends BlockBuildCraft { +public class BlockEngine extends BlockBuildCraft implements ICustomHighlight { - public static final AxisAlignedBB[][] boxes = { + private static final AxisAlignedBB[][] boxes = { {getBoundingBox(0.0, 0.5, 0.0, 1.0, 1.0, 1.0), getBoundingBox(0.25, 0.0, 0.25, 0.75, 0.5, 0.75)},// -Y {getBoundingBox(0.0, 0.0, 0.0, 1.0, 0.5, 1.0), getBoundingBox(0.25, 0.5, 0.25, 0.75, 1.0, 0.75)},// +Y {getBoundingBox(0.0, 0.0, 0.5, 1.0, 1.0, 1.0), getBoundingBox(0.25, 0.25, 0.0, 0.75, 0.75, 0.5)},// -Z @@ -137,6 +138,7 @@ public class BlockEngine extends BlockBuildCraft { } @Override + @SuppressWarnings("unchecked") public void addCollisionBoxesToList(World wrd, int x, int y, int z, AxisAlignedBB mask, List list, Entity ent) { TileEntity tile = wrd.getTileEntity(x, y, z); if (tile instanceof TileEngine){ @@ -148,10 +150,25 @@ public class BlockEngine extends BlockBuildCraft { } } } else { - super.addCollisionBoxesToList(wrd, x, y, z, full, list, ent); + super.addCollisionBoxesToList(wrd, x, y, z, mask, list, ent); } } + @Override + public AxisAlignedBB[] getBoxes(World wrd, int x, int y, int z, EntityPlayer player) { + TileEntity tile = wrd.getTileEntity(x, y, z); + if (tile instanceof TileEngine) { + return boxes[((TileEngine)tile).orientation.ordinal()]; + } else { + return new AxisAlignedBB[]{AxisAlignedBB.getAABBPool().getAABB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0)}; + } + } + + @Override + public double getExpansion() { + return 0.0075; + } + @Override public MovingObjectPosition collisionRayTrace(World wrd, int x, int y, int z, Vec3 origin, Vec3 direction) { TileEntity tile = wrd.getTileEntity(x, y, z); @@ -161,18 +178,18 @@ public class BlockEngine extends BlockBuildCraft { for(AxisAlignedBB aabb : aabbs){ MovingObjectPosition mop = aabb.getOffsetBoundingBox(x, y, z).calculateIntercept(origin, direction); if(mop != null){ - mop.blockX = x; - mop.blockY = y; - mop.blockZ = z; - if (closest != null) { - if (mop.hitVec.distanceTo(origin) < closest.hitVec.distanceTo(origin)) { - closest = mop; - } + if (closest != null && mop.hitVec.distanceTo(origin) < closest.hitVec.distanceTo(origin)) { + closest = mop; } else { closest = mop; } } } + if (closest != null){ + closest.blockX = x; + closest.blockY = y; + closest.blockZ = z; + } return closest; } else { return super.collisionRayTrace(wrd, x, y, z, origin, direction); From ab0427ebd2a560daf571c07defb7f24ef5d9b969 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 9 Apr 2014 01:18:11 +0300 Subject: [PATCH 12/12] Improved bounding box for lasers! --- common/buildcraft/silicon/BlockLaser.java | 64 ++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/common/buildcraft/silicon/BlockLaser.java b/common/buildcraft/silicon/BlockLaser.java index bb19fd6d..0e2ad009 100644 --- a/common/buildcraft/silicon/BlockLaser.java +++ b/common/buildcraft/silicon/BlockLaser.java @@ -18,8 +18,26 @@ import net.minecraftforge.common.util.ForgeDirection; import buildcraft.core.CreativeTabBuildCraft; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.MovingObjectPosition; +import buildcraft.core.ICustomHighlight; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.Vec3; +import java.util.List; -public class BlockLaser extends BlockContainer { +import static net.minecraft.util.AxisAlignedBB.getBoundingBox; + +public class BlockLaser extends BlockContainer implements ICustomHighlight { + + private static final AxisAlignedBB[][] boxes = { + {getBoundingBox(0.0, 0.75, 0.0, 1.0, 1.0, 1.0), getBoundingBox(0.3125, 0.1875, 0.3125, 0.6875, 0.75, 0.6875)},// -Y + {getBoundingBox(0.0, 0.0, 0.0, 1.0, 0.25, 1.0), getBoundingBox(0.3125, 0.25, 0.3125, 0.6875, 0.8125, 0.6875)},// +Y + {getBoundingBox(0.0, 0.0, 0.75, 1.0, 1.0, 1.0), getBoundingBox(0.3125, 0.3125, 0.1875, 0.6875, 0.6875, 0.75)},// -Z + {getBoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 0.25), getBoundingBox(0.3125, 0.3125, 0.25, 0.6875, 0.6875, 0.8125)},// +Z + {getBoundingBox(0.75, 0.0, 0.0, 1.0, 1.0, 1.0), getBoundingBox(0.1875, 0.3125, 0.3125, 0.75, 0.6875, 0.6875)},// -X + {getBoundingBox(0.0, 0.0, 0.0, 0.25, 1.0, 1.0), getBoundingBox(0.25, 0.3125, 0.3125, 0.8125, 0.6875, 0.6875)} // +X + }; @SideOnly(Side.CLIENT) private IIcon textureTop, textureBottom, textureSide; @@ -30,6 +48,50 @@ public class BlockLaser extends BlockContainer { setCreativeTab(CreativeTabBuildCraft.TIER_3.get()); } + @Override + public AxisAlignedBB[] getBoxes(World wrd, int x, int y, int z, EntityPlayer player) { + return boxes[wrd.getBlockMetadata(x, y, z)]; + } + + @Override + public double getExpansion() { + return 0.0075; + } + + @Override + public MovingObjectPosition collisionRayTrace(World wrd, int x, int y, int z, Vec3 origin, Vec3 direction) { + AxisAlignedBB[] aabbs = boxes[wrd.getBlockMetadata(x, y, z)]; + MovingObjectPosition closest = null; + for(AxisAlignedBB aabb : aabbs){ + MovingObjectPosition mop = aabb.getOffsetBoundingBox(x, y, z).calculateIntercept(origin, direction); + if(mop != null){ + if (closest != null && mop.hitVec.distanceTo(origin) < closest.hitVec.distanceTo(origin)) { + closest = mop; + } else { + closest = mop; + } + } + } + if (closest != null){ + closest.blockX = x; + closest.blockY = y; + closest.blockZ = z; + } + return closest; + } + + @Override + @SuppressWarnings("unchecked") + public void addCollisionBoxesToList(World wrd, int x, int y, int z, AxisAlignedBB mask, List list, Entity ent) { + AxisAlignedBB[] aabbs = boxes[wrd.getBlockMetadata(x, y, z)]; + for (AxisAlignedBB aabb : aabbs) { + aabb = aabb.getOffsetBoundingBox(x, y, z); + if (mask.intersectsWith(aabb)){ + list.add(aabb); + } + } + } + @Override public int getRenderType() { return SiliconProxy.laserBlockModel;