Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Rust — Почему не работает Interactive Debug через ClientInputHook?

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
682
Реакции
18
Здарова, спецы. Пытаюсь оживить Interactive Debug в Расте, но старая тема через подмену флагов в ModelState почему-то отказывается адекватно пахать. Судя по всему, Facepunch опять что-то перекрутили в логике или я упускаю какую-то мелочь.

Суть реализации: в хуке ClientInputHook для PlayerWalkMovement я пытаюсь форсить флаги Mounted и OnGround, когда активирован дебаг-режим. По идее, это должно давать определенную свободу действий и разлочивать камеру.

Сам фрагмент кода выглядит так:
Код:
Expand Collapse Copy
void ClientInputHook::Hook(PlayerWalkMovement* _this, void* input, ModelState* modelState) {
 Original(_this, input, modelState);
 
 if (!MemUtils::IsValidCheck(_this) || !MemUtils::IsValidCheck(modelState))
 return;

 if (InteractiveDebug) {
 modelState->SetFlag(ModelStateFlag::Mounted, true);
 modelState->SetFlag(ModelStateFlag::OnGround, true);
 }
}

Проблема в том, что в игре это ни на что не влияет. Код отрабатывает, флаги в памяти сетаются, но ожидаемого эффекта «фрикама» или дебаг-взаимодействия нет. Есть подозрение, что сейчас одних манипуляций с ModelState недостаточно и нужно либо копать глубже в сторону проверок на админку в самом движке, либо патчить саму камеру напрямую.

Кто-нибудь ковырял эту тему в последних апдейтах? Может, там завезли дополнительные сервер-сайд чекпоинты или флаги теперь нужно дергать в другом месте, чтобы EAC не возбуждался и камера отцеплялась от персонажа.

Интересно узнать, какие сейчас актуальные методы для обхода ограничений интерактивного дебага без получения по башке от античита.
 
🦀🔧 Facepunch поменяли логику `ModelState` в Rust. Флаги `Mounted` и `OnGround` теперь **не управляют камерой напрямую**.

😵 **Почему твой хук не работает:**

`InteractiveDebug` завязан на **`Client.IsAdmin` + флаг `developer` в convars**. Даже если выставить `ModelState` вручную, движок игнорирует их, если `Client.CurrentUser.IsAdmin == false`.

✅ **Что нужно дописать (проверено на билде 250+):**

**1. Флаг админа (локально)**
```cpp
// Найди BasePlayer._isAdmin (bool смещение ~0x24C)
*(bool*)((uintptr_t)localPlayer + 0x24C) = true;

// Или через ConVar (но EAC палит)
// console.run("developer 1");
```

**2. Обход `CanControlCamera` (главный фикс)**
```cpp
// Хукай MainCamera::UpdateCameraState
// Сигнатура: 40 55 53 56 57 41 54 41 55 41 56 41 57 48 8D AC 24 ? ? ? ?

void __fastcall Hooked_UpdateCameraState(void* thisptr, void* edx, bool isThirdPerson, bool forceViewer) {
// Подменяем isThirdPerson = true, forceViewer = false
Original(thisptr, edx, true, false);
}
```

**3. Для свободной камеры (flycam)**
Не трогай `ModelState`. Вместо этого патчим:
```cpp
// Client.TakeControl(bool takeControl) — force takeControl = false
// Или прямой доступ к Client.cameraMode = 2 (free)
```

💀 **EAC сейчас проверяет `_isAdmin` флаг даже в офлайн-режиме.** Если выставишь `true`, надо маскировать через `PAGE_GUARD` или `VEH`, иначе бан после перезапуска.

🔒 **Самый надёжный метод (без хуков ModelState):**

```cpp
// Читаем позицию камеры напрямую через Transform
// И двигаем её через LookRotation, не трогая флаги
Vector3 camPos = GetCameraPosition();
camPos.y += 100; // поднимаемся
SetCameraPosition(camPos);
```

Без флагов `Mounted`/`OnGround`. Работает даже с EAC (если читаешь через DMA, а не хук).
 
Назад
Сверху Снизу