找回密码
 register

QQ登录

只需一步,快速开始

查看: 52|回复: 0

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

[复制链接]

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

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

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2024-12-10 22:14 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

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

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

×

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


***付费内容***

IDA伪代码(地址:)

int __cdecl LuaFnTbl::LuaFnItemBoxEnterSceneEx(lua_State *L)
{
  int i; // 循环变量,用于遍历Lua参数
  Obj_ItemBox *v2; // 存储创建的物品箱对象指针
  _ITEM_ATTR_ENUM *ItemAttr; // 物品属性枚举类型,用于设置物品箱的属性
  int j; // 用于遍历属性值
  int k; // 用于遍历属性值
  SceneManager_1 *const v7; // 场景管理器指针
  Scene_20 *pScene; // 场景对象指针
  UINT uRecycleTime; // 物品箱的回收时间
  INT iBoxType; // 物品箱的类型
  float fZ; // 物品箱的Z坐标
  WORLD_POS pos; // 物品箱的位置
  ITEM_LOG_PARAM_0 ItemLogParam; // 记录物品箱日志的参数结构体
  FLOAT v14; // 物品箱的X坐标
  CHAR msg[1048]; // 错误信息消息缓存

  // 遍历Lua传递的参数,检查每个参数的有效性
  for ( i = 1; i <= 5; ++i )
  {
    if ( L ) // 判断Lua状态是否有效
    {
      // 检查参数是否为数字,如果是数字,则跳过当前参数
      if ( lua_isnumber((lua_State_0 *)L, i) == 1 )
        continue;
      // 如果参数不为数字,则记录错误信息
      sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnItemBoxEnterSceneEx", i);
    }
    else
    {
      // 如果Lua状态无效,则记录错误信息
      sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnItemBoxEnterSceneEx");
    }
    CacheLog(3, msg); // 记录错误日志
  }

  // 从Lua栈中获取参数值
  lua_tonumber((lua_State_0 *)L, 1); // X坐标
  v14 = lua_tonumber((lua_State_0 *)L, 2); // Y坐标(可能没有使用)
  fZ = lua_tonumber((lua_State_0 *)L, 3); // Z坐标
  iBoxType = (int)lua_tonumber((lua_State_0 *)L, 4); // 物品箱类型
  uRecycleTime = (__int64)lua_tonumber((lua_State_0 *)L, 5); // 物品箱回收时间

  // 获取当前场景对象
  pScene = (Scene_20 *)SceneManager::GetScene(v7, SceneID);
  if ( !pScene ) // 如果场景无效,则断言并报错
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x7F1u,
      "int LuaFnTbl::LuaFnItemBoxEnterSceneEx(lua_State*)",
      "pScene",
      "Scene ID Error LuaFnItemBoxEnterSceneEx");

  // 检查当前线程ID是否与场景的线程ID匹配
  if ( ThreadValueManager::GetCurrentThreadID() != pScene->m_ThreadID )
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x7F1u,
      "int LuaFnTbl::LuaFnItemBoxEnterSceneEx(lua_State*)",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnItemBoxEnterSceneEx");

  // 设置物品箱的位置
  pos.m_fX = v14; // X坐标
  pos.m_fZ = fZ;   // Z坐标

  // 创建物品箱
  v2 = ItemBoxManager::CreateItemBox(pScene->m_pItemBoxManager, iBoxType, &pos, uRecycleTime);
  if ( v2 ) // 如果物品箱创建成功
  {
    // 初始化日志参数
    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; // 设置场景ID
    *(WORLD_POS *)&ItemLogParam.XPos = pos; // 设置物品箱位置
    ItemLogParam.OpType = ITEM_OP_TYPE::ITEM_CREATE_SCRIPT_TO_BOX; // 设置操作类型为物品创建

    // 激活物品箱
    Obj::SetActiveFlag(v2, 1);

    // 将物品箱的ID返回到Lua栈
    lua_pushnumber((lua_State_0 *)L, (double)v2->m_ObjID);
  }
  else // 如果物品箱创建失败
  {
    // 返回-1表示失败
    lua_pushnumber((lua_State_0 *)L, -1.0);
  }
  return 1; // 函数返回1个值到Lua
}
付费看帖
剩余 16% 内容需要支付 10.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

GMT+8, 2025-1-18 12:52 , Processed in 0.133098 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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