- Выберите загрузчик игры
- Fabric
Код:
package fun.rich.utils.features.aura.rotations.impl;
import fun.rich.utils.features.aura.rotations.constructor.RotateConstructor;
import fun.rich.utils.features.aura.warp.Turns;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import fun.rich.Rich;
import fun.rich.features.impl.combat.Aura;
import fun.rich.utils.features.aura.striking.StrikeManager;
import fun.rich.utils.features.aura.utils.MathAngle;
import java.security.SecureRandom;
public class MakimaAngle extends RotateConstructor {
private static final SecureRandom secureRandom = new SecureRandom();
public MakimaAngle() {
super("MakimaAngle");
}
@Override
public Turns limitAngleChange(Turns currentAngle, Turns targetAngle, Vec3d vec3d, Entity entity) {
Aura aura = Aura.getInstance();
StrikeManager attackHandler = Rich.getInstance().getAttackPerpetrator().getAttackHandler();
Turns angleDelta = MathAngle.calculateDelta(currentAngle, targetAngle);
float yawDelta = angleDelta.getYaw();
float pitchDelta = angleDelta.getPitch();
//Math.hypot - это теорема Пифагора (длина вектора), это не тригонометрия волн.
float rotationDifference = (float) Math.hypot(Math.abs(yawDelta), Math.abs(pitchDelta));
boolean isLookingAtTarget = rotationDifference < 30.0f;
boolean canAttack = entity != null && attackHandler.canAttack(aura.getConfig(), 35);
float speed;
if (!isLookingAtTarget) {
speed = randomLerp(0.95F, 1.0F);
} else {
float accuracyFactor = MathHelper.clamp(rotationDifference / 20.0f, 0.2f, 1.0f);
float baseSpeed = canAttack ? randomLerp(0.9F, 0.98F) : randomLerp(0.5F, 0.7F);
speed = baseSpeed * accuracyFactor;
}
float div = (rotationDifference < 0.0001f) ? 0.0001f : rotationDifference;
float lineYaw = (Math.abs(yawDelta / div) * 180F);
float linePitch = (Math.abs(pitchDelta / div) * 180F);
float targetYawDelta = MathHelper.clamp(yawDelta, -lineYaw, lineYaw) * speed;
float targetPitchDelta = MathHelper.clamp(pitchDelta, -linePitch, linePitch) * speed;
if (isLookingAtTarget) {
float dist = (entity != null) ? (float) entity.distanceTo(MinecraftClient.getInstance().player) : 3.0f;
float distFactor = MathHelper.clamp(dist / 4.0f, 0.3f, 1.0f);
float gaussianYaw = (float) secureRandom.nextGaussian();
float gaussianPitch = (float) secureRandom.nextGaussian();
float movementStress = MathHelper.clamp(rotationDifference / 10.0f, 0.5f, 1.5f);
float shakeStrengthYaw = 3.5f * distFactor * movementStress;
float shakeStrengthPitch = 2.0f * distFactor * movementStress;
float shakeYaw = gaussianYaw * shakeStrengthYaw;
float shakePitch = gaussianPitch * shakeStrengthPitch;
targetYawDelta += shakeYaw;
targetPitchDelta += shakePitch;
}
float gcd = getGCDValue();
targetYawDelta -= (targetYawDelta % gcd);
targetPitchDelta -= (targetPitchDelta % gcd);
float fixYaw = currentAngle.getYaw() + targetYawDelta;
float fixPitch = currentAngle.getPitch() + targetPitchDelta;
fixPitch = MathHelper.clamp(fixPitch, -90.0F, 90.0F);
return new Turns(fixYaw, fixPitch);
}
private float getGCDValue() {
float sens = (float) (MinecraftClient.getInstance().options.getMouseSensitivity().getValue() * 0.6 + 0.2);
float t = sens * sens * sens * 8.0f;
return t * 0.15f;
}
private float randomLerp(float min, float max) {
return MathHelper.lerp(secureRandom.nextFloat(), min, max);
}
@Override
public Vec3d randomValue() {
double range = 0.10;
return new Vec3d(
nextRandom(-range, range), nextRandom(-range, range), nextRandom(-range, range)
);
}
private double nextRandom(double min, double max) {
return min + (max - min) * secureRandom.nextDouble();
}
}
Код:
case "MakimaAngle" -> {
if (attackHandler.canAttack(config, 180) || !attackHandler.getAttackTimer().finished(150)) {
controller.rotateTo(rotation, target, 180, rotationConfig, TaskPriority.HIGH_IMPORTANCE_1, this);
}
}
Пожалуйста, авторизуйтесь для просмотра ссылки.