PRD-052 限时增益活动框架
文档编号:PRD-052
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/activity/buff_event.lua
1. 背景与目标
双倍经验、掉落提升、金币加成等限时增益活动频繁上线。用 Lua 统一管理增益时段、叠加、上限与公告,避免每次改 C++。
目标
- 配置化开启经验/掉落/金币/声望等倍率活动。
- 支持全服/地图/帮会/等级段范围。
- 与道具/装备加成正确叠加,设置上限。
2. 核心规则
- 活动配置倍率、范围、开始/结束时间、公告。
- 同类倍率取最高值,不叠乘;不同类可叠乘。
- 总倍率上限可配置(如经验最高 5 倍)。
- 活动开始/结束全服公告,客户端显示增益图标/倒计时。
- 支持手动开启/关闭(GM),用于补偿/事故。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/activity/buff_event.lua
BuffEvent = {
events = {
{ id=1, type="exp", rate=2.0, scope="world", start="20:00", stop="22:00" },
{ id=2, type="drop", rate=1.5, scope="map:101", start="12:00", stop="14:00" },
},
caps = { exp=5.0, drop=3.0, gold=3.0 },
}
function OnBuffEventStart(ctx, ev)
ctx:SetGlobalBuff(ev.type, ev.rate, ev.scope)
ctx:Broadcast("world", "限时增益开启:" .. ev.type .. " x" .. ev.rate)
ctx:SetTimer("buff_stop_" .. ev.id, ctx:SecondsUntilToday(ev.stop), function()
OnBuffEventStop(ctx, ev)
end)
end
function OnBuffEventStop(ctx, ev)
ctx:ClearGlobalBuff(ev.type, ev.scope)
ctx:Broadcast("world", "限时增益结束")
end
- 倍率存全局状态,C++ 结算时查询
GetBuffRate(type, role)。 - 同类取最高、不同类相乘,上限在 C++ 侧统一裁剪。
- 活动状态持久化,重启后按当前时间恢复/结束。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| S→C | SC_BuffEventInfo | 活动类型/倍率/倒计时 |
| S→C | SC_BuffEventEnd | 结束通知 |
3.3 叠加规则
| 来源 | 叠加方式 |
|---|---|
| 限时活动 | 同类取最高 |
| 道具加成 | 与活动乘算 |
| VIP/月卡 | 与活动乘算 |
| 装备/称号 | 固定值,不参与倍率 |
| 总上限 | 按类型裁剪 |
4. 客户端设计
- 主界面增益图标:类型、倍率、剩余时间。
- 活动日历/公告入口。
- 经验/掉落飘字显示倍率。
- 结束前 5 分钟提示。
- 多活动并存时按优先级排序。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
type | exp/drop/gold/reputation |
rate | 倍率 |
scope | world/map/guild/level |
start / stop | 时段 |
cap | 上限 |
Lua 接口:SetGlobalBuff、ClearGlobalBuff、GetBuffRate、Broadcast、SecondsUntilToday。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 活动时间重叠 | 同类取最高,不同类并存 |
| 服务器重启 | 按当前时间恢复/结束 |
| 手动关闭 | GM 命令立即清除并公告 |
| 倍率配置错误 | 服务端夹到上限,记录告警 |
| 跨天活动 | 按绝对时间,不随 0 点重置 |
| 脚本异常 | 清除本活动增益,记录日志 |
7. 验收标准
- 活动按配置开启/结束/公告。
- 同类取最高、不同类乘算、上限裁剪正确。
- 重启/手动关闭/时间重叠处理正确。
- 客户端图标/倒计时与服务端一致。
- 新类型增益可通过 Lua 扩展。