add neftet, aetheria, nalicana test metas and metaf converter

This commit is contained in:
Erik 2026-03-07 21:35:59 +01:00
parent db0e55b8bb
commit feced6d4c3
37 changed files with 35832 additions and 0 deletions

View file

@ -0,0 +1,293 @@
~~
~~ Nalicana's Test Quest Meta
~~ Talk to Nalicana → Gurog Ice Cave → Kill Battle Lord Gregor
~~ → Loot Mnemosyne → Return to Nalicana
~~
~~ NAV FILES REQUIRED (record in-game):
~~ nav_nalicana.nav - Start location → Nalicana at Asheron's Castle
~~ nal_to_cave.nav - Nalicana → Gurog Ice Cave → first room → locked door
~~ nal_to_tomb_portal.nav - Past door → Frozen Tomb portal
~~ nal_dungeon_run.nav - Frozen Tomb → maze (hug right) → Gregor's room
~~
~~ ============================================================
~~ STATE: Default - Init and go talk to Nalicana
~~ ============================================================
STATE: {Default}
IF: Death
DO: SetState {death}
IF: Always
DO: DoAll
Chat {/ub opt set VTank.PatchExpressionEngine true}
SetOpt {enablecombat} {false}
SetOpt {enablenav} {true}
SetOpt {enablelooting} {false}
SetOpt {enablebuffing} {true}
SetOpt {attackdistance} {0.0125}
Chat {/vt nav load nav_nalicana}
SetState {talk_nalicana}
~~ ============================================================
~~ STATE: talk_nalicana - Navigate to Nalicana, talk to get quest
~~ ============================================================
STATE: {talk_nalicana}
IF: Death
DO: SetState {death}
IF: All
Expr {testvar[navLoaded]}
NavEmpty
DO: DoAll
ClearWatchdog
Chat {/ub use Nalicana}
SetState {wait_nalicana_dialog}
IF: Always
DO: DoAll
DoExpr {touchvar[navLoaded]}
SetWatchdog 10.0 300.0 {stuck}
~~ ============================================================
~~ STATE: wait_nalicana_dialog - Wait for Nalicana's quest dialog
~~ ============================================================
STATE: {wait_nalicana_dialog}
IF: Death
DO: SetState {death}
~~ Got the quest dialog
IF: ChatMatch {Gurog have emerged}
DO: DoAll
DoExpr {echo[`Got quest from Nalicana!`,1]}
SetState {nav_to_cave}
~~ On cooldown
IF: ChatMatch {You have solved this quest too recently}
DO: DoAll
DoExpr {echo[`Quest on cooldown!`,1]}
SetState {done}
~~ Timeout - maybe already have quest, try going anyway
IF: SecsInStateGE 10
DO: SetState {nav_to_cave}
~~ ============================================================
~~ STATE: nav_to_cave - Travel to cave, kill gurogs, arrive at door
~~ ============================================================
STATE: {nav_to_cave}
IF: Death
DO: SetState {death}
IF: All
Expr {testvar[navLoaded2]}
NavEmpty
DO: DoAll
ClearWatchdog
SetOpt {enablecombat} {true}
SetOpt {enablelooting} {true}
SetState {wait_key}
IF: Always
DO: DoAll
DoExpr {touchvar[navLoaded2]}
Chat {/vt nav load nal_to_cave}
SetWatchdog 10.0 600.0 {stuck}
~~ ============================================================
~~ STATE: wait_key - At the door, wait for key from gurogs
~~ ============================================================
STATE: {wait_key}
IF: Death
DO: SetState {death}
IF: ItemCountGE 1 {Entryway Key}
DO: DoAll
DoExpr {echo[`Got Entryway Key!`,1]}
Chat {/ub use Entryway Key on Door}
SetState {wait_door}
~~ Keep fighting, wait for key
IF: SecsInStateGE 120
DO: DoAll
DoExpr {echo[`Key taking too long...`,1]}
SetState {wait_key}
~~ ============================================================
~~ STATE: wait_door - Wait for door unlock message
~~ ============================================================
STATE: {wait_door}
IF: Death
DO: SetState {death}
~~ Door unlocked
IF: ChatMatch {Door has been unlocked}
DO: DoAll
DoExpr {echo[`Door opened!`,1]}
SetOpt {enablecombat} {false}
SetOpt {enablelooting} {false}
SetState {nav_to_tomb_portal}
~~ Retry key use
IF: SecsInStateGE 5
DO: DoAll
Chat {/ub use Entryway Key on Door}
SetState {wait_door}
~~ ============================================================
~~ STATE: nav_to_tomb_portal - Navigate to Frozen Tomb portal
~~ Combat OFF during this nav
~~ ============================================================
STATE: {nav_to_tomb_portal}
IF: Death
DO: SetState {death}
IF: All
Expr {testvar[navLoaded3]}
NavEmpty
DO: DoAll
ClearWatchdog
SetState {enter_frozen_tomb}
IF: Always
DO: DoAll
DoExpr {touchvar[navLoaded3]}
Chat {/vt nav load nal_to_tomb_portal}
SetWatchdog 10.0 300.0 {stuck}
~~ ============================================================
~~ STATE: enter_frozen_tomb - Wait for portal transition
~~ ============================================================
STATE: {enter_frozen_tomb}
IF: Death
DO: SetState {death}
IF: ExitPortal
DO: DoAll
DoExpr {echo[`Inside Frozen Tomb!`,1]}
SetOpt {enablecombat} {true}
SetState {dungeon_run}
~~ If we walked right into it, may already be inside
IF: SecsInStateGE 10
DO: DoAll
SetOpt {enablecombat} {true}
SetState {dungeon_run}
~~ ============================================================
~~ STATE: dungeon_run - Navigate through Frozen Tomb to Gregor
~~ ============================================================
STATE: {dungeon_run}
IF: Death
DO: SetState {death}
IF: All
Expr {testvar[navLoaded4]}
NavEmpty
DO: DoAll
ClearWatchdog
SetOpt {enablelooting} {true}
SetState {kill_gregor}
IF: Always
DO: DoAll
DoExpr {touchvar[navLoaded4]}
Chat {/vt nav load nal_dungeon_run}
SetOpt {enablelooting} {false}
SetWatchdog 10.0 600.0 {stuck}
~~ ============================================================
~~ STATE: kill_gregor - Kill Battle Lord Gregor
~~ ============================================================
STATE: {kill_gregor}
IF: Death
DO: SetState {death}
~~ Gregor's death speech - he's dead, stop fighting
IF: ChatMatch {Killing me will not change anything}
DO: DoAll
DoExpr {echo[`Battle Lord Gregor defeated!`,1]}
SetOpt {enablecombat} {false}
SetState {wait_loot}
~~ Got the mnemosyne already
IF: ItemCountGE 1 {Battle Lord Gregor's Mnemosyne}
DO: DoAll
DoExpr {echo[`Got the Mnemosyne!`,1]}
SetOpt {enablecombat} {false}
SetOpt {enablelooting} {false}
SetState {return_nalicana}
IF: SecsInStateGE 600
DO: DoAll
DoExpr {echo[`Gregor fight timeout!`,1]}
SetState {stuck}
~~ ============================================================
~~ STATE: wait_loot - Wait for VTank to pick up mnemosyne
~~ ============================================================
STATE: {wait_loot}
IF: Death
DO: SetState {death}
IF: ItemCountGE 1 {Battle Lord Gregor's Mnemosyne}
DO: DoAll
DoExpr {echo[`Got the Mnemosyne! Returning to Nalicana.`,1]}
SetOpt {enablelooting} {false}
SetState {return_nalicana}
~~ Timeout waiting for loot
IF: SecsInStateGE 30
DO: DoAll
DoExpr {echo[`Mnemosyne not looted, check loot profile!`,1]}
SetOpt {enablelooting} {false}
SetState {return_nalicana}
~~ ============================================================
~~ STATE: return_nalicana - Nav back to Nalicana using nav_nalicana
~~ ============================================================
STATE: {return_nalicana}
IF: Death
DO: SetState {death}
IF: All
Expr {testvar[navLoaded5]}
NavEmpty
DO: DoAll
ClearWatchdog
SetState {turn_in}
IF: Always
DO: DoAll
DoExpr {touchvar[navLoaded5]}
Chat {/vt nav load nav_nalicana}
SetWatchdog 10.0 600.0 {stuck}
~~ ============================================================
~~ STATE: turn_in - Give mnemosyne to Nalicana
~~ ============================================================
STATE: {turn_in}
IF: Death
DO: SetState {death}
IF: Always
DO: DoAll
Chat {/ub givep Battle Lord Gregor's Mnemosyne to Nalicana}
Chat {/ub prepclick yes 3}
SetState {wait_turn_in}
~~ ============================================================
~~ STATE: wait_turn_in - Wait for turn-in dialog
~~ ============================================================
STATE: {wait_turn_in}
IF: Death
DO: SetState {death}
IF: ChatMatch {Lord Asheron should be able to learn much}
DO: DoAll
DoExpr {echo[`Nalicana's Test COMPLETE!`,1]}
SetState {done}
~~ Retry turn-in
IF: SecsInStateGE 10
DO: SetState {turn_in}
~~ ============================================================
~~ STATE: done - Quest complete
~~ ============================================================
STATE: {done}
IF: Always
DO: DoAll
DoExpr {echo[`Nalicana's Test quest finished.`,1]}
Chat {/mp}
~~ ============================================================
~~ STATE: stuck - Navigation stuck recovery
~~ ============================================================
STATE: {stuck}
IF: Death
DO: SetState {death}
IF: Always
DO: DoAll
Chat {/ub face}
DoExpr {echo[`Stuck! Check nav...`,1]}
~~ ============================================================
~~ STATE: death - Death recovery, recall and restart
~~ ============================================================
STATE: {death}
IF: ExitPortal
DO: DoAll
DoExpr {echo[`Died! Restarting...`,1]}
SetState {Default}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,262 @@
~~
~~ Empyrean Facility Aetheria Quest Meta
~~ Automates the 3-level Aetheria slot unlock dungeon
~~ Each level: kill wisps in 4 cardinal rooms, use Aligned Mana Stone at each fountain
~~ Then use stone at center fountain and take portal to next level
~~
~~ NAV FILES REQUIRED (record in-game, save to VTank folder):
~~ nav_empyrean.nav - Route TO the dungeon (already have this)
~~ emp_upper_north.nav - Upper level: start → north room fountain
~~ emp_upper_east.nav - Upper level: north room → east room fountain
~~ emp_upper_south.nav - Upper level: east room → south room fountain
~~ emp_upper_west.nav - Upper level: south room → west room fountain
~~ emp_upper_center.nav - Upper level: west room → center room fountain
~~ emp_middle_north.nav - Middle level: landing → north room fountain
~~ emp_middle_east.nav - Middle level: north room → east room fountain
~~ emp_middle_south.nav - Middle level: east room → south room fountain
~~ emp_middle_west.nav - Middle level: south room → west room fountain
~~ emp_middle_center.nav - Middle level: west room → center room fountain
~~ emp_lower_north.nav - Lower level: landing → north room fountain
~~ emp_lower_east.nav - Lower level: north room → east room fountain
~~ emp_lower_south.nav - Lower level: east room → south room fountain
~~ emp_lower_west.nav - Lower level: south room → west room fountain
~~ emp_lower_center.nav - Lower level: west room → center room fountain
~~
~~ ============================================================
~~ STATE: Default - One-time init and travel to dungeon
~~ ============================================================
STATE: {Default}
IF: Death
DO: SetState {death}
IF: Always
DO: DoAll
Chat {/ub opt set VTank.PatchExpressionEngine true}
SetOpt {enablecombat} {false}
SetOpt {enablenav} {true}
SetOpt {enablelooting} {false}
SetOpt {enablebuffing} {true}
SetOpt {attackdistance} {0.0125}
DoExpr {setvar[currentLevel,`upper`]}
DoExpr {setvar[currentRoom,`north`]}
DoExpr {setvar[roomsDone,0]}
Chat {/vt nav load nav_empyrean}
SetState {enter_dungeon}
~~ ============================================================
~~ STATE: enter_dungeon - Wait for nav to reach dungeon entrance
~~ ============================================================
STATE: {enter_dungeon}
IF: Death
DO: SetState {death}
IF: All
SecsInStateGE 3
NavEmpty
DO: DoAll
SetOpt {enablecombat} {true}
SetState {goto_room}
IF: Always
DO: DoAll
SetWatchdog 10.0 300.0 {stuck}
~~ ============================================================
~~ STATE: goto_room - Load nav for current level+room
~~ ============================================================
STATE: {goto_room}
IF: Death
DO: SetState {death}
IF: Always
DO: DoAll
ChatExpr {\/vt nav load emp_+getvar[currentLevel]+`_`+getvar[currentRoom]}
DoExpr {clearvar[navLoaded]}
SetState {arrive_room}
~~ ============================================================
~~ STATE: arrive_room - Wait for nav to finish (arrived at room)
~~ ============================================================
STATE: {arrive_room}
IF: Death
DO: SetState {death}
IF: All
Expr {testvar[navLoaded]}
NavEmpty
DO: DoAll
ClearWatchdog
SetState {kill_wisps}
IF: Always
DO: DoAll
DoExpr {touchvar[navLoaded]}
SetWatchdog 10.0 180.0 {stuck}
~~ ============================================================
~~ STATE: kill_wisps - Wait for all mobs in room to die
~~ ============================================================
STATE: {kill_wisps}
IF: Death
DO: SetState {death}
~~ All wisps dead — proceed to use stone
IF: All
SecsInStateGE 5
NoMobsInDist 4.0
DO: SetState {use_stone}
~~ Safety timeout: if stuck fighting for 5 minutes, try stone anyway
IF: SecsInStateGE 300
DO: SetState {use_stone}
IF: Always
DO: DoAll
SetWatchdog 10.0 300.0 {stuck}
~~ ============================================================
~~ STATE: use_stone - Use Aligned Mana Stone, wait for result
~~ ============================================================
STATE: {use_stone}
IF: Death
DO: SetState {death}
~~ Success: "A shiver moves across your body"
IF: ChatMatch {A shiver moves across your body}
DO: DoAll
DoExpr {echo[`Room complete! (`+getvar[currentLevel]+` `+getvar[currentRoom]+`)`,1]}
SetState {next_room}
~~ Already done: "you feel no change"
IF: ChatMatch {no change}
DO: DoAll
DoExpr {echo[`Room already done (`+getvar[currentLevel]+` `+getvar[currentRoom]+`)`,1]}
SetState {next_room}
~~ Retry stone every 5 seconds
IF: SecsInStateGE 5
DO: DoAll
Chat {/ub use Aligned Mana Stone}
SetState {use_stone}
~~ First attempt immediately
IF: Always
DO: DoAll
Chat {/ub use Aligned Mana Stone}
~~ ============================================================
~~ STATE: next_room - Advance to next room or center
~~ Route: north → east → south → west → center
~~ ============================================================
STATE: {next_room}
IF: Death
DO: SetState {death}
~~ From north → go east
IF: Expr {getvar[currentRoom]==`north`}
DO: DoAll
DoExpr {setvar[currentRoom,`east`]}
SetState {goto_room}
~~ From east → go south
IF: Expr {getvar[currentRoom]==`east`}
DO: DoAll
DoExpr {setvar[currentRoom,`south`]}
SetState {goto_room}
~~ From south → go west
IF: Expr {getvar[currentRoom]==`south`}
DO: DoAll
DoExpr {setvar[currentRoom,`west`]}
SetState {goto_room}
~~ From west → go to center
IF: Expr {getvar[currentRoom]==`west`}
DO: DoAll
DoExpr {setvar[currentRoom,`center`]}
SetState {goto_room}
~~ From center → level complete, use stone then take portal
IF: Expr {getvar[currentRoom]==`center`}
DO: SetState {use_stone_center}
~~ ============================================================
~~ STATE: use_stone_center - Use stone at center fountain, then portal
~~ ============================================================
STATE: {use_stone_center}
IF: Death
DO: SetState {death}
~~ Success at center fountain — got aetheria message
IF: ChatMatch {A shiver moves across your body}
DO: DoAll
DoExpr {echo[`Level complete! (`+getvar[currentLevel]+`)`,1]}
SetState {take_portal}
~~ Already done
IF: ChatMatch {no change}
DO: DoAll
DoExpr {echo[`Level already done (`+getvar[currentLevel]+`)`,1]}
SetState {take_portal}
~~ Retry stone every 5 seconds
IF: SecsInStateGE 5
DO: DoAll
Chat {/ub use Aligned Mana Stone}
SetState {use_stone_center}
~~ First attempt immediately
IF: Always
DO: DoAll
Chat {/ub use Aligned Mana Stone}
~~ ============================================================
~~ STATE: take_portal - Take portal to next level
~~ ============================================================
STATE: {take_portal}
IF: Death
DO: SetState {death}
~~ Upper level done → take Middle portal
IF: Expr {getvar[currentLevel]==`upper`}
DO: DoAll
DoExpr {setvar[currentLevel,`middle`]}
DoExpr {setvar[currentRoom,`north`]}
Chat {/ub use Empyrean Facility Middle Level}
SetState {portal_transition}
~~ Middle level done → take Lower portal
IF: Expr {getvar[currentLevel]==`middle`}
DO: DoAll
DoExpr {setvar[currentLevel,`lower`]}
DoExpr {setvar[currentRoom,`north`]}
Chat {/ub use Empyrean Facility Lower Level}
SetState {portal_transition}
~~ Lower level done → quest complete!
IF: Expr {getvar[currentLevel]==`lower`}
DO: DoAll
DoExpr {echo[`All 3 aetheria slots unlocked!`,1]}
SetState {quest_done}
~~ ============================================================
~~ STATE: portal_transition - Wait for portal entry/exit
~~ ============================================================
STATE: {portal_transition}
IF: Death
DO: SetState {death}
IF: ExitPortal
DO: DoAll
DoExpr {echo[`Arrived at `+getvar[currentLevel]+` level`,1]}
SetState {goto_room}
~~ Safety: if portal didn't work, retry
IF: SecsInStateGE 15
DO: SetState {take_portal}
~~ ============================================================
~~ STATE: quest_done - All 3 levels complete, recall out
~~ ============================================================
STATE: {quest_done}
IF: Always
DO: DoAll
DoExpr {echo[`Empyrean Facility quest COMPLETE! All aetheria slots unlocked.`,1]}
Chat {/mp}
~~ ============================================================
~~ STATE: stuck - Navigation stuck, try to recover
~~ ============================================================
STATE: {stuck}
IF: Death
DO: SetState {death}
IF: Always
DO: DoAll
Chat {/ub face}
DoExpr {echo[`Stuck! Trying to recover...`,1]}
SetState {goto_room}
~~ ============================================================
~~ STATE: death - Death recovery
~~ Re-enter dungeon from the beginning
~~ ============================================================
STATE: {death}
IF: ExitPortal
DO: DoAll
DoExpr {echo[`Died! Re-entering dungeon...`,1]}
Chat {/vt nav load nav_empyrean}
SetState {enter_dungeon}

File diff suppressed because it is too large Load diff

12925
metaf_monolithic.py Normal file

File diff suppressed because it is too large Load diff

728
neftet/neftet.af Normal file
View file

@ -0,0 +1,728 @@
~~ {
~~ 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)
~~ navRoute2 - alternate route after flower/prickly pickup (leader only, e.g. neftet_route2)
~~ navWaitFollow - return-to-start route (both roles, e.g. neftet_wait_follow / neftet_wait_follow2)
~~ (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]}
DoExpr {setvar[ammoType, cond[getinvcount[Wrapped Bundle of Quarrelshafts]>0, 1, cond[getinvcount[Wrapped Bundle of Arrowshafts]>0, 2, 0]]]}
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}
DoExpr {setvar[ammoType, cond[getinvcount[Wrapped Bundle of Quarrelshafts]>0, 1, cond[getinvcount[Wrapped Bundle of Arrowshafts]>0, 2, 0]]]}
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
~~ }

5042
neftet/neftet.met Normal file

File diff suppressed because it is too large Load diff

6685
src/metaf.cs Normal file

File diff suppressed because one or more lines are too long

6685
src/metaf_temp/Program.cs Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

View file

@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"metaf_temp/1.0.0": {
"runtime": {
"metaf_temp.dll": {}
}
}
}
},
"libraries": {
"metaf_temp/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,12 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View file

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("metaf_temp")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0b053cc34b0b483c93075146de4c506ac26a7fe3")]
[assembly: System.Reflection.AssemblyProductAttribute("metaf_temp")]
[assembly: System.Reflection.AssemblyTitleAttribute("metaf_temp")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View file

@ -0,0 +1 @@
554bfbb3c846e6124921ae1bde05dc39653456f45384b3a8ec3b65bdce2c4a8c

View file

@ -0,0 +1,17 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = metaf_temp
build_property.ProjectDir = C:\Users\erikn\source\repos\metaf\src\metaf_temp\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View file

@ -0,0 +1,8 @@
// <auto-generated/>
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
global using System.Net.Http;
global using System.Threading;
global using System.Threading.Tasks;

View file

@ -0,0 +1 @@
e81717eb7ea8ce2e7f05628b43c684ba25c9665a62f3da3769ab2534cd948156

View file

@ -0,0 +1,30 @@
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/bin/Debug/net8.0/metaf_temp
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/bin/Debug/net8.0/metaf_temp.deps.json
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/bin/Debug/net8.0/metaf_temp.runtimeconfig.json
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/bin/Debug/net8.0/metaf_temp.dll
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/bin/Debug/net8.0/metaf_temp.pdb
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.GeneratedMSBuildEditorConfig.editorconfig
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.AssemblyInfoInputs.cache
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.AssemblyInfo.cs
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.csproj.CoreCompileInputs.cache
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.sourcelink.json
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.dll
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/refint/metaf_temp.dll
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.pdb
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/metaf_temp.genruntimeconfig.cache
/mnt/c/Users/enihlen/source/repos/metaf/src/metaf_temp/obj/Debug/net8.0/ref/metaf_temp.dll
C:\Users\erikn\source\repos\metaf\src\metaf_temp\bin\Debug\net8.0\metaf_temp.exe
C:\Users\erikn\source\repos\metaf\src\metaf_temp\bin\Debug\net8.0\metaf_temp.deps.json
C:\Users\erikn\source\repos\metaf\src\metaf_temp\bin\Debug\net8.0\metaf_temp.runtimeconfig.json
C:\Users\erikn\source\repos\metaf\src\metaf_temp\bin\Debug\net8.0\metaf_temp.dll
C:\Users\erikn\source\repos\metaf\src\metaf_temp\bin\Debug\net8.0\metaf_temp.pdb
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.AssemblyInfoInputs.cache
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.AssemblyInfo.cs
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.csproj.CoreCompileInputs.cache
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.sourcelink.json
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.dll
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\refint\metaf_temp.dll
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.pdb
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\metaf_temp.genruntimeconfig.cache
C:\Users\erikn\source\repos\metaf\src\metaf_temp\obj\Debug\net8.0\ref\metaf_temp.dll

Binary file not shown.

View file

@ -0,0 +1 @@
49d97fe915326648caaacbe39fb31e95d275eea089d9076874fe2a43b966c817

Binary file not shown.

View file

@ -0,0 +1 @@
{"documents":{"C:\\Users\\erikn\\source\\repos\\metaf\\*":"https://raw.githubusercontent.com/JJEII/metaf/0b053cc34b0b483c93075146de4c506ac26a7fe3/*"}}

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,73 @@
{
"format": 1,
"restore": {
"C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj": {}
},
"projects": {
"C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj",
"projectName": "metaf_temp",
"projectPath": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj",
"packagesPath": "C:\\Users\\erikn\\.nuget\\packages\\",
"outputPath": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\erikn\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.102/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\erikn\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\erikn\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
</Project>

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View file

@ -0,0 +1,79 @@
{
"version": 3,
"targets": {
"net8.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0": []
},
"packageFolders": {
"C:\\Users\\erikn\\.nuget\\packages\\": {},
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj",
"projectName": "metaf_temp",
"projectPath": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj",
"packagesPath": "C:\\Users\\erikn\\.nuget\\packages\\",
"outputPath": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\erikn\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.102/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View file

@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "qDgiRjqgdeo=",
"success": true,
"projectFilePath": "C:\\Users\\erikn\\source\\repos\\metaf\\src\\metaf_temp\\metaf_temp.csproj",
"expectedPackageFiles": [],
"logs": []
}