From dad5f16d185bdc8ba42f29db733f117f211e2bc7 Mon Sep 17 00:00:00 2001 From: James Whitehead Ii Date: Tue, 7 Aug 2007 22:45:46 +0000 Subject: [PATCH] * eol-style native --- TomTom.lua | 1272 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 636 insertions(+), 636 deletions(-) diff --git a/TomTom.lua b/TomTom.lua index bd1b76d..7478302 100755 --- a/TomTom.lua +++ b/TomTom.lua @@ -1,224 +1,224 @@ -local L = setmetatable({ - TOOLTIP_TITLE = "TomTom"; - TOOLTIP_SUBTITLE = "Zone Coordinates"; - TOOLTIP_LOCKED = "This window is locked in place."; - TOOLTIP_LEFTCLICK = "Left-click and drag to move this window."; - TOOLTIP_RIGHTCLICK = "Right-click to toggle the options panel."; -}, {__index=function(t,k) return k end}) - -TomTom = {} -local DongleFrames = DongleStub("DongleFrames-1.0") -local Astrolabe = DongleStub("Astrolabe-0.4") -local profile - -function TomTom:Initialize() - self.defaults = { - profile = { - clearwaypoints = true, - show = true, - lock = false, - worldmap = true, - cursor = true, - tooltip = true, - alpha = 1, - notes = { - }, - } - } - - self.db = self:InitializeDB("TomTomDB", self.defaults) - profile = self.db.profile - self:CreateSlashCommands() - self:CreateCoordWindows() - self:RegisterEvent("PLAYER_LEAVING_WORLD") - self:RegisterEvent("PLAYER_ENTERING_WORLD") - self:RegisterEvent("ZONE_CHANGED_NEW_AREA") +local L = setmetatable({ + TOOLTIP_TITLE = "TomTom"; + TOOLTIP_SUBTITLE = "Zone Coordinates"; + TOOLTIP_LOCKED = "This window is locked in place."; + TOOLTIP_LEFTCLICK = "Left-click and drag to move this window."; + TOOLTIP_RIGHTCLICK = "Right-click to toggle the options panel."; +}, {__index=function(t,k) return k end}) + +TomTom = {} +local DongleFrames = DongleStub("DongleFrames-1.0") +local Astrolabe = DongleStub("Astrolabe-0.4") +local profile + +function TomTom:Initialize() + self.defaults = { + profile = { + clearwaypoints = true, + show = true, + lock = false, + worldmap = true, + cursor = true, + tooltip = true, + alpha = 1, + notes = { + }, + } + } + + self.db = self:InitializeDB("TomTomDB", self.defaults) + profile = self.db.profile + self:CreateSlashCommands() + self:CreateCoordWindows() + self:RegisterEvent("PLAYER_LEAVING_WORLD") + self:RegisterEvent("PLAYER_ENTERING_WORLD") + self:RegisterEvent("ZONE_CHANGED_NEW_AREA") self:RegisterEvent("WORLD_MAP_UPDATE") - self:RegisterEvent("CHAT_MSG_ADDON") -end - -function TomTom:Enable() - if not profile.notes then return end - for _,wp in pairs(profile.notes) do - self:AddZWaypoint(wp.c, wp.z, wp.x*100, wp.y*100, wp.desc, true) - end -end - -function TomTom:Disable() - local notes = {} - for _, wp in pairs(self.w_points) do - table.insert(notes, {["c"] = wp.c, ['z'] = wp.z, ['x'] = wp.x, ['y'] = wp.y, ['desc'] = wp.icon.label}) - end - profile.notes = notes -end + self:RegisterEvent("CHAT_MSG_ADDON") +end + +function TomTom:Enable() + if not profile.notes then return end + for _,wp in pairs(profile.notes) do + self:AddZWaypoint(wp.c, wp.z, wp.x*100, wp.y*100, wp.desc, true) + end +end + +function TomTom:Disable() + local notes = {} + for _, wp in pairs(self.w_points) do + table.insert(notes, {["c"] = wp.c, ['z'] = wp.z, ['x'] = wp.x, ['y'] = wp.y, ['desc'] = wp.icon.label}) + end + profile.notes = notes +end local function GetCurrentCursorPosition() - -- Coordinate calculation code taken from CT_MapMod - local cX, cY = GetCursorPosition() - local ceX, ceY = WorldMapFrame:GetCenter() - local wmfw, wmfh = WorldMapButton:GetWidth(), WorldMapButton:GetHeight() - - cX = ( ( ( cX / WorldMapFrame:GetScale() ) - ( ceX - wmfw / 2 ) ) / wmfw + 22/10000 ) + -- Coordinate calculation code taken from CT_MapMod + local cX, cY = GetCursorPosition() + local ceX, ceY = WorldMapFrame:GetCenter() + local wmfw, wmfh = WorldMapButton:GetWidth(), WorldMapButton:GetHeight() + + cX = ( ( ( cX / WorldMapFrame:GetScale() ) - ( ceX - wmfw / 2 ) ) / wmfw + 22/10000 ) cY = ( ( ( ( ceY + wmfh / 2 ) - ( cY / WorldMapFrame:GetScale() ) ) / wmfh ) - 262/10000 ) return cX, cY end - -function TomTom:CreateCoordWindows() - -- Create the draggable frame, as well as the world map coords - local function OnMouseDown(self,button) - if button == "LeftButton" and not profile.lock then - self:StartMoving() - self.isMoving = true - end - end - - local function OnMouseUp(self,button) - if self.isMoving then - self:StopMovingOrSizing() - self.isMoving = false - end - end - - local function OnEnter(self) - if profile.tooltip then - GameTooltip:SetOwner(self, "ANCHOR_CURSOR") - GameTooltip:SetText(L["TOOLTIP_TITLE"]) - GameTooltip:AddLine(L["TOOLTIP_SUBTITLE"]) - if profile.lock then - GameTooltip:AddLine(L["TOOLTIP_LOCKED"]) - else - GameTooltip:AddLine(L["TOOLTIP_LEFTCLICK"]) - end - GameTooltipTextLeft1:SetTextColor(1,1,1); - GameTooltipTextLeft2:SetTextColor(1,1,1); - GameTooltip:Show() - end - end - - local function OnLeave(self) - GameTooltip:Hide(); - end - - local function CoordFrame_OnUpdate(self, elapsed) - local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() - local text - if not x or not y then - self:Hide() - else - self.Text:SetText(string.format("%.2f, %.2f", x*100, y*100)) - end - end - - local function WorldMap_OnUpdate(self, elapsed) - local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() - - if not x or not y then - self.Player:ZOOM_OUT_BUTTON_TEXTSetText("Player: ---") - else - self.Player:SetText(string.format("Player: %.2f, %.2f", x*100, y*100)) - end + +function TomTom:CreateCoordWindows() + -- Create the draggable frame, as well as the world map coords + local function OnMouseDown(self,button) + if button == "LeftButton" and not profile.lock then + self:StartMoving() + self.isMoving = true + end + end + + local function OnMouseUp(self,button) + if self.isMoving then + self:StopMovingOrSizing() + self.isMoving = false + end + end + + local function OnEnter(self) + if profile.tooltip then + GameTooltip:SetOwner(self, "ANCHOR_CURSOR") + GameTooltip:SetText(L["TOOLTIP_TITLE"]) + GameTooltip:AddLine(L["TOOLTIP_SUBTITLE"]) + if profile.lock then + GameTooltip:AddLine(L["TOOLTIP_LOCKED"]) + else + GameTooltip:AddLine(L["TOOLTIP_LEFTCLICK"]) + end + GameTooltipTextLeft1:SetTextColor(1,1,1); + GameTooltipTextLeft2:SetTextColor(1,1,1); + GameTooltip:Show() + end + end + + local function OnLeave(self) + GameTooltip:Hide(); + end + + local function CoordFrame_OnUpdate(self, elapsed) + local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() + local text + if not x or not y then + self:Hide() + else + self.Text:SetText(string.format("%.2f, %.2f", x*100, y*100)) + end + end + + local function WorldMap_OnUpdate(self, elapsed) + local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() + + if not x or not y then + self.Player:ZOOM_OUT_BUTTON_TEXTSetText("Player: ---") + else + self.Player:SetText(string.format("Player: %.2f, %.2f", x*100, y*100)) + end local cX, cY = GetCurrentCursorPosition() - - if not cX or not cY then - self.Cursor:SetText("Cursor: ---") - else - self.Cursor:SetText(string.format("Cursor: %.2f, %.2f", cX*100, cY*100)) - end - end - - -- Create TomTomFrame, which is the coordinate display - DongleFrames:Create("n=TomTomFrame#p=UIParent#size=100,32#toplevel#strata=HIGH#mouse#movable#clamp", "CENTER", 0, 0) - TomTomFrame.Text = DongleFrames:Create("p=TomTomFrame#t=FontString#inh=GameFontNormal", "CENTER", 0, 0) - TomTomFrame:SetBackdrop({ - bgFile = "Interface\\ChatFrame\\ChatFrameBackground", - edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", - edgeSize = 16, - insets = {left = 4, right = 4, top = 4, bottom = 4}, - }) - TomTomFrame:SetBackdropColor(0,0,0,0.4) - TomTomFrame:SetBackdropBorderColor(1,0.8,0,0.8) - TomTomFrame:SetScript("OnMouseDown", OnMouseDown) - TomTomFrame:SetScript("OnMouseUp", OnMouseUp) - TomTomFrame:SetScript("OnHide", OnMouseUp) - TomTomFrame:SetScript("OnEnter", OnEnter) - TomTomFrame:SetScript("OnLeave", OnLeave) - TomTomFrame:SetScript("OnUpdate", CoordFrame_OnUpdate) - - if not profile.show then - TomTomFrame:Hide() - end - - -- Create TomTomWorldFrame, which is anchored to the center of the WorldMap - DongleFrames:Create("n=TomTomWorldFrame#p=WorldMapFrame") - TomTomWorldFrame.Player = DongleFrames:Create("p=TomTomWorldFrame#t=FontString#inh=GameFontHighlightSmall", "BOTTOM", WorldMapPositioningGuide, "BOTTOM", -100, 11) - TomTomWorldFrame.Cursor = DongleFrames:Create("p=TomTomWorldFrame#t=FontString#inh=GameFontHighlightSmall", "BOTTOM", WorldMapPositioningGuide, "BOTTOM", 100, 11) - TomTomWorldFrame:SetScript("OnUpdate", WorldMap_OnUpdate) - - if not profile.worldmap then TomTomWorldFrame:Hide() end - - self.frame = CreateFrame("Frame") - -end - -local count = 0 -local tooltip_icon -local function Tooltip_OnUpdate(self, elapsed) - count = count + elapsed - if count >= 0.1 then - local tooltip = TomTom.tooltip - local dist,x,y = Astrolabe:GetDistanceToIcon(tooltip_icon) - TomTomTooltipTextLeft3:SetText(("%s yards away"):format(math.floor(dist)), 1, 1 ,1) - end -end - -local function MinimapIcon_OnEnter(self) - local tooltip = TomTom.tooltip - tooltip:SetScale(UIParent:GetEffectiveScale()) - tooltip:SetOwner(self, "ANCHOR_CURSOR") - tooltip_icon = self - if self.label then - tooltip:SetText("TomTom: " .. self.label .. "\n") - else - tooltip:SetText("TomTom Waypoint\n") - end - - local dist,x,y = Astrolabe:GetDistanceToIcon(self) - - tooltip:AddLine(self.coord, 1, 1, 1) - tooltip:AddLine(("%s yards away"):format(math.floor(dist)), 1, 1 ,1) - tooltip:AddLine(self.zone, 0.7, 0.7, 0.7) - tooltip:Show() - tooltip:SetScript("OnUpdate", Tooltip_OnUpdate) -end - -local function MinimapIcon_OnLeave(self) - local tooltip = TomTom.tooltip - tooltip_icon = nil - tooltip:Hide() - tooltip:SetScript("OnUpdate", nil) -end - -local function DropDown_RemoveWaypoint() - local icon = TomTomDropDown.icon - - if icon.mpair then - icon = icon.mpair - end - - Astrolabe:RemoveIconFromMinimap(icon) - - icon.pair:Hide() - table.insert(TomTom.worldmapIcons, icon.pair) - - for idx,entry in ipairs(TomTom.w_points) do - local w_icon = entry.icon - if icon.pair == w_icon then - table.remove(TomTom.w_points, idx) - break - end - end + + if not cX or not cY then + self.Cursor:SetText("Cursor: ---") + else + self.Cursor:SetText(string.format("Cursor: %.2f, %.2f", cX*100, cY*100)) + end + end + + -- Create TomTomFrame, which is the coordinate display + DongleFrames:Create("n=TomTomFrame#p=UIParent#size=100,32#toplevel#strata=HIGH#mouse#movable#clamp", "CENTER", 0, 0) + TomTomFrame.Text = DongleFrames:Create("p=TomTomFrame#t=FontString#inh=GameFontNormal", "CENTER", 0, 0) + TomTomFrame:SetBackdrop({ + bgFile = "Interface\\ChatFrame\\ChatFrameBackground", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + edgeSize = 16, + insets = {left = 4, right = 4, top = 4, bottom = 4}, + }) + TomTomFrame:SetBackdropColor(0,0,0,0.4) + TomTomFrame:SetBackdropBorderColor(1,0.8,0,0.8) + TomTomFrame:SetScript("OnMouseDown", OnMouseDown) + TomTomFrame:SetScript("OnMouseUp", OnMouseUp) + TomTomFrame:SetScript("OnHide", OnMouseUp) + TomTomFrame:SetScript("OnEnter", OnEnter) + TomTomFrame:SetScript("OnLeave", OnLeave) + TomTomFrame:SetScript("OnUpdate", CoordFrame_OnUpdate) + + if not profile.show then + TomTomFrame:Hide() + end + + -- Create TomTomWorldFrame, which is anchored to the center of the WorldMap + DongleFrames:Create("n=TomTomWorldFrame#p=WorldMapFrame") + TomTomWorldFrame.Player = DongleFrames:Create("p=TomTomWorldFrame#t=FontString#inh=GameFontHighlightSmall", "BOTTOM", WorldMapPositioningGuide, "BOTTOM", -100, 11) + TomTomWorldFrame.Cursor = DongleFrames:Create("p=TomTomWorldFrame#t=FontString#inh=GameFontHighlightSmall", "BOTTOM", WorldMapPositioningGuide, "BOTTOM", 100, 11) + TomTomWorldFrame:SetScript("OnUpdate", WorldMap_OnUpdate) + + if not profile.worldmap then TomTomWorldFrame:Hide() end + + self.frame = CreateFrame("Frame") + +end + +local count = 0 +local tooltip_icon +local function Tooltip_OnUpdate(self, elapsed) + count = count + elapsed + if count >= 0.1 then + local tooltip = TomTom.tooltip + local dist,x,y = Astrolabe:GetDistanceToIcon(tooltip_icon) + TomTomTooltipTextLeft3:SetText(("%s yards away"):format(math.floor(dist)), 1, 1 ,1) + end +end + +local function MinimapIcon_OnEnter(self) + local tooltip = TomTom.tooltip + tooltip:SetScale(UIParent:GetEffectiveScale()) + tooltip:SetOwner(self, "ANCHOR_CURSOR") + tooltip_icon = self + if self.label then + tooltip:SetText("TomTom: " .. self.label .. "\n") + else + tooltip:SetText("TomTom Waypoint\n") + end + + local dist,x,y = Astrolabe:GetDistanceToIcon(self) + + tooltip:AddLine(self.coord, 1, 1, 1) + tooltip:AddLine(("%s yards away"):format(math.floor(dist)), 1, 1 ,1) + tooltip:AddLine(self.zone, 0.7, 0.7, 0.7) + tooltip:Show() + tooltip:SetScript("OnUpdate", Tooltip_OnUpdate) +end + +local function MinimapIcon_OnLeave(self) + local tooltip = TomTom.tooltip + tooltip_icon = nil + tooltip:Hide() + tooltip:SetScript("OnUpdate", nil) +end + +local function DropDown_RemoveWaypoint() + local icon = TomTomDropDown.icon + + if icon.mpair then + icon = icon.mpair + end + + Astrolabe:RemoveIconFromMinimap(icon) + + icon.pair:Hide() + table.insert(TomTom.worldmapIcons, icon.pair) + + for idx,entry in ipairs(TomTom.w_points) do + local w_icon = entry.icon + if icon.pair == w_icon then + table.remove(TomTom.w_points, idx) + break + end + end end local function DropDown_SendWaypoint() @@ -236,206 +236,206 @@ local function DropDown_SendWaypoint() local distro = this.value - SendAddonMessage("TomTom", data, distro) -end - -local function DropDown_Init() - local dropdown = TomTomDropDown - local label = dropdown.icon.label - - if not label then - label = "TomTom Waypoint" - end + SendAddonMessage("TomTom", data, distro) +end + +local function DropDown_Init() + local dropdown = TomTomDropDown + local label = dropdown.icon.label + + if not label then + label = "TomTom Waypoint" + end local inGroup = GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0 local inGuild = IsInGuild() - - UIDropDownMenu_AddButton{ - text = label, - isTitle = 1, - } - - UIDropDownMenu_AddButton{ - text = "Remove waypoint", - value = "remove", - func = DropDown_RemoveWaypoint, - } - UIDropDownMenu_AddButton{ - text = "Send to group", - value = "RAID", - func = DropDown_SendWaypoint, - textR = not inGroup and 0.6, - textG = not inGroup and 0.6, - textB = not inGroup and 0.6, - } - UIDropDownMenu_AddButton{ - text = "Send to guild", - value = "GUILD", - func = DropDown_SendWaypoint, - textR = not inGuild and 0.6, - textG = not inGuild and 0.6, - textB = not inGuild and 0.6, - } -end - -local function MinimapIcon_OnClick(self) - local dropdown = TomTom.dropdown - if not dropdown then - TomTom.dropdown = CreateFrame("Frame", "TomTomDropDown", UIParent, "UIDropDownMenuTemplate") - dropdown = TomTom.dropdown - --UIDropDownMenu_SetButtonWidth(50, dropdown) - --UIDropDownMenu_SetWidth(50, dropdown) - end - - dropdown:SetParent(self) - dropdown.icon = self - UIDropDownMenu_Initialize(dropdown, DropDown_Init, "MENU") - ToggleDropDownMenu(1, nil, dropdown, "cursor", 0, 0); -end - -local halfpi = math.pi / 2 - --- The magic number which represents the ratio of model position pixels to --- logical screen pixels. I suspect this is really based on some property of the --- model itself, but I figured it out through interpolation given 3 ratios --- 4:3 5:4 16:10 -local MAGIC_ARROW_NUMBER = 0.000723339 - --- Calculation to determine the actual offset factor for the screen ratio, I dont --- know where the 1/3 rationally comes from, but it works, there's probably some --- odd logic within the client somewhere. --- --- 70.4 is half the width of the frame so we move to the center -local ofs = MAGIC_ARROW_NUMBER * (GetScreenHeight()/GetScreenWidth() + 1/3) * 70.4; --- The divisor here puts the arrow where the original magic number pair had it -local radius = ofs / 1.166666666666667; - -local function gomove(model,angle) - model:SetFacing(angle); - -- The 137/140 simply adjusts for the fact that the textured - -- border around the minimap isn't exactly centered - model:SetPosition(ofs * (137 / 140) - radius * math.sin(angle), - ofs + radius * math.cos(angle), - 0); -end - --- For animating the arrow ---angle = 0 -local function MinimapIcon_UpdateArrow(self, elapsed) - local icon = self.parent - local angle = Astrolabe:GetDirectionToIcon(icon) - - if GetCVar("rotateMinimap") == "1" then - local cring = MiniMapCompassRing:GetFacing() - angle = angle + cring - end - - gomove(self, angle) -end - -local function MinimapIcon_OnUpdate(self, elapsed) - local edge = Astrolabe:IsIconOnEdge(self) - local dot = self.dot:IsShown() - local arrow = self.arrow:IsShown() - - if edge and not arrow then - self.arrow:Show() - self.arrow.seqtime = 0 - self.dot:Hide() - self.edge = true - elseif not edge and not dot then - self.dot:Show() - self.arrow:Hide() - self.edge = false - end - - local dist,x,y = Astrolabe:GetDistanceToIcon(self) - if dist and dist < 11 and profile.clearwaypoints then - -- Clear this waypoint - Astrolabe:RemoveIconFromMinimap(self) - self.pair:Hide() - table.insert(TomTom.worldmapIcons, self.pair) - local msg = (self.label and self.label ~= "") and self.label or "your destination" - - TomTom:PrintF("You have arrived at %s (%s)", msg, self.coord) - - for idx,entry in ipairs(TomTom.w_points) do - local w_icon = entry.icon - if self.pair == w_icon then - table.remove(TomTom.w_points, idx) - break - end - end - end -end - -function TomTom:CreateMinimapIcon(label, x, y) - if not self.minimapIcons then - self.minimapIcons = {} - end - - if not self.tooltip then - self.tooltip = CreateFrame("GameTooltip", "TomTomTooltip", nil, "GameTooltipTemplate") - end - - -- Return one from the frame pool, if possible - local icon = table.remove(self.minimapIcons) - if icon then - icon.label = label - icon.coord = string.format("%5.2f, %5.2f", x, y) - return icon - end - - -- Create a new icon with arrow - -- icon.dot is the minimap dot texture - -- icon.arrow is the model used on the edge of the map - -- icon.label will contain the mouseover label - -- icon.coord will contain the text of the coordinates - icon = CreateFrame("Button", nil, Minimap) - icon:SetHeight(12) - icon:SetWidth(12) - icon:RegisterForClicks("RightButtonUp") - - icon.label = label - icon.coord = string.format("%5.2f, %5.2f", x, y) - - local texture = icon:CreateTexture() - texture:SetTexture("Interface\\Minimap\\ObjectIcons") - texture:SetTexCoord(0.5, 0.75, 0, 0.25) - texture:SetAllPoints() - icon.dot = texture - icon:SetScript("OnEnter", MinimapIcon_OnEnter) - icon:SetScript("OnLeave", MinimapIcon_OnLeave) - icon:SetScript("OnUpdate", MinimapIcon_OnUpdate) - icon:SetScript("OnClick", MinimapIcon_OnClick) - - -- Golden Arrow Information: - -- Facing: 0.50088876485825 - -- Light: 0,1,0,0,0,1,1,1,1,1,1,1,1 - -- Position: 0.029919292777777, 0.08267530053854, 0 - - local model = CreateFrame("Model", nil, icon) - model:SetHeight(140.8) - model:SetWidth(140.8) - model:SetPoint("CENTER", Minimap, "CENTER", 0, 0) - model:SetModel("Interface\\Minimap\\Rotating-MinimapArrow.mdx") --- model:SetFogColor(0.9999977946281433,0.9999977946281433,0.9999977946281433,0.9999977946281433) --- model:SetFogColor(math.random(), math.random(), math.random(), math.random()) --- model:SetFogFar(1) --- model:SetFogNear(0) --- model:SetLight(0,1,0,0,0,1,1,1,1,1,1,1,1) --- model:SetLight(1, 0, 0, -0.707, -0.707, 0.7, 1.0, 1.0, 1.0, 0.8, 1.0, 1.0, 0.8) --- Model:SetLight (enabled[,omni,dirX,dirY,dirZ,ambIntensity[,ambR,ambG,ambB [,dirIntensity[,dirR,dirG,dirB]]]]) - model:SetLight(0,1,0,0,0,1,1,1,1,1,1,1,1) - model:SetModelScale(.600000023841879) - - model.parent = icon - icon.arrow = model - model:SetScript("OnUpdate", MinimapIcon_UpdateArrow) - model:Hide() - - return icon -end + + UIDropDownMenu_AddButton{ + text = label, + isTitle = 1, + } + + UIDropDownMenu_AddButton{ + text = "Remove waypoint", + value = "remove", + func = DropDown_RemoveWaypoint, + } + UIDropDownMenu_AddButton{ + text = "Send to group", + value = "RAID", + func = DropDown_SendWaypoint, + textR = not inGroup and 0.6, + textG = not inGroup and 0.6, + textB = not inGroup and 0.6, + } + UIDropDownMenu_AddButton{ + text = "Send to guild", + value = "GUILD", + func = DropDown_SendWaypoint, + textR = not inGuild and 0.6, + textG = not inGuild and 0.6, + textB = not inGuild and 0.6, + } +end + +local function MinimapIcon_OnClick(self) + local dropdown = TomTom.dropdown + if not dropdown then + TomTom.dropdown = CreateFrame("Frame", "TomTomDropDown", UIParent, "UIDropDownMenuTemplate") + dropdown = TomTom.dropdown + --UIDropDownMenu_SetButtonWidth(50, dropdown) + --UIDropDownMenu_SetWidth(50, dropdown) + end + + dropdown:SetParent(self) + dropdown.icon = self + UIDropDownMenu_Initialize(dropdown, DropDown_Init, "MENU") + ToggleDropDownMenu(1, nil, dropdown, "cursor", 0, 0); +end + +local halfpi = math.pi / 2 + +-- The magic number which represents the ratio of model position pixels to +-- logical screen pixels. I suspect this is really based on some property of the +-- model itself, but I figured it out through interpolation given 3 ratios +-- 4:3 5:4 16:10 +local MAGIC_ARROW_NUMBER = 0.000723339 + +-- Calculation to determine the actual offset factor for the screen ratio, I dont +-- know where the 1/3 rationally comes from, but it works, there's probably some +-- odd logic within the client somewhere. +-- +-- 70.4 is half the width of the frame so we move to the center +local ofs = MAGIC_ARROW_NUMBER * (GetScreenHeight()/GetScreenWidth() + 1/3) * 70.4; +-- The divisor here puts the arrow where the original magic number pair had it +local radius = ofs / 1.166666666666667; + +local function gomove(model,angle) + model:SetFacing(angle); + -- The 137/140 simply adjusts for the fact that the textured + -- border around the minimap isn't exactly centered + model:SetPosition(ofs * (137 / 140) - radius * math.sin(angle), + ofs + radius * math.cos(angle), + 0); +end + +-- For animating the arrow +--angle = 0 +local function MinimapIcon_UpdateArrow(self, elapsed) + local icon = self.parent + local angle = Astrolabe:GetDirectionToIcon(icon) + + if GetCVar("rotateMinimap") == "1" then + local cring = MiniMapCompassRing:GetFacing() + angle = angle + cring + end + + gomove(self, angle) +end + +local function MinimapIcon_OnUpdate(self, elapsed) + local edge = Astrolabe:IsIconOnEdge(self) + local dot = self.dot:IsShown() + local arrow = self.arrow:IsShown() + + if edge and not arrow then + self.arrow:Show() + self.arrow.seqtime = 0 + self.dot:Hide() + self.edge = true + elseif not edge and not dot then + self.dot:Show() + self.arrow:Hide() + self.edge = false + end + + local dist,x,y = Astrolabe:GetDistanceToIcon(self) + if dist and dist < 11 and profile.clearwaypoints then + -- Clear this waypoint + Astrolabe:RemoveIconFromMinimap(self) + self.pair:Hide() + table.insert(TomTom.worldmapIcons, self.pair) + local msg = (self.label and self.label ~= "") and self.label or "your destination" + + TomTom:PrintF("You have arrived at %s (%s)", msg, self.coord) + + for idx,entry in ipairs(TomTom.w_points) do + local w_icon = entry.icon + if self.pair == w_icon then + table.remove(TomTom.w_points, idx) + break + end + end + end +end + +function TomTom:CreateMinimapIcon(label, x, y) + if not self.minimapIcons then + self.minimapIcons = {} + end + + if not self.tooltip then + self.tooltip = CreateFrame("GameTooltip", "TomTomTooltip", nil, "GameTooltipTemplate") + end + + -- Return one from the frame pool, if possible + local icon = table.remove(self.minimapIcons) + if icon then + icon.label = label + icon.coord = string.format("%5.2f, %5.2f", x, y) + return icon + end + + -- Create a new icon with arrow + -- icon.dot is the minimap dot texture + -- icon.arrow is the model used on the edge of the map + -- icon.label will contain the mouseover label + -- icon.coord will contain the text of the coordinates + icon = CreateFrame("Button", nil, Minimap) + icon:SetHeight(12) + icon:SetWidth(12) + icon:RegisterForClicks("RightButtonUp") + + icon.label = label + icon.coord = string.format("%5.2f, %5.2f", x, y) + + local texture = icon:CreateTexture() + texture:SetTexture("Interface\\Minimap\\ObjectIcons") + texture:SetTexCoord(0.5, 0.75, 0, 0.25) + texture:SetAllPoints() + icon.dot = texture + icon:SetScript("OnEnter", MinimapIcon_OnEnter) + icon:SetScript("OnLeave", MinimapIcon_OnLeave) + icon:SetScript("OnUpdate", MinimapIcon_OnUpdate) + icon:SetScript("OnClick", MinimapIcon_OnClick) + + -- Golden Arrow Information: + -- Facing: 0.50088876485825 + -- Light: 0,1,0,0,0,1,1,1,1,1,1,1,1 + -- Position: 0.029919292777777, 0.08267530053854, 0 + + local model = CreateFrame("Model", nil, icon) + model:SetHeight(140.8) + model:SetWidth(140.8) + model:SetPoint("CENTER", Minimap, "CENTER", 0, 0) + model:SetModel("Interface\\Minimap\\Rotating-MinimapArrow.mdx") +-- model:SetFogColor(0.9999977946281433,0.9999977946281433,0.9999977946281433,0.9999977946281433) +-- model:SetFogColor(math.random(), math.random(), math.random(), math.random()) +-- model:SetFogFar(1) +-- model:SetFogNear(0) +-- model:SetLight(0,1,0,0,0,1,1,1,1,1,1,1,1) +-- model:SetLight(1, 0, 0, -0.707, -0.707, 0.7, 1.0, 1.0, 1.0, 0.8, 1.0, 1.0, 0.8) +-- Model:SetLight (enabled[,omni,dirX,dirY,dirZ,ambIntensity[,ambR,ambG,ambB [,dirIntensity[,dirR,dirG,dirB]]]]) + model:SetLight(0,1,0,0,0,1,1,1,1,1,1,1,1) + model:SetModelScale(.600000023841879) + + model.parent = icon + icon.arrow = model + model:SetScript("OnUpdate", MinimapIcon_UpdateArrow) + model:Hide() + + return icon +end local Orig_WorldMapButton_OnClick = WorldMapButton_OnClick function WorldMapButton_OnClick(mouseButton, button) @@ -448,176 +448,176 @@ function WorldMapButton_OnClick(mouseButton, button) end WorldMapMagnifyingGlassButton:SetText(ZOOM_OUT_BUTTON_TEXT .. "\nCtrl+Right Click To Add a Waypoint") - -local function WorldMapIcon_OnEnter(self) - local tooltip = TomTom.tooltip - tooltip:SetScale(UIParent:GetEffectiveScale()) - tooltip:SetOwner(self, "ANCHOR_CURSOR") - tooltip_icon = self - if self.label then - tooltip:SetText("TomTom: " .. self.label .. "\n") - else - tooltip:SetText("TomTom Waypoint\n") - end - - tooltip:AddLine(self.coord, 1, 1, 1) - tooltip:AddLine(self.zone, 0.7, 0.7, 0.7) - tooltip:Show() -end - -local function WorldMapIcon_OnLeave(self) - local tooltip = TomTom.tooltip - tooltip:Hide() -end - -function TomTom:CreateWorldMapIcon(label, x, y) - if not self.worldmapIcons then - self.worldmapIcons = {} - end - - -- Return one from the frame pool, if possible - local icon = table.remove(self.worldmapIcons) - if icon then - icon.label = label - icon.coord = string.format("%5.2f, %5.2f", x, y) - return icon - end - - -- Create a new icon with arrow - -- icon.dot is the minimap dot texture - -- icon.label will contain the mouseover label - -- icon.coord will contain the text of the coordinates - icon = CreateFrame("Button", nil, WorldMapButton) - icon:SetHeight(12) - icon:SetWidth(12) - - icon.label = label - icon.coord = string.format("%5.2f, %5.2f", x, y) - - local texture = icon:CreateTexture() - texture:SetTexture("Interface\\Minimap\\ObjectIcons") - texture:SetTexCoord(0.5, 0.75, 0, 0.25) - texture:SetAllPoints() - icon.dot = texture - icon:SetScript("OnEnter", WorldMapIcon_OnEnter) - icon:SetScript("OnLeave", WorldMapIcon_OnLeave) - icon:SetScript("OnClick", MinimapIcon_OnClick) - icon:RegisterForClicks("RightButtonUp") - return icon -end - -function TomTom:CreateSlashCommands() - -- Options slash commands - self.cmd = self:InitializeSlashCommand("TomTom Slash Command", "TOMTOM", "tomtom") - - local ToggleDisplay = function(origin) - if origin == "coord" and TomTomFrame then - profile.show = not profile.show - TomTomFrame[profile.show and "Show" or "Hide"](TomTomFrame) - self:PrintF("The coordinate display has been %s.", profile.show and "shown" or "hidden") - elseif origin == "mapcoord" and TomTomWorldFrame then - profile.worldmap = not profile.worldmap - TomTomWorldFrame[profile.worldmap and "Show" or "Hide"](TomTomWorldFrame) - self:PrintF("The world map coordinate display has been %s.", profile.worldmap and "shown" or "hidden") - end - end - - local LockDisplay = function() - profile.lock = not profile.lock - self:PrintF("The coordinate display has been %s.", profile.lock and "locked" or "unlocked") - end - - self.cmd:RegisterSlashHandler("|cffffff00coord|r - Show/Hide the coordinate display", "^(coord)$", ToggleDisplay) - self.cmd:RegisterSlashHandler("|cffffff00mapcoord|r - Show/Hide the world map coordinate display", "^(mapcoord)$", ToggleDisplay) - self.cmd:RegisterSlashHandler("|cffffff00lock|r - Lock/Unlock the coordinate display", "^lock$", LockDisplay) - - -- Waypoint placement slash commands - self.cmd_way = self:InitializeSlashCommand("TomTom - Waypoints", "TOMTOM_WAY", "way") - - local Way_Set = function(x,y,desc) - self:AddWaypoint(x,y,desc) - end - - local Way_Reset = function() - if #self.w_points == 0 then - self:Print("There are no waypoints to remove.") - return - end - - if self.m_points then - for cont,ztbl in pairs(self.m_points) do - for zone,ztbl in pairs(ztbl) do - for idx,entry in pairs(ztbl) do - Astrolabe:RemoveIconFromMinimap(entry.icon) - table.insert(self.minimapIcons, entry.icon) - ztbl[idx] = nil - end - end - end - end - - if self.w_points then - for k,v in ipairs(self.w_points) do - local icon = v.icon - icon:Hide() - self.w_points[k] = nil - table.insert(self.worldmapIcons, icon) - end - end - - self:Print("All waypoints have been removed.") - end - - self.cmd_way:RegisterSlashHandler("reset - Remove all current waypoints", "^reset$", Way_Reset) - self.cmd_way:RegisterSlashHandler(" [] - Add a new waypoint with optional note", "^(%d*%.?%d*)[%s]+(%d*%.?%d*)%s*(.*)", Way_Set) -end - -function TomTom:ZONE_CHANGED_NEW_AREA() - -- This could clear the minimap, but I won't.. cause.. I don't like that - -- Not sure what to do here - - if profile.show then - local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() - if c and z and x and y then - TomTomFrame:Show() - end - end - - if true then return end -end - -function TomTom:PLAYER_ENTERING_WORLD() - local oc,oz = Astrolabe:GetCurrentPlayerPosition() - SetMapToCurrentZone() - local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() - if oc and oz then - SetMapZoom(oc,oz) - end - - if self.m_points and self.m_points[c] then - for zone,v in pairs(self.m_points[c]) do - for idx,entry in pairs(v) do - Astrolabe:PlaceIconOnMinimap(entry.icon, c, zone, entry.x, entry.y) - end - end - end -end - -function TomTom:WORLD_MAP_UPDATE() - if not self.w_points then return end - - local c = GetCurrentMapContinent() - - for idx,entry in ipairs(self.w_points) do - local icon = entry.icon - local x,y = Astrolabe:PlaceIconOnWorldMap(WorldMapDetailFrame, icon, entry.c, entry.z, entry.x, entry.y) - if (x and y and (0 < x and x <= 1) and (0 < y and y <= 1)) then - icon:Show() - else - icon:Hide() - end - end -end + +local function WorldMapIcon_OnEnter(self) + local tooltip = TomTom.tooltip + tooltip:SetScale(UIParent:GetEffectiveScale()) + tooltip:SetOwner(self, "ANCHOR_CURSOR") + tooltip_icon = self + if self.label then + tooltip:SetText("TomTom: " .. self.label .. "\n") + else + tooltip:SetText("TomTom Waypoint\n") + end + + tooltip:AddLine(self.coord, 1, 1, 1) + tooltip:AddLine(self.zone, 0.7, 0.7, 0.7) + tooltip:Show() +end + +local function WorldMapIcon_OnLeave(self) + local tooltip = TomTom.tooltip + tooltip:Hide() +end + +function TomTom:CreateWorldMapIcon(label, x, y) + if not self.worldmapIcons then + self.worldmapIcons = {} + end + + -- Return one from the frame pool, if possible + local icon = table.remove(self.worldmapIcons) + if icon then + icon.label = label + icon.coord = string.format("%5.2f, %5.2f", x, y) + return icon + end + + -- Create a new icon with arrow + -- icon.dot is the minimap dot texture + -- icon.label will contain the mouseover label + -- icon.coord will contain the text of the coordinates + icon = CreateFrame("Button", nil, WorldMapButton) + icon:SetHeight(12) + icon:SetWidth(12) + + icon.label = label + icon.coord = string.format("%5.2f, %5.2f", x, y) + + local texture = icon:CreateTexture() + texture:SetTexture("Interface\\Minimap\\ObjectIcons") + texture:SetTexCoord(0.5, 0.75, 0, 0.25) + texture:SetAllPoints() + icon.dot = texture + icon:SetScript("OnEnter", WorldMapIcon_OnEnter) + icon:SetScript("OnLeave", WorldMapIcon_OnLeave) + icon:SetScript("OnClick", MinimapIcon_OnClick) + icon:RegisterForClicks("RightButtonUp") + return icon +end + +function TomTom:CreateSlashCommands() + -- Options slash commands + self.cmd = self:InitializeSlashCommand("TomTom Slash Command", "TOMTOM", "tomtom") + + local ToggleDisplay = function(origin) + if origin == "coord" and TomTomFrame then + profile.show = not profile.show + TomTomFrame[profile.show and "Show" or "Hide"](TomTomFrame) + self:PrintF("The coordinate display has been %s.", profile.show and "shown" or "hidden") + elseif origin == "mapcoord" and TomTomWorldFrame then + profile.worldmap = not profile.worldmap + TomTomWorldFrame[profile.worldmap and "Show" or "Hide"](TomTomWorldFrame) + self:PrintF("The world map coordinate display has been %s.", profile.worldmap and "shown" or "hidden") + end + end + + local LockDisplay = function() + profile.lock = not profile.lock + self:PrintF("The coordinate display has been %s.", profile.lock and "locked" or "unlocked") + end + + self.cmd:RegisterSlashHandler("|cffffff00coord|r - Show/Hide the coordinate display", "^(coord)$", ToggleDisplay) + self.cmd:RegisterSlashHandler("|cffffff00mapcoord|r - Show/Hide the world map coordinate display", "^(mapcoord)$", ToggleDisplay) + self.cmd:RegisterSlashHandler("|cffffff00lock|r - Lock/Unlock the coordinate display", "^lock$", LockDisplay) + + -- Waypoint placement slash commands + self.cmd_way = self:InitializeSlashCommand("TomTom - Waypoints", "TOMTOM_WAY", "way") + + local Way_Set = function(x,y,desc) + self:AddWaypoint(x,y,desc) + end + + local Way_Reset = function() + if #self.w_points == 0 then + self:Print("There are no waypoints to remove.") + return + end + + if self.m_points then + for cont,ztbl in pairs(self.m_points) do + for zone,ztbl in pairs(ztbl) do + for idx,entry in pairs(ztbl) do + Astrolabe:RemoveIconFromMinimap(entry.icon) + table.insert(self.minimapIcons, entry.icon) + ztbl[idx] = nil + end + end + end + end + + if self.w_points then + for k,v in ipairs(self.w_points) do + local icon = v.icon + icon:Hide() + self.w_points[k] = nil + table.insert(self.worldmapIcons, icon) + end + end + + self:Print("All waypoints have been removed.") + end + + self.cmd_way:RegisterSlashHandler("reset - Remove all current waypoints", "^reset$", Way_Reset) + self.cmd_way:RegisterSlashHandler(" [] - Add a new waypoint with optional note", "^(%d*%.?%d*)[%s]+(%d*%.?%d*)%s*(.*)", Way_Set) +end + +function TomTom:ZONE_CHANGED_NEW_AREA() + -- This could clear the minimap, but I won't.. cause.. I don't like that + -- Not sure what to do here + + if profile.show then + local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() + if c and z and x and y then + TomTomFrame:Show() + end + end + + if true then return end +end + +function TomTom:PLAYER_ENTERING_WORLD() + local oc,oz = Astrolabe:GetCurrentPlayerPosition() + SetMapToCurrentZone() + local c,z,x,y = Astrolabe:GetCurrentPlayerPosition() + if oc and oz then + SetMapZoom(oc,oz) + end + + if self.m_points and self.m_points[c] then + for zone,v in pairs(self.m_points[c]) do + for idx,entry in pairs(v) do + Astrolabe:PlaceIconOnMinimap(entry.icon, c, zone, entry.x, entry.y) + end + end + end +end + +function TomTom:WORLD_MAP_UPDATE() + if not self.w_points then return end + + local c = GetCurrentMapContinent() + + for idx,entry in ipairs(self.w_points) do + local icon = entry.icon + local x,y = Astrolabe:PlaceIconOnWorldMap(WorldMapDetailFrame, icon, entry.c, entry.z, entry.x, entry.y) + if (x and y and (0 < x and x <= 1) and (0 < y and y <= 1)) then + icon:Show() + else + icon:Hide() + end + end +end local zdata = {} for c=1,3 do @@ -645,63 +645,63 @@ function TomTom:CHAT_MSG_ADDON(event, prefix, message, distro, sender) TomTom:AddZWaypoint(c, z, x, y, desc, true) self:PrintF("Waypoint at %.2f, %.2f in %s recieved from %s.", x*100, y*100, zone, sender) end - -local sortFunc = function(a,b) - if a.x == b.x then return a.y < b.y else return a.x < b.x end -end - - -function TomTom:AddZWaypoint(c,z,x,y,desc,silent) - if not self.m_points then self.m_points = {} end - if not self.w_points then self.w_points = {} end + +local sortFunc = function(a,b) + if a.x == b.x then return a.y < b.y else return a.x < b.x end +end + + +function TomTom:AddZWaypoint(c,z,x,y,desc,silent) + if not self.m_points then self.m_points = {} end + if not self.w_points then self.w_points = {} end if desc == '' then desc = nil end - - local m_icon = self:CreateMinimapIcon(desc, x, y) - local w_icon = self:CreateWorldMapIcon(desc, x, y) - m_icon.pair = w_icon - w_icon.mpair = m_icon - - x = x / 100 - y = y / 100 - - Astrolabe:PlaceIconOnMinimap(m_icon, c, z, x, y) - Astrolabe:PlaceIconOnWorldMap(WorldMapDetailFrame, w_icon, c, z, x, y) - - w_icon:Show() - - local zone = select(z, GetMapZones(c)) - m_icon.zone = zone - w_icon.zone = zone - - if not silent then - self:PrintF("Setting a waypoint at %.2f, %.2f in %s.", x * 100, y * 100, zone) - end - - self.m_points[c] = self.m_points[c] or {} - self.m_points[c][z] = self.m_points[c][z] or {} - self.m_points.current = self.m_points[c][z] - - table.insert(self.m_points[c][z], {["x"] = x, ["y"] = y, ["icon"] = m_icon}) - table.sort(self.m_points[c][z], sortFunc) - - table.insert(self.w_points, {["c"] = c, ["z"] = z, ["x"] = x, ["y"] = y, ["icon"] = w_icon}) -end - -function TomTom:AddWaypoint(x,y,desc) - local oc,oz = Astrolabe:GetCurrentPlayerPosition() - SetMapToCurrentZone() - local c,z = Astrolabe:GetCurrentPlayerPosition() - if oc and oz then - SetMapZoom(oc,oz) - end - - if not c or not z or c < 1 then - self:Print("Cannot find a valid zone to place the coordinates") - return - end - - self:AddZWaypoint(c,z,x,y,desc) -end - + + local m_icon = self:CreateMinimapIcon(desc, x, y) + local w_icon = self:CreateWorldMapIcon(desc, x, y) + m_icon.pair = w_icon + w_icon.mpair = m_icon + + x = x / 100 + y = y / 100 + + Astrolabe:PlaceIconOnMinimap(m_icon, c, z, x, y) + Astrolabe:PlaceIconOnWorldMap(WorldMapDetailFrame, w_icon, c, z, x, y) + + w_icon:Show() + + local zone = select(z, GetMapZones(c)) + m_icon.zone = zone + w_icon.zone = zone + + if not silent then + self:PrintF("Setting a waypoint at %.2f, %.2f in %s.", x * 100, y * 100, zone) + end + + self.m_points[c] = self.m_points[c] or {} + self.m_points[c][z] = self.m_points[c][z] or {} + self.m_points.current = self.m_points[c][z] + + table.insert(self.m_points[c][z], {["x"] = x, ["y"] = y, ["icon"] = m_icon}) + table.sort(self.m_points[c][z], sortFunc) + + table.insert(self.w_points, {["c"] = c, ["z"] = z, ["x"] = x, ["y"] = y, ["icon"] = w_icon}) +end + +function TomTom:AddWaypoint(x,y,desc) + local oc,oz = Astrolabe:GetCurrentPlayerPosition() + SetMapToCurrentZone() + local c,z = Astrolabe:GetCurrentPlayerPosition() + if oc and oz then + SetMapZoom(oc,oz) + end + + if not c or not z or c < 1 then + self:Print("Cannot find a valid zone to place the coordinates") + return + end + + self:AddZWaypoint(c,z,x,y,desc) +end + TomTom = DongleStub("Dongle-1.0"):New("TomTom", TomTom) -- 1.7.9.5