怎么写通区功能,本服让另外的一个服发送邮件奖励
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-04-16 00:20:45 |
👁️ 阅读: 9
哈喽,我是Lua后端老师!
小仙,你想实现一个通区功能,让本服给另一个服发送邮件奖励,这个想法很棒!这需要用到996引擎的通区系统,特别是`writetongkey`和`readtongkey`这两个核心函数。
简单来说,流程是这样的:**本服(主区)通过`writetongkey`将邮件信息“写”到目标服,目标服通过`readtongkey`“读”到这条信息,并在自己的QF触发里执行`sendmail`函数来发放邮件。**
下面我为你详细拆解一下步骤和代码:
### 第一步:本服(主区)编写发送邮件的Lua脚本
假设你有一个NPC或者一个功能按钮,点击后触发下面的Lua脚本。这个脚本的作用是**把要发送的邮件信息,写入到目标服的配置文件中**。
```lua
-- 本服(主区)脚本:发送跨服邮件请求
function SendCrossServerMail(actor)
-- 1. 定义目标服的ID,这个ID是你在引擎后台配置的
local targetServerID = "2" -- 假设目标服ID是2
-- 2. 定义要发送的邮件信息
local targetUserId = "#" .. actor -- 接收邮件的玩家ID,前面加#表示用角色名
local mailId = 1001 -- 自定义的邮件ID
local mailTitle = "跨服奖励邮件"
local mailMemo = "这是来自主服的奖励,请查收!"
local mailRewards = "金币#1000000#0&元宝#500#0" -- 附件:100万金币 + 500元宝,都是非绑定的
-- 3. 将邮件信息写入到目标服的指定配置文件中
-- 参数说明:目标服ID, 目标服文件路径, 键名, 值(这里我们把所有邮件信息拼接成字符串)
writetongkey(targetServerID,
'..\\QuestDiary\\CrossServerMail.txt',
'MAIL_DATA',
targetUserId .. '|' .. mailId .. '|' .. mailTitle .. '|' .. mailMemo .. '|' .. mailRewards)
-- 4. 通知本服玩家
sendmsg(actor, 0, "[系统] 跨服邮件奖励申请已发送!")
release_print("玩家 " .. actor .. " 向服" .. targetServerID .. "申请了邮件奖励。")
end
```
**关键点:**
* `writetongkey`函数是**单向写入**,它把数据(键值对)存到目标服的一个文件里。
* 我们把复杂的邮件信息(收件人、ID、标题、内容、附件)用竖线`|`拼接成一个字符串,作为`value`写入。这是Lua里处理多个参数常用的技巧。
### 第二步:目标服配置QF触发,接收并处理邮件
当`writetongkey`执行后,目标服需要**主动去读取**这个数据。这需要在目标服的`QuestDiary\系统功能\QF.lua`(或`QFunction-0.txt`)中,配置一个特殊的触发接口:`[@readtongok]`。
```lua
-- 目标服的 QF.lua 文件
-- 当 readtongkey 函数执行并成功读取数据后,会触发此段代码
function readtongok(actor, serverID, path, key, value)
-- 1. 检查读取的文件和键名是否是我们关心的
if path == '..\\QuestDiary\\CrossServerMail.txt' and key == 'MAIL_DATA' then
-- 2. 解析我们之前拼接的字符串
local mailInfo = string.split(value, '|')
local targetUserId = mailInfo[1] -- 接收者ID
local mailId = tonumber(mailInfo[2]) -- 邮件ID
local mailTitle = mailInfo[3] -- 邮件标题
local mailMemo = mailInfo[4] -- 邮件内容
local mailRewards = mailInfo[5] -- 邮件附件
-- 3. 调用 sendmail 函数,发送邮件
sendmail(targetUserId, mailId, mailTitle, mailMemo, mailRewards)
-- 4. 记录日志(可选)
release_print("从服" .. serverID .. "接收到邮件指令,已向玩家 " .. targetUserId .. " 发送邮件。")
end
end
```
**关键点:**
* `[@readtongok]`是引擎规定的固定触发名,当`readtongkey`成功返回数据时自动调用。
* 我们需要在目标服**主动调用** `readtongkey` 来触发这个流程。通常可以放在一个定时器里,或者由某个事件触发。
### 第三步:目标服定时或触发读取指令
为了让目标服能及时处理邮件请求,你需要让它定期去检查那个文件。可以在目标服的`startup`(服务器启动)触发里设置一个全局定时器。
```lua
-- 目标服的 startup 触发(或其他全局初始化地方)
function startup()
-- 设置一个每10秒执行一次的全局定时器,ID为 100
setontimerex(100, 10)
release_print("服务器启动,跨服邮件检查定时器已设置。")
end
-- 目标服的全局定时器触发
function ontimerex(100)
-- 定时去读取主区写入的邮件数据
-- 参数说明:主区ID(这里写0或留空表示主区), 文件路径, 键名, 用于接收返回值的变量名(会传给readtongok)
readtongkey("", '..\\QuestDiary\\CrossServerMail.txt', 'MAIL_DATA', 'GLOBAL(MAIL_DATA)')
-- 注意:最后一个参数 'GLOBAL(MAIL_DATA)' 是一个约定写法,表示读取的值会通过G变量传递,实际在readtongok中我们直接使用value参数。
end
```
### 总结一下完整流程:
1. **主服玩家**触发`SendCrossServerMail`函数。
2. 该函数使用`writetongkey`将邮件数据写入到**目标服**的`CrossServerMail.txt`文件的`MAIL_DATA`键下。
3. **目标服**通过一个定时器,每隔一段时间调用`readtongkey`去尝试读取`MAIL_DATA`。
4. 读取成功后,引擎自动触发目标服QF中的`readtongok`函数。
5. `readtongok`函数解析数据,并调用`sendmail`函数,将奖励邮件发放给指定玩家。
**注意事项:**
* **主区设置**:确保你的引擎已经正确配置了通区,并且知道哪个是主区。
* **路径**:文件路径使用引擎的相对路径`..\\QuestDiary\\`是标准写法。
* **错误处理**:实际应用中,最好在解析字符串前检查`mailInfo`的长度,防止格式错误导致脚本异常。
* **性能**:定时器间隔不宜太短,根据实际需求设置,比如10-30秒一次即可。
这样,一个完整的跨服发送邮件功能就搭建好了。小仙,如果还有哪里不清楚,随时再来问我!如果遇到脚本报错,记得把错误信息也发给我看看,咱们一起“除虫”。
← 返回问答库