case "SpookyDuels" -> {
if (target == null) return;
if (rotationPauseTicks > 0) {
rotationPauseTicks--;
return;
}
// MX Bypass: Ломаем статистические паттерны (IQR, zFactor, Shannon Entropy)
// Не используем фиксированные skip - они создают паттерны!
Vector3d targetPos = (predict.get())
? getPredictedPosition(target, 0.18F)
: target.getPositionVec();
// MX проверяет "distinct values" - делаем каждый угол уникальным
// Используем криптографически случайный seed для каждой ротации
long uniqueSeed = System.nanoTime() ^ (hitCount * 31L);
double seedNoise = ((uniqueSeed & 0xFFFF) / 65535.0) * 0.15 - 0.075;
// Естественная высота цели (0.4-0.7 = живот-грудь) + уникальный offset
float baseHeight = 0.45f + (float)((uniqueSeed % 250) / 1000.0); // 0.45-0.695
float heightOffset = target.getHeight() * (baseHeight + (float)seedNoise * 0.1f);
// Anti-Shannon Entropy: каждая позиция должна быть уникальна
double posX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.07 + seedNoise * 0.05;
double posY = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.04;
double posZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.07 - seedNoise * 0.05;
// MX детектит "similar average" - добавляем асиммметрию
long combatTime = System.currentTimeMillis() - startTime;
if (hitCount > 15) {
// Постепенный drift вместо резкого (MX видит резкие изменения)
double driftFactor = Math.min(hitCount / 40.0, 0.3);
double asymX = Math.sin(hitCount * 0.7) * driftFactor * 0.15;
double asymZ = Math.cos(hitCount * 0.5) * driftFactor * 0.15;
posX += asymX;
posZ += asymZ;
// Сбрасываем постепенно, а не сразу
if (hitCount > 35 && ThreadLocalRandom.current().nextDouble() < 0.15) {
hitCount -= ThreadLocalRandom.current().nextInt(3, 8);
}
}
vec = targetPos.add(posX, heightOffset + posY, posZ)
.subtract(mc.player.getEyePosition(1.0F));
yawToTarget = (float) wrapDegrees(Math.toDegrees(Math.atan2(vec.z, vec.x)) - 90.0);
pitchToTarget = (float) (-Math.toDegrees(Math.atan2(vec.y, hypot(vec.x, vec.z))));
yawDelta = wrapDegrees(yawToTarget - this.rotateVector.x);
pitchDelta = pitchToTarget - this.rotateVector.y;
// MX проверяет "constant rotations" - НЕ должно быть одинаковых изменений!
// Используем множественные источники случайности
float speedVariation1 = (float)(Math.random() * 0.15 - 0.075);
float speedVariation2 = (float)(ThreadLocalRandom.current().nextDouble() * 0.12 - 0.06);
float speedVariation3 = (float)((System.nanoTime() % 100) / 500.0 - 0.1);
float yawSpeed = 0.95f + speedVariation1 + speedVariation2 * 0.5f;
float pitchSpeed = 0.90f + speedVariation2 + speedVariation3 * 0.3f;
// "Усталость" для Long-term Analysis (MX анализирует 1000 тиков)
float fatigue = Math.min((float)combatTime / 400000.0f, 0.08f); // 8% за ~6.5 мин
yawSpeed *= (1.0f - fatigue * (0.3f + (float)Math.random() * 0.3f));
pitchSpeed *= (1.0f - fatigue * (0.2f + (float)Math.random() * 0.25f));
// Адаптивная скорость (но НЕ линейная - MX детектит линейность)
float angularDist = (float) Math.sqrt(yawDelta * yawDelta + pitchDelta * pitchDelta);
float distFactor = (float)(Math.pow(Math.min(angularDist / 15.0, 1.0), 0.8) * 0.5 + 0.5);
// Шаги ротации с высокой вариативностью
float minYawStep = Math.abs(yawDelta) < 0.8f ? (float)Math.random() * 0.5f + 0.8f : Math.abs(yawDelta);
float minPitchStep = Math.abs(pitchDelta) < 0.6f ? (float)Math.random() * 0.4f + 0.6f : Math.abs(pitchDelta);
float yawStep = Math.min(minYawStep, 90.0f + (float)Math.random() * 8.0f) * yawSpeed * distFactor;
float pitchStep = Math.min(minPitchStep, 44.0f + (float)Math.random() * 6.0f) * pitchSpeed * distFactor;
// Anti-Pattern noise: MX ищет повторяющиеся паттерны шума
// Комбинируем разные распределения
float yawNoise = (float)(Math.random() - 0.5) * 0.25f;
yawNoise += (float)(ThreadLocalRandom.current().nextGaussian() * 0.08);
float pitchNoise = (float)(Math.random() - 0.5) * 0.18f;
pitchNoise += (float)(ThreadLocalRandom.current().nextGaussian() * 0.06);
// Случайная "дрожь" без паттерна
if ((uniqueSeed & 0x0F) < 3) { // ~18% вместо фиксированного %
yawNoise += (float)(Math.random() - 0.5) * 0.15f;
pitchNoise += (float)(Math.random() - 0.5) * 0.10f;
}
float yawResult = rotateVector.x + (yawDelta > 0 ? yawStep : -yawStep) + yawNoise;
float pitchResult = clamp(rotateVector.y + (pitchDelta > 0 ? pitchStep : -pitchStep) + pitchNoise, -89.0F, 89.0F);
// GCD correction (важно но не критично для MX)
float gcd = SensUtils.getGCDValue();
// Добавляем микро-вариацию в GCD для обхода "perfect GCD" детекта
float gcdVariation = gcd * (0.998f + (float)Math.random() * 0.004f);
yawResult -= (yawResult - rotateVector.x) % gcdVariation;
pitchResult -= (pitchResult - rotateVector.y) % gcdVariation;
// Overshoot correction
yawResult += overshootYawCorrection;
pitchResult += overshootPitchCorrection;
overshootYawCorrection = 0.0f;
overshootPitchCorrection = 0.0f;
// Overshoot только при больших углах + случайность без паттерна
if (angularDist > 12.0f && (uniqueSeed & 0x07) < 2) { // ~25% но не фиксировано
float intensity = (float)Math.min(angularDist / 50.0, 0.5) * (0.7f + (float)Math.random() * 0.6f);
float overshootYaw = (float)(Math.random() - 0.5) * intensity;
float overshootPitch = (float)(Math.random() - 0.5) * intensity * 0.8f;
yawResult += overshootYaw;
pitchResult += overshootPitch;
// Коррекция с вариацией
overshootYawCorrection = -overshootYaw * (0.5f + (float)Math.random() * 0.3f);
overshootPitchCorrection = -overshootPitch * (0.5f + (float)Math.random() * 0.3f);
}
// Очень редкие паузы БЕЗ паттерна (MX детектит регулярные паузы)
if ((uniqueSeed & 0x3FF) < 3) { // ~0.3%
rotationPauseTicks = 1;
}
rotateVector = new Vector2f(yawResult, pitchResult);
if (options.getValueByName("Коррекция движения").get()) {
mc.player.rotationYawOffset = yawResult;
}
}