游客
修复角色升级奖励

修复角色升级奖励

117
0
一言准备中...

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级红色全服广播不在本次范围;
当前使用邮箱幂等键防止重复发放;邮件被物理清理后不保留独立奖励领取记录。若后续要求跨邮件生命周期永久去重,需要另行增加角色奖励记录表,正常流程不会重复领取。

  • 本文作者:blogger
  • 本文链接: https://www.miaoshen8.cn/zishu/4.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
0
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
8
1
0
0
内卷太严重,已躺平...

多频道配置相关

上一篇

PC房间在线时长活动配置

下一篇
评论区
内容为空

这一切,似未曾拥有

  • 复制图片
按住ctrl可打开默认菜单