PRD-047 世界随机事件
文档编号:PRD-047
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/world/random_event.lua
1. 背景与目标
随机事件让野外地图保持活力。事件类型、触发条件、选项、奖励适合用 Lua 编排,运营可随时增删。
目标
- 按地图/时间段随机触发,不固定坐标。
- 事件包含选择、战斗、采集、护送、陷阱。
- 玩家参与获得奖励,事件结束自动清理。
2. 核心规则
- 每张野外地图每小时触发 1–3 次。
- 事件持续 10 分钟,最多 20 人参与。
- 事件类型:神秘商人、流浪宝箱、受伤士兵、盗宝贼、天气异象。
- 玩家点击/进入范围触发,部分事件需组队。
- 事件完成/失败后进入冷却,同地图 30 分钟不再触发。
3. 服务端设计
3.1 Lua 脚本设计
-- lua/world/random_event.lua
Events = {
{ id="merchant", weight=30, min_level=20 },
{ id="chest", weight=25, min_level=1 },
{ id="soldier", weight=20, min_level=15 },
{ id="thief", weight=15, min_level=25 },
{ id="weather", weight=10, min_level=1 },
}
function OnWorldTick(ctx, map_id)
if ctx:GetMapCooldown(map_id) > 0 then return end
local ev = ctx:PickWeighted(Events)
local spot = ctx:PickWalkablePoint(map_id)
local entity = ctx:SpawnEventEntity(ev.id, map_id, spot)
ctx:SetMapVar(map_id, "event_id", entity.id)
ctx:BroadcastMap(map_id, "附近似乎发生了什么……")
ctx:SetTimer("event_end", 600, function() ctx:CleanupEvent(entity) end)
end
function OnPlayerInteract(ctx, role, entity, choice)
local ev = ctx:GetEvent(entity)
if ev.id == "merchant" then
ctx:OpenEventShop(role, ev)
elseif ev.id == "chest" then
ctx:GrantEventReward(role, ev, choice)
elseif ev.id == "soldier" then
ctx:StartEscort(role, ev)
end
end
- 事件实体与地图触发器由 C++ 提供,脚本决定类型与奖励。
- 每个事件独立 timer,结束自动清理。
- 奖励发放走统一
GrantEventReward,背包满转邮件。
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| S→C | SC_RandomEventSpawn | 事件出现/类型/范围 |
| S→C | SC_RandomEventState | 剩余时间/参与人数 |
| C→S | CS_RandomEventInteract | 交互/选择 |
| S→C | SC_RandomEventResult | 奖励/失败 |
3.3 防刷
- 每角色每小时最多参与 5 次。
- 事件奖励按角色独立,不共享。
- 同 IP 多角色参与触发风控。
- 事件实体不可被攻击/移动。
4. 客户端设计
- 地图事件图标、范围光圈、公告提示。
- 交互面板:事件描述、选项、奖励预览。
- 事件倒计时与参与人数。
- 完成/失败结算。
- 事件图鉴(可选)。
5. 配置与 Lua 接口
| 配置 | 说明 |
|---|---|
event_id | 事件类型 |
weight | 触发权重 |
map_ids | 允许地图 |
duration | 持续时间 |
reward_group | 奖励 |
cooldown | 地图冷却 |
Lua 接口:PickWalkablePoint、SpawnEventEntity、BroadcastMap、OpenEventShop、GrantEventReward、StartEscort、CleanupEvent。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 地图人数不足 | 不触发或降低概率 |
| 事件点不可达 | 重新选点 |
| 玩家掉线 | 事件保留,奖励邮件补发 |
| 事件重叠 | 同地图只保留 1 个 |
| 脚本异常 | 清理事件,记录日志 |
7. 验收标准
- 随机事件按地图/时间/权重触发。
- 五类事件交互、奖励、清理正确。
- 参与次数/同 IP 风控生效。
- 掉线/重叠/异常处理正确。
- 新事件可通过 Lua 配置扩展。