Add files via upload

This commit is contained in:
Relationship
2026-07-02 13:47:16 +01:00
committed by GitHub
commit aad6d666ea
46 changed files with 3091 additions and 0 deletions
+557
View File
@@ -0,0 +1,557 @@
local useUiScale = tonumber(GetCVar("useUiScale"))
local uiScale = GetCVar("uiScale")
if useUiScale ~= 1 then uiScale = 1 end
frameWidth = UIParent:GetWidth() / uiScale
xMiddle = frameWidth / 2
frameHeight = UIParent:GetHeight() / uiScale
yMiddle = frameHeight / 2
frameScale = 0.75999999046326
local _G = getfenv(0)
local timeElapsed = 0
local updateTime = 1/60
CTextures = {}
CRotateTextures = {}
-- Default minimap dimensions (before any scaling)
local defaultMinimapWidth = 140
local defaultMinimapHeight = 140
-- Track hidden minimap buttons so we can restore them
local hiddenMinimapButtons = {}
-- Minimap cluster Show hook state (for minimap hide/show toggle)
local minimapClusterHooked = false
local minimapClusterOrigShow = nil
local minimapOrigShow = nil
-- Minimap button Show hook state
local minimapBtnHooked = false
-- Saved original Show functions for minimap buttons
local hiddenBtnOrigShows = {}
-- Saved original anchor points for minimap buttons (so positions are preserved across hide/show)
-- Format: hiddenBtnOrigPoints[frame] = { {point, relativeTo, relativePoint, xOfs, yOfs}, ... }
local hiddenBtnOrigPoints = {}
-- Addon version for SavedVariables migration
local ADDON_VERSION = 7
local function print(msg)
if msg and msg ~= "" then
DEFAULT_CHAT_FRAME:AddMessage(msg, 1, 1, 0)
end
end
function deepCopyHash(t)
if t == nil then return nil end
local nt = {}
for k, v in pairs(t) do
if type(v) == "table" then
nt[k] = deepCopyHash(v)
else
nt[k] = v
end
end
return nt
end
function destroyTable(t)
setmetatable(t, nil)
for k,v in pairs(t) do
t[k] = nil
end
end
-- ============================================
-- SavedVariables Migration
-- ============================================
-- Detects and fixes stale/invalid data from older addon versions.
-- Called during PLAYER_ENTERING_WORLD before any settings are applied.
local function MigrateSavedVariables()
if not SexyMap2DB then
SexyMap2DB = {}
end
-- Version-based migration: if the saved version is older than current,
-- apply fixes. This runs ONCE per version bump.
local savedVersion = SexyMap2DB.version or 0
-- Always check for invalid data regardless of version,
-- since the user might have stale data from before version tracking existed.
-- Fix empty borders array (from v1.4 when some presets had empty borders)
if SexyMap2DB.borders == nil or (type(SexyMap2DB.borders) == "table" and table.getn(SexyMap2DB.borders) == 0 and next(SexyMap2DB.borders) == nil) then
SexyMap2DB.borders = deepCopyHash(borderPresets["Diablo by Zork"].borders)
print("[SexyMap] Migrated: empty borders reset to default preset.")
end
-- Fix backdrop with invalid/missing data
if SexyMap2DB.backdrop == nil then
SexyMap2DB.backdrop = deepCopyHash(borderPresets["Diablo by Zork"].backdrop)
print("[SexyMap] Migrated: missing backdrop reset to default preset.")
else
-- Fix empty borderColor/textureColor that cause green rendering
if SexyMap2DB.backdrop.borderColor == nil or (type(SexyMap2DB.backdrop.borderColor) == "table" and next(SexyMap2DB.backdrop.borderColor) == nil) then
SexyMap2DB.backdrop.borderColor = { r = 1, g = 1, b = 1, a = 1 }
end
if SexyMap2DB.backdrop.textureColor == nil or (type(SexyMap2DB.backdrop.textureColor) == "table" and next(SexyMap2DB.backdrop.textureColor) == nil) then
SexyMap2DB.backdrop.textureColor = { r = 0, g = 0, b = 0, a = 1 }
end
-- Fix settings with .blp in edgeFile/bgFile (WoW 1.12 auto-appends .blp)
if SexyMap2DB.backdrop.settings then
local s = SexyMap2DB.backdrop.settings
if s.edgeFile and string.find(s.edgeFile, "%.blp$") then
s.edgeFile = string.gsub(s.edgeFile, "%.blp$", "")
print("[SexyMap] Migrated: removed .blp from backdrop edgeFile.")
end
if s.bgFile and string.find(s.bgFile, "%.blp$") then
s.bgFile = string.gsub(s.bgFile, "%.blp$", "")
print("[SexyMap] Migrated: removed .blp from backdrop bgFile.")
end
end
end
-- Fix missing/empty shape
if SexyMap2DB.shape == nil or SexyMap2DB.shape == "" then
SexyMap2DB.shape = "Round"
end
-- Ensure all expected fields exist
if SexyMap2DB.showZoneText == nil then
SexyMap2DB.showZoneText = true
end
if SexyMap2DB.showMinimapButtons == nil then
SexyMap2DB.showMinimapButtons = true
end
if SexyMap2DB.mapScale == nil then
SexyMap2DB.mapScale = 1.0
end
if SexyMap2DB.showMinimap == nil then
SexyMap2DB.showMinimap = true
end
if not SexyMap2DB.userPresets then
SexyMap2DB.userPresets = {}
end
-- Mark the current version so migration doesn't re-run needlessly
-- (but the checks above still protect against manually-edited bad data)
SexyMap2DB.version = ADDON_VERSION
end
function CMap_OnLoad()
print("[SexyMap] v1.7 loaded for OctoWoW. Type '/sm' or '/sexymap' to open the menu.")
this:SetScript("OnEvent", CMap_OnEvent)
this:SetScript("OnUpdate", CMap_OnUpdate)
this:RegisterEvent("PLAYER_ENTERING_WORLD")
end
function CMap_OnEvent()
if event == "PLAYER_ENTERING_WORLD" then
this:UnregisterEvent("PLAYER_ENTERING_WORLD")
-- Run migration FIRST, before any settings are applied
MigrateSavedVariables()
-- Capture the default minimap dimensions before we modify anything
defaultMinimapWidth = Minimap:GetWidth()
defaultMinimapHeight = Minimap:GetHeight()
CreateFrame("Frame", "CMinimapBackdrop", Minimap)
CMinimapBackdrop:SetFrameStrata("BACKGROUND")
CMinimapBackdrop:SetFrameLevel(CMinimapBackdrop:GetFrameLevel() - 1)
CMinimapBackdrop:SetPoint("CENTER", Minimap, "CENTER")
CMinimapBackdrop:SetWidth(Minimap:GetWidth())
CMinimapBackdrop:SetHeight(Minimap:GetHeight())
-- Set an explicit default backdrop so the frame never renders as green
-- (a frame with no backdrop set can render as solid green in WoW 1.12)
CMinimapBackdrop:SetBackdrop({
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = false,
edgeSize = 16,
insets = { left = 4, right = 4, top = 4, bottom = 4 }
})
CMinimapBackdrop:SetBackdropColor(0, 0, 0, 1)
CMinimapBackdrop:SetBackdropBorderColor(1, 1, 1, 1)
CHideAnnoyingStuff()
CUpdateZoneText()
CUpdateMinimapButtonsVisibility()
CUpdateMinimapVisibility()
CApplyMapScale()
CLoadArtwork()
SlashCmdList["CMAP"] = CMap_SlashCmdHandler
SLASH_CMAP1 = "/cm"
SLASH_CMAP2 = "/sm"
SLASH_CMAP3 = "/sexymap"
end
end
function CMap_OnUpdate()
timeElapsed = timeElapsed + arg1
if timeElapsed >= updateTime then
for k,v in pairs(CRotateTextures) do
CRotateTexture(_G[k], v * timeElapsed)
end
timeElapsed = 0
end
end
function CMap_SlashCmdHandler(msg)
if not CMinimapOptionFrame.menuState then
CInitiateMenu()
else
CHideMenu()
end
end
function CHideAnnoyingStuff()
-- Hide the default minimap border art (we draw our own borders)
MinimapBorder:Hide()
MinimapBorderTop:Hide()
-- Hide the X button (minimap toggle) — we now control this from the GUI
MinimapToggleButton:Hide()
-- Hide zoom buttons ( SexyMap handles its own zoom or user doesn't need them )
MinimapZoomIn:Hide()
MinimapZoomOut:Hide()
-- Style the zone text font
MinimapZoneText:SetFont("Fonts\\FRIZQT__.TTF", 11, "OUTLINE")
end
-- ============================================
-- Minimap visibility (replaces the X button)
-- ============================================
-- In vanilla WoW 1.12, MinimapToggleButton calls ToggleMinimap() which
-- hides/shows just the Minimap frame. We replace this with a full
-- MinimapCluster hide/show controlled from the GUI, and hook Show/Hide
-- to prevent anything from re-showing the minimap when it should be hidden.
local function MinimapClusterHookedShow(self)
if not SexyMap2DB.showMinimap then
return -- Block the Show, minimap stays hidden
end
if minimapClusterOrigShow then
minimapClusterOrigShow(self)
end
end
local function MinimapHookedShow(self)
if not SexyMap2DB.showMinimap then
return -- Block the Show, minimap stays hidden
end
if minimapOrigShow then
minimapOrigShow(self)
end
end
function CUpdateMinimapVisibility()
if SexyMap2DB.showMinimap then
-- Show the minimap cluster - unhook first
if minimapClusterHooked then
if MinimapCluster then
MinimapCluster.Show = minimapClusterOrigShow
end
if Minimap then
Minimap.Show = minimapOrigShow
end
minimapClusterHooked = false
minimapClusterOrigShow = nil
minimapOrigShow = nil
end
-- Show everything
if MinimapCluster then MinimapCluster:Show() end
if Minimap then Minimap:Show() end
-- Re-apply our hidden stuff (borders, zoom buttons, X button stay hidden)
CHideAnnoyingStuff()
-- Re-apply button visibility settings
CUpdateMinimapButtonsVisibility()
else
-- Hide the entire minimap cluster and hook Show to prevent re-appearance
if MinimapCluster then
if not minimapClusterHooked then
minimapClusterOrigShow = MinimapCluster.Show
MinimapCluster.Show = MinimapClusterHookedShow
minimapOrigShow = Minimap.Show
Minimap.Show = MinimapHookedShow
minimapClusterHooked = true
end
MinimapCluster:Hide()
end
end
end
-- ============================================
-- Minimap buttons visibility
-- ============================================
local function MinimapBtnHookedShow(self)
if not SexyMap2DB.showMinimapButtons then
return -- Block Show while buttons should be hidden
end
-- When buttons are allowed, call the original Show
local orig = hiddenBtnOrigShows[self]
if orig then
orig(self)
end
end
-- Save a frame's current anchor points so we can restore them later
local function SaveButtonPoints(frame)
local points = {}
local numPoints = frame:GetNumPoints()
if numPoints and numPoints > 0 then
for i = 1, numPoints do
local point, relativeTo, relativePoint, xOfs, yOfs = frame:GetPoint(i)
if point then
table.insert(points, {
point = point,
relativeTo = relativeTo,
relativePoint = relativePoint,
xOfs = xOfs,
yOfs = yOfs,
})
end
end
end
-- Only store if we actually got points; don't overwrite existing saved points with empty
if table.getn(points) > 0 then
hiddenBtnOrigPoints[frame] = points
end
end
-- Restore a frame's saved anchor points
local function RestoreButtonPoints(frame)
local points = hiddenBtnOrigPoints[frame]
if points and table.getn(points) > 0 then
frame:ClearAllPoints()
for _, pt in ipairs(points) do
frame:SetPoint(pt.point, pt.relativeTo, pt.relativePoint, pt.xOfs, pt.yOfs)
end
end
-- Clean up saved points for this frame
hiddenBtnOrigPoints[frame] = nil
end
function CUpdateMinimapButtonsVisibility()
if SexyMap2DB.showMinimapButtons then
-- Show only the buttons we previously hid (preserves original visibility)
for _, btn in ipairs(hiddenMinimapButtons) do
if btn then
-- Restore original Show
local orig = hiddenBtnOrigShows[btn]
if orig then
btn.Show = orig
hiddenBtnOrigShows[btn] = nil
end
-- Restore saved anchor points (preserves button positions across hide/show)
RestoreButtonPoints(btn)
btn:Show()
end
end
hiddenMinimapButtons = {}
else
-- Find and hide only VISIBLE minimap buttons, hook their Show
hiddenMinimapButtons = {}
local children = { Minimap:GetChildren() }
for idx, frame in ipairs(children) do
local objType = frame:GetObjectType()
if objType == "Button" or objType == "CheckButton" then
local name = frame:GetName() or ""
-- Skip our own frames and WoW native controls we already hide
if name ~= "MinimapZoomIn" and name ~= "MinimapZoomOut"
and name ~= "MinimapToggleButton" and name ~= "GameTimeFrame"
and name ~= "CMinimapBackdrop" then
-- Only hide buttons that are currently visible
-- (buttons already hidden by other addons should stay hidden)
if frame:IsVisible() then
-- Save anchor points before hiding so we can restore them later
SaveButtonPoints(frame)
-- Hook Show to prevent re-appearance
if not hiddenBtnOrigShows[frame] then
hiddenBtnOrigShows[frame] = frame.Show
frame.Show = MinimapBtnHookedShow
end
frame:Hide()
table.insert(hiddenMinimapButtons, frame)
end
end
end
end
-- Also hide known WoW minimap frames by name (only if visible)
local knownFrames = {
"MiniMapTracking",
"MiniMapTrackingButton",
"MiniMapTrackingFrame",
"MiniMapMailFrame",
"MiniMapMailBorder",
"MiniMapBattlefieldFrame",
"MiniMapMeetingStoneFrame",
"MiniMapWorldMapButton",
"MinimapVoiceChatFrame",
"MiniMapLFGFrame",
}
for _, frameName in ipairs(knownFrames) do
local frame = _G[frameName]
if frame and frame:IsVisible() then
-- Save anchor points before hiding so we can restore them later
SaveButtonPoints(frame)
if not hiddenBtnOrigShows[frame] then
hiddenBtnOrigShows[frame] = frame.Show
frame.Show = MinimapBtnHookedShow
end
frame:Hide()
table.insert(hiddenMinimapButtons, frame)
end
end
end
end
function CApplyMapScale()
local scale = SexyMap2DB.mapScale or 1.0
if scale < 0.3 then scale = 0.3 end
if scale > 1.0 then scale = 1.0 end
SexyMap2DB.mapScale = scale
-- Apply scale to the MinimapCluster which contains everything
MinimapCluster:SetScale(scale)
-- Re-anchor to TOPRIGHT - the anchor point is TOPRIGHT so when scaled down,
-- the right side and top stay put, while the left and bottom move inward
MinimapCluster:ClearAllPoints()
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", -14, 10)
-- Update backdrop to match current minimap size
CMinimapBackdrop:SetWidth(Minimap:GetWidth())
CMinimapBackdrop:SetHeight(Minimap:GetHeight())
-- Update border textures to match new minimap size
CUpdateBackdrop()
end
function CUpdateZoneText()
MinimapCluster:ClearAllPoints()
-- Map position: always anchored TOPRIGHT so scale keeps right/top fixed
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", -14, 10)
MinimapZoneText:ClearAllPoints()
if SexyMap2DB.showZoneText then
MinimapZoneText:Show()
-- Zone name positioned below the minimap
MinimapZoneText:SetPoint("TOP", Minimap, "BOTTOM", 0, -20)
else
-- Only hide the zone text; map and border do NOT move
MinimapZoneText:Hide()
end
end
-- ============================================
-- Set Defaults - resets all settings to factory
-- ============================================
function CSetDefaults()
-- Reset all SavedVariables to defaults
SexyMap2DB.borders = deepCopyHash(borderPresets["Diablo by Zork"].borders)
SexyMap2DB.backdrop = deepCopyHash(borderPresets["Diablo by Zork"].backdrop)
SexyMap2DB.shape = "Round"
SexyMap2DB.userPresets = {}
SexyMap2DB.showZoneText = true
SexyMap2DB.showMinimapButtons = true
SexyMap2DB.mapScale = 1.0
SexyMap2DB.showMinimap = true
SexyMap2DB.version = ADDON_VERSION
-- Reapply everything
CHideAnnoyingStuff()
CUpdateZoneText()
CUpdateMinimapButtonsVisibility()
CUpdateMinimapVisibility()
CApplyMapScale()
CClearArtwork()
CLoadArtwork()
-- Refresh the GUI if it's open
if CMinimapOptionFrame and CMinimapOptionFrame.menuState then
CUpdatePresetList()
CUpdateShapeList()
CTexture_Update()
CZoneTextToggle_Update()
CMinimapButtonsToggle_Update()
CMinimapToggle_Update()
CMapScaleSlider_Update()
CVariable_Update()
end
print("[SexyMap] All settings reset to defaults.")
end
function CClearArtwork()
for k,v in pairs(CTextures) do
_G[k]:SetTexCoord(0,1,0,1)
_G[k]:Hide()
end
destroyTable(CTextures)
CTextures = {}
destroyTable(CRotateTextures)
CRotateTextures = {}
end
function CLoadArtwork()
if SexyMap2DB.shape then
CApplyShape(SexyMap2DB.shape)
end
for k,v in ipairs(SexyMap2DB.borders) do
CCreateBorder(v)
end
CUpdateBackdrop()
end
function CUpdateBackdrop()
if not SexyMap2DB.backdrop or not SexyMap2DB.backdrop.show then
CMinimapBackdrop:Hide()
else
local backdrop = CMinimapBackdrop
backdrop:Show()
backdrop:SetWidth(Minimap:GetWidth() * (SexyMap2DB.backdrop.scale or 1))
backdrop:SetHeight(Minimap:GetHeight() * (SexyMap2DB.backdrop.scale or 1))
-- Validate the backdrop settings before applying.
-- If edgeFile or bgFile references are invalid, WoW 1.12 renders the frame
-- as solid green (missing texture fallback). We check that the paths exist
-- in the settings table before calling SetBackdrop.
local settings = SexyMap2DB.backdrop.settings
if settings then
-- Ensure edgeFile doesn't have .blp extension (WoW 1.12 auto-appends it)
if settings.edgeFile and string.find(settings.edgeFile, "%.blp$") then
settings.edgeFile = string.gsub(settings.edgeFile, "%.blp$", "")
end
if settings.bgFile and string.find(settings.bgFile, "%.blp$") then
settings.bgFile = string.gsub(settings.bgFile, "%.blp$", "")
end
backdrop:SetBackdrop(settings)
end
-- Set backdrop color with safe defaults for empty/missing color tables
local c = SexyMap2DB.backdrop.textureColor
if c and (c.r or c.g or c.b or c.a) then
backdrop:SetBackdropColor(c.r or 0, c.g or 0, c.b or 0, c.a or 1)
else
-- Default: black background, full opacity
backdrop:SetBackdropColor(0, 0, 0, 1)
end
-- Set border color with safe defaults for empty/missing color tables
c = SexyMap2DB.backdrop.borderColor
if c and (c.r or c.g or c.b or c.a) then
backdrop:SetBackdropBorderColor(c.r or 1, c.g or 1, c.b or 1, c.a or 1)
else
-- Default: white border, full opacity
backdrop:SetBackdropBorderColor(1, 1, 1, 1)
end
end
end