Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Хочу познакомить вас с интересной статьей по поводу создания интерфейса для своих утилит и обсудить ее. Автор Interest07, статья на английсом [Ссылки могут видеть только зарегистрированные пользователи. ].
Мой вариант перевода :
Эта небольшая утилита над которой я работал последнее время. Меня всегда интересовало добавление внутриигрового меню для моих утилит. Потому что хорошо интегрированные утилиты легче использовать и они лучше "ощущаются" при использовании.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Самый простой путь сделать это (на сколько я знаю) это сделать внедрение DLL в процесс elementclient. Вы можете сделать это при запуске процесса или когда процесс уже запущен. Я выбрал первый вариант: "Внедрение DLL при запуске", описанный здесь более подробно. На этой странице вы так же можете скачать простой в использовании пример внедрения, я использовал точно такой же в своем инжекторе. Не нужно снова изобретать велосипед.
У нас есть инжектор, теперь нам нужна DLL для внедрения. Инжектор вызывает функцию 'Initialize()' из этой DLL, ждет ответа и затем выходит. Итак, в DLL мы должны сделать функцию Initialize() , которая при получении ответа, создаст новый поток в котором мы можем создать основной цикл. До инициализации все потоки ждут создания основного окна. Создание окна можно контролировать на существование hWnd в памяти. Вам понадобится hWnd окна для вызовов различных Win32 API-функций.
Игра использует Direct3D для отображения графических объектов между запросами BeginScene и EndScene . Итак, если мы хотим отобразить наши объекты мы должны прикрепить вызов функции к EndScene и добавить наши объекты прямо перед этим вызовом. Таким образом наши объекты отобразятся во всех фреймах (и над всеми меню). К счастью, существует много инструкций как прикрепить функцию к EndFrame для различных версий Direct3D. PWI использует Direct3D 8, вы можете нагуглить метод прикрепления функции. Если вам не инетересно досконально изучать как это работает, я прикрепил исходный код для этой небольшой утилиты, вы можете просто посмотреть там.
Сделав это мы можем просто создать некоторый класс-обертку для создания различных контролов для управления основным окном (кнопки, лейблы, флажки и т.д.) Итак...теперь мы можем нарисовать меню, но мы все еще не знаем как определить когда пользователь нажмет например на кнопку, или перетащит меню. Вы так же не можете кликать по контролам в основном окне игре, клики нужно перехватывать до того как их сделают. Хорошо, что win32 API-функции представляют хорошие методы для этого:
Где WndProc - это наша функция для управления различными посланиями окну, такими как клик кнопки мыши/нажатие клавиши, и wpOrigEditProc - это функция PWI. Теперь вы проверяете послания окну PWI, вашим ли контролам они адресованы, и если нет, вы вызываете wpOrigEditProc с теми же параметрами и игра продолжается по обычному сценарию.
Хорошо, это первый кирпичик по созданию внутриигрового меню. Проще посмотреть исходники, чтобы увидеть как это работает (итоговая функциональность программы, конечно, спорна, двухминутный исходник на авто ит мог бы сделать тоже самое). Структуры были созданы в программе "ReClass" которую можно найти [Ссылки могут видеть только зарегистрированные пользователи. ]. Это изящный инструмент для исследования структуру игры в памяти.
Прикрепленный AutoPot.rar содержит Инжектор + DLL + ресурсы необходимые для отрисовки внутриигрового меню. Просто распакуйте это в папку Element (рядом с elementclient.exe)
Заметка: Для нормальной компиляции DLL нужно установить Direct3D 8 SDK. (прим. пер. - видимо исходники DLL автор уже удалил на момент перевода)
Ссылки на файлы:
[Ссылки могут видеть только зарегистрированные пользователи. ] - тот же что и на сайте.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Примечание: Автопот не работает. Основная польза от этого - сам прицип создания меню для программ и инжектор DLL.
[Ссылки могут видеть только зарегистрированные пользователи. ] - перезалил сюда, потому что по ссылке выше нужно пройти семь кругов ада чтобы скачать эту утилиту.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Последний раз редактировалось krukovis; 20.02.2012 в 21:21.
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
спс за труды ) как банкожер по мне так бред ) но дорожки может открыть не плохие )) видел тему в оригинале ) но идеи почему то зародились ток сейчас ) спс автору-переводчику ))
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). пишет отсюда, потому что больше ему писать неоткуда ((
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
>"Новое слово в создании.."
Слишком громко сказано ;D
Цитата:
Сообщение от krukovis
PWI использует Direct3D 8, вы можете нагуглить метод прикрепления функции.
Что верно, то верно - удачного "нагугливания". Есть одна годная и подробная статья на немецком, ещё парочку видел на инглише, но там приводятся какие-то куски кода и не понятно, что с чем связано.
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от lcd1232
Обидно, что инжект на С++. Как я понимаю для создания полноценного бота придется потратить немало нервов и проблем.
В статье описано только создание интерфейса. Для создания крутых ботов с огромным кол-вом настроек - думаю слишком сложно и проще воспользоваться обычными средствами. А для небольших утилиток с несколькими флажками или кнопками - очень даже можно и главное как это смотрится со стороны юзера - дополнительное меню в программе - круто же!
Саму DLL можно и на Delphi писать и на C# и вообще на любом языке.
Добавлено через 2 минуты
Цитата:
Сообщение от Mars'
я так понял что можно внедрить в сам клиент игры чит который будет использовать графический интерфейс пв? Обьясните нубу
Нет, графический интерфейс нужно создавать самому. А в статье описан способ этот графический интерфейс в игру загрузить.
Добавлено через 5 минут
Цитата:
Сообщение от BritishColonist
Слишком громко сказано
Есть еще инфа по этой теме? Расскажи что знаешь, пожалуйста. Очень хочется написать что то подобное.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Последний раз редактировалось krukovis; 21.02.2012 в 08:12.
Причина: Добавлено сообщение
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
krukovis, я просто хотел сказать, что создание in-game интерфейса к плагину/читу - уже давно не новый подход, применяемый для удобного конфигурирования пользователями работы данного ПО.
Я знаю один хороший пример крутого чита с доступными исходниками (которые даже прокомментированы). Исходники эти запилены не одним файлом, а кучей файлов (для удобства), т.к. общее кол-во строк перевалило за 100K. Чит этот написан для GTA: San Andreas (в особенности - для San Andreas Multiplayer), при этом хочется заметить, что весьма здорово описаны многие стандартные (изначально созданные разработчиками самой игры) структуры, функции, перечисления (enum'ы). Ну так вот, чит этот использует весьма удобный интерфейс - окошко с пунктами меню. Можно листать всё клавишами, переходить в подменюшки. Собственно, вот линк: [Ссылки могут видеть только зарегистрированные пользователи. ]. San Andreas использует DirectX9, а ElementClient (Perfect World, Jade Dynasty и т.д.) - DirectX8.
Такие вот дела.
Посетителей темы прошу поделиться ссылками на туториалы (пусть даже и иностранные) о "D3D-Hooking", либо поделиться личным опытом и знаниями в данной области.
edited:
Кстати, судя по скриншоту из шапки, можно сказать, что данное окно полностью вписывается в интерфейс самой игры. Сомневаюсь, что автор той статьи сам его рисовал (скорее всего взял из стандартных .pck-файлов), однако это навело на мысль о том, что можно не изощряться с DirectX, а создавать окна стандартными средствами игры (тогда у них будут стандартные обработчики (хукнуть которые будет в разы проще, чем EndScene) и с некоторыми функциями, например, с функцией закрытия окна, можно будет не заморачиваться).
P.S. krukovis, что-то ты давно не обновлял свой PW Patcher :D
edited#2:
Вот тут зачётные наработки: [Ссылки могут видеть только зарегистрированные пользователи. ]
Особо не разбирался, но вроде с помощью этого можно заменять любую оригинальную функцию своей и наоборот вызовом соответствующих функций (HookAPI и UnHookAPI).
А здесь, кажется, есть ещё и примеры: [Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось BritishColonist; 21.02.2012 в 16:01.
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от BritishColonist
стати, судя по скриншоту из шапки, можно сказать, что данное окно полностью вписывается в интерфейс самой игры. Сомневаюсь, что автор той статьи сам его рисовал (скорее всего взял из стандартных .pck-файлов)
Не сомневайся - сам он не рисовал ничего. Все взято из *.pck.
Цитата:
Сообщение от BritishColonist
krukovis, что-то ты давно не обновлял свой PW Patcher
Следишь... Польщен Пользовался? Если да, отпишись о впечатлениях.
Не обновляю, потому что не знаю что еще добавить. Есть идеи?
Добавлено через 11 минут
Цитата:
Сообщение от BritishColonist
а создавать окна стандартными средствами игры (тогда у них будут стандартные обработчики (хукнуть которые будет в разы проще, чем EndScene) и с некоторыми функциями, например, с функцией закрытия окна, можно будет не заморачиваться).
Игра - это программа эксплуататор, а не Visual Studio как ты там предполагаешь окна создавать? . Там можно пользоваться только теми формами, которые уже были созданы чудесными китайскими программистами и в которые заложен некоторый функционал. Можно, конечно, при помощи асма вписать в игру какой то дополнительный функционал окну или убрать ненужный, но это ИМХО неблагодарный труд. И придется лишить пользователя какого то окошка, возможно очень ему нужного ))). Ну или в динамической памяти на время создавать контролы на готовых формах. Ну в любом случае - это много-много строк кода на асме. Может Hook D3D все же попроще будет?
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Последний раз редактировалось krukovis; 21.02.2012 в 17:14.
Причина: Добавлено сообщение
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от krukovis
Пользовался?
Не, я сам такие штуки пишу ;P Однако для меня самое крутое в этой штучке - несомненно, горны и галочки в настройках чатов (ибо раньше я подобных вещей не встречал).
Цитата:
Сообщение от krukovis
можно пользоваться только теми формами, которые уже были созданы
Думаю, там есть функция, создающая окошко. Ну точно должна быть. Как иначе?
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от BritishColonist
Думаю, там есть функция, создающая окошко. Ну точно должна быть. Как иначе?
Жестко заданные параметры окон. Нет как таковых контролов и тому подобного "изврата" винды.
________________
Ни одно доброе дело не остается безнаказанным.
Программы:
PW: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
JD: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). .
Статьи: Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). , Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от Dinmaite
Жестко заданные параметры окон.
Будь это не Perfect World, я бы ещё, может, и сомневался в возможности этого.
Так или иначе, даже "жёстко заданные параметры" можно дополнить своими ;D
Хотя на это уйдёт немало времени и нервов..
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от BritishColonist
ElementClient (Perfect World, Jade Dynasty и т.д.) - DirectX8.
После Descent'а ПВ перешло на DX9.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Re: Новое слов в создании интерфеса для InGame утилит на примере AutoPot
Цитата:
Сообщение от VeTaL_UA
После Descent'а ПВ перешло на DX9.
Не перешло. Это подтверждается тем, что эта штучка запускает плагины (через d3d8).
Однако, действительно, Perfect World так же кушает библиотеку d3d9.dll, что подтверждает инфа из отладчика.
Я полагаю, что основная отрисовка идёт всё же средствами старого доброго d3d8, т.к. та самая штучка грузит плагины только при удачном перехвате функции "Direct3DCreate8".