package Ġworld . greg s . void ps . bot . navigation Ċ Ċ import Ġworld . greg s . void ps . engine . entity . character . move . running Ċ import Ġworld . greg s . void ps . engine . entity . character . player . Bot Ċ import Ġworld . greg s . void ps . engine . entity . get OrNull Ċ import Ġworld . greg s . void ps . engine . entity . obj . Objects Ċ import Ġworld . greg s . void ps . engine . entity . set Ċ import Ġworld . greg s . void ps . engine . map . Tile Ċ import Ġworld . greg s . void ps . engine . map . area . Map Area Ċ import Ġworld . greg s . void ps . engine . map . nav . Navigation Graph Ċ import Ġworld . greg s . void ps . engine . path . Path Result Ċ import Ġworld . greg s . void ps . engine . path . algorithm . Di jk stra Ċ import Ġworld . greg s . void ps . engine . path . strat . Node Target Strategy Ċ import Ġworld . greg s . void ps . engine . path . traverse . Edge Traversal Ċ import Ġworld . greg s . void ps . engine . utility . get Ċ import Ġworld . greg s . void ps . network . in struct . Interact Interface Ċ import Ġworld . greg s . void ps . network . in struct . Interact NPC Ċ import Ġworld . greg s . void ps . network . in struct . Interact Object Ċ import Ġworld . greg s . void ps . world . interact . entity . player . energy . energy Percent Ċ Ċ suspend Ġfun ĠBot . goTo Nearest ( tag : ĠString ) Ġ= Ġgo To Nearest Ġ{ Ġit . tags . contains ( tag ) Ġ} Ċ Ċ suspend Ġfun ĠBot . goTo Nearest ( block : Ġ( Map Area ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcurrent : ĠMap Area ? Ġ= Ġthis . get OrNull (" area ") ĊĠĠĠ Ġif Ġ( current Ġ!= Ġnull Ġ&& Ġblock . invoke ( current )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġgraph : ĠNavigation Graph Ġ= Ġget () ĊĠĠĠ Ġvar Ġlast : ĠMap Area ? Ġ= Ġnull ĊĠĠĠ Ġval Ġresult Ġ= Ġgo To ( object Ġ: ĠNode Target Strategy () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreached ( node : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġ! is ĠTile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( area Ġin Ġgraph . areas ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block ( area )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ= Ġarea ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġassert ( result Ġis ĠPath Result . Success ) Ġ{ Ġ" Unable Ġto Ġfind Ġpath ." Ġ} ĊĠĠĠ Ġassert ( last Ġ!= Ġnull ) Ġ{ Ġ" Unable Ġto Ġfind Ġpath Ġtarget ." Ġ} ĊĠĠĠ Ġif Ġ( result Ġ! is ĠPath Result . Failure Ġ&& Ġlast Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis [" area "] Ġ= Ġlast !! ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ suspend Ġfun ĠBot . goTo Area ( map : ĠMap Area ) Ġ{ ĊĠĠĠ Ġif Ġ( map . area . contains ( player . tile )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresult Ġ= Ġgo To ( object Ġ: ĠNode Target Strategy () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreached ( node : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode Ġis ĠTile Ġ&& Ġnode Ġin Ġmap . area ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠĠĠ Ġif Ġ( result Ġ! is ĠPath Result . Failure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis [" area "] Ġ= Ġmap ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Failed Ġto Ġfind Ġpath Ġto Ġ${ map . name } Ġfrom Ġ${ player . tile }") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠBot . goTo ( strategy : ĠNode Target Strategy ): ĠPath Result Ġ{ ĊĠĠĠ Ġplayer . movement . way points . clear () ĊĠĠĠ Ġif Ġ( strategy . re ached ( player . tile )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPath Result . Success ( player . tile ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresult Ġ= Ġget < Di jk stra >(). find ( player , Ġstrategy , ĠEdge Traversal ()) ĊĠĠĠ Ġthis [" navig ating "] Ġ= Ġresult Ġis ĠPath Result . Failure ĊĠĠĠ Ġif Ġ( result Ġ! is ĠPath Result . Failure ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigate () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġsuspend Ġfun ĠBot . rest () Ġ{ ĊĠĠĠ Ġval Ġmusic ian Ġ= Ġplayer . viewport . np cs . current . first OrNull Ġ{ Ġit . def . options . contains (" Listen - to ") Ġ} ĊĠĠĠ Ġif Ġ( music ian Ġ!= Ġnull Ġ&& Ġplayer . tile . distance To ( music ian ) Ġ< Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . instructions . emit ( Interact NPC ( npc Index Ġ= Ġ 4 9 , Ġoption Ġ= Ġmusic ian . def . options . indexOf First Ġ{ Ġit Ġ== Ġ" Listen - to " Ġ} Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġrepeat ( 3 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait (" tick ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġplayer . instructions . emit ( Interact Interface ( interface Id Ġ= Ġ 7 5 0 , Ġcomponent Id Ġ= Ġ 1 , ĠitemId Ġ= Ġ- 1 , Ġitem Slot Ġ= Ġ- 1 , Ġoption Ġ= Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait (" tick ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠBot . run () Ġ{ ĊĠĠĠ Ġplayer . instructions . emit ( Interact Interface ( interface Id Ġ= Ġ 7 5 0 , Ġcomponent Id Ġ= Ġ 1 , ĠitemId Ġ= Ġ- 1 , Ġitem Slot Ġ= Ġ- 1 , Ġoption Ġ= Ġ 0 )) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠBot . navigate () Ġ{ ĊĠĠĠ Ġval Ġway points Ġ= Ġplayer . movement . way points . to Mutable List (). iterator () ĊĠĠĠ Ġwhile Ġ( way points . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġway point Ġ= Ġway points . next () ĊĠĠĠĠĠĠĠ Ġfor Ġ( step Ġin Ġway point . steps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( player . energy Percent () Ġ<= Ġ 2 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrest () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! player . running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . step Ġ= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . instructions . emit ( step ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġproper Ġsolution Ġfor Ġvalidation Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( step Ġis ĠInter act Object Ġ&& Ġget < Objects >() [ player . tile . copy ( step . x , Ġstep . y ), Ġstep . objectId ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait (" tick ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait (" move ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġway points . remove () ĊĠĠĠ Ġ} ĊĠĠĠ Ġplayer [" navig ating "] Ġ= Ġfalse Ċ }