***付费内容***
IDA伪代码(地址:826F938)
int __cdecl LuaFnTbl::LuaFnGetItemBoxWorldPosX(lua_State *L)
{
int i; // 用于循环检查传递的参数是否合法
long double v2; // 用于存储从 Lua 获取的第二个参数(物品箱的 ID)
Scene_3 *Scene; // 场景对象,获取物品箱所在的场景
Obj_ItemBox *ItemBox; // 存储获取的物品箱对象
SceneManager_1 *const v6; // 场景管理器指针,指向当前场景的管理对象
CHAR msg[1048]; // 用于存储错误信息的缓冲区
// 循环检查传递给 Lua 函数的前两个参数是否合法
for (i = 1; i <= 2; ++i)
{
// 检查 Lua 栈上是否存在有效的数字类型参数
if (L)
{
if (lua_isnumber((lua_State_0 *)L, i) == 1)
continue; // 如果参数是数字类型,继续检查下一个参数
// 如果参数无效,记录错误信息
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetItemBoxWorldPosX", i);
}
else
{
// 如果 Lua_State 为空,记录错误信息
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetItemBoxWorldPosX");
}
CacheLog(3, msg); // 打印错误信息
}
// 获取传递给 Lua 函数的参数
lua_tonumber((lua_State_0 *)L, 1); // 第一个参数(虽然未使用,但可以用于进一步检查)
v2 = lua_tonumber((lua_State_0 *)L, 2); // 获取第二个参数,物品箱的 ID
// 获取场景对象
Scene = SceneManager::GetScene(v6, SceneID);
if (!Scene)
{
// 如果场景为空,触发断言并输出错误信息
__assertex__(
"./Script/LuaFnTbl_Ability.h",
0xCE2u,
"int LuaFnTbl::LuaFnGetItemBoxWorldPosX(lua_State*)",
"pScene",
"Scene ID Error LuaFnGetItemBoxWorldPosX");
}
// 检查当前线程 ID 是否与场景线程 ID 匹配
if (ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID)
{
// 如果线程不匹配,触发断言并输出错误信息
__assertex__(
"./Script/LuaFnTbl_Ability.h",
0xCE2u,
"int LuaFnTbl::LuaFnGetItemBoxWorldPosX(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnGetItemBoxWorldPosX");
}
// 根据物品箱的 ID 获取物品箱对象
ItemBox = ItemBoxManager::GetItemBox(Scene->m_pItemBoxManager, (int)v2);
// 如果找到了物品箱,返回其 X 坐标;否则返回 0.0
if (ItemBox)
lua_pushnumber((lua_State_0 *)L, ItemBox->m_Pos.m_fX); // 将物品箱的 X 坐标推送到 Lua 栈
else
lua_pushnumber((lua_State_0 *)L, 0.0); // 如果找不到物品箱,推送 0.0
// 返回 1,表示成功返回一个值(物品箱的 X 坐标或 0.0)
return 1;
}
注释说明:
- 参数检查部分:这部分代码检查传入的参数是否为有效的数字。如果不是数字,会记录错误信息。
- 获取 Lua 参数:使用 lua_tonumber 获取传递的物品箱 ID(第二个参数),这将在后续的代码中用来查找物品箱。
- 获取场景:使用 SceneManager::GetScene 获取当前的场景对象,如果场景为空则触发断言错误。
- 线程检查:通过 ThreadValueManager::GetCurrentThreadID 获取当前线程 ID,确保与场景的线程 ID 匹配。如果不匹配,则触发断言。
- 查找物品箱:通过 ItemBoxManager::GetItemBox 根据物品箱的 ID 查找物品箱。如果找到了物品箱,就将其 X 坐标推送到 Lua 栈上,否则推送 0.0。
- 返回值:该函数返回一个值,表示物品箱的 X 坐标,或者在未找到物品箱时返回 0.0。
剩余 15% 内容需要支付 5.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|