适用版本:全版本通用
更新时间: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.0
- 含义:绑定成功
- 描述:
- 物品成功被绑定。
- 当所有检查通过,并且
ItemOperator::SetItemBind
函数成功绑定物品时,返回此值。
-
0.0
- 含义:绑定失败
- 描述:
- 物品不存在或为空: 指定的物品为
null
或为空(Item::IsEmpty(Item)
返回 true
)。
- 物品已锁定: 物品当前被锁定(
pItem->m_bLock
为 true
),无法进行绑定操作。
- 获取容器失败: 无法获取物品所在的容器(
HumanItemLogic::GetContainer
返回 null
)。
- 绑定操作失败: 通过
ItemOperator::SetItemBind
尝试绑定物品失败。
-
-1.0
- 含义:一般失败或系统错误
- 描述:
- 参数错误: 输入的参数类型不正确或数量不足。
- 系统错误: 获取场景 (
Scene
) 失败,或当前线程 ID 与场景的线程 ID 不匹配。
- 玩家状态问题: 玩家 (
pHuman
) 处于无法执行逻辑操作的状态(例如,Obj_Human::IsCanLogic(pHuman)
返回 false
)。
- 对象获取失败: 无法从场景中获取指定的玩家对象。
剩余 12% 内容需要支付 4.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。