Extended Reach Raycast
Влияние на механику 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(Intermediaryclass_1675.method_18075),ProjectileUtil.getEntityHitResult, Forgefunc_221273_aили NeoForgem_37286_. - Вызов метода атаки:
ClientPlayerInteractionManager.attackEntity(Intermediaryclass_636.method_2918,attackEntityилиattack). - Наличие в пуле констант числа с плавающей точкой (float) со значением не менее
4.0(дистанция атаки, превышающая ванильный лимит выживания в 3.0 блока).
Правило работает на уровне класса (scope: class). Если геометрический расчет луча и отправка атаки разделены по разным классам, либо значение дальности считывается динамически из конфигурационных файлов без литерала 4.0 в пуле констант класса, статическое правило не зафиксирует срабатывание.