***付费内容***
IDA伪代码(地址:82DF4A4)
int __cdecl LuaFnTbl::LuaFnGetMonsterCount(lua_State_0 *L)
{
long double v1; // fst7:用于存储从 Lua 中获取的数字参数
Scene *Scene; // esi:场景对象的指针,用来保存当前场景
MonsterManager *m_pMonsterManager; // ebx:怪物管理器对象的指针,负责管理场景中的怪物
unsigned int m_uCount; // edx:怪物数量
unsigned int v5; // ecx:用于循环计数
Obj_Monster *v6; // eax:当前怪物对象的指针
CHAR msg[1048]; // [esp+10h] [ebp-418h] BYREF:错误信息缓冲区
// 如果 Lua 状态对象不为空
if ( L )
{
// 如果第一个参数是数字
if ( lua_isnumber(L, 1) == 1 )
goto LABEL_5; // 跳转到 LABEL_5,开始处理参数
// 如果第一个参数不是数字,生成错误信息
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetMonsterCount", 1);
}
else
{
// 如果 Lua 状态为空,生成错误信息
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetMonsterCount");
}
// 记录错误日志
CacheLog(3, msg);
LABEL_5:
// 获取 Lua 参数并将其转换为数字,存储到 v1 中
v1 = lua_tonumber(L, 1);
// 根据传入的场景 ID 获取场景对象
Scene = SceneManager::GetScene((SceneManager *const)(__int16)v1, SceneID);
// 如果场景为空,则触发断言错误,说明场景 ID 无效
if ( !Scene )
__assertex__(
"./Script/LuaFnTbl_Scene.h", // 错误文件
0x580u, // 错误行号
"int LuaFnTbl::LuaFnGetMonsterCount(lua_State*)", // 错误函数
"pScene", // 错误变量
"Scene ID Error LuaFnGetMonsterCount"); // 错误信息
// 如果当前线程的 ID 与场景的线程 ID 不匹配,触发断言错误
if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
__assertex__(
"./Script/LuaFnTbl_Scene.h",
0x580u,
"int LuaFnTbl::LuaFnGetMonsterCount(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnGetMonsterCount");
// 获取场景中的怪物管理器
m_pMonsterManager = Scene->m_pMonsterManager;
// 获取怪物数量
m_uCount = m_pMonsterManager->m_uCount;
// 如果怪物数量大于 512,则限制为 512
if ( m_uCount > 0x200 )
m_uCount = 512;
v5 = 0;
// 设置场景中的对象 ID 列表的计数为怪物数量
Scene->m_ObjIDList.m_nCount = m_uCount;
// 遍历怪物,存储每个怪物的对象 ID
while ( v5 < m_uCount )
{
v6 = 0;
// 如果怪物管理器中有足够的怪物对象,则获取第 v5 个怪物
if ( m_pMonsterManager->m_uCount > v5 )
v6 = m_pMonsterManager->m_papObjs[v5];
// 将怪物的对象 ID 存储到场景的对象 ID 列表中
Scene->m_ObjIDList.m_aIDs[v5++] = v6->m_ObjID;
}
// 将怪物数量作为返回值推送到 Lua 栈中
lua_pushnumber(L, (double)m_uCount);
// 返回 1,表示一个返回值
return 1;
}
代码概述:
- 参数检查:首先,检查
Lua 中传入的参数是否为数字,如果不是则输出错误信息。
- 场景验证:获取场景对象并验证其合法性,确保线程一致性。
- 获取怪物管理器:从场景中获取怪物管理器,获取当前场景中的怪物数量。
- 限制怪物数量:如果怪物数量大于
512 ,则将其限制为 512 。
- 存储怪物对象 ID:遍历怪物管理器,将每个怪物的对象
ID 存储到场景的对象 ID 列表中。
- 返回怪物数量:将怪物数量作为返回值推送到
Lua 栈中,并返回 1 表示成功。
剩余 17% 内容需要支付 10.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|