精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>已关闭版区>>● Quake>>Quake设置篇>>Q3A脚本编写指南--基础篇

主题:Q3A脚本编写指南--基础篇
发信人: kenjo()
整理人: kenjo(2002-07-09 23:14:49), 站内信件
by nCut.Eli
嗯,很久很久以前,在某个外国网站上,看到了czm老大写的关于脚本的文章。那时候很菜,什么都不懂,感觉老外真是不可思议啊,居然能把那么复杂的各种命令全都搞透,还能做出这样那样的脚本来帮助自己。从那时候起,我钻研脚本的路就开始了.....
下面一段文字适用于还不太了解脚本、它的机制和它的作用的人。不过我希望,你至少明白大多数命令的意思。
当时czm是用这样一段脚本解说的,其具体功能是:按下一个键,切换出rg,放大,当你看见敌人并瞄准松手时,就会自动开枪、恢复视角以及切换成之前那把枪。脚本如下(原版的记不住了,一下是原创没有版权问题):
首先,为了记住你上一次使用的枪,需要设定一个变量,这里用prevweapon,并且把它的值的设定绑定在每把枪上。譬如你用q做炮:
bind q "weapon 5;set prevweapon weapon 5"
然后是具体动作的脚本了。先设定一个摁下一个键的动作。
set sniper_hold "weapon 7;+zoom"
weapon 7是RG,+zoom是放大,呵呵,有点废话。之后是放开这个键的动作。
set sniper_release "+attack;wait;-attack;-zoom;vstr prevweapon"
这句话里,+attack是攻击,-attack是停止攻击。为什么非得这么写呢?因为在Quake3里,和Zoom,Speed一样,attack分两个状态,当你把它独自绑定在一个键上,摁下代表+attack,松开就是-attack,在这里,由于不是这样的一个键上的单独绑定,+attack就会使“小人儿”处于攻击状态,不停的开枪。所以之后要加一个-attack。为了防止-attack在+attack还没发生做用的时候执行,所以在中间加了一个wait。其实还可以加更多。如果你本来就开了一枪,那么+attack这个状态将在装子弹不能攻击的时候发生作用,而-attack发生作用的时候,根本就没有开枪。根据自己的情况,可以将其改为wait 20之类,这相当于你写20个wait:)。
-zoom没什么说的。接下来的一句,首先,你要明白set prevweapon weapon 5这一句并不是说prevweapon就是等于weapon 5的作用了。prevweapon是一个变量,而不是命令或者代命令。要想使得其中储存的命令得以执行,就需要vstr这个命令。vstr,说白了就是执行变量里的命令的命令。最开始我写脚本的时候,就总忘了vstr呵呵。现在vstr了prevweapon,由于你上次用的枪是RL,当你摁下q的时候,prevweapon里的值是weapon 5,所以在放开这个sniper用的键的最后,它将换回weapon 5,RL。
接下来我们要把它们真正绑定在一个键上了,我这里用MOUSE3。我们要把sniper_hold绑在摁下去、把sniper_release绑在松开来上。
这里有两种方法,其中一种已经过时了,而且特别容易出毛病,我在这里就不说了。另外一种是osp的方法,其实osp文档里就有说明的。我在这里用这个实例给初学者再说一下。
bind Mouse3 "+vstr sniper_hold sniper_release"
这个是osp模式里最好的实现方式了,其他的方式也需要osp、很难使而且可以绑定的键有限。毫不夸张的说,+vstr这个命令是osp发明以来对脚本的最大贡献!举个例子,RB上次发布cfg大家都用了,如果大概意思不改动,实现换电枪无抖动也需要用到+vstr。我认为,只要你想得到,很多地方+vstr已经可以代替以前很多vstr来实现的脚本,一方面它功能强大,可以做出很炫的功能;另一方面,用+vstr可以将一些现存的脚本简化,使得脚本有更大的可读性。
看到这里,很多朋友可能会骂我写些这么基本的玩艺,我写这篇东西的目的在于一些初学的Quaker也能从脚本中得到益处,并且希望能为我今后要介绍的一些实用脚本打下一点基础。我们在这里为了初学者复习一下。首先,是使用zoomfov做普通视角的人,需要把脚本里的+zoom 和-zoom分别改为cg_zoomfov 60、cg_zoomfov 107用来切换视角。我想这个大多数人都明白。然后,有些人也许觉得,按一下放大,再按一下切换回来Zoom的方式比较好。这里有两个实现的方法。比较老的一个是这样的。
set zoomTemp "vstr zoomin"
set zoomin "cg_zoomfov 60;set zoomTemp vstr zoomout"
set zoomout "cg_zoomfov 107;set zoomTemp vstr zoomin"
bind mouse3 "vstr zoomTemp"
这大家在很多cfg里应该见过了,也在用。我们追踪一下其过程。当你摁第一下键的时候,将vstr zoomTemp,也就是vstr "vstr zoomin",最后其实是执行了cg_zoomfov 60和set zoomTemp vstr zoomout两个命令,第2个命令将zoomTemp的值更改为执行zoomout,当你第2次摁下Mouse3,zoomout恢复视角并且又把zoomTemp重置回去,这样下一次又能zoom了。
大多数脚本,无论什么功能,都是这个道理,编制脚本,一定要把set和vstr用熟。当然还有+vstr。上面这段脚本,还有一个简化版。
set zoomin "cg_zoomfov 60;bind mouse3 vstr zoomout"
set zoomout "cg_zoomfov 107;bind mouse3 vstr zoomin"
bind mouse3 "vstr zoomin"
按下mouse3就变60度,并且绑定mouse3自己到zoomout上,下一次摁就翻过来。这样就少了一个中间变量。毕竟,中间变量越少越好,脚本越简单越好。这是一个原则。
接下来说说第2种实现方法。这是一个极麻烦的办法,我在这里主要是给不了解+vstr的人做一个练习,以后会用得到。
set zoomout_bind "bind mouse3 +vstr zoomout zoomin_bind"
set zoomin_bind "bind mouse3 +vstr zoomin zoomout_bind"
set zoomin "cg_zoomfov 60"
set zoomout "cg_zoomfov 107"
vstr zoomin_bind 
这个脚本执行时候的过程是:你摁下鼠标键,cg_zoomfov 60,松开,把下次摁下设为cg_zoomfov 107,下次松开为把下下次摁下设为cg_zoomfov 60...............
基础篇到此结束。如果用fov并且用视角切换不用+zoom的,请把zoom脚本中的zoomfov换成fov的说。
说到这里不知道那些不了解脚本的人对脚本有没有一个概念了。毕竟我表达能力差。下一次我们将具体的讨论一下对实战有帮助的一些脚本,包括fov和zoomfov的切换不抖动的脚本,最后的整理中。
胡乱说说,我觉得老外在脚本上能领先咱们一步,是因为他们敢想,并且什么都会试着去做。说实话,我当初觉得脚本好难的,真正会了,发现没什么,这东西,比起真正意义上的编程根本不是一码事。而且说实话,cfg各种东西的设定也好,脚本也好,对一个人有多大帮助,我持怀疑态度。其实config,自己使着顺手就好,没必要太复杂的,呵呵。
本篇要点:set和vstr的灵活应用。关键的是中间变量的合理设置。制作脚本的原则是脚本越少越好,越简单越好。嗯,就是这些。

[关闭][返回]