PRD-016 组队系统
文档编号:PRD-016
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:SessionServer、ScenesServer/Team.cpp、RecordServer
1. 背景与目标
组队是副本、任务、国战的基础协作单位。当前存在队长掉线后队伍解散、分配模式不生效、跨地图跟随丢失等问题。本 PRD 统一建队、加入、分配、跟随、踢人与解散。
2. 核心规则
2.1 队伍规模
- 普通队伍最多 5 人,团队最多 20 人(按玩法开启)。
- 玩家同一时间只能在一个队伍。
- 队长可转移、踢人、解散;队员可退出。
2.2 分配模式
| 模式 | 金币 | 物品 | 经验 |
|---|---|---|---|
| 自由拾取 | 各自拾取 | 归属者拾取 | 范围内共享 |
| 队长分配 | 队长拾取 | 队长分配 | 范围内共享 |
| Roll 点 | 各自拾取 | 需求/贪婪 Roll | 范围内共享 |
- 经验共享范围默认 30 格,超过范围不共享。
- 副本内分配模式以进入时设置为准,中途不可改。
2.3 跟随与跨地图
- 队员可点击队长头像跟随,自动寻路到队长附近。
- 队长进入副本/跨地图,队员收到传送确认。
- 队员掉线保留队伍位置 5 分钟,超时移出。
- 队长掉线 5 分钟后自动转移给在线队员。
3. 服务端设计
3.1 数据结构
struct Team {
uint64_t team_id;
uint64_t leader_id;
std::vector<uint64_t> members;
uint8_t loot_mode;
uint32_t create_time;
uint32_t max_members;
};
struct TeamMember {
uint64_t role_id;
uint32_t level, job;
uint32_t map_id, x, y;
bool online;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_TeamCreate | 建队 |
| C→S | CS_TeamInvite | 邀请 |
| C→S | CS_TeamJoin | 申请/接受 |
| C→S | CS_TeamLeave | 退出 |
| C→S | CS_TeamKick | 踢人 |
| C→S | CS_TeamTransfer | 转让队长 |
| C→S | CS_TeamSetLoot | 分配模式 |
| S→C | SC_TeamInfo | 队伍全量 |
| S→C | SC_TeamMemberUpdate | 成员状态 |
3.3 队伍状态
- 队伍信息缓存于
SessionServer,场景服同步成员位置。 - 队长操作加锁,避免并发转让/踢人。
- 解散时清理副本报名、跟随、队伍 Buff。
- 跨服队伍由
MiniServer维护映射。
4. 客户端设计
- 队伍面板:成员头像、等级、职业、HP/MP、距离、在线状态。
- 邀请弹窗:显示队长、队伍人数、副本进度。
- 分配模式设置仅队长可见,修改后广播。
- 跟随按钮、集合标记、队长标记。
- 队员掉线显示灰色头像与倒计时。
5. 配置
Team.xml:max_members、share_range、offline_keep_seconds、leader_transfer_seconds、invite_timeout。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 邀请已满队伍 | 拒绝 |
| 被邀请者已在队伍 | 拒绝 |
| 队长踢自己 | 拒绝,需转让/解散 |
| 队长掉线 | 5 分钟后自动转让 |
| 副本中退队 | 按副本规则处理,可能视为放弃 |
| 跨服跟随 | 由 MiniServer 转发,失败提示 |
7. 验收标准
- 建队/邀请/加入/退出/踢人/转让/解散正确。
- 三种分配模式按规则生效。
- 经验共享范围、掉线保留、队长转移正确。
- 跨地图/副本/跨服队伍状态一致。
- 并发操作不会产生双队长/重复成员。