***付费内容***
IDA伪代码(地址:82E3ECC)
int __cdecl LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State_0 *L)
{
int i; // 用于循环的索引
long double v2; // 存储从 Lua 栈中获取的角色 ID
SceneManager *const v3; // 用于存储场景管理器
Scene *Scene; // 存储当前场景
Obj_Human *v5; // 存储角色对象
int v7; // 存储角色跟随的成员数
unsigned int selfId; // 存储角色 ID
char v9; // 存储一些辅助信息(未使用的局部变量)
CHAR msg[1048]; // 存储错误信息的缓冲区
// 检查传入的参数是否合法
for ( i = 1; i <= 2; ++i )
{
if ( L ) // 如果 Lua 状态不为空
{
if ( lua_isnumber(L, i) == 1 ) // 如果参数是数字类型
continue; // 如果是数字,继续处理下一个参数
// 如果参数不是数字,输出错误信息
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetFollowedMembersCount", i);
}
else // 如果 Lua 状态为空,输出错误信息
{
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetFollowedMembersCount");
}
CacheLog(3, msg); // 记录错误信息
}
// 获取 Lua 栈上的参数并转换为数字
lua_tonumber(L, 1); // 获取第一个参数(角色ID),但未保存
v2 = lua_tonumber(L, 2); // 获取第二个参数(角色ID),并存储在 v2
LOBYTE(v3) = v9; // 这部分代码可能用于初始化某些值,暂时不清楚作用
BYTE1(v3) = 12;
selfId = (int)v2; // 将角色 ID 存储为 selfId
// 获取当前场景对象
Scene = SceneManager::GetScene(v3, SceneID);
if ( !Scene ) // 如果没有找到对应的场景,触发断言
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1D0u,
"int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
"pScene",
"Scene ID ErrorLuaFnGetFollowedMembersCount");
// 如果当前线程ID与场景的线程ID不匹配,触发断言
if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1D0u,
"int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnGetFollowedMembersCount");
// 检查角色ID是否有效
if ( selfId > 0x752F || (v5 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0 )
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1D0u,
"int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
"pObj",
"selfId ErrorLuaFnGetFollowedMembersCount");
// 如果角色可以跟随
if ( (*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 2))(v5) == 1 )
{
// 如果角色处于有效逻辑状态
if ( !Obj_Human::IsCanLogic(v5) )
__assertex__(
"./Script/LuaFnTbl_Team.h",
0x1D0u,
"int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnGetFollowedMembersCount");
// 获取角色跟随的成员数
v7 = (*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 341))(v5);
lua_pushnumber(L, (double)v7); // 将跟随人数推送到 Lua 栈
}
else // 如果角色不能跟随
{
lua_pushnumber(L, -1.0); // 返回 -1 表示没有跟随成员
}
return 1; // 返回 1,表示 Lua 栈上有一个返回值(跟随人数或错误标记)
}
剩余 30% 内容需要支付 2.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|