工程参考/配置文件/Public/DropNotify.txt
DropNotify.txt 给击杀掉落的拾取广播提供文案。掉落包在 DropBoxContent 第 3 列写下通知编号;玩家捡起物品后,Server 按编号在本表里找稿,同一编号有多行时随机取一条。它不是开箱/转蛋公告,也不替代物品表上的广播开关。
文件位置与生效
| 项目 | 说明 |
|---|---|
| 运行文件 | ../Public/Config/DropNotify.txt,相对于 Server 工作目录。源码宏 FILE_ITEM_DROP_NOTIFY。
|
| 读取程序 | Server 在 ItemTable::Init 加载;拾取掉落盒时按包上的通知编号查询。GM 命令 reloadtab=DropNotify 可重读 |
| 生效方法 | 推荐停服后备份并修改实际 Public 副本,再重启 Server。已有最高 GM 权限的管理入口可执行 reloadtab=DropNotify,等号右侧名称区分大小写,不带 .txt;它不是 Lua 调用。当前重载重新分配通知表,源码未释放旧分配,不用于频繁循环刷新。客户端不加载本表。
|
| 样本格式 | GB18030-compatible,CRLF。保留原编码;源码读取器不会自动把中文转为 UTF-8。
|
样本 101 行、5 列。第 2 列通知编号 0..74,必须按非递减排列,允许重复;样本不少编号有 2 或 3 条稿。第 1 列索引加载器不读,但仍须唯一,因为 DBC 按首列建索引。样本频道列全是 4。
| 谁决定发不发 | 作用 |
|---|---|
| DropBoxContent 第 3 列 | 写入通知编号。-1 表示该包不带通知号。 |
| 物品表广播开关 | 装备、普通物品、材料、宝石各表的广播标志为假则直接返回。任务物品恒为假。 |
| 本表 | 按编号选文案和频道。找不到编号就不发。 |
占位符在发送前替换:&A 活动描述、&S 场景名、&T 同场景队长名(没有则用拾取者名)、&U 拾取者、&I 物品传输串。模板和结果都限 255 字节。不要在文案里写 %,替换后按 sprintf 处理。
文件格式
首行是类型行:INT INT INT STRING STRING;第二行是列名行,程序跳过其内容;从第三行开始读取数据。各列用真实 Tab 分隔,保留首列、空列及行尾,不用空格代替。数据行行首 # 表示注释,分号不是此表的注释规则。首列为空的行被跳过;不足的尾列补为空值,多余列不参与本页字段读取。空整数和非数字经 atoi 可能成为 0,空字符串仍为空,不把解析成功当作业务合法。第一列须唯一,重复会触发读取器错误。
字段详解
列号从 1 开始,源码列下标从 0 开始。
| 字段与类型 | 含义与修改要点 | 缺项或特殊值 |
|---|---|---|
第 1 列INT:索引(无具体含义) |
行号。DBC 按本列建索引,加载通知内容时不读它。样本 0..100 唯一递增。 | 空首列跳行。重复编号触发 DBC 错误。改它不会改变按通知号查找的结果。 |
第 2 列INT:广播类型ID(顺序递增) |
通知编号,对应 DropBoxContent 第 3 列。查找按本列全表扫描,同一编号的多行随机抽一条。加载时若本行编号小于上一行则断言失败。 | 须保持非递减。-1 不会被掉落包当作有效通知号来发。样本 0 有 3 条。 |
第 3 列INT:频道类型:4-系统消息,6-帮派消息,7-门派消息 |
聊天频道。4 或其它非 6、非 7 的值都按系统消息发送;6 发帮派并加前缀 @*;SrvMsg;GLD:;7 发门派。枚举定义在 GameDefine2.h:系统=4、帮派=6、门派=7。样本全为 4。
|
空值经 atoi 为 0,仍走系统频道。改成 6/7 后仍要有对应帮会或门派才会看到。 |
第 4 列STRING:活动描述$1$ |
替换 &A 时插入的短描述。拷入 64 字节缓冲,超长截断并补 0。样本第一行是企鹅王。
|
空串合法。不参与编号匹配。 |
第 5 列STRING:广播内容… |
广播模板。拷入 256 字节缓冲,超长截断并补 0。发送时依次替换五个占位符。列数必须至少 5。 | 缺列断言失败。模板里不要出现 %。 |
常用修改实例
示例为局部教学片段,先备份原运行文件,再修改对应行并保留其余配置。教学值不是程序默认值。 以下代码块保留真实 Tab;本地示例文件保留原样本编码、中文表头与 CRLF。网页文字使用浏览器编码显示,不表示运行文件应改存 UTF-8。
把企鹅王通知的频道从系统改为帮派
修改前:
INT INT INT STRING STRING
索引(无具体含义) 广播类型ID(顺序递增) 频道类型:4-系统消息,6-帮派消息,7-门派消息 活动描述$1$ 广播内容(消息限长256CHAR,严禁使用字符%):&A-活动描述,&S-场景名称,&T-队长名称,&U-玩家名称,&I-物品名称$1$
0 0 4 企鹅王 #W&U#P在雪原上将#{_BOSS42}#P踹翻在地,捡起#W&I#P,飞一般的走了。
修改后:
INT INT INT STRING STRING
索引(无具体含义) 广播类型ID(顺序递增) 频道类型:4-系统消息,6-帮派消息,7-门派消息 活动描述$1$ 广播内容(消息限长256CHAR,严禁使用字符%):&A-活动描述,&S-场景名称,&T-队长名称,&U-玩家名称,&I-物品名称$1$
0 0 6 企鹅王 #W&U#P在雪原上将#{_BOSS42}#P踹翻在地,捡起#W&I#P,飞一般的走了。
按第一列定位行 0。样本第 2 列为通知号 0,第 3 列为 4,活动描述为企鹅王。只把第 3 列改为 6,保留 5 列、模板和其余 100 行。本片段含表头与该行,不能覆盖整表。通知号 0 另有两行仍为频道 4;发送时在三行里随机,只有抽中本行才走帮派。隔离加载读回频道 6。实际拾取还要求掉落包填写通知号 0,且该物品广播开关为真。需要实测。
验证与排查
启动有 InitItemDropNotifyTable() Ok!。101 行、编号仍非递减,行 0 频道为 6。用引用通知号 0 的掉落包击杀并拾取,看系统或帮派频道。reloadtab=DropNotify 后新文案应生效,但不要反复重载。恢复备份后重启或再 reload 一次。
发送时机
在掉落盒拾取成功、物品进入背包之后发送,不是怪物死亡当下。Lua 开箱/转蛋用各自脚本广播,不读本表。
物品开关
GetIsBroadCast 按物品大类查装备、普通物品、宝石表。开关为假则本表再完整也不会发。
重载
命令解析取等号后整段,DropNotify 大小写必须一致。权限为最高 GM。重载不释放旧表。
关联与依据
Server/DropBoxContent.txt · Server/MonsterDropBoxs.txt · Public/CommonItem.txt · Public/GemInfo.txt
其他配置及整理状态 · 服务端外网设置 · Lua 接口索引
Server/Server/GameServer/Server/Item/ItemTable.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemTable.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemRuler.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Item/ItemRuler.h:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Obj/Obj_ItemBox.cpp:实际加载、解析、字段使用或示例关联依据Server/Server/GameServer/Server/Packets/CGCommandHandler.cpp:实际加载、解析、字段使用或示例关联依据Common/GameDefine2.h:实际加载、解析、字段使用或示例关联依据Common/ServerBase/FileDef.h:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.cpp:实际加载、解析、字段使用或示例关联依据Common/DataBase/TLBB_DBC.h:实际加载、解析、字段使用或示例关联依据resources/Public/Config/DropNotify.txt:实际加载、解析、字段使用或示例关联依据resources/Server/Config/DropBoxContent.txt:实际加载、解析、字段使用或示例关联依据
原始 DBC 与 InitItemDropNotifyTable 隔离测试。格式替换、频道发包和拾取流程为源码核对;未启动游戏。