通区脚本示例
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-06-16 23:04:59 |
👁️ 阅读: 2
我是lua后端老师!
小仙,想了解通区脚本的写法是吧?没问题,咱们直接上干货!通区系统主要用来在多个服务器之间同步数据和文件,让玩家感觉像在一个大区里玩。
下面我给你几个最常用的通区脚本示例,你一看就懂:
### 示例1:创建和删除通区文本文件
这个用来在主区和所有分区同步一个文本文件。
```lua
-- 假设在主区执行,创建一个所有区都能读写的文件
local mainServerID = getconst("0", "<$MAINTONGSERVER>")
if mainServerID == "0" then
-- 当前是主区,直接创建文件
tongfile(0, "..\\QuestDiary\\CommonData\\全区公告.txt")
release_print("主区创建通区文件成功")
else
-- 当前是分区,需要指定主区ID来操作
maintongfile(mainServerID, 0, "..\\QuestDiary\\CommonData\\全区公告.txt")
release_print("分区请求主区创建文件")
end
-- 删除通区文件 (同样,分区需要指定主区ID)
-- tongfile(1, "..\\QuestDiary\\CommonData\\全区公告.txt") -- 主区用这个
-- maintongfile(mainServerID, 1, "..\\QuestDiary\\CommonData\\全区公告.txt") -- 分区用这个
```
### 示例2:向通区文件写入和修改内容
创建好文件后,就可以往里面写数据了。
```lua
-- 向通区文件追加一行内容(比如记录全服BOSS击杀)
changetongfile("..\\QuestDiary\\CommonData\\全区公告.txt", "玩家[<$USERNAME>]于<$DATETIME>击杀了终极魔龙!", "", 0)
-- 参数说明:文件路径, 要写的内容, 行数(0表示追加), 模式(0=追加)
-- 插入内容到指定行(比如修改第二行的公告)
changetongfile("..\\QuestDiary\\CommonData\\全区公告.txt", "最新公告:服务器将于今晚维护。", "2", 1)
-- 模式1=插入到指定行
-- 清空整个文件内容
changetongfile("..\\QuestDiary\\CommonData\\全区公告.txt", "", "", 4)
-- 模式4=清空
```
### 示例3:操作通区变量(G变量)
这是最常用的功能,比如做全服累计充值、全服击杀计数。
```lua
-- 初始化(清理)所有通区变量(1-50),通常在开服或重置时用
settongvar(-1)
release_print("已清理所有通区变量")
-- 通区变量1(代表全服BOSS击杀数)增加1
settongvar(1, "+", 1)
-- 将通区变量2设置为特定值(比如全服活动状态)
settongvar(2, "=", 1) -- 1表示活动开启
-- 通区变量3减去10
settongvar(3, "-", 10)
-- 当通区变量被修改时,QF脚本会触发`changetongvar`函数,我们可以在这里记录日志
function changetongvar(sysobj, varID, befort_value, after_value)
local msg = string.format("通区变量变动: ID[%s] 前值[%s] 后值[%s]", varID + 1, befort_value, after_value)
release_print(msg)
-- 这里可以给全服发个公告什么的
sendmsgnew(1, 0, "【系统】全服进度已更新!", 255, 255, 255)
end
```
### 示例4:从主区读取配置(分区向主区拉取数据)
分区服务器经常需要读取主区的配置。
```lua
-- 分区脚本:从主区读取一个配置项
local mainServerID = getconst("0", "<$MAINTONGSERVER>")
if mainServerID ~= "0" then -- 确保自己不是主区
readtongkey(mainServerID, '..\\QuestDiary\\996m2.txt', "双倍经验", "G101")
release_print("已向主区请求读取配置")
end
-- 读取成功后,QF会触发`readtongok`,值会存在变量G101中
function readtongok(sysobj)
local expRate = getglobalvar("G101") or "1"
release_print("从主区读取到双倍经验系数为:" .. expRate)
-- 接下来就可以应用这个系数了
end
```
### 示例5:同步文件到所有区
将主区的一个文件同步给所有分区。
```lua
local mainServerID = getconst("0", "<$MAINTONGSERVER>")
if mainServerID == "0" then
-- 主区:将本地文件同步到所有分区
updatetongfile("..\\QuestDiary\\活动配置\\春节活动.txt")
release_print("主区已同步活动文件至所有分区")
else
-- 分区:从主区拉取最新文件到本地
updatemaintongfile(mainServerID, "..\\QuestDiary\\活动配置\\春节活动.txt")
release_print("分区开始从主区拉取最新活动文件")
end
```
### 一个综合小案例:全服累计充值
```lua
-- 当有玩家充值成功时触发(假设在`recharge`触发里)
function recharge(player)
local rechargeAmount = 10 -- 假设充值了10元,这里实际应该从参数获取
-- 通区变量10记录全服总充值金额(单位:元)
settongvar(10, "+", rechargeAmount)
local total = getglobalvar("G10") or 0
if tonumber(total) >= 10000 then
sendmsgnew(1, 0, "【全服狂欢】累计充值已突破10000元宝,全服开启双倍经验1小时!", 0, 255, 0)
-- 这里可以触发全服双倍经验活动...
end
end
```
**核心要点总结:**
1. **先判断主区**:用 `getconst("0", "<$MAINTONGSERVER>")` 获取主区ID,`"0"`表示自己就是主区。
2. **主区直接操作**:在主区,用 `tongfile`, `updatetongfile`, `settongvar`。
3. **分区委托操作**:在分区,需要**通过主区ID**来操作,用 `maintongfile`, `updatemaintongfile`, `readtongkey`。
4. **异步回调**:`readtongkey`(读取)和 `checktongsvr`(检查主服状态)是异步的,结果在QF的 `readtongok` 和 `maintongline`/`maintongoff` 触发函数里获取。
5. **变量范围**:通区变量是 `G1` 到 `G50`,在脚本中用 `settongvar` 操作,用 `getglobalvar` 获取。
把这些例子吃透,常见的通区需求你基本都能搞定啦!哪里不明白随时问我,小仙。
← 返回问答库