传奇沙城主奖励脚本无限领取漏洞分析与修复

来源: 作者: 点击:
该脚本存在严重的逻辑错误与变量使用错误,导致沙城主可以无限领取老区每日奖励([@lqc1]段),核心问题在于检测变量错误和变量初始化缺失。

漏洞一:核心检测变量使用错误
在[@lqc1]奖励段,脚本使用了错误的变量进行检测。
[@lqc1]
if

EQUAL g211 0
ACT

goto @wb
if

equal g211 1
act

goto @yd
问题分析:此段意图检测变量g211。当g211为1时,允许跳转到领取段[@yd]。然而,在顶部的管理员菜单[@qc]中,执行的是mov g211 1(将g211设为1)。在领取段[@yd]末尾,执行的却是dec g212 1(将变量g212减1)。检测变量(g211)与扣减变量(g212)完全不匹配。
导致结果:领取奖励时,脚本只检测g211是否为1,但从未对g211进行扣减操作。因此,只要管理员执行过一次[@qc](新区清除),g211就永久等于1。任何符合条件的沙城主都可以无限次触发[@yd]段领取奖励。

漏洞二:老区每日奖励清理功能缺失
在管理员选项[@qllq](老区每日奖励清理)中,只有菜单显示,没有对应的执行标签(如[@qllq])和脚本内容。
[@main]显示: <老区每日奖励清理/@qllq>
但在后续脚本中,找不到[@qllq]这个标签。这导致管理员无法重置每日奖励的变量,进一步加剧了奖励可以每日重复无限领取的问题。

漏洞三:合区首次奖励的变量管理缺陷
合区首次奖励段[@lqc]使用变量g25控制,逻辑基本正确:检测g25为1可领取,领取后DEC G25 1。
潜在问题:g25变量在管理员菜单[@qlsc]中通过mov g25 1进行设置。如果合区后管理员误操作或重复执行该命令,会导致变量被重置为1,可能造成奖励被重复领取。

漏洞四:时间检测的冗余与错误
在[@g2sc]和[@yd]段,时间检测命令为:
HOUR 22 22
MIN 1 59
问题:MIN 1 59命令的参数顺序错误。标准格式应为MIN 最小值 最大值,即检测分钟是否在1至59之间。但某些引擎解释可能不同,正确的写法应为MIN 1 59,意在排除0分钟(即22:00整点)。但更严谨的写法是HOUR 22和MIN 1 59。不过,此问题非无限领取主因。

完整修复方案
1. 修正变量体系:统一领取检测与扣减的变量。针对老区每日奖励([@lqc1]和[@yd]),应将检测和扣减都作用于同一个变量,例如g212。
◦ 修改管理员初始化命令:将[@qc]段中的mov g211 1改为mov g212 1,用于初始化每日奖励。

◦ 修改领取检测条件:将[@lqc1]段中的EQUAL g211 0和equal g211 1,全部改为检测g212。

◦ 确保扣减正确:[@yd]段中的dec g212 1保持不变。这样,每领取一次,g212减1,当减为0后无法再次领取。

2. 补全管理员重置功能:增加[@qllq]标签,用于每日重置奖励变量。
[@qllq]
act

mov g212 1
SENDMSG 0 老区每日沙城奖励数据已重置。
注意:实际运营中,此功能应配合游戏内每日定时任务(如通过机器人脚本AutoRunRobot)自动执行,而非手动。

3. 加固合区奖励变量:合区奖励变量g25应设置为上线一次性脚本初始化,或在管理员执行[@qlsc]后立即保存到文件(SAVEVAR G25 ..\QuestDiary\数据文件\沙城变量.txt),并在检测时读取,防止因GM命令重复执行导致变量重置。

4. 修正时间检测命令(根据所用引擎手册核实):
将MIN 1 59改为引擎支持的正确格式,例如CheckRangeMinute 1 59或MIN 1 59(若引擎支持)。

修复后的关键脚本段示例(老区每日奖励部分)
[@qc] ;新区清除
act

mov g212 1 ;初始化每日奖励变量

[@qllq] ;老区每日清理
act

mov g212 1 ;每日重置每日奖励变量
SENDMSG 0 老区每日沙城奖励数据已重置。

[@lqc1] ;玩家领取入口
if

EQUAL g212 0 ;检测是否还有领取次数
ACT

goto @wb ;无次数则跳转提示完毕
if

equal g212 1 ;有领取次数
act

goto @yd ;跳转领取

[@yd] ;执行领取
if

HOUR 22 22
MIN 1 59
ISCASTLEMASTER
act

;...(发放奖励物品)
GameGold + 8000
dec g212 1 ;扣减奖励次数,关键!
sendmsg 0 沙城主%s,已经成功领取今日攻城奖励!
elseact

messagebox 您不是沙巴克城主,或者已经超过了时间.请在晚上10点到11点之间来找我.

总结:原脚本最致命的错误是检测变量与扣减变量不一致,导致扣减操作形同虚设。修复核心是统一变量,并补全管理功能。