#1 28-01-2010 11:04

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Создание плагина

Есть руководство по созданию плагинов в Delphi? А то я посмотрел исходники Mp3Player и не понял: как вызывать игровые функции типа create_panel_with_title и т.п.


programmer.png
modder.jpg

Offline

#2 29-01-2010 14:45

Alien
Registered: 12-10-2008
Posts: 564

Re: Создание плагина

Offline

#3 31-01-2010 09:07

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: Создание плагина

А указатель как получить? Чем надо исследовать память?


programmer.png
modder.jpg

Offline

#4 24-07-2011 02:07

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: Создание плагина

RDH wrote:

А указатель как получить? Чем надо исследовать память?

Ну память исследовать надо IDA-й pro...

Offline

#5 24-07-2011 08:56

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Создание плагина

Или Olly Dbg, код анализирует почти так же, но + в том, что это отличнейший отладчик. Хотя ИДу тоже юзаю, иногда.

Offline

#6 24-07-2011 10:12

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: Создание плагина

"Использование отладчика результат плохого проэктирования" Так сказал listener, даже Alien не пользовался отладчиком и посмотрите какие он CLEO пишет!

Last edited by VintProg_Pro (24-07-2011 10:12)

Offline

#7 14-12-2014 10:38

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Создание плагина

Заинтересовался написанием 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

#8 14-12-2014 11:48

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Создание плагина

1) Например вот так можно: https://github.com/ThirteenAG/Y-Axis_Se … llmain.cpp
2) do...while

Offline

#9 14-12-2014 15:38

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Создание плагина

Спасибо, но, что-то я не разберусь. Вот нашёл я адреса и для версии 1.1 для примера, описанного выше:

VC1.0
таймер 0x974B2C
InitPerFrame 0x4A5D91
вызывается в 0x5522B0
pMoney 0x94ADC8

VC1.1
таймер 0x974B34
InitPerFrame 0x4A5DB1
вызывается в 0x5522D0
pMoney 0x94ADD0

Какой будет код с учётом этого, т.е. для двух версий игры?
Со вторым пунктом тоже непонятки.
Просьба показать пример кода и на второй пункт.

Offline

#10 14-12-2014 17:42

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Создание плагина

Ну лучше наверно завести переменную и заполнять её после проверки на версию exe. К примеру как тут - https://github.com/ThirteenAG/Widescree … in.cpp#L37

Пример do...while в принципе в гугле найти не сложно, но если очень хочется: https://github.com/ThirteenAG/Widescree … in.cpp#L12

Offline

#11 15-12-2014 08:40

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Создание плагина

мда... видно рано мне ещё за плагины браться, blush С++ только начал изучать...
в общем не получается, сделал вот так:

#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)();
}

ни один из вариантов не работает wall
Кому не сложно поправьте код до рабочего и правильного варианта.

Offline

#12 15-12-2014 18:05

ZeroTen
Registered: 28-08-2013
Posts: 5

Re: Создание плагина

#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

#13 16-12-2014 08:12

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Создание плагина

Ага так робит. good Спасибо!

Ещё вопрос: при компиляции asi плагинов в настройках, какие параметры лучше выставить, чтобы:
1) плагин работал у тех пользователей, где не установлен Microsoft Visual C++
2) размер плагина при этом был бы минимальным

а то у меня получился размер этого плагина 33 КВ
для сравнения посмотрел размер CLEO.asi = 16 КВ
VC_SCMLOG.asi = 11,5 КВ

Offline

#14 16-12-2014 13:19

ZeroTen
Registered: 28-08-2013
Posts: 5

Re: Создание плагина

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

#15 17-12-2014 08:06

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Создание плагина

Спасибо! Теперь получил размер плагина 4 КВ, совсем другое дело.

Offline

Board footer

Powered by FluxBB