详细讲解一下在官方原版引擎种添加保存自定义数据的流程以及何时我们会用到自定义数据。
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-05-02 15:35:22 |
👁️ 阅读: 1
在热血江湖官方原版引擎中添加保存自定义数据的流程主要涉及以下几种方式,具体选择取决于数据的用途和保存需求。
### 一、自定义临时变量(下线不保存)
**使用场景**:用于记录玩家在线期间的临时状态,如任务进度、临时标记、副本状态等,这些数据在玩家下线后无需保留。
**流程**:
1. **设置变量**:使用 `sethumvar` 接口。
* 语法:`sethumvar(actor, varName, varValue)`
* 参数:`actor`(玩家对象),`varName`(变量名,字符型以`S$`开头,数字型以`N$`开头),`varValue`(变量值)。
* 示例:`sethumvar(actor, "N$任务进度", 5)`
2. **获取变量**:使用 `gethumvar` 接口。
* 示例:`local val = gethumvar(actor, "N$任务进度")`
3. **如果需要将临时变量转为永久保存**:使用 `savehumvar` 接口。
* 示例:`savehumvar(actor, "N$任务进度")`
### 二、自定义保存型变量(存放在数据库)
**使用场景**:用于需要永久保存的玩家数据,如成就点数、累计登录天数、自定义属性等。
**流程**:
1. **使用引擎内置的T/U变量**:
* `T`(T0-T999):字符型个人变量,存放在数据库。
* `U`(U0-U999):数字型个人变量,存放在数据库,支持Int64。
* **设置**:使用 `sethumvar` 接口,变量名直接写 `T1`、`U1` 等。
* 示例:`sethumvar(actor, "U100", 500)` (设置累计成就点)
* **获取**:使用 `gethumvar` 接口。
* 示例:`local points = gethumvar(actor, "U100")`
2. **使用 `setint` / `setstr` 接口**(新版推荐):
* 这是新增的通用保存型变量接口,功能更灵活。
* **设置**:`setint(actor, "自定义键名", 整数值)` 或 `setstr(actor, "自定义键名", "字符串值")`。
* 示例:`setint(actor, "累计充值", 1000)`
* **获取**:`getint(actor, "自定义键名")` 或 `getstr(actor, "自定义键名")`。
* 示例:`local total = getint(actor, "累计充值")`
3. **设置变量限时**:对于有期限的保存数据,可使用 `setvarlimittime` 接口设置过期时间。
### 三、个人标识变量(只有0和1两种状态)
**使用场景**:用于标记玩家是否完成过某个事件、是否拥有某个状态等布尔型标记,最多800个(000-799)。
**流程**:
1. **检测标记**:使用 `check(actor, 标记ID, 1)`。
* 示例:`if check(actor, 001, 1) then` (检查是否完成新手引导)
2. **设置标记**:使用 `set(actor, 标记ID, 1或0)`。
* 示例:`set(actor, 001, 1)` (标记已完成新手引导)
3. **获取标记常量**(用于条件表等):使用 `flag(actor, 标记ID)`。
* 示例:在条件表中可使用格式 `<$FLAG(100)> == 1` 进行判断。
### 四、缓存型自定义变量(谨慎使用)
**使用场景**:主要用于需要获取**离线玩家**变量的特殊需求。**常规功能不建议使用**,因为默认会加载到缓存,大量使用可能影响性能。常规需求应优先使用T/U变量或`setint`/`setstr`。
**流程**:
1. **声明变量**:使用 `defcustvar(type, varKey, varName, isSave)` 预先声明。
* `type`:变量类型(11为自定义)。
* `varKey`:变量主键(如用角色ID做主键,可实现获取离线玩家变量)。
* `varName`:变量名(不要以G、A、N、S、T、U开头)。
* `isSave`:是否保存(0=不保存,1=保存)。
2. **设置变量**:使用 `setcustvar` 接口。
3. **获取变量**:使用 `getcustvar` 接口。
### 五、自定义玩家数据(用于客户端显示)
**使用场景**:将一些自定义数据(如排行榜额外信息、角色标签)下发到客户端,在查看玩家信息时显示。
**流程**:
1. **服务端设置**:使用 `setplayercustjosndata(actor, key, value)` 接口。
* 示例:`setplayercustjosndata(actor, "战力排名", "全服第10名")`
2. **客户端获取**:
* 客户端调用 `SL:RequestLookPlayer` 查询玩家信息。
* 监听事件 `LUA_EVENT_RESPONSE_LOOK_PLAYER_INFO`。
* 在回调中通过 `SL:GetValue("L.M.CUSTOM_DATA", "key")` 获取数据。
### 何时会用到自定义数据?
1. **扩展游戏功能**:添加新的系统,如成就、签到、家园等,需要记录玩家独有的进度和属性。
2. **任务与活动**:记录任务步骤、活动参与次数、临时状态等。
3. **状态标记**:标记玩家是否触发过某个剧情、是否领取过某奖励等。
4. **数据存储与计算**:存储累计伤害、收集物品数量、自定义属性值等,用于公式计算或条件判断。
5. **客户端信息展示**:将服务器计算的一些个性化数据(如称号、标签、排名)展示给其他玩家查看。
**核心建议**:
* 对于**临时数据**,使用 `sethumvar` 设置 `N$`/`S$` 变量。
* 对于**永久保存的简单数据**,优先使用 `T`/`U` 变量或 `setint`/`setstr`。
* 对于**是/否标记**,使用个人标识变量(`check`/`set`)。
* 仅在需要**获取离线玩家数据**的特殊情况下,才考虑使用缓存型自定义变量。
* 需要**在他人查看角色面板时显示的信息**,使用 `setplayercustjosndata`。
← 返回问答库