详细讲解一下在官方原版引擎种添加保存自定义数据的流程以及何时我们会用到自定义数据。以及设置自定义数据时是否会给客户端发送消息(无论是通知性消息还是具体设置的数据发送)请明确的告知。
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-02 20:46:41 |
👁️ 阅读: 16
在官方原版引擎中,添加保存自定义数据的流程主要涉及使用特定的变量系统和接口。以下是详细的流程和说明:
### 一、保存自定义数据的流程
#### 1. 使用系统变量(保存型)
引擎提供了多种可保存的变量类型,用于存储自定义数据:
* **字符型全局变量 (A)**:可保存1000个(A0 - A999),服务器重启后保留。
* **数字型全局变量 (G)**:可保存1000个(G0 - G999),支持Int64,服务器重启后保留。
* **数字型个人变量 (U)**:可保存1000个(U0 - U999),存放在数据库,角色下线后保留。
* **字符型个人变量 (T)**:可保存1000个(T0 - T999),存放在数据库,角色下线后保留。
* **个人标记 (Flag)**:可保存800个(000-799),整数型,只有0和1两种状态,角色下线后保留。
**设置与获取示例(以N、S、A、G为例):**
```lua
-- 设置变量
sethumvar(actor, "N1", 1) -- 设置数字型个人变量N1
sethumvar(actor, "S1", "value") -- 设置字符型个人变量S1
sethumvar(0, "A1", "AAA") -- 设置字符型全局变量A1(actor参数为0)
sethumvar(0, "G1", 111) -- 设置数字型全局变量G1(actor参数为0)
-- 获取变量
local N1_val = gethumvar(actor, "N1")
local S1_val = gethumvar(actor, "S1")
local A1_val = gethumvar(0, "A1")
local G1_val = gethumvar(0, "G1")
```
**个人标记操作示例:**
```lua
-- 检查并设置个人标记
if check(actor, 001, 1) then
print("1")
else
print("0")
set(actor, 001, 1)
end
-- 获取个人标记常量
print(flag(actor, 100))
```
#### 2. 使用自定义临时变量(需手动保存)
对于字符变量S和数字变量N,可以通过`sethumvar`接口进行扩展,但默认**下线不保存**。如需永久保存,必须调用`savehumvar`接口。
* **变量名格式**:字符临时变量以 `S$` 开头,后面可增加任意字符;数字临时变量以 `N$` 开头。
```lua
sethumvar(actor, "N$自定义数字", 123)
savehumvar(actor, "N$自定义数字") -- 手动保存到数据库
```
#### 3. 使用玩家自定义数据接口
引擎提供了专门用于设置玩家自定义数据的接口,数据格式可以是字符串或JSON。
* **设置自定义玩家数据(字符串格式)**:`setplayercustdata(actor, value)`
* **设置自定义玩家数据(JSON格式)**:`setplayercustjosndata(actor, key, value)`,其中`key`禁止使用大写字母。
**JSON格式数据示例(服务端设置):**
```lua
setplayercustjosndata(actor, "测试1", "abc")
```
**客户端获取该数据的方法:**
1. 客户端调用 `SL:RequestLookPlayer` 查看目标玩家信息。
2. 监听事件 `LUA_EVENT_RESPONSE_LOOK_PLAYER_INFO`。
3. 在事件回调中通过 `SL:GetValue("L.M.CUSTOM_DATA", "key")` 获取对应的自定义数据。
#### 4. 使用缓存型自定义变量(高级用法)
通过`defcustvar`声明自定义变量,适用于需要获取离线玩家变量的特殊场景。常规功能**不建议**大量使用,应优先使用T、U、N、S变量或`setint`/`setstr`接口。
* **语法**:`defcustvar(type, varKey, varName, isSave)`
* **注意**:变量名不要以G、A、N、S、T、U开头,避免与系统变量重复。
### 二、何时会用到自定义数据
自定义数据在游戏开发中用途广泛,主要用于记录和追踪游戏状态,例如:
1. **记录玩家进度**:如任务完成阶段、副本通关次数、活动参与状态等。
2. **存储游戏配置或状态**:如玩家个人设置、开关状态、临时标记等。
3. **实现复杂功能逻辑**:如需要持久化存储的计数、标识、特定字符串或JSON结构数据。
4. **排行榜与排序**:结合`sorthumvar`或`sorthumvarex`接口,对玩家的自定义变量(如“N$元宝”)进行排序,用于生成排行榜。
5. **跨会话持久化**:任何需要在玩家下线后、服务器重启后依然保留的数据。
### 三、设置自定义数据时是否会给客户端发送消息
**是的,部分接口在设置自定义数据时,会向客户端发送消息或触发数据同步,但并非所有接口都如此。**
1. **明确会发送消息/触发同步的情况:**
* **玩家自定义数据 (JSON/字符串格式)**:当服务端使用`setplayercustjosndata`或`setplayercustdata`设置数据后,**客户端需要主动请求查看玩家信息**(`SL:RequestLookPlayer`)并监听相应事件(`LUA_EVENT_RESPONSE_LOOK_PLAYER_INFO`)才能获取到数据。这是一种“请求-响应”模式的数据发送。
* **自定义广播数据**:使用`setrefdata`接口设置的数据(支持0-9共10个int数据),当其值发生变化时,**客户端会收到广播**。客户端可通过`SL:GetValue(ACTOR_GM_DATA_BY_ID, actorID, key)`获取,并监听事件`LUA_EVENT_ACTOR_GMDATA_UPDATE`。
* **自定义变量下发**:引擎支持通过`Var_CustToClient.xls`表配置自定义变量下发。当这些变量变化时,数据会同步到客户端。
2. **不会自动发送消息的情况:**
* 大部分**系统变量(A、G、U、T、个人标记)** 和通过`sethumvar`设置的**自定义临时变量(N、S)**,其设置和保存主要在服务端完成。除非通过特定的客户端接口(如查看信息)或配置了变量下发,否则**不会主动将变量值发送给客户端**。客户端通常通过其他游戏界面或功能间接感知这些数据变化的结果(如属性变化、物品变化等)。
**总结**:是否需要以及如何将自定义数据发送给客户端,取决于你使用的具体接口和功能设计。玩家自定义数据接口和自定义广播数据接口设计有对应的客户端同步机制,而常规的变量操作则主要用于服务端逻辑处理,客户端同步需要额外配置或通过其他方式触发。
← 返回问答库