vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
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