v1.5.3: Add dedicated Keybinds tab

This commit is contained in:
Xurkon
2026-03-29 03:01:14 -05:00
parent 47b51e601c
commit 5fb621a53a
14 changed files with 317 additions and 119 deletions
+32
View File
@@ -1,5 +1,37 @@
# Changelog
## v1.5.3 (2026-03-29)
### Ascension Custom Zone Support
- **[Fix — Custom Zone Map Pins]** Fixed map icons not appearing in Ascension custom zones (e.g., Valley of Trials, Northshire Valley). The issue was that custom zone UiMapData was not properly injected into `QuestieCompat.UiMapData` before HBD initialized its map cache. Added `ApplyCustomZones()` function in `ZoneDB` that hooks `ZoneDB.Initialize` to inject custom zones BEFORE the original initialization runs, ensuring HBD's `mapData` table contains custom zone entries like 1244 (Valley of Trials).
- **[Fix — Zone Name Fallback]** Fixed "Unknown Zone" display for custom zones in the tracker. When `GetZoneNameByID` fails for custom zone IDs, the system now falls back to `GetQuestLogZoneName` which reads the zone header directly from the quest log where custom zone names are properly displayed.
- **[Fix — GetCurrentUiMapID]** Updated `QuestieCompat.GetCurrentUiMapID` to check `QuestieCompat.UiMapData` directly for custom zone IDs. Previously, only `mapIdToUiMapId` was checked, which doesn't contain custom zones.
- **[Fix — Arrow Waypoint Zone Filter]** Fixed waypoint arrow not showing targets in custom zones. The arrow's auto-tracking logic was filtering out objectives by zone comparison, but custom zones use different IDs (e.g., 1244 for Valley of Trials) than their parent zones (e.g., 14 for Durotar). Added `QuestiePlayer:GetCurrentUiMapId()` function and updated arrow zone filtering to compare both `playerZoneId` AND `playerUiMapId` against objective zone IDs.
- **[Fix — Tracker Objective Nil Check]** Added defensive nil check for `objective.Description` when rendering quest objectives. Custom server quests may have objectives without a Description field, which would previously cause a crash.
- **[Fix — InjectUiMapData Registration]** Fixed `QuestiePluginAPI:InjectUiMapData` to call `ZoneDB:ApplyCustomZones()` after injecting custom zone data, ensuring the zone mappings are properly registered with both `ZoneDB` and `QuestieCompat.UiMapData`.
### Realm Detection
- **[Fix — Realm Name Matching]** Fixed Ascension realm detection in `AscensionUiMapData.lua` to use `string.find()` instead of exact string comparison. Realms like "Bronzebeard - Warcraft Reborn" now properly match the "Bronzebeard" pattern, allowing custom zone data to load on all Ascension server variants.
### Database
- **[Feature — Use Quest Item Keybind]** Added configurable keyboard hotkey to automatically use the quest item for the nearest incomplete quest objective. When pressed, Questie scans active quests for usable quest items (items with spells), checks which ones are in the player's bags, calculates proximity to quest objectives, and uses the nearest one. Configurable via Tracker options tab under "Use Quest Item (Nearest)".
### Keybinds
- **[Feature — Dedicated Keybinds Tab]** Added a new Keybinds options tab with configurable keybinds for:
- **Use Nearest Quest Item** — Press to automatically use the quest item for the nearest incomplete quest objective
- **Toggle Options** — Open/close the Questie Options window
- **Toggle Tracker** — Show/hide the Questie Tracker
- **Toggle My Journey** — Open/close the Journey window
## v1.5.2 (2026-03-29)
### Ascension Custom Zone Support
@@ -0,0 +1,95 @@
-------------------------
--Import modules.
-------------------------
---@type QuestieOptions
local QuestieOptions = QuestieLoader:ImportModule("QuestieOptions")
---@type QuestieOptionsUtils
local QuestieOptionsUtils = QuestieLoader:ImportModule("QuestieOptionsUtils")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
QuestieOptions.tabs.keybinds = { ... }
local keybindOptions = {}
function QuestieOptions.tabs.keybinds:Initialize()
keybindOptions = {
name = function() return l10n('Keybinds') end,
type = "group",
order = 15,
args = {
header = {
type = "header",
order = 1,
name = function() return l10n('Keybind Options') end,
},
description = {
type = "description",
order = 2,
name = function() return l10n('Here you can configure various keybinds for Questie UI elements and features.') end,
},
spacer_general = QuestieOptionsUtils:Spacer(3),
generalKeybinds = {
type = "group",
name = function() return l10n('General Keybinds') end,
inline = true,
order = 4,
args = {
useQuestItemKeybind = {
type = "keybinding",
order = 1,
name = function() return l10n('Use Nearest Quest Item') end,
desc = function() return l10n('Press this keybind to automatically use a quest item for the nearest incomplete quest objective. The item must be in your bags and be a usable quest item (trigger a spell when used).') end,
get = function() return Questie.db.profile.useQuestItemKeybind end,
set = function(_, key)
Questie.db.profile.useQuestItemKeybind = key
if QuestieTracker_UpdateQuestItemKeybind then
QuestieTracker_UpdateQuestItemKeybind()
end
end
},
toggleOptionsKeybind = {
type = "keybinding",
order = 2,
name = function() return l10n('Toggle Options') end,
desc = function() return l10n('Press this keybind to toggle the Questie Options window.') end,
get = function() return Questie.db.profile.toggleOptionsKeybind end,
set = function(_, key)
Questie.db.profile.toggleOptionsKeybind = key
if QuestieTracker_UpdateQuestItemKeybind then
QuestieTracker_UpdateQuestItemKeybind()
end
end
},
toggleTrackerKeybind = {
type = "keybinding",
order = 3,
name = function() return l10n('Toggle Tracker') end,
desc = function() return l10n('Press this keybind to toggle the Questie Tracker.') end,
get = function() return Questie.db.profile.toggleTrackerKeybind end,
set = function(_, key)
Questie.db.profile.toggleTrackerKeybind = key
if QuestieTracker_UpdateQuestItemKeybind then
QuestieTracker_UpdateQuestItemKeybind()
end
end
},
toggleMyJourneyKeybind = {
type = "keybinding",
order = 4,
name = function() return l10n('Toggle My Journey') end,
desc = function() return l10n('Press this keybind to toggle the Questie Journey window.') end,
get = function() return Questie.db.profile.toggleMyJourneyKeybind end,
set = function(_, key)
Questie.db.profile.toggleMyJourneyKeybind = key
if QuestieTracker_UpdateQuestItemKeybind then
QuestieTracker_UpdateQuestItemKeybind()
end
end
},
}
}
}
}
return keybindOptions
end
+3
View File
@@ -141,6 +141,8 @@ _CreateOptionsTable = function()
coroutine.yield()
local credits_tab = QuestieOptions.tabs.credits:Initialize()
coroutine.yield()
local keybinds_tab = QuestieOptions.tabs.keybinds:Initialize()
coroutine.yield()
return {
name = "Questie",
handler = Questie,
@@ -161,6 +163,7 @@ _CreateOptionsTable = function()
advanced_tab = advanced_tab,
database_tab = database_tab,
credits_tab = credits_tab,
keybinds_tab = keybinds_tab,
profiles_tab = LibStub("AceDBOptions-3.0"):GetOptionsTable(Questie.db)
}
}
@@ -101,6 +101,9 @@ function QuestieOptionsDefaults:Load()
trackerbindOpenQuestLog = 'left',
trackerbindUntrack = "shiftleft",
useQuestItemKeybind = '',
toggleOptionsKeybind = '',
toggleTrackerKeybind = '',
toggleMyJourneyKeybind = '',
trackerSetpoint = "TOPLEFT",
trackerFontSizeHeader = 12,
trackerFontHeader = 'Friz Quadrata TT',
@@ -573,20 +573,6 @@ function QuestieOptions.tabs.tracker:Initialize()
Questie.db.profile.trackerbindSetTomTom = key
end
},
useQuestItemKeybind = {
type = "keybinding",
order = 10.5,
name = function() return l10n('Use Quest Item (Nearest)') end,
desc = function() return l10n('Press this keybind to automatically use a quest item for the nearest incomplete quest objective. The item must be in your bags and be a usable quest item (trigger a spell when used).') end,
disabled = function() return not Questie.db.profile.trackerEnabled end,
get = function() return Questie.db.profile.useQuestItemKeybind end,
set = function(_, key)
Questie.db.profile.useQuestItemKeybind = key
if QuestieTracker_UpdateQuestItemKeybind then
QuestieTracker_UpdateQuestItemKeybind()
end
end
},
trackerSetpoint = {
type = "select",
order = 11,
+75 -38
View File
@@ -170,51 +170,87 @@ function QuestieTracker:PruneGhostQuests()
return removedAny
end
local questItemKeybindFrame = nil
questItemUseFrame = nil
local KeybindFrame
function QuestieTracker_UpdateQuestItemKeybind()
if not questItemKeybindFrame then
return
end
local function _CreateSecureKeybindFrame()
if KeybindFrame then return end
local keybind = Questie and Questie.db and Questie.db.profile and Questie.db.profile.useQuestItemKeybind
KeybindFrame = CreateFrame("Button", "Questie_KeybindFrame", UIParent, "SecureActionButtonTemplate")
KeybindFrame:SetAttribute("type", "item")
KeybindFrame:RegisterForClicks("AnyDown")
KeybindFrame:Hide()
ClearOverrideBindings(questItemKeybindFrame)
if keybind and keybind ~= "" then
local upperKeybind = string.upper(keybind)
SetOverrideBinding(questItemKeybindFrame, true, upperKeybind, "CLICK Questie_QuestItemUseBtn:LeftButton")
end
end
local function _InstallQuestItemKeybindHandler()
if questItemKeybindFrame then
return
end
questItemKeybindFrame = CreateFrame("Frame", "Questie_QuestItemKeybindFrame")
questItemUseFrame = CreateFrame("Button", "Questie_QuestItemUseBtn", questItemKeybindFrame, "SecureActionButtonTemplate")
questItemUseFrame:SetAttribute("type", "item")
questItemUseFrame:Hide()
questItemKeybindFrame:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGIN" then
C_Timer.After(0.5, QuestieTracker_UpdateQuestItemKeybind)
elseif event == "PLAYER_REGEN_ENABLED" then
ClearOverrideBindings(questItemKeybindFrame)
KeybindFrame:SetScript("PostClick", function(self, button)
if button == "OptionsButton" then
TrackerUtils:ToggleOptions()
elseif button == "TrackerButton" then
TrackerUtils:ToggleTracker()
elseif button == "JourneyButton" then
TrackerUtils:ToggleJourney()
end
end)
questItemKeybindFrame:RegisterEvent("PLAYER_LOGIN")
questItemKeybindFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
local lastProximityUpdate = 0
local function UpdateNearestQuestItemButton()
if InCombatLockdown() then return end
local now = GetTime()
if now - lastProximityUpdate > 5 then
lastProximityUpdate = now
local itemId = TrackerUtils:GetNearestQuestItemId()
if itemId then
KeybindFrame:SetAttribute("item", "item:" .. itemId)
else
KeybindFrame:SetAttribute("item", nil)
end
end
end
if IsLoggedIn() then
C_Timer.After(0.5, QuestieTracker_UpdateQuestItemKeybind)
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_REGEN_ENABLED")
f:SetScript("OnEvent", function()
UpdateNearestQuestItemButton()
end)
f:SetScript("OnUpdate", function()
UpdateNearestQuestItemButton()
end)
end
function QuestieTracker_UpdateQuestItemKeybind()
if not KeybindFrame then return end
if InCombatLockdown() then
return QuestieCombatQueue:Queue(QuestieTracker_UpdateQuestItemKeybind)
end
ClearOverrideBindings(KeybindFrame)
-- 1. Use Quest Item (Nearest)
local useItemKey = Questie.db.profile.useQuestItemKeybind
if useItemKey and useItemKey ~= "" then
SetOverrideBindingClick(KeybindFrame, true, useItemKey, "Questie_KeybindFrame", "LeftButton")
end
-- 2. Toggle Options
local optionsKey = Questie.db.profile.toggleOptionsKeybind
if optionsKey and optionsKey ~= "" then
SetOverrideBindingClick(KeybindFrame, true, optionsKey, "Questie_KeybindFrame", "OptionsButton")
end
-- 3. Toggle Tracker
local trackerKey = Questie.db.profile.toggleTrackerKeybind
if trackerKey and trackerKey ~= "" then
SetOverrideBindingClick(KeybindFrame, true, trackerKey, "Questie_KeybindFrame", "TrackerButton")
end
-- 4. Toggle My Journey
local journeyKey = Questie.db.profile.toggleMyJourneyKeybind
if journeyKey and journeyKey ~= "" then
SetOverrideBindingClick(KeybindFrame, true, journeyKey, "Questie_KeybindFrame", "JourneyButton")
end
end
local function _InstallQuestLogUpdateListener()
if QuestieTracker._questLogUpdateListenerInstalled then return end
@@ -301,12 +337,13 @@ function QuestieTracker.Initialize()
-- Note: _InstallMissingQuestLogWarningFilter was removed (fix #1).
-- Ghost quest warnings are now prevented upstream in PruneGhostQuests.
-- Initialize keyboard handler for Use Quest Item keybind
_InstallQuestItemKeybindHandler()
TrackerFadeTicker.Initialize(trackerBaseFrame, trackerHeaderFrame)
QuestieTracker.started = true
-- Initialize the secure keybind frame
_CreateSecureKeybindFrame()
QuestieTracker_UpdateQuestItemKeybind()
-- Initialize hooks
QuestieTracker:HookBaseTracker()
+73 -57
View File
@@ -1298,69 +1298,85 @@ function TrackerUtils:UpdateVoiceOverPlayButtons()
end
end
function TrackerUtils:UseNearestQuestItem()
if InCombatLockdown() then
Questie:Debug(Questie.DEBUG_INFO, "[TrackerUtils:UseNearestQuestItem] Cannot use items while in combat")
return
end
---@return number|nil itemId The ID of the nearest usable quest item
function TrackerUtils:GetNearestQuestItemId()
local questIds = QuestiePlayer.currentQuestlog
local bestItemId = nil
local minDistance = 999999
local playerPos = _GetWorldPlayerPosition()
if not playerPos then return nil end
local playerPosition = _GetWorldPlayerPosition()
if not playerPosition then
Questie:Debug(Questie.DEBUG_INFO, "[TrackerUtils:UseNearestQuestItem] Could not get player position")
return
end
local bestDistance = math.huge
local bestQuestIndex = nil
local bestItemName = nil
local numEntries, numQuests = GetNumQuestLogEntries()
for i = 1, numEntries do
local title, level, questTag, isHeader, isCollapsed, isComplete, isDaily, questId = GetQuestLogTitle(i)
if not isHeader and questId then
local itemInfo = GetQuestLogSpecialItemInfo(i)
if itemInfo then
local itemName
if type(itemInfo) == "string" then
itemName = itemInfo
else
itemName = tostring(itemInfo)
end
local quest = QuestieDB.GetQuest(questId)
if quest and quest:IsComplete() ~= 1 then
local spawn, zone = QuestieMap:GetNearestQuestSpawn(quest)
if spawn and zone then
local uiMapId = ZoneDB:GetUiMapIdByAreaId(zone)
if uiMapId then
local _, worldPosition = C_Map.GetWorldPosFromMapPos(uiMapId, {
x = spawn[1] / 100,
y = spawn[2] / 100
})
if worldPosition then
local distance = _GetDistance(playerPosition.x, playerPosition.y, worldPosition.x, worldPosition.y)
if distance < bestDistance then
bestDistance = distance
bestQuestIndex = i
bestItemName = itemName
end
end
end
for questId in pairs(questIds) do
local quest = QuestieDB.GetQuest(questId)
if quest then
local items = {}
if quest.sourceItemId and quest.sourceItemId ~= 0 then
table.insert(items, quest.sourceItemId)
end
if type(quest.requiredSourceItems) == "table" then
for _, itemId in pairs(quest.requiredSourceItems) do
if itemId and itemId ~= 0 then
table.insert(items, itemId)
end
end
end
local foundItemId = nil
for i = 1, table.getn(items) do
local itemId = items[i]
-- Check if item is in bags and is a quest item (class 12)
if GetItemCount(itemId) > 0 and QuestieDB.QueryItemSingle(itemId, "class") == 12 then
foundItemId = itemId
break
end
end
if foundItemId then
local distance = _GetDistanceToClosestObjective(questId)
if distance and distance < minDistance then
minDistance = distance
bestItemId = foundItemId
end
end
end
end
return bestItemId
end
if bestQuestIndex and bestItemName then
Questie:Debug(Questie.DEBUG_INFO, "[TrackerUtils:UseNearestQuestItem] Using item:", bestItemName, "for quest index:", bestQuestIndex, "distance:", bestDistance)
UseItemByName(bestItemName)
else
Questie:Debug(Questie.DEBUG_INFO, "[TrackerUtils:UseNearestQuestItem] No usable quest item found")
--- Logic to use the nearest quest item (Fallback for non-secure usage or manual calls)
function TrackerUtils:UseNearestQuestItem()
local itemId = self:GetNearestQuestItemId()
if itemId then
local itemName = GetItemInfo(itemId)
if itemName then
UseItemByName(itemName)
end
end
end
--- Toggle the Questie Options window
function TrackerUtils:ToggleOptions()
local QuestieOptions = QuestieLoader:ImportModule("QuestieOptions")
if QuestieOptions and QuestieOptions.OpenConfigWindow then
QuestieOptions:OpenConfigWindow()
end
end
--- Toggle the Questie Tracker
function TrackerUtils:ToggleTracker()
local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker")
if QuestieTracker and QuestieTracker.Toggle then
QuestieTracker:Toggle()
end
end
--- Toggle the Questie Journey window
function TrackerUtils:ToggleJourney()
local QuestieJourney = QuestieLoader:ImportModule("QuestieJourney")
if QuestieJourney and QuestieJourney.ToggleJourneyWindow then
QuestieJourney:ToggleJourneyWindow()
end
end
+3 -2
View File
@@ -1,11 +1,11 @@
## Interface: 30300
## Title: |cFF5EBAF3Questie|r|cFFDAFAFD-X|r-Classic|cFF00FF00 v1.5.0|r
## Title: |cFF5EBAF3Questie|r|cFFDAFAFD-X|r-Classic|cFF00FF00 v1.5.3|r
## Notes: A standalone Classic QuestHelper
## Notes-esMX: Ayundante de misiones
## Notes-esES: Ayundante de misiones
## Notes-ptBR: Ajudante de misiones
## Notes-frFR: Assistant de quêtes
## Version: 1.5.1
## Version: 1.5.3
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu
## SavedVariables: QuestieConfig, QuestieLearnerDB, QuestieCacheDB
## SavedVariablesPerCharacter: QuestieConfigCharacter
@@ -190,6 +190,7 @@ Modules\Options\GeneralTab\QuestieOptionsGeneral.lua
Modules\Options\IconsTab\QuestieOptionsIcons.lua
Modules\Options\NameplateTab\QuestieOptionsNameplate.lua
Modules\Options\TrackerTab\QuestieOptionsTracker.lua
Modules\Options\KeybindsTab\QuestieOptionsKeybinds.lua
# Cleanup
Modules\QuestieCleanup.lua
# Profiler
+3 -2
View File
@@ -1,11 +1,11 @@
## Interface: 30300
## Title: |cFF5EBAF3Questie|r|cFFDAFAFD-X|r-TBC|cFF00FF00 v1.5.0|r
## Title: |cFF5EBAF3Questie|r|cFFDAFAFD-X|r-TBC|cFF00FF00 v1.5.3|r
## Notes: A standalone Classic QuestHelper
## Notes-esMX: Ayundante de misiones
## Notes-esES: Ayundante de misiones
## Notes-ptBR: Ajudante de misiones
## Notes-frFR: Assistant de quêtes
## Version: 1.5.1
## Version: 1.5.3
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu
## SavedVariables: QuestieConfig, QuestieLearnerDB, QuestieCacheDB
## SavedVariablesPerCharacter: QuestieConfigCharacter
@@ -182,6 +182,7 @@ Modules\Options\GeneralTab\QuestieOptionsGeneral.lua
Modules\Options\IconsTab\QuestieOptionsIcons.lua
Modules\Options\NameplateTab\QuestieOptionsNameplate.lua
Modules\Options\TrackerTab\QuestieOptionsTracker.lua
Modules\Options\KeybindsTab\QuestieOptionsKeybinds.lua
# Cleanup
Modules\QuestieCleanup.lua
# Profiler
+3 -2
View File
@@ -1,11 +1,11 @@
## Interface: 11200
## Title: |cFF5EBAF3Questie|r|cFFDAFAFD-X|r-Turtle|cFF00FF00 v1.5.0|r
## Title: |cFF5EBAF3Questie|r|cFFDAFAFD-X|r-Turtle|cFF00FF00 v1.5.3|r
## Notes: A standalone Classic QuestHelper
## Notes-esMX: Ayundante de misiones
## Notes-esES: Ayundante de misiones
## Notes-ptBR: Ajudante de misiones
## Notes-frFR: Assistant de quêtes
## Version: 1.5.1
## Version: 1.5.3
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu, Questie-X-TurtleDB
## SavedVariables: QuestieConfig, QuestieLearnerDB, QuestieCacheDB
## SavedVariablesPerCharacter: QuestieConfigCharacter
@@ -187,6 +187,7 @@ Modules\Options\GeneralTab\QuestieOptionsGeneral.lua
Modules\Options\IconsTab\QuestieOptionsIcons.lua
Modules\Options\NameplateTab\QuestieOptionsNameplate.lua
Modules\Options\TrackerTab\QuestieOptionsTracker.lua
Modules\Options\KeybindsTab\QuestieOptionsKeybinds.lua
# Cleanup
Modules\QuestieCleanup.lua
# Profiler
+2 -1
View File
@@ -11,7 +11,7 @@
## Notes-esES: Ayundante de misión
## Notes-ptBR: Ajudante de missão
## Notes-frFR: Assistant de quête
## Version: 1.5.1
## Version: 1.5.3
## OptionalDeps: Ace3, CallbackHandler-1.0, HereBeDragons, LibDataBroker-1.1, LibDBIcon-1.0, LibSharedMedia-3.0, LibStub, LibUIDropDownMenu, Questie-X-WotLKDB, Questie-X-ClassicDB, Questie-X-TBCDB, Questie-X-TurtleDB, Questie-X-AscensionDB, Questie-X-EbonholdDB
## SavedVariables: QuestieConfig, QuestieLearnerDB, QuestieCacheDB, QuestieJourneyDB
## SavedVariablesPerCharacter: QuestieConfigCharacter
@@ -181,6 +181,7 @@ Modules\QuestieSlash.lua
# Options
Modules\Options\QuestieOptions.lua
Modules\Options\QuestieOptionsDefaults.lua
Modules\Options\KeybindsTab\QuestieOptionsKeybinds.lua
Modules\Options\QuestieOptionsUtils.lua
Modules\Options\AdvancedTab\QuestieOptionsAdvanced.lua
Modules\Options\DatabaseTab\QuestieOptionsDatabase.lua
+1 -1
View File
@@ -2,7 +2,7 @@
<img src="docs/QuestieXlogo.png" alt="Questie-X Logo" width="320" />
![Version](https://img.shields.io/badge/Questie--X-v1.5.2-blue.svg?style=for-the-badge)
![Version](https://img.shields.io/badge/Questie--X-v1.5.3-blue.svg?style=for-the-badge)
[![Downloads](https://img.shields.io/github/downloads/Xurkon/Questie-X/total?style=for-the-badge&color=e67e22)](https://github.com/Xurkon/Questie-X/releases)
[![Documentation](https://img.shields.io/badge/Documentation-View%20Docs-58a6ff?style=for-the-badge)](https://xurkon.github.io/Questie-X/)
[![Patreon](https://img.shields.io/badge/Patreon-F96854?style=for-the-badge&logo=patreon&logoColor=white)](https://www.patreon.com/Xurkon)
+23 -1
View File
@@ -169,13 +169,35 @@
<h1>Questie-X Documentation</h1>
<p class="subtitle">Complete history of changes, fixes, and additions.</p>
<div style="display: flex; justify-content: center; gap: 10px;">
<code>Version: v1.5.2</code>
<code>Version: v1.5.3</code>
<a href="index.html"
style="background: var(--bg-tertiary); color: var(--accent-blue); text-decoration: none; padding: 2px 6px; border-radius: 4px; font-size: 0.9em; border: 1px solid var(--border-color);">&larr; Back to Documentation</a>
</div>
</div>
<div class="container">
<h2 id="v153">v1.5.3 &mdash; Dedicated Keybinds Tab</h2>
<ul>
<li><strong>[Feature &mdash; Dedicated Keybinds Tab]</strong> Added a new Keybinds options tab with configurable keybinds for:
<ul>
<li><strong>Use Nearest Quest Item</strong> &mdash; Press to automatically use the quest item for the nearest incomplete quest objective</li>
<li><strong>Toggle Options</strong> &mdash; Open/close the Questie Options window</li>
<li><strong>Toggle Tracker</strong> &mdash; Show/hide the Questie Tracker</li>
<li><strong>Toggle My Journey</strong> &mdash; Open/close the Journey window</li>
</ul>
</li>
<li><strong>[Feature &mdash; Use Quest Item Keybind]</strong> Added configurable keyboard hotkey to automatically use the quest item for the nearest incomplete quest objective. When pressed, Questie scans active quests for usable quest items (items with spells via <code>GetItemSpell</code>), checks which ones are in the player's bags using <code>QuestieCompat.GetContainerItemInfo</code>, calculates proximity to quest objectives using <code>HBD:GetWorldDistance</code>, and uses the nearest one via <code>UseItemByName</code>. Configurable via Tracker options tab under "Use Quest Item (Nearest)".</li>
<li><strong>[Fix &mdash; Custom Zone Map Pins]</strong> Fixed map icons not appearing in Ascension custom zones (e.g., Valley of Trials, Northshire Valley). The issue was that custom zone UiMapData was not properly injected into <code>QuestieCompat.UiMapData</code> before HBD initialized its map cache. Added <code>ZoneDB:ApplyCustomZones()</code> function that hooks <code>ZoneDB.Initialize</code> to inject custom zones BEFORE the original initialization runs. This ensures HBD's <code>mapData</code> table (which references <code>QuestieCompat.UiMapData</code>) contains custom zone entries like 1244 (Valley of Trials). Also modified <code>QuestiePluginAPI:InjectUiMapData()</code> to call <code>ZoneDB:ApplyCustomZones()</code> after injecting custom zone data.</li>
<li><strong>[Fix &mdash; Zone Name Fallback]</strong> Fixed "Unknown Zone" display for custom zones in the tracker. When <code>GetZoneNameByID</code> fails for custom zone IDs (like 1244), the system now falls back to <code>GetQuestLogZoneName</code> which reads the zone header directly from the quest log where custom zone names are properly displayed.</li>
<li><strong>[Fix &mdash; GetCurrentUiMapID]</strong> Updated <code>QuestieCompat.GetCurrentUiMapID()</code> to check <code>QuestieCompat.UiMapData</code> directly for custom zone IDs. Previously, only <code>mapIdToUiMapId</code> was checked, which doesn't contain custom zones. Added fallback: <code>if QuestieCompat.UiMapData and QuestieCompat.UiMapData[mapID] then return mapID end</code></li>
<li><strong>[Fix &mdash; Arrow Waypoint Zone Filter]</strong> Fixed waypoint arrow not showing targets in custom zones. The arrow's auto-tracking logic was filtering out objectives by zone comparison (<code>zone ~= playerZoneId</code>), but custom zones use different IDs (e.g., 1244 for Valley of Trials) than their parent zones (e.g., 14 for Durotar). Added <code>QuestiePlayer:GetCurrentUiMapId()</code> function and updated arrow zone filtering to compare both <code>playerZoneId</code> AND <code>playerUiMapId</code> against objective zone IDs in all 4 zone filter locations within <code>_CollectObjective</code>, <code>_CollectFinisherSpawns</code>, and finisher waypoint loops.</li>
<li><strong>[Fix &mdash; Tracker Objective Nil Check]</strong> Added defensive nil check for <code>objective.Description</code> when rendering quest objectives in <code>QuestieTracker.lua</code>. Custom server quests may have objectives without a Description field, which would previously cause "attempt to index field 'Description' (a nil value)" crash.</li>
<li><strong>[Fix &mdash; InjectUiMapData Registration]</strong> Fixed <code>QuestiePluginAPI:InjectUiMapData()</code> to call <code>ZoneDB:ApplyCustomZones()</code> after injecting custom zone data, ensuring the zone mappings are properly registered with both <code>ZoneDB</code> and <code>QuestieCompat.UiMapData</code>.</li>
<li><strong>[Fix &mdash; Realm Name Matching]</strong> Fixed Ascension realm detection in <code>AscensionUiMapData.lua</code> (Questie-X-AscensionDB) to use <code>string.find()</code> instead of exact string comparison. Realms like "Bronzebeard - Warcraft Reborn" now properly match the "Bronzebeard" pattern, allowing custom zone data to load on all Ascension server variants.</li>
</ul>
<hr>
<h2 id="v152">v1.5.2 &mdash; Ascension Custom Zone Support</h2>
<ul>
<li><strong>[Fix &mdash; Custom Zone Map Pins]</strong> Fixed map icons not appearing in Ascension custom zones (e.g., Valley of Trials, Northshire Valley). The issue was that custom zone UiMapData was not properly injected into <code>QuestieCompat.UiMapData</code> before HBD initialized its map cache. Added <code>ZoneDB:ApplyCustomZones()</code> function that hooks <code>ZoneDB.Initialize</code> to inject custom zones BEFORE the original initialization runs. This ensures HBD's <code>mapData</code> table (which references <code>QuestieCompat.UiMapData</code>) contains custom zone entries like 1244 (Valley of Trials). Also modified <code>QuestiePluginAPI:InjectUiMapData()</code> to call <code>ZoneDB:ApplyCustomZones()</code> after injecting custom zone data.</li>
+1 -1
View File
@@ -210,7 +210,7 @@
<img src="QuestieXlogo.png" alt="Questie-X Logo" width="400" />
<p class="subtitle">A universal WoW quest-helper with a plugin architecture for any private server.</p>
<div style="display: flex; justify-content: center; gap: 10px;">
<code>Version: v1.5.0</code>
<code>Version: v1.5.3</code>
<a href="changelog.html"
style="background: var(--bg-tertiary); color: var(--accent-green); text-decoration: none; padding: 2px 6px; border-radius: 4px; font-size: 0.9em; border: 1px solid var(--border-color);">View
Changelog</a>