***付费内容***
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
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|