0.2.4
Reference46 min readUpdated
2026-10-16
On this page
On this page
For players#
- Ticking a quest's accept off without taking the quest no longer sends you to farm for it: its objectives and turn-in leave the guideOne route, written as a .guide file and compiled to Lua; its id reads like forever/alliance/human/01-elwynn-forest., as when you skip the stepOne stop in a guide: a title, optional conditions and tip, and at least one goal., and come back if you take the quest after all. A stray tick on Raptor Horns in Ratchet kept the Barrens guide on the horns.
- Walks between zones go through the real tunnels, passes, bridges and gates: from the Barrens to Astranaar the route flew to Sun Rock Retreat and walked straight over the ridge into Ashenvale; it now walks through the Talondeep Path. The zone crossings are an Era map addon's (GPL-3.0), shipped with Polestar; until now only a local file had them, so released builds walked between zones in straight lines.
- The quest item button offers only an item from the step's own quests: it took the first usable quest item in your bags, so Bethor's Potion from Silverpine sat on it through the Barrens. From the bags it now offers only an item one of the step's open quests handed you when you took it.
- The instance counter ("1/5 this hour") no longer appears on screen unless you turn it on: Options, Quality of Life, Trackers, Instances, "Compact display". Instances are still counted, and /pole instances still lists your runs and the hourly cap.
- The Barrens (19-24) takes Her Name Is Olgra after Lost in Battle is handed in, the only time Mankrik offers it, and collects Olgra's Adornments on the way back down to Camp Taurajo: the guide asked for it at the first Crossroads visit, Mankrik's window then marked it not offered, and the quest dropped off the route (reported by Fitz on Discord).
- A rare alert's "Set waypoint" goes to the rare, not to a spawn point across the zone: a rare in sight (nameplate, target or mouseover) sets it where you saw it, and a minimap rare is asked for its position again on the click and on the zone's map when a subzone or cave map lacks it. Only when the game gives no position does it fall back to the nearest known spawn, and the alert now says so ("known spawn 120 yd"); a spawn whose distance cannot be measured is no longer picked (thanks petllama and Miguel Antunes).
- Vendors, trainers and inns the guide picks for you put towns in zones far above your level last: a level 18 in Darkshore was sent to sell and repair at Chagrak Hammerstrike in Mount Hyjal (56-60), nearer by straight line than Auberdine. Such a town still comes up when you click through the alternatives (thanks Sevenleafclover).
- The Target button and the Step action key never put a name with a line
break (or any other control character) into their macro. A guide pack,
which anyone can write, could have hidden a second line such as
/run SendMail(...)in a mob's or NPC's name, and it would have run on the press; such a name is now passed over. - Looking ahead at an accept, taking the quest moves on to its objectives again: in the moment after the accept, before the game fills in the quest's objectives, the guide read it as ready to hand in and jumped past the kill or collect step to the turn-in (Kolkar Leaders in the Barrens went straight from Regthar to his turn-in, past Barak Kodobane).
- Handing in a quest the guide does not list, then taking the follow-up the game offers at once, no longer passes the same NPC's guide quests as "not offered" when the reward took more than half a minute to read (Jorn Skyseer at Sergra Darkthorn in the Crossroads).
- In Eastern Kingdoms and Kalimdor the arrow's walks run on Polestar's own, finer walking maps (made from the game's terrain, water and buildings, in Shortest Path Forever's map format, with Cillian Berragan's permission): out of an inn by its door rather than through the wall, down into the Undercity by its lifts, never swimming across open sea (water the game tires you in), and along the coast where that is the way, and never straight up a slope too steep to climb (the Raptor Horns hillside in the Barrens; thanks Fitz). The maps take about 26 MB once loaded (Walk real paths on) and up to about 54 MB more while a walk is being searched; the zip grows by about 11 MB.
- A class guide opened before your level says so: the guide window shows "Available from level 20" with who starts it (or the quest to finish first), instead of sending you to a trainer who has nothing for you, then skipping its quests one by one until it called itself complete. The guide starts by itself on the level-up, and the guide menu's row reads "From level 20".
- The published leveling times count only what a guide requires: about 130-132 h to 60 for the Horde and 132-134 h for the Alliance, not 123-124 and 128-129. They used to count the guides' optional extras (rare-drop quest starters, the Green Hills pages, profession quests) as done; doing them as they come can still save up to about 8 h (thanks joelwurtz).
- A guide's "Train at" goal for your class ticks itself off when there is nothing new to learn: you visited your class trainer at this level, or at the even level below an odd one (class trainers teach on even levels only). A level 5 Paladin who trained at 4 walks on to Goldshire instead of looking for a trainer (thanks SavageHands).
- "Skip grey quests" (Options, Guide, Automation) leaves out grey quests now: it kept every quest the guide also turns in, which is nearly all of them, so a character ahead of the route still saw them. A grey quest goes with its turn-in; one that opens a quest still worth doing stays, as Buzzbox 827 does in Darkshore at 20 (thanks Wogi).
- "Warn about missable quests" (Options, Guide, Automation; off by default): before you take a quest that closes another for good, a breadcrumb's follow-up or one quest of a choice, chat names what you would lose ("Taking Sven's Revenge closes Deliveries to Sven for good.") and quest automation leaves that accept to you. Quests your race or class never gets and other versions of the same quest are left out, and so are guides for the other faction (thanks CDVolvik and Roxton).
- The Undead Tirisfal Glades guide sends only Paladins to Bandarion Keep for As Above, So Below and The One That Got Away: Hilda the Breaker and Ephram Barbaro offer them to Paladins only. Other classes still collect the Shadowvale elixir bottles (thanks Mike_).
- Quests done by an event or an escort wait until the quest log counts them, instead of moving on as soon as you reach the place: Discipline (motivate five Deathguards), A Light in the Darkness and Seeking Refuge in Tirisfal Glades, Lost in the Shadows in Durotar and Escaping Ban'ethil in Teldrassil. The guide used to send you to turn in Discipline with no Deathguard motivated (thanks CDVolvik).
- The Dungeons journal lists the dungeon quests it missed and drops ones that were not: each quest's chain now holds every prerequisite and breadcrumb (Nathanos Blightcaller's errands before Ramstein, Speak with Shoni before Underground Assault, Alba Fairmoon's Toxic Soil chain before Destruction in Deadmines, Rethiel's Wetlands chain before Horrors in the Highland, Magus Voidglare's quests before Blood in the Streets); the instance the web database Forever files a quest under counts (An Ancient Grudge in the Hall of Thanes, now for both sides); a quest whose start item drops or lies inside is on that dungeon's page too (An Unholy Alliance on Razorfen Kraul's, the Treaty of Understanding on the Hall of Thanes'); the report back that ends a dungeon quest's story is on its page (Hidden Enemies, The Lord of Blackrock, The Platinum Discs); Shards of the Felvine is on Dire Maul's. Quests whose items are sold, crafted or found outside (Murloc Poachers, Craftsman's Writs, Desert Survival Kits) left the pages. (thanks Shockp)
- Dungeon quest rewards: the reputation a quest gives (pages showed the standing some quests ask for, such as +3000), the money, the rewards of 108 quests that showed none, how many of an item ("5 x"), and Deviate Hides gives both of its items now (thanks Shockp)
- A "Complete" goalOne thing to do in a step, as a verb and its arguments (accept 783, kill, goto, turnin...). shows the quest's progress: its count after it (8/14) and, for a quest with several objectives, the open ones under it in the game's words ("Plainstrider Meat: 3/7"), as kill and collect goals do. The Hunt Begins in Mulgore read only "Complete The Hunt Begins" with no x of y (thanks CDVolvik and c0nsy).
- A dungeon's pick-up guide no longer sends you to the Darkmoon Faire: the Deadmines guide started with Copper Modulator, Rinling's Faire ticket turn-in, because the modulator drops there. Darkmoon Faire, holiday and war effort quests are on a dungeon's page only where the game files them, and an item a boss drops only rarely by the web database's count no longer ties a quest to it: The Ectoplasmic Distiller left Naxxramas and Zul'Gurub, The Dread Citadel left Blackwing Lair (thanks kp)
- The Barrens guide takes Walton and Vrang's quests in the order the game offers them: Vrang's two first, The Hermit Tanner up to Walton, then Trouble in the Valley and Unwelcome Guests, which now waits until Terry Longdrink is dead. Walton offered neither at the first visit (thanks CDVolvik and Hotline).
- A dungeon quest several NPCs give goes to the nearest one of your side: Tabetha's Task for Zul'Farrak sent Alliance mages to Anastasia Hartwell in the Undercity; now the pick-up guide, the quest's card and Lookup send them to an Alliance mage trainer, and Lookup marks a quest only the other side's NPCs give as that side's.
- The Ruins of Lordaeron pick-up guide no longer starts with Unending Torment: Master Apothecary Faranell gives it only after you bring her the Abominable Head The Baron drops inside, so it now comes after the run, in the hand-in guide. The same for the Excavation Site's Titan Relics: Earthen Echo and Prehistoric Prism follow the relic you bring out (thanks Arachnit)
- Party sync: in a party, the guide shows the counts of party members who run Polestar under each shared quest goal (Ana 5/8, Ben done), and on a quest you took, who in the party lacks it, even without Polestar. Quest IDs and counts only, through hidden party messages when a count changes, so it works across guides and client languages; nothing goes to chat. Two switches in Questing > Quests > Party, both off until you turn them on (thanks CDVolvik).
- Quests Forever renamed carry their Forever names in the guides: Chastise (once A Lack of Fear), Dark Sacrifice (once Devouring Plague), Look to the Stars, Onu is Meditating and the others the Forever web database lists as renamed.
- The leveling guides follow the refreshed simulatorThe route model and search that finds and scores leveling routes (node tools/polestar.js sim, SIMULATION.md). route and take Forever's new quests on it. Alliance: Shipment to Stormwind and An Apple Treat in Elwynn Forest, Crown of the Earth and the Temple of the Moon in Darnassus, Fishin' Time in Stormwind, Expanding Horizons and Making Do between Darkshore and Stormwind, a Wetlands loop out of Menethil at 30 (From the Ashes, Crocs of the Sky, Stopping the Cycle and the rest), Hillsbrad's Hoard, Seeking Caitlin, Shared Fury and the Gleaming Crescent Necklace in Ashenvale, Carved Centaur Totems in Desolace and My Little Friends across Arathi, Desolace and Stranglethorn. Horde: Beren's Peril and the Offering Stone in Silverpine, Va'xug Firefure in Stonetalon, Gloomrise north of Thunder Bluff, Stop the Screeching at Freewind Post, Traditions of the Bluff, The Kolkar of Desolace and Draenethyst Crystals; the Tauren start no longer walks to Durotar. Elite quests on the way (Aggor the Young, Riptear, Carnage, The Offering of Blood) are optional.
- A Class category in the guide menuThe hub's Guides section, where a player picks a guide., after Leveling, with 62 guides for the class quest chains of every class, one guide per goal and named after it: Druid forms and Cure Poison, Rhok'delar and Lok'delar and The Hunter's Charm, the Mage robes, orbs, wands and Polymorph: Pig, Verigan's Fist, the Holy Mightstone and the Paladin's Tyr's Watch and Lumina Windsinger chains, the Priest spell quests and Benediction and Anathema, Ravenholdt, Poisons and the Rogue's key and horn chains, the Shaman totems and Darkreaver, the Warlock's felhunter, incubus, Orb of Orahil (both acolytes' paths in one guide), Shard of the Green Flame and Tome of Sacrifice, and the Warrior's armour and weapon chains. The details in the guide menu lead with what each one gives (the item or spell with its icon and the game's tooltip on hover, a choice of items under "Choose one") and one line on why it is worth doing. A reward behaves like any item: Shift- click links it (a spell too), Ctrl-click tries it on, Alt-click guides you to it, and its tooltip fills in when the game has not loaded the item yet instead of staying at "Retrieving item information" (the Dungeons loot, the guide window's gear picks and rare drops too). The spells the chains teach (forms, demons, stances, the Priest racials) show their own icon and tooltip. The four class mounts (Paladin Warhorse and Charger, Warlock Felsteed and Dreadsteed) moved there from Collectibles, and the Charger and Dreadsteed guides now walk their whole chains (Emphasis on Sacrifice to Judgment and Redemption; Rage of Blood to Dreadsteed of Xoroth) instead of naming them in a tip.
- Class quests on the leveling route: every start takes its level 1 class letter to the trainer; Night Elf and Tauren Druids learn Cure Poison on the way (Darkshore, the Barrens), Mages do Mirror Lake (Alliance) and The Balnir Farmstead (Undead), Hunters' taming quests say they teach Tame Beast and Beast Training (Orc and Troll Hunters hand Training the Beast in before leaving Durotar), Undead Paladins take Coming to Terms, Call of Fire names the Totem of Charged Flames it gives Shamans, Rogues may do The Touch of Zanzil in Stormwind and Alliance Warlocks the incubus. The Warlock felhunter chain left the Horde 30-40 guides for its Class guide, and the leveling guides point at the Class guides for the long chains they leave out.
- The guide windowThe small window that shows the current step and its goals while playing (UI/GuideFrame.lua). says when a goal needs a group, under the goal in violet: "Elite: group advised" (also rare elite and boss), "Dungeon: Dire Maul", "Raid: Molten Core" or the guide's own "Group of 3 advised"; once per card when several goals share it. The guide menu tags guides with group content on their route "Group" in the list, on the Continue cards and in the details.
- The Deathcharger guide's arrow points at Stratholme's Service Entrance (41.5,17.7), not at the spot its Era map position falls on Forever's redrawn Eastern Plaguelands map.
- Without the CodexLookup's database of items, mounts, pets, recipes, NPCs, rares, quests, zones, dungeons and treasures, with where each comes from (codex build, the Polestar_Codex addon)., Lookup and Dungeons say which case it is: not installed (get the Polestar zip from CurseForge or the GitHub Releases page, not GitHub's "Source code" download) or turned off in the AddOns list.
- At login, Polestar says in chat when its install is incomplete: the Codex or the guides missing, or a Polestar folder left from another version (copied over an old install, or unzipped one folder too deep), with how to reinstall cleanly.
- Durotar: Cutting Teeth goes back to Gornek as soon as the boars are done, with the class letter, so Sting of the Scorpid and Galgar's Cactus Apple Surprise come along to Sarkoth, whose slope is full of the Scorpid Workers and cactuses they need (thanks Tom).
- Three quests no longer go straight from their accept to the turn-in with the quest unfinished: Camping 101: Cooking in Mulgore and Dun Morogh waits until you have spoken with the cook, and the Alliance Un'Goro guide collects the compass, map and key for It's a Secret to Everybody, as the Horde one does (thanks CDVolvik).
- The arrow leads to a cave's mouth before anyone inside it: the Den (Kzan Thornslash, at the back of the cave behind Gornek), the Burning Blade Coven and Skull Rock in Durotar, the Coldridge troll cave in Dun Morogh, the Jasperlode Mine in Elwynn Forest, Shadowthread Cave and Fel Rock in Teldrassil and Night Web's Hollow in Tirisfal Glades, instead of straight through the mountain (thanks Tom).
- Dungeons: after the run, "Hand in the quests" on a dungeon's page builds a guide to where its quests in your log are turned in, on the shortest path from where you stand, and takes the follow-ups those turn-ins open from the same NPC or one close by; quests not finished yet are listed instead of routed. The button leads once a quest is finished, the pick-up guide's last step points to it and its end offers it, and the hand-in guide takes the finished pick-up guide's tab (thanks Feverish).
- Reputation the Codex knew nothing of: quest rewards say the standing their quest needs (the Bloodsail Admiral's Hat, the Cenarion Circle's Ahn'Qiraj gear) and Lookup marks the quest unavailable until you have it; the Winterspring Frostsaber, Stormpike Battle Charger and Frostwolf Howler ask for Exalted at their vendor; Aqual and Eternal Quintessence come from Duke Hydraxis.
- Lookup knows the standing about 180 reputation rewards ask at their vendor, which the game's data does not say: the Alterac Valley and Warsong Gulch supply officers' wares (each side's at its own faction: an Alliance player buying Alterac Manna Biscuits needs Honored with the Stormpike Guard, a Horde one with the Frostwolf Clan), the Argent Dawn's resistance mantles, Timbermaw Hold's Furbolg Medicine Pouch and Totem, Duke Hydraxis's Aqual and Eternal Quintessence, and the Zandalar Tribe's Essence Mangoes, Zanza potions and signets, now listed as rewards of Rin'wosho the Trader's quests. Such a source shows as unavailable, with the grind, until you have the standing, and a guide built from it reaches the standing first.
- 286 more NPCs show their level in Lookup (from the Forever web database's NPC list, where nothing else gave one).
- Dungeons list more than their encounters: the Ring of Law's fighters, event and rare bosses (Edge of Madness, Theldren, Mor Grayhoof) after the encounter bosses, and boss chests with their loot (Chest of The Seven, Gordok Tribute, Cache of the Firelord). Kirtonos the Herald shows his loot.
- A boss's loot lists its own drops first, so world drops no longer push them out, and a rare's or a treasure's list starts with what only it drops and shows up to 150 items.
- On the quest reward panel the coin always marks the reward that sells for most, beside any upgrade arrow, not only when no reward is an upgrade.
- An object a quest item drops from names the quest once on its tooltip, not once per object of that name: the Sapphire of Aku'Mai in Blackfathom Deeps listed its quest three times (thanks Mightie).
- Dun Morogh: Grik'nir the Cold's step says he is inside the troll cave, not on the hill above it; follow the tunnel from the mouth (thanks CDVolvik and Turesh).
- Elwynn Forest: Goldtooth is inside the Fargodeep Mine, at the back of the mine floor; the arrow now leads to the mine's mouth first instead of onto the hill above it (thanks Verium).
- Ashenvale (Horde): the Sapphires of Aku'Mai grow in the tunnels leading to the Blackfathom Deeps portal, underground, not on the strand; the arrow now leads to the ruins' pit first, and the step warns that the tunnels' satyrs and naga are elite (thanks Mightie).
- The arrow no longer vanishes on the Deeprun Tram, where the game gives no position: on the ride it keeps showing "Take the tram to Stormwind" (or Ironforge), anywhere else without a position it says "No position here" over the step, and it points again as soon as you step off (thanks Igotthis).
- The arrow takes the mouse on the arrow itself, not on the distance and label under it, so a large arrow no longer catches drags meant for the world, and the hover wash sits behind the arrow only. When there is no arrow to show (another continent, no position), the text takes the mouse (thanks CDVolvik).
- Teldrassil, Dun Morogh and Mulgore: the starting glens no longer send you off for one delivery quest and back. Dolanaar Delivery and Supplies to Tannok are taken on the way out of Shadowglen and Coldridge Valley, by the path where Porthannius and Hands Springsprocket stand, and A Task Unfinished starts the cougar hunt at Antur Fallow's end of Camp Narache.
- Quest items that vanish after a while reach their turn-in in time: Dun Morogh takes the Scalding Mornbrew (five minutes) from Nori just before Anvilmar instead of before the troll cave, the Blasted Lands go to Nethergarde Keep with the Crate of Power Stones (an hour) before the bloodmages' beasts, and Horde Warriors in the Barrens gather the Twitching Antennae (fifteen minutes) on the way back from Gann Stonespire and hearth to Ruga at once. Teldrassil says Iverron's Antidote lasts five minutes.
- Western Plaguelands (Alliance): the Arcane Quickeners vanish 30 minutes after you buy them, so the guide no longer buys all four at the first Chillwind Camp stop, where they ran out before the cauldrons: one is bought on the stop right before Felstone Field's cauldron and two on the one before the Writhing Haunt's and Dalson's Tears', and the steps say they last 30 minutes.
- Dungeons: an Attunement tab (Keys where each is a key) on the pages of Molten Core (Attunement to the Core, and Aqual Quintessence for the runes), Onyxia's Lair (the Drakefire Amulet, each side's chain), Blackwing Lair (Blackhand's Command), Naxxramas (the Dread Citadel quest your Argent Dawn standing allows), Scholomance (the Skeleton Key), Blackrock Depths (the Shadowforge and Prison Cell keys), Stratholme, Dire Maul, Gnomeregan, Scarlet Monastery and the City of Dalaran (the Horde's Dalaran Sewer Key). Each shows what it opens and who needs it, whether you hold the key, and every step with your progress: done, in your log, open now, waiting on an earlier step, too low or short of standing. "Guide me through it" opens a guide through what is left, from where you stand: every quest of the chain in turn, including the ones given, ended or done inside a dungeon (Marshal Windsor in Blackrock Depths, Blackhand's Command at Drakkisath's Brand, the Core Fragment by the Molten Core portal), which send you to that dungeon's entrance and say what is inside; a quest still above your level stays in the guide, its accept saying from which level. Forever took the Seal of Ascension out, so Upper Blackrock Spire has no key (thanks Shockp).
- A step that asks you to buy something can buy it for you at a merchant that sells it, after selling greys and repairing: Options, Quality of Life, Vendors, Buy for the guide (off by default; Shift skips). Only what your bags still lack, and only for money. Optional buys, like a second mount colour, are left to you, and so is anything over 50g: the chat says what it left (thanks CDVolvik).
- Dun Morogh: Grund and Gozwin is done from Anvilmar and handed in on the way to the troll cave, The Adventurer is taken from Thalos on the way out, the arrow leads to the troll cave's mouth where it is in game, and the Crag Boars on the road to Kharanos count toward Ragnar's ribs: the valley is never walked back to, about two minutes sooner to level 10 (thanks thmastin).
- One key for the step (Options, Keybindings, AddOns, Polestar, "Step action: NPC, quest item, mob or Hearthstone") does the step's next action, in guide order, the route's own goals before optional ones: targets the NPC to accept from, turn in to or talk to, uses a use goal's quest item or the Hearthstone, targets the step's mobs (each press the next name), else uses the quest's item. It needs no button on screen and, like the buttons, keeps its action in combat until combat ends (thanks CDVolvik and Turesh).
- Class trainers can teach you every new spell you can afford as you open them: Options, Quality of Life, Vendors, Learn new spells (off by default; Shift skips). Riding, weapon, pet and profession trainers are left alone (thanks CDVolvik).
- Darnassus hunters are sent to Jeen'ra Nightrunner, not Ariyell Skyshadow (a weapon merchant), and Polestar knows twenty more class trainers in the capitals and Mulgore (Ander Germaine, Grezz Ragefist, Sian'tsu, Hana Lighthoof...), so learning new spells works at every class trainer.
- Quest rewards that are upgrades can go on by themselves once they reach your bags, out of combat: Options, Questing, Rewards & gear, Wear reward upgrades (off by default; Shift at the turn-in skips). Chat says "Wearing [item] (+12%)" once it is on, and nothing when you cancel its bind confirmation (thanks CDVolvik).
- Grow upward (Options, Guide, Window, Position): the guide window keeps its bottom edge in place, so a longer step extends it up instead of down. Turning it on or off leaves the window where it stands (thanks thmastin).
- Step tips start in full: each step shows the author's tip whole instead of one line, as players asked. A click still folds it for that step; Expand step tips (Options, Guide, Window, What it shows) off keeps them on one line (thanks CDVolvik).
/polestar way 40 60where the game gives no map position (an instance, another continent) says "No position here" instead of how to type the command (thanks meellm)./polestar waytakes decimal commas in both coordinates (/polestar way 45,5 30,2) as well as decimal points, and45,30still reads as x and y. A decimal comma in only one (45,5 30, which could also be 45,5 with the label 30) and coordinates outside 0-100 show the usage line instead of setting a waypoint. So doesx,yfollowed by a numeric label (45,30 50), which reads the same way; write45 30 50instead (thanks meellm).- Quests only a profession's practitioners are offered stay out of sight for everyone else, the way another class's quests do: a Troll Warrior without Enchanting no longer sees A Pain in the Neck in Durotar, and learning the profession (or the rank the quest needs) brings it back. The Teldrassil guide takes Recipe of the Kaldorei after the cooking lesson, since Zarrin offers it to cooks only (thanks AndarKerran).
- Beer Basted Boar Ribs stays on the first visit to Ragnar Thunderbrew in Kharanos and in sight without Cooking: on Forever he offers it to characters who have not learned Cooking (thanks thmastin).
- A quest item's goal says where it comes from: "Kill Grellkin or Grell for Fel Moss" instead of "Collect Fel Moss", and "Collect Handful of Oats from Sack of Oats" for one you pick up, on the goal line and the arrow. Up to two creatures that drop it at 50% or more are named; cloth and other items that drop everywhere are not. Two tips that said "click" for picking up an item now say so (thanks Pynte).
- The guide window no longer fades out on every pull: "In combat" (Options, Guide, Window, Combat) is "Keep visible" by default. "Hide" stays if you chose it; to keep the fade, pick "Fade out" there (thanks Pynte).
- Every place the guide step's mobs and objects spawn is a region on the map now, not one point: the whole stretch they are found in, shaded with an outline, so the Grells carrying Fel Moss are one region over the woods they roam, not small circles hidden under the pins. The goal the arrow follows wears the arrow's colour on the world map and the minimap (cut at its rim); the step's other goals' regions are fainter, on the world map. If the first camp is crowded, the next one is in sight; the next-spot button, or a click on a camp's mark on the world map, moves the arrow there (thanks Pynte).
- Tirisfal Glades: Hides for the Forsaken counts the Vile Fin Murloc Skins (3) on the shore step and the Darkhound Hides (6) with the darkhounds; the two had swapped objectives, so the murloc step showed the hide count (thanks CDVolvik).
- Zephras Isle, Hunters: Taming the Beast tames the Ornery Galestrider with Quel'ana's second rod and the Vuldren Alpha with her third, as the quests ask; the guide had the two beasts the other way round.
- Quest objectives each read their own line of the quest log: Kobold Vermin no longer counts the Kobold Vermin Runt line, two objectives of the same name keep their own counts, and a line that gets its name late (" slain: 0/8") is matched again. After a turn-in the quest counts as done until the log catches up (up to 10 seconds), so its follow-up opens at once instead of the quest flashing as available again (thanks meellm).
/polestar guide <id>takes the id in any case:/polestar guide Forever/Horde/02-The-Barrensopens the Barrens guide (thanks meellm).- Talent plans for Paladins (Questing, Talents;
/pole talents): Holy, Protection and Retribution leveling plans as an ordered list of picks with short notes, and marks on the talent frame: a ring on the next pick when a point is waiting, pick numbers, a flag on points spent off the plan, and a line in each talent's tooltip. Unspent points come from the game, so Talented (Adventure) and other early points count. It never spends a point for you (thanks jnickles85-bit). - Polestar in Spanish (Latin America): on an esMX client the whole interface is in Spanish, in the client's own terms (calabozo, banda, piedra de hogar, mercader, instructor) (thanks CDVolvik).
- Polestar in German: on a deDE client the interface is in German, in the client's own words (Verbreitet, Selten, Rar for the item qualities, Alchemie, NSC, Dungeonkompendium); the report texts and "Complete" stay in English for now (thanks thecodingcortex).
- The arrow walks real paths: round cliffs, water and walls, through the
town gate and down into the mine instead of straight over the edge, thanks
to Shortest Path Forever by Cillian Berragan
(https://github.com/cjber/shortest-path-forever (opens in a new tab)), whose router and walking
map of Zephras Isle he kindly let Polestar use; the walking maps of Eastern
Kingdoms and Kalimdor are Polestar's own, in his format. They come in the
new
Polestar_Navfolder of the zip (install it with the others). Options, Arrow & routes, "Walk real paths" turns it off. - The route picks where to land by the real walk: the walks from the flight masters, docks, portals, inn and teleports near your target are measured on the ground, so a landing whose walk goes round a ridge loses to one whose walk does not (a marker near Astranaar no longer sends you from Sun Rock Retreat straight over the mountains, thanks Fitz). The walks later on the route follow their paths on the map lines and in the journey too, each with its own time, not only the one you are on; zone crossings, cave approaches and the walk on from a guide's "go to the mouth" step stay straight, as the zone data and the guide lay them out.
- Works with Shortest Path Forever: with it installed, Polestar hands it the
route. Each goal goes to it as a stop with the game's own mark (a quest's
"!" or "?", a trainer, a flight master, a dungeon, a boat), a kill or
collect area as a held area that guides you there and then stays quiet
while you work it, and its arrow, route and journey take you there.
Polestar's own arrow, route lines, journey steps, travel button, transport
alerts, map clicks and
/waystep aside, so the two never guide at once, and Polestar's walking maps are not loaded. Clearing or replacing the journey sticks until the guide moves on; nothing is sent in combat (it goes when the fight ends) or for a corpse run, which Shortest Path Forever guides itself. With its journeys switched off, Polestar guides as before. Options, Arrow & routes, "Guide with Shortest Path Forever when it's installed" (on by default; shown only with it installed). While it guides, Polestar's arrow, route and waypoint options are greyed out and say why, and/polestar arrow show,routeandskiplegsay in one line how to get Polestar's arrow back. - A walk is told step by step at the places it passes: "Walk to The Great Lift, Bottom" then "Take The Great Lift", through a zone's gate or into a cave by the zone data's or the guide's own words, each with its own time, the arrow saying each as you reach it, and at the bridges, gates, tunnels, passes and cave and building mouths Polestar's walking maps of Eastern Kingdoms and Kalimdor name. A cave or chain the guide or the zone data already describes keeps its own words, and a goal right after a guide's "go to the mouth" step is still pointed at straight from the mouth, so the arrow never leads onto the hill above a mine. As a ghost the route only walks (no flights, boats or hearth) and the walk crosses water.
- Dungeons' "Show on map" opens the world map the way the game's own buttons do and never in combat: opening it from addon code left the map unable to open in a fight, without its quest markers, until a reload (Shortest Path Forever fixed the same in its 1.8.0).
- Route lines on the world map and the minimap, drawn the way Shortest Path Forever draws them: dots where you walk, following the real path, flights along the way the flight master actually flies, boats, zeppelins and the tram as solid lines, each in its kind's colour; the leg you are on is strong and the legs after it fainter, and the dots stop short of each stop. Every stop along the way is marked: a lift with its own glyph, zone crossings, approach chains and the guide's go-to points with a plain disc; gates, bridges, caves and passes have their own marks. Options, Arrow & routes, "Route lines" (on by default); the old trail dots stand in while it is off.
- When the route says to hearth or teleport, a button under the arrow casts
it (bindable: "Use the route's Hearthstone or teleport"); it appears,
moves and hides only out of combat. Right-click the arrow, or
/polestar skipleg, to skip a leg: "Skip this leg" on a Hearthstone, teleport, flight, ride or portal plans the rest of the trip without it; "Mark this leg done" on a walk or a lift moves on to the next leg. As in Shortest Path Forever. Options, Arrow & routes, "Travel button". - Transport alerts: 30 seconds before your boat, zeppelin or tram comes in while you wait at the dock, and 20 before the next stop on board, a small banner with a countdown, the transport's own sound (the ship's bell, the zeppelin's horn) on the Master channel and a flashing taskbar icon, each with its own switch under Arrow & routes, "Along the route". Never for lifts or in combat. After Shortest Path Forever's alerts.
- The flight map marks the route's flight by its node ID (no longer fooled by a similar name) and draws its hops to it in the accent, as Shortest Path Forever does.
- The journey in the guide window: under the step, every leg of the route numbered with its own time, counting down ("1. Walk to The Great Lift, Top 11:10", "2. Take The Great Lift, leaves in about 0:15 · ride 0:10"), the total time and distance in its header and the destination under it. The leg you are on is marked, finished legs drop off, and a click on the header folds it to the totals; click the current leg to skip it. Shown only when the route has more than one leg. After Shortest Path Forever's journey tracker. Options, Arrow & routes, "Show the journey".
- Go anywhere: Shift-click empty space on the world map or the minimap and the arrow takes you there, routed like any goal and named after the zone; Alt-click works over map icons too (a flight master, a dungeon entrance), named after the icon. Click the same spot again to let it go. With a chat box open, Shift-click still links into chat. Options, Arrow & routes, "Shift-click a map to go there". After Shortest Path Forever.
- Nearby services:
/polestar near repair(or trainer, a profession such asmining, class, reagents, vendor, innkeeper, bank, auction, flight, stable) points the arrow at the quickest one to reach by the route, not just the nearest as the crow flies. The world map's and minimap's tracking menus list them under "Nearby services". After Shortest Path Forever. - Without TomTom installed, "Let other addons set waypoints" (off by
default) lets addons that set TomTom waypoints point Polestar's arrow, and
/way [zone] x y [title]works (when no other addon has it); addons that expect TomTom's own settings may not work with it on. With TomTom installed, "Follow TomTom's arrow" (off by default) makes Polestar's arrow go wherever TomTom's points. Options, Arrow & routes, Other waypoints. After Shortest Path Forever. - A point you picked before dying (a map click,
/way, another addon's) comes back once you are alive, instead of the arrow returning to the guide. - Boats, zeppelins, the Deeprun Tram and lifts run to their real timetables: each loop's period and stops from the transport model the servers use (accelerating, docking, the original servers' measured periods), so a route weighs the real wait and ride. Ride a boat, a zeppelin or the tram and Polestar times it from where you are along the way ("Timed the Booty Bay - Ratchet from your ride"); from then on, for six hours, the arrow says "Next boat in 1:20" or "Boat docked, leaves in 0:40", and the route takes the boat you can actually catch. Untimed, it says "Next boat in about 2:55". If you opt in (Options, Arrow & routes, "Share boat times", off by default), the times you take go to your guild and group on your realm, and theirs come to you. After Shortest Path Forever by Cillian Berragan, whose timetables these are.
- Routes can start with a class teleport you know: a mage's Teleport to a city (with a Rune of Teleportation in the bags), a druid's Teleport: Moonglade, a shaman's Astral Recall to the bound inn, when off cooldown and faster. The Darnassus and Rut'theran Village portals are part of routes too. Options, Arrow & routes, "Class teleports".
- The walk to a guide's NPC or object ends on its floor: Andron Gant in the Undercity's Rogues' Quarter is reached down in the quarter, not on the street above it. Guide goals carry the height of the NPC or object they lead to; where that height finds no route, or the route ends far above or below it, the arrow walks as before. A point you set yourself is unchanged.
- A bug posted in the Discord #bugs forum is tracked on GitHub right away: the post gets "Tracked as #N", and you hear back in it when the bug is fixed, when we decide not to change it, and again when the fix is out in a release.
For guide authors#
category Classfiles a guide under the new Class category (class quest chains, mounts and weapons; pair it with aclassheader), listed after Leveling in the guide menu with the trainer icon. Two header keys say what the guide's goal gives and why, shown first in the guide menu's details:reward item <item> ...(several on one line are a choice of one),reward spell <id> "Name"orreward text <words>, repeatable, andwhy <one line>(format 2; lint warns when a Class guide lacks either).data buildapplies the Forever web database's "Renamed from Y" notes too: a quest whose title is still Y takes Forever's name (itssourcegains<web-db>:title). It also reads the Forever web database's class quest pages, so Forever's XP and level changes reach class quests that no zone list shows.- Goals carry
group(format 2 of the packAn addon of guides for Polestar, built by the compiler from a folder with a pack.json (the folder is a pack too); Polestar's own is Polestar_Guides (pack id guides). format; Polestar 0.2.4 reads it, older versions show such a pack as needing 0.2.4): the compiler derives it from elite kills and elite-only drops, from the solo filter's dungeon and raid quests and from instance maps, and the newgroup [N]modifier (kill 1234 group 3) says it outright. A guide with group content on its route carriesgroup = true.compilenow writes format 2 for every pack. - Lint warns when a guide carries a quest item that vanishes after a while
longer than it lasts:
item 10439 (Durnan's Scalding Mornbrew) lasts 5 minutes, but the route takes about 11:29 from here to the turnin that spends it. It times each goal that spends the item (aturninthat needs it, ause) from the latest goal that got it (anacceptthat hands it over, acollect, abuy;buy x2serves two turn-ins) with the simulator's travel and kill times over the guide's own goals and places. It flags the orders the Dun Morogh, Blasted Lands and Barrens fixes replaced and the Western Plaguelands Arcane Quickeners.data buildnow reads the Forever client's ItemSparse for it: items.json gives such items adurationin seconds (101 today). travel chain --to <map,x,y>drafts an approach chain (a cave, a climb) from recorded walks to that spot: where the walks leave the straight line to it, and the walked path from there as nodes with radii and captions, ready for the local crossings file once checked in game.--sessiondrafts from chosen recordings,--reversecounts ways out as ways in (thanks CDVolvik).- Every goal of a quest that needs a profession (quests.json
skillandskillLevel) carriesprofLine,profNameandprofRank, and Polestar hides it from characters without that profession and rank (older versions ignore the fields). In a Leveling guide lint warns on such a goal unless it isoptionalor the guide trains the profession (and levels it to the quest's rank) first.data buildtakesskillfrom the community quest database's Forever store only: a quest it lists without a required skill has none, whatever the Era quest database's Classic data says, so Beer Basted Boar Ribs, Liquid Stone and five Stranglethorn Fishing Extravaganza quests need no profession (thanks thmastin). record draftwrites a drafted flight asfly "Sentinel Hill", the town the game reports on landing, not the flight point's full name ("Sentinel Hill, Westfall"), so the goal ticks off by itself and lint accepts it; the step's text andgetfpkeep the full name (thanks meellm).quest Q.Oon acollect,killorinteractwarns when objective O is another item, npc or object, and names the index that is this one's (or writequest Qand the index comes from the target). Legging It and Call of Fire list their objectives in the Forever web database's order in the reference data now, so their steps raise no false alarm (thanks CDVolvik).node tools/polestar.js planneropens the route planner in the browser: pick a guide and a character and the route plays on the game's own map (the minimap terrain of every continent,planner artfetches it once), step by step or as the whole 1-60 route, with each step's time split into travel, combat, talking and waiting, the level, XP, quest log and items, the spawn areas and the path walked, in Polestar's own look with the game's icons (class icons for class trainers, item icons for items, the quest markers). Edit mode drags waypoints, adds agotowith a click, bends a travel line into a new labelled waypoint ("Cross the bridge") and edits any goal or step in a form; each edit is written into the.guidefile at once, with undo, a list of changes and a Compile button. It works on another pack given its folder.planner mcpserves the same commands to an AI assistant over MCP (and the page offers them to WebMCP), so an assistant can read a route's timings, change its steps and play them in the open page while you watch. With the navigation grid built (nav build) its walks follow the terrain for the character's class and level (around mountains, into caves and buildings, up lifts, swimming, mounted from 40), cached between runs; a walk the grid cannot route stays a marked straight line, and the map's Layers add Walkable and Arrow aids. The planner, and the navigation grid that grew out of it, are Nivek_Gaming's idea (@Nivek_Gaming on X): thank you, Nivek.- The compiler gives every goal at an NPC or object (accept, turn in, talk,
kill, interact, buy, train, vendor, set home, flight point, learn) the
height of that NPC's or object's spawn as
z, when one stands on the goal's map within 15 yards of its point (docs/GUIDE_FORMAT.md, "Heights"); gotos, collect spots, exploration and smart targets get none.compileprints how many goals got one. The heights come from the server database (GPL-3.0, used as facts), whichdata buildnow writes asdata/forever/spawnz.json; the pack's LICENSE-DATA.txt names it. Packs stay format 2: an older Polestar ignoresz.
For contributors#
Compat.GetPlayerUnitPositionreturns no height when the client reports exactly 0, as Forever's does. Taken as real, it started walking paths on the nearest surface within 10 yd of 0 (from Ratchet's flight master: 20 yd down the slope towards the harbour, then back) and kept Transit from timing a ride on a raised track (a zeppelin at 120 yd). With no height, Walk starts from the ground under the player and Transit matches the ride on the ground plane.node tools/polestar.js travel import --<crossings> <ZoneConnections.lua> --source <text>writes the shipped zone crossings,tools/lib/travel/crossings.json, from an Era map addon's Classic Era zone connections (54 walks between zones, 30 yd arrival radius);travel buildputs them into TravelData.lua as both continents' full crossing data (--shipped noneleaves them out). Zones only Forever has arewild, and a zone's rectangle is Forever's where it redrew the map. The local crossings file still builds Polestar_Travel, which adds to them.- A Feature request issue form beside Bug report and Wrong step, tagged
enhancement, with a field for the Discord thread an idea came from (thanks CDVolvik). talents buildwritesaddon/Polestar/Talents/Builds.luafrom the plans intalents/forever/, andtalents checkreplays every pick (rows, prerequisites, ranks) against the Forever trait tables from the game-table export (thanks jnickles85-bit).node tools/polestar.js nav buildbuilds a navigation grid from the Forever client's own terrain, water and building, cave and doodad collision (fetched from the game-table export like the planner's map art; local only, about 750 MB): where a character can walk, which slopes it can climb, which drops it survives, where it swims and which lifts it can ride.nav pathprints the route between two map points.node tools/polestar.js nav aidsgenerates the arrow's zone crossings, open borders and cave, building and climb approach chains from the navigation grid (data/local/nav/aids.json, the crossings file format; local only, never shipped) and, with--report, measures how many guide legs the arrow walks straight over ground the grid cannot walk, without and with them.nav packnames the walk's caves, building mouths, passes, bridges and tunnels from them (Nav/Chokepoints.lua), and the arrow's walks inside a zone follow the engine's paths. Some cities' gates are not yet found.addon/Polestar_Nav's maps of Eastern Kingdoms and Kalimdor are Polestar's:node tools/polestar.js nav packwrites the navigation grid in his walking-map format (tools/lib/nav/pack.js, a port of hisgen_nav.pyandpack_nav.py: 128 cells a tile, a step between cells open only where one of our links crosses it, floors for stacked surfaces, his HPA* graph; climbs are no step, and a face, steep links and runs of terrain triangles over 50° that Forever's client slides off, only where it is the only way between two places, since his steps are two-way at flat cost; an intra-cluster edge is pruned only via two shorter hops, so pruning never cuts a region), withNav/Chokepoints.lua(tools/lib/nav/chokepoints.js) andPACK.json(grid build, cells, date, sizes, sha256;nav checkandnav pack --checkhold the folder to it);nav vendornow takes only his router and the maps we do not pack (Zephras Isle), never removes Polestar's packed maps, and writesNav.xmlfrom both manifests.API.luaraises the engine's ceilings toPath.cacheKB48 MB andPath.graphKB6 MB for the finer maps. The grid no longer swims fatigue water (MH2O's deep quads; grid tile format 3: rebuild withnav build), stairs in WMOs walk as slopes or a jump, and a point inside a building snaps to its floor.sim compareandsim benchscore the guides without theiroptionalgoals (an optional quest whole);--with-optionalscores them as done, the old way. README, docs/SIMULATION.md and the charts are republished on world 5eef72140b61. The world builder's quest log stays 20 with Forever's 40 (MAXIMUM_NUM_QUESTS_LOG_CAN_ACCEPT) cited: 40 never binds the guides but merges one Alliance package, so it comes with the next world (thanks joelwurtz).- The solo filter's dungeon and raid rule (
instanceQuestintools/lib/sim/solo.js) is shared with the compiler's group content (tools/lib/dsl/group.js), andpreviewrenders the group line (docs/preview/guide-group.svg). - The search speed test no longer pins one machine's speed (it failed under 4 ms on slower Windows machines running the full suite): a keystroke over 25,000 names must cost under 12 scans of the same names in the same run, and grow under 15x from 2,500 names, each the median of several batches, so a per-keystroke index rebuild or a quadratic search still fails it (thanks CDVolvik).
tests/recorder-perf.test.jsholds the RecorderThe optional Polestar_Recorder addon that records play; record import turns its sessions into data/recordings. to Polestar's CPU budgets while it records, without reference dataThe game facts in data/forever/*.json (quests, NPCs, objects, items, zones, map frames and more) that the compiler and the data builds read; built locally by data build. so CI runs it: a walking frame under 1 ms, a burst of questing events with a full quest log and a burst of finds (20 rares, kills and loot windows in one frame) under 4 ms, each the median of 5 rounds. Each is also held against a reference timed in the same round (400 events to a plain handler doing a Recorder handler's work), which holds across machines and lua5.1 or LuaJIT; on Windows, whereos.clock()is wall time, only that is held (thanks CDVolvik).tools/lib/codex/repgates.json: a curated, cited table of the reputation a vendor, giver or quest asks for an item (one row per item and faction, each with its the community wiki or the web database Classic page), whichcodex buildapplies after the client's own gates and before a guide's; a row whose item, vendor or quest the Codex lacks is a build warning. Parity "items: rep" goes from 505 to 682 of 689.codex <web-db>reads the Forever web database's NPC, object and item lists first (1,000 rows a request, by id range, cached underdata/sources/<web-db>/codex/lists/) and fetches a cached page again only when its list row changed, an older parser read it, or it is older than--max-age(default 7 days) and an open parity gap or Forever's own (new or updated): an entity Forever left as in Classic keeps its page. A refresh with every page stale goes from 1,704 page requests to 210 plus 103 list requests (151 the first time).--dry-runcounts a run's requests. The Codex reads the lists for NPC levels only; parity is unchanged.codex buildreads the newest Forever client build the game-table export lists (1.60.1.70374 today, was pinned to 1.60.1.70338), picked asdata buildpicks its--forever-build(pickBuild, tools/lib/data/<tables>.js);--build <version>names one, and offline the newest cached build holding every table the Codex reads is used.meta.jsonrecords the build;codex parityandcodex <web-db>read the client tables of the build the Codex was made from.- A route refresh keeps every fix a guide's header documents
(docs/SIMULATION.md, "Keeping the guides' fixes"; CONTRIBUTING.md, "Fixing
a guide"):
tests/guides-reported.test.jspins each player-reported fix on the compiled guide by behaviour, one case per report (Durotar's Sting of the Scorpid taken to Sarkoth, the arrow through the Den's mouth to Kzan Thornslash and through the mouths of the Burning Blade Coven, Skull Rock, the Coldridge troll cave, the Jasperlode Mine, Shadowthread Cave, Fel Rock and Night Web's Hollow, Dolanaar Delivery and Supplies to Tannok on the way out of the starting glens, Antur Fallow starting the cougar hunt, Bandarion Keep's quests for Paladins only, Coldridge Valley without walking back), andtests/lint-timed.test.jschecks the timed-item rule on the old and fixed orders and on every guide. A data mistake behind a guide fix belongs intools/lib/data/corrections.jsontoo, so the simulator sees it. tools/lib/codex/attunements.json: a cited table naming each attunement's goal (the quests that end it, or the key item) per instance;tools/lib/codex/attunements.jsbuilds the steps from the Codex's quest chains and item sources into the journal pages (attunement), andauditReportcompares them with the the attunement data addonA companion addon that carries data, not code, mostly loaded on demand: Polestar_QuestDB, Polestar_ItemDB, Polestar_Codex, Polestar_Travel.'s for the localdata/local/attunements-audit.md(thanks Shockp).previewrenders the Attunement tab (docs/preview/dungeons-attune.svg).- Translations:
/polestar helpprints every line in the client's language, the show, hide, guides, options and debug commands' too: Init.lua, which loads before the locale file, registered them in English; they register in Core/Commands.lua now.tests/helpers/locale.jsfakes a translation in the addon's tests. - Translations: a word with two meanings has a key per meaning
(
Polestar.LC): the gear slots on the tooltip line are"slot: Back","slot: Chest"and so on, and a dungeon boss that is a chest is"boss: Chest", so they no longer share "Back" with the welcome's button or "Chest" with each other. - Translations: the options pages keep English keys whatever their titles
read, so
/polestar options quests,gear,lookupand the others and/polestar packsopen the right page on a translated client instead of the first one.Polestar.RegisterOptionstakes an optionalkeyfor a page's stable key. - Translations: the travel route's boat, zeppelin and tram captions ("Take
the tram to %s") are written as
L["..."]keys in Nav/Travel.lua like the flight one, so a translator finds them. - Translations: every label kept in a table is written as a literal
L["..."]where it is defined, so a translator finds it by searching: the gear tooltip's reasons, the Dungeons journal's boss roles, attunement kinds, quest ties and Codex messages, Lookup's kinds, standings, factions and statuses, the guide menu's tabs, the group lines, source ranks, the welcome's feature columns, the step details ("from %s", "at %s"), the hand-in notes, the travel map's boat tooltips, the rare alert sounds and/polestar gear's spec source. The item qualities in Lookup are"quality: Rare"and so on, apart from the rare mobs. Nothing changes in English. - The docs say what the code does: ARCHITECTURE (startup, refused guides, waypoints, which code calls the client outside Compat), GUIDE_FORMAT (the guide id rule), README, SIMULATION, THIRD_PARTY and the tools README (thanks CDVolvik).
trainers buildreads the same guides ascompile: Recorder drafts underguides/drafts/and build output underdist/no longer add class trainers totrainers.json(thanks meellm).previewwrites the samedocs/preview/nav-areas.svgon every run, so "Previews are up to date" no longer fails pull requests that don't touch it. The world map's pin pools released their pins inpairs()order over a table keyed by frame, an order of table addresses that changed from run to run (under lua5.1 and LuaJIT alike): a redraw could give a hull to a frame that had made more pieces for another, and the extra pieces renumbered the minimap's mask in the render. The pools release their frames newest first now, so a redraw hands every frame back the pin it showed (thanks CDVolvik).- The guide parser records where each part of a goal line sits
(
goal.spans, non-enumerable, so compiled output is unchanged); the planner's edits (tools/lib/planner/source.js) rewrite only the tokens they change, and every goal line inguides/survives fields -> text -> parse (tests/planner-source.test.js). tools/lib/planner/: map coordinates (geo.js), the playback clock on the simulator's priors (timeline.js), and the map art pipeline (art/: a game-table export CASC file cache, BLP2 and BC1 decoding, a BC1 encoder, the minimap pyramid and the unfogged zone art), each with tests.Nav/Handoff.luahands the target to Shortest Path Forever through its publicShortestPathForever.API(owner "Polestar";NavigateRoutewith one stop,Cancel,Ended,CurrentStop,Subscribewhen itsminorhas it, else polled).Nav.HandedOff()is the one predicate the arrow, trail, travel planner (so route lines, journey steps, the travel button), alerts,Nav/Walk.lua(noPolestar_Navload, no search), map clicks, the TomTom stand-in,/wayandNav/Bridges.luacheck;Nav.Reapply()re-runs them when it flips.Nav.SetTargettakes an optional sixthstopkind (Dungeons, Nearby and the trainer banner pass it;Nav.GetTravelData()listsportals). Tested bytests/nav-handoff.test.jsagainst a fake API written to itsdocs/api.md.Nav/Prompts.lua(the travel button,Nav.prompts; its own combat queue, asQoL.Secure),Nav/Alerts.lua(Nav.alerts, readsns.Transit) andQoL/Flight.lua'sFlight.RouteFlight,SlotOfandDrawRouteadapt Shortest Path Forever'sUI/Arrow.luacast prompt,Journey.luaSkipJourneyStep,UI/Alert.luaandTransport/Taxi.lua; tested bytests/nav-prompts.test.jswith secure frames enforced in combat.Nav/Journey.lua(map-click planning,Polestar.Nav.APIfor other addons:Estimate,Navigate,Cancel,Active; the TomTom stand-in, following TomTom's arrow and/way) andNav/Nearby.lua(nearby services) adapt Shortest Path Forever'sJourney/JourneyInput.lua,Core/API.lua,Core/TomTom.lua,Core/Way.luaandUI/Nearby.lua; docs/ARCHITECTURE.md, "Nav API".Pins.MinimapCursor()andPins.MinimapView()read the minimap's view;qol buildaddsreagentVendorstoQoL/Data.lua.tests/syntax.test.jslets onlyNav/Journey.luawrite theTomTomglobal. Tested bytests/nav-journey.test.js(NAV_QA rows 7, 8, 9, C11, C13, C14).addon/Polestar_Navvendors Shortest Path Forever's router (Routing/PathGrid.lua,Path.lua,PathJobs.lua) and his walking map of Zephras Isle (Nav/Nav2991*.lua) at v1.16.0 (b1ad5bd), GPL-3.0-or-later with Cillian Berragan's copyright (LICENSE,CREDITS.md). The only changes are mechanical: the data globalShortestPathForeverPathDatabecomesPolestarPathData, each file names its upstream file and commit.API.luahands the engine to Polestar asPolestar_NavEngine(upstream'sFind,FindCost,FindMany,Cancel,Busy, plusAvailable(map)). It always reads its ownPolestarPathData, never an installed Shortest Path Forever's tables: his engine evicts decoded entries from them while ours may be searching. With both installed each holds its maps.node tools/polestar.js nav vendor <checkout>redoes the copy from a newer upstream commit (onlyNav<name>.luamap files; each header carries his copyright and the dated notice GPLv3 section 5a asks for) and writesUPSTREAM.json(repo, commit, version, vendored date, every file's sha256);nav checkandtests/nav-vendor.test.jscheck the folder against it, and the test walks Goldshire to the Fargodeep Mine mouth with the real maps (decoded bytests/lua/stub_encoding.lua, a plain-LuaC_EncodingUtil), with checks fromdocs/NAV_QA.md(C2 cancelled searches, C6 Stormwind double-backs, C17 frame slicing, and a Shortest Path Forever copy trimmed mid-search leaving ours untouched).Compat.OpenWorldMap(uiMapID)andCompat.CanOpenWorldMap()open the world map throughC_Map.OpenWorldMap(the globalOpenWorldMaponly on a client without it), never in combat;Dungeons.ShowOnMapuses them, andtests/compat.test.jsrejects any other addon code that opens or moves the world map itself (NAV_QA C3).packandinstallshipPolestar_Navwith Polestar and Polestar_Guides, and Polestar checks its version at login like the data packs'.Nav/Walk.luafollowsPolestar_NavEngine's paths: the walk the arrow is on is searched first (Path.Find, cancelled on a new goal, asked again 25 yd off the path, never in combat), hand-made walks (crossings, chains, a goal after a guidegoto) stay straight, and every failure falls back to the straight arrow; it splits that walk at the liftsNav/Transit.luaknows (crossings, approach chains and guide gotos are legs already; gates, bridges, caves, passes and lift landings come from Polestar_Nav'sPolestarNavChokepoints) (Travel.SplitWalk: pieces withstep,choke, lift rides of kindlift) and publishesNav.GetRouteGeometry().Travel.luaplans timetabled waits (from when the player reaches the dock), class teleports, one-way portals and walk-only ghost routes, addsyards,stops,item/spell,Travel.SkipLeg()andTravel.Progress(); optionnav.navRouting. Tested bytests/nav-spf.test.js(fake engine; NAV_QA C1, C2, K1-K8) andtests/travel-transit.test.js(2, 3, 11, C9, C11, C15).- The planner's walks into the target are priced by the walking engine:
Travel.luahands each plan's places (the player, flight masters, docks, portal ends, the inn, teleport landings, crossing ends and chain mouths;p.places) toWalk.Measure, which runs one reversedPath.FindManyfrom the target to the nearest 16 within 3000 yd (after Shortest Path Forever's goal batch,Journey/JourneySearch.lua, v1.16.0); later plans price those walks by it (p.walkCostfromWalk.Measured, legsengine = "cost"; a target inside a chain keeps its straight link). The batch goes from the target's height (once more without it when it finds nothing). A place with no walk found, or a target with none at all, keeps straight x1.25; the player's measure holds within 50 yd, and farther is measured again with the next plan, meanwhile never priced above the straight distance. Measures are fixed per target (the last 4 kept), soTravel.Remeasuredreplans once when one lands (after a flight or a boat ride) and keeps the route unless the way changes (its flights, rides, hearth, teleports, crossings or chain waypoints), the kept route taking the new walk prices. Every later walk leg that is not hand-made, not a piece of a split walk and not the walk on from a guidegotois searched once after the arrow's own search and the measure (Path.Find, one at a time, the last walk to the target's height, the last 32 kept by their ends and water mode):Walk.LegPath, drawn byGetRouteGeometry, priced byTravel.PricePaths(engine = "path"), which times the rides after it again by their timetables. Nothing is measured or searched in combat or while handed off. Tested bytests/nav-spf.test.js(fake engine: terrain, crossings, later walks, the review's ten points) andtests/nav-e2e.test.js(Ashenvale 40,70 and 35,75 on the real engine; NAV_QA H4). Maps/RouteStrokes.lua(route-line geometry) andMaps/RouteLines.lua(the world map pin and minimap painters) port Shortest Path Forever'sUI/Strokes.lua,UI/FlightLines.luaandUI/Route.lua; they drawNav.GetRouteGeometry()and are tested bytests/nav-route-lines.test.js(dot spacing across bends, stop gaps, receding legs, flight tracks, pool bounds, no allocation per draw).travel buildalso writesMaps/FlightPaths.lua, each flight's TaxiPathNode track simplified to 10 yd (--flight-lua).tests/lua/wow_stub.luagains Line regions.- New glyphs
icon-gate,icon-bridge,icon-cave,icon-liftandicon-pass(tools/media/ui.js) mark chokepoints on the route's stops (a Travel leg'schoke = { kind, name }). Nav/Transit.lua(Polestar.Transit:NextDeparture,NextArrival,Caption,Riding,Lifts,LiftNear,Teleports;NAV_TRANSIT) ports Shortest Path Forever'sTransport/Model.lua,Timetable.lua,Observer.lua,Sync.luaandTeleports.lua; docs/ARCHITECTURE.md, "Timetables, portals and teleports".travel buildwrites the timetables, portals and class teleports into TravelData.lua (tools/lib/travel/timetable.js, after hisgen_routes.pyandgen_transit.py: the the server project transport model over TaxiPathNode, TransportAnimation tracks, spell tables) from the Forever client tables and the server database (tools/lib/travel/<server-db>.js, cached indata/sources/<server-db>/); transports'ab/ba/waitA/waitBnow come from the timetable.Compat.GetPlayerUnitPosition()is the one reader ofUnitPosition,Compat.GetSpellCooldown()reads spell cooldowns. Tested bytests/nav-transit.test.js(NAV_QA C5, C9, K3, 11).- Goal heights:
tools/lib/travel/<server-db>.jsalso extracts every creature and gameobject spawn on maps 0 and 1 (loadSpawnHeights, cached asdata/sources/<server-db>/<rev>/spawnz.json;<table>_spawn_entryfills pooled spawns) anddata buildwrites it asdata/forever/spawnz.json(left out with one warning when--offlinehas no cached dump);tools/lib/dsl/heights.jsgives goalsz(emit.jsGOAL_KEYS, aftery); the Engine's waypoint carries it while it is the goal's own point,Nav.GetTargetWorld()returns it fourth, andNav/Walk.luapasses it toPath.Find, asking once more without it when the search fails or the path ends more than 30 yd from it. Tested bytests/data-spawnz.test.js,tests/dsl-heights.test.js,tests/engine-heights.test.js,tests/nav-spf.test.jsandtests/nav-e2e.test.js(NAV_QA Z1-Z3). tools/discord-bot: the bug bot. It files each Discord #bugs post as an issue (labels from the addon's report: version, guide, locale, Lua errors, the forum tags; screenshots kept on thebug-mediabranch), carries the reporter's follow-ups and edits over, and with the workflowsdiscord-issue-sync.ymlanddiscord-release-notify.ymlanswers the thread when the issue closes, reopens or ships. Setup intools/discord-bot/README.md.
Was this page helpful?