搜索
查看: 11416|回复: 15

register_event的使用说明

[复制链接]
发表于 2005-4-20 22:36:43 | 显示全部楼层 |阅读模式 来自 北京
呵呵,第一次发帖...虽然注册了好久..倒是没有怎么和大家交流过
昨晚super999在群里问"2&%!MRAD_terwin"的意思,偶罗嗦了一下,再加上脑子有点发热,就写了份说明,希望能对大家有些帮助。

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在附件中为大家准备了简单的事件列表,其中有比较详尽的参数分析,经常用到的事件也都包括在内了。对了,忘了说,这份事件列表是从官方得来的,呼呼~~作者已经无从考证..无论如何...谢谢作者的辛勤劳动,哇咔~

其实这些使用信息在inc文件中都可以找到,大家可以使用说明文档(就是DOC)进行搜索,查看相关函数说明。由于时间仓促...函数说明这部分未能汉化...不过好在英语不是很难...嘿嘿...

在官方找到了更为详尽的事件列表,是PimpDaddy弄的
链接在这里

Counter-Strike
Condition Zero
Day of Defeat

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
发表于 2005-4-20 23:19:20 | 显示全部楼层 来自 吉林长春
:) 支持
回复

使用道具 举报

发表于 2005-4-20 23:52:25 | 显示全部楼层 来自 陕西西安
:) 终于发出来了,加精华
回复

使用道具 举报

发表于 2005-4-27 11:21:50 | 显示全部楼层 来自 广东广州
学到一招。望天天发技术文章。
回复

使用道具 举报

发表于 2005-4-30 11:09:41 | 显示全部楼层 来自 上海
o 是发枪啊,偶要火箭筒 :D  :d:
回复

使用道具 举报

发表于 2005-5-17 02:50:30 | 显示全部楼层 来自 广东广州
支持 , 消化ing....好难呀
回复

使用道具 举报

发表于 2005-7-2 04:00:15 | 显示全部楼层 来自 台湾
支持,谢谢啊 thx
回复

使用道具 举报

发表于 2010-7-8 23:02:12 | 显示全部楼层 来自 四川成都
下不到附件  真是老火
回复

使用道具 举报

发表于 2010-7-8 23:32:50 | 显示全部楼层 来自 广东惠州
事件参考,看官方的wiki.
http://wiki.alliedmods.net/Half-Life_1_Game_Events
回复

使用道具 举报

发表于 2015-6-17 17:43:34 | 显示全部楼层 来自 湖北宜昌
这个东西一直没搞懂  困扰了很久
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表