xhsu
|
分享:
▲
▼
4.第二步 事件注冊完了,但是我們並沒有規定什麽時候觸發啊?所以我們得觸發他。 (這裏我們以爆頭觸發爲例) public plugin_init() { register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
Post_Gift = CreateMultiForward("amx_event_head_shot", ET_IGNORE, FP_CELL, FP_CELL) register_event("DeathMsg","EventDeath","a","3=1","5=0") //這樣過濾,就會僅僅觸發爆頭 }
public EventDeath() { new iVictim = read_data(2) new iAttacker = read_data(1) fm_set_user_money(iAttacker, get_pdata_int(iAttacker, m_pdata_iMoney)+1000, 1) ExecuteForward(Post_Gift, g_fwDummyResult, iVictim, iAttacker) } 這樣,我們在給爆頭額外獎勵的同時,也會觸發一個事件。 (Post事件的特性也體現在這裏——所有東西都處理完畢,才觸發) 我們來講解一下ExecuteForward() 首先第一項,就是我們在注冊事件中的事件返回值了——Post_Gift = CreateMultiForward() 第二項……嗯,還記得我說過,即使一個事件也需要兩個變量嗎?就是這樣。即使你使用了ET_IGNORE,你也需要一個容器來盛放“0”這個沒用的返回值。 (g_fwDummyResult這個東西變成全局的其實也沒關係,因爲每觸發一個事件,就會被賦值一次,不會互相幹擾返回值) 然後第三項到第N項,就是我們的事件基本參數,也就是剛剛FP_CELL等等一一對應的數字。 (注意:剛剛你用了多少個FP_XXX,這裏就必須給滿所有參數,否則會出錯。)
|
|
x0
[1 樓]
From:歐洲 | Posted:2014-07-29 11:11 |
|
|
xhsu
|
分享:
▲
▼
5.結束了?沒有!Pre事件! 以上就是一個Post事件的來曆。 (以下部分選修~~) 那麽,有人要問,Pre事件呢? 其實對於插件來說,Pre事件和Post事件沒差多少。你讓不讓Pre事件打斷,都是你說了算的。 我們來看看: new g_fwDummyResult, Post_Gift, Pre_Gift
public plugin_init() { register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR); Post_Gift = CreateMultiForward("amx_event_head_shot", ET_IGNORE, FP_CELL, FP_CELL) Pre_Gift = CreateMultiForward("amx_hook_head_shot", ET_CONTINUE) register_event("DeathMsg","EventDeath","a","3=1","5=0") }
public EventDeath() { ExecuteForward(Pre_Gift, g_fwDummyResult) //執行Pre事件 if(g_fwDummyResult) return //如果Pre事件存在返回值,那麽主插件也返回 new iVictim = read_data(2) new iAttacker = read_data(1) fm_set_user_money(iAttacker, get_pdata_int(iAttacker, m_pdata_iMoney)+1000, 1) ExecuteForward(Post_Gift, g_fwDummyResult, iVictim, iAttacker) }
這樣一來,大家都明白了吧?在g_fwDummyResult被賦予返回值了以後,一旦不爲0,那就取消主插件內事件的執行。 所以,返回值其實可以做很多事……比如你要在一個think刷速度的插件內控制速度,可以選擇把速度設定爲返回值最高的那個插件。 等等等等……但總而言之,如果你不寫上if(g_fwDummyResult) return 那麽你的Pre事件也打不斷。所以,Pre到底能不能打斷,全看你。 這就是forward事件的創造,學會了嗎?如果還不會,可以回複我~
以上
|
|
x0
[2 樓]
From:歐洲 | Posted:2014-07-29 11:20 |
|
|
xhsu
|
分享:
▲
▼
抱歉忘了這一段~關於forward的,感謝樓上提醒~ 6.在inc裡面: 既然事件已經存在了,那麼我們怎麼讓別的插件調用它呢? 當然就是我們最初提到的forward啦! 我們還是以上面為例! (我原來還不會用code呢,感謝Nailaz教我!) 複製程式
forward amx_hook_head_shot()
forward amx_event_head_shot(iVictim, iAttacker)
這個怎麼來的呢? 還記得我們上面的CreateMultiForward("amx_hook_head_shot", ET_CONTINUE)嗎? forward裡面的主要部分就是註冊事件時引號內的內容,括弧裡面的對應法則就是ExecuteForward裡面除了返回值以外的部分,按順序寫下來~ 這樣,整個事件就算是完成了~ (注:forward可以放在inc里然後用#include;當然也可以放在插件頭!)
|
|
x0
[5 樓]
From:歐洲 | Posted:2014-08-04 09:05 |
|
|
|