找回密码
 register

QQ登录

只需一步,快速开始

查看: 1732|回复: 0

[系统函数] LuaFnGetFollowedMembersCount 得到跟随状态的队友数量

[复制链接]

[系统函数] LuaFnGetFollowedMembersCount 得到跟随状态的队友数量

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

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2020-8-16 23:24 | 显示全部楼层 |阅读模式

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

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

×

***付费内容***

IDA伪代码(地址:82E3ECC)

int __cdecl LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State_0 *L)
{
  int i; // 用于循环的索引
  long double v2; // 存储从 Lua 栈中获取的角色 ID
  SceneManager *const v3; // 用于存储场景管理器
  Scene *Scene; // 存储当前场景
  Obj_Human *v5; // 存储角色对象
  int v7; // 存储角色跟随的成员数
  unsigned int selfId; // 存储角色 ID
  char v9; // 存储一些辅助信息(未使用的局部变量)
  CHAR msg[1048]; // 存储错误信息的缓冲区

  // 检查传入的参数是否合法
  for ( i = 1; i <= 2; ++i )
  {
    if ( L ) // 如果 Lua 状态不为空
    {
      if ( lua_isnumber(L, i) == 1 ) // 如果参数是数字类型
        continue; // 如果是数字,继续处理下一个参数
      // 如果参数不是数字,输出错误信息
      sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetFollowedMembersCount", i);
    }
    else // 如果 Lua 状态为空,输出错误信息
    {
      sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetFollowedMembersCount");
    }
    CacheLog(3, msg); // 记录错误信息
  }

  // 获取 Lua 栈上的参数并转换为数字
  lua_tonumber(L, 1); // 获取第一个参数(角色ID),但未保存
  v2 = lua_tonumber(L, 2); // 获取第二个参数(角色ID),并存储在 v2

  LOBYTE(v3) = v9; // 这部分代码可能用于初始化某些值,暂时不清楚作用
  BYTE1(v3) = 12;
  selfId = (int)v2; // 将角色 ID 存储为 selfId

  // 获取当前场景对象
  Scene = SceneManager::GetScene(v3, SceneID);
  if ( !Scene ) // 如果没有找到对应的场景,触发断言
    __assertex__(
      "./Script/LuaFnTbl_Team.h",
      0x1D0u,
      "int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
      "pScene",
      "Scene ID ErrorLuaFnGetFollowedMembersCount");

  // 如果当前线程ID与场景的线程ID不匹配,触发断言
  if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
    __assertex__(
      "./Script/LuaFnTbl_Team.h",
      0x1D0u,
      "int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
      "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnGetFollowedMembersCount");

  // 检查角色ID是否有效
  if ( selfId > 0x752F || (v5 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0 )
    __assertex__(
      "./Script/LuaFnTbl_Team.h",
      0x1D0u,
      "int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
      "pObj",
      "selfId ErrorLuaFnGetFollowedMembersCount");

  // 如果角色可以跟随
  if ( (*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 2))(v5) == 1 )
  {
    // 如果角色处于有效逻辑状态
    if ( !Obj_Human::IsCanLogic(v5) )
      __assertex__(
        "./Script/LuaFnTbl_Team.h",
        0x1D0u,
        "int LuaFnTbl::LuaFnGetFollowedMembersCount(lua_State*)",
        "pHuman->IsCanLogic()",
        "IsCanLogic() test return falseLuaFnGetFollowedMembersCount");

    // 获取角色跟随的成员数
    v7 = (*((int (__cdecl **)(Obj_Human *))v5->_vptr_Obj + 341))(v5);
    lua_pushnumber(L, (double)v7); // 将跟随人数推送到 Lua 栈
  }
  else // 如果角色不能跟随
  {
    lua_pushnumber(L, -1.0); // 返回 -1 表示没有跟随成员
  }

  return 1; // 返回 1,表示 Lua 栈上有一个返回值(跟随人数或错误标记)
}
付费看帖
剩余 30% 内容需要支付 2.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

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

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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