上次说了一些版本优化的东西,这次以我的方式简单举一个例子,目的只有一个,简化脚本,省去不必要的GOTO,减轻引擎负担!

应该说很多GM们都碰到过脚本死循环的例子。除了很意外的错误之外,一般的解决方法都是修改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太多的话对引擎的负荷是很明显的,也是最容易出现脚本死循环的地方!包括站里我以前发的一些脚本或者最近有GM也提出这么个问题,毕竟我也是一腔热血嘛!希望用到之前脚本的来看看这个技术!

最后我们来总结一下,要简化一个脚本应该注意什么!我认为我的脑袋瓜子应该是挺好使的!但是真的我文采不好,说不出个一二三来,我也只能说如果检测条件多的话难检测的条件应该是在最上面的,因为脚本都是一级一级往下执行的!同时要善于运用break,少用#ELSEACT+@goto!希望碎痕斑斑和walk斑斑或者站内的高手们能补充一下

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。