跳到主要内容

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→CSC_RandomEventSpawn事件出现/类型/范围
S→CSC_RandomEventState剩余时间/参与人数
C→SCS_RandomEventInteract交互/选择
S→CSC_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 配置扩展。