QoL
Contributor4 min readUpdated
Quality-of-life helpers
On this page
Quest reward marks — QoL, reads Gear#
One system marks the client's reward choices: QoL/Rewards.lua. Gear only
judges items (Gear.IsUpgrade(link) -> upgrade, delta, pct) and ranks
choices for the guideOne route, written as a .guide file and compiled to Lua; its id reads like forever/alliance/human/01-elwynn-forest.'s own reward pick (Gear.RankChoices, used by
Gear/Picks.lua); it draws nothing on the reward panel.
Polestar.QoL.Rewards.ReadChoices(fromLog) -> { { index, link, itemID, count, value, upgrade, delta } }, complete
Polestar.QoL.Rewards.Rank(choices) -> { index, ... } (best first), "upgrade" | "value"
Polestar.QoL.Rewards.Mark() -> true | false | nil -- draw the marks; whether the best was marked (nil: no best)
Polestar.QoL.Rewards.best, .reason -- auto-pick's settled answer on QUEST_COMPLETE- Best = the largest Gear upgrade (delta > 0, Gear enabled); with none,
the highest vendor value (sell price × stack). Auto-pick
(
qol.rewardAutoPick, Shift suppresses, never when the quest costs money) takes it; the marks frame it. - Marks (
qol.rewardHighlight), on eachtype == "choice"button ofQuestInfoFrame.rewardsFrame.RewardButtons, anchored to itsIcon:qol-upgrade(success) on every upgrade in the icon's top-left corner,qol-coin(accent) in its top-right corner on the most valuable of two or more choices (every price known; ties all), a 2px accent frame with a shade keyline around the best of two or more. Drawn afterQuestInfo_Display(detail, reward and quest-log pages), and redrawn onGET_ITEM_INFO_RECEIVED,GEAR_UPDATEDand the setting; cleared onQUEST_FINISHED. An uncached choice is judged from its item ID; the best waits for complete data (or auto-pick's answer). - Tooltipsthe client's
SetQuestItem/SetQuestLogItemrun the item post-calls, so Gear's comparison line ("+12% upgrade · Head") shows on a hovered choice throughPolestar.Hooks. Gear's "Best pick" line (gear.pickTooltip) appears only when its pick is an upgrade, so it never contradicts the coin.gear.rewardsis the guide windowThe small window that shows the current step and its goals while playing (UI/GuideFrame.lua).'s pick line only.
Binding at the guide's inn — QoL, asks the Engine#
QoL/Bind.lua, behind qol.autoBind (Quality of Life → Travel →
Hearthstone; off by default, as it binds for the player). It does one thing:
while the active tab's current stepOne stop in a guide: a title, optional conditions and tip, and at least one goal. has an open sethome goalOne thing to do in a step, as a verb and its arguments (accept 783, kill, goto, turnin...)., it binds the
Hearthstone at the innkeeper that goal names, and nowhere else.
Polestar.QoL.Bind.Wanted(npc) -> bool -- an open sethome goal of the current step binds at npc (Engine.IsSethomeInnkeeper), and the character is not bound at that innkeeper's inn (Nav.BoundInn)
Polestar.QoL.Bind.BinderOption(options) -> option | nil -- the gossip's bind option: icon or overrideIconID 132052 (BinderGossipIcon)
Polestar.QoL.Bind.OnGossip() -> bool -- GOSSIP_SHOW (Toggles.lua: after the flight helper, before skipGossip): picked the bind option- Gossip.At such an innkeeper, the bind option is picked by its icon,
never its text (
QoL.SelectGossip: bygossipOptionID, elseorderIndex). Not with Shift held, and not while the gossip has a quest to pick up or hand in (QoL.HasQuestBusiness, which the flight helper shares): the quest automation goes first and the gossip shows again after it. - Confirmation.Picking the option fires
CONFIRM_BINDER(areaName), registered only while the setting is on (QoL.WhileOn). While the innkeeper ("npc", else the last gossip's NPC: the client may have closed the gossip) is stillWanted, whether the helper or the player picked the option, and Shift was held neither at that gossip nor now, it answers as the popup's Accept does (C_PlayerInteractionManager.ConfirmationInteraction(Enum.PlayerInteractionType.Binder), thenClearInteraction(Binder); Blizzard_StaticPopup_Game GameDialogDefs.lua), closes the "CONFIRM_BINDER" popup on the next frame (QoL.ClosePopup, as for summons; left to the player under the gamepad interface style) and prints "Bound your Hearthstone to <area>.". The Engine completes the goal from the bind as it does for one by hand (HEARTHSTONE_BOUND).
Guide level on the XP bar — QoL/XPMark#
Polestar.QoL.XPMark.Label(level, target) -> text | nil -- pure: "Guide: 11" (the next level), "Guide: 14 (4 levels)"; nil when target <= level
Polestar.QoL.XPMark.Refresh() -- show, move or hide the mark now
Polestar.QoL.XPMark.frame -- the mark, once made- Target (
qol.xpTargetMark, on by default; Quality of Life > Trackers > Experience):Engine.LevelTarget(level), the level the guide holds you to before it moves on. Guide levels are whole levels (the compiler takes no fractions), so the mark is always the end of this level's bar: a 2px accent tick at the bar's right edge, standing 2px above and below it, with the label left of it in the accent colour (outlinedsmalltext). Nothing when the option is off, no guide is open, nolevelgoal lies ahead above your level, or you are at the maximum level. - The game's bar is only read.The experience bar is the one of
StatusTrackingBarManager.barContainerswhosebars[StatusTrackingBarInfo.BarsEnum.Experience]is shown (Blizzard_StatusTrackingBar). The mark is Polestar's own frame made under that bar throughCreateFrameUnder, spanning itsStatusBarone level above itsOverlayFrame(MEDIUM strata, like the bar's own text), so it fades, hides and resizes with the bar and its gamepad width. It takes no mouse: the bar's tooltip stays. No scripts, methods or hooks on the bar; no bar shown (another addon replaced or hid it, the maximum level): no mark, and no error. - Updates, coalesced to the next frame (after the game's bar and the
engine took the same event):
PLAYER_XP_UPDATEandPLAYER_ENTERING_WORLDwhile the option is on (QoL.WhileOn),PLAYER_LEVEL_UP(its level:UnitLevelcan lag the event), step changes (QoL.OnStep), the setting, and the theme's accent.