PRD-009 坐骑系统
文档编号:PRD-009
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:ScenesServer/Mount.cpp、tbl/Mount.xml、RecordServer
1. 背景与目标
坐骑提供移动速度与属性加成,是外观付费点之一。当前存在骑乘状态跨地图丢失、坐骑属性重复叠加、战斗中上下坐骑刷速度等问题。本 PRD 统一获取、培养、骑乘、属性与战斗限制。
2. 核心规则
2.1 获取与培养
- 坐骑分普通/稀有/史诗/传说,来源:任务、活动、商城、掉落。
- 坐骑可升级、升星,提供固定属性与移动速度。
- 升级消耗坐骑经验丹,升星消耗同名碎片。
- 坐骑属性全角色生效(不必骑乘),骑乘只影响移速/外观。
2.2 骑乘
- 点击坐骑/快捷键上下坐骑,读条 1 秒。
- 战斗中不可上坐骑;进入战斗自动下坐骑。
- 骑乘时移动速度 +X%,可被减速/定身影响。
- 跨地图保留骑乘状态(副本内按配置禁止)。
2.3 幻化与外观
- 已解锁坐骑可幻化外观,属性取最高培养坐骑。
- 幻化不改变实际坐骑 ID,只改变外观。
- 活动限时坐骑过期后保留图鉴,不可骑乘。
3. 服务端设计
3.1 数据结构
struct MountData {
uint32_t mount_id;
uint8_t level;
uint8_t star;
bool unlocked;
bool active; // 当前骑乘
uint32_t skin_id; // 幻化外观
uint32_t expire_ms;
};
struct MountSet {
std::vector<MountData> mounts;
uint32_t active_mount_id;
uint32_t total_speed;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_MountRide | 上/下坐骑 |
| C→S | CS_MountUpgrade | 升级/升星 |
| C→S | CS_MountSkin | 幻化 |
| S→C | SC_MountList | 坐骑列表 |
| S→C | SC_MountState | 骑乘/属性变化 |
3.3 骑乘校验
- 校验坐骑已解锁/未过期、角色存活、非战斗、地图允许。
- 上下坐骑有 1 秒读条,移动/受击打断。
- 进入战斗、死亡、传送、进副本自动下坐骑。
- 骑乘状态不写库,登录默认不骑乘。
3.4 属性计算
- 所有已解锁坐骑的“培养属性”汇总,不按骑乘叠加。
- 幻化只改外观,不改属性来源。
- 坐骑速度与装备/ Buff 速度按乘法叠加,设上限。
4. 客户端设计
- 坐骑图鉴:已解锁/未解锁、属性、来源、幻化按钮。
- 骑乘按钮/快捷键,读条进度,战斗自动下马提示。
- 坐骑栏显示当前速度加成与培养等级。
- 幻化预览:模型、特效、移动表现。
- 过期坐骑灰显,显示剩余时间。
5. 配置
Mount.xml:mount_id、quality、speed、attr、level_cost、star_cost、expire_type、ride_map_limit。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 战斗中上坐骑 | 拒绝 |
| 骑乘中进入战斗 | 自动下坐骑 |
| 坐骑过期 | 自动下坐骑,图鉴保留 |
| 重复上下坐骑 | 读条中拒绝新请求 |
| 跨地图 | 保留状态;副本按配置清除 |
| 幻化坐骑未解锁 | 拒绝 |
7. 验收标准
- 坐骑获取/升级/升星/幻化正确。
- 骑乘状态、速度、战斗限制正确。
- 属性只计算一次,不因骑乘重复叠加。
- 过期/跨地图/死亡状态处理正确。
- 客户端模型/速度与服务端一致。