传奇沙城主奖励脚本漏洞分析 无限领取问题修复教程

来源: 作者: 点击:
核心问题定位:沙城主可无限领取老区奖励,根源在于脚本中变量操作错误、逻辑校验缺失两大漏洞。以下从全脚本漏洞拆解、成因分析、针对性修复方案、部署测试步骤四方面,给出详细操作指南,新手可按步骤直接修复。

一、核心漏洞定位:老区奖励无限领取的2个关键问题

老区奖励对应脚本[@lqc1]模块(关联变量G211),无限领取的核心原因是“领取后未正确重置控制变量”,叠加“额外变量冗余”,导致每次领取都满足触发条件,具体漏洞位置如下:

漏洞1:领取奖励后,控制变量未递减(最致命)

脚本逻辑设计初衷:用G211变量控制老区奖励领取权限(G211=1可领取,领取后改为0,禁止再次领取)。但实际代码中,领取奖励后执行的是“DEC G212 1”,而非“DEC G211 1”——变量名错误(把G211写成G212),导致G211始终保持1,每次触发都满足“EQUAL G211 1”的领取条件,从而实现无限领取。

关键代码对比:

// 原错误代码(@yd模块领取老区奖励后)
dec g212 1 // 错误:递减的是未定义的G212变量,G211仍为1
// 正确代码应改为
dec g211 1 // 递减控制变量G211,领取后变为0,禁止再次领取

漏洞2:G212变量未定义,属于冗余无效代码

全脚本中仅在“DEC G212 1”处出现G212变量,无任何“MOV G212 1”之类的赋值操作,属于完全未定义的冗余变量。该变量既不参与权限控制,也不关联其他逻辑,本身无实际作用,反而因替换了正确的G211变量,直接引发无限领取漏洞。

二、全脚本其他潜在漏洞拆解(避免后续问题)

除核心的无限领取漏洞外,脚本还存在3处潜在问题,若不修复可能导致奖励发放异常、权限混乱等问题,具体如下:

潜在问题1:时间检测逻辑不完整,缺少“分钟上限闭合”

脚本中时间检测用“HOUR 22 22”“MIN 1 59”,看似限制10:01-10:59领取,但部分服务端“MIN”命令需完整闭合(末尾加“0”),否则可能出现23点后仍能领取的情况。建议补充完整格式,确保时间校验精准。

潜在问题2:新区/合区奖励变量未做初始值校验

[@qc]模块中“mov g211 1”、[@qlsc]模块中“mov g25 1”,仅做变量赋值,未先检测变量当前值。若手动修改过变量(如G211已为1),重复执行该命令可能导致变量异常,建议添加“EQUAL 变量名 0”的前置判断,避免重复赋值。

潜在问题3:奖励发放成功后无“变量锁定”,存在重复触发风险

领取奖励的核心逻辑(@g2sc、@yd模块)中,仅在领取后递减变量,但未在触发时添加“变量二次校验”。极端情况下(如服务器卡顿),可能出现同一时间多次触发领取的情况,建议在时间检测后补充变量校验。

三、针对性修复方案(完整修复后脚本代码)

修复思路:1. 修正老区奖励领取后的变量递减错误;2. 补全时间检测逻辑;3. 完善变量初始赋值校验;4. 增加领取时变量二次校验;5. 删除冗余无效变量G212。以下是完整修复后的脚本代码(含注释说明):

[@main]
#IF
ISADMIN
#SAY
<新区清除所有奖励数据/@qc>
<合区首次奖励清理/@qlsc> \ ;
<老区每日奖励清理/@qllq> \
<提交所有行会于今晚攻城/@jwg>\ \
<查看奖励/@lq> \
#ELSEact
goto @lq

[@qc]
#ACT
// 修复:添加变量初始值校验,仅当G211为0时才赋值为1,避免重复操作
#IF
EQUAL G211 0
#ACT
mov g211 1 // 控制新区奖励领取权限,1=可领取,0=不可领取
BREAK

[@qlsc]
#ACT
// 修复:添加变量初始值校验,仅当G25为0时才赋值为1
#IF
EQUAL G25 0
#ACT
mov g25 1 // 控制合区首次奖励领取权限,1=可领取,0=不可领取
BREAK

[@jwg]
#IF
#SAY
所有行会将于今晚同时攻城!
#ACT
AddAttackSabukAll 0
BREAK

[@lq]
<攻城奖励请当天晚上攻沙结束11点之前来领取,未领取过时间后果自负!>\
开区第3天 奖励1套顶级+8000点+城主2套+1.8倍坠一个\ ;
开区第2天奖励 会员2个 金阳星璨各一套 200易点\
<两个沙城主只能有一个可以领取,领取后请大家自己分配奖励>\
<领取奖励/@lqc1>\ \
<合区首次功沙奖励10000易点> <领取/@lqc>\ ;
<老区每日城主奖励200易点> <领取/@lqc1>\

[@lqc]
#IF
// 检测合区奖励控制变量G25是否为0,0则跳转到奖励已发放
EQUAL g25 0
#act
goto @wb
#IF
// 检测G25等于1(可领取状态)
equal g25 1
#act
goto @g2sc

[@g2sc]
#IF
// 修复:补全时间检测闭合逻辑,确保仅10:01-10:59可领取
HOUR 22 22
MIN 1 59 0
// 修复:添加变量二次校验,避免重复触发
EQUAL G25 1
// 检测是否为沙城主
ISCASTLEMASTER
#act
GameGold + 10000
// 领取后递减G25,关闭领取权限
DEC G25 1
sendmsg 0 沙城主%s,已经成功领取攻城奖励!
sendmsg 0 沙城主%s,已经成功领取攻城奖励!
BREAK
#elseact
messagebox 您不是沙巴克城主,或者已经超过了时间.请在晚上10点到11点之间来找我.

[@lqc1]
#IF
// 检测老区奖励控制变量G211是否为0,0则跳转到奖励已发放
EQUAL g211 0
#ACT
goto @wb
#IF
// 检测G211等于1(可领取状态)
equal g211 1
#act
goto @yd

[@yd]
#IF
// 修复:补全时间检测闭合逻辑
HOUR 22 22
MIN 1 59 0
// 修复:添加变量二次校验,避免重复触发
EQUAL G211 1
// 检测是否为沙城主
ISCASTLEMASTER
#act
give 城主之刃 2
give 城主战甲(男) 1
give 城主战甲(女) 1
give 1.8倍坠 1
give 秒杀一切㊣盾 1
give 秒杀一切㊣盔 1
give 秒杀一切㊣镯 2
give 秒杀一切㊣戒 2
give 秒杀一切㊣靴 1
give 秒杀一切㊣带 1
give 秒杀一切㊣石 1
give 秒杀一切㊣链 1
give 绝对防御甲 1
give 无敌秒杀刃 1
GameGold + 8000
// 修复:将错误的DEC G212 1改为DEC G211 1,领取后关闭权限
dec g211 1
sendmsg 0 沙城主%s,已经成功领取攻城奖励!
sendmsg 0 沙城主%s,已经成功领取攻城奖励!
sendmsg 0 沙城主%s,已经成功领取攻城奖励!
sendmsg 0 沙城主%s,已经成功领取攻城奖励!
BREAK
#elseact
messagebox 您不是沙巴克城主,或者已经超过了时间.请在晚上10点到11点之间来找我.

[@wb]
#act
messagebox 沙城主奖励已经发放完毕.
break

四、修复核心要点说明(确保理解不踩坑)

1. 核心漏洞修复关键步骤

- 步骤1:找到[@yd]模块中“dec g212 1”代码,直接替换为“dec g211 1”——这是解决老区奖励无限领取的核心,确保领取后G211从1变为0,再次触发时会跳转到[@wb]模块提示“奖励已发放完毕”。

- 步骤2:删除全脚本中所有与G212相关的代码(仅“dec g212 1”一处),该变量未定义且无实际作用,属于冗余代码,删除后避免后续混淆。

2. 潜在问题修复补充说明

- 时间检测补全:在[@g2sc]和[@yd]模块的“MIN 1 59”后添加“0”,完整格式为“MIN 1 59 0”,部分服务端(如GEE)要求“MIN”命令需带闭合参数,否则时间校验失效。

- 变量初始赋值校验:在[@qc]和[@qlsc]模块的“mov”命令前添加“EQUAL 变量名 0”判断,避免重复执行赋值命令导致变量异常(如多次执行[@qc]模块,G211仍保持1,不影响使用,但规范操作可减少隐患)。

- 领取时变量二次校验:在[@g2sc]和[@yd]模块的时间检测后添加“EQUAL 控制变量 1”(如[@yd]添加“EQUAL G211 1”),避免服务器卡顿导致的重复触发领取。

五、脚本部署路径与测试步骤(确保修复生效)

1. 脚本文件存放与部署路径

修复后的完整脚本,需存放在服务端根目录的“QuestDiary”文件夹下,建议命名为“SabukRewardFix.txt”(便于区分原脚本)。部署步骤:

- 第一步:打开“QuestDiary”文件夹下的“QFunction-0.txt”(脚本主入口文件),在文件末尾添加代码:#INCLUDE ..\QuestDiary\SabukRewardFix.txt,保存关闭。

- 第二步:若原脚本已导入其他文件,需先删除原脚本的导入代码(避免冲突),仅保留修复后脚本的导入路径。

- 第三步:重启服务端(确保变量重置,修复后的逻辑生效)。

2. 测试步骤(快速验证修复效果)

- 测试1:老区奖励无限领取修复验证。① 用沙城主账号登录,执行“查看奖励→领取老区奖励”,确认奖励正常到账;② 再次点击“领取老区奖励”,应提示“沙城主奖励已经发放完毕”,说明G211变量已正确递减为0,修复生效。

- 测试2:时间限制验证。① 手动修改脚本中时间检测为当前时间(如当前15:30,改为“HOUR 15 15”“MIN 30 35 0”);② 沙城主账号领取奖励,确认可正常领取;③ 等待到15:36,再次领取,应提示“超过时间”,说明时间校验生效。

- 测试3:非沙城主领取验证。① 用普通玩家账号登录,点击“领取奖励”,应提示“您不是沙巴克城主”,说明权限校验生效。

六、拓展避坑技巧(避免后续脚本出现同类问题)

- 1. 变量命名规范:控制不同奖励的变量建议按“奖励类型+序号”命名(如新区奖励G211、合区奖励G25、每日奖励G26),避免混淆,减少变量名写错的概率。

- 2. 领取逻辑通用模板:所有奖励领取脚本建议遵循“变量校验→权限校验→时间校验→发放奖励→变量递减”的逻辑,确保每一步都有闭环,避免出现权限漏洞。

- 3. 冗余代码清理:编写脚本后,逐一检查未定义的变量、无效命令(如未使用的变量、重复的赋值操作),及时删除,减少脚本运行负担和漏洞风险。

整体而言,该脚本的核心漏洞是变量操作错误(G211写成G212),属于基础但致命的编写失误。按上述修复方案操作后,可彻底解决老区奖励无限领取问题,同时补全潜在漏洞,确保奖励发放逻辑稳定。若服务端为特殊版本(如GOM、BLUE),仅需微调时间检测命令格式(参考对应服务端的脚本命令手册)即可。