
PVF 配置
读取文件:
etc/serverparameter_chn.etc
读取词条:
[level up reward]
每个词条格式:
等级 参数1 参数2 物品ID 数量
当前奖励配置中使用:
等级:70-86
物品 ID:3330
数量:按 PVF 各等级配置读取
70级数量:250
75级数量:300
80级数量:400
85级数量:500
其他等级按 PVF 配置读取
参数1、参数2 当前只保留并解析,不参与奖励业务逻辑,具体语义尚未确认,推测为邮件文本内容。
未实现内容:
85级红色全服广播;
经验书跨等级路径。当前经验书使用链本身未完成修复。
业务所有权与事务
奖励业务由:
CharacterLevelUpRewardService MailboxService MailboxRepository
负责。
经验仍由原有经验服务和各升级入口负责,升级奖励服务不创建第二套等级或经验真源。
邮件写入使用现有 MailboxRepository 事务。奖励幂等键:
level-up-reward:{characterId}:{level}
邮件失败时不会记录为成功。角色选角完成后,服务会扫描当前等级以前的配置奖励,并通过幂等键补发缺失邮件。
邮箱提醒由邮箱模块负责:
插入邮件前检查角色是否已有有效的未领取附件;
没有未领取附件时不发送新邮件提醒;
已有未领取附件时发送 MAILBOX_ALARM;
幂等重放不重复发送提醒。
协议依据
A21 协议编号统一来自:
Server/DfoServer/Network/Core/PacketTypesA21.cs
已确认:
MAILBOX_ALARM = 0x0063 SERVER_BROADCAST_TIME_MESSAGE = 0x0343
0x0063 MAILBOX_ALARM
包体为小端 UInt16 数量。
实机日志示例:
SEND type=0x0063 body=[01 00]
表示 1 个新邮件提醒。
跨等级测试中:
服务端发送 1 个 0x0063 MAILBOX_ALARM 通知;
包体为 [10 00],表示当前有 16 封未领取奖励邮件;
客户端只弹/显示 1 次新邮件提醒;
随后发送 16 条 0x0343 个人升级奖励提示,每个等级 1 条。
0x0343 SERVER_BROADCAST_TIME_MESSAGE
当前实现包体:
Int32 durationMilliseconds UTF-8 DString message
实机日志示例:
SEND type=0x0343 len=67 body=(52B) 88 13 00 00 2C 00 00 00 获得80级升级奖励,请到邮件查收
字段解析:
5000 毫秒显示时间;
UTF-8 DString 长度 44;
文本内容为个人左侧升级奖励提示。
客户端日志已确认:
[NOTI RECV] 99 (Size : 2) [NOTI RECV] 835 (Size : 52) [NOTIFUNC_ENUM_NOTIPACKET_SERVER_BROADCAST_TIME_MESSAGE] 获得80级升级奖励,请到邮件查收
其中:
十进制 99 = 0x0063
十进制 835 = 0x0343
本次未使用:
0x01F7,该协议表现为公告/弹窗,不适合个人升级提示;
0x0056,现有强化/抽奖广播样式与目标红色全服播报不一致。
接入路径
已接入以下升级来源:
城镇使用升级券;
普通地下城经验;
Quest 经验;
死亡之塔经验结算;
Tournament 经验;
角色选角/重登恢复。
所有路径统一调用 CharacterLevelUpRewardService,避免各入口重复实现奖励规则。
自测
新增:
--selftest-character-level-up-reward
覆盖:
PVF [level up reward] 解析;
奖励物品和数量读取;
跨等级奖励规划;
登录恢复规划;
邮件标题和正文;
官方系统邮件类型;
角色级幂等键;
幂等重放不重复提示;
新邮件提示判断;
0x0063 协议编号;
0x0343 协议编号;
0x0343 的 5000 毫秒字段;
UTF-8 DString 编码。
已运行:
dotnet build Server/DfoServer/DfoServer.csproj -c Debug --no-restore --nologo dotnet run --project Server/DfoServer/DfoServer.csproj -c Debug --no-build --no-restore -- --selftest-character-level-up-reward dotnet run --project Server/DfoServer/DfoServer.csproj -c Debug --no-build --no-restore -- --selftest-gold-limit-protocol git diff --check
结果:
升级奖励 SelfTest:通过;
金币协议 SelfTest:通过;
编译:0 错误;
git diff --check:通过。
实机验证
已验证:
城镇升级券单级升级;
普通地下城升级;
角色 70-86 跨等级恢复;
角色升级邮件;
0x0063 邮件提醒;
0x0343 个人左侧系统提示;
重登后不重复发放;
多等级对应多条个人提示。
未完成:
死亡之塔客户端进入时黑屏闪退,暂时无法完成该路径实机验证;
经验书使用链未修复,无法用经验书验证跨等级;
85级红色全服广播缺少当前 A21 的可靠协议证据,因此没有实现;
数据库与资源影响
不新增数据库表;
不修改 schema 或迁移版本;
不修改 PVF;
不修改客户端文件;
运行数据库、备份、日志、抓包和构建产物不纳入提交;
奖励状态通过现有邮箱幂等键持久化,不新增奖励状态表。
风险与兼容性
直接 GM 改等级后重登会触发奖励恢复,这是预期行为;
已存在的奖励邮件不会重复插入;
邮件写入失败会保留为可重试状态;
85级红色全服广播不在本次范围;
当前使用邮箱幂等键防止重复发放;邮件被物理清理后不保留独立奖励领取记录。若后续要求跨邮件生命周期永久去重,需要另行增加角色奖励记录表,正常流程不会重复领取。









这一切,似未曾拥有