找回密码
 register

QQ登录

只需一步,快速开始

查看: 1606|回复: 0

[系统函数] GetMonsterCount 取得此场景中的怪物数量

[复制链接]

[系统函数] GetMonsterCount 取得此场景中的怪物数量

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

主题

0

回帖

1万

积分

仙帝

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

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

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

×

***付费内容***

IDA伪代码(地址:82DF4A4)

int __cdecl LuaFnTbl::LuaFnGetMonsterCount(lua_State_0 *L)
{
  long double v1; // fst7:用于存储从 Lua 中获取的数字参数
  Scene *Scene; // esi:场景对象的指针,用来保存当前场景
  MonsterManager *m_pMonsterManager; // ebx:怪物管理器对象的指针,负责管理场景中的怪物
  unsigned int m_uCount; // edx:怪物数量
  unsigned int v5; // ecx:用于循环计数
  Obj_Monster *v6; // eax:当前怪物对象的指针
  CHAR msg[1048]; // [esp+10h] [ebp-418h] BYREF:错误信息缓冲区

  // 如果 Lua 状态对象不为空
  if ( L )
  {
    // 如果第一个参数是数字
    if ( lua_isnumber(L, 1) == 1 )
      goto LABEL_5;  // 跳转到 LABEL_5,开始处理参数
    // 如果第一个参数不是数字,生成错误信息
    sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnGetMonsterCount", 1);
  }
  else
  {
    // 如果 Lua 状态为空,生成错误信息
    sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnGetMonsterCount");
  }
  // 记录错误日志
  CacheLog(3, msg);

LABEL_5:
  // 获取 Lua 参数并将其转换为数字,存储到 v1 中
  v1 = lua_tonumber(L, 1);

  // 根据传入的场景 ID 获取场景对象
  Scene = SceneManager::GetScene((SceneManager *const)(__int16)v1, SceneID);

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

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

  // 获取场景中的怪物管理器
  m_pMonsterManager = Scene->m_pMonsterManager;

  // 获取怪物数量
  m_uCount = m_pMonsterManager->m_uCount;

  // 如果怪物数量大于 512,则限制为 512
  if ( m_uCount > 0x200 )
    m_uCount = 512;

  v5 = 0;
  // 设置场景中的对象 ID 列表的计数为怪物数量
  Scene->m_ObjIDList.m_nCount = m_uCount;

  // 遍历怪物,存储每个怪物的对象 ID
  while ( v5 < m_uCount )
  {
    v6 = 0;
    // 如果怪物管理器中有足够的怪物对象,则获取第 v5 个怪物
    if ( m_pMonsterManager->m_uCount > v5 )
      v6 = m_pMonsterManager->m_papObjs[v5];

    // 将怪物的对象 ID 存储到场景的对象 ID 列表中
    Scene->m_ObjIDList.m_aIDs[v5++] = v6->m_ObjID;
  }

  // 将怪物数量作为返回值推送到 Lua 栈中
  lua_pushnumber(L, (double)m_uCount);

  // 返回 1,表示一个返回值
  return 1;
}

代码概述:

  • 参数检查:首先,检查 Lua 中传入的参数是否为数字,如果不是则输出错误信息。
  • 场景验证:获取场景对象并验证其合法性,确保线程一致性。
  • 获取怪物管理器:从场景中获取怪物管理器,获取当前场景中的怪物数量。
  • 限制怪物数量:如果怪物数量大于 512,则将其限制为 512
  • 存储怪物对象 ID:遍历怪物管理器,将每个怪物的对象 ID 存储到场景的对象 ID 列表中。
  • 返回怪物数量:将怪物数量作为返回值推送到 Lua 栈中,并返回 1 表示成功。
付费看帖
剩余 17% 内容需要支付 10.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

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

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

Powered by XueWu Licensed

Copyright © Tencent Cloud.

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