Commit Graph

562 Commits

Author SHA1 Message Date
Narcasung 8089b5f08c fix(tracker): show (Complete) and correct level for DB-less custom quests
Quests with no static DB entry (e.g. Ascension custom quest 175206) made
GetColoredQuestName bail out early on a nil name lookup, before it ever
reached the (Complete)/(Failed) suffix logic. The tracker's existing
fallback for that case never added the suffix either, and it computed
level via QuestieLib.GetTbcLevel (static-DB-only), which silently defaults
to level 1 and then gets scaled from that wrong base by Ascension's level
scaling. Since these quests also auto-collapse once complete (hiding the
tracker's other "Quest Complete!" indicator line), the title was the only
place that could show completion status, and it was silently swallowing it.

- QuestieTracker.lua: the "no DB name" fallback branch now appends
  (Complete) under the same collapseCompletedQuests/isMinimizable rule as
  the normal path, and uses the live quest object's own level instead of
  the static-only lookup.
- QuestieQuest.lua (PopulateQuestLogInfo): re-syncs quest.level from a live
  GetQuestLogTitle scan every update, since QuestieDB.GetQuest caches quest
  objects permanently and QuestLogCache never tracked level at all.
- TrackerUtils.lua (GetCompletionText): guards the Description[1] fallback
  against quests that have no top-level Description array, which was
  throwing and aborting that quest's tracker render entirely.
2026-07-15 17:20:42 +02:00
Narcasung 75bebafaa9 fix(quest-tag): prefer live quest log tag over static QuestTag.lua data
Ascension sometimes reuses a Blizzard questId for custom content whose
group/tag status differs from the original (e.g. 253 "Bride of the
Embalmer" is a real group quest here but zeroed by QuestTag.lua for
TBC+/WotLK clients). Once a quest is accepted, QuestieDB.GetQuestTagInfo
now checks the live questLog entry's questTag before falling back to
questTagCorrections and the static QuestTag.lua table. Compat.lua gains
QuestTagNameToId, a reverse lookup built from questTagToName.
2026-07-15 16:20:51 +02:00
Narcasung 6fad92244c docs: tighten README wording and quest-tag fix summary 2026-07-15 15:57:35 +02:00
Narcasung 62956abb8e fix(map): keep world-map icons inside Magnify's native scroll clip
SetDrawOrder only recognized a standalone "Magnify-WotLK" addon, but this
setup bundles Magnify inside LootCollector (no separate .toc), so the check
always failed and every icon got reparented onto WorldMapFrame -- outside
WorldMapScrollFrame's clipped subtree -- and strata-forced to WorldMapFrame
instead of WorldMapButton, regardless of HBD's earlier correct parenting.
Detect the bundled Magnify via the _G.LootCollectorMagnify global and match
WorldMapButton's strata instead, mirroring LootCollector's own pins. Fixes
icon culling on all 4 edges during both zoom and pan, in normal and
objective-panel map modes.
2026-07-15 13:42:34 +02:00
Narcasung 13cddced16 Tidy README title and force line breaks between credit links
Markdown collapses single newlines into the same line; add explicit
<br> tags so each credit renders on its own line.
2026-07-15 01:16:20 +02:00
Narcasung 93c5e56c1d Replace upstream README with short fork summary and credits
Personal private fork, so the upstream marketing README (badges,
Patreon/PayPal, docs links) isn't relevant here. Keep just the list
of local fixes and credit the fork chain: aron-w/Questie-X,
Xurkon/Questie-X, and the original Questie.
2026-07-15 01:14:20 +02:00
Narcasung c09d30b832 Apply local fixes on top of upstream: tracker desync/drag/title, map icon zoom offset
- Compat/HBD.lua: fix world map pin offset math to account for zoom addons
  (e.g. Magnify) rescaling an ancestor frame instead of WorldMapButton itself;
  cull pins that fall outside the scroll frame's viewport when zoomed
- Compat/Compat.lua: add a short TTL to the chat-parsed objective progress
  cache so a stale entry can't be reapplied to an unrelated quest
- Modules/QuestieLearner.lua: re-point QuestiePlayer.currentQuestlog at the
  rebuilt quest table after invalidating QuestieDB's quest cache, fixing
  Tracker freezing on stale objective progress
- Modules/Tracker/QuestieTracker.lua: fall back to a formatted quest name
  when QuestieDB has no title for a quest (e.g. custom server quests)
- Modules/Tracker/TrackerBaseFrame.lua: force baseFrame movability on drag
  start instead of trusting the async-refreshed IsMovable() state
- Modules/Tracker/TrackerHeaderFrame.lua: wire up drag on the tracker icon
- Modules/Quest/QuestEventHandler.lua: force a full quest log reconciliation
  when the native quest log is opened

Squashed from prior commit-by-commit history to rebuild this working copy
on a clean fork of aron-w/Questie-X (restores the native GitHub fork link).
Per-fix rationale is preserved in project memory
(project_tracker_fixes.md, project_map_icon_offset.md).
2026-07-15 01:02:15 +02:00
Aron 9df64114df fix(quest-links): handle missing quest names 2026-07-11 12:29:21 +02:00
Aron d3795f9ae5 fix(init): persist compiled database metadata in cache 2026-07-05 16:32:11 +02:00
Aron 1f3d5fbb61 perf(init): skip redundant database compilation 2026-07-05 16:26:12 +02:00
Aron 558aeb3888 fix(tracker): update quest progress from unit log events 2026-07-05 16:23:06 +02:00
Xurkon 51fe8bbf5a fix: dedupe waypoint quest giver icons 2026-06-13 10:45:32 -05:00
Xurkon ff906c6f32 chore: remove ignored regression test file 2026-06-13 08:40:03 -05:00
Xurkon 8898dcf96a fix: harden quest poi filtering and objective refresh 2026-06-13 08:30:41 -05:00
Xurkon 12b30cd566 fix: purge lingering completed quest icons 2026-06-13 07:49:04 -05:00
Xurkon 3ebcedb362 fix: allow instant quest text toggle 2026-06-12 23:23:00 -05:00
Xurkon fb3c78351f fix: show learner secondary tooltips without spawns 2026-06-12 23:17:56 -05:00
Xurkon 2ef44eca15 fix: prefer static spawns in auto mode 2026-06-12 22:57:58 -05:00
Xurkon 1b0f145c87 perf(l10n): cache literal (no-arg) translations
Add a locale-keyed cache for no-argument translation lookups so repeated
literal keys resolve without redoing the lookup chain. Reset on locale change
and on locale override application.

Ported from phase3-measured-perf (cherry-pick -x 970dd88), adapted to current
main (hoisted the per-locale cache-table creation; excludes the branch's audit
doc and gitignored test).
2026-06-12 22:54:06 -05:00
Xurkon fb22cd5b2d docs(changelog): note learner tooltips now show in auto mode 2026-06-12 22:46:46 -05:00
Xurkon e96c47a739 fix: show learner tooltips in auto mode 2026-06-12 22:43:10 -05:00
Xurkon 72bff01724 docs(changelog): correct POI entry to match duplicate-suppression approach
The 1.6.4 changelog described an earlier SyncBlizzardObjectivePOIs helper that
was superseded by the per-quest duplicate-POI suppression in QuestieCompat
(commit 70a9934). Update both CHANGELOG.md and the HTML changelog to describe
the actual shipped behavior.
2026-06-12 22:41:13 -05:00
Xurkon 70a99346e6 fix: suppress duplicate native quest POIs 2026-06-12 22:32:24 -05:00
Xurkon a7de3eccb4 docs(changelog): finalize 1.6.4 — Lua 5.0 stage 1, POI sync, cache/prestige fixes
Update the 1.6.4 entry to reflect the consolidated main: add the Lua 5.0
compatibility items (modulo->math.mod, Options {...} typo) and the native
objective POI sync, prestige cache reset, and quest completion cache fixes.
Fix the stale perf-refactor note that referenced the now-removed
phase2-lua50-sweep branch; remaining measured perf work is on
phase3-measured-perf and being cherry-picked one at a time. Mirror into the
HTML changelog and bump its version badge to v1.6.4.
2026-06-12 22:31:52 -05:00
Xurkon 71e172c4d0 fix: sync native objective POIs with Questie icons 2026-06-12 22:20:09 -05:00
Xurkon 9a9002a92e fix: reset player cache on prestige 2026-06-12 21:51:56 -05:00
Xurkon 9fa0164318 fix: clear quest completion cache on refresh 2026-06-12 21:40:23 -05:00
Xurkon 60ed76598a fix: gate felendren behind aggression 2026-06-12 20:54:06 -05:00
Xurkon 0aaffce1e9 compat(lua50): fix Options tab tables {...} typo to {}
QuestieOptions.tabs.{auto,dbm,icons,nameplate} were initialized with {...}
instead of {}. At file scope in Lua 5.1 this silently captures the addon
varargs into the table; in Lua 5.0 it is a parse error. All sibling tabs use
{}. No behavioral change (Initialize repopulates the table).
2026-06-12 18:36:59 -05:00
Xurkon 9dce126735 compat(lua50): replace % modulo operator with math.mod shim
Lua 5.0 (Vanilla 1.12) has no % operator outside string formatting; it is a
parse error. Route the 9 arithmetic modulo sites through the existing math.mod
shim (Compat/Compat.lua) so the addon parses on 5.0 through Retail.

Sites: QuestieDB daily/weekly flag tests, QuestieEvent DMF cycle math,
QuestieLearner GUID/flag math, QuestiePlayer race/class flag tests.
2026-06-12 18:35:31 -05:00
Xurkon 76d4e6e4c8 docs: move recommendations to minimap icon sliders 2026-06-12 18:15:21 -05:00
Xurkon f6b8662884 docs: add tooltip performance recommendations 2026-06-12 18:05:03 -05:00
Xurkon 803904d6ba fix: prevent minimap fade from hiding icons 2026-06-12 18:00:25 -05:00
Xurkon 5c7c63bc18 fix: restore learner spawn and tooltip test coverage 2026-06-12 17:37:00 -05:00
Xurkon e706fa1130 fix: reduce questie fps stutter hot paths 2026-06-12 17:30:48 -05:00
Xurkon 90f1f31474 fix: refresh map tooltip objective progress 2026-06-12 17:23:10 -05:00
Xurkon 493545a4d4 docs(readme): update notice to reflect v1.6.4 maintenance release; bump badge to 1.6.4 2026-06-12 06:51:54 -05:00
Xurkon 568cd44af8 fix: port Phase 1 perf/correctness audit fixes onto main
Brings the still-needed changes from questie-phase1perf that main lacked.
Main already had the Lua 5.0 shims (QuestieLoader bit/strsplit, QuestieStream
and QuestieSerializer math.mod sweep), so those are omitted.

- QuestieNameplate: skip missing entries instead of return-aborting the whole
  activeGUIDs loop (one bad unit no longer stalls every nameplate update)
- QuestieQuest.ClearAllNotes: skip DB-missing quests instead of aborting, so
  remaining quests' notes still get cleared
- QuestieOptionsTracker: fix fadeTickerValue:Cancel -> fadeTicker:Cancel (3x);
  fadeTickerValue is a number, the ticker handle is fadeTicker
- QuestieCommsData: nil-guard GetNPC/GetObject before reading .name
- QuestieAnnounce: bound the alreadySentBandaid dedup cache (reset at 1000)
- QuestieDB.IsComplete: hoist GetQuest into expectedQuest (one call, not two)
- QuestieFramePool/QuestieFrame: drop the dead BaseOnUpdate ticker branch
  (BaseOnUpdate was never defined; behavior was always OnUpdate=nil)
- QuestieLib: document unused questId arg on Ascension_IsScalingEnabled
- Database/Corrections x3: strip stray UTF-8 BOM
- Questie-X.toc: remove duplicate QuestieSlash.lua load line
2026-06-12 06:48:53 -05:00
Xurkon 1f8fa20e00 fix(learner): stop recording bystander kills as your own
Uncredited kills (mobs other players killed that you never engaged)
passed px,py=nil to LearnNPC, whose GetPlayerCoords fallback stored YOUR
position as the mob's spawn and incremented the kill count. Gate spawn
recording (LearnNPC + _StoreGuidSpawnEvidence) on a captured position, so
only credited kills with a real position store a spawn. Bystander kills
no longer pollute coordinates or inflate counts.
2026-06-12 01:30:37 -05:00
Xurkon 152e823c04 fix(quest): skip stale frames in Show/HideQuestIcons instead of crashing
ShowQuestIcons/HideQuestIcons indexed icon (=_G[frameName]) when it can
be nil for a registry entry whose frame was already reset, crashing the
fade pass (attempt to index local 'icon'). Guard icon/icon.data/
icon.data.QuestData and skip stale frames; ShowQuestIcons no longer
error()s on the desync.
2026-06-12 00:57:18 -05:00
Xurkon 49774336cc fix(tooltip): define _TooltipHasLeftLine before its callers
The dedupe helper was a local function defined after
AddUnitDataToTooltip, so that function resolved it as a nil global and
every unit tooltip errored (attempt to call global '_TooltipHasLeftLine').
Moved it above all Add*DataToTooltip functions.
2026-06-12 00:56:37 -05:00
Xurkon 150c59fa77 fix(tooltip): robust NPC/object ID resolution via learner GUID parsers
Expose QuestieLearner:GetIdAndTypeFromGUID / GetObjectIdFromGUID /
GetNpcIdFromGUID (they handle modern dash GUIDs AND legacy 0x hex /
GameObject GUIDs). Tooltips now fall back to these when strsplit('-',guid)
can't parse the GUID, so NPC IDs no longer silently fail to write on
hex-GUID units; the Object ID line resolves from the object's GUID when
its name isn't in the lookup. IDs deduped per tooltip.
2026-06-11 17:53:36 -05:00
Xurkon 5abeff2768 fix(tooltip): keep Item/NPC ID lines from vanishing on re-hover
The ID lines were gated by lastItemId/lastGuid (only added when the
hovered item/unit changed). WoW clears and re-fires OnTooltipSetItem/
OnTooltipSetUnit for the same item/unit and rebuilds the tooltip, so the
gate skipped re-adding the line on the rebuilt tooltip and the ID
disappeared. Add the ID line on every render instead, deduped per
tooltip via _TooltipHasLeftLine so it shows exactly once.
2026-06-11 16:37:40 -05:00
Xurkon 7bd14b80fc feat(learner): exclude critters; fix Sunstrider object mis-keyed to areaId 3430
- Critters are never quest-relevant. Added a static CRITTER_NPC_SET (common
  classic critters) plus runtime detection via UnitCreatureType on
  mouseover/target (covers Ascension custom critters). LearnNPC and the kill
  handler skip critters; InjectLearnedData purges already-recorded ones; and
  critters are purged on sight when a unit token is available.
- Object/NPC spawns mis-stored under Eversong parent areaId 3430 (e.g. object
  180516 'Shrine of Dath'Remar' on Sunstrider) now migrate to uiMapId 1241,
  along with the [9]/[5] home-zone field. Legit Eversong data is keyed 1941,
  so any 3430 key is mis-stored Sunstrider data.

Verified in Tests/QuestieLearnerCritterPurge_spec.lua.
2026-06-11 16:29:41 -05:00
Xurkon 32c538de15 fix(learner): stop InjectLearnedData from corrupting saved spawns
Two bugs made saved learner spawns collapse to one pin on every login:

1. The spawn zone-key migration was inverted: it ran
   GetAreaIdByUiMapId(1241) -> Eversong parent areaId 3430 and moved
   Sunstrider coords there (wrong map / NE corner), deduping distinct
   coords via InsertIfNewBucket along the way. Now it converts only
   legacy areaId keys FORWARD to the canonical uiMapId and leaves uiMapId
   keys untouched. Same for the [9]/[5] home-zone fields.

2. Sanitize de-duplicated coords with the flat COORD_GRID (2.0) instead
   of the per-zone grid, collapsing Sunstrider's tightly-packed spawns
   (grid 0.5). Now uses GetCoordGridForZone(zoneId).

Both rewrote learned.npcs in place, persisting the damage to
SavedVariables. Regression test in QuestieLearnerMultiSpawn_spec.lua.
2026-06-11 15:49:29 -05:00
Xurkon 6355545890 fix(learner): show every learned pin on Sunstrider, not a clustered dot
A prior change (dd630fd) kept clustering enabled on Sunstrider Isle in
learner mode to avoid pin fan-out, but that collapsed several distinct
learned coordinates (e.g. 7 Arcane Wraith spots) into a single pin --
breaking the DB-building workflow where every learned spawn must be
visible. The SavedVariables data was correct the whole time; this was a
display regression. Sunstrider (1241) now shows every distinct pin by
default in all data-source modes; consolidation only happens when the
player explicitly raises the Dense Pin Clustering Aggressiveness knob.
2026-06-11 15:34:04 -05:00
Xurkon 900ff4a4e4 fix(map): extend minimap fade range slider 2026-06-11 15:17:18 -05:00
Xurkon eebd26cad8 fix(learner): restore incomplete learner spawn lookups 2026-06-11 15:13:35 -05:00
Xurkon 82c2e41400 fix(learner): preserve quest giver spawn overrides 2026-06-11 11:58:34 -05:00
Xurkon 682dd1fa08 chore: untrack local test specs 2026-06-11 11:53:29 -05:00