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

[Counter Strike Source] и вывод графики через DirectX


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

проблема в том ,что ничего не рисует , но надпись jast do it =) отображает правильно( то есть она отображается , что значит проходит проверку на w2s и когда отворачиваюсь от ботов , исчезает )

код где я все делаю 

  Показать контент

ещё возможно не правильно вызвал dev ...

 

Up

функция w2s:

  Показать контент

 

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

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

  В 20.07.2017 в 18:23, IzerodayI сказал:

typedef struct D3MATRIX

Показать  

 

Возможно из-за этого, хотя может и нет. 

В общем, где-то читал, что struct определяет новый тип, а typedef struct вроде как создает только ссылку на структуру, вместо нового типа. В идеале, стоит для начала под отладкой пропустить свой код, а не гадать что у тебя не так с кодом и почему что-то не рисуется.

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

  В 20.07.2017 в 19:27, partoftheworlD сказал:

Возможно из-за этого, хотя может и нет

Показать  

Это я посоветовал так сделать, чтобы читать матрицу сразу по указателю, а не копировать ее в свой массив.

Насколько я понимаю, запись с typedef эквивалентна такому:

/*
typedef struct D3MATRIX
{
	float m[4][4];
} *PD3MATRIX;
*/

struct D3MATRIX
{
	float m[4][4];
};

typedef D3MATRIX *PD3MATRIX;

Тем более, в случае с typedef ты можешь вообще опустить имя структуры, но назначить ей псевдоним (*PD3MATRIX).

waWWMYy.png
Я часто встречал такую запись в тех же хедерах winnt, поэтому уже привык к такой записи. Да и в Си она позволяет опускать слово struct при объявлении переменной.

  Показать контент

PS переведите в гугле слово typedef xD

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

  В 20.07.2017 в 20:18, uhx сказал:

Это я посоветовал так сделать

Показать  

И  корректно работает такой вариант? Я такой способ раз попробовал, но что-то не завелось и стал использовать просто структуру как новый тип.

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

  В 20.07.2017 в 20:28, partoftheworlD сказал:

И работает такой вариант? Я такой способ раз попробовал, но что-то не завелось и стал использовать просто структуру как новый тип.

Показать  

Да, конечно. Прежде чем скидывать, я его прогнал сам у себя.

 

  Показать контент

Ну а по сути да, в C++ не особо важно как делать. Можно просто объявлять через struct name, и потом заводить как name *pName;

PS только щас догнал, что у себя в проекте я тоже копирую матрицу :D

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

  В 20.07.2017 в 19:27, partoftheworlD сказал:

В идеале, стоит для начала под отладкой пропустить свой код, а не гадать что у тебя не так с кодом и почему что-то не рисуется.

Показать  

В общем-то да, именно этим и стоит заняться. Тут я полностью согласен, никто за тебя твой код дебажить не будет, поэтому вперед.

Проверь, рисуются ли у тебя ВООБЩЕ линии. Правильно ли ты ее рисуешь? Судя по тому, что надпись пропадает/появляется, то дело именно в линии, поэтому копай в ее сторону.

Почему ты не выставляешь ее толщину?

line->SetWidth( 1.0f );

Где ты вообще создаешь ID3DXLine?

Короче, странный ты. Говоришь

  В 20.07.2017 в 18:23, IzerodayI сказал:

проблема в том ,что ничего не рисует

Показать  

и в то же время пишешь, что надпись-таки верно отображается. Так на кой нам твой W2S, если он верно работает? У тебя что не рисуется то, линия? Значит ее и проверяй.

Почему мы должны гадать - не пойму. Просто проверь свой код хоть как-то... смысл тут кучу тем уже плодить вокруг одного.

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

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

  В 20.07.2017 в 20:44, uhx сказал:

Почему ты не выставляешь ее толщину?

Показать  

да, в программе есть ширина линии

GiveMeLineStandart(dev);

и ее тело:

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

 

  В 20.07.2017 в 20:44, uhx сказал:

что надпись-таки верно отображается

Показать  

перепроверил надпись , не всегда правильно пишет слово, видно первый раз повезло....

 

PS при создание консоли AllocConsole()-(консоль создаётся с именем игры) , как перенаправить поток буфера cout в AllocConsole?

 

А вообще я пытался координаты записывать в блокнот 

ofstream fail("Matrix.txt");
fail << ViewMatrix->m[0][0] //и так далее...
fail.close(); 

но dll не создавала этот блокнот. хотя через exe работает.

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

  В 20.07.2017 в 21:11, IzerodayI сказал:

как перенаправить поток буфера cout в AllocConsole

Показать  

лол

  В 20.07.2017 в 21:11, IzerodayI сказал:

но dll не создавала этот блокнот

Показать  

она создает его в папке с игрой. Или ты думал где он появится?

  В 20.07.2017 в 21:11, IzerodayI сказал:

перепроверил надпись , не всегда правильно пишет слово, видно первый раз повезло

Показать  

почему не вывести надпись по координатам из W2S? Почему не вывести на экран те же координаты, что вернул W2S? Ты вообще хоть как-то дебажил свой код, смотрел какие у тебя значения там фигурируют?

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

  В 20.07.2017 в 21:15, uhx сказал:

она создает его в папке с игрой. Или ты думал где он появится?

Показать  

да я смотрел и поиском пользовался - не нашел.

 

  В 20.07.2017 в 21:15, uhx сказал:

лол

Показать  

я не так вводил:blink: в Яндексе...(мой косяк)

  В 20.07.2017 в 21:15, uhx сказал:

почему не вывести надпись по координатам из W2S? Почему не вывести на экран те же координаты, что вернул W2S? Ты вообще хоть как-то дебажил свой код, смотрел вообще какие у тебя значения там фигурируют?

Показать  

так и хочу сделать , только начну с client.dll и engine.dll, причина выше....

PS извини  :) (писать сюда, формирую мысли, а  в Яндекс нет, так по моей "ахинеи" ничего не находит)

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

  В 20.07.2017 в 21:15, uhx сказал:

смотрел какие у тебя значения там фигурируют?

Показать  

Просмотрел значения , матрица совпадает со значением матрицы exe , а вот координаты  ботов нет, они 0:0:0.

Есть сомнения по поводу их нахождения(в dll)- в exe  я координаты находил так :

DWORD adres = client_dll + struct_onl_play_of;

и с помощью функции readproccesmemory я искал adres и получал &coords.

А в dll я их нахожу так :

  Показать контент

и находятся не те значения...

 

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

  В 20.07.2017 в 19:27, partoftheworlD сказал:

Возможно из-за этого, хотя может и нет

Показать  

С матрицей все хорошо , а вот с координатами игроков оказывается плохо....

Моя ошибка скорее всего в том , что я в dll складываю оффсеты , а не получаю адрес как в exe с помощью ReadProccesMemory

код dll :

  Показать контент

тогда как в dll получить адрес , а не складывать оффсеты?

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

  В 22.07.2017 в 12:37, IzerodayI сказал:

тогда как в dll получить адрес , а не складывать оффсеты?

Показать  

https://habrahabr.ru/post/116255/

 

 

addr_client = *reinterpret_cast<DWORD*>(client_dll + struct_onl_play_of);

coordX = *reinterpret_cast<float*>(addr_client + player_onl_coordX+i*0x140)

 

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

  Показать контент

не поверишь , но ТЕПЕРЬ показывает координаты:D

я не считал это за ошибку , а почему в exe так работало, не знаешь?

просто я даже не думал , что элемент DWORD нужно явно преобразовывать  в DWORD

PS Большое спасибо

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

  В 22.07.2017 в 13:54, partoftheworlD сказал:
Показать  

А по этому же принципу происходит обфускация кода(что-бы было ничего не понятно антивирусу и людям смотрящим код(допустим игры , что-бы труднее на неё писать читы^_^)) ?

 

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

  В 22.07.2017 в 20:26, IzerodayI сказал:

я не считал это за ошибку , а почему в exe так работало, не знаешь?

просто я даже не думал , что элемент DWORD нужно явно преобразовывать  в DWORD

PS Большое спасибо

Показать  

Ну типа ты для начала должен получить указатель на базовый адрес, а после уже работать с ним.

ReadProcessMemory так и делает.

 

  В 22.07.2017 в 20:43, IzerodayI сказал:

А по этому же принципу происходит обфускация кода(что-бы было ничего не понятно антивирусу и людям смотрящим код(допустим игры , что-бы труднее на неё писать читы^_^)) 

Показать  

Думаю нет. В дизассемблере иногда логика кода понятней, чем читая тот же код.

Читы, да любые программы легко писать, когда знаешь что хочешь сделать.

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

  В 22.07.2017 в 20:26, IzerodayI сказал:

просто я даже не думал , что элемент DWORD нужно явно преобразовывать  в DWORD

Показать  

Нет, ты похоже не понял прикола.

Твой код:

  В 21.07.2017 в 16:46, IzerodayI сказал:

DWORD adres = client_dll + struct_onl_play_of;

Показать  

Он складывает два значения, которые находятся в client_dll и struct_onl_play_of. Пусть это будет, например, 0x400000 и 0x1234 соответственно.

В результате получается 0x401234, и отталкиваясь от этого адреса ты пытался читать позиции игроков.

То, что тебе предложили:

  В 22.07.2017 в 20:26, IzerodayI сказал:

addr_client = *reinterpret_cast<DWORD*>(client_dll + struct_onl_play_of);

Показать  

Тут складываются опят же два значения, но они приводятся к указателю на DWORD значение. А затем по этому указателю, т.е. по адресу 0x401234, берется значение (видишь звездочку в начале?), которое там записано. Например, 0x500000.

А значит, теперь у тебя addr_client равен не 0x401234, а 0x500000, и уже отталкиваясь от этого адреса ты читаешь позиции игроков.

Так как ты не приложил код из exe, а показал лишь одну строчку из которой нихрена не понятно, то могу предположить что ты читал значение из результата сложения двух адресов, типа так:

ReadProcessMemory(
  m_hProcess,
  (LPCVOID)( client_dll + struct_onl_play_of ),
  (LPVOID) &adres,
  sizeof( adres ),
  NULL
);

Короче, разбирайся с указателями. Лучше вообще начни изучать нормально плюсы, а не пытаться непойми как писать и ловить кучу ошибок из-за этого. Потому что сейчас ты явно не понимаешь что у тебя происходит в коде и как это работает.

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

  В 22.07.2017 в 22:31, uhx сказал:

Тут складываются опят же два значения, но они приводятся к указателю на DWORD значение. А затем по этому указателю, т.е. по адресу 0x401234, берется значение (видишь звездочку в начале?), которое там записано. Например, 0x500000.

А значит, теперь у тебя addr_client равен не 0x401234, а 0x500000, и уже отталкиваясь от этого адреса ты читаешь позиции игроков.

Показать  

Спасибо за объяснения, для меня сложно объяснить кому-то что-то, я сам просто знаю что так работает, просто потому что работает не вдаваясь в подробности.:D

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

  В 22.07.2017 в 22:52, partoftheworlD сказал:

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

Показать  

Конечно лучше объяснять, как например делает это Keng (дар учителя), нужно добиться понимания, а не знания.

А то часто наблюдаю: выложишь человеку скрипт, который нужно ему сделать под себя (ну например просто заменить регистр), ан нет - не могут.;)  

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

  Показать контент

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

А вот выходные координаты для обрисовки ботов (такие как pOut_1 и pOut_2):

pOut_1 = 1920

pOut_2 = -300

Что очень странно , если предположить , что левый правый угол это 0:0 , а игра  weight = 1280 ; height =600(с помощью D3DVIEWPORT9 viewport (да , он и в правду работает =)  )),

то с такими выходными координатами как :  pOut_1 = 1920, pOut_2 = -300 , я никакой обрисовки ботов не увижу

screen с док-вами :

[img=https://cloud.mail.ru/public/MJ6r/h18TbRSMK ]

как примерно  можно это исправить?

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

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

  В 23.07.2017 в 16:46, IzerodayI сказал:

как примерно  можно это исправить?

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

Показать  

Да ты наверное шутишь? Извини конечно,но ты понимаешь что делаешь?

для отрисовки координаты пропускаются через w2s функцию которая переводит мировые координаты в экранные координаты по которым рисуются боксы, для линии создают вектор от точки а, до точки б по нему рисуют. И если все верно найдено, то все обязательно будет работать.

UPD 

Что отладка показывает при рисовании линий?

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

  В 23.07.2017 в 16:46, IzerodayI сказал:

как примерно  можно это исправить?

Показать  

А ты сам что думаешь? Ты как то сам попытался понять и исправить проблему, или нет?

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

  В 23.07.2017 в 16:54, partoftheworlD сказал:

Что отладка показывает?

Показать  

Да глянь на W2S его ( в начале поста ). Она кривая же. Даже не представляю откуда он ее взял, лол.

 

Если свернуть все в одно выражение, то получается так:

pOut[0] = weight + weight / 2 + 0.5 + ( ViewMatrix->m[0][0] * coordX + ViewMatrix->m[0][1] * coordY + ViewMatrix->m[0][2] * coordZ + ViewMatrix->m[0][3] ) / w / 2

А теперь смотрим на исходные данные:

weight = 1280

Т.е. weight + weight / 2 = 1920, что и у него. 

Во-первых, сама формула неверная. Я не знаю как так ТС ее переписал, но она выглядит по другому. Там явно должны перемножаться размеры экрана на выражение с матрицей, а тут они просто складываются.

Правда странно, почему только левая часть тут работает, почему не суммирует вычисления с матрицей))

Но если честно, то я задолбался конкретно. ТС какой-то непонятливый, как ему еще самому не надоело - не пойму. Разве так сложно понять, что раз у тебя верные координаты, верная видовая матрица, но, мать его, неверные результаты после выполнения W2S, то значит в ней и ошибка? Почему нельзя просто в гугле посмотреть на "эталон" W2S и сравнить со своим? Что не так?? Я когда впервые с видовой матрицей и W2S мучался, то тоже кучу проблем огреб по началу: так же координаты криво определяло и тд, но простой дебаг + интернет взяли свое. Почему ТС по каждой проблеме пишет сюда? Она не такая уж и сложная, опять же: примеров полным полно. Все это банально гуглится и исправляется за 5 минут. Открыл исходник ЛЮБОГО чита - пожалуйста, вот тебе и W2S, и правильный метод для определения размеров окна и куча еще прочего.

Пошел лечить нервы.

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

 

  В 23.07.2017 в 17:06, uhx сказал:

Она кривая же.

Показать  

Если ты про функцию, то у меня примерно такая же в коде и рабочая на нескольких играх проверенно

 

 

  В 20.07.2017 в 18:23, IzerodayI сказал:

x += 0.5*pOut[0] + weight + 0.5;

y -= 0.5*pOut[1] + height + 0.5;

Показать  

 

Должно быть

x += 0.5*pOut[0] * weight + 0.5; 
y -= 0.5*pOut[1] * height + 0.5;

 

 

 

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

  В 23.07.2017 в 17:23, partoftheworlD сказал:

Должно быть

Показать  

Так я о том же: формулы кривые, это сразу видно. Смотри пост выше.

Я так понимаю он брал функцию у keng'a, но даже у него она по другому выглядит. Как раз то, что ты и написал.

Как можно ошибиться в копипасте?

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

  В 23.07.2017 в 17:23, partoftheworlD сказал:

Должно быть

Показать  

 

  В 23.07.2017 в 17:24, uhx сказал:

Как можно ошибиться в копипасте?

Показать  

Да не , я вручную переписывая с экрана код (ну или с другого места) , я так его лучше понимаю и вникаю в него , потому,что каждую строчку в уме рассказываю , что и для чего она нужна...

просто когда долго печатаешь , утомляешься и ошибаешься , а проверяю на глаз(примерно).

  В 23.07.2017 в 17:23, partoftheworlD сказал:

Должно быть

x += 0.5*pOut[0] * weight + 0.5; 
y -= 0.5*pOut[1] * height + 0.5;
Показать  

 

PS ошибка была в этом и все заработало , всем спасибо и хороших нервов!:)

извини за нервы:mellow: 

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

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

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

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