- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 446
- Реакции
- 10
Разбирал старые архивы и наткнулся на свои наработки по Far Cry Primal. В свое время плотно ковырял этот движок, так что если кто решит заняться реверсом этой части — держите базу по основным классам.
Игра крутится на Havok Physics, что значительно упрощает задачу. Сорцы самого хавока (или хотя бы куски документации) легко гуглятся, так что сопоставить структуры не составит труда.
Основные структуры (hkpWorld, hkpCharacterProxy):
Класс PlayerEntity постоянно мелькает в функциях обновления позиции игрока. По сути, это входная точка для получения прокси и мира:
Пример перебора островов симуляции (Simulation Islands):
По оффсетам: учитывайте, что это Dunia Engine, там много специфических прослоек между физикой хавока и игровыми сущностями. Но для старта этой информации более чем достаточно.
Кто-нибудь еще ковыряет Far Cry на этом движке?
Игра крутится на Havok Physics, что значительно упрощает задачу. Сорцы самого хавока (или хотя бы куски документации) легко гуглятся, так что сопоставить структуры не составит труда.
Основные структуры (hkpWorld, hkpCharacterProxy):
Код:
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 постоянно мелькает в функциях обновления позиции игрока. По сути, это входная точка для получения прокси и мира:
Код:
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):
Код:
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 на этом движке?