Files
2026-07-23 12:06:26 +00:00

148 lines
5.1 KiB
Lua

-- Movable / hideable minimap button.
-- Named "RelationshipsAchievementsMinimapButton" and parented to Minimap so
-- MinimapButtonBag and MinimapButtonFrame automatically discover and manage it.
local MMB = CreateFrame("Button", "RelationshipsAchievementsMinimapButton", Minimap)
MMB:SetFrameStrata("MEDIUM")
MMB:SetWidth(31); MMB:SetHeight(31)
MMB:SetFrameLevel(8)
MMB:RegisterForClicks("LeftButtonUp", "RightButtonUp")
MMB:RegisterForDrag("LeftButton")
MMB:SetMovable(true)
MMB:SetClampedToScreen(true)
-- Ring (matches other minimap addons like Cartographer / Titan)
local overlay = MMB:CreateTexture(nil, "OVERLAY")
overlay:SetWidth(53); overlay:SetHeight(53)
overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
overlay:SetPoint("TOPLEFT", MMB, "TOPLEFT", 0, 0)
-- Icon
local icon = MMB:CreateTexture(nil, "BACKGROUND")
icon:SetWidth(20); icon:SetHeight(20)
icon:SetTexture("Interface\\Icons\\Achievement_General")
icon:SetPoint("CENTER", MMB, "CENTER", 0, 1)
MMB.icon = icon
-- Highlight
local hi = MMB:CreateTexture(nil, "HIGHLIGHT")
hi:SetTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
hi:SetWidth(31); hi:SetHeight(31)
hi:SetPoint("CENTER", MMB, "CENTER", 0, 1)
hi:SetBlendMode("ADD")
local function GetDB()
RelationshipsAchievementsDB = RelationshipsAchievementsDB or {}
if not RelationshipsAchievementsDB.minimap then
RelationshipsAchievementsDB.minimap = { angle = 200, radius = 80, hide = false, free = false, x = 0, y = 0 }
end
local m = RelationshipsAchievementsDB.minimap
if m.angle == nil then m.angle = 200 end
if m.radius == nil then m.radius = 80 end
if m.hide == nil then m.hide = false end
if m.free == nil then m.free = false end
return m
end
local function ApplyPosition()
local m = GetDB()
MMB:ClearAllPoints()
if m.free then
MMB:SetPoint("CENTER", UIParent, "CENTER", m.x or 0, m.y or 0)
else
local a = math.rad(m.angle or 200)
local r = m.radius or 80
MMB:SetPoint("CENTER", Minimap, "CENTER",
math.cos(a) * r, math.sin(a) * r)
end
end
local function ApplyVisibility()
local m = GetDB()
if m.hide then MMB:Hide() else MMB:Show() end
end
-- Drag around the minimap ring (or free-drag anywhere with Shift held).
local function MoveOnUpdate()
local m = GetDB()
local mx, my = Minimap:GetCenter()
if not mx then return end
local scale = Minimap:GetEffectiveScale()
local cx, cy = GetCursorPosition()
cx, cy = cx / scale, cy / scale
if IsShiftKeyDown() then
m.free = true
local ux, uy = UIParent:GetCenter()
local uscale = UIParent:GetEffectiveScale()
local px, py = GetCursorPosition()
m.x = px / uscale - ux
m.y = py / uscale - uy
else
m.free = false
local dx, dy = cx - mx, cy - my
m.angle = math.deg(math.atan2(dy, dx))
end
ApplyPosition()
end
MMB:SetScript("OnDragStart", function()
this:LockHighlight()
this:SetScript("OnUpdate", MoveOnUpdate)
end)
MMB:SetScript("OnDragStop", function()
this:UnlockHighlight()
this:SetScript("OnUpdate", nil)
end)
MMB:SetScript("OnClick", function()
if arg1 == "RightButton" then
if RelationshipsAchievements_MinimapMenu then
RelationshipsAchievements_MinimapMenu()
else
local m = GetDB()
m.hide = true
ApplyVisibility()
DEFAULT_CHAT_FRAME:AddMessage("|cffffd200Relationships Achievements:|r minimap button hidden. Type |cff00ff00/rach minimap show|r to restore.")
end
else
if RelationshipsAchievements_Toggle then RelationshipsAchievements_Toggle() end
end
end)
MMB:SetScript("OnEnter", function()
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
GameTooltip:AddLine("Relationships Achievements")
local pts = RelationshipsAchievements and RelationshipsAchievements.TotalPoints and RelationshipsAchievements:TotalPoints() or 0
GameTooltip:AddLine("|cffffd200Points:|r "..pts, 1, 1, 1)
GameTooltip:AddLine(" ")
GameTooltip:AddLine("Left-click: open panel", 0.6, 0.8, 1)
GameTooltip:AddLine("Right-click: hide button", 0.6, 0.8, 1)
GameTooltip:AddLine("Drag: move around minimap", 0.6, 0.8, 1)
GameTooltip:AddLine("Shift+Drag: free-place anywhere", 0.6, 0.8, 1)
GameTooltip:Show()
end)
MMB:SetScript("OnLeave", function() GameTooltip:Hide() end)
local init = CreateFrame("Frame")
init:RegisterEvent("PLAYER_LOGIN")
init:RegisterEvent("PLAYER_ENTERING_WORLD")
init:SetScript("OnEvent", function()
ApplyPosition()
ApplyVisibility()
end)
function RelationshipsAchievements_Minimap_Show()
local m = GetDB(); m.hide = false; ApplyVisibility()
end
function RelationshipsAchievements_Minimap_Hide()
local m = GetDB(); m.hide = true; ApplyVisibility()
end
function RelationshipsAchievements_Minimap_Toggle()
local m = GetDB(); m.hide = not m.hide; ApplyVisibility()
end
function RelationshipsAchievements_Minimap_Reset()
RelationshipsAchievementsDB = RelationshipsAchievementsDB or {}
RelationshipsAchievementsDB.minimap = { angle = 200, radius = 80, hide = false, free = false, x = 0, y = 0 }
ApplyPosition(); ApplyVisibility()
end