Reach Distance Mixin Override

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

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

В Minecraft класс ClientPlayerInteractionManager управляет взаимодействием персонажа с миром: установкой и разрушением блоков, а также кликами по сущностям. Метод getReachDistance() возвращает допустимую дистанцию взаимодействия в блоках, а hasExtendedReach() определяет, активен ли режим расширенной дальности (например, в творческом режиме).

Reach_Mixin_Override выявляет модификации, которые внедряются в ClientPlayerInteractionManager через библиотеку Mixin для подмены логики этих методов. В чит-клиенте Phosphor (net.caffeinemc.phosphor.mixin.ClientPlayerInteractionManagerMixin) аннотация @Inject перехватывает getReachDistance()F в точке HEAD с параметром cancellable = true. Если чит-модуль включен, метод отменяет ванильное выполнение и возвращает значение ползунка reachModule.blockReach.getFValue(). Одновременно метод hasExtendedReach()Z переопределяется возвратом false, предотвращая сопутствующие расхождения в клиенте.

Несмотря на то, что клиент получает возможность направлять прицел на удаленные объекты, серверные античиты и проверка дистанции на сервере отбрасывают входящие пакеты при превышении валидного радиуса.

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

ClientPlayerInteractionManager.getReachDistance / method_2904

Возвращает базовую дистанцию взаимодействия игрока в блоках (method_2904).

ClientPlayerInteractionManager.hasExtendedReach / method_2924

Логический предикат, проверяющий наличие увеличенной дистанции взаимодействия у игрока (method_2924).

@Inject / @ModifyReturnValue (Mixin)

Аннотации Mixin для перехвата исполнения методов и подмены возвращаемого значения.

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

@Inject(at = @At("HEAD"), method = "getReachDistance()F", cancellable = true)
private void onGetReachDistance(CallbackInfoReturnable<Float> cir) {
   ReachModule reachModule = (ReachModule)Phosphor.moduleManager().getModule(ReachModule.class);
   if (AsteriaMenu.isClientEnabled() && reachModule != null && reachModule.isEnabled() && reachModule.blockReachToggle.isEnabled()) {
      cir.setReturnValue(reachModule.blockReach.getFValue());
   }
}

@Inject(at = @At("HEAD"), method = "hasExtendedReach()Z", cancellable = true)
private void hasExtendedReach(CallbackInfoReturnable<Boolean> cir) {
   if (AsteriaMenu.isClientEnabled() && Phosphor.moduleManager().isModuleEnabled(ReachModule.class)) {
      cir.setReturnValue(false);
   }
}

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

Детектор анализирует аннотации методов и классов, выявляя Mixin-инъекции (@Inject, @ModifyReturnValue, @ModifyExpressionValue, @Redirect или @Overwrite), чей целевой метод соответствует методам запроса дальности:

  • Методы Intermediary: method_2904 (getReachDistance), method_2924 (hasExtendedReach), method_55693 (getEntityInteractionRange) или method_55694 (getBlockInteractionRange).
  • Именованные методы ванильного движка, Forge и NeoForge: getReachDistance, hasExtendedReach, getEntityReach, getBlockReach, func_78749_i, func_78757_d, m_320392_ или m_320393_.

Правило выявляет перехват геттеров дальности через библиотеку SpongePowered Mixin. Если модификация изменяет дистанцию без использования Mixin-трансформеров (например, через динамическую трансформацию байткода Java ASM на лету), правило не сработает.