Reach Distance Mixin Override
Влияние на механику 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 на лету), правило не сработает.