import com.sun.istack.internal.NotNull;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.projectile.ProjectileHelper;
import net.minecraft.util.math.*;
import net.minecraft.util.math.vector.Vector3d;
public class RayTraceUtil {
private static final Minecraft mc = Minecraft.getInstance();
public static Entity getMouseOver(Entity target,
float yaw,
float pitch,
double distance) {
RayTraceResult result = rayTrace(distance, yaw, pitch);
Vector3d startPoint = mc.player.getPosition(1).add(0, mc.player.getEyeHeight(mc.player.getPose()), 0);
double distancePow2 = Math.pow(distance, 2);
if (result != null)
distancePow2 = startPoint.distanceToSqr(result.getLocation());
Vector3d rotationVector = getRotationVector(pitch, yaw).multiply(distance, distance, distance);
Vector3d endPoint = startPoint.add(rotationVector);
AxisAlignedBB entityArea = mc.player.getBoundingBox().expandTowards(rotationVector).inflate(1.0, 1.0, 1.0);
EntityRayTraceResult ehr;
double maxDistance = Math.max(distancePow2, Math.pow(distance, 2));
ehr = ProjectileHelper.getEntityHitResult(mc.player, startPoint, endPoint, entityArea, e -> e==target, maxDistance);
if (ehr != null) {
return ehr.getEntity();
}
return null;
}
private static @NotNull Vector3d getRotationVector(float yaw, float pitch) {
return new Vector3d(MathHelper.sin(-pitch * 0.017453292F) * MathHelper.cos(yaw * 0.017453292F), -MathHelper.sin(yaw * 0.017453292F), MathHelper.cos(-pitch * 0.017453292F) * MathHelper.cos(yaw * 0.017453292F));
}
public static RayTraceResult rayTrace(double dst, float yaw, float pitch) {
Vector3d vec3d = mc.player.getEyePosition(1f);
Vector3d vec3d2 = getRotationVector(yaw, pitch);
Vector3d vec3d3 = vec3d.add(vec3d2.x * dst, vec3d2.y * dst, vec3d2.z * dst);
return mc.level.clip(new RayTraceContext(vec3d, vec3d3, RayTraceContext.BlockMode.OUTLINE, RayTraceContext.FluidMode.NONE, mc.player));
}
}