|  | 
 
上一篇:传奇私服跨时代佩戴指定装备获取封号脚本下一篇:传送员精简美化脚本,适合各类版本,Leg引擎| 应该说很多坛友们都碰到过脚本死循环的例子。除了很意外的错误之外,一般的解决方法都是修改setup文件里的goto循环次数,可是这个方法有时候并不能彻底解决问题,往往是看似解决了但是M2会不定时的出现脚本死循环,此时M2应该是一种假死的状态,对报错的脚本应该是无法执行了,我们此时按照路径去查找怎么看都看不出哪里出错了。包括脚本的一些逻辑什么的都很正确,这该怎么办呢?这就需要我们平时编写的时候养成一个良好的习惯,也可以说是一个良好的手法!下面我会举例说明! 
 
 首先来看一段转生的脚本,这是我之前玩传奇写过的,因为平时没事了我们几个朋友都会聚一块儿玩内服,租个便宜简单的服务器或者自己电脑开一个
 
 [@一转]
 #IF
 CHECKLEVELEX > 54
 #ACT
 goto @一转一
 #ELSESAY
 哦!你的等级还没有55级哦!先升级再说吧
 
 [@一转一]
 #IF
 CHECKRENEWLEVEL < 1
 #ACT
 goto @一转二
 #ELSESAY
 哦!你都进行过一转了还来干吗?
 
 [@一转二]
 #IF
 CHECKGAMEGOLD > 999
 #ACT
 gamegold - 1000
 RENEWLEVEL 1 0 100
 #CALL [\封号系统\封号系统.txt] @封号系统
 #CALL [\封号系统\名字变色.txt] @名字变色
 SendCenterMsg 253 180 恭喜<$USERNAME>一转成功,奖励可自由分配属性点100个!
 #ELSESAY
 哦!你连1000个元宝都没有!等凑足了元宝再说吧!
 
 
 [@二转]
 #IF
 CHECKLEVELEX > 59
 #ACT
 goto @二转一
 #ELSESAY
 哦!你的等级还没有60级哦!先升级再说吧
 
 [@二转一]
 #IF
 CHECKRENEWLEVEL = 1
 #ACT
 goto @二转二
 #ELSESAY
 哦!你还没进行一转就来二转呀!先一转了再说吧!
 
 [@二转二]
 #IF
 CHECKRENEWLEVEL > 1
 #ACT
 Messagebox 错误:你都进行过二转了还来干吗?有病呀你!
 #ELSEACT
 goto @二转三
 
 [@二转三]
 #IF
 CHECKGAMEGOLD > 1999
 #ACT
 gamegold - 2000
 RENEWLEVEL 1 0 200
 #CALL [\封号系统\封号系统.txt] @封号系统
 #CALL [\封号系统\名字变色.txt] @名字变色
 SendCenterMsg 253 180 恭喜<$USERNAME>二转成功,奖励可自由分配属性点200个!
 #ELSESAY
 哦!你连2000个元宝都没有!等凑足了元宝再说吧!
 
 
 大家有木有发现这个脚本有什么漏洞,一般来说没什么问题,各种逻辑什么的都是正确的,但是这里用到了5个goto,因为一转要符合55级以上加1000个元宝,二转要符合60级以上加2000个元宝,并且都要一级级来转,5个goto就代表了5个检测条件,思路很正确,但是何必要用5个goto呢?一定程度上加大了引擎的负荷以及为死循环创造了条件!因为还有另外一种方式,看看是不是更简单一些
 
 [@一转]
 #IF
 CHECKLEVELEX < 55
 #ACT
 Messagebox:哦!你的等级还没有55级哦!先升级再说吧
 break
 
 #IF
 CHECKRENEWLEVEL > 0
 #ACT
 Messagebox:哦!你都进行过一转了还来干吗?
 break
 
 #IF
 CHECKGAMEGOLD > 999
 #ACT
 gamegold - 1000
 RENEWLEVEL 1 0 100
 #CALL [\封号系统\封号系统.txt] @封号系统
 #CALL [\封号系统\名字变色.txt] @名字变色
 SendCenterMsg 253 180 恭喜<$USERNAME>一转成功,奖励可自由分配属性点100个!
 #ELSESAY
 哦!你连1000个元宝都没有!等凑足了元宝再说吧!
 
 
 [@二转]
 #IF
 CHECKLEVELEX < 60
 #ACT
 Messagebox:哦!你的等级还没有60级哦!先升级再说吧
 break
 
 #IF
 CHECKRENEWLEVEL > 1
 #ACT
 Messagebox 错误:你都进行过二转了还来干吗?有病呀你!
 break
 
 #IF
 CHECKGAMEGOLD < 2000
 #ACT
 Messagebox:哦!你连2000个元宝都没有!等凑足了元宝再说吧!
 break
 
 #IF
 CHECKRENEWLEVEL = 1
 #ACT
 gamegold - 2000
 RENEWLEVEL 1 0 200
 #CALL [\封号系统\封号系统.txt] @封号系统
 #CALL [\封号系统\名字变色.txt] @名字变色
 SendCenterMsg 253 180 恭喜<$USERNAME>二转成功,奖励可自由分配属性点200个!
 #ELSESAY
 哦!你都还没一转呢,一转了再来吧!
 
 
 好了来看看这样是不是很简单,一个goto都没有又少了很多个段落,当然这是一个很简单的例子,但是他的实际用途是非常广泛的,这里尤其要是注意的是在一些每秒执行的定时器或者机器人脚本里面这么来写非常重要,每秒执行的脚本如果goto太多的话对引擎的负荷是很明显的,也是最容易出现脚本死循环的地方!包括站里我以前发的一些脚本或者最近有坛友也提出这么个问题,毕竟我也是一腔热血嘛!希望用到之前脚本的来看看这个帖子!
 
 最后我们来总结一下,要简化一个脚本应该注意什么!我认为我的脑袋瓜子应该是挺好使的undefined!但是真的我文采不好,说不出个一二三来,我也只能说如果检测条件多的话难检测的条件应该是在最上面的,因为脚本都是一级一级往下执行的!同时要善于运用break,少用#ELSEACT+@goto!希望碎痕斑斑和walk斑斑或者站内的高手们能补充一下
 
 | 
 |