经济商店与资产交易
返回总览。经济模块连接玩家选择、商品数据、资产状态、在线服务和持久化。单机金融与在线交易具有不同的权威来源,不能统称为“修改金钱全局变量”。
1. 商店是业务前端和世界交互#
shop_controller 跨模式存在,负责商店相关公共维护,还包含在线客户车辆等扩展。服装、理发、武器、纹身、改装等入口共享 core 头文件,适配不同人物或地点;衣柜则表达已拥有物品的使用状态。[S1][S2]
商店流程需要同时维护地点/店员/镜头、可售资格、预览、确认、资金/交易、应用和退出恢复。预览服装或车辆部件只是本地表现;只有确认及相应交易结果才能决定是否保留为持有状态。
网页购车/房产又在 appInternet 中进行等级、会话、任务和资金判断,然后交给公共业务模块。不同入口应复用交易契约,避免商店和网页各自维护互相不一致的购买结果。
2. 单机金融的两个面#
单机财产和现金与剧情、任务奖励、车库、物业相连;stock_controller.sc 还包含价格初始化、离线价格加载、tick、market triggers,以及车辆、武器、死亡等统计输入处理。[S3]
这说明股票系统有模型、时间推进和游戏行为输入,不能简单理解为外部真实行情镜像。源码存在 LCN 离线价格路径;其他市场服务是否可用必须单独验证,不能由函数名推断其当前联网行为。
候选任务系统在任务前后调用 COPY_BANK_TRANSLOGS,让金融状态与任务/检查点边界关联。重试和重玩可能需要不同的经济处理,不宜把每次播放“任务完成”演出都当成一次可重复奖励。
3. 在线交易是异步协议#
net_cash_transactions.sch 维护脚本交易槽、原生交易 ID、类型、服务、商品类别、操作、价格、状态和重试队列。[S4]
该图是职责概括,不代表每类交易都有同一套枚举。GENERATE_NEW_CASH_TRANSCTION_BASKET 检查角色服务会话、refresh pending、保存故障、交易槽与已有 basket。NETWORK_START_BASKET_TRANSACTION_CHECKOUT 中明确写明交易经 shop_controller 排队,以便必要时延迟;设置 ready 后也不意味着服务端已经成功。[S4,L2321、L2737]
更细的区别是:IS_CASH_TRANSACTION_COMPLETE 判断“不再 PENDING”,失败也属于完成;还需查询最终状态才能显示购买成功。脚本槽位索引和原生 transaction ID 也不是同一个编号。
4. 错误分类和重试#
SHOULD_CASH_TRANSACTION_RETRY_FOR_ERROR_CODE 对 500–599 和 408 返回可重试;GET_TIMEFRAME_FOR_TRANSACTION_RETRY 配置按尝试序号变化的分钟级间隔。队列还提供检查原生 transaction ID 是否已排队的接口。[S4,L3245 起]
这显示系统没有把所有失败都立即无限重发。需保持请求身份和回执对应,避免 UI 连续点击或模式切换产生重复排队。客户端的交易 ID、队列去重和有限重试不能单独证明后端具备严格 exactly-once 语义;本次未审计服务端。
源码还存在 USE_SERVER_TRANSACTIONS 关闭时的模拟事件路径。调试绕过或旧平台注释不能当成当前所有平台都不用服务交易的证据,实际行为由配置和 Native 返回决定。
5. 奖励也可能排队#
net_reward_transactions.sch 将奖励队列与 MP stats 同步,并在在线/服务交易启用、玩家状态合适、未占用其他商店 basket 时处理。[S5] 这里还有一个静态阅读提醒:注释写“every 1000 frames”,实际条件是 % 1500;报告以执行语句为准,不复述旧注释当作事实。
奖励流程说明“玩法完成”和“资产已经可持久使用”不一定在同一帧发生。内容脚本应明确显示、奖励登记、交易确认与保存之间的关系,取消/断线时也应按既有队列恢复规则处理。
6. 资产一致性边界#
房产、车辆、衣物、武器、角色槽和钱可能被一次业务操作同时影响。脚本负责提交正确参数和应用回执,原生 Shop/Commerce 与云服务负责其对应层的处理。任务脚本的 host 不是金钱服务端,不能因它有 serverBD 就让它直接决定永久库存。
本篇仅分析正常架构和恢复路径,没有执行购买、修改账号余额或访问在线交易服务。
源码证据#
[S1] shop_controller.sc,尤其 L10328 客户车辆交易和 L10793 入口;[S2] 共享改装 core;[S3] stock_controller.sc L1197、L1212、L1279、L1478;[S4] L1101、L1314、L2190、L2321、L2737、L2823、L3245;[S5] L63、L167。
[S1]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/shops/shop_controller.sc> [S2]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/shops/carmod_shop_core.sch> [S3]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/finance/stock_controller.sc> [S4]: <../../../GTAV Source/script/dev_ng/multiplayer/include/public/net_cash_transactions.sch> [S5]: <../../../GTAV Source/script/dev_ng/multiplayer/include/public/net_reward_transactions.sch>