***付费内容***
IDA伪代码(地址:82E3BB0)
int __cdecl LuaFnTbl::LuaFnIsTeamFollow(lua_State_0 *L)
{
int i; // ebx:循环变量,用来检查 Lua 参数的合法性
Scene *Scene; // ebx:场景对象指针
Obj_Human *v3; // ebx:人物对象指针
int v5; // eax:返回的跟随状态值
SceneManager *const v6; // [esp-10h] [ebp-448h]:场景管理器指针
unsigned int selfId; // [esp+10h] [ebp-428h]:Lua 参数中的第二个值(角色 ID)
CHAR msg[1048]; // [esp+20h] [ebp-418h] BYREF:错误信息缓冲区
// 循环检查 Lua 中传入的前两个参数是否为数字
for ( i = 1; i <= 2; ++i )
{
// 如果 Lua 状态不为空
if ( L )
{
// 如果当前参数是数字,则继续检查下一个参数
if ( lua_isnumber(L, i) == 1 )
continue;
// 如果参数不是数字,生成错误信息
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnIsTeamFollow", i);
}
else
{
// 如果 Lua 状态为空,生成错误信息
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnIsTeamFollow");
}
// 记录错误日志
CacheLog(3, msg);
}
// 获取第一个参数的数字值,但没有使用
lua_tonumber(L, 1);
// 获取第二个参数(角色 ID),并将其存储在 selfId 变量中
selfId = (int)lua_tonumber(L, 2);
// 根据场景 ID 获取场景对象
Scene = SceneManager::GetScene(v6, SceneID);
// 如果场景为空,则触发断言错误,说明场景 ID 无效
if ( !Scene )
__assertex__(
"./Script/LuaFnTbl_Team.h", // 错误文件
0x1A5u, // 错误行号
"int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)", // 错误函数
"pScene", // 错误变量
"Scene ID ErrorLuaFnIsTeamFollow"); // 错误信息
// 如果当前线程的 ID 与场景的线程 ID 不匹配,触发断言错误
if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1A5u,
"int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnIsTeamFollow");
// 如果角色 ID 无效,触发断言错误
if ( selfId > 0x752F || (v3 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0 )
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1A5u,
"int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)",
"pObj",
"selfId ErrorLuaFnIsTeamFollow");
// 如果角色对象存在,并且角色对象的某个方法返回 1(表示角色处于某种状态)
if ( (*((int (__cdecl **)(Obj_Human *))v3->_vptr_Obj + 2))(v3) == 1 )
{
// 如果角色可以逻辑处理
if ( !Obj_Human::IsCanLogic(v3) )
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1A5u,
"int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnIsTeamFollow");
// 调用角色对象的某个方法获取跟随状态,并将其作为返回值
v5 = (*((int (__cdecl **)(Obj_Human *))v3->_vptr_Obj + 338))(v3);
lua_pushnumber(L, (double)v5); // 将跟随状态值推送到 Lua 栈中
}
else
{
// 如果角色不符合条件,返回 -1
lua_pushnumber(L, -1.0); // 返回 -1,表示不在团队跟随状态
}
// 返回 1,表示一个返回值
return 1;
}
剩余 14% 内容需要支付 1.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|