跳到主要内容

道具操作与变化来源

通用容器算法位于 src/component/GameSharedComponent/ItemAlgorithm/,玩家接入位于 src/lobbysvr/service/logic/item/。容器负责条目、数量、位置、检查与通知;Lobby 负责持久化、dirty 同步和 具体业务来源。

容器操作​

ItemContainer 提供 add/sub/load/move/apply_entries 等批次流程,并通过钩子让接入类实现单条校验、落位和 字段映射。支持有限格子、无限格子和无位置三类容器。

user_item_manager 的多容器流程先逐项 check_add/check_sub,再执行 do_operation。任一执行阶段失败会 直接返回,不会回滚已经提交的其他容器;因此 check/do 不是跨容器原子事务。邮件附件领取通过标记已领取 防止已提交部分被重复发放。

操作原因与业务来源​

三个概念不能混用:

类型内容用途
ItemOperationReasonkAdd、kSub、kLoad、kMoveSub、kMoveAdd 等容器判定的机制原因
ItemOperationSourcemajor_reason、minor_reason、reason_param调用方传入的业务来源
EnItemChgMajorType使用、出售、购买、邮件附件等枚举业务主来源的取值

ItemOperationContext 同时携带容器原因和业务来源。来源随 on_item_added 等 ItemAlgorithm 回调传播。 当前生产代码中,邮件附件是明确设置非 UNKNOWN 来源的调用点: EN_ITEM_CHG_MAJOR_MAIL_ATTACHMENT + mail.minor_type + mail_id。其他主要操作仍可能使用默认 UNKNOWN,不能假设所有道具变化都有完整业务来源。

dirty 同步边界​

Lobby 的 on_item_changed 和 on_item_count_changed 当前丢弃操作 context,客户端 dirty 数据只包含容器和 道具计数。也就是说,来源已经传入算法回调,但不会随现有 dirty 协议自动下发,也不代表已经完成持久化或 遥测流水。

OSS 流水边界​

com.struct.item.common.proto 另有 EnItemFlowReasonMajorType、EnItemFlowReasonMinorType 和 EnItemFlowReason;其中 major 枚举当前只有 INVALID。svr.oss.log.proto 虽定义 OSSItemFlow,当前 src/ 没有实际发射点。

因此,ItemOperationSource 是来源传播接口,不是已经接通的 OSS 道具流水系统。新增流水时应明确映射 业务来源、容器原因和 OSS 协议字段,并在真实日志出口验证,不能只填写 context 就宣称流水完成。