Code:
#include <Windows.h>
#include <iostream>
#include <string>
#include <list>
#include <math.h>
#include <tlhelp32.h>
#define foreach(lst, type, var) for(list< type >::iterator var = lst.begin(); (var != lst.end()); var++)
using namespace std;
typedef unsigned int uint;
#define PI 3.14159265
enum ObjectManager
{
CurMgrPointer = 0x00C79CE0,
CurMgrOffset = 0x2ED0,
NextObject = 0x3C,
FirstObject = 0xAC,
LocalGUID = 0xC0,
MouseOverGUID = 0x00BD07A0,
CurrentTargetGUID = 0x00BD07B0,
};
enum ObjectOffsets
{
Pos_X = 0x798,
Pos_Y = Pos_X + 0x4,
Pos_Z = Pos_X + 0x8,
Rot = Pos_X + 0x10,
ObjectName1 = 0x1A4,
ObjectName2 = 0x90,
GameObjectX = 0xE8,
GameObjectY = GameObjectX + 0x4,
GameObjectZ = GameObjectX + 0x8,
};
enum Action
{
FaceTarget = 0x1,
Stop = 0x3,
WalkTo = 0x4,
InteractNpc = 0x5,
Loot = 0x6,
InteractObject = 0x7,
Unknown1 = 0x8,
Unknown2 = 0x9,
AttackPos = 0xA,
AttackGuid = 0xB,
WalkAndRotate = 0xC
};
enum ClickToMove
{
CGPlayer_C__ClickToMove = 0x00727400,
CTM_Activate_Pointer = 0xBD08F4,
CTM_Activate_Offset = 0x30,
CTM_Base = 0x00CA11D8,
CTM_X = CTM_Base + 0x8C,
CTM_Y = CTM_Base + 0x90,
CTM_Z = CTM_Base + 0x94,
CTM_TurnSpeed = CTM_Base + 0x4,
CTM_Distance = CTM_Base + 0xC,
CTM_Action = CTM_Base + 0x1C,
CTM_GUID = CTM_Base + 0x20
};
struct INISECTIONVALUE
{
string scKey;
string scValue;
};
void ReadProcMem(void *pAddress, void *pMem, int iSize);
void WriteProcMem(void *pAddress, void *pMem, int iSize);
void LoadSetting();
void IniGetSection(string scFile, string scApp, list<INISECTIONVALUE> &lstValues);
float IniGetF(string scFile, string scApp, string scKey, float fDefault);
unsigned long GetPid(char *procName);
void CMOVE(float x,float y,float z,int Action);
void Farm(float x,float y,float z,UINT64 obj);
float distance(float x, float y, float z, float dx, float dy, float dz);
main.cpp
Code:
#include "header.h"
DWORD Pid;
uint BaseAddress;
float mx,my,mz,rot;
float Dist;
HWND hwnd;
list<INISECTIONVALUE> lstOBJ;
list<INISECTIONVALUE> lstBlist;
int main(int argc, char* argv[])
{
LoadSetting();
while(true)
{
uint ObjectPointer;
ReadProcMem((LPVOID)(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 + Pos_X),&mx, 4);
ReadProcMem((LPVOID)(ObjectPointer + Pos_Y),&my, 4);
ReadProcMem((LPVOID)(ObjectPointer + Pos_Z),&mz, 4);
}
uint ob;
char obname[256]="";
float ox,oy,oz;
ReadProcMem((LPVOID)(ObjectPointer + ObjectName1),&ob, 4);
ReadProcMem((LPVOID)(ob + ObjectName2),&ob, 4);
ReadProcMem((LPVOID)(ob),&obname[0], 100*sizeof(char));
ReadProcMem((LPVOID)(ObjectPointer + GameObjectX),&ox, 4);
ReadProcMem((LPVOID)(ObjectPointer + GameObjectY),&oy, 4);
ReadProcMem((LPVOID)(ObjectPointer + GameObjectZ),&oz, 4);
bool blist=false;
foreach(lstBlist, INISECTIONVALUE,lst)
{
char buffer [64];
sprintf(buffer,"%f %f %f",ox,oy,oz);
if(strcmp(buffer,lst->scKey.c_str())==0)
blist=true;
}
foreach(lstOBJ, INISECTIONVALUE,list)
{
if(strcmp(list->scKey.c_str() , obname)==0 && !blist)
{
if(distance(ox,oy,oz,mx,my,mz) <= Dist)
{
Farm(ox,oy,oz,cobj);
}
}
}
UINT64 target;
ReadProcMem((LPVOID)(CurrentTargetGUID),&target,8);
if(target>0)
{
float tx,ty,tz;
if(target == cobj)
{
ReadProcMem((LPVOID)(ObjectPointer + Pos_X),&tx, 4);
ReadProcMem((LPVOID)(ObjectPointer + Pos_Y),&ty, 4);
ReadProcMem((LPVOID)(ObjectPointer + Pos_Z),&tz, 4);
CMOVE(tx,ty,tz,WalkTo);
::PostMessage(hwnd, WM_KEYDOWN, VkKeyScan('1') , 0);
::PostMessage(hwnd, WM_KEYUP, VkKeyScan('1') , 0);
::PostMessage(hwnd, WM_KEYDOWN, VkKeyScan('2') , 0);
::PostMessage(hwnd, WM_KEYUP, VkKeyScan('2') , 0);
}
}
ReadProcMem((LPVOID)(ObjectPointer + NextObject),&ObjectPointer,4);
}
}
}
void CMOVE(float x,float y,float z,int Action)
{
WriteProcMem((LPVOID)(CTM_X),&x, 4);
WriteProcMem((LPVOID)(CTM_Y),&y, 4);
WriteProcMem((LPVOID)(CTM_Z),&z, 4);
WriteProcMem((LPVOID)(CTM_Action),&Action, 4);
}
float distance(float x, float y, float z, float dx, float dy, float dz)
{
float dist_x = x-dx;
float dist_y = y-dy;
float dist_z = z-dz;
float dist = sqrt(dist_x * dist_x + dist_y * dist_y + dist_z * dist_z);
return dist;
}
void Farm(float x,float y,float z,UINT64 obj)
{
CMOVE(x,y,z,WalkTo);
if(distance(x,y,z,mx,my,mz)<=6.0f)
{
printf("Farming %f %f %f\n",x,y,z);
CMOVE(x,y,z,Stop);
::PostMessage(hwnd, WM_KEYDOWN, VkKeyScan('2') , 0);
::PostMessage(hwnd, WM_KEYUP, VkKeyScan('2') , 0);
Sleep(2000);
WriteProcMem((LPVOID)(MouseOverGUID),&obj, 8);
::PostMessage(hwnd, WM_KEYDOWN, 0x08 , 0);
::PostMessage(hwnd, WM_KEYUP, 0x08 , 0);
Sleep(5000);
::PostMessage(hwnd, WM_KEYDOWN, VkKeyScan('2') , 0);
::PostMessage(hwnd, WM_KEYUP, VkKeyScan('2') , 0);
Sleep(2000);
::PostMessage(hwnd, WM_KEYDOWN, VK_SPACE , 0);
Sleep(1000);
::PostMessage(hwnd, WM_KEYUP, VK_SPACE , 0);
}
}
void LoadSetting()
{
string set_scFarmFile;
char szCurDir[MAX_PATH];
GetCurrentDirectory(sizeof(szCurDir), szCurDir);
set_scFarmFile = string(szCurDir) + "\\farm.ini";
IniGetSection(set_scFarmFile, "Node", lstOBJ);
IniGetSection(set_scFarmFile, "BadNode", lstBlist);
Dist = IniGetF(set_scFarmFile, "DetectRange", "range",50.0f);
Pid = GetPid("Wow.exe");
hwnd = ::FindWindow(NULL,"World of Warcraft");
}
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;
}
}
float IniGetF(string scFile, string scApp, string scKey, float fDefault)
{
char szRet[2048];
char szDefault[16];
sprintf(szDefault, "%f", fDefault);
GetPrivateProfileString(scApp.c_str(), scKey.c_str(), szDefault, szRet, sizeof(szRet), scFile.c_str());
return (float)atof(szRet);
}
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(strcmp(pe.szExeFile, procName) == 0)
{
ProcFound = true;
break;
}
retval = Process32Next(thSnapshot,&pe);
pe.dwSize = sizeof(PROCESSENTRY32);
}
if (!ProcFound) return 0;
return pe.th32ProcessID;
}
make a new text file call it Farm.ini edit it and add