找回密码
 register

QQ登录

只需一步,快速开始

查看: 1701|回复: 0

[系统函数] IsTeamFollow 玩家是否处于组队跟随状态

[复制链接]

[系统函数] IsTeamFollow 玩家是否处于组队跟随状态

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

主题

0

回帖

1万

积分

仙帝

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

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

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

×

***付费内容***

IDA伪代码(地址:82E3BB0)

int __cdecl LuaFnTbl::LuaFnIsTeamFollow(lua_State_0 *L)
{
  int i; // ebx:循环变量,用来检查 Lua 参数的合法性
  Scene *Scene; // ebx:场景对象指针
  Obj_Human *v3; // ebx:人物对象指针
  int v5; // eax:返回的跟随状态值
  SceneManager *const v6; // [esp-10h] [ebp-448h]:场景管理器指针
  unsigned int selfId; // [esp+10h] [ebp-428h]:Lua 参数中的第二个值(角色 ID)
  CHAR msg[1048]; // [esp+20h] [ebp-418h] BYREF:错误信息缓冲区

  // 循环检查 Lua 中传入的前两个参数是否为数字
  for ( i = 1; i <= 2; ++i )
  {
    // 如果 Lua 状态不为空
    if ( L )
    {
      // 如果当前参数是数字,则继续检查下一个参数
      if ( lua_isnumber(L, i) == 1 )
        continue;
      // 如果参数不是数字,生成错误信息
      sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnIsTeamFollow", i);
    }
    else
    {
      // 如果 Lua 状态为空,生成错误信息
      sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnIsTeamFollow");
    }
    // 记录错误日志
    CacheLog(3, msg);
  }

  // 获取第一个参数的数字值,但没有使用
  lua_tonumber(L, 1);

  // 获取第二个参数(角色 ID),并将其存储在 selfId 变量中
  selfId = (int)lua_tonumber(L, 2);

  // 根据场景 ID 获取场景对象
  Scene = SceneManager::GetScene(v6, SceneID);

  // 如果场景为空,则触发断言错误,说明场景 ID 无效
  if ( !Scene )
    __assertex__(
      "./Script/LuaFnTbl_Team.h",   // 错误文件
      0x1A5u,                       // 错误行号
      "int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)", // 错误函数
      "pScene",                      // 错误变量
      "Scene ID ErrorLuaFnIsTeamFollow"); // 错误信息

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

  // 如果角色 ID 无效,触发断言错误
  if ( selfId > 0x752F || (v3 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0 )
    __assertex__(
      "./Script/LuaFnTbl_Team.h",
      0x1A5u,
      "int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)",
      "pObj",
      "selfId ErrorLuaFnIsTeamFollow");

  // 如果角色对象存在,并且角色对象的某个方法返回 1(表示角色处于某种状态)
  if ( (*((int (__cdecl **)(Obj_Human *))v3->_vptr_Obj + 2))(v3) == 1 )
  {
    // 如果角色可以逻辑处理
    if ( !Obj_Human::IsCanLogic(v3) )
      __assertex__(
        "./Script/LuaFnTbl_Team.h",
        0x1A5u,
        "int LuaFnTbl::LuaFnIsTeamFollow(lua_State*)",
        "pHuman->IsCanLogic()",
        "IsCanLogic() test return falseLuaFnIsTeamFollow");

    // 调用角色对象的某个方法获取跟随状态,并将其作为返回值
    v5 = (*((int (__cdecl **)(Obj_Human *))v3->_vptr_Obj + 338))(v3);
    lua_pushnumber(L, (double)v5);  // 将跟随状态值推送到 Lua 栈中
  }
  else
  {
    // 如果角色不符合条件,返回 -1
    lua_pushnumber(L, -1.0);  // 返回 -1,表示不在团队跟随状态
  }

  // 返回 1,表示一个返回值
  return 1;
}
付费看帖
剩余 14% 内容需要支付 1.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

GMT+8, 2025-1-18 14:59 , Processed in 0.110840 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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