66.第二阶段x64游戏实战-代码实现取lua返回值获得可接任务结构

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

上一个内容:65.第二阶段x64游戏实战-替换游戏lua打印可接任务

首先新加一个按钮和输入框

然后这个输入框的id是IDC_EDIT8,一会要用它

然后双击下图红框按钮,让它创建按钮点击时执行的函数

然后是抓取的打开任务窗口的lua代码

MainMenuBar_Mission_Clicked(); // 打开任务窗口
setmetatable(_G, {__index = QuestLog_Env});// setmetatable是lua的函数用来,给_G全局表的__index设置QuestLog_Env
QuestLog_OnEvent("TOGLE_MISSION");// 切换事件,比如隐藏或显示某个东西
QuestLog_ListBox_SelectChanged();// 切换当前任务窗口
QuestLog_UpdateMissionOutline();// 切换可接任务窗口

然后就开始写代码了,首先是获取任务的lua代码

function MissionOutlinetext()
	setmetatable(_G, {__index = QuestLog_Env});
	QuestLog_UpdateMissionOutline();
	local str = ""
	for i=1,200 do
		local num = GetMissionOutlineNum(i)
		if(num > 0)then
			for bbb = 1,num do
				-- a:任务等级(该任务对应的推荐等级)。
				-- b:最低等级限制(玩家需达到该等级才能接取任务)。
				-- c:最高等级限制(超过该等级可能无法接取,或任务奖励衰减)。
				-- d:NPC 名称(发布 / 接取该任务的 NPC 名字,字符串类型)。
				-- e:NPC 位置(NPC 所在的坐标或区域描述,字符串类型)。
				-- f:场景名称(任务发生的地图 / 场景名称,字符串类型)。
				-- g:任务名称(该任务的显示名称,字符串类型)。
				local a,b,c,d,e,f,g = GetMissionOutlineInfo(i, bbb)
				str = str..g.."|"-- 拼接内容
			end
		end
	end
	if str == nil then
		return "0"
	else
		return str
	end
end
strr = MissionOutlinetext() -- 获取任务名给全局变量strr

使用:然后点击获取返回值就可以在DebuView中看到了

效果图:

c代码,如下图是获取返回值按钮点击时执行的函数

void MyDialog::OnBnClickedButton18()
{
	CStringA CStrA;
	m_DbgEdit.GetWindowText(CStrA);
	CStringA str;
	GetDlgItemText(IDC_EDIT8, str);

	;
	if (!CStrA.IsEmpty())
	{
		/**
			CStrA是lua代码
			str取lua变量
		*/
		msg_getstring(CStrA.GetBuffer(), str.GetBuffer());
		//msg_dostring(CStrA.GetBuffer());
		CStrA.ReleaseBuffer();
	}
}

msg_getstring函数,也就是把lua代码和返回值拼接成MyStruct结构

struct MyStruct
{
	char* CStrA;
	char* Creturn;
};
string msg_getstring(const char* str_arg, char* _Format, ...)//获取字符串
{

	string str;
	try
	{
		char getstringBuf[2048] = { 0 };//用于存放getstring的字符串缓冲区
		va_list list;
		va_start(list, _Format);
		vsprintf(getstringBuf, _Format, list);
		va_end(list);
		//dbgPrint(getstringBuf);

		MyStruct getstring = { 0 };
		getstring.CStrA = (char*)str_arg;// lua代码
		getstring.Creturn = (char*)getstringBuf;// 返回值

		// 发送给0x1003消息
		::SendMessageA(m_Hwnd, g_MyID, 0x1003, (LPARAM)&getstring);

		// 获取返回值
		str = getstring.CStrA;

		LogA("	getstring.CStrA==%s", str);
	}
	catch (...)
	{

	}

	return str;
}

然后是0x1003消息

MyStruct tmp = *(MyStruct*)lpArg->lParam;
LogA("tmp.Creturn=%s", tmp.Creturn);
LogA("tmp.CStrA=%s", tmp.CStrA);
pMsg->telua_getstring((char*)tmp.CStrA, (char*)tmp.Creturn);

然后是telua_getstring

bool CMessage::telua_getstring(const char* buf, const char* want_get_string)
{
	__try {

		// 执行lua代码
		if (telua_dostring(buf))
		{
			/**
				根据want_get_string的值获取全局变量
				如果want_get_string的值是strr
				就是获取lua叫strr的全局变量的值
				获取之后压入栈顶
			*/
			if (telua_getglobal(want_get_string))
			{
				LogA("telua_getglobal");
				//telua_tostring 获取栈顶的值给str
				const char* str = telua_tostring(-1);
				// 把str的值写到buf里(覆盖),也就是原本的代码
				sprintf((char*)buf, str);
				// 然后把栈顶的值删除,恢复原本的栈
				telua_pop(1);
				LogA("telua_pop%s", buf);
				return true;
			}
			else
			{
				const char* str = "错误1";
				sprintf((char*)buf, str);
				LogA("%s telua_getglobal erro", __FUNCTION__);
				return false;
			}
		}
		else
		{
			const char* str = "错误2";
			sprintf((char*)buf, str);
			LogA("%s telua_dostring erro", __FUNCTION__);
			return false;
		}
	}
	__except (1) {
		LogA(__FUNCTION__); return false;
	}
}

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值