Initial release
This commit is contained in:
84
src/main/java/de/nicolasklier/custom_structures/Helper.java
Normal file
84
src/main/java/de/nicolasklier/custom_structures/Helper.java
Normal file
@@ -0,0 +1,84 @@
|
||||
package de.nicolasklier.custom_structures;
|
||||
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.decoration.ItemFrameEntity;
|
||||
import net.minecraft.entity.projectile.ProjectileUtil;
|
||||
import net.minecraft.util.hit.EntityHitResult;
|
||||
import net.minecraft.util.hit.HitResult;
|
||||
import net.minecraft.util.math.Box;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.RaycastContext;
|
||||
|
||||
public class Helper {
|
||||
public static HitResult raycastInDirection(MinecraftClient client, float tickDelta, Vec3d direction) {
|
||||
Entity entity = client.getCameraEntity();
|
||||
if (entity == null || client.world == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
double reachDistance = 100f; // Custom reach size of 100 blocks.
|
||||
HitResult target = raycast(entity, reachDistance, tickDelta, false, direction);
|
||||
double extendedReach = reachDistance;
|
||||
|
||||
Vec3d cameraPos = entity.getCameraPosVec(tickDelta);
|
||||
|
||||
extendedReach = extendedReach * extendedReach;
|
||||
if (target != null) {
|
||||
extendedReach = target.getPos().squaredDistanceTo(cameraPos);
|
||||
}
|
||||
|
||||
Vec3d vec3d3 = cameraPos.add(direction.multiply(reachDistance));
|
||||
Box box = entity
|
||||
.getBoundingBox()
|
||||
.stretch(entity.getRotationVec(1.0F).multiply(reachDistance))
|
||||
.expand(1.0D, 1.0D, 1.0D);
|
||||
|
||||
EntityHitResult entityHitResult = ProjectileUtil.raycast(
|
||||
entity,
|
||||
cameraPos,
|
||||
vec3d3,
|
||||
box,
|
||||
(entityx) -> !entityx.isSpectator(),
|
||||
extendedReach
|
||||
);
|
||||
|
||||
if (entityHitResult == null) {
|
||||
return target;
|
||||
}
|
||||
|
||||
Entity entity2 = entityHitResult.getEntity();
|
||||
Vec3d vec3d4 = entityHitResult.getPos();
|
||||
double g = cameraPos.squaredDistanceTo(vec3d4);
|
||||
|
||||
if (g > reachDistance) {
|
||||
return null;
|
||||
} else if (g < extendedReach || target == null) {
|
||||
target = entityHitResult;
|
||||
if (entity2 instanceof LivingEntity || entity2 instanceof ItemFrameEntity) {
|
||||
client.targetedEntity = entity2;
|
||||
}
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
private static HitResult raycast(
|
||||
Entity entity,
|
||||
double maxDistance,
|
||||
float tickDelta,
|
||||
boolean includeFluids,
|
||||
Vec3d direction
|
||||
) {
|
||||
Vec3d end = entity.getCameraPosVec(tickDelta).add(direction.multiply(maxDistance));
|
||||
return entity.world.raycast(new RaycastContext(
|
||||
entity.getCameraPosVec(tickDelta),
|
||||
end,
|
||||
RaycastContext.ShapeType.OUTLINE,
|
||||
includeFluids ? RaycastContext.FluidHandling.ANY : RaycastContext.FluidHandling.NONE,
|
||||
entity
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user