Code:
#include "header.h"
string set_scNavFile;
DWORD Pid;
uint BaseAddress;
bool MapMode = false;
bool NavMode = false;
float mx,my,mz,rot;
int MapCounter;
HWND hwnd;
void LoadSetting()
{
char szCurDir[MAX_PATH];
GetCurrentDirectory(sizeof(szCurDir), szCurDir);
set_scNavFile = string(szCurDir) + "\\nav.ini";
Pid = GetPid("Wow.exe");
BaseAddress = GetBase("Wow.exe",Pid);
hwnd = ::FindWindow(NULL,"World of Warcraft");
}
int main(int argc, char* argv[])
{
LoadSetting();
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReadCoords,NULL, 0, NULL);
while(true)
{
if(GetAsyncKeyState(VK_F1))
{
if(!MapMode)
{
MapMode = true;
NavMode = false;
cout << "Map Mode" << endl;
FILE *map = fopen("nav.ini","w");
if(map!=NULL)
{
fprintf(map,"[nav]\n");
}
fclose(map);
MapCounter = 0;
}
}
if(GetAsyncKeyState(VK_F2))
{
if(!NavMode)
{
MapMode = false;
NavMode = true;
cout << "Nav Mode" << endl;
}
}
if(MapMode)
{
if(GetAsyncKeyState(VK_LBUTTON ))
{
FILE *map = fopen("nav.ini","at");
if(map!=NULL)
{
fprintf(map,"%i=%f %f %f\n",MapCounter,mx,my,mz);
printf("%i=%f %f %f\n",MapCounter,mx,my,mz);
MapCounter+=1;
}
fclose(map);
Sleep(1000);
}
}
if(NavMode)
{
list<INISECTIONVALUE>lstCoords;
list<COORDS>lstMain;
lstCoords.clear();
lstMain.clear();
IniGetSection(set_scNavFile, "nav", lstCoords);
foreach(lstCoords, INISECTIONVALUE,lst)
{
COORDS c;
c.coordsX = ToFloat(GetParam(lst->scValue,' ',0));
c.coordsY = ToFloat(GetParam(lst->scValue,' ',1));
c.coordsZ = ToFloat(GetParam(lst->scValue,' ',2));
lstMain.push_back(c);
}
foreach(lstMain,COORDS,lstC)
{
int timer=0;
::PostMessage(hwnd, WM_KEYDOWN, VK_UP, 0);
start:
if(GetAsyncKeyState(VK_F4))
{
::PostMessage(hwnd,WM_KEYUP,VK_UP,KEYUP_FLAGS);
NavMode = false;
break;
}
Rotation(lstC->coordsX, lstC->coordsY);
if(timer==250)
{
::PostMessage(hwnd,WM_KEYUP,VK_UP,KEYUP_FLAGS);
::PostMessage(hwnd, WM_KEYDOWN, VK_UP, 0);
timer=0;
}
timer += 1;
if((int)lstC->coordsX == (int)mx && (int)lstC->coordsY == (int)my)
goto end;
goto start;
end:
up:
if(mz - lstC->coordsZ < -0.1f)
{
::PostMessage(hwnd, WM_KEYDOWN, VK_SPACE, 0);
Sleep(10);
goto up;
}
::PostMessage(hwnd,WM_KEYUP,VK_SPACE,KEYUP_FLAGS);
down:
if(mz - lstC->coordsZ > 0.1f)
{
::PostMessage(hwnd, WM_KEYDOWN, VkKeyScan('x'), 0);
Sleep(10);
goto down;
}
::PostMessage(hwnd,WM_KEYUP,VkKeyScan('x'),KEYUP_FLAGS);
}
}
}
return 0;
}
UINT ReadCoords()
{
while(true)
{
uint ObjectPointer;
ReadProcMem((LPVOID)(BaseAddress + CurMgrPointer),&ObjectPointer,4);
ReadProcMem((LPVOID)(ObjectPointer + CurMgrOffset),&ObjectPointer,4);
UINT64 me;
ReadProcMem((LPVOID)(ObjectPointer + LocalGUID),&me, 8);
ReadProcMem((LPVOID)(ObjectPointer + FirstObject),&ObjectPointer,4);
while (ObjectPointer != 0 && ObjectPointer % 2 == 0)
{
UINT64 cobj;
ReadProcMem((LPVOID)(ObjectPointer + 0x30),&cobj, 8);
if(me == cobj)
{
ReadProcMem((LPVOID)(ObjectPointer + X),&mx, 4);
ReadProcMem((LPVOID)(ObjectPointer + Y),&my, 4);
ReadProcMem((LPVOID)(ObjectPointer + Z),&mz, 4);
ReadProcMem((LPVOID)(ObjectPointer + RotationOffset),&rot, 4);
}
ReadProcMem((LPVOID)(ObjectPointer + NextObject),&ObjectPointer,4);
}
}
}
void Rotation(float rotx, float roty)
{
uint ObjectPointer;
ReadProcMem((LPVOID)(BaseAddress + CurMgrPointer),&ObjectPointer,4);
ReadProcMem((LPVOID)(ObjectPointer + CurMgrOffset),&ObjectPointer,4);
UINT64 me;
ReadProcMem((LPVOID)(ObjectPointer + LocalGUID),&me, 8);
ReadProcMem((LPVOID)(ObjectPointer + FirstObject),&ObjectPointer,4);
while (ObjectPointer != 0 && ObjectPointer % 2 == 0)
{
UINT64 cobj;
ReadProcMem((LPVOID)(ObjectPointer + 0x30),&cobj, 8);
if(me == cobj)
{
float x, x2;
float y, y2;
double result;
ReadProcMem((LPVOID)(ObjectPointer + X),&x, 4);
ReadProcMem((LPVOID)(ObjectPointer + Y),&y, 4);
ReadProcMem((LPVOID)(ObjectPointer + RotationOffset),&rot, 4);
x2 = rotx;
y2 = roty;
result = atan2 (y2 - y, x2 - x);
if(result < 0)
result+= PI * 2;
float temp = (float)result;
if( temp >= 0 && temp <= 6.2831853f )
WriteProcMem((LPVOID)(ObjectPointer + RotationOffset),&temp, 4);
}
ReadProcMem((LPVOID)(ObjectPointer + NextObject),&ObjectPointer,4);
}
}
void ReadProcMem(void *pAddress, void *pMem, int iSize)
{
HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ, FALSE, Pid);
DWORD dwOld;
VirtualProtectEx(hProc, pAddress, iSize, PAGE_EXECUTE_READWRITE, &dwOld);
ReadProcessMemory(hProc, pAddress, pMem, iSize, 0);
CloseHandle(hProc);
}
void WriteProcMem(void *pAddress, void *pMem, int iSize)
{
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
DWORD dwOld;
VirtualProtectEx(hProc, pAddress, iSize, PAGE_EXECUTE_READWRITE, &dwOld);
WriteProcessMemory(hProc, pAddress, pMem, iSize, 0);
CloseHandle(hProc);
}
void IniGetSection(string scFile, string scApp, list<INISECTIONVALUE> &lstValues)
{
lstValues.clear();
char szBuf[0xFFFF];
GetPrivateProfileSection(scApp.c_str(), szBuf, sizeof(szBuf), scFile.c_str());
char *szNext = szBuf;
while(strlen(szNext) > 0)
{
INISECTIONVALUE isv;
char szKey[0xFFFF] = "";
char szValue[0xFFFF] = "";
sscanf(szNext, "%[^=]=%[^\n]", szKey, szValue);
isv.scKey = szKey;
isv.scValue = szValue;
lstValues.push_back(isv);
szNext += strlen(szNext) + 1;
}
}
unsigned long GetPid(char *procName)
{
PROCESSENTRY32 pe;
HANDLE thSnapshot;
BOOL retval, ProcFound = false;
thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(thSnapshot == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error: unable to create toolhelp snapshot","Error", NULL);
return false;
}
pe.dwSize = sizeof(PROCESSENTRY32);
retval = Process32First(thSnapshot, &pe);
while(retval)
{
if(StrStrI(pe.szExeFile, procName) )
{
ProcFound = true;
break;
}
retval = Process32Next(thSnapshot,&pe);
pe.dwSize = sizeof(PROCESSENTRY32);
}
if (!ProcFound) return 0;
return pe.th32ProcessID;
}
DWORD GetBase(char* DllName, DWORD tPid)
{
HANDLE snapMod;
MODULEENTRY32 me32;
if (tPid == 0) return 0;
snapMod = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, tPid);
me32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(snapMod, &me32))
{
do{
if (strcmp(DllName,me32.szModule) == 0)
{
CloseHandle(snapMod);
return (DWORD) me32.modBaseAddr;
}
}while(Module32Next(snapMod,&me32));
}
CloseHandle(snapMod);
return 0;
}
float ToFloat(string scStr)
{
return (float)atof(scStr.c_str());
}
string GetParam(string scLine, char cSplitChar, uint iPos)
{
uint i = 0, j = 0;
string scResult = "";
for(i = 0, j = 0; (i <= iPos) && (j < scLine.length()); j++)
{
if(scLine[j] == cSplitChar)
{
while(((j + 1) < scLine.length()) && (scLine[j+1] == cSplitChar))
j++; // skip "whitechar"
i++;
continue;
}
if(i == iPos)
scResult += scLine[j];
}
return scResult;
}
f1 makes a new nav.ini file as you move along just press the left mouse button to record the coords to file