前后端交互的接口
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-24 19:27:06 |
👁️ 阅读: 2
我是lua后端老师!
小仙,前后端交互在996引擎中主要通过服务端Lua脚本和客户端之间的通信来实现。以下是几种核心的交互方式和接口,你可以把它们想象成服务器(后端)和玩家电脑(前端)之间的“传声筒”和“遥控器”:
### 1. 客户端调用服务端函数 (前端主动“问话”)
这是最常用的方式。客户端通过 `callServerScript` 函数,可以请求服务端执行指定的Lua函数。
* **客户端调用示例 (JavaScript/AS3)**:
```javascript
// 假设我们有一个名为“BuyItem”的交互
callServerScript("BuyItem", 1001, 5); // 调用服务端`BuyItem`函数,并传递道具ID1001和数量5
```
* **服务端接收处理 (Lua)**:
服务端需要在 `QF` 脚本(通常是 `QFunction-0.txt` 或对应的Lua文件)中,定义一个与客户端调用同名的**标签(`Label`)** 来接收。
```lua
-- 在QF脚本中定义
[@BuyItem]
#act
-- 这里写Lua代码
local itemId = tonumber(%ARG1) -- 获取参数1: 1001
local count = tonumber(%ARG2) -- 获取参数2: 5
release_print("玩家" .. S0 .. "请求购买道具:" .. itemId .. ", 数量:" .. count)
-- 接下来可以进行扣元宝、给物品等逻辑
giveitem(S0, itemId, count)
```
**关键点**:客户端的 `callServerScript` 第一个参数,必须与QF中的 `[@XXX]` 标签名完全一致。
### 2. 服务端主动通知客户端 (后端主动“喊话”)
服务端可以通过一系列接口,主动向客户端发送消息、打开界面、播放特效等。
* **发送消息**:
* `sendmsg(actor, msg, [type])` -- 发送聊天栏消息。
* `sendcustommsg(actor, title, msg)` -- 发送自定义提示框消息。
* `sendtopchatboardmsg(actor, msg)` -- 发送顶部跑马灯消息。
* `sendmsgnew(actor, msg, color, bgcolor, time)` -- 发送新版气泡消息。
```lua
sendmsg(actor, "恭喜你击败了BOSS!", 0) -- 0为普通聊天信息
sendcustommsg(actor, "系统提示", "你的元宝不足!")
```
* **打开界面/窗口**:
* `openwindows(actor, dlgName)` -- 打开客户端预设的UI窗口(如商城、背包等)。
* `openmerchantbigdlg(actor, npcIdx, dlgName)` -- 打开NPC大对话框。
* `openupgradedlg(actor, itemObj)` -- 打开装备升级对话框。
```lua
openwindows(actor, "StorePanel") -- 打开商城界面
```
* **执行客户端效果**:
* `playeffect(actor, effId, x, y)` -- 在指定坐标播放特效。
* `scenevibration(actor, time)` -- 屏幕震动。
* `playsound(actor, soundId)` -- 播放音效。
```lua
playeffect(actor, 1001, 100, 100) -- 在坐标(100,100)播放ID为1001的特效
```
### 3. 通过OK框交换物品数据
OK框是服务端和客户端之间传递物品对象的核心桥梁,常用于强化、合成、交易等。
* **服务端操作OK框**:
* `getboxitem(actor, idx)` -- 获取指定OK框中的物品对象。
* `returnboxitem(actor, idx)` -- 将OK框中的物品返回给玩家背包。
* `delboxitem(actor, idx, num)` -- 删除OK框中的物品。
* `updateboxitem(actor, boxID)` -- 更新OK框物品显示(引擎24.03.14新增)。
```lua
-- 假设玩家将物品放入了1号OK框
local itemObj = getboxitem(actor, 1)
if itemObj ~= nil then
local itemName = getiteminfo(itemObj, 1) -- 获取物品名
release_print("OK框1中的物品是:" .. itemName)
-- 处理逻辑后,可以删除或返回
delboxitem(actor, 1, 1) -- 删除该物品
giveitem(actor, 1002, 1) -- 给予新物品
end
```
### 4. 引擎事件触发 (QF/QM脚本)
这是引擎内置的、由特定游戏行为(如登录、穿戴装备、击杀怪物)自动触发的交互。你在问题中看到的列表就是这些事件。
* **服务端启动**: `startup`
* **玩家登录**: `login`
* **穿戴装备**: `takeon(X)` (X为装备位置)
* **击杀怪物**: `killmon`
* **聊天**: `triggerchat`
* **示例**:
```lua
-- 在QF脚本中
[@login]
#act
release_print("玩家" .. S0 .. "登录了游戏")
sendmsg(S0, "欢迎回来,英雄!")
```
### 5. 变量同步
服务端可以修改玩家的属性、状态,客户端会实时同步显示。
* **修改属性**: `changehumability(actor, “DC”, 10)` -- 增加10点攻击。
* **修改等级/经验**: `changelevel(actor, +/- 等级)`, `changeexp(actor, +/- 经验值)`。
* **设置新属性(NewValue)**: `changehumnewvalue(actor, idx, value)` -- 修改扩展属性值。
### 交互流程总结
1. **客户端触发**:玩家点击按钮(客户端) -> `callServerScript(“FuncName”, …)`。
2. **服务端接收**:请求到达对应的 `[@FuncName]` 标签。
3. **服务端处理**:执行Lua逻辑(检查条件、计算、修改数据库)。
4. **服务端反馈**:通过 `sendmsg`, `openwindows`, `giveitem` 等接口,将结果告知客户端。
5. **客户端响应**:客户端更新界面、播放特效、刷新物品栏。
记住,小仙,**所有与游戏状态改变相关的核心逻辑(如发奖、扣费、判断胜负)都必须放在服务端Lua中执行**,客户端只负责发送请求和展示结果,这样才能保证游戏安全,防止作弊。
如果你在写具体功能时遇到了问题,比如不知道用哪个接口,或者参数怎么传,随时可以问我!咱们一起看看浮生梦师傅留下的“秘籍”。
← 返回问答库