怎么记录离线时间和上线时间
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-27 15:22:17 |
👁️ 阅读: 7
后端Lua老师来也!小仙,你好呀!
记录离线时间和上线时间是游戏里很常见的需求,比如用来计算离线时长、发放离线奖励等等。虽然咱们资料库里没有直接给出“记录时间”的接口,但我们可以利用现有的引擎事件和变量系统来实现。
核心思路是这样的:
1. **记录上线时间**:在玩家登录时(`login` 触发),把当前时间戳存到一个变量里。
2. **记录离线时间**:在玩家退出游戏时(`playoffline` 触发),再次获取当前时间戳,然后用它减去之前记录的上线时间,就能算出这次在线的时长。同时,你也可以把这次离线的时间点(也就是退出时的时间戳)存下来,作为“上次离线时间”。
这里要用到两个关键的引擎事件(QF触发):
* `login(actor)`: 玩家登录时触发。
* `playoffline(actor)`: 玩家大退(完全退出游戏)时触发。
以及存储和读取时间的变量操作函数,比如 `setplayvar` 和 `getplayvar`。
下面我给你写一个完整的例子,放在 `QFunction-0.lua` 文件里:
```lua
-- 玩家登录触发
function login(actor)
-- 获取当前时间戳(单位:秒)
local currentTime = os.time()
-- 将上线时间记录到玩家变量中,变量名可以自己定义,比如 "OnlineTime"
setplayvar(actor, "OnlineTime", tostring(currentTime))
release_print("玩家", getbaseinfo(actor, 1), "于", os.date("%Y-%m-%d %H:%M:%S", currentTime), "上线,时间戳已记录。")
end
-- 玩家大退触发
function playoffline(actor)
-- 1. 获取当前时间戳(离线时间)
local offlineTime = os.time()
-- 2. 读取之前记录的上线时间
local onlineTimeStr = getplayvar(actor, "OnlineTime")
local onlineTime = tonumber(onlineTimeStr)
if onlineTime then
-- 3. 计算本次在线时长(秒)
local onlineDuration = offlineTime - onlineTime
release_print("玩家", getbaseinfo(actor, 1), "离线。")
release_print(" 上线时间:", os.date("%Y-%m-%d %H:%M:%S", onlineTime))
release_print(" 离线时间:", os.date("%Y-%m-%d %H:%M:%S", offlineTime))
release_print(" 本次在线时长:", onlineDuration, "秒 (约", math.floor(onlineDuration/60), "分钟)")
-- 4. (可选)将本次离线时间也存下来,作为“上次离线时间”
setplayvar(actor, "LastOfflineTime", tostring(offlineTime))
-- 5. (重要)清理上线时间变量,避免下次登录时误用旧数据
-- 也可以不清理,根据你的业务逻辑决定
-- setplayvar(actor, "OnlineTime", "")
else
release_print("玩家", getbaseinfo(actor, 1), "离线,但未找到上线记录。")
end
end
```
**如何使用这个记录的时间?**
当你需要知道玩家上次离线了多久(比如发离线奖励),可以在他下次登录时计算:
```lua
function login(actor)
local currentTime = os.time()
setplayvar(actor, "OnlineTime", tostring(currentTime))
-- 检查是否有上次离线记录
local lastOfflineStr = getplayvar(actor, "LastOfflineTime")
local lastOfflineTime = tonumber(lastOfflineStr)
if lastOfflineTime then
local offlineDuration = currentTime - lastOfflineTime
release_print("玩家", getbaseinfo(actor, 1), "上次离线时长约为", math.floor(offlineDuration/60), "分钟。")
-- 这里可以添加发放离线奖励等逻辑
end
release_print("玩家", getbaseinfo(actor, 1), "于", os.date("%Y-%m-%d %H:%M:%S", currentTime), "上线。")
end
```
**几个重要的点:**
1. `os.time()` 获取的是当前系统的秒级时间戳。
2. `os.date("%Y-%m-%d %H:%M:%S", timestamp)` 可以把时间戳转换成可读的日期时间格式,方便查看和调试。
3. 玩家变量(`setplayvar`/`getplayvar`)是持久化的,会保存在数据库里,所以玩家下线再上线,数据依然在。
4. 记得修改`QFunction-0.lua`后要重启服务端才能生效。
这样就能完整地记录和计算玩家的上线、离线以及在线时长啦。如果还有不明白的,随时问我!
← 返回问答库