PRD-003 PK、红名与监狱
文档编号:PRD-003
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:ScenesServer/Pk.cpp、RecordServer、tbl/Pk.xml
1. 背景与目标
PK 规则决定野外冲突与装备风险。当前存在善恶模式切换无 CD、红名爆装概率不透明、监狱可被传送道具绕过等问题。本 PRD 统一 PK 模式、PK 值、红名、爆装、监狱与洗红。
2. 核心规则
2.1 PK 模式
| 模式 | 可攻击 | 被攻击 | 说明 |
|---|---|---|---|
| 和平 | 不可 | 可 | 默认 |
| 组队 | 可攻击非队友 | 可 | 队伍内免伤 |
| 帮会 | 可攻击非帮会 | 可 | 帮会内免伤 |
| 阵营 | 可攻击敌对阵营 | 可 | 国战/战场 |
| 全体 | 可攻击所有人 | 可 | 红名/惩罚 |
- 切换模式有 10 秒 CD,战斗中不可切换。
- 安全区禁止 PK,强制和平模式。
2.2 PK 值与红名
- 击杀白名玩家 +100 PK 值,击杀红名 +10,击杀怪物 -1。
- PK 值 ≥ 100 变红名,≥ 200 变深红。
- 红名死亡爆装概率提升,掉落非绑定装备/背包物品。
- PK 值每 5 分钟自然衰减 1 点,在线才衰减。
2.3 监狱
- 红名被击杀/被守卫击杀进入监狱,刑期按 PK 值计算。
- 监狱内禁止 PK、交易、邮件附件领取。
- 可通过在线时长/洗红道具/任务减刑。
- 传送道具在监狱内失效。
2.4 爆装与保护
- 白名死亡不掉装备,红名按 PK 值分档掉 1–2 件非绑定装备。
- 绑定/新手保护装备不掉落。
- 击杀者获得掉落归属,保护期 60 秒。
- 同 IP/同设备反复击杀判定为恶意刷 PK。
3. 服务端设计
3.1 数据结构
struct PkState {
uint8_t mode;
uint32_t pk_value;
uint32_t jail_until;
uint32_t last_mode_change;
uint32_t kill_count;
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_PkMode | 切换模式 |
| C→S | CS_PkValue | 查询 PK 值 |
| S→C | SC_PkState | 模式/PK 值/红名 |
| S→C | SC_PkKill | 击杀公告/爆装 |
| S→C | SC_JailState | 监狱状态/刑期 |
3.3 击杀结算
玩家死亡
→ 判断击杀者/模式/安全区
→ 计算 PK 值变化
→ 红名判定 → 爆装判定
→ 进入监狱(如满足)
→ 广播 SC_PkKill / SC_JailState
→ 写 pk_log
3.4 防滥用
- 同账号/同 IP 互杀不增加 PK 值,不掉落。
- 低等级保护:等级差 > 20 不增加 PK 值。
- 安全区/复活点附近击杀无效。
- 洗红道具使用有冷却与日志。
4. 客户端设计
- 名字颜色:白/黄(灰名)/红/深红,头像边框同步。
- PK 模式切换按钮,显示 CD 与当前模式。
- 击杀提示:击杀者、被击杀者、爆装物品、PK 值变化。
- 监狱界面:刑期倒计时、减刑按钮、禁止操作提示。
- 安全区提示:进入安全区自动和平,离开可恢复。
5. 配置
Pk.xml:pk_per_kill、red_threshold、deep_red_threshold、decay_interval、jail_base_time、drop_rate、protect_level_gap。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 安全区攻击 | 拒绝 |
| 战斗中切模式 | 拒绝 |
| 红名下线 | PK 值保留,刑期暂停 |
| 监狱中使用传送 | 拒绝 |
| 击杀同 IP | 不加 PK 值,记录风控 |
| 服务器重启 | PK 值/刑期从 DB 恢复 |
7. 验收标准
- 五种 PK 模式、安全区、切换 CD 正确。
- PK 值增减、红名、衰减、监狱刑期正确。
- 爆装概率、保护装备、归属正确。
- 同 IP/低等级保护防刷生效。
- 客户端名字颜色/监狱状态与服务端一致。