详细讲解一下在官方原版引擎中添加保存自定义数据类型有哪些,需要详细讲解每种类型的特征、流程以及何时我们会用到自定义数据以及设置自定义数据时是否会给客户端发送消息(无论是通知性消息还是具体设置的数据发送)请明确的告知。
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-02 20:49:40 |
👁️ 阅读: 8
在官方原版引擎中,添加保存自定义数据类型主要涉及以下几种方式:
### 1. 个人标识变量(个人标记)
- **特征**:整数型个人变量,可保存800个(编号000-799),每个变量只有0和1两种状态。
- **流程**:使用 `check(actor, 标识号, 值)` 进行检测,使用 `set(actor, 标识号, 值)` 进行设置。也可以通过 `flag(actor, 标识号)` 获取常量值。
- **使用场景**:常用于记录玩家是否完成某个一次性任务、领取过某个奖励等简单的布尔状态。
- **客户端消息**:设置时不会主动向客户端发送消息,客户端需要通过特定接口(如条件表使用格式 `<$FLAG(100)>`)或事件来查询或响应状态变化。
### 2. 系统预定义变量(A、G、S、N、U、T)
- **特征**:
- `A` (字符型全局变量):可保存1000个(A0-A999)。
- `G` (数字型全局变量):可保存1000个(G0-G999),支持Int64。
- `S` (字符型个人变量):下线不保存,1000个(S0-S999)。
- `N` (数字型个人变量):下线不保存,1000个(N0-N999)。
- `U` (数字型个人变量):可保存1000个(U0-U999),存放在数据库,支持Int64。
- `T` (字符型个人变量):可保存1000个(T0-T999),存放在数据库。
- **流程**:通过 `sethumvar(actor, 变量名, 变量值)` 设置,通过 `gethumvar(actor, 变量名)` 获取。对于需要保存的临时变量(如N、S),可使用 `savehumvar(actor, 变量名)` 进行保存。
- **使用场景**:
- `A`/`G`:用于全服共享的数据,如全服活动状态、全局计数器。
- `U`/`T`:用于需要持久化存储的个人数据,如玩家累计登录天数、个人配置字符串。
- `N`/`S`:用于临时存储会话过程中的数据,如下线即清除的临时状态。
- **客户端消息**:设置这些变量本身不会主动向客户端发送消息。但可以通过 `Var_CustToClient.xls` 配置表,将指定的自定义变量下发到客户端,客户端可通过监听 `LUA_EVENT_ACTOR_CUSTDATA_UPDATE` 等事件或通过 `SL:GetValue` 接口获取。
### 3. 自定义临时变量(扩展S/N变量)
- **特征**:在标准S/N变量基础上扩展,变量名支持自定义后缀(如 `N$任意字符`、`S$任意字符`)。
- **流程**:使用 `sethumvar(actor, "N$自定义名", 值)` 或 `sethumvar(actor, "S$自定义名", 值)` 进行设置。同样可以使用 `savehumvar` 保存,使用 `sorthumvar` 进行排序查询。
- **使用场景**:当预定义的1000个N/S变量不够用,或需要更灵活命名的临时变量时使用。
- **客户端消息**:同系统预定义变量,默认不主动发送,可通过配置表下发。
### 4. 缓存型自定义变量
- **特征**:变量会加载到缓存,支持通过类型、主键、变量名定义。类型11为自定义使用,变量主键可关联角色ID等以实现获取离线玩家变量。
- **流程**:
1. 使用 `defcustvar(type, varKey, varName, isSave)` 声明变量。
2. 使用 `setcustvar("type_varKey_varName", value)` 设置。
3. 使用 `getcustvar("type_varKey_varName")` 获取。
- **使用场景**:**仅在需要获取离线玩家变量时使用**,例如查询离线玩家的某项累计数据。常规功能不建议使用,以避免缓存占用过多。
- **客户端消息**:设置操作本身不会主动向客户端发送消息。数据如需客户端感知,需通过其他接口或事件同步。
### 5. 对象自定义变量(setint/setstr 等新增接口)
- **特征**:支持为玩家、物品、门派等对象设置保存型(`setint`/`setstr`)或临时型(`settempint`/`settempstr`)的整型/字符串变量,支持设置限时时间。
- **流程**:
- 保存型:`setint(actor, key, value)` / `getint(actor, key)`。
- 临时型:`settempint(actor, key, value)` / `gettempint(actor, key)`。
- 可使用 `setvarlimittime` 为保存型变量设置限时。
- **使用场景**:为游戏对象附加灵活的、结构化的自定义数据,如物品的附加信息、玩家的进度标记等。
- **客户端消息**:默认不主动发送。可通过 `Var_CustToClient.xls` 配置表将指定变量下发至客户端。
### 6. 玩家自定义数据(JSON/字符串格式)
- **特征**:专为玩家设计的自定义数据存储,支持JSON格式(`setplayercustjosndata`)和字符串格式(`setplayercustdata`)。
- **流程**:
- JSON格式:`setplayercustjosndata(actor, key, value)`,value为JSON字符串。
- 字符串格式:`setplayercustdata(actor, value)`。
- **使用场景**:存储需要客户端展示或使用的复杂玩家数据,如自定义外观配置、个人成就数据等。
- **客户端消息**:**会发送给客户端**。客户端在查看目标玩家信息(`SL:RequestLookPlayer`)时,可触发 `LUA_EVENT_RESPONSE_LOOK_PLAYER_INFO` 事件,并通过 `SL:GetValue("L.M.CUSTOM_DATA", key)` 获取对应的自定义数据。
### 总结与何时使用
- **简单状态标记**:使用**个人标识变量**。
- **全服或持久化个人数据**:使用**系统预定义变量**(A/G/U/T)。
- **会话临时数据**:使用**系统预定义变量**(N/S)或**自定义临时变量**。
- **需离线查询的复杂数据**:谨慎使用**缓存型自定义变量**。
- **为游戏对象附加灵活属性**:使用**对象自定义变量**(setint/setstr系列)。
- **需与客户端同步的复杂玩家数据**:使用**玩家自定义数据(JSON格式)**。
**关于客户端消息**:除“玩家自定义数据(JSON格式)”在特定操作(如查看玩家)时会同步到客户端外,其他类型的自定义变量在设置时**默认都不会主动向客户端发送消息**。若需要客户端感知变量变化,必须通过 `Var_CustToClient.xls` 配置表进行映射下发,或由服务器主动调用其他通知接口(如 `sendmsg`)或触发客户端事件。
← 返回问答库