diff --git a/modules/minimap.lua b/modules/minimap.lua new file mode 100644 index 0000000..215f332 --- /dev/null +++ b/modules/minimap.lua @@ -0,0 +1,261 @@ +pfUI:RegisterModule("minimap", "vanilla:tbc", function () + local rawborder, border = GetBorderSize() + local size = tonumber(C.appearance.minimap.size) or 140 + + if MiniMapWorldMapButton then MiniMapWorldMapButton:Hide() end + if MinimapToggleButton then MinimapToggleButton:Hide() end + MinimapBorderTop:Hide() + MinimapZoneTextButton:Hide() + MinimapZoomIn:Hide() + MinimapZoomOut:Hide() + GameTimeFrame:Hide() + + MinimapBorder:SetTexture(nil) + + pfUI.minimap = CreateFrame("Frame","pfMinimap",UIParent) + CreateBackdrop(pfUI.minimap) + CreateBackdropShadow(pfUI.minimap) + pfUI.minimap:SetPoint("TOPRIGHT", UIParent, -border*2, -border*2) + UpdateMovable(pfUI.minimap) + pfUI.minimap:SetScript("OnShow", function() + QueueFunction(ShowUIPanel, Minimap) + end) + + Minimap:SetParent(pfUI.minimap) + Minimap:SetPoint("CENTER", pfUI.minimap, "CENTER", 0.5, -.5) + Minimap:SetFrameLevel(1) + Minimap:SetMaskTexture(pfUI.media["img:minimap"]) + Minimap:EnableMouseWheel(true) + Minimap:SetScript("OnMouseWheel", function() + if(arg1 > 0) then Minimap_ZoomIn() else Minimap_ZoomOut() end + end) + + pfUI.minimap.UpdateConfig = function(self) + size = tonumber(C.appearance.minimap.size) or 140 + + pfUI.minimap:SetWidth(size) + pfUI.minimap:SetHeight(size) + + Minimap:SetWidth(size) + Minimap:SetHeight(size) + + -- vanilla+tbc: do the best to detect the minimap arrow + local arrowscale = tonumber(C.appearance.minimap.arrowscale) + local minimaparrow = ({Minimap:GetChildren()})[9] + for k, v in pairs({Minimap:GetChildren()}) do + if v:IsObjectType("Model") and not v:GetName() then + if string.find(strlower(v:GetModel()), "interface\\minimap\\minimaparrow") then + minimaparrow = v + break + end + end + end + + if minimaparrow then + minimaparrow:SetScale(arrowscale) + end + end + + pfUI.minimap:UpdateConfig() + + hooksecurefunc("ToggleMinimap", function() + if pfUI.farmmap and pfUI.farmmap:IsShown() then + Minimap:Hide() + return + end + + if Minimap:IsVisible() then + pfUI.minimap:SetHeight(size) + pfUI.minimap:SetAlpha(1) + else + pfUI.minimap:SetHeight(-border-5) + pfUI.minimap:SetAlpha(0) + Minimap:Hide() + end + end) + + -- battleground icon + MiniMapBattlefieldFrame:ClearAllPoints() + MiniMapBattlefieldFrame:SetPoint("BOTTOMRIGHT", Minimap, 4, -4) + MiniMapBattlefieldBorder:Hide() + MiniMapBattlefieldFrame:SetScript("OnClick", function() + GameTooltip:Hide() + if MiniMapBattlefieldFrame.status == "active" then + if arg1 == "RightButton" then + ToggleDropDownMenu(1, nil, MiniMapBattlefieldDropDown, "MiniMapBattlefieldFrame", -95, -5) + elseif IsShiftKeyDown() then + ToggleBattlefieldMinimap() + else + ToggleWorldStateScoreFrame() + end + elseif arg1 == "RightButton" then + ToggleDropDownMenu(1, nil, MiniMapBattlefieldDropDown, "MiniMapBattlefieldFrame", -95, -5) + end + end) + + -- mail icon + MiniMapMailFrame:ClearAllPoints() + MiniMapMailFrame:SetPoint("TOPRIGHT", pfUI.minimap, "TOPRIGHT", 0, 0) + MiniMapMailBorder:Hide() + MiniMapMailIcon:SetTexture(pfUI.media["img:mail"]) + + MiniMapMailFrame:SetScript("OnShow", function() + if not this.highlight then + this.highlight = CreateFrame("Frame", nil, this) + this.highlight:SetAllPoints(this) + this.highlight:SetFrameLevel(this:GetFrameLevel() + 1) + + this.highlight.tex = this.highlight:CreateTexture("OVERLAY") + this.highlight.tex:SetTexture(pfUI.media["img:mail"]) + this.highlight.tex:SetPoint("TOPLEFT", MiniMapMailIcon, "TOPLEFT", -2, 2) + this.highlight.tex:SetPoint("BOTTOMRIGHT", MiniMapMailIcon, "BOTTOMRIGHT", 2, -2) + this.highlight.tex:SetVertexColor(1,.5,.5) + + this.highlight:SetScript("OnUpdate", function() + if not this.count then this.count = 0 end + if not this.modifier then this.modifier = 1 end + if this.count >= 10 then this:Hide() end + + this:SetAlpha(this:GetAlpha() + this.modifier) + + if this:GetAlpha() <= 0.1 then + this.modifier = 0.05 + this.count = this.count + 1 + elseif this:GetAlpha() >= 0.9 then + this.modifier = -0.05 + end + end) + end + + this.highlight.count = 0 + this.highlight:Show() + end) + + -- Create coordinates text frame with location configurable + pfUI.minimapCoordinates = CreateFrame("Frame", "pfMinimapCoord", pfUI.minimap) + pfUI.minimapCoordinates:SetScript("OnUpdate", function() + -- Throttle to update coords every 0.1 seconds + if ( this.tick or 0) > GetTime() then return end + this.tick = GetTime() + .1 + + if C.appearance.minimap.coordstext == "off" then return end + + this.posX, this.posY = GetPlayerMapPosition("player") + if this.posX ~= 0 and this.posY ~= 0 then + this.text:SetText(string.format("%.1f, %.1f", round(this.posX * 100, 1), round(this.posY * 100, 1))) + else + this.text:SetText("|cffffaaaaN/A") + end + end) + + if C.appearance.minimap.coordsloc == "topleft" then + pfUI.minimapCoordinates:SetPoint("TOPLEFT", 3, -3) + elseif C.appearance.minimap.coordsloc == "topright" then + pfUI.minimapCoordinates:SetPoint("TOPRIGHT", -3, -3) + elseif C.appearance.minimap.coordsloc == "bottomright" then + pfUI.minimapCoordinates:SetPoint("BOTTOMRIGHT", -3, 3) + else + pfUI.minimapCoordinates:SetPoint("BOTTOMLEFT", 3, 3) + end + + pfUI.minimapCoordinates:SetHeight(C.global.font_size) + pfUI.minimapCoordinates:SetWidth(Minimap:GetWidth()) + pfUI.minimapCoordinates.text = pfUI.minimapCoordinates:CreateFontString("MinimapCoordinatesText", "LOW", "GameFontNormal") + pfUI.minimapCoordinates.text:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE") + pfUI.minimapCoordinates.text:SetTextColor(1,1,1,1) + pfUI.minimapCoordinates.text:SetAllPoints(pfUI.minimapCoordinates) + + if C.appearance.minimap.coordsloc == "topright" or C.appearance.minimap.coordsloc == "bottomright" then + pfUI.minimapCoordinates.text:SetJustifyH("RIGHT") + else + pfUI.minimapCoordinates.text:SetJustifyH("LEFT") + end + + if C.appearance.minimap.coordstext ~= "on" then + pfUI.minimapCoordinates:Hide() + else + pfUI.minimapCoordinates:Show() + end + + -- Create zone text frame in top center of minimap + pfUI.minimapZone = CreateFrame("Frame", "pfMinimapZone", pfUI.minimap) + pfUI.minimapZone:RegisterEvent("MINIMAP_ZONE_CHANGED") + pfUI.minimapZone:RegisterEvent("PLAYER_ENTERING_WORLD") + pfUI.minimapZone:SetPoint("TOP", 0, -3) + pfUI.minimapZone:SetHeight(C.global.font_size + 2) + pfUI.minimapZone:SetWidth(Minimap:GetWidth()) + pfUI.minimapZone.text = pfUI.minimapZone:CreateFontString("minimapZoneText", "LOW", "GameFontNormal") + pfUI.minimapZone.text:SetFont(pfUI.font_default, C.global.font_size + 2, "OUTLINE") + pfUI.minimapZone.text:SetAllPoints(pfUI.minimapZone) + pfUI.minimapZone.text:SetJustifyH("CENTER") + + pfUI.minimapZone:SetScript("OnEvent", function() + if not WorldMapFrame:IsShown() then + SetMapToCurrentZone() + end + + if C.appearance.minimap.zonetext ~= "off" then + local pvp, _, arena = GetZonePVPInfo() + if arena then + pfUI.minimapZone.text:SetTextColor(1.0, 0.1, 0.1) + elseif pvp == "friendly" then + pfUI.minimapZone.text:SetTextColor(0.1, 1.0, 0.1) + elseif pvp == "hostile" then + pfUI.minimapZone.text:SetTextColor(1.0, 0.1, 0.1) + elseif pvp == "contested" then + pfUI.minimapZone.text:SetTextColor(1.0, 0.7, 0) + else + pfUI.minimapZone.text:SetTextColor(1, 1, 1, 1) + end + pfUI.minimapZone.text:SetText(GetMinimapZoneText()) + end + end) + + if C.appearance.minimap.zonetext ~= "on" then + pfUI.minimapZone:Hide() + else + pfUI.minimapZone:Show() + end + + -- Minimap hover event + -- Update and toggle showing of coordinates and zone text on mouse enter/leave + Minimap:SetScript("OnEnter", function() + if C.appearance.minimap.coordstext ~= "off" then + pfUI.minimapCoordinates:Show() + end + if C.appearance.minimap.zonetext ~= "off" then + pfUI.minimapZone:Show() + end + end) + Minimap:SetScript("OnLeave", function() + if C.appearance.minimap.coordstext ~= "on" then + pfUI.minimapCoordinates:Hide() + end + if C.appearance.minimap.zonetext ~= "on" then + pfUI.minimapZone:Hide() + end + end) + + pfUI.minimap.pvpicon = CreateFrame("Frame", nil, pfUI.minimap) + pfUI.minimap.pvpicon:Hide() + pfUI.minimap.pvpicon:RegisterEvent("UPDATE_FACTION") + pfUI.minimap.pvpicon:RegisterEvent("UNIT_FACTION") + pfUI.minimap.pvpicon:SetFrameStrata("HIGH") + pfUI.minimap.pvpicon:SetWidth(16) + pfUI.minimap.pvpicon:SetHeight(16) + pfUI.minimap.pvpicon:SetAlpha(.5) + pfUI.minimap.pvpicon:SetParent(pfUI.minimap) + pfUI.minimap.pvpicon:SetPoint("BOTTOMRIGHT", pfUI.minimap, "BOTTOMRIGHT", -5, 5) + pfUI.minimap.pvpicon.texture = pfUI.minimap.pvpicon:CreateTexture(nil,"DIALOG") + pfUI.minimap.pvpicon.texture:SetTexture(pfUI.media["img:pvp"]) + pfUI.minimap.pvpicon.texture:SetAllPoints(pfUI.minimap.pvpicon) + + pfUI.minimap.pvpicon:SetScript("OnEvent", function() + if C.unitframes.player.showPVPMinimap == "1" and UnitIsPVP("player") then + pfUI.minimap.pvpicon:Show() + else + pfUI.minimap.pvpicon:Hide() + end + end) + +end)