怎么使用跨服变量
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-13 17:10:47 |
👁️ 阅读: 19
你好,我是lua后端老师!
小仙,关于跨服变量的使用,这确实是个关键点。在996引擎中,跨服变量主要指的是**本服和跨服服务器之间需要同步的变量**。由于跨服服务器不支持直接操作本服的全局变量(如G、A变量)和行会变量,所以需要专门的机制来传递。
核心方法是使用 `synzvar` 函数,它负责将变量从本服“同步指令”发送到跨服服务器,并在跨服服务器上执行,最后将结果再传回本服。
下面我分两种情况,用代码示例给你详细说明:
### 情况一:同步全局G/A/自定义变量
这种场景下,通常是在**本服**执行 `synzvar` 发送指令,在**跨服**执行变量操作,然后结果存回本服的另一个变量。
```lua
-- 假设我们要同步一个全局G变量
-- 本服变量名(用于接收跨服传回的结果)
local local_var_name = "G16"
-- 跨服变量名(在跨服服务器上将被操作的变量)
local kf_var_name = "G15"
-- 首先,判断当前是在本服还是跨服执行
if checkkuafuserver() then
-- 当前是在跨服服务器
-- 直接操作跨服的变量
setsysvar(kf_var_name, getsysvar(kf_var_name) + 1)
release_print("在跨服操作变量", kf_var_name, "值为:" .. getsysvar(kf_var_name))
else
-- 当前是在本服
-- 1. 定义一个回调函数,用于接收跨服操作完成后的结果
-- 注意:这个函数名需要和 synzvar 的 id 参数对应,例如 id=1,则函数名为 kfsynvar1
if not kfsynvar1 then
function kfsynvar1()
-- 当跨服操作完成,结果会同步到本服的 local_var_name (G16)
release_print("跨服变量同步成功,本服变量", local_var_name, "值为:" .. getsysvar(local_var_name))
end
end
-- 2. 发起同步指令
-- 参数说明:
-- 1: 变量类型 (1=全局G变量, 2=全局A变量, 3=全局自定义变量, 4=行会变量)
-- kf_var_name: 要在跨服操作的变量名
-- local_var_name: 跨服操作结果要存回本服的变量名
-- 1: 消息ID,对应回调函数名 kfsynvar1
synzvar(1, kf_var_name, local_var_name, 1)
end
```
### 情况二:同步行会变量
行会变量的同步稍微复杂一点,因为需要传递行会名称。
```lua
-- 假设我们要同步一个行会自定义变量
-- 本服用于接收结果的变量名
local local_var_name_for_guild = "A10"
-- 行会自定义变量名(在跨服上操作)
local kf_guild_var_name = "行会自定义变量"
-- 判断当前服务器
if checkkuafuserver() then
-- 在跨服服务器
local guild = getmyguild(actor) -- 获取玩家所在行会
if guild ~= "0" then -- 如果玩家有行会
-- 初始化跨服的行会变量
iniguildvar(guild, "integer", kf_guild_var_name)
-- 操作跨服的行会变量(例如加1)
local value = getguildvar(guild, kf_guild_var_name) + 1
setguildvar(guild, kf_guild_var_name, value)
end
else
-- 在本服服务器
local guild = getmyguild(actor)
if guild ~= "0" then
-- 获取行会名称,因为跨服需要通过行会名称来识别
local guild_name = getguildinfo(guild, 1) -- 参数1获取行会名称
-- 定义回调函数,例如消息ID为996
if not kfsynvar996 then
function kfsynvar996()
release_print("行会变量同步成功,本服变量", local_var_name_for_guild, "值为:" .. getsysvar(local_var_name_for_guild))
end
end
-- 发起同步
-- 参数说明:
-- 4: 变量类型为行会变量
-- guild_name.."/"..kf_guild_var_name: 跨服变量标识,格式为“行会名/变量名”
-- local_var_name_for_guild: 结果存回本服的变量名
-- 996: 消息ID,对应回调函数 kfsynvar996
synzvar(4, guild_name.."/"..kf_guild_var_name, local_var_name_for_guild, 996)
end
end
```
### 核心要点总结:
1. **`synzvar` 是关键**:它是在本服触发的“指令”,告诉跨服“去操作某个变量,然后把结果给我”。
2. **变量类型 (itype)**:
- `1`: 全局G变量
- `2`: 全局A变量
- `3`: 全局自定义变量
- `4`: 行会变量
3. **回调函数**:必须根据 `synzvar` 的 `id` 参数,在本服的 QF 或全局脚本中定义对应的 `kfsynvar{id}` 函数,用于接收同步完成的通知。
4. **服务器判断**:脚本中必须用 `checkkuafuserver()` 判断当前执行环境,以决定是“发送指令”还是“执行操作”。
5. **行会变量格式**:传递行会变量时,`astr` 参数需要是 `行会名称/变量名` 的格式。
记住,跨服脚本的逻辑是“**指令在本服发,操作在跨服做,结果回本服**”。先把这几个示例代码理解透,自己动手试试,就能掌握精髓了。如果还有哪里不清楚,随时再来问我!
← 返回问答库