Releases: brues-code/VanillaGuide-Plus
Releases · brues-code/VanillaGuide-Plus
Release list
v1.0.5
VanillaGuide+
v1.0.5 (2026-09-06)
Full Changelog Previous Releases
- Route waypoints through pluggable providers; guard guide-not-loaded state
Navigation.lua wrapped TomTom, Cartographer and MetaMap in one branching
MapPoint/ClearWaypoint pair, and callers gated on the addon globals directly
(StatusFrame, UpdateWaypoint). Adding pfQuest meant another branch in every
one of those places.
Replace that with a provider registry: { label, IsAvailable, Add, Clear },
taking a zone name plus 0-100 map coords. Callers now ask
GetWaypointProvider() instead of naming addons. Selection is auto (first
available, TomTom first as the only cross-zone arrow) or pinned via
db.char.waypointprovider; mapmetamap/mapbwp are gone, MetaMap BWP is its own
provider. ClearWaypoint clears every provider so switching leaves nothing
stale behind.
The pfQuest provider uses pfMap:AddNode with arrow = true, the meta flag
route.lua already reads to force a node into the route planner, then
route.SetTarget to pin the arrow to the guide step rather than the nearest
quest objective. The node texture is pfQuest's own img\fav so its layer is a
known 6 — SetTarget/IsTarget match on layer.
Options gets a cycle button in place of the two MetaMap checkboxes; DiagNav
lists providers and TestWaypoint no longer hardcodes TomTom.
Also fix a crash reachable independently of any of this: self.actions and
self.tags only exist after LoadGuide parses a guide, but GetObjectiveInfo,
GetObjectiveStatus and GetObjectiveTag indexed them unconditionally. Event
handlers reach these with no guide loaded — pfUI's libunitscan calling
TargetByName fired PLAYER_TARGET_CHANGED into the GETFLIGHTPOINT handler and
threw "attempt to index field `actions'". Guard the table, not just the step,
matching GetLootRequirement. ObjectivesFrame's ResetScrollbar (called from
the panel's OnShow) and UpdateOHPanel threw the same way on an unloaded
guide. - Update .pkgmeta
- Create .luarc.json
- Purge unused Deformat-2.0 and Gratuity-2.0 libs
Neither was ever called: the Deformat (DF) and Gratuity locals were
dead, Gratuity's FindDeformat (Deformat's only consumer) is never
invoked, and no other embedded lib depends on either. Also drop the
unused Dewdrop local D -- FuBarPlugin loads Dewdrop itself for the
menu, so the library stays; only our dead reference is removed. - Derive turtleRaces from C_CreatureInfo instead of hardcoding.
v1.0.4
VanillaGuide+
v1.0.4 (2026-08-11)
Full Changelog Previous Releases
- Fix GM login crash; spread guide load across frames
GM/admin characters return an empty UnitFactionGroup, so myfaction was
nil and RegisterGuide re-deferred every guide back into the same list
the PLAYER_ENTERING_WORLD loop was walking with ipairs -- an unbounded
append-while-iterating loop that grew a table until the client crashed
in Lua's array-grow.- GetPlayerFaction: derive faction from the player's base race via
C_CreatureInfo.GetFactionInfo(UnitRaceBase) when UnitFactionGroup is
empty, so GM logins register guides instead of re-deferring forever. - Snapshot and clear deferguides before the register loop so
RegisterGuide can never iterate the list it appends to. - Register guides frame-spread via a coroutine and defer InitializeRoute
briefly past login for load headroom. - Re-enable the RXP / RXP_Hardcore guide packs now the login path is safe.
- GetPlayerFaction: derive faction from the player's base race via
v1.0.3
VanillaGuide+
v1.0.3 (2026-07-07)
Full Changelog Previous Releases
- guide names should match zone names
v1.0.2
VanillaGuide+
v1.0.2 (2026-07-05)
Full Changelog Previous Releases
- Fix login crash: stop loading all guide packs into the fixed Lua pool
The client compiled every guide pack (~5.4 MB of Lua across 418 files) into
vanilla 1.12's fixed Lua memory pool at login. The recently added RXP /
RXP_Hardcore packs (~3.4 MB) pushed it over the edge and, combined with the
pfQuest-turtle DB, exhausted the pool during file load (lmemPool.cpp:53) before
any runtime code ran. Drop RXP/RXP_Hardcore from the TOC startup load; they are
a separate route pack not used by the VanillaGuide routes. Load-on-demand is the
proper long-term fix.
Also fold in fixes/mitigations found while hunting the crash:- LoadNextGuide: terminate the auto-advance chain instead of returning true
unconditionally (dangling/unregistered next zone wrapped to guidelist[1] and
looped forever); add a consecutive-advance cap reset in UpdateStatusFrame. - Swap GetQuestDetails(qid).requirements count to GetNumQuestObjectives(qid)
for the OIDX bounds-check (no table/string materialization). - Cache GetLootRequirement results per guide load (self.lootreqcache).
- Coalesce bursty status refreshes via ScheduleStatusUpdate (C_Timer debounce).
- Throttle guide-load cache warming (WarmCaches) instead of a synchronous burst.
- LoadNextGuide: terminate the auto-advance chain instead of returning true
v1.0.1
VanillaGuide+
v1.0.1 (2026-07-04)
Full Changelog Previous Releases
- Derive item tracking from quest objective data; validate OIDX tags.
GetLootRequirement resolves a step's item requirement from the
authored |L| tag, or for COMPLETE steps from
C_QuestLog.GetQuestDetails' requirements array (the |OIDX| objective,
or the sole objective of a single-objective quest). Bag-count
completion and collect-step name enrichment now cover untagged quest
collects with no guide-data changes.
Guide load also bounds-checks every |OIDX| against the quest's real
objective count and reports out-of-range tags in debug mode. - Key race routing on UnitRaceBase tokens.
GetRouteForRace now defaults to UnitRaceBase("player"), so the
turtleRaces table shrinks to one ChrRaces.dbc-token entry per race
(High Elf arrives as BloodElf, raceID 10) and call sites drop the
UnitRace second-return dance. Legacy spellings still resolve via a
space-stripping fallback. Remove the unused GetRacesForFaction; the
remaining UnitRace calls are localized display only, which also fixes
the "My Race" button showing the raw BloodElf token. - Update README.md
- bump min version of classicapi
v1.0.0
VanillaGuide+
v1.0.0 (2026-07-04)
Full Changelog Previous Releases
- Build the use-item button on ItemButtonTemplate with a tooltip.
Hovering shows the owned item via GameTooltip:SetBagItem when it is
in the bags (charges/cooldown state), falling back to SetItemByID
before it has been looted. - Replace fractional QIDs with QID + OIDX objective tracking.
The hand-authored zone guides encoded "quest 771, objective 2" as
|QID|771.2|, which the parser's integer-only pattern silently drops -
those 639 steps across 107 files had no QID at all and could never
auto-complete. Rewrite them as |QID|771| |OIDX|2| and promote N/K
sub-steps to C when the same file accepts the quest earlier, so the
leaderboard objective actually completes them.
The RXP converters parsed the .complete objective index and dropped
it, and ignored .collect entirely; both now emit |OIDX| and |L| tags.
Document OIDX and the fractional-QID pitfall in the authoring guide. - Fix quest automation races and step-advance deadlocks.
- Resolve automation against the first pending step instead of
self.current, which lags one update behind during NPC interaction - Re-drive the still-open gossip/quest window after the step advances
(auto-offered follow-ups fired before the advance and were missed) - Handle QUEST_GREETING for non-gossip multi-quest NPCs
- Arm the delayed-update gate only for turn-ins; an uncheck via
GoToPreviousObjective wedged it shut for good since the rewound
quest legitimately stays in the log. Time-bound the gate (3s) and
flush it from the ticker as a backstop - Guard CompleteQuestByQid on the raw turnedin table: the handler
records the QID first, which made GetObjectiveStatus hide the
matching step from its own search - Advance on QUEST_REMOVED (new ClassicAPI event) and rewind to the
accept step when a quest is abandoned - Warn once when a turn-in is skipped because the quest was never
accepted, instead of silently jumping ahead
- Resolve automation against the first pending step instead of
- build tools
- Add automatic quest accept and turnin via C_GossipInfo.
New Auto Accept/Turnin toggle (default on, hold SHIFT to suspend). Gossip
windows select the current step quest by QID (title for untagged steps),
requiring isComplete for turnins; QUEST_DETAIL accepts, QUEST_PROGRESS
completes when completable, and QUEST_COMPLETE claims the reward only when
there is no reward choice. Consolidate the scattered QUEST_DETAIL and
QUEST_COMPLETE registrations into TrackEvents. - Add C_QuestLog/C_Item name fallbacks and warm caches at guide load.
GetQuestNameByQid now reads the server-authoritative quest cache first with
pfQuest as fallback, so QID name resolution works without pfDB and always
matches quest log titles. GetItemNameByItemId falls back to
C_Item.GetItemNameByID, which fires the server query on a miss instead of
returning nil forever. LoadGuide pre-requests quest and item data for every
|QID|, |L|, and |U| tag (deduplicated) so later lookups are synchronous, and
the USE-item button icon comes from C_Item.GetItemIconByID. - Replace legacy bag/loot scanning with C_Item, C_Container, and C_Timer.
Count |L|-tagged collect steps via C_Item.GetItemCount on BAG_UPDATE_DELAYED
instead of parsing loot messages; this drops the count+1 fudge and catches
mail/trade/vendor/AH acquisitions. CHAT_MSG_LOOT remains only for legacy BUY
steps without an |L| tag. Delete the texture-matching GetItemCount helper,
switch FindBagSlot and the UseContainerItem hook to
C_Container.GetContainerItemID, replace both OnUpdate poll frames with
C_Timer, and purge the dead QUEST_QUERY_COMPLETE registration.
Also fix five AceEvent-2.0 handler signatures that expected an event-name
first argument (Ace2 passes event args directly): CHAT_MSG_LOOT errored on
every loot, ADDON_LOADED never installed the trainer hook, PLAYER_LEVEL_UP
compared HP against the |LV| level, UNIT_QUEST_LOG_CHANGED and
UI_INFO_MESSAGE never matched. BUY name matching also stripped item-link
brackets so it can actually match step names. - Update README.md
- Detect hearthstone binds via HEARTHSTONE_BOUND instead of chat parsing.
The ClassicAPI event fires on SMSG_BINDPOINTUPDATE (login sync suppressed);
the handler re-reads GetBindLocation() for the SETHEARTH step match. Remove
the now-orphaned home-bind and quest-accepted locale patterns. - Require ClassicAPI v1.5.0+ and switch quest tracking to questID-based APIs.
Replace CHAT_MSG_SYSTEM accept parsing and the GetQuestReward hook with the
QUEST_ACCEPTED / QUEST_TURNED_IN events, matching guide steps by QID tag with
title comparison as fallback for untagged steps. Turnins are now tracked on
server confirmation, including quests outside the loaded guide.
Make quest log lookups QID-first via C_QuestLog.IsOnQuest and
GetQuestIDForLogIndex: GetQuestDetails/GetObjectiveStatus, SmartSkipToStep log
maps, chain inference, quest watch tracking, and IsQuestInLogByQid (no longer
needs pfDB). Remove dead ScanQuestLog/IsQuestInLog/IsQuestComplete helpers.
OnEnable refuses to load below CLASSIC_API_VERSION 10500.