|
|
2026-8-31
1.修正:补充角色限购词条
''修复 PVF 使用 作为每日限购范围时,服务端无法识别的问题。character
原服务端只识别:
charac``现在同时兼容:`charac,character`
2.补齐魔王契约服务状态与核心权益
变更概述
修复魔王契约已经激活,但客户端未稳定收到服务状态、部分权益没有进入实际业务流程、每日使用次数也没有统一记录的问题。
本次修改恢复 A21 客户端进号阶段的魔王契约主动同步,并把需要服务端结算的契约权益接入对应事务。账号有效期继续存储在 account_premiums,每日次数统一复用 character_daily_counters,不新增数据库迁移,也不修改 PVF。
问题说明
购买或配置魔王契约后,服务端虽然能够保存 8 项服务的到期时间,但实际游戏中存在以下问题:
A21 客户端进号后不保证主动查询魔王契约,导致服务状态和剩余次数没有下发;
黄金卡牌、免费解除虚弱和自动修理没有完整执行每日次数限制;
每日次数只覆盖双倍开罐,其他有限次服务没有统一账本;
任务助手没有提升任务物品掉落,也没有发放每日 APC 助手道具;
契约状态变化后,客户端没有及时收到刷新数据;
7 种 Buff 等客户端执行的权益因缺少正确的状态投影而无法正常启用。
问题原因
原有实现主要完成了魔王契约的购买、到期时间保存和客户端查询响应,但缺少两类关键连接:
进号初始化序列没有主动发送 A21 NOTI_PREMIUM_SERVICE (0x032F),而客户端不会在每次进号后固定发送查询命令;
契约槽位、每日次数和实际业务事务没有形成统一策略,免费翻牌、恢复、修理、任务掉落等路径无法可靠地校验、消费和回传使用次数。
修复方案1. 恢复进号阶段的契约状态同步
在角色初始化快照中生成完整的 8 槽魔王契约状态;
在 A21 进号初始化序列中主动发送 NOTI_PREMIUM_SERVICE (0x032F);
新增对应 Init Body Builder,复用现有 A21 Premium Service 封包布局;
保留客户端主动查询响应,并统一由同一份状态投影生成数据;
权益被实际消费后主动刷新 Premium Service 状态。
2. 统一每日使用次数策略
新增 DevilContractUsagePolicy,集中维护槽位、每日上限、计数键和消费逻辑。
每日次数按角色记录;
按北京时间每天 06:00 重置;
契约有效性按账号校验;
有限次权益只能在契约有效且次数未用完时消费;
支持与翻牌、恢复和修理业务放进同一 SQLite 事务;
统一向客户端投影当前已使用次数。
当前有限次服务:
槽位 服务 每日上限 服务端行为
0 黄金卡牌免费翻 10 次 付费牌费用置零,奖励提交时原子消费次数
1 双倍开罐 8 次 复用现有双倍奖励逻辑并纳入统一次数投影
3 7 种 Buff 10 次 普通副本成功激活后记录使用次数,战斗 Buff 由客户端执行
5 免费解除虚弱 10 次 恢复体力时费用置零并原子消费次数
6 自动修理 6 次 自动修理事务内免除金币并原子消费次数
3. 黄金卡牌免费翻牌
生成结算卡牌时检查黄金卡牌契约及当日剩余次数;
有可用次数时将付费牌金币成本设为 0;
将“发放卡牌奖励”和“消费契约次数”放进同一个持久化 Effect 事务;
事务失败时不会单独扣除次数;
成功后立即刷新客户端契约状态。
4. 免费解除虚弱与自动修理
解除虚弱时在同一事务中检查并消费契约次数,再决定金币费用;
自动修理只处理客户端明确标记为自动触发的请求;
自动修理、耐久恢复和次数消费在同一背包事务中完成;
成功使用免费权益后主动同步剩余次数。
5. 任务助手
任务栏自动掉落在基础掉落数量上按保守下限增加 50% 的期望数量;
奇数数量采用 50% 随机进位,避免整数截断长期少发;
奖励仍受任务所需数量和最大持有数量限制;
进入角色时每天发送一封系统邮件,附带 4 种 PVF 中已有的 APC 助手道具;
邮件和每日领取标记使用同一事务及幂等键,重复登录不会重复发放;
邮件及附件在下一次北京时间 06:00 重置时到期。
每日发放的 APC 道具:
阿甘左:2681925
死亡之纳特亚:2681923
希苏拉:2681922
娜塔莉娅·休勒:2681924
6. 客户端执行的契约权益
HP/MP 自动恢复、7 种 Buff 的实际战斗表现和高效开罐仍由 A21 客户端依据契约状态执行。服务端负责下发有效期及使用次数,并在对应服务端业务入口记录有限次数,不重复实现客户端已有的表现逻辑。
数据一致性与失败处理
黄金卡牌次数与持久化卡牌奖励同事务提交;
免费解除虚弱次数与金币/状态更新同事务提交;
自动修理次数与耐久度/金币更新同事务提交;
任务助手邮件与每日发放标记同事务提交,并使用幂等键防重;
契约过期、次数耗尽或账号/角色不匹配时不会消费次数;
客户端显示的使用次数由统一策略生成,避免不同业务分别计算。
兼容性
本次修改保持以下行为不变:
魔王契约仍使用 premium_type=580-587 表示 8 个服务槽位;
到期时间仍使用 account_premiums;
每日次数复用现有 character_daily_counters;
双倍开罐原有计数键和每日 8 次限制保持不变;
普通付费翻牌、普通金币解除虚弱、手动/快捷修理行为不变;
未激活契约的角色不会获得任务助手加成或每日邮件;
不修改 A21 封包结构,只补回已有 0x032F 通知;
无数据库 Schema 变更,无 PVF 变更。
自动测试
扩展 PremiumContractProtocolSelfTest,覆盖:
A21 进号初始化序列主动发送 Premium Service 状态;
Init Builder 使用正确的 A21 NOTI_PREMIUM_SERVICE Body 布局;
黄金卡牌有效时具有每日可用次数;
前 10 次消费成功,第 11 次被拒绝;
客户端状态正确投影黄金卡牌已使用次数;
任务助手按 +50% 期望数量追加任务物品;
奇数基础数量使用随机进位;
加成不会突破任务持有上限;
每日 APC 邮件只发送一次;
邮件包含 4 种正确的 APC 道具;
每日发放标记能够持久化并防止重复领取。 |
|