跳到主要内容

PRD-035 温泉泡点

文档编号:PRD-035
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
脚本挂载:lua/activity/hotspring.lua

1. 背景与目标​

温泉提供安全的在线经验与社交场景。经验速率、时段加成、挂机判定经常调整,适合用 Lua 定时器与区域事件实现。

目标

  • 进入温泉区域自动获得经验/活力,离开停止。
  • 支持双倍时段、温泉等级、道具加成。
  • 防挂机:长时间无操作收益衰减。

2. 核心规则​

  • 温泉每日开放,基础经验每 10 秒一跳。
  • 温泉分普通/高级区域,高级区域需要门票或 VIP。
  • 每日 19:00–21:00 双倍,可与道具加成叠加,设总上限。
  • 连续 5 分钟无移动/技能/聊天,收益降为 50%;15 分钟降为 0。
  • 温泉内禁止 PK、交易、使用传送,死亡自动传出。
  • 每日最多获得 2 小时经验,超出后只保留活力。

3. 服务端设计​

3.1 Lua 脚本设计​

-- lua/activity/hotspring.lua
HotSpring = {
zones = { [1] = 5001, [2] = 5002 },
tick_seconds = 10,
daily_cap_seconds = 7200,
}

function OnEnter(ctx, role, zone_id)
ctx:SetRoleVar(role, "hotspring_zone", zone_id)
ctx:StartTimer(role, "hotspring_tick", HotSpring.tick_seconds, OnTick)
end

function IdleRate(seconds)
if seconds >= 900 then return 0.0 end
if seconds >= 300 then return 0.5 end
return 1.0
end

function OnTick(ctx, role)
local zone = ctx:GetRoleVar(role, "hotspring_zone")
if not zone or not ctx:InZone(role, HotSpring.zones[zone]) then
return ctx:StopTimer(role, "hotspring_tick")
end
local rate = ctx:GetTimeRate() * ctx:GetItemRate(role)
local idle = ctx:GetIdleSeconds(role)
rate = rate * IdleRate(idle)
ctx:GrantExp(role, ctx:CalcHotSpringExp(role, zone) * rate)
end

function OnLeave(ctx, role)
ctx:StopTimer(role, "hotspring_tick")
ctx:ClearRoleVar(role, "hotspring_zone")
end
  • 每个角色一个 timer,避免全图轮询;离开/下线自动清理。
  • ctx:GetIdleSeconds 由 C++ 统计最后操作时间。
  • 经验发放走 GrantExp,包含等级上限、双倍活动、经验加成。
  • 脚本状态不持久化,重启后重新进入区域重新计时。

3.2 协议​

方向协议说明
S→CSC_HotSpringState区域、经验速率、剩余时长
S→CSC_HotSpringTick单次经验/活力
C→SCS_HotSpringEnter进入高级区域

3.3 区域与安全​

  • 温泉地图设置安全区,禁止 PK/决斗。
  • 进入时清除战斗状态与追击目标。
  • 死亡/传送/掉线自动停止计时。

4. 客户端设计​

  • 温泉 HUD:当前区域、每跳经验、今日剩余时长、双倍倒计时。
  • 挂机衰减提示:“长时间未操作,收益降至 50%”。
  • 高级区域入口显示门票/权限。
  • 经验飘字与活力条。
  • 温泉内聊天/表情入口。

5. 配置与 Lua 接口​

配置说明
zone_id / exp_base区域与基础经验
tick_seconds结算间隔
daily_cap每日上限
double_time双倍时段
idle_threshold挂机判定

Lua 接口:InZone、StartTimer、StopTimer、GetIdleSeconds、GetTimeRate、GetItemRate、GrantExp、GrantEnergy。

6. 边界与异常​

场景处理
跨天仍在温泉重置每日时长,继续计时
切换区域停止旧 timer,启动新 timer
服务器重启重新进入后计时,不补发离线经验
经验上限达到上限后只发活力
脚本异常停止该角色 timer,不影响其他玩家

7. 验收标准​

  • 进入/离开/切换区域计时正确。
  • 经验速率、双倍、道具加成、上限正确。
  • 挂机衰减与恢复正确。
  • 温泉内 PK/传送/死亡处理正确。
  • 热更脚本不影响已进入玩家。