Нужен координатор формата XYZ, формата, который использует сам сервер, спасибо за помощь
З.Ы. Знаю, что такой координатор есть в программе WoWemuHacker, но её открывать я рисковать не хочу
Вид для печати
Нужен координатор формата XYZ, формата, который использует сам сервер, спасибо за помощь
З.Ы. Знаю, что такой координатор есть в программе WoWemuHacker, но её открывать я рисковать не хочу
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;
}
Готовая dll'ка, если кому то понадобится - https://dropmefiles.com/Xw2OW
TomTom не? там XY без Z
/dump GetCoord("player"), только сначала нужно инжектнуть dll в процесс wow.exe
- - - Updated - - -
Вложение 680154
Скрытый текст
PHP код:local frame = CreateFrame("frame",nil,UIParent)
frame:SetBackdrop({bgFile = "Interface/Tooltips/UI-Tooltip-Background"})
frame:SetBackdropColor(0,0,0,.8)
frame:SetSize(64,48)
frame:SetPoint"CENTER"
frame:SetMovable(true)
frame:EnableMouse(true)
frame:RegisterForDrag"LeftButton"
frame:SetScript("OnDragStart", frame.StartMoving)
frame:SetScript("OnDragStop", frame.StopMovingOrSizing)
frame[1] = frame:CreateFontString()
frame[1]:SetFont("Fonts\\FRIZQT__.TTF",10)
frame[1]:SetPoint("LEFT",2,14)
frame[1]:SetText"un"
frame[2] = frame:CreateFontString()
frame[2]:SetFont("Fonts\\FRIZQT__.TTF",10)
frame[2]:SetPoint("LEFT",2,0)
frame[2]:SetText"cno"
frame[3] = frame:CreateFontString()
frame[3]:SetFont("Fonts\\FRIZQT__.TTF",10)
frame[3]:SetPoint("LEFT",2,-14)
frame[3]:SetText"wn"
local function OnUpdate()
if not GetCoord then return end
for k,v in next,{GetCoord"player"} do
frame[k]:SetText(format("%s: %.2f",k == 1 and "|cffff0000X|r" or k == 2 and "|cff00ff00Y|r" or "|cff0000ffZ|r",v))
end
end
frame:SetScript("OnUpdate",OnUpdate)
[свернуть]
Получаем расстояние между 2 юнитами с нее_ической точностью
PHP код:local function GetRange(unit1,unit2)
if not (UnitExists(unit1) and UnitExists(unit2)) then return end
local x1,y1,z1 = GetXYZ(unit1)
local x2,y2,z2 = GetXYZ(unit2)
return sqrt((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)
end
link is broken :(
any update?