好的,我已经仔细分析了这段996传奇脚本。发现了好几个严重的BUG和一些逻辑/安全隐患,下面逐一说明:

严重BUG(会导致脚本失效或报错)
1. 变量名冲突 - n$zsclIDX1/2/3 在多个地方被覆盖
问题位置: 转生功能_JmB 开头
pascal
GetDBItemFieldValue <$cfg_02B转生功能表(<$STR(n$转生目标读取行)>_10)> idx n$zsclIDX1
问题: 你从CSV的 _10、_12、_14 列读取的是物品ID字符串(如"屠龙"),但使用了 GetDBItemFieldValue ... idx,这个命令是获取物品数据库的 idx 编号。如果CSV里存的是物品名称而不是idx,这里会获取失败。
建议修改:
如果CSV存的是物品名称:直接用 <$cfg_02B转生功能表(...)> 赋值给itemid
如果CSV存的是idx:直接用数值,不需要 GetDBItemFieldValue
2. CheckItemS 和 TakeS 语法错误
问题位置: [@移动端_转生系统_点击转生]
pascal
CheckItemS <$cfg_02B转生功能表(..._10)>#<$cfg_02B转生功能表(..._11)>&...
TakeS ... P10 0 1
问题:
CheckItemS 的正确语法是:CheckItemS 物品名称 数量 或 CheckItemS 物品名称#数量
你用 & 连接多个物品条件不被支持,引擎会报错
TakeS 后面带 P10 参数用法也不正确
正确写法(需分开判断):
pascal
#If
CheckItemS <$cfg_02B转生功能表(..._10)> <$cfg_02B转生功能表(..._11)>
CheckItemS <$cfg_02B转生功能表(..._12)> <$cfg_02B转生功能表(..._13)>
CheckItemS <$cfg_02B转生功能表(..._14)> <$cfg_02B转生功能表(..._15)>
#Act
TakeS <$cfg_02B转生功能表(..._10)> <$cfg_02B转生功能表(..._11)>
TakeS <$cfg_02B转生功能表(..._12)> <$cfg_02B转生功能表(..._13)>
TakeS <$cfg_02B转生功能表(..._14)> <$cfg_02B转生功能表(..._15)>
3. n$转生当前读取行 和 n$转生目标读取行 初始值相同
问题位置: 转生功能_JmB 开头
pascal
Mov n$转生当前读取行 <$GetTypeBRow(cfg_02B转生功能表,3,<$Str(U51)>)>
Mov n$转生目标读取行 <$GetTypeBRow(cfg_02B转生功能表,3,<$Str(U51)>)>
Inc n$转生目标读取行 1
问题: 如果 U51=0(0转),GetTypeBRow 在CSV里找不到 "0" 时返回什么?如果返回空或0,后续 Inc 会变成1,但 当前读取行 还是0或空,导致取数据错位。
建议: 增加容错
pascal
Mov n$转生当前读取行 <$GetTypeBRow(cfg_02B转生功能表,3,<$Str(U51)>)>
IfEqual n$转生当前读取行 0 ; 如果没找到
Mov n$转生当前读取行 1 ; 设为第一行(需要确认你的CSV结构)
EndIf
🟠 逻辑BUG
4. small U51 10 限制了最大9转,但CSV可能有10转数据
如果CSV里配置了10转,但这里判断 <10 才显示按钮,U51=9时显示,转生后变成10,再点NPC就看不到按钮了(但脚本里有个 small U51 10 条件包裹了Button,10转后按钮消失,这是对的)。但转生上限检查用的是:
pascal
not small U51 <$cfg_02B转生功能表(<$Str(n$当前大陆转生结束行)>_3)>
这里 _3 列应该是存最大转数,确保这个值 ≤10。
5. RestRenewLevel 和 RENEWLEVEL 重复使用
pascal
Inc U51 1
RestRenewLevel
RENEWLEVEL <$Str(U51)> 0 0
RestRenewLevel 是清空转生数据
RENEWLEVEL 是设置新转生等级
顺序没问题,但注意 RENEWLEVEL 的第二个参数 0 是保留等级百分比?通常写 0 表示不保留等级百分比,这里配合后面的 CHANGELEVEL -xxx 是对的
6. CHANGELEVEL -xxx 可能把等级扣成负数
如果玩家等级刚好等于扣除值,会变成0级。建议加判断:
pascal
#if
CHANGELEVEL - <$cfg_02B转生功能表(..._9)>
#Act
; 如果扣完等级<1,则设置为1级
IfSmall <$LEVEL> 1
CHANGELEVEL = 1
EndIf
🟡 脚本隐患
7. CSV路径硬编码
NEWREADCSV ..\QuestDiary\0启动触发\cfg_02B转生功能表.csv
确保这个文件存在且格式正确
如果文件不存在,后续所有 <$cfg_02B转生功能表(...)> 都会返回空值
8. 气泡检测脚本 [@转生功能_气泡检测] 未触发
这个段没有在NPC主界面被调用,需要外部(如登录脚本、定时器)来调用 Goto @转生功能_气泡检测
DelbutShow 和 AddbutShow 配合使用没问题,但 n80=3 硬编码,建议用变量动态计算
9. 字符串变量未清理
Mov S60 <$Str(U51)> 赋值后没使用,可能是调试残留。
10. 注释掉的封号/称号刷新
pascal
;;;;========#Call [\03登录触发\02称号属性刷新.txt] @称号属性刷新QMFB
转生后如果不刷新属性,玩家属性不会立即生效,建议取消注释