Перейти к содержанию

Создаем internal мультихак, на примере CryEngine3 SDK [7 часть]

JustHack

225 просмотров

 

1.thumb.png.5eebdd2c57b7d173efcb983c1dc80bcd.png

 

 

В этой статье мы с вами создадим внутриигровой Радар

 

1o.jpg

 

Внутриигровой радар в этой игре работает по следующему принципу:

  • Отображать союзников
    • время отображения          ==  время жизни союзника.
    • отображение                       ==  всегда
    • дальность отображения  ==  зона видимости радара
  • Отображать противников
    • отображение                       == иногда
    • время отображения
      • при визуальном столкновении
        • столкнулись вы                                          == время отображения 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 Комментариев


Рекомендуемые комментарии

Комментариев нет

Гость
Эта запись блога заблокирована для комментирования.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.