找回密码
 register

QQ登录

只需一步,快速开始

查看: 1651|回复: 0

[系统函数] ItemBoxEnterScene 在地图上生成包裹、生长点

[复制链接]

[系统函数] ItemBoxEnterScene 在地图上生成包裹、生长点

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

主题

0

回帖

1万

积分

仙帝

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

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

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

×

更新时间:2024-12-10
编写人员:雪舞


***付费内容***

IDA伪代码(地址:826A0FC):

// LuaFnTbl::LuaFnItemBoxEnterScene 函数:将物品箱放入场景
int __cdecl LuaFnTbl::LuaFnItemBoxEnterScene(lua_State *L)
{
  int i; // 用于循环控制(参数检查)
  INT v2; // 存储 Lua 中的第三个参数(类型)
  long double v3; // 存储 Lua 中的第六个参数(物品箱物品数)
  SceneManager_1 *const v4; // 场景管理器,指向当前场景
  Obj_ItemBox *GrowPointItemBox; // 新创建的物品箱
  _ITEM_ATTR_ENUM *ItemAttr; // 物品的属性
  int j, k; // 循环变量,用于处理物品的属性
  bool m; // 控制物品创建的循环
  long double v10; // 存储 Lua 中第七个开始的物品类型
  int iIndex; // 当前物品索引
  Scene_2 *pScene; // 当前场景对象
  int iBoxItemCount; // 物品箱中的物品数量
  unsigned int iQualityType; // 物品的品质类型
  char v16; // 存储场景信息
  float pos, pos_4; // 存储物品箱位置的坐标(X, Z)
  ITEM_LOG_PARAM_0 ItemLogParam; // 记录日志的参数
  CHAR msg[1048]; // 存储错误信息

  // 参数检查:检查 Lua 中传入的参数是否合法
  for (i = 1; i <= 6; ++i)
  {
    if (L)
    {
      if (lua_isnumber((lua_State_0 *)L, i) == 1) // 如果是数字,跳过
        continue;
      sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnItemBoxEnterScene", i); // 报告错误
    }
    else
    {
      sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnItemBoxEnterScene"); // 如果 L 为 NULL,报告错误
    }
    CacheLog(3, msg); // 输出日志
  }

  // 获取 Lua 参数:物品箱的位置、类型、数量、品质等
  pos = lua_tonumber((lua_State_0 *)L, 1);  // 获取位置 X 坐标
  pos_4 = lua_tonumber((lua_State_0 *)L, 2); // 获取位置 Z 坐标
  v2 = (int)lua_tonumber((lua_State_0 *)L, 3); // 获取物品箱类型
  lua_tonumber((lua_State_0 *)L, 4); // 获取一个未使用的参数(可能是空值)
  iQualityType = (int)lua_tonumber((lua_State_0 *)L, 5); // 获取物品的品质类型
  v3 = lua_tonumber((lua_State_0 *)L, 6); // 获取物品箱内物品的数量
  LOBYTE(v4) = v16;  // 存储场景信息
  BYTE1(v4) = 12; // 设置场景的标识
  iBoxItemCount = (int)v3; // 物品箱内的物品数量
  pScene = (Scene_2 *)SceneManager::GetScene(v4, SceneID); // 获取当前场景对象

  // 如果没有找到场景,抛出异常
  if (!pScene)
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x79Cu,
      "int LuaFnTbl::LuaFnItemBoxEnterScene(lua_State*)",
      "pScene",
      "Scene ID Error LuaFnItemBoxEnterScene");

  // 如果当前线程与场景线程不匹配,抛出异常
  if (ThreadValueManager::GetCurrentThreadID() != pScene->m_ThreadID)
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x79Cu,
      "int LuaFnTbl::LuaFnItemBoxEnterScene(lua_State*)",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnItemBoxEnterScene");

  // 创建新的物品箱
  GrowPointItemBox = ItemBoxManager::CreateGrowPointItemBox(pScene->m_pItemBoxManager, v2);

  if (GrowPointItemBox)
  {
    // 初始化日志参数
    ItemLogParam.XPos = 0.0;
    ItemLogParam.ZPos = 0.0;
    ItemLogParam.ItemGuid.m_Serial = 0;
    ItemLogParam.ItemGuid.m_Server = 0;
    ItemLogParam.ItemGuid.m_World = 0;
    ItemLogParam.CharGUID = -1;
    ItemLogParam.TargetGUID = -1;
    ItemLogParam.OpType = ITEM_OP_TYPE::ITEM_OP_UNKNOW;
    ItemLogParam.SecOpType = ITEM_OP_TYPE::ITEM_OP_UNKNOW;
    ItemLogParam.BagPos = -1;
    ItemLogParam.Count = 1;
    ItemLogParam.SceneID = -1;
    ItemLogParam.NpcType = -1;
    ItemLogParam.ShopGUID = -1;
    ItemLogParam.GemMax = 0;

    ItemAttr = ItemLogParam.ItemAttr; // 获取物品属性指针
    // 初始化物品属性
    for (j = 5; j >= 0; --j)
      *ItemAttr++ = 0;
    // 初始化其他参数
    for (k = 0; k <= 2; ++k)
      ItemLogParam.Param[k] = 0;
    ItemLogParam.bBind = 0;
    ItemLogParam.bMark = 0;
    ItemLogParam.bPWLock = 0;
    ItemLogParam.SceneID = pScene->m_SceneID;
    ItemLogParam.XPos = pos;  // 设置物品箱的 X 坐标
    ItemLogParam.ZPos = pos_4; // 设置物品箱的 Z 坐标
    iIndex = 0;
    ItemLogParam.OpType = ITEM_OP_TYPE::ITEM_CREATE_SCRIPT_TO_BOX; // 设置操作类型为创建物品箱

    // 创建物品
    for (m = iBoxItemCount > 0; m; m = iIndex < iBoxItemCount)
    {
      v10 = lua_tonumber((lua_State_0 *)L, iIndex + 7); // 获取物品类型
      if ((int)v10 <= 0)  // 如果物品类型不合法,抛出异常
        __assert__(
          "./Script/LuaFnTbl_Ability.h",
          0x7A9u,
          "int LuaFnTbl::LuaFnItemBoxEnterScene(lua_State*)",
          "iItemType>0");
      // 创建物品并记录日志
      Obj_ItemBox::CreateItem(GrowPointItemBox, (ITEM_LOG_PARAM *)&ItemLogParam, (int)v10, iQualityType);
      SaveItemLog((ITEM_LOG_PARAM *)&ItemLogParam);  // 保存日志
      ++iIndex;
    }

    // 将物品箱加入场景
    Scene::ObjectEnterScene(pScene, GrowPointItemBox);
    GrowPointItemBox->m_Pos.m_fX = pos; // 设置物品箱的 X 坐标
    GrowPointItemBox->m_Pos.m_fZ = pos_4; // 设置物品箱的 Z 坐标
    Obj::SetActiveFlag(GrowPointItemBox, 1); // 激活物品箱
    lua_pushnumber((lua_State_0 *)L, (double)GrowPointItemBox->m_ObjID); // 返回物品箱的 ID
  }
  else
  {
    lua_pushnumber((lua_State_0 *)L, -1.0); // 如果创建物品箱失败,返回 -1
  }

  return 1; // 函数返回值,表示返回一个值(物品箱 ID 或 -1)
}

付费看帖
剩余 19% 内容需要支付 10.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

GMT+8, 2025-1-18 14:56 , Processed in 0.102621 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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