***付费内容***
IDA伪代码:
// 定义 LuaFnTbl 类中的 LuaFnGetPropertyBagSpace 函数,使用 __cdecl 调用约定
int __cdecl LuaFnTbl::LuaFnGetPropertyBagSpace(lua_State *L)
{
// 声明局部变量
int i; // 用于循环计数,存储在 EBX 寄存器中
long double v2; // 用于存储第二个 Lua 参数的数值,存储在 FST7 寄存器中
SceneManager_1 *const v3; // 指向 SceneManager_1 对象的常量指针,存储在 EAX 寄存器中
Scene_3 *Scene; // 指向 Scene_3 对象的指针,存储在 EBX 寄存器中
Obj_Human *v5; // 指向 Obj_Human 对象的指针,存储在 EBX 寄存器中
ItemContainer *BaseContain; // 指向 ItemContainer 对象的指针,存储在 EAX 寄存器中
const CHAR *v8; // 错误信息的指针,位于栈的偏移位置 [ebp-44Ch]
const CHAR *v9; // 错误描述的指针,位于栈的偏移位置 [ebp-448h]
double v10; // 用于存储 ItemContainer 的容量,位于栈的偏移位置 [ebp-444h]
unsigned int selfId; // 存储从 Lua 获取的对象 ID,位于栈的偏移位置 [ebp-428h]
char v12; // 辅助变量,位于栈的偏移位置 [ebp-41Ah]
char s[1048]; // 用于存储错误日志信息的缓冲区,位于栈的偏移位置 [ebp-418h],按引用传递
// 检查 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!", "LuaFnGetPropertyBagSpace", i);
}
else
{
// 如果 Lua 状态指针为空,格式化错误信息
snprintf(s, 0x200u, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetPropertyBagSpace");
}
// 记录错误日志
CacheLog(3, s);
}
// 从 Lua 栈中获取第一个参数并转换为数字(但未使用)
lua_tonumber((lua_State_0 *)L, 1);
// 从 Lua 栈中获取第二个参数并转换为数字,存储在 v2 中
v2 = lua_tonumber((lua_State_0 *)L, 2);
// 设置 v3 的低位字节为 v12,第二个字节为 12
LOBYTE(v3) = v12;
BYTE1(v3) = 12;
// 将 v2 转换为无符号整数,作为 selfId(对象 ID)
selfId = (int)v2;
// 通过 SceneManager 获取当前场景对象,传入 v3 和全局场景管理器指针
Scene = SceneManager::GetScene(v3, g_pSceneManager);
if (!Scene)
{
// 如果未找到场景,设置错误描述和指针
v9 = "Scene ID ErrorLuaFnGetPropertyBagSpace";
v8 = "pScene";
LABEL_17:
// 断言失败,输出错误信息
__assertex__("./Script/LuaFnTbl_Attr.h", 0xE2Cu, "int LuaFnTbl::LuaFnGetPropertyBagSpace(lua_State*)", v8, v9);
}
// 检查当前线程 ID 是否与场景的线程 ID 一致
if (ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID)
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0xE2Cu,
"int LuaFnTbl::LuaFnGetPropertyBagSpace(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnGetPropertyBagSpace");
// 检查 selfId 是否在有效范围内,并获取对应的 Obj_Human 对象
if (selfId > 0x752F || (v5 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0)
{
// 如果 selfId 无效,设置错误描述和指针
v9 = "selfId ErrorLuaFnGetPropertyBagSpace";
v8 = "pObj";
goto LABEL_17;
}
// 调用 Obj_Human 对象的虚函数,检查其状态
if ((*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 2))(v5) == 1)
{
// 如果 Obj_Human 对象可以进行逻辑处理,进一步检查
if (!Obj_Human::IsCanLogic(v5))
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0xE2Cu,
"int LuaFnTbl::LuaFnGetPropertyBagSpace(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnGetPropertyBagSpace");
// 获取 Obj_Human 对象的基础容器(可能是其物品背包)
BaseContain = Obj_Human::GetBaseContain(v5);
if (BaseContain)
{
// 调用 ItemContainer 的第七个虚函数,获取容器的空间容量
v10 = (double)(unsigned int)(*((int (__cdecl **)(ItemContainer *))BaseContain->_vptr_ItemContainer + 7))(BaseContain);
// 将容量推送到 Lua 栈中
lua_pushnumber((lua_State_0 *)L, v10);
}
else
{
// 如果基础容器不存在,推送 0 到 Lua 栈中
lua_pushnumber((lua_State_0 *)L, 0.0);
}
}
else
{
// 如果 Obj_Human 对象的状态不符合要求,推送 -1 到 Lua 栈中
lua_pushnumber((lua_State_0 *)L, -1.0);
}
// 返回 1,表示向 Lua 返回了一个值
return 1;
}
剩余 11% 内容需要支付 2.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|