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 |
|
|
|