***付费内容***
IDA伪代码(地址:82995EC):
int __cdecl LuaFnTbl::LuaFnGetHumanPKValue(lua_State *L)
{
int i; // 用于循环,检查参数合法性
long double v2; // 用于存储从 Lua 栈中获取的第二个参数
SceneManager_1 *const v3; // 用于存储场景管理器的指针
Scene_3 *Scene; // 用于存储场景指针
Obj_Human *v5; // 用于存储目标人物指针
int v7; // 用于存储人物的PK值
unsigned int selfId; // 用于存储从 Lua 栈获取的 ID 参数
char v9; // 用于存储临时数据
CHAR msg[1048]; // 用于存储错误信息的缓冲区
// 参数合法性检查
for ( i = 1; i <= 2; ++i )
{
if ( L )
{
// 如果 Lua 栈中的第i个参数是数字,继续检查下一个
if ( lua_isnumber((lua_State_0 *)L, i) == 1 )
continue;
// 否则,记录错误信息
sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetHumanPKValue", i);
}
else
{
// 如果 Lua 状态为 NULL,记录错误信息
sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetHumanPKValue");
}
// 记录日志
CacheLog(3, msg);
}
// 从 Lua 栈中获取第1个和第2个参数,并将第二个参数转换为 `long double` 类型
lua_tonumber((lua_State_0 *)L, 1); // 获取第1个参数,但未存储其返回值
v2 = lua_tonumber((lua_State_0 *)L, 2); // 获取第2个参数并存储为 long double 类型
// 设置 v3 为场景管理器的指针
LOBYTE(v3) = v9;
BYTE1(v3) = 12;
// 将 selfId 设置为第二个参数的整数部分
selfId = (int)v2;
// 获取当前场景
Scene = SceneManager::GetScene(v3, SceneID);
// 如果没有找到场景,抛出断言错误
if ( !Scene )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x1AD0u,
"int LuaFnTbl::LuaFnGetHumanPKValue(lua_State*)",
"pScene",
"Scene ID ErrorLuaFnGetHumanPKValue");
// 如果当前线程ID与场景的线程ID不匹配,抛出断言错误
if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x1AD0u,
"int LuaFnTbl::LuaFnGetHumanPKValue(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnGetHumanPKValue");
// 如果 selfId 超过了范围或者在场景中找不到对应的人物对象,抛出断言错误
if ( selfId > 0x752F || (v5 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0 )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x1AD0u,
"int LuaFnTbl::LuaFnGetHumanPKValue(lua_State*)",
"pObj",
"selfId ErrorLuaFnGetHumanPKValue");
// 如果人物存在且有效
if ( (*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 2))(v5) == 1 )
{
// 如果人物可以进行逻辑操作
if ( !Obj_Human::IsCanLogic(v5) )
__assertex__(
"./Script/LuaFnTbl_Attr.h",
0x1AD0u,
"int LuaFnTbl::LuaFnGetHumanPKValue(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnGetHumanPKValue");
// 获取人物的PK值并返回
v7 = (*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 246))(v5);
lua_pushnumber((lua_State_0 *)L, (double)v7); // 将PK值推送到 Lua 栈中
return 1; // 返回 1,表示有一个返回值
}
else
{
// 如果人物不符合条件,返回 0
lua_pushnumber((lua_State_0 *)L, 0.0); // 返回0表示未找到有效PK值
return 1; // 返回 1,表示有一个返回值
}
}
剩余 9% 内容需要支付 1.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
|