找回密码
 register

QQ登录

只需一步,快速开始

查看: 1968|回复: 0

[系统函数] GetItemBoxWorldPosX GetItemBoxWorldPosZ 获取生长点、包裹的坐标

[复制链接]

[系统函数] GetItemBoxWorldPosX GetItemBoxWorldPosZ 获取生长点、包裹的坐标

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

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2020-10-21 15:53 | 显示全部楼层 |阅读模式

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

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

×

***付费内容***

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 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

GMT+8, 2025-1-18 15:39 , Processed in 0.159496 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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