- 打卡等级:魔龙套勇士
- 打卡总天数:130
- 打卡月天数:23
- 打卡总奖励:14868
- 最近打卡:2025-08-23 00:38:01
管理员
本站站长
- 积分
- 8650
|
在 GEE 引擎中校验数据格式,核心是通过脚本函数对数据的字段完整性、类型合法性、数值范围进行检查,避免因格式错误导致排行榜、任务系统等功能异常。以下是具体实现方法、常用函数及完整案例:
一、数据校验的核心目标
针对结构化数据(通常用|分隔字段,如玩家ID|角色名|等级|金币),需验证:
字段数量正确(如等级榜必须包含 3 个字段:ID | 名称 | 等级);
数据类型匹配(如玩家 ID、等级必须为数字,角色名不能含特殊字符);
数值范围有效(如等级≥1、金币≥0,避免负数或异常值)。
二、GEE 引擎常用校验函数
函数 功能说明 示例
SPLIT <源字符串> <分隔符> <变量1> <变量2>... 按分隔符拆分字符串到变量 `SPLIT %Data " " %UID %Name %Lev`
STRISNUM <字符串> <结果变量> 判断字符串是否为纯数字(1 = 是,0 = 否) STRISNUM %Lev %IsNum
CHECKFILE <文件路径> 检查文件是否存在(返回真 / 假) CHECKFILE Rank\Wealth.txt
LOADTEXT <文件路径> <行号> <变量> 读取文件指定行内容到变量 LOADTEXT Rank\Wealth.txt 1 %Line1
DELTEXT <文件路径> <行号> 删除文件指定行 DELTEXT Rank\Wealth.txt 5
WRITETEXT <文件路径> <内容> [A] 写入内容到文件(A = 追加模式) WRITETEXT Log.txt "错误日志" A
三、完整校验流程(以财富榜为例)
财富榜数据格式要求:玩家ID|角色名|金币数量,需校验:
必须包含 3 个字段;
玩家 ID 和金币为纯数字;
金币≥0。
1. 脚本文件与执行时机
在AutoRunQuest.txt中配置定时校验(每 10 分钟执行一次),避免高频消耗资源:
ini
#IF
TIMETICK 600 ; 每600秒(10分钟)执行一次
#ACT
; 调用校验子函数
GOSUB CheckWealthData ; 跳转到校验逻辑
2. 校验子函数实现
ini
; 子函数:校验财富榜数据
Sub CheckWealthData
; 步骤1:检查数据文件是否存在,不存在则创建
CHECKFILE Rank\Wealth.txt
#IF
NOT TRUE ; 文件不存在
#ACT
WRITETEXT Rank\Wealth.txt "" ; 创建空文件
WRITETEXT Rank\CheckLog.txt "[%TIME%] 财富榜文件不存在,已创建空文件" A
#ELSE
; 步骤2:遍历文件每行数据(假设最多50行)
FOR %Line 1 50
LOADTEXT Rank\Wealth.txt %Line %Data ; 读取第%Line行
#IF
%Data = "" ; 空行(已到文件末尾)
#ACT
BREAK ; 跳出循环
#ELSE
; 步骤3:拆分字段(玩家ID|角色名|金币)
SPLIT %Data "|" %UID %Name %Gold
; 步骤4:校验字段数量(必须为3个)
#IF
%UID = "" OR %Name = "" OR %Gold = "" ; 存在空字段
#ACT
; 记录错误日志
WRITETEXT Rank\ErrorLog.txt "[%TIME%] 行%Line:字段不完整,数据:%Data" A
DELTEXT Rank\Wealth.txt %Line ; 删除错误行
CONTINUE ; 继续下一行
#ELSE
; 步骤5:校验玩家ID是否为纯数字
STRISNUM %UID %IsUIDNum
#IF
%IsUIDNum = 0 ; 非数字
#ACT
WRITETEXT Rank\ErrorLog.txt "[%TIME%] 行%Line:玩家ID非数字,数据:%Data" A
DELTEXT Rank\Wealth.txt %Line
CONTINUE
#ELSE
; 步骤6:校验金币是否为数字且≥0
STRISNUM %Gold %IsGoldNum
#IF
%IsGoldNum = 0 OR %Gold < 0 ; 非数字或负数
#ACT
WRITETEXT Rank\ErrorLog.txt "[%TIME%] 行%Line:金币无效(需≥0的数字),数据:%Data" A
DELTEXT Rank\Wealth.txt %Line
CONTINUE
#ELSE
; 所有校验通过,无需处理
#ENDIF
#ENDIF
#ENDIF
ENDFOR
; 步骤7:记录校验完成日志
WRITETEXT Rank\CheckLog.txt "[%TIME%] 财富榜校验完成,共检查%Line行" A
#ENDIF
Return ; 结束子函数
四、关键逻辑解析
字段拆分与完整性检查:
通过SPLIT函数将每行数据按|拆分到变量,若任何变量为空(如%UID = ""),则判定为 “字段不完整”,删除该行并记录日志。
数字类型校验:
用STRISNUM判断玩家 ID(%UID)和金币(%Gold)是否为纯数字,防止因字符串混入导致排序错误(如 “abc” 无法与 “123” 比较)。
数值范围限制:
针对金币、等级等属性,通过%Gold < 0等条件排除负数(玩家不可能有负金币),确保数据符合游戏逻辑。
异常处理:
错误数据直接删除(DELTEXT),避免影响排行榜排序;同时写入ErrorLog.txt,便于后续排查(如外挂篡改、脚本 BUG)。
五、扩展与优化
角色名特殊字符过滤:
若需限制角色名格式(如仅字母 / 数字),可结合STRISNAME函数(GEE 部分版本支持):
ini
STRISNAME %Name %IsValid ; 1=合法名称,0=含特殊字符
#IF
%IsValid = 0
#ACT
; 记录错误并删除
批量处理大文件:
若数据超过 50 行,可动态获取文件总行数(需结合FILELINES函数),避免固定循环上限导致漏检。
实时校验补充:
在数据采集时(如玩家获得金币)加入即时校验,减少后续批量校验的压力:
ini
; 玩家获得金币时立即校验
#IF
GIVEGOLD ; 获得金币事件
#ACT
GETGOLD %Gold
#IF
%Gold < 0 ; 异常金币值
#ACT
SETGOLD 0 ; 强制修正为0
WRITETEXT Rank\ErrorLog.txt "[%TIME%] 玩家%Name金币异常,已修正" A
通过以上方法,可在 GEE 引擎中实现稳定的数据格式校验,确保排行榜、任务等依赖结构化数据的功能准确运行。核心是 “提前定义规则→拆分字段→逐字段校验→异常处理 + 日志” 的流程,可根据具体需求(如战力榜、等级榜)调整校验规则。
|
|