package mods.immibis.microblocks.api.util;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import mods.immibis.core.api.multipart.IPartContainer;
import mods.immibis.microblocks.api.IMicroblockIntegratedTile;
public abstract class TileCoverableMultipartBase extends TileCoverableBase implements IPartContainer, IMicroblockIntegratedTile {
protected abstract int getNumTileOwnedParts();
private static MovingObjectPosition getCloserMOP(MovingObjectPosition a, MovingObjectPosition b, Vec3 src) {
if(a == null) return b;
if(b == null) return a;
double ciDistSq = a.hitVec.squareDistanceTo(src);
double normalDistSq = b.hitVec.squareDistanceTo(src);
return ciDistSq < normalDistSq ? a : b;
}
@Override
public MovingObjectPosition collisionRayTrace(Vec3 src, Vec3 dst) {
MovingObjectPosition result = null;
for(int k = 0, num = getNumTileOwnedParts(); k < num; k++) {
AxisAlignedBB partBB = getPartAABBFromPool(k);
if(partBB != null) {
partBB.offset(xCoord, yCoord, zCoord);
MovingObjectPosition intersect = partBB.calculateIntercept(src, dst);
if(intersect != null) {
intersect.subHit = k;
intersect.typeOfHit = MovingObjectPosition.MovingObjectType.BLOCK;
intersect.blockX = xCoord;
intersect.blockY = yCoord;
intersect.blockZ = zCoord;
result = getCloserMOP(result, intersect, src);
}
}
}
return result;
}
@Override
public void getCollidingBoundingBoxes(AxisAlignedBB mask, List<AxisAlignedBB> list, Entity entity) {
for(int k = 0, num = getNumTileOwnedParts(); k < num; k++) {
AxisAlignedBB partBB = getPartAABBFromPool(k);
if(partBB != null) {
partBB.offset(xCoord, yCoord, zCoord);
if(partBB.intersectsWith(mask))
list.add(partBB);
}
}
}
}