register_event註冊事件函數解說

Home Home
引用 | 編輯 牙京
2009-04-28 23:24
樓主
推文 x3
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

獻花 x0
引用 | 編輯 s922197
2009-04-29 06:48
1樓
  
畢竟整理這些資料是需要時間的
而且對不會的人很有幫助喔 表情

獻花 x0
引用 | 編輯 夜魂
2009-08-26 18:37
2樓
  
對阿 對於新手幫助很大

獻花 x0
引用 | 編輯 tocade
2010-03-25 18:49
3樓
  
我初學這些東西
不管怎樣
總是能知道多點相關函數用法總是有幫助的

獻花 x0
引用 | 編輯 oscarbox2001
2010-03-25 19:15
4樓
  
看到文章發布時間
頓時感到驚訝
竟然過了那麼久我才發現這篇文章
對我幫助很大~!

獻花 x0
引用 | 編輯 tony987852
2010-03-25 20:52
5樓
  
判斷條件Condition.......好難運用...

獻花 x0
引用 | 編輯 T.o.n..y
2011-06-05 01:23
6樓
  
嗯嗯!!詳細的教學!!感謝分享!

獻花 x0
引用 | 編輯 HoJai
2012-07-06 10:28
7樓
  
這個教學真的很實用..
但我也不太明白..
不過感謝分享!

獻花 x0
引用 | 編輯 killer200
2012-07-09 13:39
8樓
  
感謝大大分享
這對我很有幫助^^

獻花 x0
引用 | 編輯 qiaoqiao520
2013-05-20 20:44
9樓
  
有点懂了,谢谢大大。。

獻花 x0
引用 | 編輯 ak47klo
2013-06-09 09:11
10樓
  
密密麻麻的...
不過還是看懂了...
現在比以前會使用註冊了

獻花 x0
引用 | 編輯 sb369456
2013-08-04 06:55
11樓
  
看懂了一些.
我顺便想知道下event事件大全.

獻花 x0
引用 | 編輯 IWTLATDSBS
2014-08-15 10:31
12樓
  
懂了——谢谢大大 表情

獻花 x0