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→C | SC_HotSpringState | 区域、经验速率、剩余时长 |
| S→C | SC_HotSpringTick | 单次经验/活力 |
| C→S | CS_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/传送/死亡处理正确。
- 热更脚本不影响已进入玩家。