Client Game Speed / Timer Acceleration
Влияние на механику 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) определяет продолжительность тика клиента в миллисекундах. Перехват возвращаемого значения позволяет клиенту делить вычисленное время на произвольный коэффициент, форсируя локальный цикл тиков.