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