From ab0427ebd2a560daf571c07defb7f24ef5d9b969 Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 9 Apr 2014 01:18:11 +0300 Subject: [PATCH] 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;