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

Гайд [Warface] Телепортация персонажа через VTable

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
280
Реакции
6
Привет, кодеры. Многие спрашивали, как грамотно реализовать изменение позиции персонажа (телепорт) в Warface на уровне движка CryEngine. Решил закинуть базовый пример реализации через вызов функции из VTable.

Техническая база:
Для работы нам нужно найти нужный индекс в VTable объекта и вызвать метод SetPos. Основная логика строится на получении указателя на CEntity и взаимодействии с глобальными переменными движка.

Код:
Expand Collapse Copy
void SetPos(void* pEntity, const Vec3& newPos)
{
    uintptr_t* vtable = *(uintptr_t**)pEntity;
    SetPosFn fnSetPos = (SetPosFn)vtable[21]; 
    fnSetPos(pEntity, &newPos, 0);
}

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

Код:
Expand Collapse Copy
SSystemGlobalEnvironment* pEvn = SSystemGlobalEnvironment::GetInstance();
if (!pEvn) continue;

CGame* pGame = pEvn->GetGame();
if (!pGame) continue;

CActorSystem* pActorSystem = pGame->GetGameFramework()->GetActorSystem();
if (!pActorSystem) continue;

CActor* m_pActor = pActorSystem->GetActor(pGame->GetGameFramework()->GetClientActorId());
CEntity* pEntity = m_pActor->GetEntity();

if (pEntity)
{
    Vec3 newPos = { 100.0f, 200.0f, 300.0f };
    SetPos(pEntity, newPos);
}

Нюансы реализации:
  1. Индекс vtable[21] может меняться после обновлений игры, всегда перепроверяйте актуальные оффсеты.
  2. Не забывайте проверять указатели на null, иначе словите краш клиента при первой же итерации.
  3. Для полноценного телепорта в PvE или PvP режимах этого может быть недостаточно из-за серверной валидации координат.

Кто пробовал юзать этот метод для обхода античита в текущих версиях? Есть ли у кого-то идеи, как скрыть такие резкие перемещения от сервера, чтобы не отлетать за варнинги или не получать frog ban? Делитесь результатами тестов.
 
Привет, кодеры. Многие спрашивали, как грамотно реализовать изменение позиции персонажа (телепорт) в Warface на уровне движка CryEngine. Решил закинуть базовый пример реализации через вызов функции из VTable.

Техническая база:
Для работы нам нужно найти нужный индекс в VTable объекта и вызвать метод SetPos. Основная логика строится на получении указателя на CEntity и взаимодействии с глобальными переменными движка.

Код:
Expand Collapse Copy
void SetPos(void* pEntity, const Vec3& newPos)
{
    uintptr_t* vtable = *(uintptr_t**)pEntity;
    SetPosFn fnSetPos = (SetPosFn)vtable[21];
    fnSetPos(pEntity, &newPos, 0);
}

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

Код:
Expand Collapse Copy
SSystemGlobalEnvironment* pEvn = SSystemGlobalEnvironment::GetInstance();
if (!pEvn) continue;

CGame* pGame = pEvn->GetGame();
if (!pGame) continue;

CActorSystem* pActorSystem = pGame->GetGameFramework()->GetActorSystem();
if (!pActorSystem) continue;

CActor* m_pActor = pActorSystem->GetActor(pGame->GetGameFramework()->GetClientActorId());
CEntity* pEntity = m_pActor->GetEntity();

if (pEntity)
{
    Vec3 newPos = { 100.0f, 200.0f, 300.0f };
    SetPos(pEntity, newPos);
}

Нюансы реализации:
  1. Индекс vtable[21] может меняться после обновлений игры, всегда перепроверяйте актуальные оффсеты.
  2. Не забывайте проверять указатели на null, иначе словите краш клиента при первой же итерации.
  3. Для полноценного телепорта в PvE или PvP режимах этого может быть недостаточно из-за серверной валидации координат.

Кто пробовал юзать этот метод для обхода античита в текущих версиях? Есть ли у кого-то идеи, как скрыть такие резкие перемещения от сервера, чтобы не отлетать за варнинги или не получать frog ban? Делитесь результатами тестов.
Ты припозднился с написанием статьи лет на 10, ибо столько лет назад это было уже пофикшено. Сейчас разве что можно телепортировать щит на СО Восход через это и делать это правильнее через IPhysicalEntity - m_pActor->m_pEntity()->GetPhysics()->m_pos(Pos);
 
Назад
Сверху Снизу