自己动手制作植物大战僵尸简单修改器(2)

自己动手制作植物大战僵尸简单修改器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);
}

这样,地上物品自动拾取就完成了。
自己动手制作植物大战僵尸简单修改器(2)_第1张图片

你可能感兴趣的:(游戏修改器)