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

Исходник [Сурс] Far Cry Primal — Наработки по Havok Engine (Классы и Оффсеты)

Обратите внимание, что на пользователя недавно была жалоба: Жалоба от lovehvhneverlose на hex_cat. Будьте осторожны!
Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
446
Реакции
10
Разбирал старые архивы и наткнулся на свои наработки по Far Cry Primal. В свое время плотно ковырял этот движок, так что если кто решит заняться реверсом этой части — держите базу по основным классам.

Игра крутится на Havok Physics, что значительно упрощает задачу. Сорцы самого хавока (или хотя бы куски документации) легко гуглятся, так что сопоставить структуры не составит труда.

Основные структуры (hkpWorld, hkpCharacterProxy):
Код:
Expand Collapse Copy
class hkpWorld
{
public:
 char pad_00[0x20];
 Vector4 m_gravity; // Гравитация начинается с 0x20
 char pad_11[0x10];
 class hkArray<class hkpSimulationIsland*> activeSimulationIslands; // 0x40
 // Entity listeners на 0x1B8 могут содержать все сущности
};

class hkpCharacterProxy : public hkReferencedObject
{
public:
 char pad_00[0x54];
 Vector4 Velocity;
 Vector4 oldDisplacment;
 class hkpShapePhantom* shapePhantom;
 float dynamicFriction;
 float staticFriction;
 Vector4 up;
 float extraUpStaticFriction;
 float extraDownStaticFriction;
 float keepDistance;
 float keepContactTolerance;
 float contactAngleSensitivity;
 std::int32_t userPlanes;
 float maxCharacterSpeedForSolver;
 float characterStrength;
 float characterMass;
};

Класс PlayerEntity постоянно мелькает в функциях обновления позиции игрока. По сути, это входная точка для получения прокси и мира:

Код:
Expand Collapse Copy
class PlayerEntity
{
public:
 char pad_0000[0x10]; //0x0000
 class hkpWorld* m_world; //0x0010
 char pad_0018[0x108]; //0x0018
 Vector3 Position; //0x0120

 hkpCharacterProxy* GetCharacterProxy()
 {
  // class + 0xB8 -> указатель на hkpCharacterProxy по оффсету 0x8
  // У прокси есть обратная ссылка на PlayerEntity по 0x80
  return *reinterpret_cast<hkpCharacterProxy**>(*(uintptr_t*)((uintptr_t)this + 0xB8) + 0x8);
 }
};

Пример перебора островов симуляции (Simulation Islands):
Код:
Expand Collapse Copy
auto islands = localPlayer->m_world->activeSimulationIslands;
for (int i = 0; i < islands.size(); i++)
{
 auto island = islands[i];
 if (!island)
  printf("entities: [%llx]\n", island->m_entities);
}

По оффсетам: учитывайте, что это Dunia Engine, там много специфических прослоек между физикой хавока и игровыми сущностями. Но для старта этой информации более чем достаточно.

Кто-нибудь еще ковыряет Far Cry на этом движке?
 
Назад
Сверху Снизу