local addonName, addon = ... local hbd = LibStub("HereBeDragons-2.0") if (not addon.WOW_MAINLINE) then return end -- This function was removed in 11.0.2, so bringing back an implementation -- thanks to Kaliel in his tracker local QuestPOIGetIconInfo = QuestPOIGetIconInfo if not QuestPOIGetIconInfo then QuestPOIGetIconInfo = function(questID) local x, y local completed = C_QuestLog.IsComplete(questID) local mapID = GetQuestUiMapID(questID) if mapID and mapID > 0 then local quests = C_QuestLog.GetQuestsOnMap(mapID) if quests then for _, info in pairs(quests) do if info.questID == questID then x = info.x y = info.y break end end end end return completed, x, y end end local enableClicks = false -- True if waypoint-clicking is enabled to set points local modifier -- A string representing click-modifiers "CAS", etc. local modTbl = { C = IsControlKeyDown, A = IsAltKeyDown, S = IsShiftKeyDown, } local L = TomTomLocals -- Hello, I am the POI waypoint arbiter, I handle the setting and clearing of -- temporary waypoints for the POI integration local lastWaypoint local function SetPOIWaypoint(map, x, y, title) -- Set the new waypoint lastWaypoint = TomTom:AddWaypoint(map, x, y, { title = title, persistent = false, arrivaldistance = TomTom.profile.poi.arrival, }) end local function ClearPOIWaypoint() TomTom:RemoveWaypoint(lastWaypoint) end local function GetQuestIndexForWatch(questWatchIndex) local questID = C_QuestLog.GetQuestIDForQuestWatchIndex(questWatchIndex) local questIndex = questID and C_QuestLog.GetLogIndexForQuestID(questID) return questIndex end -- This function and the related events/hooks are used to automatically -- update the crazy arrow to the closest quest waypoint. local scanning -- This function is not re-entrant, stop that local function ObjectivesChanged() local enableClosest = TomTom.profile.poi.setClosest -- This function should only run if enableClosest is set if not enableClosest then return end -- This function may be called while we are processing this function -- so stop that from happening. if scanning then return else scanning = true end local map = C_Map.GetBestMapForUnit("player") if not map then scanning = false return end local player = C_Map.GetPlayerMapPosition(map, "player") if not player then scanning = false return end local px, py = player:GetXY() -- Bail out if we can't get the player's position if not px or not py or px <= 0 or py <= 0 then scanning = false return end -- THIS CVAR MUST BE CHANGED BACK! local cvar = GetCVarBool("questPOI") SetCVar("questPOI", 1) local closest local closestdist = math.huge -- This function relies on the above CVar being set, and updates the icon -- position information so it can be queried via the API QuestPOIUpdateIcons() -- Scan through every quest that is tracked, and find the closest one local watchIndex = 1 while true do local questIndex = GetQuestIndexForWatch(watchIndex) if not questIndex then break end local qid = C_QuestLog.GetQuestIDForQuestWatchIndex(watchIndex) C_QuestLog.SetSelectedQuest(qid) C_QuestLog.GetNextWaypoint(qid) local completed, x, y, objective = QuestPOIGetIconInfo(qid) local qmap = GetQuestUiMapID(qid) if x and y then local dist = hbd:GetZoneDistance(map, px, py, qmap, x, y) if dist and (dist < closestdist) then closest = watchIndex closestdist = dist end end watchIndex = watchIndex + 1 end if closest then local questIndex = GetQuestIndexForWatch(closest) local title = C_QuestLog.GetTitleForLogIndex(questIndex) local qid = C_QuestLog.GetQuestIDForQuestWatchIndex(closest) local completed, x, y, objective = QuestPOIGetIconInfo(qid) local map = GetQuestUiMapID(qid) if completed then title = "Turn in: " .. title end local setWaypoint = true if lastWaypoint then -- This is a hack that relies on the UID format, do not use this -- in your addons, please. if TomTom:WaypointHasSameMapXYTitle(lastWaypoint, map, x, y, title) then -- This is the same waypoint, do nothing setWaypoint = false else -- This is a new waypoint, clear the previous one ClearPOIWaypoint() end end if setWaypoint then SetPOIWaypoint(map, x, y, title) -- Check and see if the Crazy arrow is empty, and use it if so if TomTom:IsCrazyArrowEmpty() then TomTom:SetCrazyArrow(lastWaypoint, TomTom.profile.poi.arrival, title) end end else -- No closest waypoint was found, so remove one if its already set if lastWaypoint then ClearPOIWaypoint() lastWaypoint = nil end end SetCVar("questPOI", cvar and 1 or 0) scanning = false end local eventFrame = CreateFrame("Frame") eventFrame:RegisterEvent("QUEST_POI_UPDATE") eventFrame:RegisterEvent("QUEST_LOG_UPDATE") eventFrame:SetScript("OnEvent", function(self, event, ...) if event == "QUEST_POI_UPDATE" then ObjectivesChanged() elseif event == "QUEST_LOG_UPDATE" then ObjectivesChanged() end end) function TomTom:EnableDisablePOIIntegration() local enableClosest = TomTom.profile.poi.setClosest if not enableClosest and lastWaypoint then TomTom:RemoveWaypoint(lastWaypoint) lastWaypoint = nil elseif enableClosest then ObjectivesChanged() end end