***付费内容***
IDA伪代码(地址:828FD20):
int __cdecl LuaFnTbl::LuaFnDelAvailableItem(lua_State *L)
{
int i; // 用于循环检查参数的索引
unsigned int v2; // 存储玩家ID
Scene_3 *Scene; // 场景对象
Obj_Human *v4; // 玩家对象
_ITEM_ATTR_ENUM *ItemAttr; // 物品属性
int j; // 用于循环遍历物品属性
int k; // 用于循环遍历物品参数
SceneManager_1 *const v9; // 场景管理器
double v10; // 存储操作结果
signed int nDelCount; // 删除数量
UINT itemIndex; // 物品索引
ITEM_LOG_PARAM_0 ItemLogParam; // 物品日志参数
CHAR msg[1048]; // 错误消息缓存
// 循环检查前四个Lua参数是否是数字类型
for ( i = 1; i <= 4; ++i )
{
if ( L )
{
if ( lua_isnumber((lua_State_0 *)L, i) == 1 )
continue; // 如果是数字,继续检查下一个参数
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnDelAvailableItem", i); // 参数类型错误
}
else
{
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnDelAvailableItem"); // Lua_State为空
}
CacheLog(3, msg); // 记录错误日志
}
// 获取Lua中的参数值
lua_tonumber((lua_State_0 *)L, 1);
v2 = (int)lua_tonumber((lua_State_0 *)L, 2); // 玩家ID
itemIndex = (int)lua_tonumber((lua_State_0 *)L, 3); // 物品索引
nDelCount = (int)lua_tonumber((lua_State_0 *)L, 4); // 删除数量
// 获取场景对象
Scene = SceneManager::GetScene(v9, SceneID);
if ( !Scene )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x10FBu,
"int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
"pScene",
"Scene ID ErrorLuaFnDelAvailableItem"); // 场景无效,断言
// 检查当前线程ID是否与场景线程ID匹配
if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x10FBu,
"int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnDelAvailableItem"); // 线程ID不匹配,断言
// 检查玩家对象是否有效
if ( v2 > 0x752F || (v4 = (Obj_Human *)Scene->m_pObjManager->m_pObj[v2]) == 0 )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x10FBu,
"int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
"pObj",
"selfId ErrorLuaFnDelAvailableItem"); // 玩家无效,断言
// 检查玩家是否可以执行逻辑操作
if ( (*((int (__cdecl **)(Obj_Human *))v4->_vptr_Obj + 2))(v4) == 1 )
{
if ( !Obj_Human::IsCanLogic(v4) )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x10FBu,
"int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnDelAvailableItem"); // 玩家逻辑不可执行,断言
// 设置物品日志参数的初始值
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.OpType = ITEM_OP_TYPE::ITEM_SCRIPT_DELETE; // 操作类型设置为删除
// 执行物品删除操作
if ( nDelCount <= 0 || HumanItemLogic::EraseUnLockItem((ITEM_LOG_PARAM *)&ItemLogParam, v4, itemIndex, nDelCount) )
HIDWORD(v10) = 1072693248; // 删除成功,设置返回值
else
HIDWORD(v10) = 0; // 删除失败,设置返回值
LODWORD(v10) = 0;
lua_pushnumber((lua_State_0 *)L, v10); // 将结果返回给Lua
}
else
{
lua_pushnumber((lua_State_0 *)L, -1.0); // 玩家无法执行操作,返回失败
}
return 1; // 返回一个结果给Lua
}
剩余 7% 内容需要支付 1.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|