Code/net/minecraft/world/entity/ai/behavior/LongJumpUtil.java

79 lines
3.2 KiB
Java

package net.minecraft.world.entity.ai.behavior;
import java.util.Optional;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.Pose;
import net.minecraft.world.phys.Vec3;
public final class LongJumpUtil {
public static Optional<Vec3> calculateJumpVectorForAngle(Mob p_312589_, Vec3 p_311721_, float p_310433_, int p_310545_, boolean p_310611_) {
Vec3 vec3 = p_312589_.position();
Vec3 vec31 = new Vec3(p_311721_.x - vec3.x, 0.0, p_311721_.z - vec3.z).normalize().scale(0.5);
Vec3 vec32 = p_311721_.subtract(vec31);
Vec3 vec33 = vec32.subtract(vec3);
float f = p_310545_ * (float) Math.PI / 180.0F;
double d0 = Math.atan2(vec33.z, vec33.x);
double d1 = vec33.subtract(0.0, vec33.y, 0.0).lengthSqr();
double d2 = Math.sqrt(d1);
double d3 = vec33.y;
double d4 = p_312589_.getGravity();
double d5 = Math.sin(2.0F * f);
double d6 = Math.pow(Math.cos(f), 2.0);
double d7 = Math.sin(f);
double d8 = Math.cos(f);
double d9 = Math.sin(d0);
double d10 = Math.cos(d0);
double d11 = d1 * d4 / (d2 * d5 - 2.0 * d3 * d6);
if (d11 < 0.0) {
return Optional.empty();
} else {
double d12 = Math.sqrt(d11);
if (d12 > p_310433_) {
return Optional.empty();
} else {
double d13 = d12 * d8;
double d14 = d12 * d7;
if (p_310611_) {
int i = Mth.ceil(d2 / d13) * 2;
double d15 = 0.0;
Vec3 vec34 = null;
EntityDimensions entitydimensions = p_312589_.getDimensions(Pose.LONG_JUMPING);
for (int j = 0; j < i - 1; j++) {
d15 += d2 / i;
double d16 = d7 / d8 * d15 - Math.pow(d15, 2.0) * d4 / (2.0 * d11 * Math.pow(d8, 2.0));
double d17 = d15 * d10;
double d18 = d15 * d9;
Vec3 vec35 = new Vec3(vec3.x + d17, vec3.y + d16, vec3.z + d18);
if (vec34 != null && !isClearTransition(p_312589_, entitydimensions, vec34, vec35)) {
return Optional.empty();
}
vec34 = vec35;
}
}
return Optional.of(new Vec3(d13 * d10, d14, d13 * d9).scale(0.95F));
}
}
}
private static boolean isClearTransition(Mob p_310914_, EntityDimensions p_310152_, Vec3 p_313099_, Vec3 p_311144_) {
Vec3 vec3 = p_311144_.subtract(p_313099_);
double d0 = Math.min(p_310152_.width(), p_310152_.height());
int i = Mth.ceil(vec3.length() / d0);
Vec3 vec31 = vec3.normalize();
Vec3 vec32 = p_313099_;
for (int j = 0; j < i; j++) {
vec32 = j == i - 1 ? p_311144_ : vec32.add(vec31.scale(d0 * 0.9F));
if (!p_310914_.level().noCollision(p_310914_, p_310152_.makeBoundingBox(vec32))) {
return false;
}
}
return true;
}
}