工程参考/配置文件/Public/MonsterAttrExTable.txt
MonsterAttrExTable.txt 是怪物模板的扩展属性表:第 1 列是怪物编号,第 2 列是名称,第 3 到 15 列是性别、等级、经验、AI、阵营、掉落与 BOSS 等通用参数,第 16 到 42 列是战斗属性(物理/魔法攻防、生命内力、命中闪避会心、速度、四系攻防与抵抗削减),第 43 列之后是免疫、表现与满级上限。样本 9535 条数据记录、70 列。服务端只读取其中一部分列(见下)。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ../Public/Config/MonsterAttrExTable.txt,相对于服务端工作目录;客户端从资源目录读取同名文件。
|
| 读取程序 | Server 游戏进程:TableInit::InitMonsterAttrExTable 通过 FILE_MONSTER_ATTREX(../Public/Config/MonsterAttrExTable.txt)加载;客户端 GMDataBase.cpp 把 DBC_CREATURE_ATT 注册到同名文件 |
| 生效方法 | 正常保存并停服后,重启读取此文件的 Server;客户端需要随资源更新并重启客户端。当前检索未发现单独重载本文件的可用入口。 |
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
服务端 InitMonsterAttrExTable 用一份 0 基列枚举取值,枚举值加 1 就是列号。怪物编号(第 1 列)同时被当作 g_MonsterAttrExTbl 的下标,必须落在 0 到 MAXTYPE_NUMBER-1(65534),越界会触发 AssertEx 并跳过该行。加载前还会断言 MonsterCombatClass(69) 小于实际列数,也就是本表至少要 70 列。
第 16 到 42 列的战斗属性被写进 m_Table[CATTR_LEVEL2_*],与人物属性走同一套二级属性枚举;第 3 到 15 列与第 52 到 64 列、第 68 到 70 列写进 m_TableExt。
服务端没有读取的列是第 45 到 51 列(外型、信息板、转向、名字板高度、选中环、阴影、头像)、第 61 列(是否在小地图上显示)与第 65 到 67 列(融合/闪避/搁挡动作、外观类型、强度类型)——这些属于表现层,改它们只影响客户端。
文件格式
首行是类型行:INT STRING INT INT INT INT INT INT INT INT INT INT FLOAT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT FLOAT FLOAT FLOAT STRING INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:怪物编号 |
怪物模板编号(主键)。MonsterType=0 读第 1 列,服务端同时把它当作 g_MonsterAttrExTbl 的下标,必须落在 0 到 MAXTYPE_NUMBER-1(65534)。 | 越界会触发 AssertEx 并 continue 跳过该行。 |
第 2 列STRING:名称$1$ |
怪物名称。MonsterName=1,服务端 strncpy 到 m_Name。 | 空字符串。 |
第 3 列INT:怪物性别 |
MonsterSex=2,存为 m_nSex。 | 空为 0。 |
第 4 列INT:等级 |
MonsterLevel=3,存为 m_Level。 | 空为 0。 |
第 5 列INT:基础经验获得 |
MonsterExp=4,存为 m_BaseExp,击杀后按此值结算基础经验。 | 空为 0。 |
第 6 列INT:友好值 |
MonsterFriendValue=5,存为 m_FriendValue。 | 空为 0。 |
第 7 列INT:休闲间隔时间 |
MonsterIdleInterval=6,存为 m_nIdleInterval,非战斗状态下的动作间隔。 | 空为 0。 |
第 8 列INT:基础AI |
MonsterBaseAI=7,存为 m_BaseAI,指向怪物基础 AI 策略。 | 空为 0。 |
第 9 列INT:扩展AI |
MonsterExtAI=8,存为 m_ExtAI,在基础 AI 之上叠加的行为。 | 空为 0。 |
第 10 列INT:阵营 |
MonsterCamp=9,存为 m_Camp,决定敌我关系。 | 空为 0。 |
第 11 列INT:掉落分配半径(米) |
MonsterDropSearchRange=10,存为 m_DropSearchRange(读入时用 (FLOAT)iValue 强转),判定掉落归属时的搜索半径。 | 空为 0。 |
第 12 列INT:掉落最大有效组 |
MonsterDropTeamCount=11,存为 m_SearchTeamCount,一次掉落最多分配给多少个队伍。 | 空为 0。 |
第 13 列FLOAT:最小伤血百分比 |
MonsterMinDamagePercent=12,存为 m_fMinDamagePercent,读取时用 fValue 并断言落在 0.0 到 1.0。 | 超出 0..1 会触发断言;空为 0。 |
第 14 列INT:是否可以交互 |
MonsterCanHandle=13,存为 m_CanHandle,非零表示玩家可以与该怪物交互。 | 空为 0(不可交互)。 |
第 15 列INT:BOSS标记 |
MonsterBossFlag=14,存为 m_BossFlag,非零标记为 BOSS。 | 空为 0。 |
第 16 列INT:物理攻击 |
Monster_CATTR_LEVEL2_ATTACKRATE_P=15,写入 m_Table[CATTR_LEVEL2_ATTACKRATE_P]。 | 空为 0。 |
第 17 列INT:物理防御 |
Monster_CATTR_LEVEL2_DEFENCE_P=16,写入 CATTR_LEVEL2_DEFENCE_P。 | 空为 0。 |
第 18 列INT:魔法攻击 |
Monster_CATTR_LEVEL2_ATTACKRATE_M=17,写入 CATTR_LEVEL2_ATTACKRATE_M。 | 空为 0。 |
第 19 列INT:魔法防御 |
Monster_CATTR_LEVEL2_DEFENCE_M=18,写入 CATTR_LEVEL2_DEFENCE_M。 | 空为 0。 |
第 20 列INT:HP上限 |
Monster_CATTR_LEVEL2_MAXHP=19,写入 CATTR_LEVEL2_MAXHP。 | 空为 0。 |
第 21 列INT:MP上限 |
Monster_CATTR_LEVEL2_MAXMP=20,写入 CATTR_LEVEL2_MAXMP。 | 空为 0。 |
第 22 列INT:HP回复 |
Monster_CATTR_LEVEL2_RESTOREHP=21,写入 CATTR_LEVEL2_RESTOREHP。 | 空为 0。 |
第 23 列INT:MP回复 |
Monster_CATTR_LEVEL2_RESTOREMP=22,写入 CATTR_LEVEL2_RESTOREMP。 | 空为 0。 |
第 24 列INT:命中率 |
Monster_CATTR_LEVEL2_HIT=23,写入 CATTR_LEVEL2_HIT。 | 空为 0。 |
第 25 列INT:闪避 |
Monster_CATTR_LEVEL2_MISS=24,写入 CATTR_LEVEL2_MISS。 | 空为 0。 |
第 26 列INT:会心率 |
Monster_CATTR_LEVEL2_CRITRATE=25,写入 CATTR_LEVEL2_CRITRATE。 | 空为 0。 |
第 27 列INT:会心防御 |
Monster_CATTR_LEVEL2_CRITDEFENCE=26,写入 CATTR_LEVEL2_CRITDEFENCE。 | 空为 0。 |
第 28 列INT:移动速度 |
Monster_CATTR_LEVEL2_SPEED=27,写入 CATTR_LEVEL2_SPEED。 | 空为 0。 |
第 29 列INT:步行速度 |
MonsterWalkSpeed=28,存为 m_WalkSpeed,与第 28 列的移动速度分开配置。 | 空为 0。 |
第 30 列INT:攻击速度 |
Monster_CATTR_LEVEL2_ATTACKSPEED=29,写入 CATTR_LEVEL2_ATTACKSPEED。 | 空为 0。 |
第 31 列INT:冰攻击 |
Monster_CATTR_LEVEL2_ATTACKCOLD=30,写入 CATTR_LEVEL2_ATTACKCOLD。 | 空为 0。 |
第 32 列INT:冰防御 |
Monster_CATTR_LEVEL2_DEFENCECOLD=31,写入 CATTR_LEVEL2_DEFENCECOLD。 | 空为 0。 |
第 33 列INT:降低目标冰抵抗 |
Monster_CATTR_LEVEL2_COLD_RESISTOTHER=32,写入 CATTR_LEVEL2_COLD_RESISTOTHER。 | 空为 0。 |
第 34 列INT:火攻击 |
Monster_CATTR_LEVEL2_ATTACKFIRE=33,写入 CATTR_LEVEL2_ATTACKFIRE。 | 空为 0。 |
第 35 列INT:火防御 |
Monster_CATTR_LEVEL2_DEFENCEFIRE=34,写入 CATTR_LEVEL2_DEFENCEFIRE。 | 空为 0。 |
第 36 列INT:降低目标火抵抗 |
Monster_CATTR_LEVEL2_FIRE_RESISTOTHER=35,写入 CATTR_LEVEL2_FIRE_RESISTOTHER。 | 空为 0。 |
第 37 列INT:电攻击 |
Monster_CATTR_LEVEL2_ATTACKLIGHT=36,写入 CATTR_LEVEL2_ATTACKLIGHT。 | 空为 0。 |
第 38 列INT:电防御 |
Monster_CATTR_LEVEL2_DEFENCELIGHT=37,写入 CATTR_LEVEL2_DEFENCELIGHT。 | 空为 0。 |
第 39 列INT:降低目标玄抵抗 |
Monster_CATTR_LEVEL2_LIGHT_RESISTOTHER=38,写入 CATTR_LEVEL2_LIGHT_RESISTOTHER。注意列名写作「玄」,但枚举与第 37、38 列同属 LIGHT(电)系,服务端按列号读取,因此本列实际作为电系抵抗削减生效。 | 空为 0。 |
第 40 列INT:毒攻击 |
Monster_CATTR_LEVEL2_ATTACKPOISON=39,写入 CATTR_LEVEL2_ATTACKPOISON。 | 空为 0。 |
第 41 列INT:毒防御 |
Monster_CATTR_LEVEL2_DEFENCEPOISON=40,写入 CATTR_LEVEL2_DEFENCEPOISON。 | 空为 0。 |
第 42 列INT:降低目标毒抵抗 |
Monster_CATTR_LEVEL2_POISON_RESISTOTHER=41,写入 CATTR_LEVEL2_POISON_RESISTOTHER。 | 空为 0。 |
第 43 列INT:瞬时效果免疫ID |
MonsterBossSnapImmID=42,存为 m_SnapSkillImmID,对特定瞬时类效果的免疫配置编号。 | 空为 0。 |
第 44 列INT:持续效果免疫ID |
MonsterBossDurationImmID=43,存为 m_DurationSkillImmID,对特定持续类效果的免疫配置编号。 | 空为 0。 |
第 45 列INT:外型ID |
表现层用的怪物外型编号。服务端 InitMonsterAttrExTable 的列枚举里没有这一列(枚举从 43 直接跳到 51)。 | 服务端不读;改它不影响战斗数值。 |
第 46 列INT:是否显示头顶信息板 |
是否显示头顶信息板。服务端枚举未包含。 | 服务端不读。 |
第 47 列INT:转向模式 |
转向表现模式。服务端枚举未包含。 | 服务端不读。 |
第 48 列FLOAT:名字板高度 |
头顶名字板的高度。服务端枚举未包含。 | 服务端不读。 |
第 49 列FLOAT:选中环大小 |
被选中时脚下光环的大小。服务端枚举未包含。 | 服务端不读。 |
第 50 列FLOAT:阴影大小 |
模型投影阴影的大小。服务端枚举未包含。 | 服务端不读。 |
第 51 列STRING:人物头像 |
界面上显示的头像资源。服务端枚举未包含。 | 服务端不读。 |
第 52 列INT:攻击动作时间 |
MonsterAttackAnimTime=51,存为 m_AttackAnimTime,攻击动作的播放时长。 | 空为 0。 |
第 53 列INT:攻击冷却时间 |
MonsterAttackCooldownTime=52,存为 m_AttackCooldownTime。 | 空为 0。 |
第 54 列INT:MaxLv |
MonsterMaxLevel=53,存为 m_MaxLevel,怪物可达到的最高等级。 | 空为 0。 |
第 55 列INT:MaxExp |
MonsterMaxLevelBaseExp=54,存为 m_MaxLevel_BaseExp,满级时的经验基数。 | 空为 0。 |
第 56 列INT:MaxAtt |
MonsterMaxLevelAttackrateP=55,存为 m_MaxLevel_Attackrate_P,满级时的物理攻击。 | 空为 0。 |
第 57 列INT:MaxDef |
MonsterMaxLevelDefenceP=56,存为 m_MaxLevel_Defence_P,满级时的物理防御。 | 空为 0。 |
第 58 列INT:MaxMag |
MonsterMaxLevelAttackrateM=57,存为 m_MaxLevel_Attackrate_M,满级时的魔法攻击。 | 空为 0。 |
第 59 列INT:MaxRes |
MonsterMaxLevelDefenceM=58,存为 m_MaxLevel_Defence_M,满级时的魔法防御。 | 空为 0。 |
第 60 列INT:MaxHP |
MonsterMaxLevelMaxHP=59,存为 m_MaxLevel_MaxHP,满级时的生命上限。 | 空为 0。 |
第 61 列INT:是否在小地图上显示 |
是否在小地图上显示该怪物。服务端 InitMonsterAttrExTable 的列枚举里没有这一列(60 被跳过)。 | 服务端不读。 |
第 62 列INT:势力ID |
MonsterReputationID=61,存为 m_nReputationID,关联声望/势力配置。 | 空为 0。 |
第 63 列INT:攻击特性ID |
MonsterAttackTraitID=62,存为 m_nAttackTraitID,指向攻击特性表(见关联页面)。 | 空为 0。 |
第 64 列INT:是否攻击NPC |
MonsterFightWithNPC=63,存为 m_bFightWithNPC,判断方式是 0 < 该列值,即只有正数才算「会攻击 NPC」。 | 空或 0 为否。 |
第 65 列INT:是否播放融合,闪避,搁挡动作 |
是否播放融合、闪避、搁挡动作。服务端枚举未包含。 | 服务端不读。 |
第 66 列INT:外观类型 |
外观分类。服务端枚举未包含。 | 服务端不读。 |
第 67 列INT:强度类型 |
强度分类。服务端枚举未包含。 | 服务端不读。 |
第 68 列INT:交互方式 |
MonsterOperateType=67,存为 m_nOperateType,玩家可以对该怪物执行的操作类型。 | 空为 0。 |
第 69 列INT:激活时间 |
MonsterActivateTime=68,存为 m_nActivateTime。 | 空为 0。 |
第 70 列INT:战斗方式 |
MonsterCombatClass=69,存为 m_nCombatClass。加载前会断言 MonsterCombatClass < 实际列数,即本表至少要 70 列。 | 空为 0。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。
把 0 号怪物(段誉)的基础经验获得从 2023 改成 3000
修改前:
INT STRING INT INT INT INT INT INT INT INT INT INT FLOAT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT FLOAT FLOAT FLOAT STRING INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT 怪物编号 名称$1$ 怪物性别 等级 基础经验获得 友好值 休闲间隔时间 基础AI 扩展AI 阵营 掉落分配半径(米) 掉落最大有效组 最小伤血百分比 是否可以交互 BOSS标记 物理攻击 物理防御 魔法攻击 魔法防御 HP上限 MP上限 HP回复 MP回复 命中率 闪避 会心率 会心防御 移动速度 步行速度 攻击速度 冰攻击 冰防御 降低目标冰抵抗 火攻击 火防御 降低目标火抵抗 电攻击 电防御 降低目标玄抵抗 毒攻击 毒防御 降低目标毒抵抗 瞬时效果免疫ID 持续效果免疫ID 外型ID 是否显示头顶信息板 转向模式 名字板高度 选中环大小 阴影大小 人物头像 攻击动作时间 攻击冷却时间 MaxLv MaxExp MaxAtt MaxDef MaxMag MaxRes MaxHP 是否在小地图上显示 势力ID 攻击特性ID 是否攻击NPC 是否播放融合,闪避,搁挡动作 外观类型 强度类型 交互方式 激活时间 战斗方式 0 段誉 1 120 2023 0 10 3 -1 8 20 1 0.1 1 0 4174 1568 4174 1568 32384 3795 0 0 2431 231 10 10 1800 0 0 0 60 0 0 60 0 0 60 0 0 60 0 -1 -1 12 1 1 -1 100 100 set:CommonNPCHeader12 image:CommonNPCHeader12_3 1200 2400 -1 -1 -1 -1 -1 -1 -1 1 15 10 0 0 2 1 0 0 0
修改后:
INT STRING INT INT INT INT INT INT INT INT INT INT FLOAT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT FLOAT FLOAT FLOAT STRING INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT 怪物编号 名称$1$ 怪物性别 等级 基础经验获得 友好值 休闲间隔时间 基础AI 扩展AI 阵营 掉落分配半径(米) 掉落最大有效组 最小伤血百分比 是否可以交互 BOSS标记 物理攻击 物理防御 魔法攻击 魔法防御 HP上限 MP上限 HP回复 MP回复 命中率 闪避 会心率 会心防御 移动速度 步行速度 攻击速度 冰攻击 冰防御 降低目标冰抵抗 火攻击 火防御 降低目标火抵抗 电攻击 电防御 降低目标玄抵抗 毒攻击 毒防御 降低目标毒抵抗 瞬时效果免疫ID 持续效果免疫ID 外型ID 是否显示头顶信息板 转向模式 名字板高度 选中环大小 阴影大小 人物头像 攻击动作时间 攻击冷却时间 MaxLv MaxExp MaxAtt MaxDef MaxMag MaxRes MaxHP 是否在小地图上显示 势力ID 攻击特性ID 是否攻击NPC 是否播放融合,闪避,搁挡动作 外观类型 强度类型 交互方式 激活时间 战斗方式 0 段誉 1 120 3000 0 10 3 -1 8 20 1 0.1 1 0 4174 1568 4174 1568 32384 3795 0 0 2431 231 10 10 1800 0 0 0 60 0 0 60 0 0 60 0 0 60 0 -1 -1 12 1 1 -1 100 100 set:CommonNPCHeader12 image:CommonNPCHeader12_3 1200 2400 -1 -1 -1 -1 -1 -1 -1 1 15 10 0 0 2 1 0 0 0
按第一列定位 0 号怪物。样本第 5 列基础经验获得为 2023,改为 3000。只改第 5 列,保留 70 列。本片段含类型行、列名行与该行,不能覆盖整表。
基础经验影响击杀后的经验结算,改完需要重启服务端才会生效。
验证与排查
服务端启动日志里 InitMonsterAttrExTable 会打印加载结果;改动后重启,击杀对应怪物核对经验或数值面板。注意第 1 列必须落在 0 到 65534 之间且不与已有怪物冲突,第 13 列必须落在 0.0 到 1.0,第 70 列存在性由加载前的列数断言保证。表现类列(45-51、61、65-67)需要更新客户端资源后重启客户端才能看到差异。失败时恢复备份并重启。
第 1 列是数组下标
怪物编号被直接用作 g_MonsterAttrExTbl 的下标,上限 MAXTYPE_NUMBER=65535(可用 0 到 65534)。越界行会被 AssertEx 跳过,表现为「改了没反应」而不是启动失败。
服务端只读部分列
列枚举从 43 直接跳到 51,又跳过 60、64、65、66,因此第 45-51、61、65-67 列都是表现层数据。改战斗数值前先确认列号落在枚举里。
第 39 列的列名与枚举不一致
第 37、38、39 列对应枚举的 LIGHT(电)系攻击、防御、抵抗削减,但列名行第 39 列写作「降低目标玄抵抗」。服务端按列号读取,因此该列实际作为电系抵抗削减生效,不要照列名理解成玄系。
第 64 列是正数判断
是否攻击 NPC 的写法是 0 < 该列值,填负数与填 0 效果相同(都是「否」)。
关联与依据
Public/MonsterRespawnPos.txt · Public/AttackTraits.txt
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/GameDefine.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Main/GameTable.cpp:实际加载、解析、字段使用或示例关联依据Client/Client/Common/TDDBC_Struct.h:实际加载、解析、字段使用或示例关联依据Client/Client/Game/DBC/GMDataBase.cpp:实际加载、解析、字段使用或示例关联依据resources/Public/Config/MonsterAttrExTable.txt:实际加载、解析、字段使用或示例关联依据
本页核对 FileDef.h 的 FILE_MONSTER_ATTREX、InitMonsterAttrExTable 的完整 0 基列枚举与赋值目标(m_Table 的 CATTR_LEVEL2_* 与 m_TableExt 各字段)、GameDefine.h 的 MAXTYPE_NUMBER=65535,以及客户端 DBC_CREATURE_ATT 注册项;未启动服务端与游戏,战斗数值的实际效果需要实测。