Files
pfUI/modules/minimap.lua
T
Brues a8d805626d Replace QueueFunction and RunOOC with RunNextFrame
RunOOC never waited for combat to end; it ran its function on the next
frame. QueueFunction ran one function every 0.2 seconds. Each caller now
defers with ClassicAPI's RunNextFrame.

The loot roll announcement sends its name lists and the roll directly.
The 0.2 second spacing did not help with the server's chat flood limit
(10 messages less than a second apart), and an announcement is at most
four messages.
2026-10-31 01:57:10 -05:00

245 lines
8.8 KiB
Lua

pfUI:RegisterModule("minimap", 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()
RunNextFrame(function() ShowUIPanel(Minimap) end)
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:SetSize(size, size)
Minimap:SetSize(size, 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(nil, "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)
-- Blink ten times between .9 and .1, then hide
local highlight = this.highlight
highlight:SetAlpha(.9)
highlight.blink = highlight:CreateAnimationGroup()
for i = 1, 10 do
local down = highlight.blink:CreateAnimation("Alpha")
down:SetChange(-.8)
down:SetDuration(.3)
down:SetOrder(i * 2 - 1)
local up = highlight.blink:CreateAnimation("Alpha")
up:SetChange(.8)
up:SetDuration(.3)
up:SetOrder(i * 2)
end
highlight.blink:SetScript("OnFinished", function() highlight:Hide() end)
end
this.highlight:Show()
this.highlight.blink:Stop()
this.highlight.blink:Play()
end)
-- Create coordinates text frame with location configurable
pfUI.minimapCoordinates = CreateFrame("Frame", "pfMinimapCoord", pfUI.minimap)
-- Update coords every 0.1 seconds
C_Timer.NewTicker(0.1, function()
if C.appearance.minimap.coordstext == "off" then return end
local coord = pfUI.minimapCoordinates
coord.posX, coord.posY = GetPlayerMapPosition("player")
if coord.posX ~= 0 and coord.posY ~= 0 then
coord.text:SetFormattedText("%.1f, %.1f", round(coord.posX * 100, 1), round(coord.posY * 100, 1))
else
coord.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:SetSize(Minimap:GetWidth(), C.global.font_size)
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
pfUI.minimapCoordinates:SetShown(C.appearance.minimap.coordstext == "on")
-- 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:SetSize(Minimap:GetWidth(), C.global.font_size + 2)
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(WHITE_FONT_COLOR:GetRGBA())
end
pfUI.minimapZone.text:SetText(GetMinimapZoneText())
end
end)
pfUI.minimapZone:SetShown(C.appearance.minimap.zonetext == "on")
-- 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:RegisterUnitEvent("UNIT_FACTION", "player")
pfUI.minimap.pvpicon:SetFrameStrata("HIGH")
pfUI.minimap.pvpicon:SetSize(16, 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()
pfUI.minimap.pvpicon:SetShown(C.unitframes.player.showPVPMinimap == "1" and UnitIsPVP("player"))
end)
end)