Client Game Speed / Timer Acceleration

Timer_Tick_Speed_Multiplier Эксплойты (Exploits) HIGH +8 очков

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

В ванильном Minecraft физика персонажа, расчет перемещения, опрос клавиш управления и локальный прогресс разрушения блоков привязаны к базовой частоте 20 тиков в секунду (50 миллисекунд на один тик). Начиная с версии 1.20.3, расчет целевой длительности тика для главного цикла клиента вынесен в метод MinecraftClient.getTargetMillisPerTick().

Чит-модули Timer перехватывают данный метод и делят возвращаемое значение на пользовательский множитель (например, 2.0x или 3.0x). В исследованном модуле таймера (com.example.timer.mixin.MinecraftClientMixin) аннотация @Inject встраивается в точку RETURN метода method_54785 с флагом cancellable = true. При включенном чите миксин считывает TimerState.get().tickMultiplier() и подменяет результат: cir.setReturnValue(cir.getReturnValueF() / multiplier). В результате локальный клиент отрабатывает несколько тиков за промежуток реального времени одного тика, ускоряя перемещение и взаимодействие игрока с миром.

При подключении к внешнему многопользовательскому серверу серверный мир продолжает работать с собственной частотой 20 TPS. Клиент с ускоренным таймером начинает отправлять пакеты перемещения (PlayerMoveC2SPacket) и действий с аномально высокой частотой по отношению к серверному времени. Серверные античиты фиксируют превышение лимита входящих пакетов за интервал времени и блокируют игрока за Timer или Speedhack.

В легитимном контексте ванильный Minecraft предоставляет команду /tick rate <значение> (доступную с версии 1.20.3) для синхронного изменения скорости симуляции мира администраторами сервера. Инструменты создания видеороликов (например, ReplayMod) используют интерполяцию кадров и управление временем при рендеринге сцен, однако не форсируют отправку пакетов в соревновательном мультиплеере.

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

MinecraftClient.method_54785 / getTargetMillisPerTick

Вычисляет целевую продолжительность клиентского тика в миллисекундах.

@Inject / @ModifyReturnValue (Mixin)

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

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

@Mixin(class_310.class)
public class MinecraftClientMixin {
   @Inject(method = "method_54785", at = @At("RETURN"), cancellable = true)
   private void timer$scaleMillisPerTick(float millis, CallbackInfoReturnable<Float> cir) {
      float multiplier = TimerState.get().tickMultiplier();
      if (multiplier != 1.0F) {
         cir.setReturnValue(cir.getReturnValueF() / multiplier);
      }
   }
}

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

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

  • Метод Intermediary: method_54785.
  • Именованный метод Yarn: getTargetMillisPerTick.

Начиная с версии Minecraft 1.20.3+, метод MinecraftClient.getTargetMillisPerTick(float) определяет продолжительность тика клиента в миллисекундах. Перехват возвращаемого значения позволяет клиенту делить вычисленное время на произвольный коэффициент, форсируя локальный цикл тиков.