找回密码
 register

QQ登录

只需一步,快速开始

查看: 2460|回复: 0

[系统函数] LuaFnGetSceneType 获取当前场景类型

[复制链接]

[系统函数] LuaFnGetSceneType 获取当前场景类型

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2020-12-11 21:23 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

***付费内容***

C++源代码(武侠世界):

#ifdef __LINUX__
    // 在Linux环境下,定义宏用于Lua函数的异常处理
    #define LUA_ENTER_FUNCTION {try{
    #define LUA_LEAVE_FUNCTION }catch(...){g_pLog->FastSaveLog(LOG_FILE_2,"Lua Error %s %s %s",__FILE__,__LINE__,__PRETTY_FUNCTION__);}}
#elif __WINDOWS__
    // 在Windows环境下,定义宏用于Lua函数的异常处理
    #define LUA_ENTER_FUNCTION {try{
    #define LUA_LEAVE_FUNCTION }catch(...){g_pLog->FastSaveLog(LOG_FILE_2,"Lua Error %s %s %s",__FILE__,__LINE__,__FUNCTION__);}}
#endif

INT LuaFnGetSceneType(Lua_State* L) 
{
    // 宏:进入Lua函数的标准流程,开启一个try块以捕捉异常
    LUA_ENTER_FUNCTION

    // 从Lua堆栈的第一个参数获取场景ID,并将其转换为SceneID_t类型
    SceneID_t sceneId = Lua_ValueToNumber(L, 1);

    {
        // 使用全局场景管理器获取对应场景ID的场景对象
        Scene* pScene = (Scene*)(g_pSceneManager->GetScene(sceneId));    

        // 断言:确保获取的场景对象不为NULL,否则输出错误消息
        AssertEx(pScene, "场景ID出错 LuaFnGetSceneType");   

        // 如果场景对象存在,继续处理
        if(pScene) 
        {
            // (注释掉的代码)断言当前线程ID是否与场景对象的线程ID一致,确保线程安全
            // Assert( MyGetCurrentThreadID() == pScene->m_ThreadID );

            // 获取场景类型
            INT nType = pScene->GetSceneType();

            // 将场景类型推送到Lua堆栈,以便Lua脚本可以接收
            Lua_PushNumber(L, nType);

            // 返回1,表示向Lua返回了一个值
            return 1;
        }
    }

    // 宏:离开Lua函数的标准流程,捕捉任何未处理的异常并记录日志
    LUA_LEAVE_FUNCTION

    // 如果未能获取有效的场景对象,推送一个无效的场景类型到Lua堆栈
    Lua_PushNumber(L, SCENE_TYPE_INVALID);

    // 返回1,表示向Lua返回了一个值(无效的场景类型)
    return 1;
}

IDA伪代码(地址:82DA4E0)

int __cdecl LuaFnTbl::LuaFnGetSceneType(lua_State *L)
{
    long double v1; // fst7 - 用于存储从Lua获取的场景ID
    Scene_3 *Scene; // eax - 指向获取的场景对象
    CHAR msg[1032]; // [esp+10h] [ebp-408h] BYREF - 用于存储错误消息

    // 检查Lua状态指针是否有效
    if (L)
    {
        // 检查Lua堆栈中的第一个参数是否为数字
        if (lua_isnumber((lua_State_0 *)L, 1) == 1)
            goto LABEL_5; // 如果是数字,跳转到处理逻辑
        // 如果第一个参数不是数字,生成错误消息
        sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetSceneType", 1);
    }
    else
    {
        // 如果Lua状态指针为空,生成错误消息
        sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetSceneType");
    }
    // 记录错误日志
    CacheLog(3, msg);

LABEL_5:
    // 从Lua堆栈中获取第一个参数(场景ID)并转换为数字
    v1 = lua_tonumber((lua_State_0 *)L, 1);
    // 使用SceneManager获取对应的场景对象
    Scene = SceneManager::GetScene((SceneManager_1 *const)(__int16)v1, SceneID);
    if (!Scene)
        // 如果未找到场景对象,触发断言错误
        __assertex__(
            "./Script/LuaFnTbl_Scene.h",
            0x34u,
            "int LuaFnTbl::LuaFnGetSceneType(lua_State*)",
            "pScene",
            "Scene ID Error LuaFnGetSceneType");
    // 将场景类型推送到Lua堆栈
    lua_pushnumber((lua_State_0 *)L, (double)Scene->m_SceneType);
    // 返回1,表示有一个返回值
    return 1;
}
付费看帖
剩余 21% 内容需要支付 5.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-18 16:01 , Processed in 0.103657 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表