You are not logged in.
Pages: 1
Есть руководство по созданию плагинов в Delphi? А то я посмотрел исходники Mp3Player и не понял: как вызывать игровые функции типа create_panel_with_title и т.п.
Offline
Offline
А указатель как получить? Чем надо исследовать память?
Offline
А указатель как получить? Чем надо исследовать память?
Ну память исследовать надо IDA-й pro...
Offline
Или Olly Dbg, код анализирует почти так же, но + в том, что это отличнейший отладчик. Хотя ИДу тоже юзаю, иногда.
Offline
"Использование отладчика результат плохого проэктирования" Так сказал listener, даже Alien не пользовался отладчиком и посмотрите какие он CLEO пишет!
Last edited by VintProg_Pro (24-07-2011 10:12)
Offline
Заинтересовался написанием asi плагинов для gta. Промотрел форум и ещё другие форумы. Очень мало инфы про это. Нашёл вот статью DK22Pac, как создать простой плагин для GTASA.
Нашёл соответствующие адреса для VC. Сделал, как описано в статье. Но Microsoft Visual C++ на
CPatch::SetInt(0x94ADC8, CPatch::GetInt(0x94ADC8) + 50);
весело сообщает, что:
GetInt: не является членом "CPatch"
Ладно, переделал таким образом:
#include <Windows.h> #include <CPatch.h> void OurFunc(); // Игровой таймер #define gTimer (*(unsigned int *)0x974B2C) // Обьявляем глобальную переменную для записи времени unsigned int gLastTimeKeyPressed; DWORD * pMoney = (DWORD*)0x94ADC8; BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { if(reason == DLL_PROCESS_ATTACH) { CPatch::RedirectCall(0x4A5D91, OurFunc); // Обнуляем таймер gLastTimeKeyPressed = 0; } return TRUE; } void OurFunc() { // Проверяем нажатие клавиши "M" и таймер (если прошлa 1 секундa после последнего нажатия клавиши) if(HIBYTE(GetKeyState(0x4D)) == 0xFF && gTimer - gLastTimeKeyPressed > 1000) { //Добавляем денег игроку *pMoney += 1000; // Устанавливаем новое время последнего нажатия клавиши gLastTimeKeyPressed = gTimer; } // Вызываем стандартную функцию игры (0x5522B0) ((void (__cdecl *)())0x5522B0)(); }
Работает, как задумано.
Подскажите пожалуйста ответы на следующие вопросы:
1) Как проверить версию игры, чтобы для соответствующей версии использовать свои адреса?
2) Как в asi плагине организовать такую конструкцию из клео скрипта
if 05EE: key_pressed 50 then repeat wait 0 until 85EE: not key_pressed 50 end
Offline
1) Например вот так можно: https://github.com/ThirteenAG/Y-Axis_Se … llmain.cpp
2) do...while
Offline
Спасибо, но, что-то я не разберусь. Вот нашёл я адреса и для версии 1.1 для примера, описанного выше:
VC1.0 таймер 0x974B2C InitPerFrame 0x4A5D91 вызывается в 0x5522B0 pMoney 0x94ADC8 VC1.1 таймер 0x974B34 InitPerFrame 0x4A5DB1 вызывается в 0x5522D0 pMoney 0x94ADD0
Какой будет код с учётом этого, т.е. для двух версий игры?
Со вторым пунктом тоже непонятки.
Просьба показать пример кода и на второй пункт.
Offline
Ну лучше наверно завести переменную и заполнять её после проверки на версию exe. К примеру как тут - https://github.com/ThirteenAG/Widescree … in.cpp#L37
Пример do...while в принципе в гугле найти не сложно, но если очень хочется: https://github.com/ThirteenAG/Widescree … in.cpp#L12
Offline
мда... видно рано мне ещё за плагины браться, С++ только начал изучать...
в общем не получается, сделал вот так:
#include <Windows.h> #include <CPatch.h> #define gGameVersion (*(unsigned int *)0x601048) #define GTA_VC_1_0 0x53FF1B8B #define GTA_VC_STEAM 0xF04F883 #define GTA_VC_1_1 0x783EE8 int gVersion; unsigned int gLastTimeKeyPressed; unsigned int gTimer; int gInitPerFrame; int gFunc; DWORD pMoney; void Thread() { switch(gGameVersion) { case GTA_VC_1_0: gVersion = 0; break; case GTA_VC_1_1: gVersion = 1; break; case GTA_VC_STEAM: gVersion = 2; break; } /*if (gVersion == 0) { unsigned int* gTimer = (unsigned int *)0x974B2C; int* gInitPerFrame = (int *)0x4A5D91; int* gFunc = (int *)0x5522B0; DWORD* pMoney = (DWORD*)0x94ADC8; } else if (gVersion == 1) { unsigned int* gTimer = (unsigned int *)0x974B34; int* gInitPerFrame = (int *)0x4A5DB1; int* gFunc = (int *)0x5522D0; DWORD* pMoney = (DWORD*)0x94ADD0; }*/ } void OurFunc(); BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { if(reason == DLL_PROCESS_ATTACH) { Thread(); CPatch::RedirectCall(gInitPerFrame, OurFunc); // Обнуляем таймер gLastTimeKeyPressed = 0; } return TRUE; } void OurFunc() { // Проверяем нажатие клавиши "M" и таймер (если прошлa 1 секундa после последнего нажатия клавиши) if(HIBYTE(GetKeyState(0x4D)) == 0xFF && gTimer - gLastTimeKeyPressed > 1000) { if (gVersion == 0) { unsigned int* gTimer = (unsigned int *)0x974B2C; int* gInitPerFrame = (int *)0x4A5D91; int* gFunc = (int *)0x5522B0; DWORD* pMoney = (DWORD*)0x94ADC8; } else if (gVersion == 1) { unsigned int* gTimer = (unsigned int *)0x974B34; int* gInitPerFrame = (int *)0x4A5DB1; int* gFunc = (int *)0x5522D0; DWORD* pMoney = (DWORD*)0x94ADD0; } //Добавляем денег игроку pMoney += 1000; // Устанавливаем новое время последнего нажатия клавиши gLastTimeKeyPressed = gTimer; } // Вызываем стандартную функцию игры (0x5522B0) ((void (__cdecl *)())gFunc)(); }
ни один из вариантов не работает
Кому не сложно поправьте код до рабочего и правильного варианта.
Offline
#include <Windows.h> #include <CPatch.h> #define gGameVersion (*(unsigned int *)0x601048) #define GTA_VC_1_0 0x53FF1B8B #define GTA_VC_STEAM 0xF04F883 #define GTA_VC_1_1 0x783EE8 int gVersion; unsigned int gLastTimeKeyPressed; unsigned int *gTimer; int gInitPerFrame; int gFunc; DWORD *pMoney; void Thread() { switch(gGameVersion) { case GTA_VC_1_0: gVersion = 0; break; case GTA_VC_1_1: gVersion = 1; break; case GTA_VC_STEAM: gVersion = 2; break; } if (gVersion == 0) { gTimer = (unsigned int *)0x974B2C; gInitPerFrame = (int)0x4A5D91; gFunc = (int)0x5522B0; pMoney = (DWORD*)0x94ADC8; } else if (gVersion == 1) { gTimer = (unsigned int *)0x974B34; gInitPerFrame = (int)0x4A5DB1; gFunc = (int)0x5522D0; pMoney = (DWORD*)0x94ADD0; } } void OurFunc(); BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved) { if(reason == DLL_PROCESS_ATTACH) { Thread(); CPatch::RedirectCall(gInitPerFrame, OurFunc); // Обнуляем таймер gLastTimeKeyPressed = 0; } return TRUE; } void OurFunc() { // Проверяем нажатие клавиши "M" и таймер (если прошлa 1 секундa после последнего нажатия клавиши) if(HIBYTE(GetKeyState(0x4D)) == 0xFF && *gTimer - gLastTimeKeyPressed > 1000) { //Добавляем денег игроку *pMoney += 1000; // Устанавливаем новое время последнего нажатия клавиши gLastTimeKeyPressed = *gTimer; } // Вызываем стандартную функцию игры (0x5522B0) ((void (__cdecl *)())gFunc)(); }
Offline
Ага так робит. Спасибо!
Ещё вопрос: при компиляции asi плагинов в настройках, какие параметры лучше выставить, чтобы:
1) плагин работал у тех пользователей, где не установлен Microsoft Visual C++
2) размер плагина при этом был бы минимальным
а то у меня получился размер этого плагина 33 КВ
для сравнения посмотрел размер CLEO.asi = 16 КВ
VC_SCMLOG.asi = 11,5 КВ
Offline
1) Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения: Многопоточная (/MT).
Теперь dll не будет требовать MSVCRXX.dll и MSVCPXX.dll
2)После #include добавь:
#pragma comment(linker, "/ENTRY:DllMain")
Свойства конфигурации -> Компоновщик -> Файл манифеста -> Создавать Манифест: Нет (/MANIFEST:NO).
Пара полезных ссылок:
http://www.wasm.ru/forum/viewtopic.php?id=22942
http://forum.antichat.ru/thread270620.html
Last edited by ZeroTen (16-12-2014 18:23)
Offline
Спасибо! Теперь получил размер плагина 4 КВ, совсем другое дело.
Offline
Pages: 1