找回密码
 register

QQ登录

只需一步,快速开始

查看: 2459|回复: 0

[系统函数] LuaFnItemBind 物品设置为绑定

[复制链接]

[系统函数] LuaFnItemBind 物品设置为绑定

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

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2020-11-23 20:32 | 显示全部楼层 |阅读模式

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

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

×

适用版本:全版本通用
更新时间:2024-12-16
文章编辑:雪舞


函数名称:LuaFnItemBind
注册函数:LuaFnItemBind
功能说明:物品设置为绑定
参数说明: ***付费内容***

IDA伪代码(地址:827CA38):

int __cdecl LuaFnTbl::LuaFnItemBind(lua_State *L)
{
  int i; // ebx
  unsigned int v2; // esi
  Scene_3 *Scene; // ebx
  Obj *v4; // esi
  Item *Item; // eax
  ItemContainer *Container; // eax
  ItemContainer *v8; // ebx
  INT v9; // eax
  Packet *v10; // eax
  Scene *m_pScene; // eax
  INT m_nSceneStatus; // edx
  SceneManager_1 *const v13; // [esp-10h] [ebp-538h]
  Item *pItem; // [esp+14h] [ebp-514h]
  UINT uBagIndex[2]; // [esp+18h] [ebp-510h]
  Packets::GCItemInfo Msg; // [esp+40h] [ebp-4E8h] BYREF
  CHAR msg[1048]; // [esp+110h] [ebp-418h] BYREF

  for ( i = 1; i <= 3; ++i )
  {
    if ( L )
    {
      if ( lua_isnumber((lua_State_0 *)L, i) == 1 )
        continue;
      sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnItemBind", i);
    }
    else
    {
      sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnItemBind");
    }
    CacheLog(3, msg);
  }
  lua_tonumber((lua_State_0 *)L, 1);
  v2 = (int)lua_tonumber((lua_State_0 *)L, 2);
  *(_QWORD *)uBagIndex = (__int64)lua_tonumber((lua_State_0 *)L, 3);
  Scene = SceneManager::GetScene(v13, SceneID);
  if ( !Scene )
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x184Eu,
      "int LuaFnTbl::LuaFnItemBind(lua_State*)",
      "pScene",
      "Scene ID ErrorLuaFnItemBind");
  if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x184Eu,
      "int LuaFnTbl::LuaFnItemBind(lua_State*)",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnItemBind");
  if ( v2 > 0x752F || (v4 = Scene->m_pObjManager->m_pObj[v2]) == 0 )
    __assertex__(
      "./Script/LuaFnTbl_Ability.h",
      0x184Eu,
      "int LuaFnTbl::LuaFnItemBind(lua_State*)",
      "pObj",
      "selfId ErrorLuaFnItemBind");
  if ( (*((int (__cdecl **)(Obj *))v4->_vptr_Obj + 2))(v4) == 1 )
  {
    if ( !Obj_Human::IsCanLogic((Obj_Human *const)v4) )
      __assertex__(
        "./Script/LuaFnTbl_Ability.h",
        0x184Eu,
        "int LuaFnTbl::LuaFnItemBind(lua_State*)",
        "pHuman->IsCanLogic()",
        "IsCanLogic() test return falseLuaFnItemBind");
    Item = HumanItemLogic::GetItem((Obj_Human *)v4, uBagIndex[0]);
    pItem = Item;
    if ( Item
      && !Item::IsEmpty(Item)
      && !pItem->m_bLock
      && (Container = HumanItemLogic::GetContainer((Obj_Human *)v4, uBagIndex[0]), (v8 = Container) != 0)
      && (v9 = (*((int (__cdecl **)(ItemContainer *, UINT))Container->_vptr_ItemContainer + 3))(Container, uBagIndex[0]),
          (v10 = (Packet *)ItemOperator::SetItemBind(&stru_CA04220, v8, v9)) != 0) )
    {
      Packet::Packet(v10);
      Msg._vptr_Packet = (int (**)(...))off_841DB08;
      Msg.m_ITEM.m_ItemGUID.m_Serial = 0;
      Msg.m_ITEM.m_ItemGUID.m_Server = 0;
      Msg.m_ITEM.m_ItemGUID.m_World = 0;
      sub_804AD50((int)&Msg.m_ITEM, 0, 176);
      Msg.m_ClientID = 0;
      Item::SaveValueTo(pItem, &Msg.m_ITEM);
      m_pScene = v4[1520].m_pScene;
      Msg.m_BagIndex = uBagIndex[0];
      m_nSceneStatus = m_pScene->m_nSceneStatus;
      Msg.m_nsNull = 0;
      (*(void (__cdecl **)(Scene *, Packets::GCItemInfo *))(m_nSceneStatus + 12))(m_pScene, &Msg);
      lua_pushnumber((lua_State_0 *)L, 1.0);
      Msg._vptr_Packet = (int (**)(...))off_841DB08;
      Packet::~Packet(&Msg);
    }
    else
    {
      lua_pushnumber((lua_State_0 *)L, 0.0);
    }
  }
  else
  {
    lua_pushnumber((lua_State_0 *)L, -1.0);
  }
  return 1;
}

返回值说明

  1. 1.0

    • 含义:绑定成功
    • 描述:
      • 物品成功被绑定。
      • 当所有检查通过,并且 ItemOperator::SetItemBind 函数成功绑定物品时,返回此值。
  2. 0.0

    • 含义:绑定失败
    • 描述:
      • 物品不存在或为空: 指定的物品为 null 或为空(Item::IsEmpty(Item) 返回 true)。
      • 物品已锁定: 物品当前被锁定(pItem->m_bLocktrue),无法进行绑定操作。
      • 获取容器失败: 无法获取物品所在的容器(HumanItemLogic::GetContainer 返回 null)。
      • 绑定操作失败: 通过 ItemOperator::SetItemBind 尝试绑定物品失败。
  3. -1.0

    • 含义:一般失败或系统错误
    • 描述:
      • 参数错误: 输入的参数类型不正确或数量不足。
      • 系统错误: 获取场景 (Scene) 失败,或当前线程 ID 与场景的线程 ID 不匹配。
      • 玩家状态问题: 玩家 (pHuman) 处于无法执行逻辑操作的状态(例如,Obj_Human::IsCanLogic(pHuman) 返回 false)。
      • 对象获取失败: 无法从场景中获取指定的玩家对象。
付费看帖
剩余 12% 内容需要支付 4.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

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

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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