更新时间: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
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|