promotional bannermobile promotional banner

SKQuests

Leveling guide and quest database explorer addon for World of Warcraft 3.3.5a (WotLK), developed for Project Ascension and compatible with any 3.3.5a server. Now ported to SoD

File Details

SKquests SoD v0.5.19.zip

  • R
  • Jun 20, 2026
  • 41.30 MB
  • 3
  • 1.15.8
  • Classic

File Name

SKquests.zip

Supported Versions

  • 1.15.8
## [0.5.19-SoD] - 2026-06-20

### Changed
- **Optimizacion de rendimiento (auditoria general)**: se revisaron ambas copias del addon (Season of Discovery/Classic Era y WotLK 3.3.5a) en busca de trabajo repetido en rutas calientes. Se implementaron dos mejoras:
  - **Tooltip de progreso en objetos del mundo (cofres, hierbas, items de quest en el piso)**: `SKQ_FindQuestProgressForObjectName` recorria todas las misiones activas y armaba una tabla temporal de ids en *cada* llamada al hook global `GameTooltip:SetText` — un hook que se dispara en practicamente todos los tooltips del juego (hechizos, botones de accion, items del bolso), no solo los relacionados con misiones. Ahora ese escaneo se hace una sola vez por refresh del Tracker (cuando realmente cambian las misiones activas) y se guarda en una cache; el hook solo hace una busqueda O(1).
  - **Refresh del Tracker agrupado (debounce)**: el quest log dispara varios eventos casi simultaneos por una sola accion (aceptar/entregar una mision suele disparar `QUEST_LOG_UPDATE` y `UNIT_QUEST_LOG_CHANGED` a la vez). Cada uno disparaba un `T:Refresh()` completo, que es O(n) sobre el quest log e incluye expandir/colapsar todos los encabezados. Ahora esas rafagas se agrupan en un unico `Refresh()` ejecutado en el siguiente frame, sin cambiar el comportamiento visible.

## [0.5.18-SoD] - 2026-06-20

### Fixed
- **Misiones que "desaparecian" del Mini-Tracker hasta mover la ventana**: con el filtro "Mostrar solo zona actual" activo, el tracker ocultaba una misión en cuanto `entry.category` (la zona/encabezado del quest log donde se acepto la misión) dejaba de coincidir exactamente con `GetRealZoneText()`/`GetSubZoneText()` (la zona donde esta el jugador en ese momento) — algo que pasa todo el tiempo, porque es normal alejarse de la zona de origen de una misión para cumplir sus objetivos (entrar a una cueva, cruzar a una subzona o zona vecina, etc.). Ahora una misión con progreso real (algún objetivo en X/Y > 0) queda exenta del filtro de zona y se sigue mostrando aunque el jugador se haya movido.
- **El filtro de zona no se reevaluaba al cambiar de zona**: el frame de eventos del tracker solo escuchaba `QUEST_LOG_UPDATE`/`UNIT_QUEST_LOG_CHANGED`/`QUEST_WATCH_UPDATE`/`PLAYER_ENTERING_WORLD`, así que el filtro "zona actual" solo se volvía a calcular cuando cambiaba el quest log, no cuando el jugador simplemente caminaba a otra zona o subzona. Esto hacía que una misión quedara "atascada" oculta o visible hasta que algún evento de quest log no relacionado disparara un refresh tardío — y mover/arrastrar la ventana del tracker fuerza ese redraw, por eso "reaparecían" al moverlo. Se agregaron `ZONE_CHANGED`, `ZONE_CHANGED_NEW_AREA` y `ZONE_CHANGED_INDOORS` para que el tracker se actualice apenas cambia la zona real.
- **Misiones ocultas a la fuerza por un encabezado "Unknown"**: `T:Refresh()` inicializaba `currentHeader = "Unknown"`, así que cualquier misión escaneada antes de detectar su encabezado real quedaba con `category = "Unknown"` — un valor no vacío que el filtro de zona intentaba comparar contra la zona actual y nunca coincidía, ocultando esa misión permanentemente. Cambiado a `nil`, que el filtro ya trataba correctamente como "sin categoría, no filtrar".
- **Lista del Mini-Tracker se veía vacía sin haber misiones nuevas**: si el contenido se encogía (por el filtro de zona o al completar misiones) el scroll podía quedar más abajo que el nuevo contenido, mostrando una lista en blanco hasta hacer scroll manualmente. Se agregó un reajuste del scroll al final de `RefreshMiniTracker` que lo recorta al máximo válido.

## [0.5.17-SoD] - 2026-06-20

### Fixed
- **Nombres de misiones en español en la pestaña Quests ("Worth It?") del Tasador de XP**: `RecordQuestTurnIn` priorizaba `dd.name_loc` (nombre en español) sobre `dd.name` (inglés) al guardar el nombre de la misión, aunque el resto de esa ventana (pestañas, tooltips) se muestra en inglés para este usuario. Resultado: misiones entregadas mostraban su nombre en español de forma inconsistente con el resto de la UI. Corregido el orden de prioridad (`dd.name or dd.name_loc`), igual que en el resto del módulo. Se agregó una migración única que recorre `db.Quests` y corrige los nombres ya guardados usando `SKquests_DetailDB`, incluyendo registros viejos y corruptos heredados del bug de medición anterior a 0.5.16 (ej. "Sergra Espinoscura" en vez de "Crossroads Conscription" — el nombre de un NPC de entrega capturado por error en vez del nombre real de la misión).

## [0.5.16-SoD] - 2026-06-19

### Fixed
- **Crash al abrir el detalle de una misión**: el nuevo resolver de zona del marcador de jugador (`SKQ_ResolveZoneIdFromRealZone`) asumía que toda entrada de `pfDB.zones.<locale>` era un nombre de zona (string), pero algunas son tablas de datos de continente/escala. Llamar `:lower()` sobre esas tablas rompía `SetQuest` cada vez que se abría una misión. Corregido con una verificación de tipo (`type(nm) == "string"`).
- **Pestaña Quests ("Worth It?") del Tasador de XP siempre en 0 XP / sin actualizarse**: la detección de entrega de misión dependía de `QUEST_COMPLETE` + un hook de `GetQuestReward` + medir el delta de XP del jugador unos milisegundos después, pero en este cliente la XP ya se había otorgado para cuando se medía, dando siempre 0. Reemplazado por el evento `QUEST_TURNED_IN(questID, xpReward, moneyReward)`, que entrega el ID de misión exacto y el XP otorgado directamente del servidor — igual que ya usa de forma confiable la pestaña Stats. Se incluye una migración única que limpia los registros de misiones ya corrompidos por el bug anterior (xp=0 con contador > 0); las nuevas entregas se medirán correctamente.

## [0.5.15-SoD] - 2026-06-19

### Added
- **Marcador de "tu posición" en el mapa interactivo**: el visor de mapa de la ficha de misión ahora muestra un punto azul con la posición real del jugador, actualizado en vivo (cada ~1s, y al instante al hacer zoom/pan o cambiar de misión). Solo se muestra cuando estás físicamente en la misma zona que el mapa mostrado.

### Changed
- **Pestañas del Tasador de XP (Session/Zonas/Quests/Historial/Botín/Stats/Tiempo/NPCs/Mobs)**: ahora tienen fondo y borde propios acordes al tema Dark/Light del addon (antes eran botones sin estilo, solo texto sobre el fondo de la ventana). La pestaña activa se resalta con borde dorado.

### Fixed
- **Coordenadas de NPC siempre en "-" en la pestaña NPCs del Tasador de XP**: `PlayerCoords()` dependía de `GetPlayerMapPosition`/`SetMapToCurrentZone`, APIs eliminadas en el cliente moderno de Classic Era/SoD. Corregido en `SKquests_Stats.lua` usando `C_Map.GetBestMapForUnit` + `C_Map.GetPlayerMapPosition` (con fallback al método clásico). Los NPCs ya registrados sin coordenadas se autocompletan la próxima vez que los vuelvas a inspeccionar. El mismo problema afectaba a `CaptureQuestCoord` en `SKquests_UI.lua`; ambos ahora usan la misma función compartida (`SK:GetPlayerMapCoords()`).

English

## [0.5.19-SoD] - 2026-06-20

### Changed
- **Performance optimization (general audit)**: both copies of the addon (Season of Discovery/Classic Era and WotLK 3.3.5a) were reviewed for repeated work in hot paths. Two improvements were implemented:
  - **Progress tooltip on world objects (chests, herbs, quest items on the ground)**: `SKQ_FindQuestProgressForObjectName` iterated over all active quests and built a temporary table of IDs on *every* call to the global hook `GameTooltip:SetText` — a hook that fires on practically every tooltip in the game (spells, action buttons, bag items), not just quest-related ones. Now that scan is done only once per Tracker refresh (when active quests actually change) and stored in a cache; the hook performs only an O(1) lookup.
  - **Grouped Tracker refresh (debounce)**: the quest log fires several nearly simultaneous events for a single action (accepting/turning in a quest usually triggers `QUEST_LOG_UPDATE` and `UNIT_QUEST_LOG_CHANGED` at the same time). Each one triggered a full `T:Refresh()`, which is O(n) over the quest log and includes expanding/collapsing all headers. Now those bursts are grouped into a single `Refresh()` executed on the next frame, without changing visible behavior.

## [0.5.18-SoD] - 2026-06-20

### Fixed
- **Quests that "disappeared" from the Mini-Tracker until moving the window**: with the "Show only current zone" filter active, the tracker hid a quest as soon as `entry.category` (the zone/header in the quest log where the quest was accepted) stopped matching exactly with `GetRealZoneText()`/`GetSubZoneText()` (the player’s current zone) — something that happens all the time, since it’s normal to move away from a quest’s origin zone to complete its objectives (enter a cave, move to a subzone or neighboring zone, etc.). Now a quest with real progress (any objective with X/Y > 0) is exempt from the zone filter and remains visible even if the player has moved.
- **The zone filter wasn’t re-evaluated on zone change**: the tracker’s event frame only listened to `QUEST_LOG_UPDATE`/`UNIT_QUEST_LOG_CHANGED`/`QUEST_WATCH_UPDATE`/`PLAYER_ENTERING_WORLD`, so the "current zone" filter was only recalculated when the quest log changed, not when the player simply walked into another zone or subzone. This caused a quest to remain "stuck" hidden or visible until some unrelated quest log event triggered a delayed refresh — and moving/dragging the tracker window forces that redraw, which is why they "reappeared" when moving it. `ZONE_CHANGED`, `ZONE_CHANGED_NEW_AREA`, and `ZONE_CHANGED_INDOORS` were added so the tracker updates as soon as the real zone changes.
- **Quests forcibly hidden by an "Unknown" header**: `T:Refresh()` initialized `currentHeader = "Unknown"`, so any quest scanned before detecting its real header ended up with `category = "Unknown"` — a non-empty value that the zone filter tried to compare against the current zone and never matched, permanently hiding that quest. Changed to `nil`, which the filter already handled correctly as "no category, don’t filter".
- **Mini-Tracker list appeared empty without new quests**: if the content shrank (due to the zone filter or completing quests), the scroll could remain below the new content, showing a blank list until manually scrolling. A scroll adjustment was added at the end of `RefreshMiniTracker` to clamp it to the maximum valid range.

## [0.5.17-SoD] - 2026-06-20

### Fixed
- **Spanish quest names in the Quests tab ("Worth It?") of the XP Tracker**: `RecordQuestTurnIn` prioritized `dd.name_loc` (Spanish name) over `dd.name` (English) when saving the quest name, even though the rest of that window (tabs, tooltips) is shown in English for this user. Result: turned-in quests displayed their names in Spanish inconsistently with the rest of the UI. The priority order was fixed (`dd.name or dd.name_loc`), matching the rest of the module. A one-time migration was added that iterates through `db.Quests` and fixes already saved names using `SKquests_DetailDB`, including old and corrupted records inherited from the measurement bug prior to 0.5.16 (e.g., "Sergra Darkthorn" instead of "Crossroads Conscription" — the name of a turn-in NPC captured by mistake instead of the actual quest name).

## [0.5.16-SoD] - 2026-06-19

### Fixed
- **Crash when opening a quest detail**: the new zone resolver for the player marker (`SKQ_ResolveZoneIdFromRealZone`) assumed every entry in `pfDB.zones.<locale>` was a zone name (string), but some are continent/scale data tables. Calling `:lower()` on those tables broke `SetQuest` whenever a quest was opened. Fixed with a type check (`type(nm) == "string"`).
- **Quests tab ("Worth It?") of the XP Tracker always at 0 XP / not updating**: quest turn-in detection depended on `QUEST_COMPLETE` + a hook on `GetQuestReward` + measuring the player’s XP delta a few milliseconds later, but on this client the XP had already been granted by the time it was measured, always yielding 0. Replaced with the `QUEST_TURNED_IN(questID, xpReward, moneyReward)` event, which provides the exact quest ID and XP granted directly from the server — just like the Stats tab already uses reliably. A one-time migration is included to clean up quest records already corrupted by the previous bug (xp=0 with counter > 0); new turn-ins will be measured correctly.

## [0.5.15-SoD] - 2026-06-19

### Added
- **"Your position" marker on the interactive map**: the quest detail map viewer now shows a blue dot with the player’s real position, updated live (every ~1s, and instantly when zooming/panning or changing quests). It only appears when you are physically in the same zone as the displayed map.

### Changed
- **XP Tracker tabs (Session/Zones/Quests/History/Loot/Stats/Time/NPCs/Mobs)**: now have their own background and border matching the addon’s Dark/Light theme (previously they were unstyled buttons, just text over the window background). The active tab is highlighted with a gold border.

### Fixed
- **NPC coordinates always "-" in the NPCs tab of the XP Tracker**: `PlayerCoords()` depended on `GetPlayerMapPosition`/`SetMapToCurrentZone`, APIs removed in the modern Classic Era/SoD client. Fixed in `SKquests_Stats.lua` using `C_Map.GetBestMapForUnit` + `C_Map.GetPlayerMapPosition` (with fallback to the classic method). NPCs already recorded without coordinates will auto-fill the next time you inspect them again. The same issue affected `CaptureQuestCoord` in `SKquests_UI.lua`; both now use the same shared function (`SK:GetPlayerMapCoords()`).