问题出在申请成功段中变量更新顺序和回收命令的取值时机。你现在的脚本是这样写的:
IF
random 1
ACT
GIVEFENGHAO <$USERNAME> 天魔
RECYCFENGHAO <$STR(A7)> 天魔
mov A7 <$USERNAME>
mov G32 <$MAXDC>
mov A9 <$DATETIME>
CLEARNAMELIST ..\QuestDiary\数据文件\天下第一\男战士.txt
addnamelist ..\QuestDiary\数据文件\天下第一\男战士.txt
表面看GIVEFENGHAO先发给新人,RECYCFENGHAO用A7回收旧人,再更新A7。但实际出问题在于两种场景:
场景一:当前最高攻击者自己再点申请。他攻击等于G32,按EQUAL判断会break,正常情况下不会进到回收段。可如果之前G32没存住,或者攻击面板临时浮动导致S0大于S1,就会走进来。此时A7还是他自己,GIVEFENGHAO发给他,RECYCFENGHAO又立刻收他,等于给了就删。这就是你说的“一申请,他又同时给你删除了”。
场景二:新人申请成功。执行顺序是先发新人的封号,再回收旧人的封号。但A7在回收命令之后才被覆盖成新人名字,按说不会删新人。可有些引擎在同一个脚本块里,变量读取不是按行即时展开,而是整块预读,导致RECYCFENGHAO拿到的A7已经是更新后的新人名字,于是旧人没删掉、新人反被删,结果就是两人同时有,或者新人拿到又消失。
修复要两点:一是加一个临时变量P0或A10,在回收前先把A7旧名字存进去,回收用临时变量,避免整块预读冲突;二是进入申请前先判断当前玩家是否已经是A7本人,是就直接提示,不走后面的发号和回收。
给你一版改好的脚本,直接替换[@男战申请]及以后部分:
[@男战申请]
IF
EQUAL A7 <$USERNAME>
ACT
break
say
你就是当前最高攻击男战士,无需重复申请!
<离开/@exit>
IF
small S0 <$STR(G32)>
ACT
break
say
对不起!!你目前还不是最高攻击男战士!
<离开/@exit>
IF
EQUAL S0 <$STR(G32)>
ACT
break
say
对不起!!你目前还不是最高攻击男战士!
<离开/@exit>
ACT
mov P0 <$STR(A7)>
GIVEFENGHAO <$USERNAME> 天魔
RECYCFENGHAO <$STR(P0)> 天魔
mov A7 <$USERNAME>
mov G32 <$MAXDC>
mov A9 <$DATETIME>
CLEARNAMELIST ..\QuestDiary\数据文件\天下第一\男战士.txt
addnamelist ..\QuestDiary\数据文件\天下第一\男战士.txt
SENDMSG 0 %s成功申请了全区最高攻击男战士!他在烽烟四起的<$SERVERNAME>中修炼成为全区最高攻击男战士,明天将会是谁呢?
Gmexecute 全服触发 @全服封号调整
say
申请成功!目前今天的最高攻击男战士是<$USERNAME>!
<离开/@exit>
IF
HAVEGUILD
ACT
mov A8 <$GUILDNAME>
ELSEACT
mov A8 暂无
改动关键:
P0是临时变量,只在当前脚本段有效。mov P0 <$STR(A7)>先把旧名字锁住,不管引擎是逐行读还是整块预读,RECYCFENGHAO用的都是旧名字。GIVEFENGHAO和RECYCFENGHAO的顺序也可以反过来,先收旧再发新,但用P0后顺序无所谓,建议保留先发后收,避免旧玩家下线重登时封号残留。
EQUAL A7 <$USERNAME>判断放在最前面,直接堵死本人重复申请。以前靠checknamelist,但名单可能被清空或写入失败,这个判断更稳。
还有一个坑:原来[@申请第一]里用了两次#IF random 1,一个是恒真,一个是无聊的随机,删掉。random 1在这个引擎里永远判断为成立,不加判断写#ACT就行。低级错误会让脚本走向不可控。
另一个建议:R E C Y C F E N G H A O命令拼写有时候引擎区分大小写,确认你版本里是RECYCFENGHAO还是DELFENGHAO,不同引擎命令不同。如果改完还不生效,去M2命令帮助里搜“封号”,看正确写法。有些引擎回收封号命令是CLEARFENGHAO或DELFENGHAO,参数顺序也不同,有的写人物名在前、封号名在后,有的反过来。
封号变量A7、G32、A9的初始值也要在启动脚本里设好。如果A7为空,G32为0,新玩家第一次申请时S0肯定大于0,能正常写入。如果A7有旧名字但G32没存,所有攻击大于0的都能申请,旧玩家会一直被顶掉。
为了以后旧玩家上线能自动检查,建议在QFunction-0.txt的登录触发里加一段:如果<!EQUAL A7 <USERNAME>>,再比较<MAXDC>和G32,如果小于G32,就RECYCFENGHAO本人封号。不过这不是当前必须,先把你手头的申请流程修好,开区后再加也行。
最后检查QuestDiary\数据文件\天下第一\男战士.txt是否存在,目录不对会导致addnamelist写不进名单。没有这个文件就新建空文本,ANSI编码。
wuduy.com相关标题名和链接:
传奇封号脚本变量冲突 旧封号无法删除修复教程 http://www.wuduy.com/html/jishuwenzhang/chuanqi/183648.html
传奇天下第一脚本排行榜更新 封号自动转移变量写法 http://www.wuduy.com/html/jishuwenzhang/chuanqi/204511.html
传奇脚本回收封号命令RECYCFENGHAO使用详解 http://www.wuduy.com/html/jishuwenzhang/chuanqi/177432.html
传奇GOM引擎QFunction-0登录触发封号检查写法 http://www.wuduy.com/html/jishuwenzhang/chuanqi/211589.html
传奇NPC脚本变量P0与A7使用常见错误修正 http://www.wuduy.com/html/jishuwenzhang/chuanqi/158773.html
传奇封号申请脚本BUG修复:旧封号无法删除与新玩家误删解决
来源:
作者:
点击:

