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

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

JustHack

137 просмотров

 

1.thumb.png.5eebdd2c57b7d173efcb983c1dc80bcd.png

 

 

В данной статье, мы научимся определять тип комнаты, в которой мы находимся и что-то делать в зависимости от этого. Есть множество вариантов использовать это. Например, вы хотите, чтобы какой-то ваш хак работал в одном режиме, но не работал в другом. Ещё пример, рисовать скелеты на противниках (когда мы до этого дойдём). Порядок костей в PvE и PvP разный, поэтому, без определения типа комнаты вам не обойтись.

 

В игре существует 10 типов комнат:

  •  Лобби игры
  • Командный бой
  • Захват флага
  • Игроки против ботов
  • Подрыв
  • Штурм
  • Каждый сам за себя
  • Уничтожение
  • Доминация
  • Выживание   

 

Для того, чтобы успешно определять тип комнаты в которой мы находимся, нам необходимо посмотреть это через структуру ICvar и смещение в ней. Для типа комнаты, это смещение равно ICvar + 0x600

 

Добавим в наш код новое смещение

 

Спойлер

#define ICVAR_OFFS_GAMETYPE				0x600

 

 

Добавим в перечисление CvarOffsets новое значение

 

Спойлер

E_GAMETYPE			=  ICVAR_OFFS_GAMETYPE

 

 

Теперь наше перечисление со смещениями, выглядит так

 

Спойлер

enum eCvarOffsets : DWORD64
{
	E_IDLECHECK			=  ICVAR_OFFS_IDLECHECK,
	E_LOBBYAFK			=  ICVAR_OFFS_LOBBYAFK,
	E_INGAMEAFK			=  ICVAR_OFFS_INGAMEAFK,
	E_GAMETYPE			=  ICVAR_OFFS_GAMETYPE

};

 

 

Добавим в класс ICvar новый метод. Теперь класс ICvar выглядит так

 

Спойлер

class ICvar
{
public:
	template <class T>
	inline void SetValue(DWORD64 Offset, T Value){*(T*)((DWORD64)this + Offset) = Value;}

	template <class T>
	inline T GetValue(DWORD64 Offset)
	{
		return *(T*)((DWORD64)this + Offset);
	}

	static ICvar* Base()
	{
		return *(ICvar**)ICVAR_ADDR;
	}
};

 

 

Создадим перечисление со всеми возможными видами комнат

 

Спойлер

enum eRoomType
{
	E_LOBBY = 0,		
	E_TEAMDEATHMATCH,	
	E_OCCUPATION,		
	E_PVE,			
	E_PLANTTHEBOMB,	
	E_STORM,			
	E_DEATHMATCH,		
	E_DESTRUCTION,	
	E_DOMINATION,		
	E_SURVIVAL	
};

 

 

Далее, получение типа комнаты

 

Спойлер

INT GetRoomType()
{
	return ICvar::Base()->GetValue<int>(eCvarOffsets::E_GAMETYPE);
}

 

 

И всё, что вам остаётся сделать, это сравнить тип комнаты с нужным вам и что-то сделать

 

Спойлер

if (GetRoomType() == eRoomType::E_PLANTTHEBOMB)
	{
		//do something
	}

 

 

 

Если вам что-то не понятно, не стесняйтесь задавать свои вопросы в ЛС Discord или ниже в комментариях.

 

 

 

  • Плюс 2


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


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

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

Гость
Добавить комментарий...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр
×
×
  • Создать...

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

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