查看“︁工程参考/配置文件/Public/MonsterAITable.ini”︁的源代码
来自天龙知识库
←
工程参考/配置文件/Public/MonsterAITable.ini
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{DISPLAYTITLE:<span style="font-size:24px;line-height:1.4;overflow-wrap:anywhere;">工程参考/配置文件/Public/MonsterAITable.ini</span>}} __NOTOC__ <div class="config-file-reference" style="max-width:1200px;margin:0 auto;line-height:1.8;color:#29343a;font-family:Arial,'Microsoft YaHei',sans-serif;letter-spacing:0;overflow-wrap:anywhere;"> [[首页|首页]] · [[工程参考/配置文件索引|配置文件索引]] · [[工程参考/配置文件修改约定|修改约定]] MonsterAITable.ini 定义怪物 AI 类型的参数。 [INFO] 的 AINUMBER 决定有多少种 AI;每种 AI 一个 [AI<n>] 节,节内有 DESC 说明与 11 个 AIPARAM。怪物的基础 AI 编号(m_BaseAI)指向这里的下标,AI 行为在运行时按 <code style="white-space:normal;overflow-wrap:anywhere;">AI_Monster::AIParam</code> 取用。样本 AINUMBER=31,即 AI0 到 AI30 共 31 种。 这份表只调 AI 的行为参数,不决定怪物长什么样、刷在哪里、掉什么;那些由怪物属性表与场景刷怪配置决定。 [[#文件位置与生效|位置与生效]] · [[#文件格式|文件格式]] · [[#字段详解|字段详解]] · [[#常用修改实例|修改实例]] == 文件位置与生效 == {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 项目 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 说明 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 运行文件 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">../Public/Config/MonsterAITable.ini</code>,由 FileDef.h 的 FILE_MONSTER_AI 定义,相对于 Server 工作目录。Public 只是资源组织位置,本文件由服务端读取,不需要放进客户端。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 读取程序 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | Server 游戏进程:TableInit::InitMonsterAITable 用 Ini ini(FILE_MONSTER_AI) 打开 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 生效方法 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 正常保存并停服后,重启读取此文件的 Server。多份运行目录分别核对。当前检索未发现单独重载本文件的可用入口;不需要把本文件复制到玩家客户端。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 样本格式 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">GB18030-compatible</code>,<code style="white-space:normal;overflow-wrap:anywhere;">CRLF</code>。保留原编码;源码读取器不会自动把中文转为 UTF-8。 |} 加载流程是:先读 <code style="white-space:normal;overflow-wrap:anywhere;">[INFO] AINUMBER</code> 作为 AI 种类数,再双重循环 i 从 0 到 AINUMBER-1、j 从 0 到 AIPARAM_NUMBER-1,用 <code style="white-space:normal;overflow-wrap:anywhere;">sprintf(szSection, "AI%d", i)</code> 与 <code style="white-space:normal;overflow-wrap:anywhere;">sprintf(szName, "AIPARAM%d", j)</code> 拼出节名与键名逐个读整数。因此节名与键名里的数字必须连续:AI 编号断号会让后面所有种类的参数错位,AIPARAM 少一个键会让对应参数读成 -99999999。 {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 参数与源码枚举 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 含义与修改要点 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM0</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_SCANTIME</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 扫描敌人的时间间隔(毫秒)。大于 0 表示主动攻击,值就是扫描间隔;小于等于 0 表示非主动攻击。 Obj_Monster.cpp 判断怪物是否主动攻击时读这一项。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM1</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_RANDMOVETIME</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 随机移动位置的时间间隔(毫秒)。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM2</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_CANNOTATTACK</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 无法攻击的对象。源码注释标注「已经废弃」:怪物是否无敌以 Public/MonsterAttrExTable.txt 为准。 不要再靠这一项配置无敌。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM3</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_RETURN</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 距离出生地超过此值时放弃追赶。大于 0 才生效。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM4</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_SCANENEMYDIST</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 扫描敌人的最大距离。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM5</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_SCANTEAMMATEDIST</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 扫描队友的最大距离。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM6</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_RESETTARGET_DIST</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 当前移动目标与敌人位置之间的距离大于此数值时,重新设定移动目标。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM7</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_PATROLTIME</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 巡逻的时间间隔。小于等于 0 不进行巡逻。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM8</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_STRIKEBACK</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否会还击。非 0 为会还击。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM9</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_EXTEND_BY_LUA</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否由 Lua 脚本扩展怪物 AI。大于 0 时走脚本扩展分支。 Obj_Monster_AILuaExtand.cpp 按这一项判断是否交给 Lua。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM10</code><br><code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM_CALL_NEARBY_MONSTER</code> | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 是否召唤附近怪物协助作战。非 0 为会召唤。 |} {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 检查项 ! scope="col" style="width:76%;text-align:left;background:#edf3f2;padding:8px;" | 结论 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | AI 种类上限 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | MAXAI_NUMBER = 256,AINUMBER 必须落在 0 到 255。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 参数个数 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 固定 11 个(AIPARAM_NUMBER),由 enum MONSTER_AI_PRAM 决定,不能多写也不能少写。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 缺失的键 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">Ini::ReadInt</code> 的返回版本在找不到时返回 ERROR_DATA,即 -99999999,不会被当成 0。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 怪物的 AI 编号 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 刷怪配置里的 m_BaseAI 必须小于 AINUMBER,否则加载期断言。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | DESC 键 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 样本每个节都有,但加载函数不读它,纯粹是给维护者看的说明。 |} == 文件格式 == 使用 [节名] 与 Key=Value,节名和键名区分大小写,保持节标题位于行首。用单独一行分号写注释,保留原编码及 CRLF 换行;重复节或键取先匹配项,不依赖后写覆盖。缺项、空值与 0 分别按下表处理。 == 字段详解 == 模板 [n] 表示从 0 开始的序号,写入时应展开为实际数字;不是字面键名。 === [INFO] === {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:34%;text-align:left;background:#edf3f2;padding:8px;" | 字段与类型 ! scope="col" style="width:42%;text-align:left;background:#edf3f2;padding:8px;" | 含义与修改要点 ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 缺项或特殊值 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AINUMBER</code><br>整数,0 到 255 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | AI 种类的数量,决定读取 [AI0] 到 [AI<N-1>] 的循环次数。超出 MAXAI_NUMBER(256)会触发断言;为 0 时一个 AI 节都不读,所有怪物取到的参数都是 0。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 必填。缺失时 Ini::ReadInt 返回 ERROR_DATA(-99999999),断言立即失败。 |} === [AI[n]] === {| class="wikitable" style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px;" ! scope="col" style="width:34%;text-align:left;background:#edf3f2;padding:8px;" | 字段与类型 ! scope="col" style="width:42%;text-align:left;background:#edf3f2;padding:8px;" | 含义与修改要点 ! scope="col" style="width:24%;text-align:left;background:#edf3f2;padding:8px;" | 缺项或特殊值 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">DESC</code><br>字符串,说明文字 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 该 AI 类型的人读说明。加载函数完全没有读取它,只作为维护备注存在。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 可选。写错或删除不影响运行,但会让后续维护失去参考。 |- | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | <code style="white-space:normal;overflow-wrap:anywhere;">AIPARAM[n]</code><br>整数,参数值 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 第 n 号 AI 的第 j 个参数(键名 AIPARAM0 到 AIPARAM10),含义见上表。怪物的 AI 类型就是这里的第一维下标,由怪物的基础 AI 编号决定,不是场景 ID 也不是怪物编号。 | style="padding:8px;vertical-align:top;overflow-wrap:anywhere;" | 缺失时读到 ERROR_DATA(-99999999)而不是 0,通常意味着该参数被当成“极大/极小”的极端值使用,效果需要实测。 |} == 常用修改实例 == 示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 === 把 AI0 的巡逻间隔从 10000 毫秒改为 20000 毫秒 === 修改前: <pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">[AI0] DESC=Sample AI for the teaching snippet. AIPARAM0=2000 AIPARAM7=10000</pre> 修改后: <pre style="white-space:pre-wrap;overflow-wrap:anywhere;font-size:13px;line-height:1.7;padding:12px;background:#f5f7f8;border:1px solid #dbe3e6;">[AI0] DESC=Sample AI for the teaching snippet. AIPARAM0=2000 AIPARAM7=20000</pre> AIPARAM7 是巡逻时间间隔(AIPARAM_PATROLTIME),小于等于 0 表示不巡逻。这里只把 AI0 的这一项从 10000 改成 20000,让巡逻间隔加倍;其余 10 个参数、DESC 与 [INFO] 全部保留。 示例是局部片段,英文 DESC 只是为了让片段没有编码歧义;实际操作保留原文件的中文说明。改完需要重启 Server。 == 验证与排查 == 重启 Server 后查看启动日志的 “Load MonsterAITable.ini ... OK!”。再找一只使用目标 AI 编号的怪物,分别观察:是否主动攻击(AIPARAM0)、是否随机移动(AIPARAM1)、追出多远会返回(AIPARAM3)、是否巡逻与巡逻频率(AIPARAM7)、受击是否还击(AIPARAM8)。参数生效后才会体现在行为上,改 AIPARAM2 看不到无敌效果。失败时恢复备份并重启。 === 节名与键名的数字必须连续 === 节名与键名都由 sprintf 拼出,读取是靠拼名字去找,不是按文件顺序。删掉 AI5 会让原本的 AI6 变成新的 AI5,所有引用该编号的怪物行为都会改变。AIPARAM3 缺失则 AIPARAM4 不会顶上来,而是那一项读到 -99999999。 === AIPARAM2 已经废弃 === 源码注释写明「无法攻击的对象(已经废弃,是否无敌是以 MonsterAttrExTable.txt 表中为主)」。配怪物无敌不要改这里。 === 取值单位是毫秒,不是秒 === AIPARAM0、AIPARAM1、AIPARAM7 都是毫秒。把 10000 当 10 秒填成 10 会让怪物几乎每帧扫描。 === 这是服务端表,不要放进客户端 === FILE_MONSTER_AI 指向 ../Public/Config,是服务端进程自己读的。修改不需要同步玩家客户端。 == 关联与依据 == [[工程参考/配置文件/Server/SceneInfo.ini|Server/SceneInfo.ini]] [[工程参考/配置文件索引|其他配置及整理状态]] · [[工程参考/服务端外网设置|服务端外网设置]] · [[Lua接口/服务端函数索引|Lua 接口索引]] * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/Ini.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/Ini.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/ServerBase/FileDef.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Main/GameTable.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Main/GameTable.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/GameDefine.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Common/GameDefine2.h</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/AI/AI_Monster.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Obj/Obj_Monster.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Obj/Obj_Monster_AILuaExtand.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">Server/Server/GameServer/Server/Obj/MonsterManager.cpp</code>:实际加载、解析、字段使用或示例关联依据 * <code style="white-space:normal;overflow-wrap:anywhere;">resources/Public/Config/MonsterAITable.ini</code>:实际加载、解析、字段使用或示例关联依据 本页核对源码读取、字段使用与样本格式,未启动游戏、服务端或数据库。解析验证不等于游戏实测;广播、权限、客户端交互等运行结果需要实测。 </div> [[Category:工程参考]]
返回
工程参考/配置文件/Public/MonsterAITable.ini
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
创建账号
登录
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
搜索
工具
链入页面
相关更改
页面信息