Создаем internal мультихак, на примере CryEngine3 SDK [RadarHack]
В этой статье мы с вами создадим внутриигровой Радар
Внутриигровой радар в этой игре работает по следующему принципу:
-
Отображать союзников
- время отображения == время жизни союзника.
- отображение == всегда
- дальность отображения == зона видимости радара
-
Отображать противников
- отображение == иногда
-
время отображения
-
при визуальном столкновении
- столкнулись вы == время отображения 5с
- столкнулись союзники == время отображения 3с
-
при вооруженном столкновении
- столкнулись вы или любой союзник == время отображения 10с
- столкновения не было, противник стрелял == время отображения 3с
-
при визуальном столкновении
- дальность отображения == зона видимости радара
Наша задача в том, чтобы противники всегда отображались на радаре, не зависимо от того, были столкновения / стрельба или нет.
В этом нет ничего сложного.Нам просто нужно получить необходимые смещения, указатели, получить итератор сущностей, перебирать их в цикле и отображать на радар, указав время отображения.
#define IGAMERULES_GETTEAM 0x368 #define IGAMERULES_ADDENTITY 0x498 #define IACTORSYSTEM_GETACTOR 0x78 #define IENTITY_GETENTITYID 0x8 #define IENTITY_GETNEXT 0x30
Класс IGameFramework выглядит теперь вот так:
class IGameFramework { public: bool GetClientActor(IActor** pActor) { return VirtualF<bool(__thiscall*)(PVOID, IActor**)>(this, IGAMEFRAMEWORK_GETCLIENTACTOR)(this, pActor); } IGameRules* GetCurrentGameRules() { return VirtualF<IGameRules* (__thiscall*)(PVOID)>(this, IGAMEFRAMEWORK_GETGAMERULES)(this); } IActorSystem* GetActorSystem() { return *(IActorSystem**)((__int64)this + IGAMEFRAMEWORK_GETACTOR); } static IGameFramework* Base() { return *(IGameFramework**)IGAMEFRAMEWORK_ADDR; } };
Класс IGameRules:
class IGameRules { public: int GetTeam(EntityId pEntityId) { return VirtualF<int(__thiscall*)(PVOID, EntityId)>(this, IGAMERULES_GETTEAM)(this, pEntityId); } void AddEntity(EntityId EntityID, int Type, float LifeTime) { return VirtualF<void(__thiscall*)(PVOID, EntityId, int, float)>(this, IGAMERULES_ADDENTITY)(this, EntityID, Type, LifeTime); } };
Класс IActorsystem:
class IActorSystem { public: IActor* GetActor(INT32 pActor) { return VirtualF<IActor* (__thiscall*)(PVOID, INT32)>(this, IACTORSYSTEM_GETACTOR)(this, pActor); } };
Класс IEntity:
class IEntity { public: EntityId GetEntityId() { return VirtualF<EntityId(__thiscall*)(PVOID)>(this, IENTITY_GETENTITYID)(this); } };
Класс IEntityIterator:
class IEntityIterator { public: IEntity* GetNext() { return VirtualF<IEntity* (__thiscall*)(PVOID)>(this, IENTITY_GETNEXT)(this); } };
И самое простое во всём этом:
void RadarHack() { ISystemGlobalEnvironment* pSystemGlobalEnvironment = ISystemGlobalEnvironment::Base(); if (!pSystemGlobalEnvironment) return; IGameFramework* pGameFramework = IGameFramework::Base(); if (!pGameFramework) return; IGameRules* pGameRules = pGameFramework->GetCurrentGameRules(); if (!pGameRules) return; IActorSystem* pActorSystem = pGameFramework->GetActorSystem(); if (!pActorSystem) return; IActor* pActor = nullptr; if (pGameFramework->GetClientActor(&pActor)) { IEntityIterator* pEntityIt = pSystemGlobalEnvironment->GetIEntitySystem()->GetEntityIterator(); while (IEntity* pEntity = pEntityIt->GetNext()) { if (IActor* tActor = pActorSystem->GetActor(pEntity->GetEntityId())) { pGameRules->AddEntity(pEntity->GetEntityId(), TRUE, UCHAR_MAX); } } } }
Если вам что-то не понятно, не стесняйтесь задавать свои вопросы в ЛС Discord или ниже в комментариях.
-
2
0 Комментариев
Рекомендуемые комментарии
Комментариев нет