package minefantasy.system;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.*;
@SideOnly(Side.CLIENT)
public abstract class ExtendedReachHelper
{
private static Minecraft mc = FMLClientHandler.instance().getClient();
/**
* This method will return the entitly or tile the mouse is hovering over up to the distance provided. It is more or less a copy/paste of the default
* minecraft version.
*
* @return
*/
public static MovingObjectPosition getMouseOver(float tickPart, float maxDist)
{
Minecraft mc = FMLClientHandler.instance().getClient();
if (mc.renderViewEntity != null)
{
if (mc.theWorld != null)
{
mc.pointedEntityLiving = null;
double d0 = (double)maxDist;
MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart);
double d1 = d0;
Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart);
if (objectMouseOver != null)
{
d1 = objectMouseOver.hitVec.distanceTo(vec3);
}
Vec3 vec31 = mc.renderViewEntity.getLook(tickPart);
Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
Entity pointedEntity = null;
float f1 = 1.0F;
List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, mc.renderViewEntity.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand((double)f1, (double)f1, (double)f1));
double d2 = d1;
for (int i = 0; i < list.size(); ++i)
{
Entity entity = (Entity)list.get(i);
if (entity.canBeCollidedWith())
{
float f2 = entity.getCollisionBorderSize();
AxisAlignedBB axisalignedbb = entity.boundingBox.expand((double)f2, (double)f2, (double)f2);
MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);
if (axisalignedbb.isVecInside(vec3))
{
if (0.0D < d2 || d2 == 0.0D)
{
pointedEntity = entity;
d2 = 0.0D;
}
}
else if (movingobjectposition != null)
{
double d3 = vec3.distanceTo(movingobjectposition.hitVec);
if (d3 < d2 || d2 == 0.0D)
{
pointedEntity = entity;
d2 = d3;
}
}
}
}
if (pointedEntity != null && (d2 < d1 || objectMouseOver == null))
{
objectMouseOver = new MovingObjectPosition(pointedEntity);
}
return objectMouseOver;
}
}
return null;
}
}