726 lines
26 KiB
Text
726 lines
26 KiB
Text
~~ {
|
|
~~ FOR AUTO-COMPLETION ASSISTANCE: testvar getvar setvar touchvar clearallvars clearvar getcharintprop getchardoubleprop getcharquadprop getcharboolprop getcharstringprop getisspellknown getcancastspell_hunt getcancastspell_buff getcharvital_base getcharvital_current getcharvital_buffedmax getcharskill_traininglevel getcharskill_base getcharskill_buffed getplayerlandcell getplayercoordinates coordinategetns coordinategetwe coordinategetz coordinatetostring coordinateparse coordinatedistancewithz coordinatedistanceflat wobjectgetphysicscoordinates wobjectgetname wobjectgetobjectclass wobjectgettemplatetype wobjectgetisdooropen wobjectfindnearestmonster wobjectfindnearestdoor wobjectfindnearestbyobjectclass wobjectfindininventorybytemplatetype wobjectfindininventorybyname wobjectfindininventorybynamerx wobjectgetselection wobjectgetplayer wobjectfindnearestbynameandobjectclass actiontryselect actiontryuseitem actiontryapplyitem actiontrygiveitem actiontryequipanywand actiontrycastbyid actiontrycastbyidontarget chatbox chatboxpaste statushud statushudcolored uigetcontrol uisetlabel isfalse istrue iif randint cstr strlen getobjectinternaltype cstrf stopwatchcreate stopwatchstart stopwatchstop stopwatchelapsedseconds cnumber floor ceiling round abs getworldname getitemcountininventorybyname getheading getitemcountininventorybynamerx getheadingto actiontrygiveprofile vitae getfellowshipstatus getfellowshipname getfellowshipisopen getfellowshipisleader getfellowshipleaderid getfellowshipcanrecruit getfellowid getfellowshipcount getfellowshiplocked getfellowname getfellowshipisfull sin cos tan sqrt asin acos atan atan2 sinh cosh tanh vtsetmetastate getregexmatch echo chr ord wobjectgetid wobjectgethealth wobjectfindbyid wobjectgetintprop wobjectfindnearestbytemplatetype wobjectgetopencontainer testquestflag getquestktprogress isrefreshingquests getquestktrequired getqueststatus getisday getgamehour getgamehourname getisnight getgameday getgameticks getminutesuntilday getgamemonth getgameyear
|
|
~~ }
|
|
|
|
~~
|
|
~~ Merged Neftet meta (leader + follower)
|
|
~~ Variables set by external launcher:
|
|
~~ isLeader - 1 for leader, 0 for follower
|
|
~~ followTarget - leader character name (follower only)
|
|
~~ navRoute - main hunting route (leader only, e.g. neftet_route)
|
|
~~ navWaitFollow - return-to-start route (both roles, e.g. neftet_wait_follow / neftet_wait_follow2)
|
|
~~ ammoType - 0 = mage/none, 1 = xbow, 2 = bow
|
|
~~ (navCloseStopRangeDefault removed - hardcoded to 0.00825 for both roles)
|
|
~~
|
|
|
|
~~
|
|
~~ File auto-generated by metaf, a program created by Eskarina of Morningthaw/Coldeve.
|
|
~~ Get metaf here: https://github.com/JJEII/metaf/
|
|
~~
|
|
~~ All recognized structural designators:
|
|
~~ STATE: DO:
|
|
~~ IF: NAV:
|
|
~~
|
|
~~ All recognized CONDITION (IF:) operation keywords:
|
|
~~ Never NavEmpty MobsInDist_Priority Not
|
|
~~ Always Death NeedToBuff PSecsInStateGE
|
|
~~ All VendorOpen NoMobsInDist SecsOnSpellGE
|
|
~~ Any VendorClosed BlockE BuPercentGE
|
|
~~ ChatMatch ItemCountLE CellE DistToRteGE
|
|
~~ MainSlotsLE ItemCountGE IntoPortal Expr
|
|
~~ SecsInStateGE MobsInDist_Name ExitPortal ChatCapture
|
|
~~
|
|
~~ All recognized ACTION (DO:) operation keywords:
|
|
~~ None EmbedNav ChatExpr SetOpt
|
|
~~ SetState CallState SetWatchdog CreateView
|
|
~~ Chat Return ClearWatchdog DestroyView
|
|
~~ DoAll DoExpr GetOpt DestroyAllViews
|
|
~~
|
|
~~ All recognized NAV types:
|
|
~~ circular follow
|
|
~~ linear once
|
|
~~
|
|
~~ All recognized NAV NODE types:
|
|
~~ flw vnd
|
|
~~ pnt ptl
|
|
~~ rcl tlk
|
|
~~ pau chk
|
|
~~ cht jmp
|
|
~~ prt (deprecated in VTank)
|
|
~~ }
|
|
|
|
STATE: {death} ~~ {
|
|
IF: ExitPortal
|
|
DO: Chat {/vt opt set enablebuffing false}
|
|
IF: ExitPortal
|
|
DO: Chat {/vt opt set enablenav true}
|
|
IF: ExitPortal
|
|
DO: Chat {/vt opt set enablelooting false}
|
|
IF: ExitPortal
|
|
DO: Chat {/vt opt set enablecombat false}
|
|
IF: Always
|
|
DO: EmbedNav nav0__death_pause_nav {death_pause.nav}
|
|
IF: NavEmpty
|
|
DO: SetState {turn_in_quests}
|
|
IF: Always
|
|
DO: SetWatchdog 5 60 {stuck}
|
|
~~ }
|
|
STATE: {Default} ~~ {
|
|
~~ One-time login setup state. Runs once when the character logs in.
|
|
~~ Leader: enable settings, load nav route, create fellowship, init flower/prickly vars.
|
|
~~ Follower: enable settings, set navpriorityboost. Both transition to Hunt.
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
DO: DoAll
|
|
Chat {/ub opt set VTank.PatchExpressionEngine true}
|
|
Chat {/vt opt set enablecombat true}
|
|
Chat {/vt opt set enablelooting true}
|
|
Chat {/vt opt set enablebuffing true}
|
|
Chat {/vt opt set enablenav true}
|
|
Chat {/vt opt set navpriorityboost false}
|
|
ChatExpr {\/vt nav load +getvar[navRoute]}
|
|
Chat {/ub fellow create Sawato Rockstyle}
|
|
DoExpr {setvar[pickFlowers, 1]}
|
|
DoExpr {setvar[pokePricklys, 1]}
|
|
DoExpr {setvar[pickupRange, 10]}
|
|
SetState {Hunt}
|
|
IF: All
|
|
Expr {getvar[isLeader]==0}
|
|
DO: DoAll
|
|
Chat {/ub opt set VTank.PatchExpressionEngine true}
|
|
Chat {/vt opt set enablecombat true}
|
|
Chat {/vt opt set enablelooting true}
|
|
Chat {/vt opt set enablebuffing true}
|
|
Chat {/vt opt set enablenav true}
|
|
Chat {/vt opt set navpriorityboost true}
|
|
SetState {Hunt}
|
|
~~ }
|
|
STATE: {Hunt} ~~ {
|
|
~~ Main hunting/monitoring loop. Both roles enter here after setup or returning from side tasks.
|
|
~~ Leader: loads navRoute, hunts along route, flower/prickly pickup, DistToRteGE, toggle commands.
|
|
~~ Listens for #alexgillarkillar tells and auto-recruits sender to fellowship.
|
|
~~ Follower: issues /ub follow once when leader is in range, leader-leave detection via ChatCapture.
|
|
~~ If not in fellowship and leader nearby, sends #alexgillarkillar tell every 5s.
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
DO: DoAll
|
|
Chat {/vt opt set navpriorityboost false}
|
|
ChatExpr {\/vt nav load +getvar[navRoute]}
|
|
IF: All
|
|
Expr {getvar[isLeader]==0}
|
|
Expr {wobjectfindnearestbynameandobjectclass[24, getvar[followTarget]]!=0}
|
|
DO: ChatExpr {\/ub follow +getvar[followTarget]}
|
|
IF: All
|
|
Expr {getvar[isLeader]==0}
|
|
Expr {getfellowshipstatus[]==0}
|
|
Expr {wobjectfindnearestbynameandobjectclass[24, getvar[followTarget]]!=0}
|
|
SecsInStateGE 5
|
|
DO: DoAll
|
|
ChatExpr {\/t +getvar[followTarget]+`\, #alexgillarkillar`}
|
|
SetState {Hunt}
|
|
IF: All
|
|
Expr {getcharquadprop[6]>=1500000}
|
|
Expr {getcharintprop[333]>=5}
|
|
Expr {getcharintprop[334]>=5}
|
|
Expr {getcharintprop[335]>=5}
|
|
Expr {getcharintprop[336]>=5}
|
|
Expr {getcharintprop[338]>=5}
|
|
Expr {getcharintprop[339]>=5}
|
|
Expr {getcharintprop[340]>=5}
|
|
Expr {getcharintprop[342]>=5}
|
|
Expr {getcharintprop[343]>=5}
|
|
Expr {getcharintprop[365]>=10}
|
|
Any
|
|
Expr {getcharintprop[333]<10}
|
|
Expr {getcharintprop[335]<10}
|
|
DO: SetState {seer_cap}
|
|
IF: All
|
|
Expr {getcharquadprop[6]>=1500000}
|
|
Any
|
|
Expr {getcharintprop[333]<5}
|
|
Expr {getcharintprop[334]<5}
|
|
Expr {getcharintprop[335]<5}
|
|
Expr {getcharintprop[336]<5}
|
|
Expr {getcharintprop[338]<5}
|
|
Expr {getcharintprop[339]<5}
|
|
Expr {getcharintprop[340]<5}
|
|
Expr {getcharintprop[342]<5}
|
|
Expr {getcharintprop[343]<5}
|
|
Expr {getcharintprop[365]<10}
|
|
DO: SetState {lum_cap}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
Expr {coordinatedistancewithz[getplayercoordinates[], wobjectgetphysicscoordinates[wobjectfindnearestbyobjectclass[8]]]<=getvar[pickupRange]}
|
|
Expr {wobjectgetname[wobjectfindnearestbyobjectclass[8]]==Prickly Pear}
|
|
Expr {getvar[pokePricklys]==1}
|
|
DO: SetState {picking_flowers}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
Expr {coordinatedistancewithz[getplayercoordinates[], wobjectgetphysicscoordinates[wobjectfindnearestbyobjectclass[8]]]<=getvar[pickupRange]}
|
|
Expr {wobjectgetname[wobjectfindnearestbyobjectclass[8]]==Desert Flower}
|
|
Expr {getvar[pickFlowers]==1}
|
|
DO: SetState {picking_flowers}
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: SetWatchdog 10 600 {stuck}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
ChatMatch {^\[Fellowship\].*(say|says), \"#toggle_flowers\"$}
|
|
DO: CallState {toggle_flowers} {Hunt}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
ChatMatch {^\[Fellowship\].*(say|says), \"#toggle_pricklys\"$}
|
|
DO: CallState {toggle_pricklys} {Hunt}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
ChatCapture {(^(\[[A-z]+?\] |)You|.*\<Tell:IIDString:.+:(?<who>[^\<]*)\>.+\<\\Tell\>) .*, \"#alexgillarkillar\"$} {}
|
|
DO: ChatExpr {\/ub fellow recruit +getvar[capturegroup_who]}
|
|
IF: All
|
|
ItemCountLE 100 {Prismatic Taper}
|
|
NoMobsInDist 5
|
|
DO: DoAll
|
|
Chat {/fellowship Out of tapers! Recomping.}
|
|
SetState {recomp}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
DistToRteGE 1000
|
|
DO: SetState {turn_in_quests}
|
|
IF: All
|
|
Expr {getvar[isLeader]}
|
|
DistToRteGE 100
|
|
DO: SetState {stuck}
|
|
IF: All
|
|
ItemCountLE 10 {Mana Scarab}
|
|
NoMobsInDist 5
|
|
DO: DoAll
|
|
Chat {/fellowship Out of mana scarabs. Recomping.}
|
|
SetState {recomp_mana_scarab}
|
|
IF: All
|
|
Expr {getvar[ammoType]==1}
|
|
Any
|
|
ItemCountLE 10 {Wrapped Bundle of Deadly Prismatic Arrowheads}
|
|
ItemCountLE 10 {Wrapped Bundle of Quarrelshafts}
|
|
NoMobsInDist 5
|
|
DO: DoAll
|
|
Chat {/fellowship Low on xbow ammo. Recomping.}
|
|
SetState {recomp_missile}
|
|
IF: All
|
|
Expr {getvar[ammoType]==2}
|
|
Any
|
|
ItemCountLE 10 {Wrapped Bundle of Deadly Prismatic Arrowheads}
|
|
ItemCountLE 10 {Wrapped Bundle of Arrowshafts}
|
|
NoMobsInDist 5
|
|
DO: DoAll
|
|
Chat {/fellowship Low on bow ammo. Recomping.}
|
|
SetState {recomp_missile}
|
|
IF: All
|
|
MainSlotsLE 4
|
|
NoMobsInDist 5
|
|
DO: SetState {give_keys}
|
|
IF: All
|
|
ItemCountGE 1000 {A'nekshay Token}
|
|
NoMobsInDist 5
|
|
DO: DoAll
|
|
Chat {/fellowship Turning in A'nekshay Tokens.}
|
|
SetState {go_to_atokens}
|
|
IF: All
|
|
Expr {getvar[isLeader]==0}
|
|
ChatCapture {(?<who>\w[\w ]*\w) has left your Fellowship} {}
|
|
Expr {getvar[capturegroup_who]==getvar[followTarget]}
|
|
DO: DoAll
|
|
Chat {/ub fellow quit}
|
|
SetState {turn_in_quests}
|
|
~~ }
|
|
STATE: {picking_flowers} ~~ {
|
|
~~ Leader-only: flower/prickly pickup. Follower never reaches this state.
|
|
IF: Expr {coordinatedistancewithz[getplayercoordinates[], wobjectgetphysicscoordinates[wobjectfindnearestbyobjectclass[8]]]<=getvar[pickupRange]+3}
|
|
DO: DoAll
|
|
DoExpr {setvar[ObjectClose, 1]}
|
|
EmbedNav nav1__pickup_nav {pickup.nav}
|
|
IF: All
|
|
Expr {getvar[ObjectClose]==1}
|
|
Expr {coordinatedistancewithz[getplayercoordinates[], wobjectgetphysicscoordinates[wobjectfindnearestbyobjectclass[8]]]>getvar[pickupRange]+4}
|
|
DO: DoAll
|
|
DoExpr {setvar[ObjectClose, 0]}
|
|
SetState {Reset}
|
|
IF: All
|
|
Expr {getvar[ObjectClose]==1}
|
|
SecsInStateGE 3
|
|
DO: DoAll
|
|
DoExpr {setvar[ObjectClose, 0]}
|
|
SetState {Reset}
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: SetWatchdog 5 120 {stuck}
|
|
~~ }
|
|
STATE: {give_keys} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablebuffing false}
|
|
Chat {/vt nav load ah_give_keys}
|
|
IF: Always
|
|
DO: SetWatchdog 3 300 {Default}
|
|
IF: NavEmpty
|
|
DO: SetState {stuck}
|
|
~~ }
|
|
STATE: {go_to_atokens} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: All
|
|
Expr {testvar[goATokensNavLoaded]}
|
|
NavEmpty
|
|
DO: DoAll
|
|
DoExpr {clearvar[goATokensNavLoaded]}
|
|
SetState {hand_over_atokens}
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[goATokensNavLoaded, 1]}
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablebuffing false}
|
|
Chat {/vt nav load anekshey_tokens_to_proms}
|
|
Chat {/vt opt set enablenav true}
|
|
SetWatchdog 5 300 {stuck}
|
|
~~ }
|
|
STATE: {go_to_start} ~~ {
|
|
~~ Loads navWaitFollow to rendezvous point. Re-enables combat/looting/buffing, then goes to Hunt.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/vt opt set enablecombat true}
|
|
Chat {/vt opt set enablelooting true}
|
|
Chat {/vt opt set enablebuffing true}
|
|
ChatExpr {\/vt nav load +getvar[navWaitFollow]}
|
|
SetWatchdog 5 300 {stuck}
|
|
IF: All
|
|
SecsInStateGE 3
|
|
NavEmpty
|
|
DO: SetState {Hunt}
|
|
~~ }
|
|
STATE: {hand_over_atokens} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Expr {getvar[atokenRetries]>=40}
|
|
DO: DoAll
|
|
Chat {/f A'nekshay token hand-over failed after 40 retries. Bailing.}
|
|
DoExpr {clearvar[atokenRetries]}
|
|
SetState {turn_in_quests}
|
|
IF: ItemCountGE 20 {A'nekshay Token}
|
|
DO: DoAll
|
|
DoExpr {setvar[atokenRetries, getvar[atokenRetries]+1]}
|
|
Chat {/ub give 20 A'nekshay Token to Higashiyama Akako}
|
|
Chat {/ub prepclick yes 5}
|
|
SetState {wait_atokens}
|
|
IF: ItemCountLE 19 {A'nekshay Token}
|
|
DO: DoAll
|
|
DoExpr {clearvar[atokenRetries]}
|
|
SetState {turn_in_quests}
|
|
~~ }
|
|
STATE: {Reset} ~~ {
|
|
~~ Reset: go to turn_in_quests to restart the loop.
|
|
IF: Always
|
|
DO: SetState {turn_in_quests}
|
|
~~ }
|
|
STATE: {recomp} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablebuffing false}
|
|
Chat {/vt nav load ah_recomp}
|
|
Chat {/vt opt set enablenav true}
|
|
IF: Always
|
|
DO: SetWatchdog 3 300 {Default}
|
|
IF: NavEmpty
|
|
DO: SetState {stuck}
|
|
~~ }
|
|
STATE: {recomp_mana_scarab} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablebuffing false}
|
|
Chat {/vt opt set NavCloseStopRange 0.00425}
|
|
Chat {/vt nav load recomp_gilly}
|
|
IF: SecsInStateGE 300
|
|
DO: DoAll
|
|
Chat {/vt opt set NavCloseStopRange 0.00825}
|
|
SetState {turn_in_quests}
|
|
IF: NavEmpty
|
|
DO: DoAll
|
|
Chat {/vt opt set NavCloseStopRange 0.00825}
|
|
SetState {stuck}
|
|
~~ }
|
|
STATE: {recomp_missile} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablebuffing false}
|
|
Chat {/vt nav load recomp_laurana}
|
|
IF: Always
|
|
DO: SetWatchdog 3 300 {stuck}
|
|
IF: NavEmpty
|
|
DO: SetState {stuck}
|
|
~~ }
|
|
STATE: {stuck} ~~ {
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/f #turn_in_quests}
|
|
SetState {turn_in_quests}
|
|
~~ }
|
|
STATE: {toggle_flowers} ~~ {
|
|
~~ Leader-only: toggled via CallState from Hunt.
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[pickFlowers, getvar[pickFlowers]^1]}
|
|
ChatExpr {\/f Pick flowers\: +cstr[(getvar[pickFlowers])]}
|
|
Return
|
|
~~ }
|
|
STATE: {toggle_pricklys} ~~ {
|
|
~~ Leader-only: toggled via CallState from Hunt.
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[pokePricklys, getvar[pokePricklys]^1]}
|
|
ChatExpr {\/f Poke pricklys\: +cstr[(getvar[pokePricklys])]}
|
|
Return
|
|
~~ }
|
|
STATE: {turn_in_quests} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/vt nav load neftet_quests}
|
|
Chat {/vt opt set enablenav true}
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablebuffing false}
|
|
Chat {/vt opt set NavCloseStopRange 0.008}
|
|
IF: NavEmpty
|
|
DO: SetState {go_to_start}
|
|
IF: Always
|
|
DO: SetWatchdog 5 120 {turn_in_quests}
|
|
~~ }
|
|
STATE: {wait_atokens} ~~ {
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: ChatMatch {Higashiyama Akako gives you 10 Promissory Notes}
|
|
DO: SetState {hand_over_atokens}
|
|
IF: Always
|
|
DO: SetWatchdog 0 3 {hand_over_atokens}
|
|
~~ }
|
|
|
|
STATE: {lum_cap} ~~ {
|
|
~~ Luminance aura auto-purchase: disable combat, navigate to Nalicana area, then buy auras.
|
|
~~ Uses nav_nalicana to get to token pickup position. Returns to Default when done.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: All
|
|
Expr {testvar[lumCapNavLoaded]}
|
|
NavEmpty
|
|
DO: DoAll
|
|
DoExpr {clearvar[lumCapNavLoaded]}
|
|
SetState {lum_pick_aura}
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[lumCapNavLoaded, 1]}
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablelooting false}
|
|
Chat {/vt opt set enablebuffing true}
|
|
Chat {/vt opt set enablenav true}
|
|
Chat {/vt nav load nav_nalicana}
|
|
SetWatchdog 5 300 {stuck}
|
|
~~ }
|
|
STATE: {lum_pick_aura} ~~ {
|
|
~~ Compute cheapest aura to buy. "Cheapest first": find lowest rank among non-maxed auras.
|
|
~~ Standard auras (cap 5): cost = (rank+2)*50000. AllSkills (cap 10): cost = (rank+1)*100000.
|
|
~~ Aura IDs: 333=Valor, 334=Protection, 335=Glory, 336=Temperance, 338=AethericVision,
|
|
~~ 343=Craftsman, 339=ManaFlow, 340=ManaInfusion, 342=Purity, 365=AllSkills
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[lumMinRank, 999]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[333]<5&&getcharintprop[333]<getvar[lumMinRank],getcharintprop[333],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[334]<5&&getcharintprop[334]<getvar[lumMinRank],getcharintprop[334],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[335]<5&&getcharintprop[335]<getvar[lumMinRank],getcharintprop[335],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[336]<5&&getcharintprop[336]<getvar[lumMinRank],getcharintprop[336],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[338]<5&&getcharintprop[338]<getvar[lumMinRank],getcharintprop[338],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[343]<5&&getcharintprop[343]<getvar[lumMinRank],getcharintprop[343],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[339]<5&&getcharintprop[339]<getvar[lumMinRank],getcharintprop[339],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[340]<5&&getcharintprop[340]<getvar[lumMinRank],getcharintprop[340],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[342]<5&&getcharintprop[342]<getvar[lumMinRank],getcharintprop[342],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[365]<10&&getcharintprop[365]<getvar[lumMinRank],getcharintprop[365],getvar[lumMinRank]]]}
|
|
SetState {lum_select_token}
|
|
~~ }
|
|
STATE: {lum_select_token} ~~ {
|
|
~~ Select which token to pick up based on lumMinRank. First match at lowest rank wins.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: All
|
|
Expr {getcharintprop[333]<5}
|
|
Expr {getcharintprop[333]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[333]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Valor`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[334]<5}
|
|
Expr {getcharintprop[334]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[334]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Protection`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[335]<5}
|
|
Expr {getcharintprop[335]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[335]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Glory`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[336]<5}
|
|
Expr {getcharintprop[336]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[336]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Temperance`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[338]<5}
|
|
Expr {getcharintprop[338]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[338]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Aetheric Vision`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[343]<5}
|
|
Expr {getcharintprop[343]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[343]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of the Craftsman`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[339]<5}
|
|
Expr {getcharintprop[339]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[339]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Mana Flow`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[340]<5}
|
|
Expr {getcharintprop[340]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[340]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Mana Infusion`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[342]<5}
|
|
Expr {getcharintprop[342]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[342]+2)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of Purity`]}
|
|
SetState {lum_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[365]<10}
|
|
Expr {getcharintprop[365]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[365]+1)*100000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Token of the Aura of the World`]}
|
|
SetState {lum_pickup_token}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/f All Nalicana auras maxed or can't afford. Heading back.}
|
|
SetState {turn_in_quests}
|
|
~~ }
|
|
STATE: {lum_pickup_token} ~~ {
|
|
~~ Pick up the selected token from the ground spawn. Wait for it to appear in inventory.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Expr {getitemcountininventorybyname[getvar[lumToken]]>=1}
|
|
DO: SetState {lum_give_token}
|
|
IF: SecsInStateGE 30
|
|
DO: DoAll
|
|
Chat {/f Failed to pick up token. Retrying...}
|
|
SetState {lum_pickup_token}
|
|
IF: Not Expr {getitemcountininventorybyname[getvar[lumToken]]>=1}
|
|
DO: DoAll
|
|
ChatExpr {\/ub use +getvar[lumToken]}
|
|
SetWatchdog 5 120 {Default}
|
|
~~ }
|
|
STATE: {lum_give_token} ~~ {
|
|
~~ Give the token to Nalicana. Prepclick yes for confirmation dialog.
|
|
~~ Chat responses:
|
|
~~ Success: "You feel a surge of energy pass through you as the Light empowers your being"
|
|
~~ Already maxed: "You cannot increase your Aura of ... any further."
|
|
~~ Can't afford: "Nalicana tells you, "You do not have enough Luminance.""
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: ChatMatch {You do not have enough Luminance}
|
|
DO: DoAll
|
|
Chat {/f Not enough luminance. Heading back.}
|
|
SetState {turn_in_quests}
|
|
IF: ChatMatch {You cannot increase}
|
|
DO: SetState {lum_wait_spawn}
|
|
IF: ChatMatch {You feel a surge of energy}
|
|
DO: SetState {lum_wait_spawn}
|
|
IF: SecsInStateGE 15
|
|
DO: SetState {lum_give_token}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/ub prepclick yes 5}
|
|
ChatExpr {\/ub givep +getvar[lumToken]+` to Nalicana`}
|
|
SetWatchdog 5 120 {Default}
|
|
~~ }
|
|
STATE: {lum_wait_spawn} ~~ {
|
|
~~ Wait 20s for next token to spawn, then nav back to pickup position via nav_nalicanareset.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: All
|
|
Expr {testvar[lumNavLoaded]}
|
|
NavEmpty
|
|
DO: DoAll
|
|
DoExpr {clearvar[lumNavLoaded]}
|
|
SetState {lum_pick_aura}
|
|
IF: SecsInStateGE 60
|
|
DO: DoAll
|
|
DoExpr {clearvar[lumNavLoaded]}
|
|
SetState {lum_pick_aura}
|
|
IF: SecsInStateGE 20
|
|
DO: DoAll
|
|
DoExpr {setvar[lumNavLoaded,1]}
|
|
Chat {/vt nav load nav_nalicanareset}
|
|
IF: Always
|
|
DO: None
|
|
~~ }
|
|
|
|
STATE: {seer_cap} ~~ {
|
|
~~ Seer aura auto-purchase: disable combat, navigate to Liam of Gelid.
|
|
~~ Uses nav_liamofgelid to get to token area. Returns to Default when done.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: All
|
|
Expr {testvar[seerCapNavLoaded]}
|
|
NavEmpty
|
|
DO: DoAll
|
|
DoExpr {clearvar[seerCapNavLoaded]}
|
|
SetState {seer_pay}
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[seerCapNavLoaded, 1]}
|
|
Chat {/vt opt set enablecombat false}
|
|
Chat {/vt opt set enablelooting false}
|
|
Chat {/vt opt set enablebuffing true}
|
|
Chat {/vt opt set enablenav true}
|
|
Chat {/vt nav load nav_liamofgelid}
|
|
SetWatchdog 5 300 {stuck}
|
|
~~ }
|
|
STATE: {seer_pay} ~~ {
|
|
~~ Give Trade Note (250,000) to Liam of Gelid. Required once per character, harmless to retry.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: SecsInStateGE 5
|
|
DO: SetState {seer_pick_aura}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/ub prepclick yes 5}
|
|
Chat {/ub givep 1 Trade Note (250,000) to Liam of Gelid}
|
|
~~ }
|
|
STATE: {seer_pick_aura} ~~ {
|
|
~~ Compute cheapest seer aura. Seer cost = (rank+7)*50000.
|
|
~~ Properties: 333=Destruction (Damage Rating), 335=Retribution (Crit Damage). Both cap at 10 total.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Always
|
|
DO: DoAll
|
|
DoExpr {setvar[lumMinRank, 999]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[333]<10&&getcharintprop[333]<getvar[lumMinRank],getcharintprop[333],getvar[lumMinRank]]]}
|
|
DoExpr {setvar[lumMinRank, iif[getcharintprop[335]<10&&getcharintprop[335]<getvar[lumMinRank],getcharintprop[335],getvar[lumMinRank]]]}
|
|
SetState {seer_select_token}
|
|
~~ }
|
|
STATE: {seer_select_token} ~~ {
|
|
~~ Select seer token. Cheapest first between Destruction (333) and Retribution (335).
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: All
|
|
Expr {getcharintprop[333]<10}
|
|
Expr {getcharintprop[333]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[333]+7)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Dericost Token of the Aura of Destruction`]}
|
|
SetState {seer_pickup_token}
|
|
IF: All
|
|
Expr {getcharintprop[335]<10}
|
|
Expr {getcharintprop[335]==getvar[lumMinRank]}
|
|
Expr {getcharquadprop[6]>=(getcharintprop[335]+7)*50000}
|
|
DO: DoAll
|
|
DoExpr {setvar[lumToken, `Dericost Token of the Aura of Retribution`]}
|
|
SetState {seer_pickup_token}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/f All seer auras maxed or can't afford. Heading back.}
|
|
SetState {turn_in_quests}
|
|
~~ }
|
|
STATE: {seer_pickup_token} ~~ {
|
|
~~ Pick up the selected seer token from the ground spawn near Liam.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: Expr {getitemcountininventorybyname[getvar[lumToken]]>=1}
|
|
DO: SetState {seer_give_token}
|
|
IF: SecsInStateGE 30
|
|
DO: DoAll
|
|
Chat {/f Failed to pick up seer token. Retrying...}
|
|
SetState {seer_pickup_token}
|
|
IF: Not Expr {getitemcountininventorybyname[getvar[lumToken]]>=1}
|
|
DO: DoAll
|
|
ChatExpr {\/ub use +getvar[lumToken]}
|
|
SetWatchdog 5 120 {Default}
|
|
~~ }
|
|
STATE: {seer_give_token} ~~ {
|
|
~~ Give seer token to Liam of Gelid. Prepclick yes for confirmation dialog.
|
|
~~ Success: "has been augmented"
|
|
~~ Can't afford: "You do not have enough Luminance"
|
|
~~ Already maxed: "You cannot increase"
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: ChatMatch {You do not have enough Luminance}
|
|
DO: DoAll
|
|
Chat {/f Not enough luminance for seer aura. Heading back.}
|
|
SetState {turn_in_quests}
|
|
IF: ChatMatch {You cannot increase}
|
|
DO: SetState {seer_wait_spawn}
|
|
IF: ChatMatch {has been augmented}
|
|
DO: SetState {seer_wait_spawn}
|
|
IF: SecsInStateGE 15
|
|
DO: SetState {seer_give_token}
|
|
IF: Always
|
|
DO: DoAll
|
|
Chat {/ub prepclick yes 5}
|
|
ChatExpr {\/ub givep +getvar[lumToken]+` to Liam of Gelid`}
|
|
SetWatchdog 5 120 {Default}
|
|
~~ }
|
|
STATE: {seer_wait_spawn} ~~ {
|
|
~~ Wait 20s for next seer token to spawn, then loop back. No reset nav needed.
|
|
IF: Death
|
|
DO: SetState {death}
|
|
IF: SecsInStateGE 20
|
|
DO: SetState {seer_pick_aura}
|
|
IF: Always
|
|
DO: None
|
|
~~ }
|
|
|
|
~~========================= ONLY NAVS APPEAR BELOW THIS LINE =========================~~
|
|
|
|
NAV: nav0__death_pause_nav once ~~ {
|
|
pau 47.1262349446615 26.1864453474681 0.225020837783813 5000
|
|
~~ }
|
|
NAV: nav1__pickup_nav circular ~~ {
|
|
cht 6.85679616481066 -19.8018191655477 2.08332513769468E-05 {/vt mexec actiontryuseitem[wobjectfindnearestbyobjectclass[8]]}
|
|
pau 6.85679616481066 -19.8018191655477 2.08332513769468E-05 10000
|
|
~~ }
|