找回密码
 register

QQ登录

只需一步,快速开始

查看: 1295|回复: 0

[系统函数] LuaFnGetHumanPKValue 获取角色PK值(杀气)

[复制链接]

[系统函数] LuaFnGetHumanPKValue 获取角色PK值(杀气)

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2021-2-12 20:29 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

***付费内容***
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 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-18 15:42 , Processed in 0.147178 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表