hooks: Difference between revisions

From OpenKore Wiki
Jump to navigation Jump to search
No edit summary
 
(6 intermediate revisions by 2 users not shown)
Line 4: Line 4:


==== start ====
==== start ====
Called once after loading all plugins, but before loading or configuring load of any [[:Category:Control|control]] or [[:Category:Tables|tables]] files. <code>%config</code> and all other stuff would be unavailable at this moment. Reconfiguration for the following initialization steps (like [http://forums.openkore.com/viewtopic.php?t=47 profiles plugin] does) should be performed there, as well as anything else that needs to be performed as soon as possible.
Called once after loading all plugins, but before loading or configuring load of any [[:Category:control|control]] or [[:Category:tables|tables]] files. <code>%config</code> and all other stuff would be unavailable at this moment. Reconfiguration for the following initialization steps (like [http://forums.openkore.com/viewtopic.php?t=47 profiles plugin] does) should be performed there, as well as anything else that needs to be performed as soon as possible.


==== start2 ====
==== start2 ====
Called once before loading any [[:Category:Control|control]] or [[:Category:Tables|tables]] files, but when that load is already being configured. <code>%config</code> etc would still be unavailable at this moment. Monkey-patching of whatever will be loaded next can be performed there.
Called once before loading any [[:Category:control|control]] or [[:Category:tables|tables]] files, but when that load is already being configured. <code>%config</code> etc would still be unavailable at this moment. Monkey-patching of whatever will be loaded next can be performed there.


==== start3 ====
==== start3 ====
Called once after all [[:Category:Control|control]] and [[:Category:Tables|tables]] files are loaded. You probably should use '''initialized''' hook instead.
Called once after all [[:Category:control|control]] and [[:Category:tables|tables]] files are loaded. You probably should use '''initialized''' hook instead.


==== initialized ====
==== initialized ====
Line 34: Line 34:
== Discovering all existing hooks Unix Distro ==
== Discovering all existing hooks Unix Distro ==


  openkore/trunk$ find src -name .svn -prune -o -exec grep -Hn "^[^#]*callHook" {} \;
  find src -type f \( -name "*.pl" -or -name "*.pm" -not -name "Plugins.pm" -not -name "PluginsHookTest.pm" \) -exec grep -Hn "^[^#]*callHook" {} \; | sed -E s/\\t+/\\t/ | sed s/\\sif.*//


== Discovering all existing hooks Windows Distro ==
== Discovering all existing hooks Windows Distro ==
Line 48: Line 48:


<pre>
<pre>
functions.pl:74:                Plugins::callHook('mainLoop_pre');
plugins\macro\macro.pl:105: Plugins::callHook ('macro/parseAndHook');
functions.pl:76:                Plugins::callHook('mainLoop_post');
plugins\needs-review\busCommands\trunk\busCommands.pl:86: Plugins::callHook('bus_received', {message => $args{comm}, sender => $args{sender}}) if (($char && $1 eq $char->name) || $1 eq "all");
functions.pl:83:                Plugins::callHook('start');
plugins\needs-review\busCommands\trunk\busCommands.pl:115: Plugins::callHook('bus_received', {message => $msg->{args}{comm},});
functions.pl:136:      Plugins::callHook( 'parse_command_line' );
plugins\needs-review\busCommands\trunk\busCommands.pl:120: Plugins::callHook('bus_received', {message => $msg->{args}{comm},});
functions.pl:281:      Plugins::callHook('start2');
plugins\needs-review\busCommands\trunk\busCommands.pl:127: Plugins::callHook('bus_received', {message => $msg->{args}{comm}, sender => $msg->{args}{sender}})
functions.pl:305:      Plugins::callHook('start3');
src\functions.pl:74: Plugins::callHook('mainLoop_pre');
functions.pl:551:      Plugins::callHook('initialized');
src\functions.pl:76: Plugins::callHook('mainLoop_post');
functions.pl:702:      Plugins::callHook('packet_mapChange');
src\functions.pl:83: Plugins::callHook('start');
functions.pl:911:      Plugins::callHook('mainLoop::setTitle',\%args);
src\functions.pl:136: Plugins::callHook('parse_command_line');
Actor\Item.pm:483:      Plugins::callHook( 'get_item_weight', $self ) if !defined $self->{weight};
src\functions.pl:378: Plugins::callHook('start2');
Actor\You.pm:262:      Plugins::callHook('attack_start', {ID => $targetID});
src\functions.pl:402: Plugins::callHook('start3');
Actor.pm:596:  Plugins::callHook('Actor::setStatus::change', {
src\functions.pl:633: Plugins::callHook('initialized');
AI\Attack.pm:167:              Plugins::callHook("target_died", {monster => $monsters_old{$ID}});
src\functions.pl:793: Plugins::callHook('packet_mapChange');
AI\Attack.pm:208:      Plugins::callHook('attack_end', {ID => $ID})
src\functions.pl:1002: Plugins::callHook('mainLoop::setTitle',\%args);
AI\Attack.pm:628:      Plugins::callHook('AI::Attack::main', {target => $target})
plugins\breakTime\test\autoBreakTimeTest.pm:50: Plugins::callHook( 'mainLoop_pre' );
AI\CoreLogic.pm:57:    Plugins::callHook('AI_start', {state => AI
plugins\breakTime
</pre>
</pre>


[[Category:Development]]
[[Category:Development]]

Latest revision as of 13:09, 19 May 2023

Recommended hooks

Initialization

start

Called once after loading all plugins, but before loading or configuring load of any control or tables files. %config and all other stuff would be unavailable at this moment. Reconfiguration for the following initialization steps (like profiles plugin does) should be performed there, as well as anything else that needs to be performed as soon as possible.

start2

Called once before loading any control or tables files, but when that load is already being configured. %config etc would still be unavailable at this moment. Monkey-patching of whatever will be loaded next can be performed there.

start3

Called once after all control and tables files are loaded. You probably should use initialized hook instead.

initialized

Called once when all initialization is done and it's ready to connect to the server or start XKore. Additional initialization should be performed there.

Continuous Work

mainLoop_pre

Called continuously.

mainLoop_post

Called continuously, after processing all other routines.

AI_pre/manual

Called continuously when in game unless AI is turned off.

AI_pre

Called continuously when in game if AI is set to automatic.

AI_post

Called continuously when in game if AI is set to automatic, after processing all other AI routines.

Discovering all existing hooks Unix Distro

find src -type f \( -name "*.pl" -or -name "*.pm" -not -name "Plugins.pm" -not -name "PluginsHookTest.pm" \) -exec grep -Hn "^[^#]*callHook" {} \; | sed -E s/\\t+/\\t/ | sed s/\\sif.*//

Discovering all existing hooks Windows Distro

open cmd
cd openkore\src
findstr /S /n "callHook" *.pl;
findstr /S /n "callHook" *.pm;

Note that some hooks, like packet/<name>, packet_pre/<name> and mangle/<name>, actually are many hooks, for example, one hook for each network packet type. See about it here.

Hook List

This list might be outdated.

plugins\macro\macro.pl:105:		Plugins::callHook ('macro/parseAndHook');
plugins\needs-review\busCommands\trunk\busCommands.pl:86:		Plugins::callHook('bus_received', {message => $args{comm}, sender => $args{sender}}) if (($char && $1 eq $char->name) || $1 eq "all");
plugins\needs-review\busCommands\trunk\busCommands.pl:115:				Plugins::callHook('bus_received', {message => $msg->{args}{comm},});				
plugins\needs-review\busCommands\trunk\busCommands.pl:120:					Plugins::callHook('bus_received', {message => $msg->{args}{comm},});				
plugins\needs-review\busCommands\trunk\busCommands.pl:127:			Plugins::callHook('bus_received', {message => $msg->{args}{comm}, sender => $msg->{args}{sender}}) 
src\functions.pl:74:		Plugins::callHook('mainLoop_pre');
src\functions.pl:76:		Plugins::callHook('mainLoop_post');
src\functions.pl:83:		Plugins::callHook('start');
src\functions.pl:136:	Plugins::callHook('parse_command_line');
src\functions.pl:378:	Plugins::callHook('start2');
src\functions.pl:402:	Plugins::callHook('start3');
src\functions.pl:633:	Plugins::callHook('initialized');
src\functions.pl:793:	Plugins::callHook('packet_mapChange');
src\functions.pl:1002:	Plugins::callHook('mainLoop::setTitle',\%args);
plugins\breakTime\test\autoBreakTimeTest.pm:50:			Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:60:			Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:70:			Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:77:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:85:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:90:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:96:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:102:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:110:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:115:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:124:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:130:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:136:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:142:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:148:		Plugins::callHook( 'mainLoop_pre' );
plugins\breakTime\test\autoBreakTimeTest.pm:152:		Plugins::callHook( 'mainLoop_pre' );
plugins\macro\Macro\Utilities.pm:471:				Plugins::callHook ('macro/error', $hookArgs);
plugins\macro\Macro\Utilities.pm:495:		Plugins::callHook ('macro/error', $hookArgs);
plugins\macro\Macro\Utilities.pm:518:			Plugins::callHook ('macro/callMacro/process');
plugins\needs-review\teleportTask\trunk\Task\Teleport.pm:88:			Plugins::callHook(teleport_sent => $self->hookArgs);
src\Actor\Item.pm:526:	Plugins::callHook('get_item_weight', $self) if !defined $self->{weight};
src\Actor\You.pm:282:	Plugins::callHook('attack_start', {ID => $targetID});
src\Actor.pm:589:	Plugins::callHook('Actor::setStatus::change', {
src\AI\Attack.pm:218:		Plugins::callHook('target_died', {monster => $monsters_old{$ID}});
src\AI\Attack.pm:260:	Plugins::callHook('attack_end', {ID => $ID})
src\AI\Attack.pm:692:	Plugins::callHook('AI::Attack::main', {target => $target})
src\AI\CoreLogic.pm:57:	Plugins::callHook('AI_start', {state => AI::state});
src\AI\CoreLogic.pm:68:	Plugins::callHook('AI_pre/manual');
src\AI\CoreLogic.pm:118:	Plugins::callHook('AI_pre');
src\AI\CoreLogic.pm:218:	Plugins::callHook('AI_post');
src\AI\CoreLogic.pm:549:		Plugins::callHook('portal_exist2', {
src\AI\CoreLogic.pm:575:		Plugins::callHook('portal_exist2', {
src\AI\CoreLogic.pm:980:				Plugins::callHook('AI_storage_auto_queued');
src\AI\CoreLogic.pm:1202:		Plugins::callHook('AI_storage_auto_weight_start' => \%plugin_args);
src\AI\CoreLogic.pm:1213:			Plugins::callHook('AI_storage_auto_queued');
src\AI\CoreLogic.pm:1224:		Plugins::callHook('AI_storage_auto_get_auto_start' => \%plugin_args);
src\AI\CoreLogic.pm:1268:						Plugins::callHook('AI_storage_item_out_of_stock', {
src\AI\CoreLogic.pm:1293:			Plugins::callHook('AI_storage_auto_queued');
src\AI\CoreLogic.pm:1310:				Plugins::callHook('AI_sell_auto_queued');
src\AI\CoreLogic.pm:1314:				Plugins::callHook('AI_sell_auto_queued');
src\AI\CoreLogic.pm:1457:			Plugins::callHook('AI_storage_open', \%pluginArgs); # we can hook here to perform actions BEFORE any storage function
src\AI\CoreLogic.pm:1472:					Plugins::callHook('AI_storage_full', \%pluginArgs);
src\AI\CoreLogic.pm:1496:							Plugins::callHook('AI_storage_item_full', {
src\AI\CoreLogic.pm:1557:					Plugins::callHook('AI_storage_done', \%hookArgs);
src\AI\CoreLogic.pm:1641:						Plugins::callHook('AI_storage_item_out_of_stock', {
src\AI\CoreLogic.pm:1675:			Plugins::callHook('AI_storage_done_after_getAuto', \%hookArgs);
src\AI\CoreLogic.pm:1711:		Plugins::callHook('AI_sell_auto_start' => \%plugin_args);
src\AI\CoreLogic.pm:1719:			Plugins::callHook('AI_sell_auto_queued');
src\AI\CoreLogic.pm:1736:			Plugins::callHook('AI_buy_auto_queued');
src\AI\CoreLogic.pm:1740:			Plugins::callHook('AI_buy_auto_queued');
src\AI\CoreLogic.pm:1857:			Plugins::callHook('AI_sell_auto');
src\AI\CoreLogic.pm:1886:			Plugins::callHook('AI_sell_auto_done');
src\AI\CoreLogic.pm:1897:		Plugins::callHook('AI_buy_auto_start' => \%plugin_args);
src\AI\CoreLogic.pm:1933:			Plugins::callHook('AI_buy_auto_queued');
src\AI\CoreLogic.pm:1949:		Plugins::callHook('AI_buy_auto_done');
src\AI\CoreLogic.pm:1953:			Plugins::callHook('AI_storage_auto_queued');
src\AI\CoreLogic.pm:1957:			Plugins::callHook('AI_storage_auto_queued');
src\AI\CoreLogic.pm:1961:		Plugins::callHook('AI_buy_auto');
src\AI\CoreLogic.pm:2278:			Plugins::callHook('AI/lockMap', \%args);
src\AI\CoreLogic.pm:2396:		Plugins::callHook('ai_processRandomWalk' => \%plugin_args);
src\AI\CoreLogic.pm:2715:	Plugins::callHook('ai_follow', $args);
src\AI\CoreLogic.pm:3234:					Plugins::callHook('checkMonsterAutoAttack', \%hookArgs);
src\AI\CoreLogic.pm:3297:			Plugins::callHook('ai_items_take');
src\AI\SlaveAttack.pm:186:		Plugins::callHook('slave_target_died', {
src\AI\SlaveAttack.pm:227:	Plugins::callHook('slave_attack_end', {
src\AI.pm:98:		Plugins::callHook('AI_state_change', {
src\ChatQueue.pm:64:	Plugins::callHook('ChatQueue::add', \%item);
src\ChatQueue.pm:616:	Plugins::callHook('ChatQueue::processChatResponse', $cmd);
src\Commands.pm:884:			Plugins::callHook('Commands::run/pre', \%params);
src\Commands.pm:886:			Plugins::callHook('Commands::run/post', \%params);
src\Commands.pm:890:			Plugins::callHook('Command_post', \%params);
src\Commands.pm:1301:	Plugins::callHook('AI_buy_auto_queued');
src\Commands.pm:1330:		Plugins::callHook('AI_sell_auto_queued');
src\Commands.pm:1338:		Plugins::callHook('AI_storage_auto_queued');
src\Commands.pm:2151:		Plugins::callHook('Commands::cmdConf', {
src\FileParsers.pm:784:	Plugins::callHook('FileParsers::ROLUT', \%ret);
src\FileParsers.pm:811:	Plugins::callHook('FileParsers::RODescLUT', \%ret);
src\FileParsers.pm:861:	Plugins::callHook ('FileParsers::ROQuestsLUT', \%ret);
src\FileParsers.pm:1480:	Plugins::callHook('updatePortalLUT', $plugin_args);
src\FileParsers.pm:1494:	Plugins::callHook('updatePortalLUT2', $plugin_args);
src\Interface\Console\Curses.pm:683:	Plugins::callHook('curses/updateStatus');
src\Interface\Console\Curses.pm:808:	Plugins::callHook('curses/updateObjects');
src\InventoryList\Cart.pm:34:		Plugins::callHook('cart_ready');
src\InventoryList\Cart.pm:36:		Plugins::callHook('cart_info_updated');
src\InventoryList\Cart.pm:94:		Plugins::callHook('cart_ready');
src\InventoryList\Cart.pm:96:		Plugins::callHook('cart_info_updated');
src\InventoryList\Inventory.pm:35:		Plugins::callHook('inventory_ready');
src\InventoryList\Inventory.pm:62:		Plugins::callHook('inventory_ready');
src\InventoryList\Storage.pm:37:			Plugins::callHook('storage_first_session_openning');
src\InventoryList\Storage.pm:39:		Plugins::callHook('packet_storage_open');
src\InventoryList\Storage.pm:46:	Plugins::callHook('packet_storage_close');
src\InventoryList\Storage.pm:79:			Plugins::callHook('storage_first_session_openning');
src\InventoryList\Storage.pm:81:		Plugins::callHook('packet_storage_open');
src\InventoryList\Storage.pm:87:	Plugins::callHook('storage_ready');
src\Misc.pm:316:	Plugins::callHook('configModify', {
src\Misc.pm:367:		Plugins::callHook('configModify', {
src\Misc.pm:407:	Plugins::callHook('setTimeout', {
src\Misc.pm:1292:	Plugins::callHook('charSelectScreen', \%plugin_args);
src\Misc.pm:1524:	Plugins::callHook('ai_check_Aggressiveness' => \%plugin_args);
src\Misc.pm:1559:	Plugins::callHook('ai_slave_check_Aggressiveness' => \%plugin_args);
src\Misc.pm:2152:	Plugins::callHook('inventory_item_removed', {
src\Misc.pm:2176:	Plugins::callHook('storage_item_removed', {
src\Misc.pm:2200:	Plugins::callHook('cart_item_removed', {
src\Misc.pm:2892:	Plugins::callHook('objectAdded', {
src\Misc.pm:2909:	Plugins::callHook('objectRemoved', {
src\Misc.pm:3301:	Plugins::callHook('changed_status',{
src\Misc.pm:3313:			# Plugins::callHook('perfect_hidden_player',undef);
src\Misc.pm:3314:			Plugins::callHook('perfect_hidden_player', {
src\Misc.pm:3329:			Plugins::callHook('perfect_hidden_npc', {
src\Misc.pm:3793:		Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:3799:		Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:3837:				Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:3846:				Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:3856:			Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:3868:			Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:3926:			Plugins::callHook('teleport_sent', \%args);
src\Misc.pm:4314:		Plugins::callHook('avoidGM_near', \%args);
src\Misc.pm:4366:	Plugins::callHook('avoidGM_talk', \%args);
src\Misc.pm:4405:		Plugins::callHook('avoidList_near', \%args);
src\Misc.pm:5075:	Plugins::callHook('checkSelfCondition', \%hookArgs);
src\Misc.pm:5227:	Plugins::callHook('checkPlayerCondition', \%args);
src\Misc.pm:5302:	Plugins::callHook('checkMonsterCondition', \%args);
src\Misc.pm:5392:	Plugins::callHook('open_shop', {
src\Misc.pm:5409:	Plugins::callHook('shop_closed');
src\Misc.pm:5504:	Plugins::callHook ('buyer_open_shop', {
src\Misc.pm:5525:	Plugins::callHook('buyer_shop_closed');
src\Network\ClientReceive.pm:75:	Plugins::callHook('map_loaded');
src\Network\DirectConnection.pm:140:	Plugins::callHook('Network::connectTo', {
src\Network\DirectConnection.pm:173:			Plugins::callHook('Network::serverSend/pre', {msg => \$msg});
src\Network\DirectConnection.pm:178:				Plugins::callHook('Network::serverSend', {msg => $msg});
src\Network\DirectConnection.pm:196:		Plugins::callHook('Network::serverRecv', {msg => \$msg});
src\Network\DirectConnection.pm:245:			Plugins::callHook('serverDisconnect/fail');
src\Network\DirectConnection.pm:248:			Plugins::callHook('serverDisconnect/success');
src\Network\DirectConnection.pm:260:	Plugins::callHook('Network::stateChanged');
src\Network\DirectConnection.pm:274:	Plugins::callHook('Network::clientAlive', \%args);
src\Network\DirectConnection.pm:286:		Plugins::callHook('Network::clientSend', \%args);
src\Network\DirectConnection.pm:301:		Plugins::callHook('Network::clientRecv', \%args);
src\Network\DirectConnection.pm:355:			Plugins::callHook('Network::serverConnect/master');
src\Network\DirectConnection.pm:486:		Plugins::callHook('Network::serverConnect/special');
src\Network\DirectConnection.pm:526:				Plugins::callHook('Network::serverConnect/char');
src\Network\DirectConnection.pm:562:				Plugins::callHook('Network::serverConnect/charselect');
src\Network\DirectConnection.pm:600:				Plugins::callHook('Network::serverConnect/mapserver');
src\Network\DirectConnection.pm:618:			Plugins::callHook('disconnected');
src\Network\DirectConnection.pm:633:			Plugins::callHook('disconnected');
src\Network\PacketParser.pm:272:			Plugins::callHook("packet_pre/$handler->[0]", \%args);
src\Network\PacketParser.pm:274:			Plugins::callHook("$self->{hook_prefix}/packet_pre/$handler->[0]", \%args);
src\Network\PacketParser.pm:289:		Plugins::callHook("packet/$handler->[0]", \%args);
src\Network\PacketParser.pm:291:		Plugins::callHook("$self->{hook_prefix}/packet/$handler->[0]", \%args);
src\Network\PacketParser.pm:368:		Plugins::callHook("$self->{hook_prefix}/willMangle", \%args);
src\Network\PacketParser.pm:390:	Plugins::callHook("$self->{hook_prefix}/mangle", \%hook_args);
src\Network\PacketParser.pm:494:	Plugins::callHook($hook, {
src\Network\Receive\kRO\Sakexe_0.pm:1016:		Plugins::callHook($args->{hook}, {
src\Network\Receive\kRO\Sakexe_0.pm:1056:	Plugins::callHook('packet_guildMsg', {
src\Network\Receive\kRO\Sakexe_0.pm:1109:	Plugins::callHook('item_skill', {
src\Network\Receive\kRO\Sakexe_0.pm:1160:	Plugins::callHook('packet_pubMsg', {
src\Network\Receive\kRO\Sakexe_0.pm:1176:		Plugins::callHook('packet_sentPM', {
src\Network\Receive\kRO\Sakexe_0.pm:1209:		Plugins::callHook('pvp_mode', {
src\Network\Receive\kRO\Sakexe_0.pm:1225:		Plugins::callHook('pvp_mode', {
src\Network\Receive\kRO\Sakexe_0.pm:1300:	Plugins::callHook('packet_skilluse', {
src\Network\Receive\kRO\Sakexe_0.pm:1341:	Plugins::callHook('packet_skilluse', {
src\Network\Receive\kRO\Sakexe_0.pm:1420:	Plugins::callHook('packet_skilluse', {
src\Network\Receive\ServerType0.pm:1040:		Plugins::callHook($args->{hook}, {
src\Network\Receive\ServerType0.pm:1082:	Plugins::callHook('packet_guildMsg', {
src\Network\Receive\ServerType0.pm:1135:	Plugins::callHook('item_skill', {
src\Network\Receive\ServerType0.pm:1186:	Plugins::callHook('packet_pubMsg', {
src\Network\Receive\ServerType0.pm:1216:		Plugins::callHook('pvp_mode', {
src\Network\Receive\ServerType0.pm:1233:		Plugins::callHook('pvp_mode', {
src\Network\Receive\ServerType0.pm:1313:	Plugins::callHook('packet_skilluse', {
src\Network\Receive\ServerType0.pm:1362:	Plugins::callHook('packet_skilluse', {
src\Network\Receive\ServerType0.pm:1448:	Plugins::callHook('packet_skilluse', {
src\Network\Receive.pm:819:	Plugins::callHook('parseMsg/recvChars', $args->{options});
src\Network\Receive.pm:973:	Plugins::callHook('char_created', {char => $character});
src\Network\Receive.pm:1260:	Plugins::callHook('in_game');
src\Network\Receive.pm:1304:	Plugins::callHook('disconnected');
src\Network\Receive.pm:1404:		Plugins::callHook('exp_gained');
src\Network\Receive.pm:1460:		Plugins::callHook('base_level_changed', {level	=> $actor->{lv}});
src\Network\Receive.pm:1491:		Plugins::callHook('zeny_change', {
src\Network\Receive.pm:1562:		Plugins::callHook('job_level_changed', {level => $actor->{lv_job}});
src\Network\Receive.pm:1723:	Plugins::callHook('packet_charStats', {
src\Network\Receive.pm:1825:	Plugins::callHook('packet_pre/actor_display', $args);
src\Network\Receive.pm:1827:	Plugins::callHook('packet/actor_display', $args);
src\Network\Receive.pm:2188:			Plugins::callHook('add_player_list', $actor);
src\Network\Receive.pm:2192:			Plugins::callHook('add_monster_list', $actor);
src\Network\Receive.pm:2196:			Plugins::callHook('add_pet_list', $actor);
src\Network\Receive.pm:2200:			Plugins::callHook('add_portal_list', $actor);
src\Network\Receive.pm:2209:			Plugins::callHook('add_npc_list', $actor);
src\Network\Receive.pm:2213:			Plugins::callHook('add_slave_list', $actor);
src\Network\Receive.pm:2216:			Plugins::callHook('add_elemental_list', $actor);
src\Network\Receive.pm:2238:			Plugins::callHook('player', {player => $actor}); #backwards compatibility
src\Network\Receive.pm:2240:			Plugins::callHook('player_exist', {player => $actor});
src\Network\Receive.pm:2244:			Plugins::callHook('npc_exist', {npc => $actor});
src\Network\Receive.pm:2248:			Plugins::callHook('portal_exist', {portal => $actor});
src\Network\Receive.pm:2252:			Plugins::callHook('monster_exist', {monster => $actor});
src\Network\Receive.pm:2256:			Plugins::callHook('pet_exist', {pet => $actor});
src\Network\Receive.pm:2260:			Plugins::callHook('slave_exist', {slave => $actor});
src\Network\Receive.pm:2264:			Plugins::callHook('elemental_exist', {elemental => $actor});
src\Network\Receive.pm:2268:			Plugins::callHook('unknown_exist', {unknown => $actor});
src\Network\Receive.pm:2289:			Plugins::callHook('player', {player => $actor}); #backwards compatibailty
src\Network\Receive.pm:2291:			Plugins::callHook('player_connected', {player => $actor});
src\Network\Receive.pm:2319:			Plugins::callHook('player_moved', $actor);
src\Network\Receive.pm:2322:			Plugins::callHook('monster_moved', $actor);
src\Network\Receive.pm:2325:			Plugins::callHook('pet_moved', $actor);
src\Network\Receive.pm:2328:			Plugins::callHook('slave_moved', $actor);
src\Network\Receive.pm:2332:			Plugins::callHook('portal_moved', $actor);
src\Network\Receive.pm:2336:			Plugins::callHook('npc_moved', $actor);
src\Network\Receive.pm:2339:			Plugins::callHook('pet_moved', $actor);
src\Network\Receive.pm:2342:			Plugins::callHook('unknown_moved', $actor);
src\Network\Receive.pm:2349:			Plugins::callHook('player_spawned', {player => $actor});
src\Network\Receive.pm:2352:			Plugins::callHook('monster_spawned', {monster => $actor});
src\Network\Receive.pm:2355:			Plugins::callHook('pet_spawned', {pet => $actor});
src\Network\Receive.pm:2358:			Plugins::callHook('slave_spawned', {slave => $actor});
src\Network\Receive.pm:2362:			Plugins::callHook('portal_spawned', {portal => $actor});
src\Network\Receive.pm:2365:			Plugins::callHook('elemental_spawned', {elemental => $actor});
src\Network\Receive.pm:2368:			Plugins::callHook('npc_spawned', {npc => $actor});
src\Network\Receive.pm:2371:			Plugins::callHook('unknown_spawned', {unknown => $actor});
src\Network\Receive.pm:2396:		Plugins::callHook('self_died');
src\Network\Receive.pm:2435:		Plugins::callHook('monster_disappeared', {monster => $monster});
src\Network\Receive.pm:2471:			Plugins::callHook('player_disappeared', {player => $player});
src\Network\Receive.pm:2491:		Plugins::callHook('portal_disappeared', {portal => $portal});
src\Network\Receive.pm:2500:		Plugins::callHook('npc_disappeared', {npc => $npc});
src\Network\Receive.pm:2508:		Plugins::callHook('pet_disappeared', {pet => $pet});
src\Network\Receive.pm:2541:			Plugins::callHook('slave_disappeared', {slave => $slave});
src\Network\Receive.pm:2557:		Plugins::callHook('elemental_disappeared', {elemental => $elemental});
src\Network\Receive.pm:2645:		Plugins::callHook('packet_attack', {
src\Network\Receive.pm:2717:		Plugins::callHook('charNameUpdate', {player => $player});
src\Network\Receive.pm:2729:			Plugins::callHook('mobNameUpdate', {monster => $monster});
src\Network\Receive.pm:2747:		Plugins::callHook('npcNameUpdate', {npc => $npc});
src\Network\Receive.pm:2759:		Plugins::callHook('petNameUpdate', {pet => $pet});
src\Network\Receive.pm:2770:		Plugins::callHook('slaveNameUpdate', {slave => $slave});
src\Network\Receive.pm:2782:		Plugins::callHook('elementalNameUpdate', {elemental => $elemental});
src\Network\Receive.pm:2809:		Plugins::callHook('base_level', {name => $actor});
src\Network\Receive.pm:2812:		Plugins::callHook('job_level', {name => $actor});
src\Network\Receive.pm:3114:	Plugins::callHook('packet_localBroadcast', {
src\Network\Receive.pm:3352:		Plugins::callHook('show_script', {
src\Network\Receive.pm:3483:	Plugins::callHook('packet_sysMsg', {
src\Network\Receive.pm:3635:		Plugins::callHook('equipped_item', {
src\Network\Receive.pm:3690:		Plugins::callHook('item_gathered', {
src\Network\Receive.pm:3754:		Plugins::callHook('packet_item_removed', {index => $item->{binID}});
src\Network\Receive.pm:3766:		Plugins::callHook('rental_expired', {
src\Network\Receive.pm:3807:	Plugins::callHook('vending_item_sold', {
src\Network\Receive.pm:3819:		Plugins::callHook('vending_item_sold_out', {
src\Network\Receive.pm:3851:	Plugins::callHook('vending_item_sold', {
src\Network\Receive.pm:3865:		Plugins::callHook('vending_item_sold_out', {
src\Network\Receive.pm:3940:		Plugins::callHook('packet_vender_store', { item => $item });
src\Network\Receive.pm:3955:	Plugins::callHook('packet_vender_store2', {
src\Network\Receive.pm:4233:		Plugins::callHook('pvp_mode', {pvp => $pvp});# 1 PvP, 2 GvG, 3 Battleground
src\Network\Receive.pm:4275:	Plugins::callHook('packet_areaSpell', {
src\Network\Receive.pm:4322:	Plugins::callHook('packet_areaSpell', {
src\Network\Receive.pm:4371:	Plugins::callHook('packet_areaSpell', {
src\Network\Receive.pm:4643:			Plugins::callHook('quest_mission_added', {
src\Network\Receive.pm:4650:	Plugins::callHook('quest_list');
src\Network\Receive.pm:4703:			Plugins::callHook('quest_mission_added', {
src\Network\Receive.pm:4771:		Plugins::callHook('quest_mission_added', {
src\Network\Receive.pm:4777:	Plugins::callHook('quest_added', {questID => $args->{questID}});
src\Network\Receive.pm:4870:		Plugins::callHook('quest_mission_updated', {
src\Network\Receive.pm:4941:	Plugins::callHook('npc_chat', {
src\Network\Receive.pm:4967:	Plugins::callHook('makable_item_list', {item_list => $makableList});
src\Network\Receive.pm:5324:		Plugins::callHook('invalid_password');
src\Network\Receive.pm:5352:		Plugins::callHook('dial');
src\Network\Receive.pm:5371:		Plugins::callHook('invalid_password');
src\Network\Receive.pm:5538:	Plugins::callHook('chat_created', {chat => $chatRooms{$accountID}});
src\Network\Receive.pm:5565:	Plugins::callHook('packet_chatinfo', {
src\Network\Receive.pm:5609:	Plugins::callHook('chat_joined', {chat => $chat});
src\Network\Receive.pm:5674:	Plugins::callHook('chat_modified', {
src\Network\Receive.pm:5749:		Plugins::callHook('chat_leave');
src\Network\Receive.pm:5763:	Plugins::callHook('chat_removed', {
src\Network\Receive.pm:5795:		Plugins::callHook('error_deal', {type => $args->{type}});
src\Network\Receive.pm:5798:		Plugins::callHook('error_deal', {type => $args->{type}});
src\Network\Receive.pm:5816:		Plugins::callHook('engaged_deal', {name => $currentDeal{name}});
src\Network\Receive.pm:5819:		Plugins::callHook('error_deal', {type =>$args->{type}});
src\Network\Receive.pm:5822:		Plugins::callHook('error_deal', {type =>$args->{type}});
src\Network\Receive.pm:5831:	Plugins::callHook('cancelled_deal');
src\Network\Receive.pm:5839:	Plugins::callHook('complete_deal');
src\Network\Receive.pm:5847:		Plugins::callHook('finalized_deal', {name => $currentDeal{name}});
src\Network\Receive.pm:5866:	Plugins::callHook('incoming_deal', {
src\Network\Receive.pm:5964:	Plugins::callHook('packet_emotion', {
src\Network\Receive.pm:6007:	Plugins::callHook('disconnected') if ($net->getState() == Network::IN_GAME);
src\Network\Receive.pm:6147:	Plugins::callHook('friend_request', {
src\Network\Receive.pm:6945:	Plugins::callHook('packet_useitem', \%hook_args);
src\Network\Receive.pm:6992:	Plugins::callHook('item_appeared', {
src\Network\Receive.pm:7022:	Plugins::callHook('item_exists', {
src\Network\Receive.pm:7245:	Plugins::callHook('Network::Receive::map_changed', {
src\Network\Receive.pm:7361:	Plugins::callHook('Network::Receive::map_changed', {
src\Network\Receive.pm:7427:		Plugins::callHook('npc_autotalk', {
src\Network\Receive.pm:7448:	Plugins::callHook('npc_talk', {
src\Network\Receive.pm:7477:	Plugins::callHook('npc_talk_done', {ID => $ID});
src\Network\Receive.pm:7525:		Plugins::callHook('npc_autotalk', {
src\Network\Receive.pm:7556:	Plugins::callHook('npc_talk_responses', {
src\Network\Receive.pm:7707:	Plugins::callHook('buy_result', {fail => $args->{fail}});
src\Network\Receive.pm:7862:	Plugins::callHook('deal_you_added', {
src\Network\Receive.pm:7992:		Plugins::callHook('add_player_list', $actor);
src\Network\Receive.pm:7993:		Plugins::callHook('player', {player => $actor});  #backwards compatibility
src\Network\Receive.pm:7994:		Plugins::callHook('player_exist', {player => $actor});
src\Network\Receive.pm:8007:		Plugins::callHook('player_disappeared', {player => $player});
src\Network\Receive.pm:8202:			Plugins::callHook('packet_partyJoin', { partyName => bytesToString($info->{name}) });
src\Network\Receive.pm:8255:	Plugins::callHook('packet_partyMsg', {
src\Network\Receive.pm:8322:	Plugins::callHook('party_invite', {
src\Network\Receive.pm:8471:	Plugins::callHook('party_users_info_ready');
src\Network\Receive.pm:8576:	Plugins::callHook('rodex_mail_list', {
src\Network\Receive.pm:8659:	Plugins::callHook('rodex_mail', {
src\Network\Receive.pm:8673:	Plugins::callHook('rodex_unread_mail');
src\Network\Receive.pm:8830:	Plugins::callHook('rodex_mail_deleted', {
src\Network\Receive.pm:8964:	Plugins::callHook('packet_clanMsg', {
src\Network\Receive.pm:9160:	Plugins::callHook('cooking_list', {
src\Network\Receive.pm:9275:		Plugins::callHook('search_store', $universalCatalogInfo);
src\Network\Receive.pm:9324:	Plugins::callHook('packet_message_string', {
src\Network\Receive.pm:9382:		Plugins::callHook($hook, {
src\Network\Receive.pm:9408:	Plugins::callHook('packet_charSkills', {
src\Network\Receive.pm:9638:	Plugins::callHook ('captcha_image', $hookArgs);
src\Network\Receive.pm:9647:	Plugins::callHook ('captcha_file', $hookArgs);
src\Network\Receive.pm:9661:	Plugins::callHook ('captcha_answer', {flag => $args->{flag}});
src\Network\Receive.pm:9723:		Plugins::callHook('packet_open_buying_store', {
src\Network\Receive.pm:9741:		Plugins::callHook('packet_buying', {ID => $ID});
src\Network\Receive.pm:9793:		Plugins::callHook('packet_buying_store', {
src\Network\Receive.pm:9818:	Plugins::callHook('packet_buying_store2', {
src\Network\Receive.pm:9869:		Plugins::callHook('packet_buyer', {ID => $ID});
src\Network\Receive.pm:9889:		Plugins::callHook('buyer_shop_closed');
src\Network\Receive.pm:9941:	Plugins::callHook('packet_special_item_obtain', {
src\Network\Receive.pm:9968:		Plugins::callHook('packet_sentPM', {
src\Network\Receive.pm:10101:		Plugins::callHook('memo_fail', {field => $field->baseName});
src\Network\Receive.pm:10104:		Plugins::callHook('memo_success', {field => $field->baseName});
src\Network\Receive.pm:10488:	Plugins::callHook('instance_ready');
src\Network\Receive.pm:10637:					Plugins::callHook('equipped_item', {slot => $equipSlot_lut{$_}, item => $item});
src\Network\Receive.pm:10665:					Plugins::callHook('equipped_item_sw', {slot => $equipSlot_lut{$_}, item => $item});
src\Network\Receive.pm:10843:				Plugins::callHook('packet_item_removed', {index => $item->{binID}});
src\Network\Receive.pm:11204:		Plugins::callHook('parseMsg/addPrivMsgUser', {
src\Network\Receive.pm:11216:	Plugins::callHook('packet_privMsg', {
src\Network\Receive.pm:11389:	Plugins::callHook('packet_selfChat', {
src\Network\Receive.pm:11496:	Plugins::callHook('is_casting', {
src\Network\Receive.pm:11567:	Plugins::callHook('packet_castCancelled', {
src\Network\Receive.pm:11615:				Plugins::callHook('unequipped_item', {
src\Network\Receive.pm:11646:				Plugins::callHook('unequipped_item_sw', {
src\Network\Receive.pm:11682:		Plugins::callHook('packet_vender', {
src\Network\Receive.pm:11718:	Plugins::callHook('packet_charSkills', {
src\Network\Receive.pm:11799:	Plugins::callHook('packet_skillfail', {
src\Network\Receive.pm:11812:		Plugins::callHook('open_store_success');
src\Network\Receive.pm:11816:		Plugins::callHook('open_store_fail', { flag => $args->{flag} });
src\Network\Receive.pm:11954:	Plugins::callHook('banking_opened');
src\Network\Receive.pm:11970:		Plugins::callHook('banking_deposit_success');
src\Network\Receive.pm:11979:	Plugins::callHook('banking_deposit_failed', {'reason' => $args->{reason}});
src\Network\Receive.pm:11994:		Plugins::callHook('banking_withdraw_success');
src\Network\Receive.pm:12001:	Plugins::callHook('banking_withdraw_failed', {'reason' => $args->{reason}});
src\Network\Receive.pm:12020:	Plugins::callHook('navigate_to', $args);
src\Network\Receive.pm:12260:		Plugins::callHook ('captcha_image', $hookArgs);
src\Network\Receive.pm:12261:		Plugins::callHook ('captcha_file', {file => $file});
src\Network\Send\ServerType1.pm:37:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType1.pm:38:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType1.pm:56:	Plugins::callHook('packet_pre/sendSit', \%args);
src\Network\Send\ServerType1.pm:74:	Plugins::callHook('packet_pre/sendStand', \%args);
src\Network\Send\ServerType1.pm:151:	Plugins::callHook('packet_pre/sendSkillUse', \%args);
src\Network\Send\ServerType10.pm:39:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType10.pm:40:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType10.pm:59:	Plugins::callHook('packet_pre/sendAttack', \%args);
src\Network\Send\ServerType2.pm:44:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType2.pm:45:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType3.pm:59:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType3.pm:60:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType4.pm:45:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType4.pm:46:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType5.pm:57:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType5.pm:58:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType6.pm:36:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType6.pm:37:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType7.pm:35:	Plugins::callHook('packet_pre/sendAttack', \%args);
src\Network\Send\ServerType7.pm:55:	Plugins::callHook('packet_pre/sendSit', \%args);
src\Network\Send\ServerType7.pm:73:	Plugins::callHook('packet_pre/sendStand', \%args);
src\Network\Send\ServerType7.pm:96:	Plugins::callHook('packet_pre/sendSkillUse', \%args);
src\Network\Send\ServerType8.pm:65:	Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);
src\Network\Send\ServerType8.pm:66:	Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);
src\Network\Send\ServerType8.pm:85:	Plugins::callHook('packet_pre/sendAttack', \%args);
src\Network\Send\ServerType8.pm:103:	Plugins::callHook('packet_pre/sendStand', \%args);
src\Network\Send\ServerType8.pm:120:	Plugins::callHook('packet_pre/sendSit', \%args);
src\Network\Send\ServerType8.pm:140:	Plugins::callHook('packet_pre/sendSkillUse', \%args);
src\Network\Send\ServerType8_1.pm:54:	Plugins::callHook('packet_pre/sendAttack', \%args);
src\Network\Send\ServerType8_1.pm:141:	Plugins::callHook('packet_pre/sendSit', \%args);
src\Network\Send\ServerType8_1.pm:160:	Plugins::callHook('packet_pre/sendStand', \%args);
src\Network\Send\ServerType8_1.pm:182:	Plugins::callHook('packet_pre/sendSkillUse', \%args);
src\Network\Send\ServerType8_3.pm:48:	Plugins::callHook('packet_pre/sendSit', \%args);
src\Network\Send\ServerType8_3.pm:66:	Plugins::callHook('packet_pre/sendAttack', \%args);
src\Network\Send\ServerType8_3.pm:94:	Plugins::callHook('packet_pre/sendStand', \%args);
src\Network\Send\ServerType8_5.pm:46:	Plugins::callHook('packet_pre/sendSkillUse', \%args);
src\Network\Send\ServerType8_5.pm:180:	Plugins::callHook('packet_pre/sendAttack', \%args);
src\Network\Send.pm:245:		Plugins::callHook($hookName, \%args);
src\Network\Send.pm:487:	Plugins::callHook('packet/sendMapLoaded');
src\Network\Send.pm:536:	Plugins::callHook('packet_pre/sendAttack', \%args) if $flag == ACTION_ATTACK || $flag == ACTION_ATTACK_REPEAT;
src\Network\Send.pm:537:	Plugins::callHook('packet_pre/sendSit', \%args) if $flag == ACTION_SIT || $flag == ACTION_STAND;
src\Network\Send.pm:826:	Plugins::callHook('packet_pre/sendSkillUse', \%args);
src\Network\XKore.pm:120:	Plugins::callHook('Network::serverSend/pre', {msg => \$msg});
src\Network\XKore.pm:140:		Plugins::callHook('Network::stateChanged');
src\Network\XKore.pm:243:		Plugins::callHook('disconnected');
src\Network\XKore.pm:264:	Plugins::callHook('XKore_start');
src\Plugins.pm:394:# Add a hook for $hookname. Whenever Kore calls Plugins::callHook('foo'),
src\Plugins.pm:397:# See also Plugins::callHook() for information about how callback is called.
src\Plugins.pm:413:#     Plugins::callHook('AI_pre');   # <-- ai_called() is now also called.
src\Plugins.pm:521:# void Plugins::callHook(String hookName, [argument])
src\Plugins.pm:526:# Adding or removing callbacks during callHook will not affect the current call.
src\Plugins.pm:534:sub callHook {
src\Poseidon\Client.pm:82:	Plugins::callHook('Poseidon/client_authenticate', {
src\Poseidon\QueryServer.pm:78:	Plugins::callHook('Poseidon/server_authenticate', {
src\Settings.pm:348:	Plugins::callHook( usage => $data );
src\Settings.pm:502:	Plugins::callHook('pre_load_'.$internalFilename, $pre_load);
src\Settings.pm:550:		Plugins::callHook('load_'.$internalFilename, $load);
src\Settings.pm:555:		Plugins::callHook('pos_load_'.$internalFilename, $pos_load);
src\Settings.pm:557:		Plugins::callHook('load_'.$internalFilename, $load);
src\Settings.pm:561:		Plugins::callHook('pos_load_'.$internalFilename, $pos_load);
src\Settings.pm:603:	Plugins::callHook('preloadfiles', {files => $files});
src\Settings.pm:607:		Plugins::callHook('loadfiles', {
src\Settings.pm:615:	Plugins::callHook('postloadfiles', {files => $files});
src\Task\MapRoute.pm:194:					Plugins::callHook('npc_teleport_missing' => \%plugin_args);
src\Task\MapRoute.pm:407:				Plugins::callHook('Task::MapRoute::iterate::missing_portal', \%plugin_args);
src\Task\MapRoute.pm:484:					Plugins::callHook('Task::MapRoute::iterate::route_portal_near', \%plugin_args);
src\Task\Route.pm:313:			Plugins::callHook('route', {status => 'success'});
src\Task\Route.pm:414:			Plugins::callHook('route', {status => 'success'});
src\Task\Route.pm:426:			Plugins::callHook('route', {status => 'success'});
src\Task\Route.pm:469:				Plugins::callHook('route', {status => 'stuck'});
src\Task\Route.pm:599:	Plugins::callHook('getRoute' => \%plugin_args);
src\test\PluginsHookTest.pm:29:	Plugins::callHook('hook2');
src\test\PluginsHookTest.pm:31:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:39:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:41:	Plugins::callHook('hook2');
src\test\PluginsHookTest.pm:43:	Plugins::callHook('hook3');
src\test\PluginsHookTest.pm:51:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:53:	Plugins::callHook('hook2');
src\test\PluginsHookTest.pm:61:	Plugins::callHook('hook2');
src\test\PluginsHookTest.pm:63:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:71:	Plugins::callHook('hook2');
src\test\PluginsHookTest.pm:73:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:93:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:95:	Plugins::callHook('hook2');
src\test\PluginsHookTest.pm:102:	Plugins::callHook('hook1');
src\test\PluginsHookTest.pm:124:	Plugins::callHook('add_during_call');
src\test\PluginsHookTest.pm:129:	Plugins::callHook('add_during_call');
src\test\PluginsHookTest.pm:134:	Plugins::callHook('add_during_call');
src\test\PluginsHookTest.pm:139:	Plugins::callHook('add_during_call');
src\test\PluginsHookTest.pm:156:	Plugins::callHook('del_during_call');
src\test\PluginsHookTest.pm:161:	Plugins::callHook('del_during_call');
src\test\PluginsHookTest.pm:166:	Plugins::callHook('del_during_call');
src\test\PluginsHookTest.pm:171:	Plugins::callHook('del_during_call');
src\test\PluginsHookTest.pm:176:	Plugins::callHook('del_during_call');
src\Utils\PathFinding.pm:103:	Plugins::callHook('PathFindingReset', \%hookArgs);