From fdbfe670d09aeb16dd50f1c2e40e49ad7bd07727 Mon Sep 17 00:00:00 2001 From: James Whitehead II Date: Wed, 24 Nov 2010 21:42:53 +0000 Subject: [PATCH] Initial quest POI integration --- TomTomLite.lua | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) diff --git a/TomTomLite.lua b/TomTomLite.lua index 3f858dc..52f2edf 100644 --- a/TomTomLite.lua +++ b/TomTomLite.lua @@ -16,6 +16,8 @@ function addon:Initialize() self.arrow:SetPoint("CENTER", 0, 0) self.arrow:Hide() + self:RegisterEvent("QUEST_POI_UPDATE", "ObjectivesChanged") + self:RegisterEvent("QUEST_LOG_UPDATE", "ObjectivesChanged") self:RegisterMessage("TOMTOMLITE_WAYPOINT_ADDED") end @@ -38,12 +40,24 @@ function addon:CreateCrazyArrow(name, parent) frame:Hide() + local PI2 = math.pi * 2 + -- Set up the OnUpdate handler frame:SetScript("OnUpdate", function(self, elapsed) + -- Get the current location + local cmap = GetCurrentMapAreaID() + local cx, cy = GetPlayerMapPosition("player") local map, floor, x, y = unpack(self.waypoint) - local distance, angle = addon.mapdata:DistanceAndDirection(map, 0, x, y) - local facing = GetPlayerFacing() + local distance, xd, yd = addon.mapdata:DistanceWithinContinent(cmap, 0, cx, cy, map, floor, x, y) + + local angle = math.atan2(xd, yd) + if angle > 0 then + angle = PI2 - angle + else + angle = -angle + end + local facing = GetPlayerFacing() local faceangle = angle - facing local perc = math.abs((math.pi - math.abs(faceangle)) / math.pi) @@ -97,3 +111,57 @@ function addon:TOMTOMLITE_WAYPOINT_ADDED(msg, waypoint, ...) self.arrow.info:SetFormattedText("%.2f, %.2f - %s", x * 100, y * 100, lzone) self.arrow:Show() end + +function addon:ObjectivesChanged(event, ...) + self:Scan() +end + +local function POIAnchorToCoord(poiframe) + local point, relto, relpoint, x, y = poiframe:GetPoint() + local frame = WorldMapDetailFrame + local width = frame:GetWidth() + local height = frame:GetHeight() + local scale = frame:GetScale() / poiframe:GetScale() + local cx = (x / scale) / width + local cy = (-y / scale) / height + + if cx < 0 or cx > 1 or cy < 0 or cy > 1 then + return nil, nil + end + + local map, floor = GetCurrentMapAreaID() + return map, floor or 0, cx, cy +end + +local function findQuestFrameFromQuestIndex(index) + -- Try to find the correct quest frame + for i = 1, MAX_NUM_QUESTS do + local questFrame = _G["WorldMapQuestFrame" .. i]; + if not questFrame then + break + elseif questFrame.questLogIndex == index then + return questFrame + end + end +end + +function addon:Scan() + -- Get the first quest item in the watch frame + local questIndex = GetQuestIndexForWatch(1) + if not questIndex then + self.arrow:Hide() + return + end + + local title = GetQuestLogTitle(questIndex) + + ShowUIPanel(WorldMapFrame) + HideUIPanel(WorldMapFrame) + + local frame = findQuestFrameFromQuestIndex(questIndex) + if frame then + local map, floor, x, y = POIAnchorToCoord(frame.poiIcon) + self:AddWaypoint(map, floor, x, y, {title = title}) + end +end + -- 1.7.9.5