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

[Counter Strike Source] и поддержка DirectX


Рекомендуемые сообщения

Примерная реализация DirectX в dll такая :

Скрытый текст

void DrawIndicator(void* self) 
{
	IDirect3DDevice9* dev = (IDirect3DDevice9*)self;
	dev->BeginScene();
	GiveMeLineStandart(dev);
	D3DXMATRIX v_m;
	dev->GetTransform(D3DTS_VIEW, &v_m);
	D3DVIEWPORT9 viewport;
	dev->GetViewport(&viewport);
  	FindClientModule();
	float coordX, coordY, coordZ;
	float pOut[3];
	if (indicator)
	{
		for (int i = 1; i < 15; i++)//Да с 1, знаю кто я...(на то есть причина)
		{
			coordX = *reinterpret_cast<float*>(client_dll + player_onl_coordX*i);
			coordY = *reinterpret_cast<float*>(client_dll + player_onl_coordY*i);
			coordZ = *reinterpret_cast<float*>(client_dll + player_onl_coordZ*i);
			if ((coordX == 0) || (coordY == 0)) { continue; }
			World_To_Screen(coordX, coordY, coordZ, &v_m, viewport, pOut);
			m_font1->DrawTextA(0, "just do it", -1, &fontRect1, 0, D3DCOLOR_ARGB(255, 255, 255, 0));
			treangle[0] = D3DXVECTOR2(pOut[0], pOut[1]);
			treangle[1] = D3DXVECTOR2(pOut[0], pOut[1] + 50);
			line->Begin();
			line->Draw(treangle, 2, cool);
			line->End();
		}
     else
     {
        
     }

 

функция GiveMeLineStandart :

Скрытый текст

void GiveMeLineStandart(IDirect3DDevice9* device)
{
	D3DXCreateLine(device, &line);
	line->SetWidth(4.0f);
	line->SetPattern(0xffffffff);
	line->SetAntialias(FALSE);
}

 

функция FindClientModule :

Скрытый текст

void FindClientModule()
{
	MODULEINFO moduleinfo = { 0 };
	HMODULE hModule = GetModuleHandle("client.dll");
	GetModuleInformation(GetCurrentProcess(), hModule, &moduleinfo, sizeof(MODULEINFO));
	client_dll = (DWORD)moduleinfo.lpBaseOfDll;
}

 

функция World_To_Screen :

Скрытый текст

int World_To_Screen(float coordX, float coordY, float coordZ, D3DXMATRIX* vm, D3DVIEWPORT9 viewport, float* pOut)
{
	float w = 0.0f;
	pOut[0] = vm[0][0] * coordX + vm[0][1] * coordY + vm[0][2] * coordZ + vm[0][3];
	pOut[1] = vm[1][0] * coordX + vm[1][1] * coordY + vm[1][2] * coordZ + vm[1][3];
	w = vm[3][0] * coordX + vm[3][1] * coordY + vm[3][2] * coordZ + vm[3][3];
	if (w < 0.01f) { return 0; }
	float intw = 1.0f / w;
	pOut[0] *= intw;
	pOut[1] *= intw;
	int weight = (int)(viewport.Width);//(rect.right - rect.left);
	int height = (int)(viewport.Height);//(rect.bottom - rect.top);
	float x = weight / 2;
	float y = height / 2;
	x += 0.5*pOut[0] + weight + 0.5;
	y -= 0.5*pOut[1] + height + 0.5;
	pOut[0] = x;//+ rect.left
	pOut[1] = y;//+ rect.top
	return 1;
}

 

и глобальные переменные :

DWORD client_dll;
D3DXVECTOR2 treangle[2];//для рисования
D3DCOLOR cool = D3DCOLOR_ARGB(255, 255, 0, 0);
ID3DXLine *line;
const DWORD player_onl_coordX = 0x1a0;
const DWORD player_onl_coordY = 0x1a4;
const DWORD player_onl_coordZ = 0x1a8;

кто знает , примерно, почему ничего не рисует на экране ?

я предполагаю , что не так нашел видовую матрицу или vievport,  ещё возможно ошибка в функции World_To_Screen:

 

D3DXMATRIX v_m;
dev->GetTransform(D3DTS_VIEW, &v_m);//view_matrix - видовая матрица
D3DVIEWPORT9 viewport;
dev->GetViewport(&viewport);//для размеров окна игры 

// еще возможно  client_dll не так нашел (где-нибудь ошибка)

MODULEINFO moduleinfo = { 0 };
HMODULE hModule = GetModuleHandle("client.dll");
GetModuleInformation(GetCurrentProcess(), hModule, &moduleinfo, sizeof(MODULEINFO));
client_dll = (DWORD)moduleinfo.lpBaseOfDll;

dll находится в процессе игры(inject through СЕ)!

 

 

 

Благодарю за ответы 

// Заголовок поправил, на первый раз без предупреждений. Garik66 1. Нарушения правила оформления заголовка тем. Общие правила форума Пункт 1.3 

Ссылка на комментарий
Поделиться на другие сайты

Только что, uhx сказал:

По моему это так не работает. Лучше сам найди матрицу.

Если я начал , то попробую уже через DirectX доделать, самому интересно как сделать правильно через DirectX

Ссылка на комментарий
Поделиться на другие сайты

15 минут назад, IzerodayI сказал:

Если я начал , то попробую уже через DirectX доделать, самому интересно как сделать правильно через DirectX

Флаг тебе в руки. Но ты хотя бы пробовал посмотреть, что тебе выдает GetTransform на выходе?

 

Я не знаю почему так, не знаток DX и все такое, но через GetTransform ты не достанешь видовую матрицу. Ты думаешь всем по приколу мучаться и искать оффсет на нее? Типа все так делают, потому что оффсеты - это круто?)

Через DX можно разве что при помощи GetVertexShaderConstantF достать ее, но там тоже придется танцы с бубном устраивать, поэтому какого-то уникального решения нет, потому что в каждой игре по своему хранится эта видовая матрица, и приходится постоянно ее выискивать.

Тут пару дней назад до тебя тоже человечек один писал по этому поводу, тык. Дело в том, что GetTransform возвращает единичные матрицы, а при помощи них ты никаких преобразований не получишь)

Сам только что проверил в CS:GO. Слева GetTransform, справа - через оффсет. 

Wg2OtEF.png

Изменено пользователем uhx
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, uhx сказал:

какого-то уникального решения нет,

А я думал , что этот способ универсален...

Что-то типа правил или этикета всех программистов пишущих игры делать матрицу в одном месте для удобства(другим людям):D 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, uhx сказал:

через оффсет

не подскажешь как получить (оптимально)оффсет матрицы через dll,

если через exe Кенг делал так :

Скрытый текст

 read_bytes((PCVOID)(client_dll_base+v_matrix_offset), 64, &view_matrix);

//и 

int read_bytes(PCVOID addr, int num, void* buf) 
{ 
     SIZE_T sz = 0; 
    int r = ReadProcessMemory(hProcess, addr, buf, num, &sz); 
     if (r == 0 || sz == 0) { 
        printf("RPM error, %08Xn", GetLastError()); 
          return 0; 
     } 
     return 1; 
} 

 

один из параметров это 64 байта , и это разумное решение , но в dll я не могу пользоваться ReadProcessMemory , 

и как это лучше провернуть. Должна же быть какая-нибудь функция вытаскивающая сразу все оффсеты (через dll)?

 

Просто я координаты тоже криво нахожу:

Скрытый текст

const DWORD player_onl_coordX = 0x1a0;
const DWORD player_onl_coordY = 0x1a4;
const DWORD player_onl_coordZ = 0x1a8;

	float coordX, coordY, coordZ;	

		coordX = *reinterpret_cast<float*>(client_dll + player_onl_coordX*i);
		coordY = *reinterpret_cast<float*>(client_dll + player_onl_coordY*i);
		coordZ = *reinterpret_cast<float*>(client_dll + player_onl_coordZ*i);

 

 

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, IzerodayI сказал:

но в dll я не могу пользоваться ReadProcessMemory

Структура из 16 значений

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, uhx сказал:

что тебе выдает GetTransform на выходе?

как ты её отобразил через DirectX?

мне интересно все проверить самому(насчет других параметров).

Ссылка на комментарий
Поделиться на другие сайты

Я тоже долго мучался с поиском матрицы через D3D, но uhx подсказал, что лучше ручками найти. Так и сделал, теперь всё нормально рисуется. Спасибо ему ;) Так что лучше не трать время на это, и найди сам матрицу.

Изменено пользователем Wanderer
Ссылка на комментарий
Поделиться на другие сайты

15 часов назад, IzerodayI сказал:

но в dll я не могу пользоваться ReadProcessMemory

А зачем тебе ReadProcessMemory, если ты уже в процессе игры?

15 часов назад, IzerodayI сказал:

как ты её отобразил через DirectX?

 

Взял и нарисовал все значения на экране.

ID3DXFont->DrawTextA

 

16 часов назад, IzerodayI сказал:

типа правил или этикета всех программистов пишущих игры делать матрицу в одном месте для удобства(другим людям)

Нет, такого нет. У разработчиков и так все исходники перед лицом, они легко могут эту матрицу использовать, какая им разница в каком месте она лежит.

 

Вообще, тебе следовало бы взяться сначала за что-то одно: либо асм (реверс), либо цпп.

Судя по твоим вопросам ты ни там ни там не разбираешься, а учить тебя всем особенностям C++ вряд ли кто то захочет - информации и без того полно.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, uhx сказал:

Взял и нарисовал все значения на экране

как ты туда массив значений поместил ? там же второе значение у функции LPCTSTR

6 минут назад, uhx сказал:

либо асм (реверс), либо цпп.

можно по подробней?

 

PS

я примерно нашел видовую матрицу , но там только 15 значений изменяющихся от -0.99 до 0.99 (в ксс в34 максимум 89 градусов наклон)

почему 15 , потому что одно из них Double 

screen:

[img= https://cloud.mail.ru/public/GNMC/3jz33yKb5]

 

 

это и есть видовая матрица или я нашел не то?

Ссылка на комментарий
Поделиться на другие сайты

Вот как она примерно выглядит:

GCziOaK.png

Она должна при прямых углах отображать твои координаты камеры, поэтому X и Y позиции должны быть видны в ней.

Как у меня: -113 в матрице и 113 в позиции. 159.38 в матрице и -159.38 ну и тд...

+ у нее статический адрес, но она слетает обычно после апдейтов. Практически всегда.

То, что у тебя - это похоже не то. Я сейчас буквально за 15 минут нашел матрицу + сигнатуру под нее, а то надоело что после апдейтов слетает.

Могу какой-то гайдец запилить, хотя об этом уже столько сказано было... шо капец

Изменено пользователем uhx
Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, uhx сказал:

Могу какой-то гайдец запилить,

Я был бы не против =)

 

PS ты её просто отсеивал от -1 до 1 и получил матрицу сразу в таком виде? то есть не так (допустим пример)[img=https://cloud.mail.ru/public/HACe/x1EjsZNnd] в буквенных непонятных значений, а сразу в цифрах?

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, IzerodayI сказал:

то есть не так (допустим пример)

Хоспадее, да переключи ты режим отображения на Float. ПКМ -> Display Type -> Float. Ну или просто Ctrl + 9

4 минуты назад, IzerodayI сказал:

ты её просто отсеивал от -1 до 1 и получил матрицу сразу в таком виде

Да, просто экраном вверх-вниз. Я искал значение между 0.9 и 1.1. Потом поднимал экран вверх и искал между -1.1 и -0.9, потому что там угол ~89 максимальный, проще промежуток искать, все равно левак отпадет на 2-3 скане.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

26 минут назад, uhx сказал:

Да, просто экраном вверх-вниз. Я искал значение между 0.9 и 1.1. Потом поднимал экран вверх и искал между -1.1 и -0.9, потому что там угол ~89 максимальный, проще промежуток искать, все равно левак отпадет на 2-3 скане.

это она? , тут 16 уже =)

[img= https://cloud.mail.ru/public/3SiE/Yso3dmHte]

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, IzerodayI сказал:

это она? , тут 16 уже =)

[img= https://cloud.mail.ru/public/3SiE/Yso3dmHte]

Просто посмотри какой-нибудь урок по нахождению видовой матрицы. Почему ты по столбцу только считаешь их? Как бы значения идут слева-направо.

Ссылка на комментарий
Поделиться на другие сайты


setang 89 49


Ищешь 0.75 

 

Отсеиваешь

 

setang 0.0 5.0


Ищешь 0.08

 

Последний адрес в пространстве engine.dll будет видовой матрицей.

Чтобы каждое обновление не искать, делаешь сигнатуру и по ней получаешь адрес матрицы.

Изменено пользователем partoftheworlD
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, uhx сказал:

Но ведь он в client.dll :o

Нет, это в csgo в client.dll, в css, l4d2, portal (на счет portal 2 не уверен) и прочих играх со старым движком в engine.dll

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

21 минуту назад, uhx сказал:

Как бы значения идут слева-направо.

похоже ? [img= https://cloud.mail.ru/public/JnVD/a8BZyZdDw ]

 

её находил пока , без совета partoftheworlD

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, IzerodayI сказал:

скорее всего она и есть, но смысла спрашивать "похоже" нет, когда будешь использовать узнаешь то нашел или нет.
если сделал так, как я написал выше, то значит нашел именно её.

 

и статейка
http://www.codinglabs.net/article_world_view_projection_matrix.aspx

Изменено пользователем partoftheworlD
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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