FPS游戏方框透视辅助开发教学2:编写代码读取玩家数据

前情回顾

FPS方框透视辅助开发教学1:数据挖掘和基本绘制
https://www.52xuejishu.com/forum-post/337.html

系列完整列表

FPS方框透视辅助开发教学1:数据挖掘和基本绘制
https://www.52xuejishu.com/forum-post/337.html

FPS方框透视辅助开发教学2:编写代码读取玩家数据
https://www.52xuejishu.com/forum-post/339.html

FPS方框透视辅助开发教学3:屏幕坐标转换算法、绘制文本到敌人
https://www.52xuejishu.com/forum-post/340.html

FPS方框透视辅助开发教学4:屏幕坐标转换算法完整解析
https://www.52xuejishu.com/forum-post/345.html

FPS方框透视辅助开发教学5:绘制所有敌人射线和距离
https://www.52xuejishu.com/forum-post/347.html

FPS方框透视辅助开发教学6:实现GDI绘制方框透视(完结)
https://www.52xuejishu.com/forum-post/349.html

想学习游戏辅助开发没地方?

优惠下单链接,学习游戏修改作弊、辅助脚本开发、飞天遁地透视自瞄辅助技术,您的最佳选择:

【专业版】包含12套教学,内容更多,工具更丰富,详情联系i-xiaodi

https://mall.bilibili.com/neul-next/detailuniversal/detail.html?isMerchant=1&page=detailuniversal_detail&saleType=10&itemsId=11262678&loadingShow=1&noTitleBar=1

逻辑分析

如图所示,单独抽离一个函数用来计算测试

获取amxmodx_mm.dll模块地址和hl.exe模块地址

amxmodx_mm.dll+0x97030 == 自身人物地址

自身人物地址 + 0x230 == 第二个除自身外的敌人地址

hl.exe + 0x19E10C8 == 鼠标X

hl.exe + 0x19E10C4 == 鼠标Y

1-min

 

代码整理

void Calc()
{
	DWORD Pid = GetProcessIDByName("hl.exe");
	DWORD Moudle_amxmodx = (DWORD)GetProcessModuleHandleByName(Pid,"amxmodx_mm.dll");
	DWORD Moudle_hl = (DWORD)GetProcessModuleHandleByName(Pid, "hl.exe");
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);//游戏进程句柄

	if (Moudle_amxmodx == NULL || Moudle_hl == NULL || hProcess== NULL)
	{
		printf("[info]:初始化数据出错 Moudle_amxmodx:%p   Moudle_hl:%x   hProcess:%x\n", Moudle_amxmodx, Moudle_hl, hProcess);
		return;
	}

	Moudle_amxmodx += 0x97030;

	printf("[info]:初始化数据 Moudle_amxmodx:%p   Moudle_hl:%x   hProcess:%x\n", Moudle_amxmodx, Moudle_hl, hProcess);

	//拿到自身坐标和鼠标角度
	DWORD Address_me;
	float Angle_me_X, Angle_me_Y;
	float myX, myY, myZ;
	ReadProcessMemory(hProcess, (LPCVOID)Moudle_amxmodx, &Address_me, 4, NULL);

	while (true)
	{
		//拿自己的数据
		ReadProcessMemory(hProcess, (LPCVOID)(Moudle_hl + 0x19E10C8), &Angle_me_X, 4, NULL);
		ReadProcessMemory(hProcess, (LPCVOID)(Moudle_hl + 0x19E10C4), &Angle_me_Y, 4, NULL);
		if (Address_me > NULL)
		{
			ReadProcessMemory(hProcess, (LPCVOID)(Address_me + 0x88), &myX, 4, NULL);
			ReadProcessMemory(hProcess, (LPCVOID)(Address_me + 0x8C), &myZ, 4, NULL);
			ReadProcessMemory(hProcess, (LPCVOID)(Address_me + 0x90), &myY, 4, NULL);
			printf("[data]:address->%p\n[x:%.3f z:%.3f  y:%.3f]\nangle:(%.3f,%.3f)\n\n", Address_me, myX, myZ, myY, Angle_me_X, Angle_me_Y);
		}

		DWORD Address_enemy;
		float enemyX, enemyY, enemyZ;
		//拿第二个敌人的数据
		ReadProcessMemory(hProcess, (LPCVOID)(Moudle_amxmodx + 0x230), &Address_enemy, 4, NULL);
		if (Address_enemy > NULL)
		{
			ReadProcessMemory(hProcess, (LPCVOID)(Address_enemy + 0x88), &enemyX, 4, NULL);
			ReadProcessMemory(hProcess, (LPCVOID)(Address_enemy + 0x8C), &enemyZ, 4, NULL);
			ReadProcessMemory(hProcess, (LPCVOID)(Address_enemy + 0x90), &enemyY, 4, NULL);
			printf("\n\n[data]:address_enemy->%p\n[x:%.3f z:%.3f  y:%.3f]\n\n", Address_enemy, enemyX, enemyZ, enemyY);

		}
		Sleep(200);
		system("cls");
	}
}

 

2-min

恭喜你,至此,你已经完成了50%的工作了

剩下的工作:分析绘制算法,并进行透视绘制测试

且听下回分晓

请登录后发表评论

    没有回复内容