邀请码,存到全局,并且保存
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-16 17:50:35 |
👁️ 阅读: 5
你好,我是Lua后端老师!
小仙,要实现邀请码存到全局并保存,我们可以使用引擎的全局变量系统,并配合操作INI文件来持久化存储。这样即使服务器重启,数据也不会丢失。
这里给你一个完整的示例,包括生成邀请码、存储到全局变量以及保存到INI文件:
```lua
-- 生成一个6位随机邀请码的函数
function generateInviteCode(actor)
local code = ""
local chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for i = 1, 6 do
local rand = math.random(1, #chars)
code = code .. string.sub(chars, rand, rand)
end
return code
end
-- 存储邀请码到全局变量并保存到INI文件
function saveInviteCode(actor, code, targetPlayerName)
-- 参数说明:
-- actor: 触发玩家对象
-- code: 邀请码
-- targetPlayerName: 使用该邀请码的玩家名
-- 1. 将邀请码和对应玩家名存储到全局变量(内存中,重启会丢失)
-- 这里我们使用一个格式化的字符串来存储,例如:"CODE123456:玩家名"
local globalKey = "InviteCode_" .. code
local globalValue = code .. ":" .. targetPlayerName
setsysvarex(globalKey, globalValue, 1) -- isSave参数为1,表示保存
-- 2. 同时保存到INI文件进行持久化存储
local filename = "QuestDiary\\邀请码数据.ini"
local section = "邀请码列表"
local item = code -- 使用邀请码作为配置项名
local value = targetPlayerName -- 玩家名作为值
-- 写入到INI文件(带缓存,性能更好)
writeinibycache(filename, section, item, value)
-- 给操作者一个提示
say(actor, "邀请码 [" .. code .. "] 已成功生成并绑定给玩家 [" .. targetPlayerName .. "]")
release_print("系统: 邀请码", code, "已存储,绑定玩家:", targetPlayerName)
end
-- 验证邀请码并获取绑定玩家
function verifyInviteCode(actor, inputCode)
-- 1. 先从全局变量查找(速度快)
local globalKey = "InviteCode_" .. inputCode
local globalValue = getsysvarex(globalKey)
if globalValue ~= "" then
-- 从格式 "CODE:玩家名" 中提取玩家名
local _, playerName = string.match(globalValue, "([^:]+):(.+)")
say(actor, "验证成功!该邀请码绑定玩家: " .. playerName)
return playerName
end
-- 2. 如果全局变量没有,从INI文件查找(防止重启后数据丢失)
local filename = "QuestDiary\\邀请码数据.ini"
local section = "邀请码列表"
local playerName = readinibycache(filename, section, inputCode)
if playerName ~= "" then
-- 找到后重新加载到全局变量
local globalValue = inputCode .. ":" .. playerName
setsysvarex(globalKey, globalValue, 1)
say(actor, "验证成功!该邀请码绑定玩家: " .. playerName)
return playerName
end
-- 3. 都没找到,邀请码无效
say(actor, "邀请码无效或不存在!")
return nil
end
-- 使用示例:在QF触发中调用
function main(actor)
-- 生成并保存邀请码
local newCode = generateInviteCode(actor)
local targetPlayer = "测试玩家" -- 这里应该是实际使用邀请码的玩家名
saveInviteCode(actor, newCode, targetPlayer)
-- 验证邀请码
local result = verifyInviteCode(actor, newCode)
if result then
release_print("验证通过,玩家名:", result)
end
end
```
**关键点说明:**
1. **双重存储机制**:
- `setsysvarex`:存储到引擎全局变量,访问速度快
- `writeinibycache`:存储到INI文件,持久化保存,服务器重启不丢失
2. **数据恢复**:
- 当服务器重启后,全局变量会清空,但`verifyInviteCode`函数会先从INI文件读取,然后重新加载到全局变量中
3. **文件路径**:
- 示例中的INI文件保存在`QuestDiary\邀请码数据.ini`,你可以根据需要修改路径
4. **数据结构**:
- 全局变量中存储格式为`邀请码:玩家名`
- INI文件中以邀请码为键,玩家名为值
**扩展建议**:
你还可以在INI文件中增加更多信息,比如使用时间、生成时间等,只需要修改`saveInviteCode`函数中的value值,使用JSON格式存储更多数据。
这样设计既保证了性能(内存读取),又保证了数据安全(文件持久化)。有什么不明白的地方随时问我,或者请教浮生梦尊师!
← 返回问答库