Extended Reach Raycast

Reach_Raycast_Extended Дистанция (Reach) HIGH +8 очков

🎮 Влияние на механику Minecraft

В ванильном клиенте Minecraft прицеливание в ближнем бою рассчитывается в методе GameRenderer.updateTargetedEntity(). В режиме выживания максимальная дистанция луча для захвата цели EntityHitResult ограничена 3.0 блоками. Сущности, находящиеся дальше 3.0 блоков, не могут быть атакованы в ближнем бою.

Reach_Raycast_Extended обнаруживает боевые модули, которые самостоятельно вычисляют траекторию атаки через ProjectileUtil.raycast() с увеличенными коэффициентами дальности. В моде SimpleAutoAttack (org.simpleautoattack.SimpleAutoAttack.AutoAttack) метод AutoMeleeTick() рассчитывает вектор направления взгляда: float reach = (float)(mc.field_1724.method_7337() ? 4.5 : ...), где дальность креативного режима 4.5 блока сохраняется в переменную reach. Затем вызывается ProjectileUtil.raycast(..., reach * reach). Если в расширенном радиусе обнаружена живая сущность, код вызывает атаку attackEntity(player, target) (method_2918).

Это позволяет моду автоматически наносить удары по целям на увеличенном расстоянии. Если дистанция превышает порог валидации на сервере, атака будет аннулирована античитом.

🔍 Анализируемые функции и API

ProjectileUtil.raycast / class_1675.method_18075

Выполняет трассировку луча (raycast) по вектору направления взгляда до заданной дистанции (class_1675.method_18075).

ClientPlayerInteractionManager.attackEntity / method_2918

Отправляет вызов атаки по обнаруженной сущности (method_2918).

float_constant_min (>= 4.0)

Литерал float в пуле констант со значением от 4.0 блоков, превышающий стандартную дистанцию удара (3.0 блока).

⚙️ Декомпилированный вид (Vineflower)

float reach = (float)(mc.field_1724.method_7337() ? 4.5 : (config.limit ? 2.7 : 3.0));
class_243 camera = mc.field_1724.method_5836(1.0F);
class_243 rotation = mc.field_1724.method_5828(1.0F);
class_243 end = camera.method_1031(rotation.field_1352 * reach, rotation.field_1351 * reach, rotation.field_1350 * reach);
class_3966 result = class_1675.method_18075(
   mc.field_1724, camera, end, new class_238(camera, end), e -> !e.method_7325() && e.method_5732(), reach * reach
);
if (result != null && result.method_17782().method_5805()) {
   if (config.limit) {
      Random random = new Random();
      this.nextAttackTime = System.currentTimeMillis() + random.nextInt(config.limitms) + 500L;
   }

   mc.field_1761.method_2918(mc.field_1724, result.method_17782());
   mc.field_1724.method_6104(class_1268.field_5808);
}

🛡️ Сигнатура байткода и статический детект

Детектор анализирует пул констант и инструкции класса, требуя одновременного выполнения трех условий:

  • Вызов утилиты рейкастинга: ProjectileUtil.raycast (Intermediary class_1675.method_18075), ProjectileUtil.getEntityHitResult, Forge func_221273_a или NeoForge m_37286_.
  • Вызов метода атаки: ClientPlayerInteractionManager.attackEntity (Intermediary class_636.method_2918, attackEntity или attack).
  • Наличие в пуле констант числа с плавающей точкой (float) со значением не менее 4.0 (дистанция атаки, превышающая ванильный лимит выживания в 3.0 блока).

Правило работает на уровне класса (scope: class). Если геометрический расчет луча и отправка атаки разделены по разным классам, либо значение дальности считывается динамически из конфигурационных файлов без литерала 4.0 в пуле констант класса, статическое правило не зафиксирует срабатывание.