local L = AceLibrary("AceLocale-2.0"):new("FuBar_LocationFu") local Tourist = AceLibrary("Tourist-2.0") local Tablet = AceLibrary("Tablet-2.0") local Jostle = AceLibrary("Jostle-2.0") LocationFu = AceLibrary("AceAddon-2.0"):new("FuBarPlugin-2.0", "AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0") LocationFu.version = "2.0" .. string.sub("$Revision: 7853 $", 12, -3) LocationFu.date = string.sub("$Date: 2006-08-12 12:15:59 -1000 (Sat, 12 Aug 2006) $", 8, 17) LocationFu.hasIcon = true local table_insert = table.insert LocationFu:RegisterDB("LocationFuDB") LocationFu:RegisterDefaults("profile", { showMapCoords = true, showCoords = true, showSubZoneName = true, showZoneName = false, showRecZones = true, showMapOverlay = true, showLevelRange = true, }) function LocationFu:IsShowingCoords() return self.db.profile.showCoords end function LocationFu:ToggleShowingCoords() self.db.profile.showCoords = not self.db.profile.showCoords self:UpdateText() end function LocationFu:IsShowingZoneName() return self.db.profile.showZoneName end function LocationFu:ToggleShowingZoneName() self.db.profile.showZoneName = not self.db.profile.showZoneName self:UpdateText() end function LocationFu:IsShowingSubZoneName() return self.db.profile.showSubZoneName end function LocationFu:ToggleShowingSubZoneName() self.db.profile.showSubZoneName = not self.db.profile.showSubZoneName self:UpdateText() end function LocationFu:IsShowingLevelRange() return self.db.profile.showLevelRange end function LocationFu:ToggleShowingLevelRange() self.db.profile.showLevelRange = not self.db.profile.showLevelRange self:UpdateText() end function LocationFu:IsShowingMinimapBar() return self.db.profile.minimapBar end function LocationFu:ToggleShowingMinimapBar() self.db.profile.minimapBar = not self.db.profile.minimapBar if not self.db.profile.minimapBar then MinimapBorderTop:Hide() MinimapToggleButton:Hide() MinimapZoneTextButton:Hide() else MinimapBorderTop:Show() MinimapToggleButton:Show() MinimapZoneTextButton:Show() end Jostle:Refresh() end function LocationFu:IsShowingMapCoords() return self.db.profile.showMapCoords end function LocationFu:ToggleShowingMapCoords() self.db.profile.showMapCoords = not self.db.profile.showMapCoords if not self.db.profile.showMapCoords then LocationFuMapFrameCursorCoords:Hide() LocationFuMapFramePlayerCoords:Hide() else LocationFuMapFrameCursorCoords:Show() LocationFuMapFramePlayerCoords:Show() end end function LocationFu:IsShowingRecommendedZones() return self.db.profile.showRecZones end function LocationFu:ToggleShowingRecommendedZones() self.db.profile.showRecZones = not self.db.profile.showRecZones self:UpdateTooltip() end function LocationFu:IsShowingMapOverlay() return self.db.profile.showMapOverlay end function LocationFu:ToggleShowingMapOverlay() self.db.profile.showMapOverlay = not self.db.profile.showMapOverlay if not self.db.profile.showMapOverlay then LocationFuMapFrameText:Hide() WorldMapFrameAreaLabel:SetTextColor(1, 1, 1) else LocationFuMapFrameText:Show() end return self.db.profile.showMapOverlay end function LocationFu:OnInitialize() local mapFrame = CreateFrame("Frame", "LocationFuMapFrame", WorldMapFrame) mapFrame:SetScript("OnUpdate", self.MapFrame_OnUpdate) local cursorCoords = mapFrame:CreateFontString("LocationFuMapFrameCursorCoords", "ARTWORK") cursorCoords:SetFont(GameFontNormal:GetFont()) cursorCoords:SetTextColor(GameFontNormal:GetTextColor()) cursorCoords:SetShadowColor(GameFontNormal:GetShadowColor()) cursorCoords:SetShadowOffset(GameFontNormal:GetShadowOffset()) cursorCoords:SetPoint("RIGHT", WorldMapFrame, "CENTER", -80, -367) local playerCoords = mapFrame:CreateFontString("LocationFuMapFramePlayerCoords", "ARTWORK") playerCoords:SetFont(GameFontNormal:GetFont()) playerCoords:SetTextColor(GameFontNormal:GetTextColor()) playerCoords:SetShadowColor(GameFontNormal:GetShadowColor()) playerCoords:SetShadowOffset(GameFontNormal:GetShadowOffset()) playerCoords:SetPoint("RIGHT", WorldMapFrame, "CENTER", 80, -367) local text = mapFrame:CreateFontString("LocationFuMapFrameText", "OVERLAY") local font, size = GameFontHighlightLarge:GetFont() text:SetFont(font, size, "OUTLINE") text:SetTextColor(GameFontHighlightLarge:GetTextColor()) text:SetShadowColor(GameFontHighlightLarge:GetShadowColor()) text:SetShadowOffset(GameFontHighlightLarge:GetShadowOffset()) text:SetPoint("TOP", WorldMapFrameAreaDescription, "BOTTOM", 0, -5) end function LocationFu:OnEnable() self:RegisterEvent("ZONE_CHANGED", "UpdateData") self:RegisterEvent("ZONE_CHANGED_INDOORS", "UpdateData") self:RegisterEvent("ZONE_CHANGED_NEW_AREA") self:RegisterEvent("MINIMAP_ZONE_CHANGED", "UpdateData") self:RegisterEvent("PLAYER_ENTERING_WORLD") if not self:IsShowingMinimapBar() then self.db.profile.minimapBar = not self.db.profile.minimapBar self:ToggleShowingMinimapBar() end if not self:IsShowingMapCoords() then self.db.profile.showMapCoords = not self.db.profile.showMapCoords self:ToggleShowingMapCoords() end local x, y = GetPlayerMapPosition("player") if x == 0 and y == 0 then -- instance self:ScheduleRepeatingEvent("LocationFu", self.UpdateDisplay, 60, self) else self:ScheduleRepeatingEvent("LocationFu", self.UpdateDisplay, 0.1, self) end end function LocationFu:OnDisable() if not self:IsShowingMinimapBar() then self:ToggleShowingMinimapBar() self.db.profile.minimapBar = not self.db.profile.minimapBar end if self:IsShowingMapCoords() then self:ToggleShowingMapCoords() self.db.profile.showMapCoords = not self.db.profile.showMapCoords end LocationFuMapFrameText:SetText("") end local options = { type = 'group', args = { map = { order = 97, type = 'execute', name = L"Open world map", desc = L"Open world map", func = function() ToggleWorldMap() end }, atlas = { order = 98, type = 'execute', name = L"Open Atlas", desc = L"Open Atlas", func = function() Atlas_Toggle() end, hidden = function() return not Atlas_Toggle end, }, ["-blank-"] = { order = 99, type = 'header', }, coords = { type = 'toggle', name = L"Show coordinates", desc = L"Toggle the coordinates in the text of this plugin", get = "IsShowingCoords", set = "ToggleShowingCoords", }, subzone = { type = 'toggle', name = L"Show subzone name", desc = L"Show subzone name", get = "IsShowingSubZoneName", set = "ToggleShowingSubZoneName", }, zone = { type = 'toggle', name = L"Show zone name", desc = L"Toggle the zone name in the text of this plugin", get = "IsShowingZoneName", set = "ToggleShowingZoneName", }, levelRange = { type = 'toggle', name = L"Show level range", desc = L"Show level range", get = "IsShowingLevelRange", set = "ToggleShowingLevelRange", }, minimapBar = { type = 'toggle', name = L"Show minimap bar", desc = L"Show the bar above the minimap that tells the location and allows you to close minimap", get = "IsShowingMinimapBar", set = "ToggleShowingMinimapBar", }, mapCoords = { type = 'toggle', name = L"Show coodinates on map", desc = L"Show the coordinates of your cursor and your player on the world map", get = "IsShowingMapCoords", set = "ToggleShowingMapCoords", }, overlay = { type = 'toggle', name = L"Show map overlay", desc = L"Show the overlay on the map which shows the level range and instances available", get = "IsShowingMapOverlay", set = "ToggleShowingMapOverlay", }, recommend = { type = 'toggle', name = L"Show recommended zones", desc = L"Show your recommended zones in the tooltip", get = "IsShowingRecommendedZones", set = "ToggleShowingRecommendedZones", }, } } LocationFu:RegisterChatCommand(L:GetTable("AceConsole-options"), options) LocationFu.OnMenuRequest = options function LocationFu:ZONE_CHANGED_NEW_AREA() SetMapToCurrentZone() self:UpdateData() end function LocationFu:PLAYER_ENTERING_WORLD() self:UpdateData() local x, y = GetPlayerMapPosition("player") if x == 0 and y == 0 then -- instance self:ScheduleRepeatingEvent("LocationFu", self.UpdateDisplay, 60, self) else self:ScheduleRepeatingEvent("LocationFu", self.UpdateDisplay, 0.1, self) end self:UpdateDisplay() end local subZoneText, zoneText, zoneColor, pvpType, isArena function LocationFu:OnDataUpdate() subZoneText = GetSubZoneText() zoneText = GetZoneText() if subZoneText == "" then subZoneText = zoneText end zoneColor = "YELLOW" pvpType,_,isArena = GetZonePVPInfo() local faction = UnitFactionGroup("player") if isArena or pvpType == "hostile" then zoneColor = "RED" elseif pvpType == "friendly" then zoneColor = "GREEN" elseif Tourist:IsHostile(zoneText) then zoneColor = "RED" elseif Tourist:IsFriendly(zoneText) then zoneColor = "GREEN" end if Atlas_Toggle and Tourist:IsInstance(zoneText) then self:SetIcon("Interface\\AddOns\\Atlas\\Images\\AtlasIcon") else self:SetIcon(true) end end local t = {} function LocationFu:OnTextUpdate() local text local r, g, b = Tourist:GetFactionColor(zoneText) if self:IsShowingZoneName() and self:IsShowingSubZoneName() then if subZoneText == zoneText then table_insert(t, string.format("|cff%02x%02x%02x%s|r", r*255, g*255, b*255, zoneText)) else table_insert(t, string.format("|cff%02x%02x%02x%s: %s|r", r*255, g*255, b*255, zoneText, subZoneText)) end elseif self:IsShowingZoneName() then table_insert(t, string.format("|cff%02x%02x%02x%s|r", r*255, g*255, b*255, zoneText)) elseif self:IsShowingSubZoneName() then table_insert(t, string.format("|cff%02x%02x%02x%s|r", r*255, g*255, b*255, subZoneText)) end local x, y = GetPlayerMapPosition("player") if self:IsShowingCoords() and x ~= 0 and y ~= 0 then table_insert(t, string.format("|cff%02x%02x%02x(%.0f, %.0f)|r", r*255, g*255, b*255, x * 100, y * 100)) end local low, high = Tourist:GetLevel(zoneText) if self:IsShowingLevelRange() and low > 0 and high > 0 then local r, g, b = Tourist:GetLevelColor(zoneText) table_insert(t, string.format("|cff%02x%02x%02x[%d-%d]|r", r*255, g*255, b*255, low, high)) end self:SetText(table.concat(t, " ")) for k in pairs(t) do t[k] = nil end table.setn(t, 0) end function LocationFu:OnTooltipUpdate() local cat = Tablet:AddCategory( 'columns', 2, 'child_textR', 1, 'child_textG', 1, 'child_textB', 0, 'child_text2R', 1, 'child_text2G', 1, 'child_text2B', 1 ) cat:AddLine( 'text', L"Zone:", 'text2', zoneText ) if subZoneText ~= zoneText then cat:AddLine( 'text', L"Subzone:", 'text2', subZoneText ) end local text local r, g, b = 1, 1, 0 if isArena then text = L"Arena" g = 0 elseif zoneColor == "GREEN" then text = L"Friendly" r = 0 elseif zoneColor == "YELLOW" then text = L"Contested" elseif zoneColor == "RED" then text = L"Hostile" g = 0 end cat:AddLine( 'text', L"Status:", 'text2', text, 'text2R', r, 'text2G', g, 'text2B', b ) local x, y = GetPlayerMapPosition("player") cat:AddLine( 'text', L"Coordinates:", 'text2', string.format("%.0f, %.0f", x*100, y*100) ) local low, high = Tourist:GetLevel(zoneText) if low >= 1 and high >= 1 then local r, g, b = Tourist:GetLevelColor(zoneText) cat:AddLine( 'text', L"Level range:", 'text2', string.format("%d-%d", low, high), 'text2R', r, 'text2G', g, 'text2B', b ) end if Tourist:DoesZoneHaveInstances(zoneText) then cat = Tablet:AddCategory( 'columns', 2, 'text', L"Instances", 'child_textR', 1, 'child_textG', 1, 'child_textB', 0 ) for instance in Tourist:IterateZoneInstances(zoneText) do local low, high = Tourist:GetLevel(instance) local r, g, b = Tourist:GetLevelColor(instance) cat:AddLine( 'text', instance, 'text2', string.format("%d-%d", low, high), 'text2R', r, 'text2G', g, 'text2B', b ) end end if self:IsShowingRecommendedZones() then cat = Tablet:AddCategory( 'columns', 2, 'text', L"Recommended zones" ) for zone in Tourist:IterateRecommendedZones() do local low, high = Tourist:GetLevel(zone) local r1, g1, b1 = Tourist:GetFactionColor(zone) local r2, g2, b2 = Tourist:GetLevelColor(zone) cat:AddLine( 'text', zone, 'textR', r1, 'textG', g1, 'textB', b1, 'text2', string.format("%d-%d", low, high), 'text2R', r2, 'text2G', g2, 'text2B', b2 ) end if Tourist:HasRecommendedInstances() then cat = Tablet:AddCategory( 'columns', 2, 'text', L"Recommended instances" ) for instance in Tourist:IterateRecommendedInstances() do local low, high = Tourist:GetLevel(instance) local r1, g1, b1 = Tourist:GetFactionColor(instance) local r2, g2, b2 = Tourist:GetLevelColor(instance) cat:AddLine( 'text', instance, 'textR', r1, 'textG', g1, 'textB', b1, 'text2', string.format("%d-%d", low, high), 'text2R', r2, 'text2G', g2, 'text2B', b2 ) end end end if Atlas_Toggle then if Tourist:IsInstance(zoneText) then Tablet:SetHint(L"Atlas-hint" .. "\n" .. L"Shift-hint" .. "\n" .. L"Ctrl-hint") else Tablet:SetHint(L"Standard-hint" .. "\n" .. L"Shift-hint" .. "\n" .. L"Ctrl-Atlas-hint") end else Tablet:SetHint(L"Standard-hint" .. "\n" .. L"Shift-hint") end end local lastZone function LocationFu.MapFrame_OnUpdate(t) local self = LocationFu if self:IsActive() then if self:IsShowingMapCoords() then local OFFSET_X = 0.0022 local OFFSET_Y = -0.0262 local x, y = GetCursorPosition() x = x / WorldMapFrame:GetScale() y = y / WorldMapFrame:GetScale() local px, py = GetPlayerMapPosition("player") local centerX, centerY = WorldMapFrame:GetCenter() local width = WorldMapButton:GetWidth() local height = WorldMapButton:GetHeight() local adjustedX = (x - (centerX - (width/2))) / width local adjustedY = (centerY + (height/2) - y ) / height local cx = (adjustedX + OFFSET_X) local cy = (adjustedY + OFFSET_Y) local cursorCoordsText = string.format("%.0f, %.0f", 100 * cx, 100 * cy) local playerCoordsText = string.format("%.0f, %.0f", 100 * px, 100 * py); LocationFuMapFrameCursorCoords:SetText(format("%s: %.0f, %.0f", L"Cursor:", 100 * cx, 100 * cy)) LocationFuMapFramePlayerCoords:SetText(format("%s: %.0f, %.0f", L"Player:", 100 * px, 100 * py)) end if self:IsShowingMapOverlay() then local underAttack = false local zone = WorldMapFrameAreaLabel:GetText() if zone then zone = string.gsub(WorldMapFrameAreaLabel:GetText(), " |cff.+$", "") if WorldMapFrameAreaDescription:GetText() then underAttack = true zone = string.gsub(WorldMapFrameAreaDescription:GetText(), " |cff.+$", "") end end if GetCurrentMapContinent() == 0 then local c1, c2 = GetMapContinents() if zone == c1 or zone == c2 then WorldMapFrameAreaLabel:SetTextColor(1, 1, 1) LocationFuMapFrameText:SetText("") return end end if not zone or not Tourist:IsZoneOrInstance(zone) then zone = WorldMapFrame.areaName end WorldMapFrameAreaLabel:SetTextColor(1, 1, 1) if zone ~= nil and Tourist:IsZoneOrInstance(zone) then if not underAttack then WorldMapFrameAreaLabel:SetTextColor(Tourist:GetFactionColor(zone)) WorldMapFrameAreaDescription:SetTextColor(1, 1, 1) else WorldMapFrameAreaLabel:SetTextColor(1, 1, 1) WorldMapFrameAreaDescription:SetTextColor(Tourist:GetFactionColor(zone)) end local low, high = Tourist:GetLevel(zone) if low ~= nil and high ~= nil and low ~= -6 and high ~= -6 then local r, g, b = Tourist:GetLevelColor(zone) if not underAttack then local text = string.gsub(WorldMapFrameAreaLabel:GetText(), " |cff.+$", "") text = text .. string.format(" |cff%02x%02x%02x(%d-%d)|r", r * 255, g * 255, b * 255, low, high) WorldMapFrameAreaLabel:SetText(text) else local text = string.gsub(WorldMapFrameAreaDescription:GetText(), " |cff.+$", "") text = text .. string.format(" |cff%02x%02x%02x(%d-%d)|r", r * 255, g * 255, b * 255, low, high) WorldMapFrameAreaDescription:SetText(text) end end if Tourist:DoesZoneHaveInstances(zone) then if lastZone ~= zone then lastZone = zone local mapText = string.format("|cffffff00%s:|r", L"Instances") for instance in Tourist:IterateZoneInstances(zone) do local low, high = Tourist:GetLevel(instance) local r1, g1, b1 = Tourist:GetFactionColor(instance) local r2, g2, b2 = Tourist:GetLevelColor(instance) mapText = mapText .. "\n" .. string.format("|cff%02x%02x%02x%s|r |cff%02x%02x%02x(%d-%d)|r", r1 * 255, g1 * 255, b1 * 255, instance, r2 * 255, g2 * 255, b2 * 255, low, high) end LocationFuMapFrameText:SetText(mapText) end else lastZone = nil LocationFuMapFrameText:SetText("") end elseif zone == nil then lastZone = nil LocationFuMapFrameText:SetText("") end end end end function LocationFu:OnClick() if IsShiftKeyDown() then if ChatFrameEditBox:IsVisible() then local x, y = GetPlayerMapPosition("player") local message local coords = string.format("%.0f, %.0f", x * 100, y * 100) if not self:IsShowingZoneName() and not self:IsShowingSubZoneName() then message = coords elseif self:IsShowingZoneName() and self:IsShowingSubZoneName() then if zoneText ~= subZoneText then message = string.format("%s: %s (%s)", zoneText, subZoneText, coords) else message = string.format("%s (%s)", zoneText, coords) end elseif self:IsShowingZoneName() then message = string.format("%s (%s)", zoneText, coords) elseif self:IsShowingSubZoneName() then message = string.format("%s (%s)", subZoneText, coords) end ChatFrameEditBox:Insert(message) end elseif Atlas_Toggle then if IsControlKeyDown() then if not Tourist:IsInstance(zoneText) then Atlas_Toggle() else ToggleWorldMap() end else if Tourist:IsInstance(zoneText) then Atlas_Toggle() else ToggleWorldMap() end end else ToggleWorldMap() end end