更新时间:2024-12-10
编写人员:雪舞
***付费内容***
IDA伪代码(地址:826A0FC):
// LuaFnTbl::LuaFnItemBoxEnterScene 函数:将物品箱放入场景
int __cdecl LuaFnTbl::LuaFnItemBoxEnterScene(lua_State *L)
{
int i; // 用于循环控制(参数检查)
INT v2; // 存储 Lua 中的第三个参数(类型)
long double v3; // 存储 Lua 中的第六个参数(物品箱物品数)
SceneManager_1 *const v4; // 场景管理器,指向当前场景
Obj_ItemBox *GrowPointItemBox; // 新创建的物品箱
_ITEM_ATTR_ENUM *ItemAttr; // 物品的属性
int j, k; // 循环变量,用于处理物品的属性
bool m; // 控制物品创建的循环
long double v10; // 存储 Lua 中第七个开始的物品类型
int iIndex; // 当前物品索引
Scene_2 *pScene; // 当前场景对象
int iBoxItemCount; // 物品箱中的物品数量
unsigned int iQualityType; // 物品的品质类型
char v16; // 存储场景信息
float pos, pos_4; // 存储物品箱位置的坐标(X, Z)
ITEM_LOG_PARAM_0 ItemLogParam; // 记录日志的参数
CHAR msg[1048]; // 存储错误信息
// 参数检查:检查 Lua 中传入的参数是否合法
for (i = 1; i <= 6; ++i)
{
if (L)
{
if (lua_isnumber((lua_State_0 *)L, i) == 1) // 如果是数字,跳过
continue;
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnItemBoxEnterScene", i); // 报告错误
}
else
{
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnItemBoxEnterScene"); // 如果 L 为 NULL,报告错误
}
CacheLog(3, msg); // 输出日志
}
// 获取 Lua 参数:物品箱的位置、类型、数量、品质等
pos = lua_tonumber((lua_State_0 *)L, 1); // 获取位置 X 坐标
pos_4 = lua_tonumber((lua_State_0 *)L, 2); // 获取位置 Z 坐标
v2 = (int)lua_tonumber((lua_State_0 *)L, 3); // 获取物品箱类型
lua_tonumber((lua_State_0 *)L, 4); // 获取一个未使用的参数(可能是空值)
iQualityType = (int)lua_tonumber((lua_State_0 *)L, 5); // 获取物品的品质类型
v3 = lua_tonumber((lua_State_0 *)L, 6); // 获取物品箱内物品的数量
LOBYTE(v4) = v16; // 存储场景信息
BYTE1(v4) = 12; // 设置场景的标识
iBoxItemCount = (int)v3; // 物品箱内的物品数量
pScene = (Scene_2 *)SceneManager::GetScene(v4, SceneID); // 获取当前场景对象
// 如果没有找到场景,抛出异常
if (!pScene)
__assertex__(
"./Script/LuaFnTbl_Ability.h",
0x79Cu,
"int LuaFnTbl::LuaFnItemBoxEnterScene(lua_State*)",
"pScene",
"Scene ID Error LuaFnItemBoxEnterScene");
// 如果当前线程与场景线程不匹配,抛出异常
if (ThreadValueManager::GetCurrentThreadID() != pScene->m_ThreadID)
__assertex__(
"./Script/LuaFnTbl_Ability.h",
0x79Cu,
"int LuaFnTbl::LuaFnItemBoxEnterScene(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnItemBoxEnterScene");
// 创建新的物品箱
GrowPointItemBox = ItemBoxManager::CreateGrowPointItemBox(pScene->m_pItemBoxManager, v2);
if (GrowPointItemBox)
{
// 初始化日志参数
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;
ItemLogParam.XPos = pos; // 设置物品箱的 X 坐标
ItemLogParam.ZPos = pos_4; // 设置物品箱的 Z 坐标
iIndex = 0;
ItemLogParam.OpType = ITEM_OP_TYPE::ITEM_CREATE_SCRIPT_TO_BOX; // 设置操作类型为创建物品箱
// 创建物品
for (m = iBoxItemCount > 0; m; m = iIndex < iBoxItemCount)
{
v10 = lua_tonumber((lua_State_0 *)L, iIndex + 7); // 获取物品类型
if ((int)v10 <= 0) // 如果物品类型不合法,抛出异常
__assert__(
"./Script/LuaFnTbl_Ability.h",
0x7A9u,
"int LuaFnTbl::LuaFnItemBoxEnterScene(lua_State*)",
"iItemType>0");
// 创建物品并记录日志
Obj_ItemBox::CreateItem(GrowPointItemBox, (ITEM_LOG_PARAM *)&ItemLogParam, (int)v10, iQualityType);
SaveItemLog((ITEM_LOG_PARAM *)&ItemLogParam); // 保存日志
++iIndex;
}
// 将物品箱加入场景
Scene::ObjectEnterScene(pScene, GrowPointItemBox);
GrowPointItemBox->m_Pos.m_fX = pos; // 设置物品箱的 X 坐标
GrowPointItemBox->m_Pos.m_fZ = pos_4; // 设置物品箱的 Z 坐标
Obj::SetActiveFlag(GrowPointItemBox, 1); // 激活物品箱
lua_pushnumber((lua_State_0 *)L, (double)GrowPointItemBox->m_ObjID); // 返回物品箱的 ID
}
else
{
lua_pushnumber((lua_State_0 *)L, -1.0); // 如果创建物品箱失败,返回 -1
}
return 1; // 函数返回值,表示返回一个值(物品箱 ID 或 -1)
}
剩余 19% 内容需要支付 10.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|