牙京
|
分享:
▼
x3
|
[插件] register_event注册事件函数解说
register_event是AMX的注册事件语句,简单来说就是在特定事件发生的时候调用某个函数,来达到自己特定的目的。比如说,我们想在每局开始的时候,给每名玩家发一把M4(我比较喜欢M4),就可以用到register_event语句。下面我们来看一个具体的例子,Bread会结合这个例子来具体讲解。
register_event("SendAudio", "t_win", "a", "2&%!MRAD_terwin")
这是一个典型的注册事件语句,register_event至少应包含4个参数,分别是事件Event、函数Function、标志位 Flag以及判断条件Condition,而其中的判断条件可以是多条并列。它的作用则是在事件Event出现的时候,先判断是否符合Flag标志位的标准,然后判断此事件消息是否符合condition的条件,若两者都通过则自动调用Function函数。.....-_-...难理解的话就先不要理解,下面我们来一一对参数进行讲解。第一个参数Event是事件常量,比如说常见的"SendAudio","TextMsg"等等,具体的事件列表你可以在游戏中由控制台敲入"meta game"(大小写敏感)来获得。第二个参数,Function,则需要由用户自己定义。我们来举个简单的例子:
register_event("SendAudio", "t_win", "a", "2&%!MRAD_terwin") 在这条语句中,Event是"SendAudio",也就是发送声音的事件。第二个参数,"t_win"则是由用户自己定义的。整条语句的作用就是在T方获胜的时候调用t_win这个函数。
再来看第三个参数,标志位flag,用来标识事件类型。只有事件出现时符合其所规定的类型,函数才会被调用。它也是个常量,具体的赋值如下:
"a" 表示是全局事件,比如说开局,某方胜利等等,这种消息人人都可以看到,因此是全局信息 "b" 表示是发送给某个个体的事件,比如说某人被对方击中等等 "c" 表示此信息重复发送给其他玩家,而对这个个体只发送一遍。这个解释起来有点麻烦,你这样理解好了。某个事件发送给你之后,会重复发给其他玩家,但即便如此,自定义函数也只会被调用一次。 "d" 表示此事件信息只发送给死亡玩家 "e" 表示此事件只发送给活着的玩家
对于我们的例子来说,SendAudio显然是全局事件。再来看下面这个经典的例子::
register_event("TextMsg","setSpecMode","bd")
后面的参数先不要管,第三个参数用的是"bd",也就是说,只有事件"TextMsg"被发送给一个单独的玩家,并且此玩家已经死亡的时候,"setSpecMode"才会被调用。
下面再来看最重要的部分,判断条件:
在此之前,我们要清楚事件消息的发送格式,HL引擎在发送事件消息的时候,会在事件名之后跟上几个参数,用来表达具体的信息。当然参数个数和类型会根据事件的不同而有所变化。在我们的这个例子中,"SendAudio"的参数共有两个,第一个是sound mode,也就是声音格式,第二个是声音标识,为字符串型。 而判断条件所要比对的,就是这几个参数的信息。首先,每个条件在开头要写上一个数字,用来表示要比对的参数序列。再回到开头的例子: "2&%!MRAD_terwin"
则表示要比对的是"SendAudio"第二个参数,声音标识。然后,我们要介绍几个逻辑符号。 "&" 表示包含关系,比如说"2&Bread",则表示若第二个参数中包含"Bread"则条件成立 "=" 表示完全相符,比如说"2=Bread",则表示第二个参数必须是"Bread",条件才成立 表示不包含,比如说"4!Bread",则表示第四个参数中不得包含"Bread",这样条件才成立 ">"和"<" 和代数意义相同,比如说"3>15"则表示第3个参数必须大于15才行
这样一来,"2&%!MRAD_terwin"的意思就不言而喻了。它要做的就是比对声音标识中是否含有"%!MRAD_terwin"这个字符串。说到这里,就废话多说几句。事件"SendAudio"顾名思义是向客户端发送声音的,而第二个参数则表示发送的声音类型,比如说此例中的"%!MRAD_terwin"表示T方获胜,还有"=%!MRAD_ctwin"(表示CT方胜利),"=%!MRAD_rounddraw"(表示平局)。相信大家对这些声音都不会陌生。
register_event()语句因其独特的作用,几乎在每个知名插件中都能找到它的身影。我记忆犹深的是比赛插件playoff投票无效的BUG,就是由于使用"TeamScore"事件的时候考虑不够周全.总之这个语句很有用就是了,嘿嘿...多看几个经典的插件,慢慢就会灵活掌握的。
根据Bread之前的感觉来说,刚接触register_event的时候,最头疼的就是各个事件的具体参数,以及各个参数的意义。虽然"meta game"能把事件都调出来..却看不到参数。有鉴于此,Bread在附件中为大家准备了简单的事件列表,其中有比较详尽的参数分析,经常用到的事件也都包括在内了。对了,忘了说,这份事件列表是从官方得来的,作者已经无从考证..无论如何...谢谢作者的辛勤劳动
转自c7
|