***付费内容***
IDA伪代码(085):
// 定义 LuaFnTbl 类中的 LuaFnIsCaptain 函数,使用 __cdecl 调用约定
int __cdecl LuaFnTbl::LuaFnIsCaptain(lua_State *L)
{
// 声明局部变量
int i; // 用于循环计数
Scene_3 *Scene; // 指向 Scene_3 对象的指针
Obj_Human *v3; // 指向 Obj_Human 对象的指针
const CHAR *v5; // 指向错误描述的指针
const CHAR *v6; // 指向错误信息的指针
SceneManager_1 *const v7; // 指向 SceneManager_1 对象的常量指针
double v8; // 用于存储返回值
TeamInfo *TeamInfo; // 指向 TeamInfo 对象的指针
unsigned int selfId; // 存储从 Lua 获取的对象 ID
char s[1048]; // 用于存储错误日志信息的缓冲区
// 检查 Lua 函数的前两个参数是否为数字
for (i = 1; i <= 2; ++i)
{
if (L) // 如果 Lua 状态指针有效
{
// 检查第 i 个参数是否为数字
if (lua_isnumber((lua_State_0 *)L, i) == 1)
continue; // 如果是数字,继续循环
// 如果第 i 个参数不是数字,格式化错误信息
snprintf(s, 0x200u, "ERROR: [%s]Param %d is illegal!", "LuaFnIsCaptain", i);
}
else // 如果 Lua 状态指针为空
{
// 格式化错误信息
snprintf(s, 0x200u, "ERROR: [%s] Lua_State==NULL!", "LuaFnIsCaptain");
}
// 记录错误日志,错误级别为 3
CacheLog(3, s);
}
// 从 Lua 栈中获取第一个参数并转换为数字(但未使用)
lua_tonumber((lua_State_0 *)L, 1);
// 从 Lua 栈中获取第二个参数并转换为数字,存储在 selfId 中(对象 ID)
selfId = (unsigned int)lua_tonumber((lua_State_0 *)L, 2);
// 通过 SceneManager 获取当前场景对象,传入 v7 和全局场景管理器指针
Scene = SceneManager::GetScene(v7, g_pSceneManager);
if (!Scene) // 如果未找到场景
{
v6 = "Scene ID ErrorLuaFnIsCaptain"; // 设置错误信息
v5 = "pScene"; // 设置错误指针
LABEL_17:
// 断言失败,输出错误信息并终止程序
__assertex__("./Script/LuaFnTbl_Attr.h", 0x239u, "int LuaFnTbl::LuaFnIsCaptain(lua_State*)", v5, v6);
}
// 检查当前线程 ID 是否与场景的线程 ID 一致
if (ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID)
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x239u,
"int LuaFnTbl::LuaFnIsCaptain(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnIsCaptain");
// 检查 selfId 是否在有效范围内,并获取对应的 Obj_Human 对象
if (selfId > 0x752F || (v3 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0)
{
v6 = "selfId ErrorLuaFnIsCaptain"; // 设置错误信息
v5 = "pObj"; // 设置错误指针
goto LABEL_17; // 跳转到断言失败处理
}
// 调用 Obj_Human 对象的第三个虚函数,检查其状态
if ((*((int (__cdecl **)(Obj_Human *))v3->_vptr_Obj + 2))(v3) == 1)
{
// 如果 Obj_Human 对象可以进行逻辑处理,进一步检查
if (!Obj_Human::IsCanLogic(v3))
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x239u,
"int LuaFnTbl::LuaFnIsCaptain(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnIsCaptain");
// 获取 Obj_Human 对象的团队信息
TeamInfo = Obj_Human::GetTeamInfo(v3);
// 检查团队中的第一个成员的 GUID 是否与当前对象的 GUID 相同
if (TeamInfo->m_aMember[0].m_GUID == Obj_Human::GetGUID(v3))
HIDWORD(v8) = 1072693248; // 设置高位 DWORD 为特定值(表示 true,对应 1.0)
else
HIDWORD(v8) = 0; // 设置高位 DWORD 为 0(表示 false,对应 0.0)
LODWORD(v8) = 0; // 设置低位 DWORD 为 0
// 将 v8 推送到 Lua 栈中,表示是否为队长
lua_pushnumber((lua_State_0 *)L, v8);
}
else
{
// 如果 Obj_Human 对象的状态不符合要求,推送 -1 到 Lua 栈中
lua_pushnumber((lua_State_0 *)L, -1.0);
}
return 1; // 返回 1,表示向 Lua 返回了一个值
}
剩余 11% 内容需要支付 2.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|