Plugin_Continue, Handled, Stopの違い
RegConsoleCmdでコマンドをフックするときに、コールバック関数での返却値によって挙動が変わる。
return Plugin_Continue; したときはそのままもともとのcmdを実行
return Plugin_Handled; したときはもともとのcmdは実行されない
return Plugin_Stop; は、すぐさまhook chainをやめると書いてあるので複数Hookされてた時にHandledとの違いが出てくる感じっぽい。
最後のStopについてはよく理解できた感じがしないのでためしに実験してみる。まずHandledから。二重にsayコマンドにHookを仕込んでみる
public OnPluginStart() { RegConsoleCmd("say", Command_Say1); RegConsoleCmd("say", Command_Say2); } public Action:Command_Say1(client, args) { LogMessage("[Hook] say1"); return Plugin_Handled; } public Action:Command_Say2(client, args) { LogMessage("[Hook] say2"); return Plugin_Handled; }
このプラグインを読み込ませた後でsayコマンドを実行するとこんな感じ
say test L 09/10/2012 - 13:57:48: [test.smx] [Hook] say1 L 09/10/2012 - 13:57:48: [test.smx] [Hook] say2
Plugin_Handledを返却してるので、sayコマンド自体の出力がなされていない。これは仕様どおりである。
さて、これをPlugin_Stopに書き換える。具体的には上記コードのHandledをStopに変えるだけ。
public OnPluginStart() { RegConsoleCmd("say", Command_Say1); RegConsoleCmd("say", Command_Say2); } public Action:Command_Say1(client, args) { LogMessage("[Hook] say1"); return Plugin_Stop; } public Action:Command_Say2(client, args) { LogMessage("[Hook] say2"); return Plugin_Stop; }
このプラグインを読み直し、再度おなじようにsayコマンドを実行してみる
say test L 09/10/2012 - 14:00:18: [test.smx] [Hook] say1
お、say2と出力されるはずのHookが実行されなくなった。みたいな感じなんですね。Hook chainをStopし、更に元のコマンドを実行しないHookがPlugin_Stop。元のコマンドを実行しないだけなのがPlugin_Handled。元のコマンドも実行するのがPlugin_Continues