PHP код:
inline auto GetLocalPlayerGuid()
{
return ((uint64_t(__cdecl*)())(0x004D3790))();
}
inline auto GetLocalPlayer()
{
uint64_t lpguid = GetLocalPlayerGuid();
return lpguid ? ((int(__cdecl*)(long long, int))0x004D4DB0)(lpguid, 0x0010) : 0;
}
inline auto IsString(int state, int n_param)
{
return ((bool(__cdecl*)(int, int))0x00817FD0)(state, n_param);
}
inline auto ToString(int state, int n_param, int zero = 0)
{
return ((char*(__cdecl*)(int, int, int))0x0084E0E0)(state, n_param, zero);
}
inline auto IsNumber(int state, int n_param)
{
return ((bool(__cdecl*)(int, int))0x0084DF20)(state, n_param);
}
inline auto DisplayError(int state, char* err, ...)
{
return ((int(__cdecl*)(int, char*, ...))0x0084F280)(state, err);
}
inline auto GetObjectByGuidTypeCheck(uint64_t guid, int typemask = -1)
{
return guid ? ((int(__cdecl*)(uint64_t, int))0x004D4DB0)(guid, typemask) : 0;
}
inline auto StringToGuid(char* guid_string)
{
return ((uint64_t(__cdecl*)(char*))0x0074D120)(guid_string);
}
inline auto GetPtrFromUnitId(char* unit_id)
{
return ((int(__cdecl*)(char*))0x0060C1F0)(unit_id);
}
inline auto UnitIdOrGuidToAddr(LPCSTR pstr)
{
if (*pstr == '0' && (pstr[1] == 'X' || pstr[1] == 'x'))
return GetObjectByGuidTypeCheck(StringToGuid(pstr));
else
return GetPtrFromUnitId(pstr);
}
inline auto PushNumber(int state, double number)
{
return ((int(__cdecl*)(int, double))0x0084E2A0)(state, number);
}
inline auto PushNil(int state)
{
return ((int(__cdecl*)(int))0x0084E280)(state);
}
inline auto GetUnitFromLuaState(int state, int arg, char* err, ...)
{
if (!GetLocalPlayer())
return 0;
if ((IsString(state, arg)))
{
char* unit = ToString(state, arg, 0);
if (!unit)
{
DisplayError(state, err);
return 0;
}
return UnitIdOrGuidToAddr(unit);
}
else if (IsNumber(state, arg))
return GetObjectByGuidTypeCheck((UINT64)ToNumber(state, arg));
return 0;
}
inline auto GetCoord(int state)
{
auto addr = GetUnitFromLuaState(state, 1, "Usage: GetCoord(\"unit\" or [\"guid\"])");
if (addr)
{
PushNumber(state, *(float*)(addr + 0x79C));
PushNumber(state, *(float*)(addr + 0x798));
PushNumber(state, *(float*)(addr + 0x7A0));
return 3;
}
else
PushNil(state);
return 1;
}
inline auto RegisterLuaFunc(char* funcName, const int func_pointer)
{
return ((bool(__cdecl*)(char*, int))0x00817F90)(command, func_pointer);
}
int LoadScriptFuncDetour()
{
RegisterLuaFunc("GetCoord", (int)GetCoord);
// тут нужно вернуть оригинальную функцию
return ((void(__cdecl*)())0x005120E0)();
}
void MainThreadControl()
{
// тут нужен детур функции по адресу 0x005120E0, реализацию думай сам
// вариантов море , от хуков виртуальных функций ака VFTableHook до записи джампа на твой указатель в первые 5 байт
//Detour(0x005120E0, (int)LoadScriptFuncDetour);
}
int __cdecl DllMain(void* instDLL, long long reason, void*)
{
if (reason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(instDLL);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&MainThreadControl, NULL, 0, NULL);
}
return 1;
}