https://openkore.com/api.php?action=feedcontributions&user=4epT&feedformat=atomOpenKore Wiki - User contributions [en]2024-03-28T08:59:58ZUser contributionsMediaWiki 1.34.1https://openkore.com/index.php?title=teleportAuto_dropTargetKS&diff=7089teleportAuto dropTargetKS2023-05-21T18:09:29Z<p>4epT: </p>
<hr />
<div>; teleportAuto_dropTargetKS [<[[boolean]]>]<br />
: Automatically teleport when Kore drops a target to avoid kill-stealing other players. <br />
<br />
:'''Note.''' This is a workaround for constantly dropping and selecting the same target.<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=avoidHiddenActors&diff=7088avoidHiddenActors2023-05-21T16:59:51Z<p>4epT: </p>
<hr />
<div>; avoidHiddenActors <[[boolean]]><br />
: Determines if openkore will avoid interact with HIDDEN Actors (NPC / Monster).<br />
<br />
:{|border="1" cellpadding="2" cellspacing="1" <br />
|- style=background-color:#F9F9F9;<br />
|-<br />
!Value<br />
!Description<br />
|-<br />
! 0<br />
| Do not avoid and interact with Hidden Actors.<br />
|-<br />
! 1<br />
| Avoid and not interact with Hidden Actors.<br />
|}<br />
<br />
== Notes ==<br />
* This should be used only if there are more then 1 NPC in same cell and in other specific cases. Do not enable this if you do not know what you are doing.<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=avoidHiddenMonsters&diff=7087avoidHiddenMonsters2023-05-21T16:59:26Z<p>4epT: </p>
<hr />
<div>; avoidHiddenMonsters <[[boolean]]><br />
: Determines if openkore will attack Hidden Monsters.<br />
<br />
:{|border="1" cellpadding="2" cellspacing="1" <br />
|- style=background-color:#F9F9F9;<br />
|-<br />
!Value<br />
!Description<br />
|-<br />
! 0<br />
| Do not avoid and interact with Hidden Monsters.<br />
|-<br />
! 1<br />
| Avoid and not interact with Hidden Monsters.<br />
|}<br />
<br />
== Notes ==<br />
* If set to 1 Openkore will also drop the target if it uses Hiding/Cloacking.<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=reputation&diff=7064reputation2023-05-03T23:48:50Z<p>4epT: </p>
<hr />
<div>; reputation<br />
: Show the points of reputation system<br />
: Check https://hazyforest.com/reputation<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=attackSkillSlot&diff=7063attackSkillSlot2023-05-03T21:59:02Z<p>4epT: </p>
<hr />
<div>Uses specified skill when attacking and all specified conditions are met.<br />
<br />
== Syntax ==<br />
attackSkillSlot [<[[References#Skill_Names|skill name]]>] {<br />
dist [<[[number]]>]<br />
maxAttempts [<[[number]]>]<br />
maxUses [<[[number]]>]<br />
previousDamage [<[[References#Range_Operators|range]]>]<br />
isStartSkill <[[References#boolean_flag|boolean flag]]><br />
<br />
# [[:Category:Skill Use Condition|Skill Use Condition]]s, including [[isSelfSkill]]<br />
# [[:Category:Self Condition|Self Condition]]s<br />
# [[:Category:Monster Condition|Target Monster Condition]]s<br />
}<br />
<br />
<br />
=== Attribute definitions ===<br />
----<br />
; attackSkillSlot <[[References#Skill_Names|skill name]]><br />
: This option specifies the skill to automatically use when attacking.<br />
<br />
<br />
; dist [<[[number]]>]<br />
: This option specifies the distance (in number of blocks) from the monster that Kore will move to before using this skill.<br />
<br />
::'''Notes:'''<br />
::* This is not a list, so specify only one number.<br />
::* If this option is not set, Kore will use the distance you specified in [[attackDistance]] and [[attackMaxDistance]].<br />
<br />
<br />
; maxAttempts [<[[number]]>]<br />
: This option specifies the maximum number of attempts allowed to use this skill. Use this to limit usage of skills that could fail (e.g. Steal).<br />
<br />
<br />
; maxUses [<[[number]]>]<br />
: This option specifies the maximum number of successful usage allowed for this skill.<br />
<br />
:: '''Note.''' <br />
::* This attribute only counts successful usage. If a skill fails, Kore will continue to use the skill until it finally succeeds even if this option is set to '''1'''. <br />
<br />
<br />
; previousDamage <[[References#Range_Operators|range]]><br />
: If this option is set, the skill will only be used if the damage you have dealt to the monster is within the specified range<br />
<br />
<br />
; isStartSkill <[[References#boolean_flag|boolean flag]]><br />
: If this option is set, openkore will send hotkey macro (skill start/end) packet<br />
Seems to work only with [https://irowiki.org/wiki/Rolling_Cutter Rolling Cutter]<br />
<br />
== Example ==<br />
* Use [http://irowiki.org/wiki/Holy_Cross Holy Cross] on monsters Khalitzburg, Raydric, Whisper:<br />
attackSkillSlot Holy Cross {<br />
lvl 10<br />
dist 1.5<br />
sp > 30<br />
monsters Khalitzburg,Raydric,Whisper,Whisper Boss<br />
}<br />
<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]<br />
[[Category:config block]]</div>4epThttps://openkore.com/index.php?title=itemsGatherAutoMinPortalDistance&diff=7053itemsGatherAutoMinPortalDistance2023-05-01T22:40:24Z<p>4epT: Created page with "; itemsGatherAutoMinPortalDistance <number> ... The default value is 5. Category:config.txt Category:items"</p>
<hr />
<div>; itemsGatherAutoMinPortalDistance <[[number]]><br />
<br />
...<br />
The default value is 5.<br />
<br />
[[Category:config.txt]]<br />
[[Category:items]]</div>4epThttps://openkore.com/index.php?title=itemsGatherAutoMinPlayerDistance&diff=7052itemsGatherAutoMinPlayerDistance2023-05-01T22:29:26Z<p>4epT: Created page with "; itemsGatherAutoMinPlayerDistance <number> ... The default value is 6. Category:config.txt Category:items"</p>
<hr />
<div>; itemsGatherAutoMinPlayerDistance <[[number]]><br />
<br />
...<br />
The default value is 6.<br />
<br />
[[Category:config.txt]]<br />
[[Category:items]]</div>4epThttps://openkore.com/index.php?title=skill_Use_Command&diff=7051skill Use Command2023-05-01T20:51:07Z<p>4epT: </p>
<hr />
<div>; ss (<skill ID> | <skill handle> | <skill name>) [<skill level>]<br />
; ss start (<skill ID> | <skill handle> | <skill name>) [<skill level>]<br />
; ss stop<br />
; sl (<skill ID> | <skill handle> | <skill name>) [(x) (y)] [<skill level>]<br />
; (sp | sm | ssl | ssp} {<skill ID> | <skill handle> | <skill name>) (<target binID>) [<skill level>]<br />
<br />
: '''ss''': use '''s'''kill on '''s'''elf<br />
: '''sl''': use '''s'''kill on ground '''l'''ocation<br />
: '''sp''': use '''s'''kill on '''p'''layer<br />
: '''sm''': use '''s'''kill on '''m'''onster<br />
: '''ssl''': use '''s'''kill on '''sl'''ave<br />
: '''ssp''': use '''s'''kill on ground '''sp'''ell<br />
: '''<skill ID>''': configuration-independent number of the skill from your '''[[skills|skills list]]'''<br />
: '''<skill handle>''': configuration-independent handle of the skill (such as AL_HEAL)<br />
: '''<skill name>''': configuration-<span style="color:red;">dependent</span> skill name from your '''[[skills|skills list]]'''<br />
: '''<x>, <y>''': coordinates of the location point to cast the skill on. If not provided, our position is used<br />
: '''<target binID>''': the number of a target from the corresponding '''[[Actor List Command]]'''<br />
: '''<skill level>''': the level of skill to use<br />
<br />
== Notes ==<br />
<br />
TODO: examples of which skills are used with which command?<br />
<br />
== Examples ==<br />
{| class="wikitable" border="1" cellspacing="0"<br />
|-style=background-color:#F9F9F9;<br />
!Command<br />
!Description<br />
|-<br />
|align=center|ss 10 <br />
|Attempt to use skill number 10 on yourself. <br />
|-<br />
|align=center|ss 10 5<br />
|Attempt to use skill number 10, level 5 on yourself.<br />
|-<br />
|align=center|sm 10 2<br />
|Attempt to use skill number 10 on monster number 2. <br />
|-<br />
|align=center|sm 10 2 10<br />
|Attempt to use skill number 10, level 10 on monster number 2.<br />
|-<br />
|align=center|sl 10 231 115 <br />
|Attempt to use skill number 10 at location 231, 115. <br />
|-<br />
|align=center|sl 10 7<br />
|Attempt to use skill number 10, level 7 at our standing location.<br />
|}</div>4epThttps://openkore.com/index.php?title=ssp&diff=7050ssp2023-04-30T22:03:58Z<p>4epT: Changed redirect target from Skill Use Command to skill Use Command</p>
<hr />
<div>#REDIRECT [[skill Use Command]]<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=ssl&diff=7049ssl2023-04-30T22:03:48Z<p>4epT: Changed redirect target from Skill Use Command to skill Use Command</p>
<hr />
<div>#REDIRECT [[skill Use Command]]<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=sl&diff=7048sl2023-04-30T22:03:05Z<p>4epT: Changed redirect target from Skill Use Command to skill Use Command</p>
<hr />
<div>#REDIRECT [[skill Use Command]]<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=sm&diff=7047sm2023-04-30T22:02:53Z<p>4epT: Changed redirect target from Skill Use Command to skill Use Command</p>
<hr />
<div>#REDIRECT [[skill Use Command]]<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=sp&diff=7046sp2023-04-30T22:02:42Z<p>4epT: </p>
<hr />
<div>'''''sp''' is also a console command for [[skill Use Command|using skills on players]].''<br />
<br />
''Self Condition:''<br />
; sp <[[References#Range_Operators|range]]>[%]<br />
; homunculus_sp <[[References#Range_Operators|range]]>[%]<br />
: If this option is set, the block will only be used if the amount of SP is within the specified range. The amount of SP can be in % (percent) or it can the the absolute amount of SP. <br />
<br />
== Examples ==<br />
<br />
Use Blue Potion when SP is bellow 10:<br />
useSelf_item Blue Potion {<br />
sp < 10<br />
}<br />
<br />
Use Blue Potion when SP is bellow 10%. So, if you have 200 maximum SP it will use Blue Potion when your SP is bellow 20:<br />
useSelf_item Blue Potion {<br />
sp < 10%<br />
}<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=ss&diff=7045ss2023-04-30T22:02:01Z<p>4epT: Changed redirect target from Skill Use Command to skill Use Command</p>
<hr />
<div>#REDIRECT [[skill Use Command]]<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=monstersCount&diff=7044monstersCount2023-04-15T22:01:31Z<p>4epT: </p>
<hr />
<div>''[[:Category:Self Condition|Self Condition]]s:''<br />
; monstersCount <[[References#Range_Operators|range]]><br />
<br />
: Use this block to cast a skill when the amount of monsters which are visible to Kore matches the specified range.<br />
<br />
== Example ==<br />
<br />
attackSkillSlot Storm Gust {<br />
monstersCount > 3<br />
}<br />
<br />
: Storm Gust will be cast when 3 or more monsters are visible to Kore.<br />
<br />
<br />
; monstersCountDist <[[References#Range_Operators|range]]><br />
: this block parameter limits the scope of the '''monstersCount''' parameter. This parameter allows you to ignore monsters that are far from the OpenKore.<br />
<br />
== Example ==<br />
<br />
attackSkillSlot Storm Gust {<br />
monstersCount > 3<br />
monstersCountDist < 5<br />
}<br />
<br />
: The "Storm Gust" skill will work when there are more than 3 monsters within a radius of 5 cells from the OpenKore.<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=logToFile_Debug&diff=7043logToFile Debug2023-04-15T14:06:20Z<p>4epT: </p>
<hr />
<div>; logToFile_Debug [see below]<br />
; logToFile_Messages [see below]<br />
; logToFile_Warnings [see below]<br />
; logToFile_Errors [see below]<br />
<br />
: These options enable the logging of Messages, Errors, Warnings and Debug informations to Files. These are only interesting for Developers or if you want to save special domains to a file. The files are created in you Log folder.<br />
<br />
:The value for these options observes the following syntax:<br />
<br />
<domain>=<filename><br />
<domain>=<filename1>,<filename2><br />
<domain1>=<filename1>;<domain2>=<filename2>,<filename3><br />
<br />
<br />
''' Examples '''<br />
* Log all debug messages for the parseMsg domain to messages.txt.<br />
logToFile_Debug parseMsg=messages.txt<br />
<br />
<br />
* Log all selfSkill messages to selfskill.txt and all used items to usedItems.txt.<br />
logToFile_Messages selfSkill=selfskill.txt;useItem=usedItems.txt<br />
<br />
[[Category:config.txt]]<br />
[[Category:log]]</div>4epThttps://openkore.com/index.php?title=logToFile_Warnings&diff=7042logToFile Warnings2023-04-15T14:03:16Z<p>4epT: Changed redirect target from logToFile to logToFile Debug</p>
<hr />
<div>#REDIRECT [[logToFile_Debug]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:log]]</div>4epThttps://openkore.com/index.php?title=logToFile_Messages&diff=7041logToFile Messages2023-04-15T14:03:00Z<p>4epT: Changed redirect target from logToFile to logToFile Debug</p>
<hr />
<div>#REDIRECT [[logToFile_Debug]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:log]]</div>4epThttps://openkore.com/index.php?title=logToFile_Errors&diff=7040logToFile Errors2023-04-15T14:01:59Z<p>4epT: Changed redirect target from logToFile to logToFile Debug</p>
<hr />
<div>#REDIRECT [[logToFile_Debug]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:log]]</div>4epThttps://openkore.com/index.php?title=logToFile_Debug&diff=7039logToFile Debug2023-04-15T14:01:20Z<p>4epT: 4epT moved page logToFile to logToFile Debug without leaving a redirect</p>
<hr />
<div>; logToFile_Debug [see below]<br />
; logToFile_Errors [see below]<br />
; logToFile_Messages [see below]<br />
; logToFile_Warnings [see below]<br />
: These options enable the logging of Messages, Errors, Warnings and Debug informations to Files. These are only interesting for Developers or if you want to save special domains to a file. The files are created in you Log folder.<br />
<br />
:The value for these options observes the following syntax:<br />
<br />
<domain>=<filename><br />
<domain>=<filename1>,<filename2><br />
<domain1>=<filename1>;<domain2>=<filename2>,<filename3><br />
<br />
<br />
''' Examples '''<br />
* Log all debug messages for the parseMsg domain to messages.txt.<br />
logToFile_Debug parseMsg=messages.txt<br />
<br />
<br />
* Log all selfSkill messages to selfskill.txt and all used items to usedItems.txt.<br />
logToFile_Messages selfSkill=selfskill.txt;useItem=usedItems.txt<br />
<br />
[[Category:config.txt]]<br />
[[Category:log]]</div>4epThttps://openkore.com/index.php?title=playerLog&diff=7038playerLog2023-04-15T09:54:55Z<p>4epT: Created page with "; playerLog <boolean> : Enables logging of players you meet outside cities. : {{LogSettings}} Category:config.txt Category:log"</p>
<hr />
<div>; playerLog <[[boolean]]><br />
: Enables logging of players you meet outside cities.<br />
<br />
: {{LogSettings}}<br />
<br />
[[Category:config.txt]]<br />
[[Category:log]]</div>4epThttps://openkore.com/index.php?title=Template:Index/MainLinks&diff=7037Template:Index/MainLinks2023-04-09T21:37:49Z<p>4epT: </p>
<hr />
<div>__NOTOC__<br />
<br />
= Starting with OpenKore=<br />
{|class="indextable"<br />
!I want to bot on official servers<br />
!I want to bot on private servers<br />
|-<br />
|<br />
* Download through [https://github.com/OpenKore/openkore GitHub]<br />
* [[How_to_run_OpenKore|Install a Perl interpreter to be able to run OpenKore]]<br />
* Configure a [[poseidon|Poseidon Server]], if the server uses [http://global.nprotect.com/product/gg.php GameGuard]<br />
** You can run the Poseidon on a separate machine using [[Poseidon Remote]]<br />
** If you use Windows 7 you must setup a [[Poseidon_Server_and_Virtual_Machines|Virtual Machine]]<br />
* Run OpenKore using '''start.exe''', '''openkore.pl''' or other [[:Category:Interfaces|interfaces]].<br />
|<br />
* Download through [https://github.com/OpenKore/openkore GitHub]<br />
* [[How_to_run_OpenKore|Install a Perl interpreter to be able to run OpenKore]]<br />
* Check the [[Unsupported servers|list of collected private server settings]]. '''Did not find your server?''' Read the guides:<br />
** [[Connectivity_Guide|Extracting data from the server]]<br />
** [[serverType|Configuring serverType]]<br />
** [[Packet_Length_Extractor|Extracting recvpackets]]<br />
* If the server uses ASCII protection, [http://forums.openkore.com/viewtopic.php?f=9&t=165653 read this topic]<br />
* Run OpenKore using '''start.exe''', '''openkore.pl''' or other [[:Category:Interfaces|interfaces]].<br />
|-<br />
!colspan="2" id="status-official-servers"|Status of botting on Official Servers<br />
|-<br />
|colspan="2"|<br />
{| class="indextable" style="color: black; background-color: #ffffcc; width: 85%;margin:auto;"<br />
!|Server Code||Description||Vendor||Protection||Supporter||Status<br />
|-<br />
|[https://playragnarokonlinebr.com/ bRO]||Brazil RO||WarpPortal Brazil||EAC||N/A||Not botable<br />
|-<br />
|[http://ro.zhaouc.com/ cRO]||China RO||GNJoy||nProtect||alisonrag||Botable<br />
|-<br />
|[https://eu.4game.com/en/roprime/ euRO]||Europe RO (Revo-Classic)||4Games||Frost Security||ya4ept||Not botable<br />
|-<br />
|[https://eu.4game.com/ro/#ro euRO Prime]||Europe RO (Renewal, like Transcendence)||4Games||Frost Security||N/A||Not botable<br />
|-<br />
|[http://renewal.playragnarok.com/ iRO Renewal]||International RO (Renewal)||WarpPortal||EAC||N/A||Not botable<br />
|-<br />
|[https://ro.gnjoy.id/ idRO]||Indonesia RO||GNJoy||EAC||N/A||Not botable<br />
|-<br />
|[https://ragnarokonline.gungho.jp/ jRO]||Japan RO||GungHo||nProtect||alisonrag, sctnightcore, ya4ept||Need Verification<br />
|-<br />
|[http://ro.gnjoy.com/ kRO]||Korea RO||GNJoy|| nProtect||alisonrag||Botable<br />
|-<br />
|[http://roz.gnjoy.com/ kRO Zero]||Korea RO Zero||GNJoy||nProtect||alisonrag||Botable<br />
|-<br />
|[https://ru.4game.com/roprime/ ruRO Prime]||Russia RO (Renewal, like Transcendence)||4Games||Frost Security||ya4ept||Not botable<br />
|-<br />
|[https://ro.gnjoy.in.th/ tRO (GGT)]||Thailand RO||GNJoy||EAC||N/A||Not botable<br />
|-<br />
|[https://ro.gnjoy.com.tw/ twRO]||Taiwan RO||GNJoy||CheatDefender||N/A||Not botable<br />
|-<br />
|[https://ro.vtcgame.vn/ vRO]||Vietnam RO||VTCgame||nProtect||N/A||Not botable<br />
|}<br />
|-<br />
!colspan="2"|Having trouble connecting or running your bot?<br />
|-<br />
|colspan="2"|<br />
* Read the [[Frequently_Asked_Questions|FAQ]].<br />
* Get help from other users from the [http://forums.openkore.com/ international forum] or [https://discord.gg/kmvfgYAfhC discord]<br />
* Get help from other (translated) wikis: [https://ro-fan.ru/wiki/ russian].<br />
|}<br />
<br />
= Configuring your bot =<br />
<br />
{|class="indextable"<br />
!Quick Settings<br />
|-<br />
|<br />
* What kind of bot you want?<br />
** [[Configure_a_hunting_bot|Configure a hunter bot]] - Rogues, Knights, etc.<br />
** [[Configure_a_support_bot|Configure a support bot]] - Priests, etc.<br />
** [[Configure_a_vending_bot|Configure a vending bot]]<br />
* Other [[:Category:Examples_of_configurations|examples of configurations]].<br />
|}<br />
<br />
= Customizing your settings =<br />
<br />
{|class="indextable"<br />
!Configuration Files<br />
! Plugins<br />
|-<br />
|rowspan="3"|<br />
* [[:Category:control|Control folder]]<br />
* [[avoid.txt]] - Avoid players<br />
* [[arrowcraft.txt]] - Autocraft arrows<br />
* [[:Category:config.txt|config.txt]] - Main configuration options<br />
** [[:Category:Self Condition|Self]] conditions<br />
** Target [[:Category:Monster Condition|monster]] and [[:Category:Player Condition|player]] conditions<br />
** [[:Category:Skill Use Condition|Skill use]] conditions<br />
** [[:Category:Idle Condition|Idle]] conditions<br />
** [[:Category:config_block|Config block]] - Actions to be automatically executed in specific conditions<br />
** [[:Category:Examples of configurations|Examples of configurations]]<br />
* [[items_control.txt]] - Configurations to manange your items<br />
* [[mon_control.txt]] - Configurations related to monsters<br />
* [[pickupitems.txt]] - Prioritize specific items<br />
* [[priority.txt]] - Prioritize specific monsters<br />
* [[routeweights.txt]] - Prioritize specific maps<br />
* [[shop.txt]] - Shop configurations<br />
* [[sys.txt]] - Low level configurations<br />
* [[timeouts.txt]] - Time configurations for specific actions<br />
|<br />
* [[:Category:Plugins|How to get, use, create; Specific plugin docs]]<br />
* [[Profiles]] - How to create and use profiles<br />
* [[eventMacro]] - How to write macros for EventMacro plugin<br />
* [[macro]] - How to write macros for Macro plugin<br />
* [[hooks]] - List and explanations of hooks<br />
* [[Installing Modules]] - Required for the functioning of some plugins<br />
<br />
|- <br />
!Other articles<br />
|-<br />
|<br />
* [[:Category:Console_Command|Console Commands]] - Commands used in the console of OpenKore<br />
* [[References]] - Instructions and explanations of the syntax used in settings<br />
* [[Overview]] - All functions and settings in OpenKore<br />
* [[:Category:Interfaces|Interfaces]] - Explanation of the different interfaces used at OpenKore<br />
* [[Run_multiple_bots_from_the_same_.exe|Run multiple bots from the same .exe]]<br />
* [[Command_Line_Arguments|Command Line Arguments]]<br />
* [[XKore|Visual Mode]] - See your bot moving ingame (Currently not working on some servers to safely)<br />
|}<br />
<br />
= Want to improve OpenKore?=<br />
<br />
{|class="indextable"<br />
!Development<br />
!Perl Reference<br />
|-<br />
|<br />
* [[Patches Welcome|Modifying and sharing modded OpenKore]]<br />
* [[Roadmap]]<br />
* [[Packets|Packets (report on unknown packets)]]<br />
* [[How to write plugins for OpenKore]]<br />
* [[Development Conventions]] - Style guides to write code, tips, etc.<br />
* [[Network subsystem]] - ServerTypes, etc<br />
* [[bus|Bus subsystem]] - Linking several bots<br />
* [https://github.com/OpenKore/openkore/pulls Current Developments]<br />
* [[:Category:Feature Request|Feature Requests and TODOs]]<br />
|<br />
* [http://qntm.org/files/perl/perl.html Perl in about 2 hours 30 minutes]<br />
* [http://www.greglondon.com/iperl/index.htm Impatient Perl: if you need to learn Perl NOW]<br />
* [http://hop.perl.plover.com/ Higher-Order Perl: functional programming techniques]<br />
|}</div>4epThttps://openkore.com/index.php?title=monstersCountDist&diff=7036monstersCountDist2023-03-14T10:28:47Z<p>4epT: Redirected page to monstersCount</p>
<hr />
<div>#REDIRECT [[monstersCount]]<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=autoPoison&diff=7035autoPoison2023-03-13T00:02:16Z<p>4epT: Created page with "; autoPoison <???> : Automatically ... : see [https://github.com/OpenKore/openkore/pull/3701 github PR#3701] Category:config.txt"</p>
<hr />
<div>; autoPoison <???><br />
: Automatically ...<br />
: see [https://github.com/OpenKore/openkore/pull/3701 github PR#3701]<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=Connectivity_Guide&diff=7034Connectivity Guide2023-03-12T00:38:54Z<p>4epT: /* Optional */</p>
<hr />
<div>==Getting Server Information==<br />
OpenKore comes with a list of official servers information only, because of the high amount of private servers, it is impossible to have and keep them updated, so private servers players should follow this guide to get and update their server information. <br />
Before continuing, read the list of [[unsupported servers]]. Your server might have anti-bot protection resulting in not being supported by Openkore.<br />
<br />
OpenKore requires the following information about the Ragnarok Online server before it can initialize and login:<br />
* The server name<br />
* The server's [[host]] ([[wikipedia:IP address|IP address]] or [[wikipedia:hostname|hostname]]) and [[wikipedia:computer port (software)|port]]<br />
* The server's [[Connectivity_Guide#Required|master version]] number, [[Connectivity_Guide#Required|version]] number, [[Connectivity_Guide#Required|character encoding]], [[Connectivity_Guide#Required|charBlockSize]]<br />
* [[Connectivity_Guide#Syntax|addTableFolders]] to look for tables in<br />
<br />
There are detailed instructions on collecting server information with [http://wpepro.net/ WPE] or [http://wireshark.org/ Wireshark]. This kind of packet analyze isn't anything special for OpenKore or Ragnarok Online, so it's up to you to get [[wikipedia:packet analyzer|the tools]] and ways to do it which work for you. It's up to you as well what to do with any so-called "protection" in your server's client that may get in the way.<br />
<br />
There may be problems determining [[Connectivity_Guide#Required|version]] and [[Connectivity_Guide#Required|master_version]] if your server's protocol has some kind of encryption. In that case, merely determining these values won't even help, the main issue is dealing with that encryption.<br />
<br />
===WPE (Winsock Packet Editor)===<br />
'''1.''' [https://mega.nz/file/TJQQUJrA#pHX_-h7A2Fnibh0H0ZLwMYQvAGK6ABOf8puOOtQ3orM Download] WPE and extract it (password: openkore).<br />
<br />
:* Before downloading, make a sure to disable your anti-virus as it can mark WPE as a virus and delete it. '''Download at your risk''', we will not be resposabilized if your computer crashes.<br />
:* You will need some programs to extract it, the common ones are [http://www.rarlab.com/ WinRAR] and [http://www.7-zip.org/ 7zip].<br />
<br />
'''2.''' Open your ragnarok but '''''don't login yet!''''' Leave it on the login screen and open WPE.<br />
<br />
'''3.''' At WPE's window, click on '''''Target Programs''''' button.<br />
:[[File:Targetyc.png]]<br />
<br />
'''4.''' A window will open, search for the server's executable and double-click it.<br />
:[[File:Clickrag.png]]<br />
<br />
:'''Note.''' Some servers "hide" their executables by renaming it (like from xxxRO.exe to xxxx.dll or xxxxx.bin), so don't worry if the executable isn't a .exe one.<br />
<br />
'''5.''' In the WPE's window, click on '''Play button'''.<br />
:[[File:Play.png]]<br />
<br />
'''6.''' Switch to your Ragnarok's window, put and try to login.<br />
:'''Note.''' Valid login information are not needed.<br />
<br />
'''7.''' Back to WPE's window, click on '''Stop button'''<br />
:[[File:Stopjw.png]]<br />
<br />
'''8.''' A window will open with recorded data. One of the packets sent to the server would be '''login packet''' which usually contains the server's '''version''', '''master_version''', '''IP''' and '''port''' - write them down because they are going to be used later. The packets will be different on each server, possible login packets may start with '''64 00''' or '''02 B0'''. Other packets (such as 18-byte-long '''02 04''') may be sent before login packet.<br />
:[[File:Inforb.png]]<br />
<br />
:'''Legend''':<br />
#version (displayed as 4-byte unsigned number in [[wikipedia:endianness|little-endian]], in [[wikipedia:hexadecimal|hex]])<br />
#IP (as is)<br />
#port (as is)<br />
#master version (displayed as 1-byte unsigned number, in hex)<br />
<br />
'''9.''' See [[Connectivity Guide#Converting Hexadecimal to Decimal numbers|Converting Hexadecimal to Decimal numbers]] to convert the master_version and version before configuring Kore.<br />
<br />
===Wireshark===<br />
'''1.''' [http://www.wireshark.org/download.html Download] and install Wireshark.<br />
<br />
'''2.''' Open your ragnarok but '''''don't login yet!''''' Leave it on the login screen and open Wireshark.<br />
<br />
'''3.''' At Wireshark's window, go to '''Capture > Options''' on the upper menu or press '''Ctrl + K'''.<br />
:[[File:Capiture.png]]<br />
<br />
'''4.''' In the top right box, select the interface that will be used to capture on. If there isn't any specific interface to use, select the one whose IP address is equal to the your ip address or is not '''''unknown'''''. Alternatively you can try all of them and use the one that records the packets. Set the others settings like the images bellow:<br />
:[[File:Interface.PNG]]<br />
<br />
'''5.''' Click on '''Start button''' and go back to the Ragnarok window and login. <br />
:'''Note.''' Valid information are not needed.<br />
<br />
'''6.''' Back to Wireshark and click on '''Stop button'''.<br />
:[[File:Stop.png]]<br />
<br />
'''7.''' In Wireshark main window, you can see the TCP segments that were captured. Fill in the packet filter, but what to fill in depends on the username you used to login.<br />
:Enter this in the "Filter" text box: <br />
eth contains "xxxxxx" or eth contains xxxxxx<br />
<br />
:Replace '''''xxxxxx''''' with the username that was used to login and press enter. In the example bellow, username was Mushroom.<br />
:[[File:Filter.png]]<br />
<br />
'''8.''' There will be only one entry now, click on it to show some information about it. This is where the '''IP and port''' is stored. <br />
:[[File:Ip.png]]<br />
<br />
: Write down the IP and port.<br />
<br />
'''9.''' On the entry again, right-click on it and go to '''Follow TCP Stream'''.<br />
:[[File:Tcp.png]]<br />
<br />
'''10.''' A new window will open, in the bottom left, select '''Hex Dump'''.<br />
:[[File:Hex.png]]<br />
<br />
'''11.''' These are the login packets. Take a look at it and write down the packets that contains the '''version and master version''' numbers. They are marked on the image bellow.<br />
:[[File:Packets.png]]<br />
* version displayed as 4-byte unsigned number in [[wikipedia:endianness|little-endian]], in [[wikipedia:hexadecimal|hex]]<br />
* master version displayed as 1-byte unsigned number, in hex<br />
<br />
'''12.''' See [[Connectivity Guide#Converting Hexadecimal to Decimal numbers|Converting Hexadecimal to Decimal numbers]] to convert the master_version and version before configuring Kore.<br />
<br />
== Converting Hexadecimal to Decimal numbers ==<br />
Master_version and server version collected from the login packets are in hexadecimal number (base-16) and Kore expects a decimal number (base-10), so converting those numbers are needed before Kore can read them.<br />
<br />
Converting can be made using Windows' calculator or any other site that has a hex to dec calculator.<br />
<br />
'''1.''' Open Windows calculator '''Start > Accessories > Calculator'''.<br />
:[[File:Calc.PNG]]<br />
<br />
'''2.''' Go to '''View''' on the upper menu and click on '''Scientific'''.<br />
:[[File:Sci.PNG]]<br />
<br />
'''3.''' Check the circle beside '''Hex'''.<br />
:[[File:Hexa.PNG]]<br />
<br />
'''4.''' On the calculator, type the number that you got for master_version and version. In the example, master_version hexadecimal number is '''10'''.<br />
:[[File:Type.PNG]]<br />
<br />
'''5.''' Check the circle beside '''Dec'''.<br />
:[[File:Dec.PNG]]<br />
<br />
'''6.''' After checking, the number shown should automatically be converted from hexadecimal to decimal.<br />
:[[File:Done.PNG]]<br />
<br />
: You must convert '''master_version''' and '''version'''.<br />
<br />
== Configuring Openkore ==<br />
OpenKore reads server information from a file named '''servers.txt'''. The file is on ''tables'' folder.<br />
<br />
If your server is not listed in the file, then add a new entry. If your server is already listed, then modify the existing entry. <br />
<br />
=== Syntax ===<br />
[<server name>]<br />
ip <number/host><br />
port <number><br />
version <number><br />
master_version <number> <br />
serverType <serverType name><br />
serverEncoding <[[encoding]]><br />
charBlockSize <number><br />
addTableFolders <folder path><br />
<br />
# following options are optional<br />
private <boolean><br />
recvpackets <file name><br />
chatLangCode <boolean><br />
storageEncryptKey <encrypt key><br />
field_<location> <filename><br />
clientHash <hex string><br />
captcha <boolean><br />
<br />
gameGuard <number><br />
<br />
secureLogin <boolean><br />
secureLogin_type <type><br />
secureLogin_requestCode <hex string><br />
secureLogin_account <boolean><br />
<br />
preLoginCode <boolean><br />
<br />
paddedPackets <boolean><br />
paddedPackets_attackID <packet switches><br />
paddedPackets_skillUseID <packet switches><br />
<br />
masterLogin_packet <packet switch><br />
<br />
OTP_ip <IP_or_hosthame><br />
OTP_port <number><br />
<br />
dead <boolean><br />
dead_message <any text><br />
title <any text><br />
<br />
pinCode <boolean><br />
charDeleteDateType <boolean><br />
blockingPlayerCancel <boolean><br />
rankingSystemType <boolean><br />
itemListType <boolean><br />
ignoreAntiCheatWarning <boolean><br />
<br />
==== Required ====<br />
<br />
; [<server name>]<br />
: The name of the server that you want to bot. The name '''must be''' between '''[ ]'''.<br />
: Developers: avoid changing existing server names, it disrupts configurations. Instead use ''title'' option if you need to change displayed title for a server.<br />
<br />
; ip <number/host><br />
: Server's login IP.<br />
<br />
; port <number><br />
: Server's login port number.<br />
<br />
; version <number><br />
: Server's version (converted from hex to decimal).<br />
<br />
; master_version <number><br />
: Server's master_version (converted from hex to decimal).<br />
<br />
; [[serverType]]<br />
{{Available since 2.1}}<br />
: Server's type. Each official server has its own serverType, private servers must use '''kRO serverTypes''' according to executables dates.<br />
<br />
; serverEncoding <[[encoding]]><br />
: Character encoding.<br />
<br />
{{:charBlockSize}}<br />
<br />
; addTableFolders <folder path><br />
: Configures Kore to load tables file from the specified path (relative to the tables directory).<br />
: Used only when there is no [[Command Line Arguments|--tables]] specified.<br />
: For english ones, you can use<br />
addTableFolders translated/kRO_english<br />
: or <br />
addTableFolders iRO<br />
<br />
==== Optional ====<br />
{{:private}}<br />
{{:recvpackets}}<br />
{{:chatLangCode}}<br />
{{:storageEncryptKey}}<br />
{{:field}}<br />
{{:clientHash}}<br />
{{:captcha}}<br />
{{:gameGuard}}<br />
{{:secureLogin}}<br />
<!-- <br />
included:<br />
secureLogin_type <number><br />
secureLogin_requestCode <hex string><br />
secureLogin_account <bollean><br />
--><br />
{{:preLoginCode}}<br />
{{:masterLogin_packet}}<br />
{{:OTP_ip}}<br />
{{:OTP_port}}<br />
{{:dead_message}}<br />
{{:title}}<br />
{{:pinCode}}<br />
{{:charDeleteDateType}}<br />
{{:blockingPlayerCancel}}<br />
{{:rankingSystemType}}<br />
{{:itemListType}}<br />
{{:itemListUseOldType}}<br />
{{:ignoreAntiCheatWarning}}<br />
<!-- <br />
; paddedPackets <[[boolean]]><br />
: ??<br />
<br />
; paddedPackets_attackID <packet switches><br />
: ??<br />
<br />
; paddedPackets_skillUseID <packet switches><br />
: ??<br />
--><br />
<br />
=== Example ===<br />
[MushroomRO]<br />
ip 127.0.0.1<br />
port 6900<br />
master_version 16<br />
version 20<br />
serverType kRO_RagexeRE_2010_01_26a<br />
charBlockSize 108<br />
serverEncoding Western<br />
recvpackets mush-recvpackets.txt<br />
addTableFolders iRO<br />
<br />
[[Category:servers.txt]]</div>4epThttps://openkore.com/index.php?title=itemListUseOldType&diff=7033itemListUseOldType2023-03-12T00:37:43Z<p>4epT: Created page with "; <includeonly>itemListUseOldType</includeonly><noinclude>itemListUseOldType</noinclude> <boolean> : Using the old items type in a item list : see [https://github.com/..."</p>
<hr />
<div>; <includeonly>[[itemListUseOldType]]</includeonly><noinclude>itemListUseOldType</noinclude> <[[boolean]]><br />
: Using the old items type in a item list<br />
: see [https://github.com/OpenKore/openkore/pull/3700 github PR#3700]<br />
<noinclude>[[Category:servers.txt]]</noinclude></div>4epThttps://openkore.com/index.php?title=rodex&diff=7032rodex2023-03-09T00:58:38Z<p>4epT: </p>
<hr />
<div>'''RodEx''' (Alt: ''Ragnarok Online Delivery Express'') is a mail system built into the user interface of the client. It allows players to mail other players with text, items and zeny.<br />
[[File:RodEx_Icon.png]]<br />
<br />
== Syntax ==<br />
; rodex [<open|close|list|refresh|nextpage|maillist|read|getitems|getzeny|delete|write|cancel|settarget|settitle|setbody|setzeny|add|remove|itemslist|draft|send>]<br />
<br />
<br />
== Subcommands ==<br />
<br />
; rodex open [<type>]<br />
<br />
{|border="1" cellpadding="2" cellspacing="1"<br />
|- style=background-color:#F9F9F9;<br />
!Value<br />
!Description<br />
!rowspan="4"| [[File:RodEx type.png]]<br />
|-<br />
|align=center| 0 or empty<br />
| Send request to open "Normal" rodex mailbox<br />
|-<br />
|align=center| 1<br />
| Send request to open "Notice" rodex mailbox<br />
|-<br />
|align=center| 2<br />
| Send request to open "Return" rodex mailbox<br />
|}<br />
<br />
----<br />
<br />
; rodex close<br />
: Close rodex mailbox.<br />
<br />
----<br />
<br />
; rodex list<br />
: List your first page of rodex mail. The list is read from the OpenKore cache.<br />
<br />
----<br />
<br />
; rodex refresh<br />
: Send request to refresh and update rodex mailbox.<br />
<br />
----<br />
<br />
; rodex nextpage<br />
: Request and get the next page of rodex mail.<br />
<br />
----<br />
<br />
; rodex maillist<br />
: Show ALL messages from ALL pages of rodex mail that you have already read in this rodex session.<br />
<br />
----<br />
<br />
; rodex read <mail_#><br />
; rodex read <mail_id><br />
: <mail_#> - index of mail (number integer).<br />
: <mail_id> - id of mail (number integer).<br />
: Open the selected Rodex mail.<br />
<br />
----<br />
<br />
; rodex getitems<br />
; rodex getitems <mail_#><br />
; rodex getitems <mail_id><br />
: Request ang get items of current rodex mail.<br />
<br />
----<br />
<br />
; rodex getzeny<br />
; rodex getzeny <mail_#><br />
; rodex getzeny <mail_id><br />
: Request and get zeny of current rodex mail.<br />
<br />
----<br />
<br />
; rodex delete <mail_#><br />
; rodex delete <mail id><br />
: Delete selected rodex mail.<br />
<br />
----<br />
<br />
; rodex write<br />
; rodex write self<br />
; rodex write <player_name><br />
: <player name> - name of player that you want to send a rodex message.<br />
: self - OpenKore will automatically substitute the player’s name.<br />
: Open a box to start write a rodex mail. The default subject line is "TITLE".<br />
<br />
----<br />
<br />
; rodex cancel<br />
: Close rodex mail write box.<br />
<br />
----<br />
<br />
; rodex settarget self<br />
; rodex settarget <player_name><br />
: <player name> - name of player that you want to send a rodex message.<br />
: self - OpenKore will automatically substitute the player’s name.<br />
: Set target of rodex mail.<br />
<br />
----<br />
<br />
; rodex settitle <title><br />
: <title> - title of rodex mail.<br />
: Set\replace current title of rodex mail.<br />
<br />
----<br />
<br />
; rodex setbody <body><br />
: <body> - text of rodex mail body.<br />
: Set\replace rodex mail body.<br />
<br />
----<br />
<br />
; rodex setzeny <amount><br />
: <amount> - zeny amount that you want to send in rodex mail.<br />
: Set zeny amount in rodex mail.<br />
<br />
----<br />
<br />
; rodex add <item_#> <amount><br />
: <item_#> - number of item index in inventory (number integer) to get inventory index type console command [[i]]<br />
: <amount> - amount that you want add from rodex mail. (OPTIONAL)<br />
: Add a item from inventory in rodex mail box. If you do not specify <amount>, then 1 piece is added to the letter.<br />
: By default, 5 different items can be attached to one letter. This number can be changed in the [[rodexMaxItems]] config parameter.<br />
<br />
----<br />
<br />
; rodex remove <item_#> <amount><br />
: <item_#> - number of item index in rodex mail (number integer). The item number can be found using the console command <code>rodex itemslist</code>.<br />
: <amount> - amount that you want remove from rodex mail. (OPTIONAL)<br />
: Remove a item or amount of item from rodex mail. If you do not specify <amount>, then all items are removed from the letter.<br />
<br />
----<br />
<br />
; rodex itemslist<br />
: Show current list of items in mail box that you are writting.<br />
<br />
----<br />
<br />
; rodex draft<br />
: Show a draft of the email being sent. The draft contains information about the recipient, subject, text, number of items, number of zeny.<br />
<br />
----<br />
<br />
; rodex send <br />
: Send finished rodex mail.<br />
<br />
----<br />
<br />
[[Category:Console Command]]</div>4epThttps://openkore.com/index.php?title=File:RodEx_type.png&diff=7031File:RodEx type.png2023-03-09T00:28:27Z<p>4epT: </p>
<hr />
<div></div>4epThttps://openkore.com/index.php?title=clientSight&diff=7030clientSight2023-02-03T00:48:10Z<p>4epT: </p>
<hr />
<div>; clientSight [<[[number]]>]<br />
: If this option is set, Kore will ignore actors (e.g. monsters, NPCs, players...) whose distance from you is greater than or equal to the specified number of blocks. If not specified, Openkore assumes a default value of '''17'''.<br />
: This is useful for merchants vending in prontera - set "clientSight" to '''5''' and you will not send as many getPlayerInfo packets, thus lessening the lag caused by you.<br />
<br />
:'''Note.''' Some private servers will send actor packets at a ridiculous distance that the normal RO Client can't display, and use this for automated banning. This config option will make Kore ignore those actors and hopefully avoid auto-bans.<br />
<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=clientSight&diff=7029clientSight2023-01-29T19:20:42Z<p>4epT: </p>
<hr />
<div>; clientSight [<[[number]]>]<br />
: If this option is set, Kore will ignore actors (e.g. monsters, NPCs, players...) whose distance from you is greater than or equal to the specified number of blocks. If not specified, Openkore assumes a default value of '''15'''.<br />
: This is useful for merchants vending in prontera - set "clientSight" to '''5''' and you will not send as many getPlayerInfo packets, thus lessening the lag caused by you.<br />
<br />
:'''Note.''' Some private servers will send actor packets at a ridiculous distance that the normal RO Client can't display, and use this for automated banning. This config option will make Kore ignore those actors and hopefully avoid auto-bans.<br />
<br />
<br />
; clientSight_removeBeyond [<[[number]]>]<br />
Appeared in [https://github.com/OpenKore/openkore/pull/3667 PR#3667].<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=buyAuto&diff=7027buyAuto2023-01-20T00:31:42Z<p>4epT: </p>
<hr />
<div>Automatically buys specified item from a buy/sell NPC when the defined conditions are met.<br />
<br />
== Syntax ==<br />
buyAuto <item name> {<br />
maxAmount <[[number]]><br />
isMarket <[[boolean]]><br />
[minAmount <[[number]]>]<br />
npc <[[References#Map_Names|map name]]> <x> <y><br />
[npc_steps <[[NPC conversation codes]]>]<br />
[distance <[[number]]>]<br />
[standpoint <[[References#Map_Names|map name]]> <x> <y>]<br />
[zeny <[[References#Range_Operators|range]]>]<br />
[onlyIdentified <boolean>]<br />
[disabled <boolean>]<br />
[<[[:Category:Self Condition|Self Conditions]]>]<br />
}<br />
<br />
=== Attribute definitions ===<br />
<br />
; buyAuto <item name><br />
: This option specifies the item to automatically buy from a buy/sell NPC.<br />
<br />
; maxAmount <number><br />
: This option specifies the maximum amount of item in inventory that you need. Kore will buy an amount equal to the difference between the specified maximum amount and the current amount in inventory.<br />
<br />
; minAmount <number><br />
: If this option is set, this specifies the minimum amount of item in inventory before the auto-buy sequence is automatically triggered. Kore will go to the NPC when the number of the specified items left in inventory is less than or equal to this amount.<br />
<br />
:: '''Note:'''<br />
::* If you don't want Kore to automatically go back to town to buy this item, but you DO want Kore to buy this item when it's in town for another reason, then leave minAmount empty.<br />
::* Once Kore is in auto-buy sequence, Kore will automatically check the rest of the buyAuto blocks if you need to buy the items specified in those blocks.<br />
<br />
<br />
; npc <map name> <x> <y><br />
: This option specifies the location of a buy/sell NPC that sells the item. This NPC must have the item available for purchase.<br />
<br />
; isMarket <boolean><br />
: This option specifies if NPC type is [https://ragnarok.gamepedia.com/Para_Market Para Market].<br />
<br />
; npc_steps <NPC conversation codes><br />
: Specifies the NPC talk sequence. If not set, sequence for default store/sell NPC "b e" is used.<br />
<br />
; distance <number><br />
: This option specifies how far Kore will stand from the item buy/sell NPC during auto-buy.<br />
<br />
; standpoint <map name> <x> <y><br />
: If this option is set, Kore will stand on the specified location when buying this item instead of anywhere near the item buy/sell NPC itself. The attribute distance will be ignored.<br />
<br />
; zeny <[[References#Range_Operators|range]]><br />
: If this option is set, the item will only be bought if your zeny is within the specified range. <br />
<br />
; onlyIdentified <boolean><br />
: With this key buyauto will only sum identified items. Appeared in [https://github.com/OpenKore/openkore/pull/3645 PR#3645].<br />
<br />
== Examples ==<br />
Go to town to buy 70 Orange Potions when there are no more in the inventory.<br />
buyAuto Orange Potion {<br />
maxAmount 70<br />
minAmount 0<br />
npc morocc 147 102<br />
distance 8<br />
}<br />
<br />
Buy 100 Red Potions when Kore is in a town<br />
buyAuto Red Potion {<br />
maxAmount 100<br />
minAmount<br />
npc morocc 147 102<br />
distance 8<br />
}<br />
<br />
[[Category:config.txt]]<br />
[[Category:items]]<br />
[[Category:config block]]</div>4epThttps://openkore.com/index.php?title=hooks&diff=7026hooks2023-01-15T19:29:59Z<p>4epT: /* Discovering all existing hooks Unix Distro */</p>
<hr />
<div>== Recommended hooks ==<br />
<br />
=== Initialization ===<br />
<br />
==== start ====<br />
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.<br />
<br />
==== start2 ====<br />
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.<br />
<br />
==== start3 ====<br />
Called once after all [[:Category:control|control]] and [[:Category:tables|tables]] files are loaded. You probably should use '''initialized''' hook instead.<br />
<br />
==== initialized ====<br />
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.<br />
<br />
=== Continuous Work ===<br />
<br />
==== mainLoop_pre ====<br />
Called continuously.<br />
<br />
==== mainLoop_post ====<br />
Called continuously, after processing all other routines.<br />
<br />
==== AI_pre/manual ====<br />
Called continuously when in game unless [[ai|AI]] is turned off.<br />
<br />
==== AI_pre ====<br />
Called continuously when in game if [[ai|AI]] is set to automatic.<br />
<br />
==== AI_post ====<br />
Called continuously when in game if [[ai|AI]] is set to automatic, after processing all other AI routines.<br />
<br />
== Discovering all existing hooks Unix Distro ==<br />
<br />
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.*//<br />
<br />
== Discovering all existing hooks Windows Distro ==<br />
open cmd<br />
cd openkore\src<br />
findstr /S /n "callHook" *.pl;<br />
findstr /S /n "callHook" *.pm;<br />
<br />
Note that some hooks, like <code>packet/<name></code>, <code>packet_pre/<name></code> and <code>mangle/<name></code>, actually are many hooks, for example, one hook for each network packet type. [[Mangle|See about it here]].<br />
<br />
== Hook List ==<br />
This list might be outdated.<br />
<br />
<pre><br />
src/Actor/Item.pm:526: Plugins::callHook('get_item_weight', $self)<br />
src/Actor/You.pm:282: Plugins::callHook('attack_start', {ID => $targetID});<br />
src/Actor.pm:589: Plugins::callHook('Actor::setStatus::change', {<br />
src/AI/Attack.pm:218: Plugins::callHook('target_died', {monster => $monsters_old{$ID}});<br />
src/AI/Attack.pm:259: Plugins::callHook('attack_end', {ID => $ID})<br />
src/AI/Attack.pm:690: Plugins::callHook('AI::Attack::main', {target => $target})<br />
src/AI/CoreLogic.pm:57: Plugins::callHook('AI_start', {state => AI::state});<br />
src/AI/CoreLogic.pm:68: Plugins::callHook('AI_pre/manual');<br />
src/AI/CoreLogic.pm:118: Plugins::callHook('AI_pre');<br />
src/AI/CoreLogic.pm:218: Plugins::callHook('AI_post');<br />
src/AI/CoreLogic.pm:549: Plugins::callHook('portal_exist2', {<br />
src/AI/CoreLogic.pm:575: Plugins::callHook('portal_exist2', {<br />
src/AI/CoreLogic.pm:968: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1190: Plugins::callHook('AI_storage_auto_weight_start' => \%plugin_args);<br />
src/AI/CoreLogic.pm:1201: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1212: Plugins::callHook('AI_storage_auto_get_auto_start' => \%plugin_args);<br />
src/AI/CoreLogic.pm:1256: Plugins::callHook('AI_storage_item_out_of_stock', {<br />
src/AI/CoreLogic.pm:1281: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1298: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1302: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1445: Plugins::callHook('AI_storage_open', \%pluginArgs); # we can hook here to perform actions BEFORE any storage function<br />
src/AI/CoreLogic.pm:1460: Plugins::callHook('AI_storage_full', \%pluginArgs);<br />
src/AI/CoreLogic.pm:1484: Plugins::callHook('AI_storage_item_full', {<br />
src/AI/CoreLogic.pm:1545: Plugins::callHook('AI_storage_done', \%hookArgs);<br />
src/AI/CoreLogic.pm:1629: Plugins::callHook('AI_storage_item_out_of_stock', {<br />
src/AI/CoreLogic.pm:1663: Plugins::callHook('AI_storage_done_after_getAuto', \%hookArgs);<br />
src/AI/CoreLogic.pm:1699: Plugins::callHook('AI_sell_auto_start' => \%plugin_args );<br />
src/AI/CoreLogic.pm:1707: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1724: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1728: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1845: Plugins::callHook('AI_sell_auto');<br />
src/AI/CoreLogic.pm:1874: Plugins::callHook('AI_sell_auto_done');<br />
src/AI/CoreLogic.pm:1885: Plugins::callHook('AI_buy_auto_start' => \%plugin_args);<br />
src/AI/CoreLogic.pm:1921: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1937: Plugins::callHook('AI_buy_auto_done');<br />
src/AI/CoreLogic.pm:1941: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1945: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1949: Plugins::callHook('AI_buy_auto');<br />
src/AI/CoreLogic.pm:2266: Plugins::callHook('AI/lockMap', \%args);<br />
src/AI/CoreLogic.pm:2384: Plugins::callHook('ai_processRandomWalk' => \%plugin_args);<br />
src/AI/CoreLogic.pm:2703: Plugins::callHook('ai_follow', $args);<br />
src/AI/CoreLogic.pm:3223: Plugins::callHook('checkMonsterAutoAttack', \%hookArgs);<br />
src/AI/CoreLogic.pm:3286: Plugins::callHook('ai_items_take');<br />
src/AI/SlaveAttack.pm:186: Plugins::callHook('slave_target_died', {<br />
src/AI/SlaveAttack.pm:227: Plugins::callHook('slave_attack_end', {<br />
src/AI.pm:98: Plugins::callHook('AI_state_change', {<br />
src/ChatQueue.pm:64: Plugins::callHook('ChatQueue::add', \%item);<br />
src/ChatQueue.pm:616: Plugins::callHook('ChatQueue::processChatResponse', $cmd);<br />
src/Commands.pm:870: Plugins::callHook('Commands::run/pre', \%params);<br />
src/Commands.pm:872: Plugins::callHook('Commands::run/post', \%params);<br />
src/Commands.pm:876: Plugins::callHook('Command_post', \%params);<br />
src/Commands.pm:1244: Plugins::callHook('AI_buy_auto_queued');<br />
src/Commands.pm:1273: Plugins::callHook('AI_sell_auto_queued');<br />
src/Commands.pm:1281: Plugins::callHook('AI_storage_auto_queued');<br />
src/Commands.pm:2094: Plugins::callHook('Commands::cmdConf', {<br />
src/FileParsers.pm:784: Plugins::callHook('FileParsers::ROLUT', \%ret);<br />
src/FileParsers.pm:811: Plugins::callHook('FileParsers::RODescLUT', \%ret);<br />
src/FileParsers.pm:861: Plugins::callHook ('FileParsers::ROQuestsLUT', \%ret);<br />
src/FileParsers.pm:1480: Plugins::callHook('updatePortalLUT', $plugin_args);<br />
src/FileParsers.pm:1494: Plugins::callHook('updatePortalLUT2', $plugin_args);<br />
src/functions.pl:74: Plugins::callHook('mainLoop_pre');<br />
src/functions.pl:76: Plugins::callHook('mainLoop_post');<br />
src/functions.pl:83: Plugins::callHook('start');<br />
src/functions.pl:136: Plugins::callHook('parse_command_line');<br />
src/functions.pl:378: Plugins::callHook('start2');<br />
src/functions.pl:402: Plugins::callHook('start3');<br />
src/functions.pl:633: Plugins::callHook('initialized');<br />
src/functions.pl:793: Plugins::callHook('packet_mapChange');<br />
src/functions.pl:1002: Plugins::callHook('mainLoop::setTitle',\%args);<br />
src/Interface/Console/Curses.pm:683: Plugins::callHook('curses/updateStatus');<br />
src/Interface/Console/Curses.pm:808: Plugins::callHook('curses/updateObjects');<br />
src/InventoryList/Cart.pm:41: Plugins::callHook('cart_ready');<br />
src/InventoryList/Cart.pm:43: Plugins::callHook('cart_info_updated');<br />
src/InventoryList/Cart.pm:102: Plugins::callHook('cart_ready');<br />
src/InventoryList/Inventory.pm:41: Plugins::callHook('inventory_ready');<br />
src/InventoryList/Inventory.pm:71: Plugins::callHook('inventory_ready');<br />
src/InventoryList/Storage.pm:44: Plugins::callHook('storage_first_session_openning');<br />
src/InventoryList/Storage.pm:46: Plugins::callHook('packet_storage_open');<br />
src/InventoryList/Storage.pm:53: Plugins::callHook('packet_storage_close');<br />
src/InventoryList/Storage.pm:89: Plugins::callHook('storage_ready');<br />
src/Misc.pm:315: Plugins::callHook('configModify', {<br />
src/Misc.pm:366: Plugins::callHook('configModify', {<br />
src/Misc.pm:406: Plugins::callHook('setTimeout', {<br />
src/Misc.pm:1283: Plugins::callHook('charSelectScreen', \%plugin_args);<br />
src/Misc.pm:1515: Plugins::callHook('ai_check_Aggressiveness' => \%plugin_args);<br />
src/Misc.pm:1550: Plugins::callHook('ai_slave_check_Aggressiveness' => \%plugin_args);<br />
src/Misc.pm:2143: Plugins::callHook('inventory_item_removed', {<br />
src/Misc.pm:2167: Plugins::callHook('storage_item_removed', {<br />
src/Misc.pm:2191: Plugins::callHook('cart_item_removed', {<br />
src/Misc.pm:2883: Plugins::callHook('objectAdded', {<br />
src/Misc.pm:2900: Plugins::callHook('objectRemoved', {<br />
src/Misc.pm:3292: Plugins::callHook('changed_status',{<br />
src/Misc.pm:3305: Plugins::callHook('perfect_hidden_player', {<br />
src/Misc.pm:3320: Plugins::callHook('perfect_hidden_npc', {<br />
src/Misc.pm:3784: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3790: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3822: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3831: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3841: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3853: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3911: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:4299: Plugins::callHook('avoidGM_near', \%args);<br />
src/Misc.pm:4351: Plugins::callHook('avoidGM_talk', \%args);<br />
src/Misc.pm:4390: Plugins::callHook('avoidList_near', \%args);<br />
src/Misc.pm:5058: Plugins::callHook('checkSelfCondition', \%hookArgs);<br />
src/Misc.pm:5210: Plugins::callHook('checkPlayerCondition', \%args);<br />
src/Misc.pm:5285: Plugins::callHook('checkMonsterCondition', \%args);<br />
src/Misc.pm:5375: Plugins::callHook('open_shop', {<br />
src/Misc.pm:5392: Plugins::callHook('shop_closed');<br />
src/Misc.pm:5487: Plugins::callHook ('buyer_open_shop', {<br />
src/Misc.pm:5508: Plugins::callHook('buyer_shop_closed');<br />
src/Network/ClientReceive.pm:75: Plugins::callHook('map_loaded');<br />
src/Network/DirectConnection.pm:140: Plugins::callHook('Network::connectTo', {<br />
src/Network/DirectConnection.pm:173: Plugins::callHook('Network::serverSend/pre', {msg => \$msg});<br />
src/Network/DirectConnection.pm:178: Plugins::callHook('Network::serverSend', {msg => $msg});<br />
src/Network/DirectConnection.pm:196: Plugins::callHook('Network::serverRecv', {msg => \$msg});<br />
src/Network/DirectConnection.pm:245: Plugins::callHook('serverDisconnect/fail');<br />
src/Network/DirectConnection.pm:248: Plugins::callHook('serverDisconnect/success');<br />
src/Network/DirectConnection.pm:260: Plugins::callHook('Network::stateChanged');<br />
src/Network/DirectConnection.pm:274: Plugins::callHook('Network::clientAlive', \%args);<br />
src/Network/DirectConnection.pm:286: Plugins::callHook('Network::clientSend', \%args);<br />
src/Network/DirectConnection.pm:301: Plugins::callHook('Network::clientRecv', \%args);<br />
src/Network/DirectConnection.pm:355: Plugins::callHook('Network::serverConnect/master');<br />
src/Network/DirectConnection.pm:486: Plugins::callHook('Network::serverConnect/special');<br />
src/Network/DirectConnection.pm:526: Plugins::callHook('Network::serverConnect/char');<br />
src/Network/DirectConnection.pm:562: Plugins::callHook('Network::serverConnect/charselect');<br />
src/Network/DirectConnection.pm:600: Plugins::callHook('Network::serverConnect/mapserver');<br />
src/Network/DirectConnection.pm:618: Plugins::callHook('disconnected');<br />
src/Network/DirectConnection.pm:633: Plugins::callHook('disconnected');<br />
src/Network/PacketParser.pm:272: Plugins::callHook('packet_pre/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:274: Plugins::callHook('$self->{hook_prefix}/packet_pre/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:289: Plugins::callHook('packet/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:291: Plugins::callHook('$self->{hook_prefix}/packet/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:368: Plugins::callHook('$self->{hook_prefix}/willMangle', \%args);<br />
src/Network/PacketParser.pm:390: Plugins::callHook('$self->{hook_prefix}/mangle', \%hook_args);<br />
src/Network/PacketParser.pm:494: Plugins::callHook($hook, {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1011: Plugins::callHook($args->{hook}, {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1051: Plugins::callHook('packet_guildMsg', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1104: Plugins::callHook('item_skill', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1155: Plugins::callHook('packet_pubMsg', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1171: Plugins::callHook('packet_sentPM', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1204: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1220: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1295: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1336: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1415: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1044: Plugins::callHook($args->{hook}, {<br />
src/Network/Receive/ServerType0.pm:1086: Plugins::callHook('packet_guildMsg', {<br />
src/Network/Receive/ServerType0.pm:1139: Plugins::callHook('item_skill', {<br />
src/Network/Receive/ServerType0.pm:1190: Plugins::callHook('packet_pubMsg', {<br />
src/Network/Receive/ServerType0.pm:1220: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/ServerType0.pm:1237: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/ServerType0.pm:1317: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1366: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1452: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive.pm:795: Plugins::callHook('parseMsg/recvChars', $args->{options});<br />
src/Network/Receive.pm:943: Plugins::callHook('char_created', {char => $character});<br />
src/Network/Receive.pm:1230: Plugins::callHook('in_game');<br />
src/Network/Receive.pm:1274: Plugins::callHook('disconnected');<br />
src/Network/Receive.pm:1374: Plugins::callHook('exp_gained');<br />
src/Network/Receive.pm:1430: Plugins::callHook('base_level_changed', {level => $actor->{lv}});<br />
src/Network/Receive.pm:1461: Plugins::callHook('zeny_change', {<br />
src/Network/Receive.pm:1532: Plugins::callHook('job_level_changed', {level => $actor->{lv_job}});<br />
src/Network/Receive.pm:1648: Plugins::callHook('packet_charStats', {<br />
src/Network/Receive.pm:1748: Plugins::callHook('packet_pre/actor_display', $args);<br />
src/Network/Receive.pm:1750: Plugins::callHook('packet/actor_display', $args);<br />
src/Network/Receive.pm:2119: Plugins::callHook('add_player_list', $actor);<br />
src/Network/Receive.pm:2123: Plugins::callHook('add_monster_list', $actor);<br />
src/Network/Receive.pm:2127: Plugins::callHook('add_pet_list', $actor);<br />
src/Network/Receive.pm:2131: Plugins::callHook('add_portal_list', $actor);<br />
src/Network/Receive.pm:2140: Plugins::callHook('add_npc_list', $actor);<br />
src/Network/Receive.pm:2144: Plugins::callHook('add_slave_list', $actor);<br />
src/Network/Receive.pm:2147: Plugins::callHook('add_elemental_list', $actor);<br />
src/Network/Receive.pm:2168: Plugins::callHook('player', {player => $actor}); #backwards compatibility<br />
src/Network/Receive.pm:2170: Plugins::callHook('player_exist', {player => $actor});<br />
src/Network/Receive.pm:2174: Plugins::callHook('npc_exist', {npc => $actor});<br />
src/Network/Receive.pm:2178: Plugins::callHook('portal_exist', {portal => $actor});<br />
src/Network/Receive.pm:2213: Plugins::callHook('player', {player => $actor}); #backwards compatibailty<br />
src/Network/Receive.pm:2215: Plugins::callHook('player_connected', {player => $actor});<br />
src/Network/Receive.pm:2243: Plugins::callHook('player_moved', $actor);<br />
src/Network/Receive.pm:2246: Plugins::callHook('monster_moved', $actor);<br />
src/Network/Receive.pm:2249: Plugins::callHook('pet_moved', $actor);<br />
src/Network/Receive.pm:2252: Plugins::callHook('slave_moved', $actor);<br />
src/Network/Receive.pm:2256: Plugins::callHook('portal_moved', $actor);<br />
src/Network/Receive.pm:2260: Plugins::callHook('npc_moved', $actor);<br />
src/Network/Receive.pm:2263: Plugins::callHook('pet_moved', $actor);<br />
src/Network/Receive.pm:2311: Plugins::callHook('self_died');<br />
src/Network/Receive.pm:2350: Plugins::callHook('monster_disappeared', {monster => $monster});<br />
src/Network/Receive.pm:2386: Plugins::callHook('player_disappeared', {player => $player});<br />
src/Network/Receive.pm:2406: Plugins::callHook('portal_disappeared', {portal => $portal});<br />
src/Network/Receive.pm:2415: Plugins::callHook('npc_disappeared', {npc => $npc});<br />
src/Network/Receive.pm:2423: Plugins::callHook('pet_disappeared', {pet => $pet});<br />
src/Network/Receive.pm:2456: Plugins::callHook('slave_disappeared', {slave => $slave});<br />
src/Network/Receive.pm:2472: Plugins::callHook('elemental_disappeared', {elemental => $elemental});<br />
src/Network/Receive.pm:2560: Plugins::callHook('packet_attack', {<br />
src/Network/Receive.pm:2631: Plugins::callHook('charNameUpdate', {player => $player});<br />
src/Network/Receive.pm:2643: Plugins::callHook('mobNameUpdate', {monster => $monster});<br />
src/Network/Receive.pm:2661: Plugins::callHook('npcNameUpdate', {npc => $npc});<br />
src/Network/Receive.pm:2673: Plugins::callHook('petNameUpdate', {pet => $pet});<br />
src/Network/Receive.pm:2684: Plugins::callHook('slaveNameUpdate', {slave => $slave});<br />
src/Network/Receive.pm:2696: Plugins::callHook('elementalNameUpdate', {elemental => $elemental});<br />
src/Network/Receive.pm:2723: Plugins::callHook('base_level', {name => $actor});<br />
src/Network/Receive.pm:2726: Plugins::callHook('job_level', {name => $actor});<br />
src/Network/Receive.pm:3027: Plugins::callHook('packet_localBroadcast', {<br />
src/Network/Receive.pm:3265: Plugins::callHook('show_script', {<br />
src/Network/Receive.pm:3396: Plugins::callHook('packet_sysMsg', {<br />
src/Network/Receive.pm:3548: Plugins::callHook('equipped_item', {<br />
src/Network/Receive.pm:3603: Plugins::callHook('item_gathered', {<br />
src/Network/Receive.pm:3667: Plugins::callHook('packet_item_removed', {index => $item->{binID}});<br />
src/Network/Receive.pm:3679: Plugins::callHook('rental_expired', {<br />
src/Network/Receive.pm:3720: Plugins::callHook('vending_item_sold', {<br />
src/Network/Receive.pm:3732: Plugins::callHook('vending_item_sold_out', {<br />
src/Network/Receive.pm:3764: Plugins::callHook('vending_item_sold', {<br />
src/Network/Receive.pm:3778: Plugins::callHook('vending_item_sold_out', {<br />
src/Network/Receive.pm:3853: Plugins::callHook('packet_vender_store', { item => $item });<br />
src/Network/Receive.pm:3868: Plugins::callHook('packet_vender_store2', {<br />
src/Network/Receive.pm:4146: Plugins::callHook('pvp_mode', {pvp => $pvp});# 1 PvP, 2 GvG, 3 Battleground<br />
src/Network/Receive.pm:4188: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4235: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4284: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4556: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4563: Plugins::callHook('quest_list');<br />
src/Network/Receive.pm:4616: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4684: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4690: Plugins::callHook('quest_added', {questID => $args->{questID}});<br />
src/Network/Receive.pm:4783: Plugins::callHook('quest_mission_updated', {<br />
src/Network/Receive.pm:4854: Plugins::callHook('npc_chat', {<br />
src/Network/Receive.pm:4880: Plugins::callHook('makable_item_list', {item_list => $makableList});<br />
src/Network/Receive.pm:5218: Plugins::callHook('invalid_password');<br />
src/Network/Receive.pm:5246: Plugins::callHook('dial');<br />
src/Network/Receive.pm:5265: Plugins::callHook('invalid_password');<br />
src/Network/Receive.pm:5432: Plugins::callHook('chat_created', {chat => $chatRooms{$accountID}});<br />
src/Network/Receive.pm:5459: Plugins::callHook('packet_chatinfo', {<br />
src/Network/Receive.pm:5503: Plugins::callHook('chat_joined', {chat => $chat});<br />
src/Network/Receive.pm:5568: Plugins::callHook('chat_modified', {<br />
src/Network/Receive.pm:5643: Plugins::callHook('chat_leave');<br />
src/Network/Receive.pm:5657: Plugins::callHook('chat_removed', {<br />
src/Network/Receive.pm:5689: Plugins::callHook('error_deal', {type => $args->{type}});<br />
src/Network/Receive.pm:5692: Plugins::callHook('error_deal', {type => $args->{type}});<br />
src/Network/Receive.pm:5710: Plugins::callHook('engaged_deal', {name => $currentDeal{name}});<br />
src/Network/Receive.pm:5713: Plugins::callHook('error_deal', {type =>$args->{type}});<br />
src/Network/Receive.pm:5716: Plugins::callHook('error_deal', {type =>$args->{type}});<br />
src/Network/Receive.pm:5725: Plugins::callHook('cancelled_deal');<br />
src/Network/Receive.pm:5733: Plugins::callHook('complete_deal');<br />
src/Network/Receive.pm:5741: Plugins::callHook('finalized_deal', {name => $currentDeal{name}});<br />
src/Network/Receive.pm:5760: Plugins::callHook('incoming_deal', {<br />
src/Network/Receive.pm:5858: Plugins::callHook('packet_emotion', {<br />
src/Network/Receive.pm:5901: Plugins::callHook('disconnected')<br />
src/Network/Receive.pm:6041: Plugins::callHook('friend_request', {<br />
src/Network/Receive.pm:6841: Plugins::callHook('packet_useitem', \%hook_args);<br />
src/Network/Receive.pm:6888: Plugins::callHook('item_appeared', {<br />
src/Network/Receive.pm:6918: Plugins::callHook('item_exists', {<br />
src/Network/Receive.pm:7139: Plugins::callHook('Network::Receive::map_changed', {<br />
src/Network/Receive.pm:7255: Plugins::callHook('Network::Receive::map_changed', {<br />
src/Network/Receive.pm:7321: Plugins::callHook('npc_autotalk', {<br />
src/Network/Receive.pm:7342: Plugins::callHook('npc_talk', {<br />
src/Network/Receive.pm:7366: Plugins::callHook('npc_talk_done', {ID => $ID});<br />
src/Network/Receive.pm:7414: Plugins::callHook('npc_autotalk', {<br />
src/Network/Receive.pm:7445: Plugins::callHook('npc_talk_responses', {<br />
src/Network/Receive.pm:7596: Plugins::callHook('buy_result', {fail => $args->{fail}});<br />
src/Network/Receive.pm:7751: Plugins::callHook('deal_you_added', {<br />
src/Network/Receive.pm:7881: Plugins::callHook('add_player_list', $actor);<br />
src/Network/Receive.pm:7882: Plugins::callHook('player', {player => $actor}); #backwards compatibility<br />
src/Network/Receive.pm:7883: Plugins::callHook('player_exist', {player => $actor});<br />
src/Network/Receive.pm:7896: Plugins::callHook('player_disappeared', {player => $player});<br />
src/Network/Receive.pm:8091: Plugins::callHook('packet_partyJoin', { partyName => bytesToString($info->{name}) });<br />
src/Network/Receive.pm:8144: Plugins::callHook('packet_partyMsg', {<br />
src/Network/Receive.pm:8211: Plugins::callHook('party_invite', {<br />
src/Network/Receive.pm:8360: Plugins::callHook('party_users_info_ready');<br />
src/Network/Receive.pm:8457: Plugins::callHook('rodex_mail_list', {<br />
src/Network/Receive.pm:8530: Plugins::callHook('rodex_mail', {<br />
src/Network/Receive.pm:8544: Plugins::callHook('rodex_unread_mail');<br />
src/Network/Receive.pm:8686: Plugins::callHook('rodex_mail_deleted', {<br />
src/Network/Receive.pm:8820: Plugins::callHook('packet_clanMsg', {<br />
src/Network/Receive.pm:9016: Plugins::callHook('cooking_list', {<br />
src/Network/Receive.pm:9131: Plugins::callHook('search_store', $universalCatalogInfo);<br />
src/Network/Receive.pm:9179: Plugins::callHook('packet_message_string', {<br />
src/Network/Receive.pm:9237: Plugins::callHook($hook, {<br />
src/Network/Receive.pm:9263: Plugins::callHook('packet_charSkills', {<br />
src/Network/Receive.pm:9491: Plugins::callHook ('captcha_image', $hookArgs);<br />
src/Network/Receive.pm:9500: Plugins::callHook ('captcha_file', $hookArgs);<br />
src/Network/Receive.pm:9514: Plugins::callHook ('captcha_answer', {flag => $args->{flag}});<br />
src/Network/Receive.pm:9576: Plugins::callHook('packet_open_buying_store', {<br />
src/Network/Receive.pm:9594: Plugins::callHook('packet_buying', {ID => $ID});<br />
src/Network/Receive.pm:9646: Plugins::callHook('packet_buying_store', {<br />
src/Network/Receive.pm:9671: Plugins::callHook('packet_buying_store2', {<br />
src/Network/Receive.pm:9722: Plugins::callHook('packet_buyer', {ID => $ID});<br />
src/Network/Receive.pm:9742: Plugins::callHook('buyer_shop_closed');<br />
src/Network/Receive.pm:9794: Plugins::callHook('packet_special_item_obtain', {<br />
src/Network/Receive.pm:9821: Plugins::callHook('packet_sentPM', {<br />
src/Network/Receive.pm:9954: Plugins::callHook('memo_fail', {field => $field->baseName});<br />
src/Network/Receive.pm:9957: Plugins::callHook('memo_success', {field => $field->baseName});<br />
src/Network/Receive.pm:10324: Plugins::callHook('instance_ready');<br />
src/Network/Receive.pm:10473: Plugins::callHook('equipped_item', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:10501: Plugins::callHook('equipped_item_sw', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:10679: Plugins::callHook('packet_item_removed', {index => $item->{binID}});<br />
src/Network/Receive.pm:11040: Plugins::callHook('parseMsg/addPrivMsgUser', {<br />
src/Network/Receive.pm:11052: Plugins::callHook('packet_privMsg', {<br />
src/Network/Receive.pm:11225: Plugins::callHook('packet_selfChat', {<br />
src/Network/Receive.pm:11332: Plugins::callHook('is_casting', {<br />
src/Network/Receive.pm:11403: Plugins::callHook('packet_castCancelled', {<br />
src/Network/Receive.pm:11451: Plugins::callHook('unequipped_item', {<br />
src/Network/Receive.pm:11482: Plugins::callHook('unequipped_item_sw', {<br />
src/Network/Receive.pm:11518: Plugins::callHook('packet_vender', {<br />
src/Network/Receive.pm:11554: Plugins::callHook('packet_charSkills', {<br />
src/Network/Receive.pm:11635: Plugins::callHook('packet_skillfail', {<br />
src/Network/Receive.pm:11648: Plugins::callHook('open_store_success');<br />
src/Network/Receive.pm:11652: Plugins::callHook('open_store_fail', { flag => $args->{flag} });<br />
src/Network/Receive.pm:11790: Plugins::callHook('banking_opened');<br />
src/Network/Receive.pm:11806: Plugins::callHook('banking_deposit_success');<br />
src/Network/Receive.pm:11815: Plugins::callHook('banking_deposit_failed', {'reason' => $args->{reason}});<br />
src/Network/Receive.pm:11830: Plugins::callHook('banking_withdraw_success');<br />
src/Network/Receive.pm:11837: Plugins::callHook('banking_withdraw_failed', {'reason' => $args->{reason}});<br />
src/Network/Receive.pm:11856: Plugins::callHook('navigate_to', $args);<br />
src/Network/Receive.pm:12094: Plugins::callHook ('captcha_image', $hookArgs);<br />
src/Network/Send/ServerType1.pm:37: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType1.pm:38: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType1.pm:56: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType1.pm:74: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType1.pm:151: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType10.pm:39: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType10.pm:40: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType10.pm:59: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType2.pm:44: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType2.pm:45: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType3.pm:59: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType3.pm:60: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType4.pm:45: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType4.pm:46: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType5.pm:57: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType5.pm:58: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType6.pm:36: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType6.pm:37: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType7.pm:35: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType7.pm:55: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType7.pm:73: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType7.pm:96: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8.pm:65: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType8.pm:66: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType8.pm:85: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8.pm:103: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8.pm:120: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8.pm:140: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_1.pm:54: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8_1.pm:141: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8_1.pm:160: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8_1.pm:182: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_3.pm:48: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8_3.pm:66: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8_3.pm:94: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8_5.pm:46: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_5.pm:180: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send.pm:245: Plugins::callHook($hookName, \%args);<br />
src/Network/Send.pm:487: Plugins::callHook('packet/sendMapLoaded');<br />
src/Network/Send.pm:536: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send.pm:537: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send.pm:826: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/XKore.pm:120: Plugins::callHook('Network::serverSend/pre', {msg => \$msg});<br />
src/Network/XKore.pm:140: Plugins::callHook('Network::stateChanged');<br />
src/Network/XKore.pm:243: Plugins::callHook('disconnected');<br />
src/Network/XKore.pm:264: Plugins::callHook('XKore_start');<br />
src/Poseidon/Client.pm:82: Plugins::callHook('Poseidon/client_authenticate', {<br />
src/Poseidon/QueryServer.pm:78: Plugins::callHook('Poseidon/server_authenticate', {<br />
src/Settings.pm:344: Plugins::callHook( usage => $data );<br />
src/Settings.pm:498: Plugins::callHook('pre_load_'.$internalFilename, $pre_load);<br />
src/Settings.pm:546: Plugins::callHook('load_'.$internalFilename, $load);<br />
src/Settings.pm:551: Plugins::callHook('pos_load_'.$internalFilename, $pos_load);<br />
src/Settings.pm:553: Plugins::callHook('load_'.$internalFilename, $load);<br />
src/Settings.pm:557: Plugins::callHook('pos_load_'.$internalFilename, $pos_load);<br />
src/Settings.pm:599: Plugins::callHook('preloadfiles', {files => $files});<br />
src/Settings.pm:603: Plugins::callHook('loadfiles', {<br />
src/Settings.pm:611: Plugins::callHook('postloadfiles', {files => $files});<br />
src/Task/MapRoute.pm:193: Plugins::callHook('npc_teleport_missing' => \%plugin_args );<br />
src/Task/MapRoute.pm:406: Plugins::callHook('Task::MapRoute::iterate::missing_portal', \%plugin_args);<br />
src/Task/MapRoute.pm:483: Plugins::callHook('Task::MapRoute::iterate::route_portal_near', \%plugin_args);<br />
src/Task/Route.pm:313: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:414: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:426: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:469: Plugins::callHook('route', {status => 'stuck'});<br />
src/Task/Route.pm:599: Plugins::callHook('getRoute' => \%plugin_args);<br />
src/Utils/PathFinding.pm:103: Plugins::callHook('PathFindingReset', \%hookArgs);<br />
</pre><br />
<br />
[[Category:Development]]</div>4epThttps://openkore.com/index.php?title=hooks&diff=7025hooks2023-01-15T19:26:47Z<p>4epT: </p>
<hr />
<div>== Recommended hooks ==<br />
<br />
=== Initialization ===<br />
<br />
==== start ====<br />
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.<br />
<br />
==== start2 ====<br />
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.<br />
<br />
==== start3 ====<br />
Called once after all [[:Category:control|control]] and [[:Category:tables|tables]] files are loaded. You probably should use '''initialized''' hook instead.<br />
<br />
==== initialized ====<br />
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.<br />
<br />
=== Continuous Work ===<br />
<br />
==== mainLoop_pre ====<br />
Called continuously.<br />
<br />
==== mainLoop_post ====<br />
Called continuously, after processing all other routines.<br />
<br />
==== AI_pre/manual ====<br />
Called continuously when in game unless [[ai|AI]] is turned off.<br />
<br />
==== AI_pre ====<br />
Called continuously when in game if [[ai|AI]] is set to automatic.<br />
<br />
==== AI_post ====<br />
Called continuously when in game if [[ai|AI]] is set to automatic, after processing all other AI routines.<br />
<br />
== Discovering all existing hooks Unix Distro ==<br />
<br />
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/ | s<br />
ed s/\\sif.*//<br />
<br />
== Discovering all existing hooks Windows Distro ==<br />
open cmd<br />
cd openkore\src<br />
findstr /S /n "callHook" *.pl;<br />
findstr /S /n "callHook" *.pm;<br />
<br />
Note that some hooks, like <code>packet/<name></code>, <code>packet_pre/<name></code> and <code>mangle/<name></code>, actually are many hooks, for example, one hook for each network packet type. [[Mangle|See about it here]].<br />
<br />
== Hook List ==<br />
This list might be outdated.<br />
<br />
<pre><br />
src/Actor/Item.pm:526: Plugins::callHook('get_item_weight', $self)<br />
src/Actor/You.pm:282: Plugins::callHook('attack_start', {ID => $targetID});<br />
src/Actor.pm:589: Plugins::callHook('Actor::setStatus::change', {<br />
src/AI/Attack.pm:218: Plugins::callHook('target_died', {monster => $monsters_old{$ID}});<br />
src/AI/Attack.pm:259: Plugins::callHook('attack_end', {ID => $ID})<br />
src/AI/Attack.pm:690: Plugins::callHook('AI::Attack::main', {target => $target})<br />
src/AI/CoreLogic.pm:57: Plugins::callHook('AI_start', {state => AI::state});<br />
src/AI/CoreLogic.pm:68: Plugins::callHook('AI_pre/manual');<br />
src/AI/CoreLogic.pm:118: Plugins::callHook('AI_pre');<br />
src/AI/CoreLogic.pm:218: Plugins::callHook('AI_post');<br />
src/AI/CoreLogic.pm:549: Plugins::callHook('portal_exist2', {<br />
src/AI/CoreLogic.pm:575: Plugins::callHook('portal_exist2', {<br />
src/AI/CoreLogic.pm:968: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1190: Plugins::callHook('AI_storage_auto_weight_start' => \%plugin_args);<br />
src/AI/CoreLogic.pm:1201: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1212: Plugins::callHook('AI_storage_auto_get_auto_start' => \%plugin_args);<br />
src/AI/CoreLogic.pm:1256: Plugins::callHook('AI_storage_item_out_of_stock', {<br />
src/AI/CoreLogic.pm:1281: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1298: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1302: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1445: Plugins::callHook('AI_storage_open', \%pluginArgs); # we can hook here to perform actions BEFORE any storage function<br />
src/AI/CoreLogic.pm:1460: Plugins::callHook('AI_storage_full', \%pluginArgs);<br />
src/AI/CoreLogic.pm:1484: Plugins::callHook('AI_storage_item_full', {<br />
src/AI/CoreLogic.pm:1545: Plugins::callHook('AI_storage_done', \%hookArgs);<br />
src/AI/CoreLogic.pm:1629: Plugins::callHook('AI_storage_item_out_of_stock', {<br />
src/AI/CoreLogic.pm:1663: Plugins::callHook('AI_storage_done_after_getAuto', \%hookArgs);<br />
src/AI/CoreLogic.pm:1699: Plugins::callHook('AI_sell_auto_start' => \%plugin_args );<br />
src/AI/CoreLogic.pm:1707: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1724: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1728: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1845: Plugins::callHook('AI_sell_auto');<br />
src/AI/CoreLogic.pm:1874: Plugins::callHook('AI_sell_auto_done');<br />
src/AI/CoreLogic.pm:1885: Plugins::callHook('AI_buy_auto_start' => \%plugin_args);<br />
src/AI/CoreLogic.pm:1921: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1937: Plugins::callHook('AI_buy_auto_done');<br />
src/AI/CoreLogic.pm:1941: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1945: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1949: Plugins::callHook('AI_buy_auto');<br />
src/AI/CoreLogic.pm:2266: Plugins::callHook('AI/lockMap', \%args);<br />
src/AI/CoreLogic.pm:2384: Plugins::callHook('ai_processRandomWalk' => \%plugin_args);<br />
src/AI/CoreLogic.pm:2703: Plugins::callHook('ai_follow', $args);<br />
src/AI/CoreLogic.pm:3223: Plugins::callHook('checkMonsterAutoAttack', \%hookArgs);<br />
src/AI/CoreLogic.pm:3286: Plugins::callHook('ai_items_take');<br />
src/AI/SlaveAttack.pm:186: Plugins::callHook('slave_target_died', {<br />
src/AI/SlaveAttack.pm:227: Plugins::callHook('slave_attack_end', {<br />
src/AI.pm:98: Plugins::callHook('AI_state_change', {<br />
src/ChatQueue.pm:64: Plugins::callHook('ChatQueue::add', \%item);<br />
src/ChatQueue.pm:616: Plugins::callHook('ChatQueue::processChatResponse', $cmd);<br />
src/Commands.pm:870: Plugins::callHook('Commands::run/pre', \%params);<br />
src/Commands.pm:872: Plugins::callHook('Commands::run/post', \%params);<br />
src/Commands.pm:876: Plugins::callHook('Command_post', \%params);<br />
src/Commands.pm:1244: Plugins::callHook('AI_buy_auto_queued');<br />
src/Commands.pm:1273: Plugins::callHook('AI_sell_auto_queued');<br />
src/Commands.pm:1281: Plugins::callHook('AI_storage_auto_queued');<br />
src/Commands.pm:2094: Plugins::callHook('Commands::cmdConf', {<br />
src/FileParsers.pm:784: Plugins::callHook('FileParsers::ROLUT', \%ret);<br />
src/FileParsers.pm:811: Plugins::callHook('FileParsers::RODescLUT', \%ret);<br />
src/FileParsers.pm:861: Plugins::callHook ('FileParsers::ROQuestsLUT', \%ret);<br />
src/FileParsers.pm:1480: Plugins::callHook('updatePortalLUT', $plugin_args);<br />
src/FileParsers.pm:1494: Plugins::callHook('updatePortalLUT2', $plugin_args);<br />
src/functions.pl:74: Plugins::callHook('mainLoop_pre');<br />
src/functions.pl:76: Plugins::callHook('mainLoop_post');<br />
src/functions.pl:83: Plugins::callHook('start');<br />
src/functions.pl:136: Plugins::callHook('parse_command_line');<br />
src/functions.pl:378: Plugins::callHook('start2');<br />
src/functions.pl:402: Plugins::callHook('start3');<br />
src/functions.pl:633: Plugins::callHook('initialized');<br />
src/functions.pl:793: Plugins::callHook('packet_mapChange');<br />
src/functions.pl:1002: Plugins::callHook('mainLoop::setTitle',\%args);<br />
src/Interface/Console/Curses.pm:683: Plugins::callHook('curses/updateStatus');<br />
src/Interface/Console/Curses.pm:808: Plugins::callHook('curses/updateObjects');<br />
src/InventoryList/Cart.pm:41: Plugins::callHook('cart_ready');<br />
src/InventoryList/Cart.pm:43: Plugins::callHook('cart_info_updated');<br />
src/InventoryList/Cart.pm:102: Plugins::callHook('cart_ready');<br />
src/InventoryList/Inventory.pm:41: Plugins::callHook('inventory_ready');<br />
src/InventoryList/Inventory.pm:71: Plugins::callHook('inventory_ready');<br />
src/InventoryList/Storage.pm:44: Plugins::callHook('storage_first_session_openning');<br />
src/InventoryList/Storage.pm:46: Plugins::callHook('packet_storage_open');<br />
src/InventoryList/Storage.pm:53: Plugins::callHook('packet_storage_close');<br />
src/InventoryList/Storage.pm:89: Plugins::callHook('storage_ready');<br />
src/Misc.pm:315: Plugins::callHook('configModify', {<br />
src/Misc.pm:366: Plugins::callHook('configModify', {<br />
src/Misc.pm:406: Plugins::callHook('setTimeout', {<br />
src/Misc.pm:1283: Plugins::callHook('charSelectScreen', \%plugin_args);<br />
src/Misc.pm:1515: Plugins::callHook('ai_check_Aggressiveness' => \%plugin_args);<br />
src/Misc.pm:1550: Plugins::callHook('ai_slave_check_Aggressiveness' => \%plugin_args);<br />
src/Misc.pm:2143: Plugins::callHook('inventory_item_removed', {<br />
src/Misc.pm:2167: Plugins::callHook('storage_item_removed', {<br />
src/Misc.pm:2191: Plugins::callHook('cart_item_removed', {<br />
src/Misc.pm:2883: Plugins::callHook('objectAdded', {<br />
src/Misc.pm:2900: Plugins::callHook('objectRemoved', {<br />
src/Misc.pm:3292: Plugins::callHook('changed_status',{<br />
src/Misc.pm:3305: Plugins::callHook('perfect_hidden_player', {<br />
src/Misc.pm:3320: Plugins::callHook('perfect_hidden_npc', {<br />
src/Misc.pm:3784: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3790: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3822: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3831: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3841: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3853: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3911: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:4299: Plugins::callHook('avoidGM_near', \%args);<br />
src/Misc.pm:4351: Plugins::callHook('avoidGM_talk', \%args);<br />
src/Misc.pm:4390: Plugins::callHook('avoidList_near', \%args);<br />
src/Misc.pm:5058: Plugins::callHook('checkSelfCondition', \%hookArgs);<br />
src/Misc.pm:5210: Plugins::callHook('checkPlayerCondition', \%args);<br />
src/Misc.pm:5285: Plugins::callHook('checkMonsterCondition', \%args);<br />
src/Misc.pm:5375: Plugins::callHook('open_shop', {<br />
src/Misc.pm:5392: Plugins::callHook('shop_closed');<br />
src/Misc.pm:5487: Plugins::callHook ('buyer_open_shop', {<br />
src/Misc.pm:5508: Plugins::callHook('buyer_shop_closed');<br />
src/Network/ClientReceive.pm:75: Plugins::callHook('map_loaded');<br />
src/Network/DirectConnection.pm:140: Plugins::callHook('Network::connectTo', {<br />
src/Network/DirectConnection.pm:173: Plugins::callHook('Network::serverSend/pre', {msg => \$msg});<br />
src/Network/DirectConnection.pm:178: Plugins::callHook('Network::serverSend', {msg => $msg});<br />
src/Network/DirectConnection.pm:196: Plugins::callHook('Network::serverRecv', {msg => \$msg});<br />
src/Network/DirectConnection.pm:245: Plugins::callHook('serverDisconnect/fail');<br />
src/Network/DirectConnection.pm:248: Plugins::callHook('serverDisconnect/success');<br />
src/Network/DirectConnection.pm:260: Plugins::callHook('Network::stateChanged');<br />
src/Network/DirectConnection.pm:274: Plugins::callHook('Network::clientAlive', \%args);<br />
src/Network/DirectConnection.pm:286: Plugins::callHook('Network::clientSend', \%args);<br />
src/Network/DirectConnection.pm:301: Plugins::callHook('Network::clientRecv', \%args);<br />
src/Network/DirectConnection.pm:355: Plugins::callHook('Network::serverConnect/master');<br />
src/Network/DirectConnection.pm:486: Plugins::callHook('Network::serverConnect/special');<br />
src/Network/DirectConnection.pm:526: Plugins::callHook('Network::serverConnect/char');<br />
src/Network/DirectConnection.pm:562: Plugins::callHook('Network::serverConnect/charselect');<br />
src/Network/DirectConnection.pm:600: Plugins::callHook('Network::serverConnect/mapserver');<br />
src/Network/DirectConnection.pm:618: Plugins::callHook('disconnected');<br />
src/Network/DirectConnection.pm:633: Plugins::callHook('disconnected');<br />
src/Network/PacketParser.pm:272: Plugins::callHook('packet_pre/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:274: Plugins::callHook('$self->{hook_prefix}/packet_pre/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:289: Plugins::callHook('packet/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:291: Plugins::callHook('$self->{hook_prefix}/packet/$handler->[0]', \%args);<br />
src/Network/PacketParser.pm:368: Plugins::callHook('$self->{hook_prefix}/willMangle', \%args);<br />
src/Network/PacketParser.pm:390: Plugins::callHook('$self->{hook_prefix}/mangle', \%hook_args);<br />
src/Network/PacketParser.pm:494: Plugins::callHook($hook, {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1011: Plugins::callHook($args->{hook}, {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1051: Plugins::callHook('packet_guildMsg', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1104: Plugins::callHook('item_skill', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1155: Plugins::callHook('packet_pubMsg', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1171: Plugins::callHook('packet_sentPM', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1204: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1220: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1295: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1336: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1415: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1044: Plugins::callHook($args->{hook}, {<br />
src/Network/Receive/ServerType0.pm:1086: Plugins::callHook('packet_guildMsg', {<br />
src/Network/Receive/ServerType0.pm:1139: Plugins::callHook('item_skill', {<br />
src/Network/Receive/ServerType0.pm:1190: Plugins::callHook('packet_pubMsg', {<br />
src/Network/Receive/ServerType0.pm:1220: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/ServerType0.pm:1237: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/ServerType0.pm:1317: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1366: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1452: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive.pm:795: Plugins::callHook('parseMsg/recvChars', $args->{options});<br />
src/Network/Receive.pm:943: Plugins::callHook('char_created', {char => $character});<br />
src/Network/Receive.pm:1230: Plugins::callHook('in_game');<br />
src/Network/Receive.pm:1274: Plugins::callHook('disconnected');<br />
src/Network/Receive.pm:1374: Plugins::callHook('exp_gained');<br />
src/Network/Receive.pm:1430: Plugins::callHook('base_level_changed', {level => $actor->{lv}});<br />
src/Network/Receive.pm:1461: Plugins::callHook('zeny_change', {<br />
src/Network/Receive.pm:1532: Plugins::callHook('job_level_changed', {level => $actor->{lv_job}});<br />
src/Network/Receive.pm:1648: Plugins::callHook('packet_charStats', {<br />
src/Network/Receive.pm:1748: Plugins::callHook('packet_pre/actor_display', $args);<br />
src/Network/Receive.pm:1750: Plugins::callHook('packet/actor_display', $args);<br />
src/Network/Receive.pm:2119: Plugins::callHook('add_player_list', $actor);<br />
src/Network/Receive.pm:2123: Plugins::callHook('add_monster_list', $actor);<br />
src/Network/Receive.pm:2127: Plugins::callHook('add_pet_list', $actor);<br />
src/Network/Receive.pm:2131: Plugins::callHook('add_portal_list', $actor);<br />
src/Network/Receive.pm:2140: Plugins::callHook('add_npc_list', $actor);<br />
src/Network/Receive.pm:2144: Plugins::callHook('add_slave_list', $actor);<br />
src/Network/Receive.pm:2147: Plugins::callHook('add_elemental_list', $actor);<br />
src/Network/Receive.pm:2168: Plugins::callHook('player', {player => $actor}); #backwards compatibility<br />
src/Network/Receive.pm:2170: Plugins::callHook('player_exist', {player => $actor});<br />
src/Network/Receive.pm:2174: Plugins::callHook('npc_exist', {npc => $actor});<br />
src/Network/Receive.pm:2178: Plugins::callHook('portal_exist', {portal => $actor});<br />
src/Network/Receive.pm:2213: Plugins::callHook('player', {player => $actor}); #backwards compatibailty<br />
src/Network/Receive.pm:2215: Plugins::callHook('player_connected', {player => $actor});<br />
src/Network/Receive.pm:2243: Plugins::callHook('player_moved', $actor);<br />
src/Network/Receive.pm:2246: Plugins::callHook('monster_moved', $actor);<br />
src/Network/Receive.pm:2249: Plugins::callHook('pet_moved', $actor);<br />
src/Network/Receive.pm:2252: Plugins::callHook('slave_moved', $actor);<br />
src/Network/Receive.pm:2256: Plugins::callHook('portal_moved', $actor);<br />
src/Network/Receive.pm:2260: Plugins::callHook('npc_moved', $actor);<br />
src/Network/Receive.pm:2263: Plugins::callHook('pet_moved', $actor);<br />
src/Network/Receive.pm:2311: Plugins::callHook('self_died');<br />
src/Network/Receive.pm:2350: Plugins::callHook('monster_disappeared', {monster => $monster});<br />
src/Network/Receive.pm:2386: Plugins::callHook('player_disappeared', {player => $player});<br />
src/Network/Receive.pm:2406: Plugins::callHook('portal_disappeared', {portal => $portal});<br />
src/Network/Receive.pm:2415: Plugins::callHook('npc_disappeared', {npc => $npc});<br />
src/Network/Receive.pm:2423: Plugins::callHook('pet_disappeared', {pet => $pet});<br />
src/Network/Receive.pm:2456: Plugins::callHook('slave_disappeared', {slave => $slave});<br />
src/Network/Receive.pm:2472: Plugins::callHook('elemental_disappeared', {elemental => $elemental});<br />
src/Network/Receive.pm:2560: Plugins::callHook('packet_attack', {<br />
src/Network/Receive.pm:2631: Plugins::callHook('charNameUpdate', {player => $player});<br />
src/Network/Receive.pm:2643: Plugins::callHook('mobNameUpdate', {monster => $monster});<br />
src/Network/Receive.pm:2661: Plugins::callHook('npcNameUpdate', {npc => $npc});<br />
src/Network/Receive.pm:2673: Plugins::callHook('petNameUpdate', {pet => $pet});<br />
src/Network/Receive.pm:2684: Plugins::callHook('slaveNameUpdate', {slave => $slave});<br />
src/Network/Receive.pm:2696: Plugins::callHook('elementalNameUpdate', {elemental => $elemental});<br />
src/Network/Receive.pm:2723: Plugins::callHook('base_level', {name => $actor});<br />
src/Network/Receive.pm:2726: Plugins::callHook('job_level', {name => $actor});<br />
src/Network/Receive.pm:3027: Plugins::callHook('packet_localBroadcast', {<br />
src/Network/Receive.pm:3265: Plugins::callHook('show_script', {<br />
src/Network/Receive.pm:3396: Plugins::callHook('packet_sysMsg', {<br />
src/Network/Receive.pm:3548: Plugins::callHook('equipped_item', {<br />
src/Network/Receive.pm:3603: Plugins::callHook('item_gathered', {<br />
src/Network/Receive.pm:3667: Plugins::callHook('packet_item_removed', {index => $item->{binID}});<br />
src/Network/Receive.pm:3679: Plugins::callHook('rental_expired', {<br />
src/Network/Receive.pm:3720: Plugins::callHook('vending_item_sold', {<br />
src/Network/Receive.pm:3732: Plugins::callHook('vending_item_sold_out', {<br />
src/Network/Receive.pm:3764: Plugins::callHook('vending_item_sold', {<br />
src/Network/Receive.pm:3778: Plugins::callHook('vending_item_sold_out', {<br />
src/Network/Receive.pm:3853: Plugins::callHook('packet_vender_store', { item => $item });<br />
src/Network/Receive.pm:3868: Plugins::callHook('packet_vender_store2', {<br />
src/Network/Receive.pm:4146: Plugins::callHook('pvp_mode', {pvp => $pvp});# 1 PvP, 2 GvG, 3 Battleground<br />
src/Network/Receive.pm:4188: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4235: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4284: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4556: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4563: Plugins::callHook('quest_list');<br />
src/Network/Receive.pm:4616: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4684: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4690: Plugins::callHook('quest_added', {questID => $args->{questID}});<br />
src/Network/Receive.pm:4783: Plugins::callHook('quest_mission_updated', {<br />
src/Network/Receive.pm:4854: Plugins::callHook('npc_chat', {<br />
src/Network/Receive.pm:4880: Plugins::callHook('makable_item_list', {item_list => $makableList});<br />
src/Network/Receive.pm:5218: Plugins::callHook('invalid_password');<br />
src/Network/Receive.pm:5246: Plugins::callHook('dial');<br />
src/Network/Receive.pm:5265: Plugins::callHook('invalid_password');<br />
src/Network/Receive.pm:5432: Plugins::callHook('chat_created', {chat => $chatRooms{$accountID}});<br />
src/Network/Receive.pm:5459: Plugins::callHook('packet_chatinfo', {<br />
src/Network/Receive.pm:5503: Plugins::callHook('chat_joined', {chat => $chat});<br />
src/Network/Receive.pm:5568: Plugins::callHook('chat_modified', {<br />
src/Network/Receive.pm:5643: Plugins::callHook('chat_leave');<br />
src/Network/Receive.pm:5657: Plugins::callHook('chat_removed', {<br />
src/Network/Receive.pm:5689: Plugins::callHook('error_deal', {type => $args->{type}});<br />
src/Network/Receive.pm:5692: Plugins::callHook('error_deal', {type => $args->{type}});<br />
src/Network/Receive.pm:5710: Plugins::callHook('engaged_deal', {name => $currentDeal{name}});<br />
src/Network/Receive.pm:5713: Plugins::callHook('error_deal', {type =>$args->{type}});<br />
src/Network/Receive.pm:5716: Plugins::callHook('error_deal', {type =>$args->{type}});<br />
src/Network/Receive.pm:5725: Plugins::callHook('cancelled_deal');<br />
src/Network/Receive.pm:5733: Plugins::callHook('complete_deal');<br />
src/Network/Receive.pm:5741: Plugins::callHook('finalized_deal', {name => $currentDeal{name}});<br />
src/Network/Receive.pm:5760: Plugins::callHook('incoming_deal', {<br />
src/Network/Receive.pm:5858: Plugins::callHook('packet_emotion', {<br />
src/Network/Receive.pm:5901: Plugins::callHook('disconnected')<br />
src/Network/Receive.pm:6041: Plugins::callHook('friend_request', {<br />
src/Network/Receive.pm:6841: Plugins::callHook('packet_useitem', \%hook_args);<br />
src/Network/Receive.pm:6888: Plugins::callHook('item_appeared', {<br />
src/Network/Receive.pm:6918: Plugins::callHook('item_exists', {<br />
src/Network/Receive.pm:7139: Plugins::callHook('Network::Receive::map_changed', {<br />
src/Network/Receive.pm:7255: Plugins::callHook('Network::Receive::map_changed', {<br />
src/Network/Receive.pm:7321: Plugins::callHook('npc_autotalk', {<br />
src/Network/Receive.pm:7342: Plugins::callHook('npc_talk', {<br />
src/Network/Receive.pm:7366: Plugins::callHook('npc_talk_done', {ID => $ID});<br />
src/Network/Receive.pm:7414: Plugins::callHook('npc_autotalk', {<br />
src/Network/Receive.pm:7445: Plugins::callHook('npc_talk_responses', {<br />
src/Network/Receive.pm:7596: Plugins::callHook('buy_result', {fail => $args->{fail}});<br />
src/Network/Receive.pm:7751: Plugins::callHook('deal_you_added', {<br />
src/Network/Receive.pm:7881: Plugins::callHook('add_player_list', $actor);<br />
src/Network/Receive.pm:7882: Plugins::callHook('player', {player => $actor}); #backwards compatibility<br />
src/Network/Receive.pm:7883: Plugins::callHook('player_exist', {player => $actor});<br />
src/Network/Receive.pm:7896: Plugins::callHook('player_disappeared', {player => $player});<br />
src/Network/Receive.pm:8091: Plugins::callHook('packet_partyJoin', { partyName => bytesToString($info->{name}) });<br />
src/Network/Receive.pm:8144: Plugins::callHook('packet_partyMsg', {<br />
src/Network/Receive.pm:8211: Plugins::callHook('party_invite', {<br />
src/Network/Receive.pm:8360: Plugins::callHook('party_users_info_ready');<br />
src/Network/Receive.pm:8457: Plugins::callHook('rodex_mail_list', {<br />
src/Network/Receive.pm:8530: Plugins::callHook('rodex_mail', {<br />
src/Network/Receive.pm:8544: Plugins::callHook('rodex_unread_mail');<br />
src/Network/Receive.pm:8686: Plugins::callHook('rodex_mail_deleted', {<br />
src/Network/Receive.pm:8820: Plugins::callHook('packet_clanMsg', {<br />
src/Network/Receive.pm:9016: Plugins::callHook('cooking_list', {<br />
src/Network/Receive.pm:9131: Plugins::callHook('search_store', $universalCatalogInfo);<br />
src/Network/Receive.pm:9179: Plugins::callHook('packet_message_string', {<br />
src/Network/Receive.pm:9237: Plugins::callHook($hook, {<br />
src/Network/Receive.pm:9263: Plugins::callHook('packet_charSkills', {<br />
src/Network/Receive.pm:9491: Plugins::callHook ('captcha_image', $hookArgs);<br />
src/Network/Receive.pm:9500: Plugins::callHook ('captcha_file', $hookArgs);<br />
src/Network/Receive.pm:9514: Plugins::callHook ('captcha_answer', {flag => $args->{flag}});<br />
src/Network/Receive.pm:9576: Plugins::callHook('packet_open_buying_store', {<br />
src/Network/Receive.pm:9594: Plugins::callHook('packet_buying', {ID => $ID});<br />
src/Network/Receive.pm:9646: Plugins::callHook('packet_buying_store', {<br />
src/Network/Receive.pm:9671: Plugins::callHook('packet_buying_store2', {<br />
src/Network/Receive.pm:9722: Plugins::callHook('packet_buyer', {ID => $ID});<br />
src/Network/Receive.pm:9742: Plugins::callHook('buyer_shop_closed');<br />
src/Network/Receive.pm:9794: Plugins::callHook('packet_special_item_obtain', {<br />
src/Network/Receive.pm:9821: Plugins::callHook('packet_sentPM', {<br />
src/Network/Receive.pm:9954: Plugins::callHook('memo_fail', {field => $field->baseName});<br />
src/Network/Receive.pm:9957: Plugins::callHook('memo_success', {field => $field->baseName});<br />
src/Network/Receive.pm:10324: Plugins::callHook('instance_ready');<br />
src/Network/Receive.pm:10473: Plugins::callHook('equipped_item', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:10501: Plugins::callHook('equipped_item_sw', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:10679: Plugins::callHook('packet_item_removed', {index => $item->{binID}});<br />
src/Network/Receive.pm:11040: Plugins::callHook('parseMsg/addPrivMsgUser', {<br />
src/Network/Receive.pm:11052: Plugins::callHook('packet_privMsg', {<br />
src/Network/Receive.pm:11225: Plugins::callHook('packet_selfChat', {<br />
src/Network/Receive.pm:11332: Plugins::callHook('is_casting', {<br />
src/Network/Receive.pm:11403: Plugins::callHook('packet_castCancelled', {<br />
src/Network/Receive.pm:11451: Plugins::callHook('unequipped_item', {<br />
src/Network/Receive.pm:11482: Plugins::callHook('unequipped_item_sw', {<br />
src/Network/Receive.pm:11518: Plugins::callHook('packet_vender', {<br />
src/Network/Receive.pm:11554: Plugins::callHook('packet_charSkills', {<br />
src/Network/Receive.pm:11635: Plugins::callHook('packet_skillfail', {<br />
src/Network/Receive.pm:11648: Plugins::callHook('open_store_success');<br />
src/Network/Receive.pm:11652: Plugins::callHook('open_store_fail', { flag => $args->{flag} });<br />
src/Network/Receive.pm:11790: Plugins::callHook('banking_opened');<br />
src/Network/Receive.pm:11806: Plugins::callHook('banking_deposit_success');<br />
src/Network/Receive.pm:11815: Plugins::callHook('banking_deposit_failed', {'reason' => $args->{reason}});<br />
src/Network/Receive.pm:11830: Plugins::callHook('banking_withdraw_success');<br />
src/Network/Receive.pm:11837: Plugins::callHook('banking_withdraw_failed', {'reason' => $args->{reason}});<br />
src/Network/Receive.pm:11856: Plugins::callHook('navigate_to', $args);<br />
src/Network/Receive.pm:12094: Plugins::callHook ('captcha_image', $hookArgs);<br />
src/Network/Send/ServerType1.pm:37: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType1.pm:38: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType1.pm:56: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType1.pm:74: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType1.pm:151: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType10.pm:39: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType10.pm:40: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType10.pm:59: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType2.pm:44: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType2.pm:45: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType3.pm:59: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType3.pm:60: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType4.pm:45: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType4.pm:46: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType5.pm:57: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType5.pm:58: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType6.pm:36: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType6.pm:37: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType7.pm:35: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType7.pm:55: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType7.pm:73: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType7.pm:96: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8.pm:65: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send/ServerType8.pm:66: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send/ServerType8.pm:85: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8.pm:103: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8.pm:120: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8.pm:140: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_1.pm:54: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8_1.pm:141: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8_1.pm:160: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8_1.pm:182: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_3.pm:48: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8_3.pm:66: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8_3.pm:94: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8_5.pm:46: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_5.pm:180: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send.pm:245: Plugins::callHook($hookName, \%args);<br />
src/Network/Send.pm:487: Plugins::callHook('packet/sendMapLoaded');<br />
src/Network/Send.pm:536: Plugins::callHook('packet_pre/sendAttack', \%args)<br />
src/Network/Send.pm:537: Plugins::callHook('packet_pre/sendSit', \%args)<br />
src/Network/Send.pm:826: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/XKore.pm:120: Plugins::callHook('Network::serverSend/pre', {msg => \$msg});<br />
src/Network/XKore.pm:140: Plugins::callHook('Network::stateChanged');<br />
src/Network/XKore.pm:243: Plugins::callHook('disconnected');<br />
src/Network/XKore.pm:264: Plugins::callHook('XKore_start');<br />
src/Poseidon/Client.pm:82: Plugins::callHook('Poseidon/client_authenticate', {<br />
src/Poseidon/QueryServer.pm:78: Plugins::callHook('Poseidon/server_authenticate', {<br />
src/Settings.pm:344: Plugins::callHook( usage => $data );<br />
src/Settings.pm:498: Plugins::callHook('pre_load_'.$internalFilename, $pre_load);<br />
src/Settings.pm:546: Plugins::callHook('load_'.$internalFilename, $load);<br />
src/Settings.pm:551: Plugins::callHook('pos_load_'.$internalFilename, $pos_load);<br />
src/Settings.pm:553: Plugins::callHook('load_'.$internalFilename, $load);<br />
src/Settings.pm:557: Plugins::callHook('pos_load_'.$internalFilename, $pos_load);<br />
src/Settings.pm:599: Plugins::callHook('preloadfiles', {files => $files});<br />
src/Settings.pm:603: Plugins::callHook('loadfiles', {<br />
src/Settings.pm:611: Plugins::callHook('postloadfiles', {files => $files});<br />
src/Task/MapRoute.pm:193: Plugins::callHook('npc_teleport_missing' => \%plugin_args );<br />
src/Task/MapRoute.pm:406: Plugins::callHook('Task::MapRoute::iterate::missing_portal', \%plugin_args);<br />
src/Task/MapRoute.pm:483: Plugins::callHook('Task::MapRoute::iterate::route_portal_near', \%plugin_args);<br />
src/Task/Route.pm:313: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:414: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:426: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:469: Plugins::callHook('route', {status => 'stuck'});<br />
src/Task/Route.pm:599: Plugins::callHook('getRoute' => \%plugin_args);<br />
src/Utils/PathFinding.pm:103: Plugins::callHook('PathFindingReset', \%hookArgs);<br />
</pre><br />
<br />
[[Category:Development]]</div>4epThttps://openkore.com/index.php?title=Template:SimpleHookEvent&diff=7024Template:SimpleHookEvent2023-01-15T01:21:37Z<p>4epT: </p>
<hr />
<div> <noinclude>This template describes the '''SimpleHookEvent''' [[EventMacro#Event|Event Conditions]] of the automacro eventMacros.</noinclude><br />
;SimpleHookEvent<br />
:* Description: Is checked every time the [[hooks|hook]] you set, is triggered.<br />
<br />
: Syntax:<br />
SimpleHookEvent <hook name><br />
<br />
: Example:<br />
SimpleHookEvent target_died<br />
<br />
: Set all variables the hook have as:<br />
$.SimpleHookEventLast <Capitalized variable name><br />
<br />
<br />
: Example 1:<br />
Plugins::callHook("target_died", {monster => $monsters_old{$ID}});<br />
<br />
SimpleHookEvent target_died<br />
$.SimpleHookEventLast'''Monster''' => monster ID in target_died hook<br />
<br />
: Example 2:<br />
Plugins::callHook ('open_shop', {title => $shop{title}, items => \@items});<br />
<br />
SimpleHookEvent open_shop<br />
$.SimpleHookEventLast'''Title'''<br />
@.SimpleHookEventLast'''Items'''<br />
$.SimpleHookEventLast'''Items[0]'''<br />
<br />
: Example 3:<br />
my %hook_args = (<br />
serverIndex => $index,<br />
itemID => $itemID,<br />
);<br />
Plugins::callHook('packet_useitem', \%hook_args);<br />
<br />
SimpleHookEvent packet_useitem<br />
%.SimpleHookEventLast'''Hook_args'''<br />
$.SimpleHookEventLast'''Hook_args{serverIndex}'''</div>4epThttps://openkore.com/index.php?title=hooks&diff=7023hooks2023-01-14T23:15:25Z<p>4epT: </p>
<hr />
<div>== Recommended hooks ==<br />
<br />
=== Initialization ===<br />
<br />
==== start ====<br />
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.<br />
<br />
==== start2 ====<br />
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.<br />
<br />
==== start3 ====<br />
Called once after all [[:Category:control|control]] and [[:Category:tables|tables]] files are loaded. You probably should use '''initialized''' hook instead.<br />
<br />
==== initialized ====<br />
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.<br />
<br />
=== Continuous Work ===<br />
<br />
==== mainLoop_pre ====<br />
Called continuously.<br />
<br />
==== mainLoop_post ====<br />
Called continuously, after processing all other routines.<br />
<br />
==== AI_pre/manual ====<br />
Called continuously when in game unless [[ai|AI]] is turned off.<br />
<br />
==== AI_pre ====<br />
Called continuously when in game if [[ai|AI]] is set to automatic.<br />
<br />
==== AI_post ====<br />
Called continuously when in game if [[ai|AI]] is set to automatic, after processing all other AI routines.<br />
<br />
== Discovering all existing hooks Unix Distro ==<br />
<br />
find src -type f \( -name "*.pl" -or -name "*.pm" \) -exec grep -Hn "^[^#]*callHook" {} \;<br />
<br />
== Discovering all existing hooks Windows Distro ==<br />
open cmd<br />
cd openkore\src<br />
findstr /S /n "callHook" *.pl;<br />
findstr /S /n "callHook" *.pm;<br />
<br />
Note that some hooks, like <code>packet/<name></code>, <code>packet_pre/<name></code> and <code>mangle/<name></code>, actually are many hooks, for example, one hook for each network packet type. [[Mangle|See about it here]].<br />
<br />
== Hook List ==<br />
This list might be outdated.<br />
<br />
<pre><br />
src/Actor/Item.pm:526: Plugins::callHook( 'get_item_weight', $self ) if !defined $self->{weight};<br />
src/Actor/You.pm:282: Plugins::callHook('attack_start', {ID => $targetID});<br />
src/Actor.pm:589: Plugins::callHook('Actor::setStatus::change', {<br />
src/AI/Attack.pm:218: Plugins::callHook("target_died", {monster => $monsters_old{$ID}});<br />
src/AI/Attack.pm:259: Plugins::callHook('attack_end', {ID => $ID})<br />
src/AI/Attack.pm:690: Plugins::callHook('AI::Attack::main', {target => $target})<br />
src/AI/CoreLogic.pm:57: Plugins::callHook('AI_start', {state => AI::state});<br />
src/AI/CoreLogic.pm:68: Plugins::callHook('AI_pre/manual');<br />
src/AI/CoreLogic.pm:118: Plugins::callHook('AI_pre');<br />
src/AI/CoreLogic.pm:218: Plugins::callHook('AI_post');<br />
src/AI/CoreLogic.pm:549: Plugins::callHook('portal_exist2', {<br />
src/AI/CoreLogic.pm:575: Plugins::callHook('portal_exist2', {<br />
src/AI/CoreLogic.pm:968: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1190: Plugins::callHook( AI_storage_auto_weight_start => \%plugin_args );<br />
src/AI/CoreLogic.pm:1201: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1212: Plugins::callHook( AI_storage_auto_get_auto_start => \%plugin_args );<br />
src/AI/CoreLogic.pm:1256: Plugins::callHook("AI_storage_item_out_of_stock", {<br />
src/AI/CoreLogic.pm:1281: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1298: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1302: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1445: Plugins::callHook("AI_storage_open", \%pluginArgs); # we can hook here to perform actions BEFORE any storage function<br />
src/AI/CoreLogic.pm:1460: Plugins::callHook("AI_storage_full", \%pluginArgs);<br />
src/AI/CoreLogic.pm:1484: Plugins::callHook("AI_storage_item_full", {<br />
src/AI/CoreLogic.pm:1545: Plugins::callHook("AI_storage_done", \%hookArgs);<br />
src/AI/CoreLogic.pm:1629: Plugins::callHook("AI_storage_item_out_of_stock", {<br />
src/AI/CoreLogic.pm:1663: Plugins::callHook("AI_storage_done_after_getAuto", \%hookArgs);<br />
src/AI/CoreLogic.pm:1699: Plugins::callHook( AI_sell_auto_start => \%plugin_args );<br />
src/AI/CoreLogic.pm:1707: Plugins::callHook('AI_sell_auto_queued');<br />
src/AI/CoreLogic.pm:1724: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1728: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1845: Plugins::callHook("AI_sell_auto");<br />
src/AI/CoreLogic.pm:1874: Plugins::callHook('AI_sell_auto_done');<br />
src/AI/CoreLogic.pm:1885: Plugins::callHook( AI_buy_auto_start => \%plugin_args );<br />
src/AI/CoreLogic.pm:1921: Plugins::callHook('AI_buy_auto_queued');<br />
src/AI/CoreLogic.pm:1937: Plugins::callHook('AI_buy_auto_done');<br />
src/AI/CoreLogic.pm:1941: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1945: Plugins::callHook('AI_storage_auto_queued');<br />
src/AI/CoreLogic.pm:1949: Plugins::callHook('AI_buy_auto');<br />
src/AI/CoreLogic.pm:2266: Plugins::callHook("AI/lockMap", \%args);<br />
src/AI/CoreLogic.pm:2384: Plugins::callHook( ai_processRandomWalk => \%plugin_args );<br />
src/AI/CoreLogic.pm:2703: Plugins::callHook("ai_follow", $args);<br />
src/AI/CoreLogic.pm:3223: Plugins::callHook("checkMonsterAutoAttack", \%hookArgs);<br />
src/AI/CoreLogic.pm:3286: Plugins::callHook('ai_items_take');<br />
src/AI/SlaveAttack.pm:186: Plugins::callHook("slave_target_died", {ID => $ID, slave => $slave});<br />
src/AI/SlaveAttack.pm:224: Plugins::callHook('slave_attack_end', {ID => $ID, slave => $slave})<br />
src/AI.pm:98: Plugins::callHook('AI_state_change', {old => $AI, new => $_[0]});<br />
src/ChatQueue.pm:64: Plugins::callHook('ChatQueue::add', \%item);<br />
src/ChatQueue.pm:616: Plugins::callHook('ChatQueue::processChatResponse', $cmd);<br />
src/Commands.pm:870: Plugins::callHook("Commands::run/pre", \%params);<br />
src/Commands.pm:872: Plugins::callHook("Commands::run/post", \%params);<br />
src/Commands.pm:876: Plugins::callHook('Command_post', \%params);<br />
src/Commands.pm:1244: Plugins::callHook('AI_buy_auto_queued');<br />
src/Commands.pm:1273: Plugins::callHook('AI_sell_auto_queued');<br />
src/Commands.pm:1281: Plugins::callHook('AI_storage_auto_queued');<br />
src/Commands.pm:2094: Plugins::callHook('Commands::cmdConf', {<br />
src/FileParsers.pm:784: Plugins::callHook("FileParsers::ROLUT", \%ret);<br />
src/FileParsers.pm:811: Plugins::callHook("FileParsers::RODescLUT", \%ret);<br />
src/FileParsers.pm:861: Plugins::callHook ('FileParsers::ROQuestsLUT', \%ret);<br />
src/FileParsers.pm:1480: Plugins::callHook('updatePortalLUT', $plugin_args);<br />
src/FileParsers.pm:1494: Plugins::callHook('updatePortalLUT2', $plugin_args);<br />
src/functions.pl:74: Plugins::callHook('mainLoop_pre');<br />
src/functions.pl:76: Plugins::callHook('mainLoop_post');<br />
src/functions.pl:83: Plugins::callHook('start');<br />
src/functions.pl:136: Plugins::callHook( 'parse_command_line' );<br />
src/functions.pl:378: Plugins::callHook('start2');<br />
src/functions.pl:402: Plugins::callHook('start3');<br />
src/functions.pl:633: Plugins::callHook('initialized');<br />
src/functions.pl:793: Plugins::callHook('packet_mapChange');<br />
src/functions.pl:1002: Plugins::callHook('mainLoop::setTitle',\%args);<br />
src/Interface/Console/Curses.pm:683: Plugins::callHook( 'curses/updateStatus' );<br />
src/Interface/Console/Curses.pm:808: Plugins::callHook( 'curses/updateObjects' );<br />
src/InventoryList/Cart.pm:41: Plugins::callHook('cart_ready');<br />
src/InventoryList/Cart.pm:43: Plugins::callHook('cart_info_updated');<br />
src/InventoryList/Cart.pm:102: Plugins::callHook('cart_ready');<br />
src/InventoryList/Inventory.pm:41: Plugins::callHook('inventory_ready');<br />
src/InventoryList/Inventory.pm:71: Plugins::callHook('inventory_ready');<br />
src/InventoryList/Storage.pm:44: Plugins::callHook('storage_first_session_openning');<br />
src/InventoryList/Storage.pm:46: Plugins::callHook('packet_storage_open');<br />
src/InventoryList/Storage.pm:53: Plugins::callHook('packet_storage_close');<br />
src/InventoryList/Storage.pm:89: Plugins::callHook('storage_ready');<br />
src/Misc.pm:315: Plugins::callHook('configModify', {<br />
src/Misc.pm:366: Plugins::callHook('configModify', {<br />
src/Misc.pm:406: Plugins::callHook('setTimeout', {<br />
src/Misc.pm:1283: Plugins::callHook('charSelectScreen', \%plugin_args);<br />
src/Misc.pm:1515: Plugins::callHook( ai_check_Aggressiveness => \%plugin_args );<br />
src/Misc.pm:1550: Plugins::callHook( ai_slave_check_Aggressiveness => \%plugin_args );<br />
src/Misc.pm:2143: Plugins::callHook('inventory_item_removed', {item => $item, index => $binID, amount => $amount, remaining => ($item->{amount} <= 0 ? 0 : $item->{amount})});<br />
src/Misc.pm:2162: Plugins::callHook('storage_item_removed', {item => $item, index => $binID, amount => $amount, remaining => ($item->{amount} <= 0 ? 0 : $item->{amount})});<br />
src/Misc.pm:2181: Plugins::callHook('cart_item_removed', {item => $item, index => $binID, amount => $amount, remaining => ($item->{amount} <= 0 ? 0 : $item->{amount})});<br />
src/Misc.pm:2868: Plugins::callHook('objectAdded', {<br />
src/Misc.pm:2885: Plugins::callHook('objectRemoved', {<br />
src/Misc.pm:3277: Plugins::callHook('changed_status',{actor => $actor, changed => $changed});<br />
src/Misc.pm:3287: Plugins::callHook('perfect_hidden_player',{actor => $actor, changed => $changed});<br />
src/Misc.pm:3299: Plugins::callHook('perfect_hidden_npc',{actor => $actor, changed => $changed});<br />
src/Misc.pm:3760: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3766: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3798: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3807: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3817: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3829: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:3887: Plugins::callHook('teleport_sent', \%args);<br />
src/Misc.pm:4275: Plugins::callHook('avoidGM_near', \%args);<br />
src/Misc.pm:4327: Plugins::callHook('avoidGM_talk', \%args);<br />
src/Misc.pm:4366: Plugins::callHook('avoidList_near', \%args);<br />
src/Misc.pm:5034: Plugins::callHook("checkSelfCondition", \%hookArgs);<br />
src/Misc.pm:5186: Plugins::callHook('checkPlayerCondition', \%args);<br />
src/Misc.pm:5261: Plugins::callHook('checkMonsterCondition', \%args);<br />
src/Misc.pm:5351: Plugins::callHook ('open_shop', {title => $shop{title}, items => \@items});<br />
src/Misc.pm:5365: Plugins::callHook("shop_closed");<br />
src/Misc.pm:5460: Plugins::callHook ('buyer_open_shop', {title => $buyer_shop{title}, limitZeny=> $limitZeny, items => \@items});<br />
src/Misc.pm:5477: Plugins::callHook("buyer_shop_closed");<br />
src/Network/ClientReceive.pm:75: Plugins::callHook('map_loaded');<br />
src/Network/DirectConnection.pm:140: Plugins::callHook('Network::connectTo', {<br />
src/Network/DirectConnection.pm:173: Plugins::callHook("Network::serverSend/pre", { msg => \$msg });<br />
src/Network/DirectConnection.pm:178: Plugins::callHook("Network::serverSend", { msg => $msg });<br />
src/Network/DirectConnection.pm:196: Plugins::callHook("Network::serverRecv", { msg => \$msg });<br />
src/Network/DirectConnection.pm:245: Plugins::callHook("serverDisconnect/fail");<br />
src/Network/DirectConnection.pm:248: Plugins::callHook("serverDisconnect/success");<br />
src/Network/DirectConnection.pm:260: Plugins::callHook('Network::stateChanged');<br />
src/Network/DirectConnection.pm:274: Plugins::callHook('Network::clientAlive', \%args);<br />
src/Network/DirectConnection.pm:286: Plugins::callHook('Network::clientSend', \%args);<br />
src/Network/DirectConnection.pm:301: Plugins::callHook('Network::clientRecv', \%args);<br />
src/Network/DirectConnection.pm:355: Plugins::callHook("Network::serverConnect/master");<br />
src/Network/DirectConnection.pm:486: Plugins::callHook("Network::serverConnect/special");<br />
src/Network/DirectConnection.pm:526: Plugins::callHook("Network::serverConnect/char");<br />
src/Network/DirectConnection.pm:562: Plugins::callHook("Network::serverConnect/charselect");<br />
src/Network/DirectConnection.pm:600: Plugins::callHook("Network::serverConnect/mapserver");<br />
src/Network/DirectConnection.pm:618: Plugins::callHook('disconnected');<br />
src/Network/DirectConnection.pm:633: Plugins::callHook('disconnected');<br />
src/Network/PacketParser.pm:272: Plugins::callHook("packet_pre/$handler->[0]", \%args);<br />
src/Network/PacketParser.pm:274: Plugins::callHook("$self->{hook_prefix}/packet_pre/$handler->[0]", \%args);<br />
src/Network/PacketParser.pm:289: Plugins::callHook("packet/$handler->[0]", \%args);<br />
src/Network/PacketParser.pm:291: Plugins::callHook("$self->{hook_prefix}/packet/$handler->[0]", \%args);<br />
src/Network/PacketParser.pm:368: Plugins::callHook("$self->{hook_prefix}/willMangle", \%args);<br />
src/Network/PacketParser.pm:390: Plugins::callHook("$self->{hook_prefix}/mangle", \%hook_args);<br />
src/Network/PacketParser.pm:494: Plugins::callHook($hook, {switch => $switch, msg => $msg, msg_size => length($msg), realMsg => \$msg});<br />
src/Network/Receive/kRO/Sakexe_0.pm:1011: Plugins::callHook($args->{hook}, {index => $index, item => $local_item});<br />
src/Network/Receive/kRO/Sakexe_0.pm:1048: Plugins::callHook('packet_guildMsg', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1101: Plugins::callHook('item_skill', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1152: Plugins::callHook('packet_pubMsg', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1168: Plugins::callHook('packet_sentPM', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1201: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1217: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1292: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1333: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/kRO/Sakexe_0.pm:1412: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1044: Plugins::callHook($args->{hook}, {index => $index, item => $local_item});<br />
src/Network/Receive/ServerType0.pm:1083: Plugins::callHook('packet_guildMsg', {<br />
src/Network/Receive/ServerType0.pm:1136: Plugins::callHook('item_skill', {<br />
src/Network/Receive/ServerType0.pm:1187: Plugins::callHook('packet_pubMsg', {<br />
src/Network/Receive/ServerType0.pm:1217: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/ServerType0.pm:1234: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive/ServerType0.pm:1314: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1363: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive/ServerType0.pm:1449: Plugins::callHook('packet_skilluse', {<br />
src/Network/Receive.pm:795: Plugins::callHook('parseMsg/recvChars', $args->{options});<br />
src/Network/Receive.pm:943: Plugins::callHook('char_created', { char => $character });<br />
src/Network/Receive.pm:1230: Plugins::callHook('in_game');<br />
src/Network/Receive.pm:1274: Plugins::callHook('disconnected');<br />
src/Network/Receive.pm:1374: Plugins::callHook('exp_gained');<br />
src/Network/Receive.pm:1430: Plugins::callHook('base_level_changed', {<br />
src/Network/Receive.pm:1463: Plugins::callHook('zeny_change', {<br />
src/Network/Receive.pm:1534: Plugins::callHook('job_level_changed', {<br />
src/Network/Receive.pm:1652: Plugins::callHook('packet_charStats', {<br />
src/Network/Receive.pm:1752: Plugins::callHook('packet_pre/actor_display', $args);<br />
src/Network/Receive.pm:1754: Plugins::callHook('packet/actor_display', $args);<br />
src/Network/Receive.pm:2123: Plugins::callHook('add_player_list', $actor);<br />
src/Network/Receive.pm:2127: Plugins::callHook('add_monster_list', $actor);<br />
src/Network/Receive.pm:2131: Plugins::callHook('add_pet_list', $actor);<br />
src/Network/Receive.pm:2135: Plugins::callHook('add_portal_list', $actor);<br />
src/Network/Receive.pm:2144: Plugins::callHook('add_npc_list', $actor);<br />
src/Network/Receive.pm:2148: Plugins::callHook('add_slave_list', $actor);<br />
src/Network/Receive.pm:2151: Plugins::callHook('add_elemental_list', $actor);<br />
src/Network/Receive.pm:2172: Plugins::callHook('player', {player => $actor}); #backwards compatibility<br />
src/Network/Receive.pm:2174: Plugins::callHook('player_exist', {player => $actor});<br />
src/Network/Receive.pm:2178: Plugins::callHook('npc_exist', {npc => $actor});<br />
src/Network/Receive.pm:2182: Plugins::callHook('portal_exist', {portal => $actor});<br />
src/Network/Receive.pm:2217: Plugins::callHook('player', {player => $actor}); #backwards compatibailty<br />
src/Network/Receive.pm:2219: Plugins::callHook('player_connected', {player => $actor});<br />
src/Network/Receive.pm:2247: Plugins::callHook('player_moved', $actor);<br />
src/Network/Receive.pm:2250: Plugins::callHook('monster_moved', $actor);<br />
src/Network/Receive.pm:2253: Plugins::callHook('pet_moved', $actor);<br />
src/Network/Receive.pm:2256: Plugins::callHook('slave_moved', $actor);<br />
src/Network/Receive.pm:2260: Plugins::callHook('portal_moved', $actor);<br />
src/Network/Receive.pm:2264: Plugins::callHook('npc_moved', $actor);<br />
src/Network/Receive.pm:2267: Plugins::callHook('pet_moved', $actor);<br />
src/Network/Receive.pm:2315: Plugins::callHook('self_died');<br />
src/Network/Receive.pm:2354: Plugins::callHook('monster_disappeared', {monster => $monster});<br />
src/Network/Receive.pm:2390: Plugins::callHook('player_disappeared', {player => $player});<br />
src/Network/Receive.pm:2410: Plugins::callHook('portal_disappeared', {portal => $portal});<br />
src/Network/Receive.pm:2419: Plugins::callHook('npc_disappeared', {npc => $npc});<br />
src/Network/Receive.pm:2427: Plugins::callHook('pet_disappeared', {pet => $pet});<br />
src/Network/Receive.pm:2460: Plugins::callHook('slave_disappeared', {slave => $slave});<br />
src/Network/Receive.pm:2476: Plugins::callHook('elemental_disappeared', {elemental => $elemental});<br />
src/Network/Receive.pm:2564: Plugins::callHook('packet_attack', {sourceID => $args->{sourceID}, targetID => $args->{targetID}, msg => \$msg, dmg => $totalDamage, type => $args->{type}});<br />
src/Network/Receive.pm:2629: Plugins::callHook('charNameUpdate', {player => $player});<br />
src/Network/Receive.pm:2641: Plugins::callHook('mobNameUpdate', {monster => $monster});<br />
src/Network/Receive.pm:2659: Plugins::callHook('npcNameUpdate', {npc => $npc});<br />
src/Network/Receive.pm:2671: Plugins::callHook('petNameUpdate', {pet => $pet});<br />
src/Network/Receive.pm:2682: Plugins::callHook('slaveNameUpdate', {slave => $slave});<br />
src/Network/Receive.pm:2694: Plugins::callHook('elementalNameUpdate', {elemental => $elemental});<br />
src/Network/Receive.pm:2721: Plugins::callHook('base_level', {name => $actor});<br />
src/Network/Receive.pm:2724: Plugins::callHook('job_level', {name => $actor});<br />
src/Network/Receive.pm:3025: Plugins::callHook('packet_localBroadcast', {<br />
src/Network/Receive.pm:3263: Plugins::callHook('show_script', {<br />
src/Network/Receive.pm:3394: Plugins::callHook('packet_sysMsg', {<br />
src/Network/Receive.pm:3546: Plugins::callHook('equipped_item', {slot => 'arrow', item => $item});<br />
src/Network/Receive.pm:3598: Plugins::callHook('item_gathered',{item => $item->{name}, amount => $amount});<br />
src/Network/Receive.pm:3659: Plugins::callHook('packet_item_removed', {index => $item->{binID}});<br />
src/Network/Receive.pm:3671: Plugins::callHook('rental_expired', {<br />
src/Network/Receive.pm:3712: Plugins::callHook(<br />
src/Network/Receive.pm:3727: Plugins::callHook(<br />
src/Network/Receive.pm:3762: Plugins::callHook(<br />
src/Network/Receive.pm:3779: Plugins::callHook(<br />
src/Network/Receive.pm:3857: Plugins::callHook('packet_vender_store', { item => $item });<br />
src/Network/Receive.pm:3872: Plugins::callHook('packet_vender_store2', {<br />
src/Network/Receive.pm:4150: Plugins::callHook('pvp_mode', {<br />
src/Network/Receive.pm:4194: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4241: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4290: Plugins::callHook('packet_areaSpell', {<br />
src/Network/Receive.pm:4562: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4569: Plugins::callHook('quest_list');<br />
src/Network/Receive.pm:4622: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4690: Plugins::callHook('quest_mission_added', {<br />
src/Network/Receive.pm:4696: Plugins::callHook('quest_added', {<br />
src/Network/Receive.pm:4791: Plugins::callHook('quest_mission_updated', {<br />
src/Network/Receive.pm:4862: Plugins::callHook('npc_chat', {<br />
src/Network/Receive.pm:4888: Plugins::callHook('makable_item_list', {<br />
src/Network/Receive.pm:5228: Plugins::callHook('invalid_password');<br />
src/Network/Receive.pm:5256: Plugins::callHook('dial');<br />
src/Network/Receive.pm:5275: Plugins::callHook('invalid_password');<br />
src/Network/Receive.pm:5442: Plugins::callHook('chat_created', {<br />
src/Network/Receive.pm:5471: Plugins::callHook('packet_chatinfo', {<br />
src/Network/Receive.pm:5515: Plugins::callHook('chat_joined', {<br />
src/Network/Receive.pm:5582: Plugins::callHook('chat_modified', {<br />
src/Network/Receive.pm:5657: Plugins::callHook('chat_leave');<br />
src/Network/Receive.pm:5671: Plugins::callHook('chat_removed', {<br />
src/Network/Receive.pm:5703: Plugins::callHook("error_deal", { type =>$args->{type}} );<br />
src/Network/Receive.pm:5706: Plugins::callHook("error_deal", { type =>$args->{type}} );<br />
src/Network/Receive.pm:5724: Plugins::callHook("engaged_deal", {name => $currentDeal{name}});<br />
src/Network/Receive.pm:5727: Plugins::callHook("error_deal", { type =>$args->{type}} );<br />
src/Network/Receive.pm:5730: Plugins::callHook("error_deal", { type =>$args->{type}} );<br />
src/Network/Receive.pm:5739: Plugins::callHook("cancelled_deal");<br />
src/Network/Receive.pm:5747: Plugins::callHook("complete_deal");<br />
src/Network/Receive.pm:5755: Plugins::callHook("finalized_deal", {name => $currentDeal{name}});<br />
src/Network/Receive.pm:5774: Plugins::callHook("incoming_deal", {<br />
src/Network/Receive.pm:5872: Plugins::callHook('packet_emotion', {<br />
src/Network/Receive.pm:5915: Plugins::callHook('disconnected') if ($net->getState() == Network::IN_GAME);<br />
src/Network/Receive.pm:6055: Plugins::callHook("friend_request", {<br />
src/Network/Receive.pm:6855: Plugins::callHook('packet_useitem', \%hook_args);<br />
src/Network/Receive.pm:6902: Plugins::callHook('item_appeared', {<br />
src/Network/Receive.pm:6932: Plugins::callHook('item_exists', {<br />
src/Network/Receive.pm:7153: Plugins::callHook('Network::Receive::map_changed', {<br />
src/Network/Receive.pm:7269: Plugins::callHook('Network::Receive::map_changed', {<br />
src/Network/Receive.pm:7335: Plugins::callHook('npc_autotalk', {<br />
src/Network/Receive.pm:7356: Plugins::callHook('npc_talk', {<br />
src/Network/Receive.pm:7380: Plugins::callHook('npc_talk_done', {ID => $ID});<br />
src/Network/Receive.pm:7428: Plugins::callHook('npc_autotalk', {<br />
src/Network/Receive.pm:7459: Plugins::callHook('npc_talk_responses', {<br />
src/Network/Receive.pm:7610: Plugins::callHook('buy_result', {fail => $args->{fail}});<br />
src/Network/Receive.pm:7765: Plugins::callHook("deal_you_added", {id => $id, item => $item});<br />
src/Network/Receive.pm:7892: Plugins::callHook('add_player_list', $actor);<br />
src/Network/Receive.pm:7893: Plugins::callHook('player', {player => $actor}); #backwards compatibility<br />
src/Network/Receive.pm:7894: Plugins::callHook('player_exist', {player => $actor});<br />
src/Network/Receive.pm:7907: Plugins::callHook('player_disappeared', {player => $player});<br />
src/Network/Receive.pm:8102: Plugins::callHook('packet_partyJoin', { partyName => bytesToString($info->{name}) });<br />
src/Network/Receive.pm:8155: Plugins::callHook('packet_partyMsg', {<br />
src/Network/Receive.pm:8222: Plugins::callHook("party_invite", {<br />
src/Network/Receive.pm:8371: Plugins::callHook('party_users_info_ready');<br />
src/Network/Receive.pm:8468: Plugins::callHook('rodex_mail_list', {<br />
src/Network/Receive.pm:8541: Plugins::callHook('rodex_mail', {<br />
src/Network/Receive.pm:8555: Plugins::callHook('rodex_unread_mail');<br />
src/Network/Receive.pm:8697: Plugins::callHook('rodex_mail_deleted', {<br />
src/Network/Receive.pm:8831: Plugins::callHook('packet_clanMsg', {<br />
src/Network/Receive.pm:9027: Plugins::callHook('cooking_list', {<br />
src/Network/Receive.pm:9142: Plugins::callHook("search_store", $universalCatalogInfo);<br />
src/Network/Receive.pm:9190: Plugins::callHook('packet_message_string', {<br />
src/Network/Receive.pm:9248: Plugins::callHook($hook, {<br />
src/Network/Receive.pm:9274: Plugins::callHook('packet_charSkills', {<br />
src/Network/Receive.pm:9502: Plugins::callHook ('captcha_image', $hookArgs);<br />
src/Network/Receive.pm:9511: Plugins::callHook ('captcha_file', $hookArgs);<br />
src/Network/Receive.pm:9525: Plugins::callHook ('captcha_answer', {flag => $args->{flag}});<br />
src/Network/Receive.pm:9587: Plugins::callHook('packet_open_buying_store', {<br />
src/Network/Receive.pm:9605: Plugins::callHook('packet_buying', {ID => $ID});<br />
src/Network/Receive.pm:9657: Plugins::callHook('packet_buying_store', {<br />
src/Network/Receive.pm:9682: Plugins::callHook('packet_buying_store2', {<br />
src/Network/Receive.pm:9733: Plugins::callHook('packet_buyer', {ID => $ID});<br />
src/Network/Receive.pm:9753: Plugins::callHook("buyer_shop_closed");<br />
src/Network/Receive.pm:9805: Plugins::callHook('packet_special_item_obtain', {<br />
src/Network/Receive.pm:9832: Plugins::callHook('packet_sentPM', {<br />
src/Network/Receive.pm:9965: Plugins::callHook('memo_fail', { "field" => $field->baseName });<br />
src/Network/Receive.pm:9968: Plugins::callHook('memo_success', { "field" => $field->baseName });<br />
src/Network/Receive.pm:10335: Plugins::callHook('instance_ready');<br />
src/Network/Receive.pm:10484: Plugins::callHook('equipped_item', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:10512: Plugins::callHook('equipped_item_sw', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:10690: Plugins::callHook('packet_item_removed', {index => $item->{binID}});<br />
src/Network/Receive.pm:11051: Plugins::callHook('parseMsg/addPrivMsgUser', {<br />
src/Network/Receive.pm:11063: Plugins::callHook('packet_privMsg', {<br />
src/Network/Receive.pm:11236: Plugins::callHook('packet_selfChat', {<br />
src/Network/Receive.pm:11343: Plugins::callHook('is_casting', {<br />
src/Network/Receive.pm:11414: Plugins::callHook('packet_castCancelled', {<br />
src/Network/Receive.pm:11462: Plugins::callHook('unequipped_item', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:11490: Plugins::callHook('unequipped_item_sw', {slot => $equipSlot_lut{$_}, item => $item});<br />
src/Network/Receive.pm:11523: Plugins::callHook('packet_vender', {ID => $ID, title => bytesToString($args->{title})});<br />
src/Network/Receive.pm:11556: Plugins::callHook('packet_charSkills', {<br />
src/Network/Receive.pm:11637: Plugins::callHook('packet_skillfail', {<br />
src/Network/Receive.pm:11650: Plugins::callHook('open_store_success');<br />
src/Network/Receive.pm:11654: Plugins::callHook('open_store_fail', { flag => $args->{flag} });<br />
src/Network/Receive.pm:11792: Plugins::callHook("banking_opened");<br />
src/Network/Receive.pm:11808: Plugins::callHook("banking_deposit_success");<br />
src/Network/Receive.pm:11817: Plugins::callHook("banking_deposit_failed", {'reason' => $args->{reason}});<br />
src/Network/Receive.pm:11832: Plugins::callHook("banking_withdraw_success");<br />
src/Network/Receive.pm:11839: Plugins::callHook("banking_withdraw_failed", {'reason' => $args->{reason}});<br />
src/Network/Receive.pm:11858: Plugins::callHook('navigate_to', $args);<br />
src/Network/Receive.pm:12096: Plugins::callHook ('captcha_image', $hookArgs);<br />
src/Network/Send/ServerType1.pm:37: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType1.pm:38: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType1.pm:56: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType1.pm:74: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType1.pm:151: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType10.pm:39: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType10.pm:40: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType10.pm:59: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType2.pm:44: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType2.pm:45: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType3.pm:59: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType3.pm:60: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType4.pm:45: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType4.pm:46: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType5.pm:57: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType5.pm:58: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType6.pm:36: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType6.pm:37: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType7.pm:35: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType7.pm:55: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType7.pm:73: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType7.pm:96: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8.pm:65: Plugins::callHook('packet_pre/sendAttack', \%args) if ($flag == 0 || $flag == 7);<br />
src/Network/Send/ServerType8.pm:66: Plugins::callHook('packet_pre/sendSit', \%args) if ($flag == 2 || $flag == 3);<br />
src/Network/Send/ServerType8.pm:85: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8.pm:103: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8.pm:120: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8.pm:140: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_1.pm:54: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8_1.pm:141: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8_1.pm:160: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8_1.pm:182: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_3.pm:48: Plugins::callHook('packet_pre/sendSit', \%args);<br />
src/Network/Send/ServerType8_3.pm:66: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send/ServerType8_3.pm:94: Plugins::callHook('packet_pre/sendStand', \%args);<br />
src/Network/Send/ServerType8_5.pm:46: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/Send/ServerType8_5.pm:180: Plugins::callHook('packet_pre/sendAttack', \%args);<br />
src/Network/Send.pm:245: Plugins::callHook($hookName, \%args);<br />
src/Network/Send.pm:487: Plugins::callHook('packet/sendMapLoaded');<br />
src/Network/Send.pm:536: Plugins::callHook('packet_pre/sendAttack', \%args) if $flag == ACTION_ATTACK || $flag == ACTION_ATTACK_REPEAT;<br />
src/Network/Send.pm:537: Plugins::callHook('packet_pre/sendSit', \%args) if $flag == ACTION_SIT || $flag == ACTION_STAND;<br />
src/Network/Send.pm:826: Plugins::callHook('packet_pre/sendSkillUse', \%args);<br />
src/Network/XKore.pm:120: Plugins::callHook("Network::serverSend/pre", { msg => \$msg });<br />
src/Network/XKore.pm:140: Plugins::callHook('Network::stateChanged');<br />
src/Network/XKore.pm:243: Plugins::callHook('disconnected');<br />
src/Network/XKore.pm:264: Plugins::callHook('XKore_start');<br />
src/Plugins.pm:534:sub callHook {<br />
src/Poseidon/Client.pm:82: Plugins::callHook('Poseidon/client_authenticate', {<br />
src/Poseidon/QueryServer.pm:78: Plugins::callHook('Poseidon/server_authenticate', {<br />
src/Settings.pm:344: Plugins::callHook( usage => $data );<br />
src/Settings.pm:498: Plugins::callHook('pre_load_'.$internalFilename, $pre_load);<br />
src/Settings.pm:546: Plugins::callHook('load_'.$internalFilename, $load);<br />
src/Settings.pm:551: Plugins::callHook('pos_load_'.$internalFilename, $pos_load);<br />
src/Settings.pm:553: Plugins::callHook('load_'.$internalFilename, $load);<br />
src/Settings.pm:557: Plugins::callHook('pos_load_'.$internalFilename, $pos_load);<br />
src/Settings.pm:599: Plugins::callHook('preloadfiles', {files => $files});<br />
src/Settings.pm:603: Plugins::callHook('loadfiles', {files => $files, current => $i});<br />
src/Settings.pm:608: Plugins::callHook('postloadfiles', {files => $files});<br />
src/Task/MapRoute.pm:193: Plugins::callHook( npc_teleport_missing => \%plugin_args );<br />
src/Task/MapRoute.pm:406: Plugins::callHook('Task::MapRoute::iterate::missing_portal', \%plugin_args);<br />
src/Task/MapRoute.pm:483: Plugins::callHook('Task::MapRoute::iterate::route_portal_near', \%plugin_args);<br />
src/Task/Route.pm:313: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:414: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:426: Plugins::callHook('route', {status => 'success'});<br />
src/Task/Route.pm:469: Plugins::callHook('route', {status => 'stuck'});<br />
src/Task/Route.pm:599: Plugins::callHook( getRoute => \%plugin_args );<br />
src/test/PluginsHookTest.pm:29: Plugins::callHook('hook2');<br />
src/test/PluginsHookTest.pm:31: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:39: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:41: Plugins::callHook('hook2');<br />
src/test/PluginsHookTest.pm:43: Plugins::callHook('hook3');<br />
src/test/PluginsHookTest.pm:51: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:53: Plugins::callHook('hook2');<br />
src/test/PluginsHookTest.pm:61: Plugins::callHook('hook2');<br />
src/test/PluginsHookTest.pm:63: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:71: Plugins::callHook('hook2');<br />
src/test/PluginsHookTest.pm:73: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:93: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:95: Plugins::callHook('hook2');<br />
src/test/PluginsHookTest.pm:102: Plugins::callHook('hook1');<br />
src/test/PluginsHookTest.pm:124: Plugins::callHook( 'add_during_call' );<br />
src/test/PluginsHookTest.pm:129: Plugins::callHook( 'add_during_call' );<br />
src/test/PluginsHookTest.pm:134: Plugins::callHook( 'add_during_call' );<br />
src/test/PluginsHookTest.pm:139: Plugins::callHook( 'add_during_call' );<br />
src/test/PluginsHookTest.pm:156: Plugins::callHook( 'del_during_call' );<br />
src/test/PluginsHookTest.pm:161: Plugins::callHook( 'del_during_call' );<br />
src/test/PluginsHookTest.pm:166: Plugins::callHook( 'del_during_call' );<br />
src/test/PluginsHookTest.pm:171: Plugins::callHook( 'del_during_call' );<br />
src/test/PluginsHookTest.pm:176: Plugins::callHook( 'del_during_call' );<br />
src/Utils/PathFinding.pm:103: Plugins::callHook("PathFindingReset", \%hookArgs);<br />
</pre><br />
<br />
[[Category:Development]]</div>4epThttps://openkore.com/index.php?title=wx_map_route&diff=7021wx map route2022-09-26T00:44:49Z<p>4epT: </p>
<hr />
<div>; wx_map_route [<value>]<br />
: Controls the route drawing on the Wx Map<br />
<br />
{|border="1" cellpadding="2" cellspacing="1" <br />
|- style=background-color:#F9F9F9;<br />
!Value<br />
!Description<br />
|-<br />
! 0<br />
| Draws a less detailed route in the Wx Map. This takes less time and resources.<br />
|-<br />
! 1<br />
| Draws a detailed route in the Wx Map. This takes longer and more resources<br />
|-<br />
! 2<br />
| TODO. Appeared in [https://github.com/OpenKore/openkore/pull/3651 PR#3651]<br />
|}<br />
<br />
[[Category:config.txt]]</div>4epThttps://openkore.com/index.php?title=mercenary_runFromTarget_inAdvance&diff=7018mercenary runFromTarget inAdvance2022-09-18T23:42:45Z<p>4epT: Redirected page to runFromTarget inAdvance</p>
<hr />
<div>#REDIRECT [[runFromTarget_inAdvance]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]<br />
[[Category:mercenary]]</div>4epThttps://openkore.com/index.php?title=homunculus_runFromTarget_inAdvance&diff=7017homunculus runFromTarget inAdvance2022-09-18T23:42:13Z<p>4epT: Redirected page to runFromTarget inAdvance</p>
<hr />
<div>#REDIRECT [[runFromTarget_inAdvance]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]<br />
[[Category:homunculus]]</div>4epThttps://openkore.com/index.php?title=runFromTarget_inAdvance&diff=7016runFromTarget inAdvance2022-09-18T23:40:53Z<p>4epT: </p>
<hr />
<div>; runFromTarget_inAdvance [<[[boolean]]>]<br />
; homunculus_runFromTarget_inAdvance [<[[boolean]]>]<br />
; mercenary_runFromTarget_inAdvance [<[[boolean]]>]<br />
<br />
: When [[runFromTarget]] is enabled this option will make the openkore start avoiding/kiting the mob as soon as you attack, using the same idea as the dancing logic, which sends attack and move commands at the same time.<br />
: Appeared in [https://github.com/OpenKore/openkore/pull/3376 PR#3376]<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]</div>4epThttps://openkore.com/index.php?title=timeouts.txt&diff=7015timeouts.txt2022-09-18T22:35:32Z<p>4epT: </p>
<hr />
<div>Kore uses timeouts to keep AI routines synchronized or allow some AI functions to be executed within certain times. Delays are also used to keep the bot in sync with the server and to prevent Kore from spamming the server with unnecessary packets which would usually cause a disconnection. The file '''''timeouts.txt''''' allows you to modify some of the timeouts Kore uses.<br />
<br />
Don't mistake this to a speed hack. Although configuring this file properly will make your bot think and execute functions more efficiently, it will not make your character move any faster than it can normally move.<br />
<br />
<!----- Hide the Table of Contest because it's too big?!?! -----><br />
__TOC__<br />
<br />
<br />
==Syntax==<br />
The format of this file is simply a set of lines that observes the following syntax:<br />
<br />
<timeout key> <seconds><br />
<br />
<br />
===Details===<br />
;<timeout key><br />
:This is one of the timeout variable names used by Kore. See the timeout list below for a list of available timeout keys. <br />
<br />
;<seconds><br />
:This is the time in seconds (any positive number). This could be a fractional value. <br />
<br />
<br />
You shouldn't need to modify most of the timeouts. The default timeouts are already fine. But if you want to custom up the bot, go ahead. <br />
<br />
<br />
'''''Note.''''' Lines that begin with the pound sign (#) are comment lines. They are ignored by Openkore.<br />
<br />
Console command '''timeout <timeout key>''' can be used to display the current value, and '''timeout <timeout key> <seconds>''' to set a new value.<br />
<br />
==Timeout List==<br />
===AI===<br />
;ai (<seconds>)<br />
:Activate AI only when the specified number of seconds elapsed after the map is loaded. <br />
<br />
<br />
----<br />
<br />
<br />
<br />
===AI_Attack===<br />
<br />
;ai_attack (<seconds>)<br />
:When attacking a target with a weapon, send the 'attack' packet every specified number of seconds. <br />
<br />
<br />
<br />
;ai_homunculus_attack (<seconds>)<br />
:When your homunculus is attacking a target, send the 'attack' packet every specified number of seconds. <br />
<br />
<br />
<br />
;ai_mercenary_attack (<seconds>)<br />
:When your mercenary is attacking a target, send the 'attack' packet every specified number of seconds. <br />
<br />
<br />
<br />
;ai_attack_auto (<seconds>)<br />
:If auto-attack is enabled (see [[AttackAuto|'''''attackAuto''''']] in [[:Category:config.txt|config.txt]]), check for monsters to attack every specified number of seconds. <br />
<br />
<br />
<br />
;ai_homunculus_attack_auto (<seconds>)<br />
:If homunculus auto-attack is enabled (see [[AttackAuto|'''''attackAuto''''']] in [[:Category:config.txt|config.txt]]), check for monsters for him to attack every specified number of seconds. <br />
<br />
<br />
<br />
;ai_mercenary_attack_auto (<seconds>)<br />
:If mercenary auto-attack is enabled (see [[AttackAuto|'''''attackAuto''''']] in [[:Category:config.txt|config.txt]]), check for monsters for him to attack every specified number of seconds. <br />
<br />
<br />
<br />
;ai_attack_giveup (<seconds>)<br />
:When trying to attack a monster, give up and drop the target if you can't reach or damage the monster within the specified number of seconds. <br />
<br />
<br />
<br />
;ai_check_monster_auto(<seconds>)<br />
;ai_homunculus_check_monster_auto (<seconds>)<br />
;ai_mercenary_check_monster_auto (<seconds>)<br />
: See [https://github.com/OpenKore/openkore/pull/3145 PR#3145]<br />
<br />
<br />
<br />
;ai_attack_unfail (<seconds>)<br />
:When Kore dropped an attack target because you can't reach or damage it, Kore will not try to attack it again until the specified number of seconds elapsed. <br />
<br />
<br />
<br />
;ai_attack_unstuck (<seconds>)<br />
:When attacking a monster and you haven't dealed any damage to the monster within the specified number of seconds even if you are close enough to the target, the recorded character position might be out of sync so try to unstuck by moving again to the current position.<br />
<br />
<br />
----<br />
<br />
===AI_Avoid===<br />
;ai_avoidcheck (<seconds>)<br />
:If Kore is set to avoid players (see [[AvoidGM_near|'''''avoidGM_near''''']] and [[AvoidList|'''''AvoidList''''']] in [[:Category:config.txt|config.txt]]), check for players to avoid every specified number of seconds. <br />
<br />
<br />
----<br />
<br />
===AI_buyAuto===<br />
;ai_buyAuto (<seconds>)<br />
:If Kore is set to automatically buy items from a buy/sell NPC (see [[BuyAuto|'''''BuyAuto''''']] in [[:Category:config.txt|config.txt]]), check for items you need to buy every specified number of seconds. <br />
<br />
<br />
<br />
;ai_buyAuto_giveup (<seconds>)<br />
:When trying to buy an item from a buy/sell NPC, give up if you weren't able to buy the item within the specified number of seconds.<br />
<br />
<br />
<br />
;ai_buyAuto_wait (<seconds>)<br />
:After talking to the buy/sell NPC during auto-buy, wait for the specified number of seconds before buying items.<br />
<br />
<br />
<br />
;ai_buyAuto_wait_buy (<seconds>) <br />
:During auto-buy, buy items from the same buy/sell NPC every specified number of seconds.<br />
<br />
<br />
----<br />
<br />
===AI_cartAuto===<br />
;ai_cartAuto (<seconds>) <br />
:If Kore is set to automatically add/get items to/from cart (see [[items_control.txt]]), transfer an item to/from cart every specified number of seconds.<br />
<br />
<br />
;ai_cartAutoCheck (<seconds>)<br />
:If Kore is set to automatically add/get items to/from cart (see [[items_control.txt]]), check for items to add/get to/from cart every specified number of seconds. [<<]<br />
<br />
<br />
----<br />
<br />
<br />
===Connection===<br />
;charlogin (<seconds>)<br />
:Server connection timeout when Kore logs in to the character server.<br />
<br />
<br />
;master (<seconds>)<br />
:Server connection timeout when Kore logs in to the master server.<br />
<br />
<br />
;gamelogin (<seconds>)<br />
:Server connection timeout when Kore logs in to the game server.<br />
<br />
<br />
;maplogin (<seconds>)<br />
:Server connection timeout when Kore logs in to the map server.<br />
<br />
<br />
;play (<seconds>)<br />
:If you are already in the game but Kore does not receive sync within the specified number of seconds, it will try to reconnect again.<br />
<br />
<br />
;reconnect (<seconds>)<br />
:When disconnected, wait for the specified number of seconds before reconnecting again. <br />
<br />
<br />
----<br />
<br />
<br />
===AI_Dead===<br />
;ai_dead_respawn (<seconds>)<br />
:If you died and Kore is set to respawn to the save point on death (see [[DcOnDeath|'''''DcOnDeath''''']] in [[:Category:config.txt|config.txt]]), wait for the specified number of seconds before respawning.<br />
<br />
<br />
----<br />
<br />
===AI_Deal===<br />
;ai_dealAuto (<seconds>)<br />
:If Kore is set to automatically accept deals (see [[DealAuto|'''''DealAuto''''']] in [[:Category:config.txt|config.txt]]), wait for the specified number of seconds before you :<br />
:#accept an incoming deal<br />
:#finalize your part of the deal<br />
:#accept the finalized deal and trade.<br />
<br />
;ai_dealAutoCancel (<seconds>)<br />
:If Kore is set to automatically refuse deals (see [[DealAuto|'''''DealAuto''''']] in [[:Category:config.txt|config.txt]]), wait for the specified number of seconds before you cancel the deal request.<br />
<br />
<br />
----<br />
<br />
===AI_equip===<br />
;ai_equip_giveup (<seconds>)<br />
:When trying to equip an item, give up if you can't equip the item within the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Follow===<br />
;ai_follow_lost_end (<seconds>)<br />
:If you are in "follow" mode and you lost your master, give up trying to find the master after the specified number of seconds.<br />
<br />
<br />
;ai_homunculus_standby (<seconds>)<br />
:If homunculus gets too far from master try to teleport to it every specified number of seconds. <br />
<br />
<br />
;ai_mercenary_standby (<seconds>)<br />
:If mercenary gets too far from master try to teleport to it every specified number of seconds. <br />
<br />
<br />
----<br />
<br />
<br />
===AI_GetInfo===<br />
;ai_getInfo (<seconds>)<br />
:If there are unknown players, NPCs, monsters and pets around, update by requesting information from the server every specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Guild===<br />
;ai_guildAutoDeny (<seconds>)<br />
:If Kore is set to deny incoming guild join requests (see [[GuildAutoDeny|'''''GuildAutoDeny''''']] in [[:Category:config.txt|config.txt]]), wait for the specified number of seconds before you cancel a guild join request.<br />
<br />
<br />
----<br />
<br />
===AI_Items===<br />
;ai_items_gather_giveup (<seconds>)<br />
:When trying to gather an item, give up if you weren't able to take it within the specified number of seconds.<br />
<br />
<br />
;ai_items_gather_start (<seconds>)<br />
:When checking for items to gather, only take an item if the specified number of seconds has elapsed since the item appeared on screen.<br />
<br />
<br />
;ai_items_take_end (<seconds>)<br />
:When your monster died and there are no more monster loots to take, stop checking for loots after the specified number of seconds.<br />
<br />
<br />
;ai_items_take_start (<seconds>)<br />
:When your monster died and Kore is set to take items dropped by monsters you killed (see [[ItemsTakeAuto|'''''ItemsTakeAuto''''']] in [[:Category:config.txt|config.txt]]), start checking for monster loots after the specified number of seconds. <br />
<br />
<br />
----<br />
<br />
===AI_Look===<br />
;ai_look (<seconds>)<br />
:When trying to look to a certain direction, send the 'look' packet every specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Move===<br />
;ai_move_giveup (<seconds>)<br />
:When trying to move, give up if you weren't able to change your location within the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Npc===<br />
;ai_npcTalk (<seconds>)<br />
:When talking to an NPC, wait at most the specified number of seconds for the NPC to respond; give up talking to the NPC if the NPC didn't respond within the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Portal===<br />
;ai_portal_wait (<seconds>)<br />
:When moving to a map and the next portal is near, send the 'move' packet every specified number of seconds. Default is '''''0.5'''''.<br />
<br />
<br />
;ai_portal_give_up (<seconds>)<br />
:How long we should wait before assuming a portal does not exist or doesn't work and remove it from portals<br />
<br />
<br />
;ai_portal_re_add_missed (<seconds>)<br />
:How long to wait before re-adding a portal that was removed during route<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Route===<br />
;ai_route_calcRoute (<seconds>)<br />
:When trying to move to another map, Kore will not spend more than the specified number of seconds to calculate the best route.<br />
<br />
<br />
;ai_route_npcTalk (<seconds>)<br />
:If talking to a Warp NPC is part of the map solution to reach your destination, and the conversation takes longer than the specified number of seconds, Kore will assume failure and try to restart the conversation or find an alternate route.<br />
<br />
'''''Note.''''' If this option is not set, Kore will use a default value of 10.<br />
<br />
<br />
;ai_attack_route_adjust (<seconds>)<br />
:When trying to attack a monster, after the specified number of seconds Kore will check if target moved and will try to adjust the route.<br />
<br />
<br />
;ai_attack_failedLOS (<seconds>)<br />
:Ignore monster for the specified number of seconds seconds if there is no route to it. <br />
<br />
<br />
----<br />
<br />
===AI_SellAuto===<br />
;ai_sellAuto (<seconds>)<br />
:During auto-sell, wait for the specified number of seconds before selling again.<br />
<br />
<br />
;ai_sellAuto_giveup (<seconds>)<br />
:When trying to sell an item to a buy/sell NPC, give up if you can't sell the item after the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Shop===<br />
;ai_shop (<seconds>)<br />
:If Kore is set to automatically open a vending shop (see '''''[[ShopAuto_open]]''''' in [[:Category:config.txt|config.txt]]), open the shop after being idle for the specified number of seconds.<br />
<br />
;ai_shop_useskill_delay (<seconds>)<br />
:If Kore is set to set to open a shop using the skill Vending (see [[Shop_useSkill|'''''Shop_useSkill''''']] in [[:Category:config.txt|config.txt]]), will be opened after the specified delay.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Buyer_Shop===<br />
;ai_buyer_shopCheck (<seconds>)<br />
:If Kore is set to automatically open a buyer shop (see '''''[[BuyerShopAuto_open]]''''' in [[:Category:config.txt|config.txt]]), open the shop after being idle for the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Sit/AI_Stand===<br />
;ai_sit (<seconds>)<br />
:When trying to sit/stand, send the 'sit'/'stand' packet every specified number of seconds until you are already sitting/standing.<br />
<br />
<br />
;ai_sit_idle (<seconds>)<br />
:If Kore is set to automatically sit when idle (see [[sitAuto_idle|'''''sitAuto_idle''''']] in [[:Category:config.txt|config.txt]]), sit after being idle for the specified number of seconds.<br />
<br />
<br />
;ai_sit_wait (<seconds>)<br />
:When trying to sit, wait for the specified number of seconds delay before actually sending the 'sit' packet.<br />
<br />
<br />
;ai_stand_wait (<seconds>)<br />
:When trying to stand, wait for the specified number of seconds delay before actually sending the 'stand' packet.<br />
<br />
<br />
-----<br />
<br />
===AI_Skill===<br />
;ai_skill_use_giveup (<seconds>)<br />
:When trying to use a skill, give up if you can't to use the skill within the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===AI_StorageAuto===<br />
;ai_storageAuto (<seconds>)<br />
:During auto-storage, store/get an item from/to storage every specified number of seconds.<br />
<br />
<br />
;ai_storageAuto_giveup (<seconds>)<br />
:When storing an item to the storage, give up putting the item to storage if the item is still not transfered within the specified number of seconds. <br />
<br />
<br />
----<br />
<br />
<br />
===AI_Sync===<br />
;ai_sync (<seconds>)<br />
:Send the ping packet every specified number of seconds.<br />
<br />
'''''Note.''''' You would rather have to leave it at '''12''' (default value).<br />
<br />
<br />
----<br />
<br />
<br />
===AI_Take===<br />
;ai_take (<seconds>)<br />
:When picking up items, send the 'take' packet every specified number of seconds until the item has been taken.<br />
<br />
<br />
;ai_take_giveup (<seconds>)<br />
:When trying to pick up an item, give up if you weren't able to take the item after the specified number of seconds. <br />
<br />
<br />
----<br />
<br />
<br />
===AI_Teleport===<br />
;ai_teleport (<seconds>)<br />
:When using items to teleport (Fly Wing or Butterfly Wing), only use another item if the specified number of seconds has elapsed since the last teleport item was used.<br />
<br />
This timeout is also used when Kore is set to respawn to savepoint when it is not on one of the allowed maps (see [[allowedMaps|'''''allowedMaps''''']] and [[allowedMaps_reaction|'''''allowedMaps_reaction''''']] in [[:Category:config.txt|config.txt]]), only try to respawn if the specified number of seconds has elapsed since you last tried to respawn.<br />
<br />
<br />
;ai_teleport_away (<seconds>)<br />
:If Kore is set to teleport when a certain monster is seen (see [[mon_control.txt]]), only try to teleport away if the specified number of seconds has elapsed since you last teleported to avoid a monster.<br />
<br />
<br />
;ai_teleport_delay (<seconds>)<br />
:If this option is set, when attempting to use the Teleport skill, Kore will wait for the specified number of seconds for the skill to be successfuly cast before actually teleporting. This makes Kore look less bot-like.<br />
<br />
'''''Note.''''' This is ignored on emergency teleport (e.g. [[teleportAuto_deadly]]).<br />
<br />
<br />
;ai_teleport_hp (<seconds>)<br />
:If Kore is set to teleport due to insufficient HP/SP or too many aggressives (see [[teleportAuto_hp|'''''teleportAuto_hp''''']], [[teleportAuto_sp|'''''teleportAuto_sp''''']], [[teleportAuto_minAggressives|'''''teleportAuto_minAggressives''''']], and [[teleportAuto_minAggressivesInLock|'''''teleportAuto_minAggressivesInLock''''']] in [[:Category:config.txt|config.txt]]), only try to teleport away if the specified number of seconds has elapsed since you last teleported.<br />
<br />
<br />
;ai_teleport_idle (<seconds>)<br />
:If Kore is set to teleport when idle (see [[teleportAuto_idle|'''''teleportAuto_idle''''']] in [[:Category:config.txt|config.txt]]), teleport after being idle for the specified number of seconds.<br />
<br />
<br />
;ai_teleport_portal (<seconds>)<br />
:If Kore is set to teleport to avoid portals (see [[teleportAuto_portal|'''''teleportAuto_portal''''']] in [[:Category:config.txt|config.txt]]), only try to teleport away if the specified number of seconds has elapsed since you last teleported to avoid a portal.<br />
<br />
<br />
;ai_teleport_retry (<seconds>)<br />
:When trying to use the Teleport skill, Kore will wait for the specified number of seconds before retrying to cast the skill again if it has not been successfully casted.<br />
<br />
'''''Note.''''' This is ignored on emergency teleport (e.g. [[teleportAuto_deadly]]).<br />
<br />
<br />
;ai_teleport_safe_force (<seconds>)<br />
:If Kore is set to teleport only if there are players around (see [[teleportAuto_onlyWhenSafe|'''''teleportAuto_onlyWhenSafe''''']] in [[:Category:config.txt|config.txt]]), Kore will only consider it safe to teleport (even when there are players around to see) if the specified number of seconds has elapsed since your last map change or since you last teleported.<br />
<br />
<br />
----<br />
<br />
===AI_Thanks===<br />
;ai_thanks_set (<seconds>)<br />
:When a player sent Kore the chat command thanks, Kore will only reply if the previous chat command that succeeded was issued within the specified number of seconds.<br />
<br />
<br />
----<br />
<br />
<br />
===WelcomeText===<br />
;welcomeText (<seconds>)<br />
:When using [[XKore]] mode and the welcome message is not yet shown, display the welcome text if the specified number of seconds has elapsed after the map is loaded.<br />
<br />
<br />
----<br />
<br />
===AI_Wipe===<br />
;ai_wipe_check (<seconds>)<br />
:Internally, Kore saves in a cache the information about players, NPCs, monsters, items and portals that disappeared. Kore will try to check if it needs to clean up this cache every specified number of seconds.<br />
<br />
;ai_wipe_old (<seconds>)<br />
:When Kore checks for its cache of disappeared players, NPCs, monsters, items and portals (see ai_wipe_check), units that have been gone for the specified number of seconds will be permanently removed.<br />
<br />
----<br />
<br />
===AI_Pet ===<br />
;ai_petFeed (<seconds>)<br />
:Every x seconds, check pet hungry for feeding.<br />
<br />
----<br />
<br />
===AI_party===<br />
<br />
;ai_partyShareCheck (<seconds>)<br />
:check party settings every x seconds<br />
<br />
----<br />
<br />
===AI_IGNORE===<br />
<br />
;ai_ignoreAll (<seconds>)<br />
:Delay in x seconds between map_loaded and send ignoreAll command<br />
<br />
----<br />
<br />
===AI_CLIENTSUSPEND===<br />
<br />
;ai_clientSuspend (<seconds>)<br />
:Time to wait before load map in xKore mode. See [https://github.com/OpenKore/openkore/pull/3041 #3041]. Using xKore 1 or 3 and depending on the type of device the OpenKore is running on, map load may take longer or less time.<br />
<br />
<br />
== TODO ==<br />
[[Category:Feature Request]]<br />
<br />
* Timeout ranges for timeouts randomization.<br />
<br />
[[Category:control]]</div>4epThttps://openkore.com/index.php?title=whenIdle&diff=7014whenIdle2022-09-18T21:47:59Z<p>4epT: </p>
<hr />
<div>; whenIdle [<[[boolean]]>]<br />
; homunculus_whenIdle [<[[boolean]]>]<br />
; mercenary_whenIdle [<[[boolean]]>]<br />
: Set this option to '''1''' if you want to use the block only when Kore is [[:Category:Idle Condition|doing nothing]].<br />
<br />
; whenNotIdle [<[[boolean]]>]<br />
; homunculus_whenNotIdle [<[[boolean]]>]<br />
; mercenary_whenNotIdle [<[[boolean]]>]<br />
: Set this option to '''1''' if you want to use the block only when Kore is not [[:Category:Idle Condition|doing nothing]].<br />
<br />
== Examples ==<br />
<br />
useSelf_item Firecracker {<br />
whenIdle 1<br />
timeout 1<br />
}<br />
<br />
: Use Firecracker every one second when Kore is idle.<br />
<br />
[[Category:Self Condition]]<br />
[[Category:Idle Condition]]</div>4epThttps://openkore.com/index.php?title=onAction&diff=7013onAction2022-09-18T21:46:59Z<p>4epT: </p>
<hr />
<div>; onAction [<AI sequences>]<br />
; homunculus_onAction [<AI sequences>]<br />
; mercenary_onAction [<AI sequences>]<br />
: If this option is set, the block will only be used if at least one of the specified comma-separated list of [[ai|AI]] sequences is curently active. <br />
<br />
; notOnAction [<AI sequences>]<br />
; homunculus_notOnAction [<AI sequences>]<br />
; mercenary_notOnAction [<AI sequences>]<br />
: If this option is set, the block will only be used if none of the specified comma-separated list of AI sequences is curently active.<br />
<br />
== Notes ==<br />
<br />
There are around 29 known AI sequences, but the following are the only ones you can use in this option:<br />
{| class="wikitable" border="1"<br />
!AI Sequence<br />
!Block Options Supported<br />
|-<br />
|align=center|attack<br />
|align=center|attackComboSlot, attackSkillSlot, useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|follow<br />
|align=center|buyAuto, useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|items_gather<br />
|align=center|useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|items_take<br />
|align=center|useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|mapRoute<br />
|align=center|useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|move<br />
|align=center|partySkill, monsterSkill<br />
|-<br />
|align=center|route<br />
|align=center|buyAuto, useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|sitAuto<br />
|align=center|useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|align=center|skill_use<br />
|align=center|useSelf_item, useSelf_skill, equipAuto<br />
|-<br />
|align=center|take<br />
|align=center|useSelf_item, useSelf_skill, partySkill, monsterSkill, equipAuto<br />
|-<br />
|}<br />
<br />
== Examples ==<br />
<br />
useSelf_skill Heal {<br />
hp < 20%<br />
notOnAction sitAuto<br />
}<br />
<br />
: Use Heal when hp is bellow 20% and AI is not sitAuto.<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=whenStatusActive&diff=7012whenStatusActive2022-09-18T21:45:23Z<p>4epT: </p>
<hr />
<div>''[[:Category:Self Condition|Self Conditions]]:''<br />
<br />
; whenStatusActive <[[References#Status_Names|status name]]s><br />
; mercenary_whenStatusActive <[[References#Status_Names|status name]]s><br />
: If this option is set, the block will only be used if ''at least one of the specified'' comma-separated list of status names is currently active on your character or mercenary.<br />
<br />
; whenStatusInactive <[[References#Status_Names|status name]]s><br />
; mercenary_whenStatusInactive <[[References#Status_Names|status name]]s><br />
: If this option is set, the block will only be used if ''none of the specified'' comma-separated list of status names is currently active on your character or mercenary.<br />
<br />
''Target [[:Category:Monster Condition|Monster]] and [[:Category:Player Condition|Player]] Conditions:''<br />
<br />
; target_whenStatusActive <[[References#Status_Names|status name]]s><br />
: If this option is set, the block will only be used if ''at least one of the specified'' comma-separated list of status names is currently active on block's target.<br />
<br />
; target_whenStatusInactive <[[References#Status_Names|status name]]s><br />
: If this option is set, the block will only be used if ''none of the specified'' comma-separated list of status names is currently active on block's target.<br />
<br />
== Notes ==<br />
<br />
* Statuses can be found by typing [[s]] in the console (or looked up in character status window of [[Wx Interface]]) while the status is active on your character. You can also look for them in the [[:Category:tables|tables]] directory, in the files {AILMENT,LOOK,STATE,STATUS}_id_handle.txt (handles) and statusnametable.txt (names).<br />
<br />
* Currently, known statuses for monsters and players are lost when they leave your screen, so [[target_timeout]] may be more appropriate. Otherwise, for example, you will rebuff everyone who disappears from your sight as soon as they show back up.<br />
<br />
* On most servers, only statuses which are visible in RO client (like Silenced) are available to check on other actors than yourself, because the server doesn't send information about invisible statuses.<br />
<br />
== Examples ==<br />
Use Cart Termination on Hill Winds only if Cart Boost effect is activated:<br />
[[attackSkillSlot]] [[References#Skill_Names|skill name|WS_CARTTERMINATION]] {<br />
[[monsters]] [[References#Monster_Names|Hill Wind]]<br />
whenStatusActive EFST_CARTBOOST<br />
}<br />
<br />
Use Blessing level 10 on yourself when sp is greater than 70 and Blessing status if off:<br />
[[useSelf_skill]] [[References#Skill_Names|AL_BLESSING]] {<br />
[[lvl]] 10<br />
[[sp]] > 70<br />
whenStatusInactive EFST_BLESSING<br />
}<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=mercenary&diff=7011mercenary2022-09-18T21:43:07Z<p>4epT: </p>
<hr />
<div>; mercenary [<[[boolean]]>]<br />
: If this option is set, the block will only be used if mercenary is present (1) or not (0).<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=homunculus_dead&diff=7010homunculus dead2022-09-18T21:41:52Z<p>4epT: </p>
<hr />
<div>; homunculus_dead <[[boolean]]><br />
: If this option is set, the block will only be used if [[homunculus]] is dead.<br />
<br />
* Note that client will not always know if homunculus is dead or just vaporized, for example, just after login.<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=homunculus_resting&diff=7009homunculus resting2022-09-18T21:40:29Z<p>4epT: Created page with "; homunculus_resting <boolean> : If this option is set, the block will only be used if homunculus is '''***TODO***''' Category:Self Condition"</p>
<hr />
<div>; homunculus_resting <[[boolean]]><br />
: If this option is set, the block will only be used if [[homunculus]] is '''***TODO***'''<br />
<br />
<br />
[[Category:Self Condition]]</div>4epThttps://openkore.com/index.php?title=attackBeyondMaxDistance_waitForAgressive&diff=7008attackBeyondMaxDistance waitForAgressive2022-09-18T21:04:46Z<p>4epT: </p>
<hr />
<div>; attackBeyondMaxDistance_waitForAgressive [<[[boolean]]>]<br />
; homunculus_attackBeyondMaxDistance_waitForAgressive [<[[boolean]]>]<br />
; mercenary_attackBeyondMaxDistance_waitForAgressive [<[[boolean]]>]<br />
<br />
: This config setting determines how openkore behaves when a ranged character has already damaged to their target, but the target is currently out of range.<br />
: If this parameter is '''0''' (old behavior), then openkore will move towards the monster.<br />
: If this parameter is set to '''1''' (new behavior), then openkore will wait in place until the wounded monster comes closer.<br />
<br />
: Appeared in [https://github.com/OpenKore/openkore/pull/3628 PR#3628]<br />
<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]</div>4epThttps://openkore.com/index.php?title=homunculus_attackBeyondMaxDistance_waitForAgressive&diff=7007homunculus attackBeyondMaxDistance waitForAgressive2022-09-18T21:04:22Z<p>4epT: Redirected page to attackBeyondMaxDistance waitForAgressive</p>
<hr />
<div>#REDIRECT [[attackBeyondMaxDistance_waitForAgressive]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]<br />
[[Category:homunculus]]</div>4epThttps://openkore.com/index.php?title=mercenary_attackBeyondMaxDistance_waitForAgressive&diff=7006mercenary attackBeyondMaxDistance waitForAgressive2022-09-18T21:03:58Z<p>4epT: Redirected page to attackBeyondMaxDistance waitForAgressive</p>
<hr />
<div>#REDIRECT [[attackBeyondMaxDistance_waitForAgressive]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]<br />
[[Category:mercenary]]</div>4epThttps://openkore.com/index.php?title=homunculus_attackAuto_considerDamagedAggressive&diff=7005homunculus attackAuto considerDamagedAggressive2022-09-18T21:03:08Z<p>4epT: Redirected page to attackAuto considerDamagedAggressive</p>
<hr />
<div>#REDIRECT [[attackAuto_considerDamagedAggressive]]<br />
<br />
[[Category:config.txt]]<br />
[[Category:attack]]<br />
[[Category:homunculus]]</div>4epT