自己动手制作植物大战僵尸简单修改器2
地上物品自动拾取
上次的内容自己动手制作植物大战僵尸简单修改器
地上物品的地址是 0x006A9EC0 + 0x768 + 0xe4 + 0xd8*i,假设为addr
(addr+0x18)为该物品是否可见,0为不可见,1为可见
(addr+0x50)为该物品是否自动收集,1为自动收集
地上有效物品的数量的地址是 0x006A9EC0 + 0x768 + 0xf4
然而,植物大战僵尸中,当一个物品消失或被拾取后,这个物品依然储存在内存中,因此要先判断有效物品是i大于等于几
首先是确定按钮处代码
//判断是否启动/终止自动拾取
if(m_check2.GetCheck() == 1 && hthread2 == INVALID_HANDLE_VALUE)
{
hthread2 = CreateThread(NULL,0,hackthread_pick,&hprocess,0,NULL);
}else if(m_check2.GetCheck() != 1 && hthread2 != INVALID_HANDLE_VALUE)
{
TerminateThread(hthread2,0);
hthread2 = INVALID_HANDLE_VALUE;
}
接着定义自动拾取线程
DWORD _stdcall hackthread_pick(LPVOID lpparam)
{
const int baseaddr = 0x006A9EC0;
HANDLE hprocess = *((HANDLE*)lpparam);
int addr;
int num = 0;
while(true)
{
int x = 0;
//其余代码
}
return 0;
}
获取地上有效物品的数量
::ReadProcessMemory(hprocess,(LPVOID)(baseaddr),&addr,4,0);
::ReadProcessMemory(hprocess,(LPVOID)(addr+0x768),&addr,4,0);
//获取地上物品数量
::ReadProcessMemory(hprocess,(LPVOID)(addr+0xf4),&num,4,0);
获取地上无效物品的数量
::ReadProcessMemory(hprocess,(LPVOID)(addr+0xe4),&addr,4,0);
while(true)
{
int show;
::ReadProcessMemory(hprocess,(LPVOID)(addr+(0xd8)*x+0x18),&show,4,0);
if(show == 0)
{
x++;
}else{
break;
}
}
设置地上有效物品自动拾取
for(int i = x;i < num + x;i++)
{
int autopick = 1;
::WriteProcessMemory(hprocess,(LPVOID)(addr+(0xd8)*i+0x50),&autopick,4,0);
}
这样,地上物品自动拾取就完成了。