commit aad6d666eaf6f5e73d910266226be567810b6492
Author: Relationship <139162359+Relationship-OctoWoW@users.noreply.github.com>
Date: Thu Jul 2 13:47:16 2026 +0100
Add files via upload
diff --git a/CMap.lua b/CMap.lua
new file mode 100644
index 0000000..77ce078
--- /dev/null
+++ b/CMap.lua
@@ -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
diff --git a/CMap.xml b/CMap.xml
new file mode 100644
index 0000000..ec0dd6b
--- /dev/null
+++ b/CMap.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+ CMap_OnLoad()
+
+
+
+
diff --git a/COptions.lua b/COptions.lua
new file mode 100644
index 0000000..2584862
--- /dev/null
+++ b/COptions.lua
@@ -0,0 +1,395 @@
+local _G = getfenv(0)
+local textureOffset = 0
+local minimapX
+local minimapY
+local getn = table.getn
+presetNames = { "Diablo by Zork", "Faded Square by Renaitre", "Blue Rune Circles", "Blue Rune Diamond", "Burning Sun", "Stargate", "Simple Square", "Ruins", "Emerald Portal", "Shamanism", "Space by Ruka", "Clouds by koccs", "Rogue", "Electric", "LL Corner Rounded", }
+shapeNames = { "Round", "Square", "Diamond", "Hexagon", "Octagon", "Heart", "Snowflake", "LL Corner Rounded", "LR Corner Rounded", "UL Corner Rounded", "UR Corner Rounded", "Large Circle", "Route66", "Deathsky", "VFX Border",}
+
+variableOptionSliders = {
+ { text = "Rotation Speed", func = "CRotSpeedChanged", value = "rotSpeed", minValue = -64, maxValue = 64, valueStep = 1 },
+ { text = "Scale", func = "CScaleChanged", value = "scale", minValue = 0.0, maxValue = 4, valueStep = 0.01 },
+}
+
+-- Pagination state
+local presetPage = 0
+local shapePage = 0
+local PRESETS_PER_PAGE = 8
+local SHAPES_PER_PAGE = 8
+
+local function print(msg)
+ if msg and msg ~= "" then
+ DEFAULT_CHAT_FRAME:AddMessage(msg, 1, 1, 1)
+ end
+end
+
+function NotImportant_OnLoad()
+end
+
+function CApplyPreset(preset)
+ local preset = SexyMap2DB.userPresets[preset] or borderPresets[preset]
+
+ SexyMap2DB.borders = deepCopyHash(preset.borders)
+ SexyMap2DB.backdrop = deepCopyHash(preset.backdrop)
+ SexyMap2DB.shape = preset.shape
+ CTextureOptionFrame.selectedTexture = nil
+
+ CClearArtwork()
+ CLoadArtwork()
+ CTexture_Update()
+ CVariable_Update()
+ CUpdateShapeList()
+end
+
+function CInitiateMenu()
+ CSexyMapMainFrame:Show()
+ -- Show sub-frames
+ CTextureOptionFrame:Show()
+ CMinimapOptionFrame:Show()
+ -- Initialize all lists
+ CUpdatePresetList()
+ CUpdateShapeList()
+ CTexture_Update()
+ CZoneTextToggle_Update()
+ CMinimapButtonsToggle_Update()
+ CMinimapToggle_Update()
+ CMapScaleSlider_Update()
+ CMinimapOptionFrame.menuState = true
+end
+
+function CHideMenu()
+ CTextureOptionFrame.selectedTexture = nil
+ CVariableOptionFrame:Hide()
+ CSexyMapMainFrame:Hide()
+ CMinimapOptionFrame.menuState = false
+end
+
+-------------------------------------------------
+-- Preset list (button-based, replaces dropdown)
+-------------------------------------------------
+function CUpdatePresetList()
+ local startIdx = presetPage * PRESETS_PER_PAGE + 1
+ for i = 1, PRESETS_PER_PAGE do
+ local btn = _G["CPresetBtn"..i]
+ local idx = startIdx + i - 1
+ if idx <= getn(presetNames) then
+ btn:SetText(presetNames[idx])
+ btn.presetName = presetNames[idx]
+ btn:Show()
+ else
+ btn:Hide()
+ end
+ end
+ -- Prev/Next buttons
+ if presetPage > 0 then
+ CPresetPrevBtn:Show()
+ else
+ CPresetPrevBtn:Hide()
+ end
+ if (presetPage + 1) * PRESETS_PER_PAGE < getn(presetNames) then
+ CPresetNextBtn:Show()
+ else
+ CPresetNextBtn:Hide()
+ end
+end
+
+function CPresetBtn_OnClick()
+ local name = this.presetName
+ if name then
+ CApplyPreset(name)
+ end
+end
+
+
+function CPresetPrev_OnClick()
+ if presetPage > 0 then
+ presetPage = presetPage - 1
+ CUpdatePresetList()
+ end
+end
+
+function CPresetNext_OnClick()
+ if (presetPage + 1) * PRESETS_PER_PAGE < getn(presetNames) then
+ presetPage = presetPage + 1
+ CUpdatePresetList()
+ end
+end
+
+-------------------------------------------------
+-- Shape list (button-based, replaces dropdown)
+-------------------------------------------------
+function CUpdateShapeList()
+ local startIdx = shapePage * SHAPES_PER_PAGE + 1
+ for i = 1, SHAPES_PER_PAGE do
+ local btn = _G["CShapeBtn"..i]
+ local idx = startIdx + i - 1
+ if idx <= getn(shapeNames) then
+ btn:SetText(shapeNames[idx])
+ btn.shapeName = shapeNames[idx]
+ if SexyMap2DB.shape == shapeNames[idx] then
+ btn:LockHighlight()
+ else
+ btn:UnlockHighlight()
+ end
+ btn:Show()
+ else
+ btn:Hide()
+ end
+ end
+ -- Prev/Next buttons
+ if shapePage > 0 then
+ CShapePrevBtn:Show()
+ else
+ CShapePrevBtn:Hide()
+ end
+ if (shapePage + 1) * SHAPES_PER_PAGE < getn(shapeNames) then
+ CShapeNextBtn:Show()
+ else
+ CShapeNextBtn:Hide()
+ end
+end
+
+function CShapeBtn_OnClick()
+ local name = this.shapeName
+ if name then
+ SexyMap2DB.shape = name
+ CApplyShape(SexyMap2DB.shape)
+ CUpdateShapeList()
+ end
+end
+
+function CShapePrev_OnClick()
+ if shapePage > 0 then
+ shapePage = shapePage - 1
+ CUpdateShapeList()
+ end
+end
+
+function CShapeNext_OnClick()
+ if (shapePage + 1) * SHAPES_PER_PAGE < getn(shapeNames) then
+ shapePage = shapePage + 1
+ CUpdateShapeList()
+ end
+end
+
+-------------------------------------------------
+-- Texture list (border texture buttons)
+-------------------------------------------------
+function CTexture_Update()
+ local button
+ for i=1,12 do
+ button = _G["CTextureButton"..i]
+ textureIndex = textureOffset + i
+ button.textureIndex = textureIndex
+
+ if not SexyMap2DB.borders[textureIndex] then
+ button:Hide()
+ else
+ button:Show()
+ _G["CTextureButton"..i.."Texture"]:SetText(SexyMap2DB.borders[textureIndex].name or SexyMap2DB.borders[textureIndex].texture)
+ end
+
+ if CTextureOptionFrame.selectedTexture == textureIndex then
+ button:LockHighlight()
+ else
+ button:UnlockHighlight()
+ end
+ end
+end
+
+function CMinimap_Update()
+ -- Shape highlight handled in CUpdateShapeList
+end
+
+function CVariable_Update()
+ if not CTextureOptionFrame.selectedTexture then
+ CVariableOptionFrame:Hide()
+ return
+ else
+ CVariableOptionFrame:Show()
+ end
+ local texture = CTextureOptionFrame.selectedTexture
+ local button
+ local slider
+ local string
+ local thumb
+ local high
+ local low
+ for i,v in ipairs(variableOptionSliders) do
+ slider = _G["CVariableSlider"..i]
+ string = _G["CVariableSlider"..i.."Text"]
+ thumb = _G["CVariableSlider"..i.."Thumb"]
+ high = _G["CVariableSlider"..i.."High"]
+ low = _G["CVariableSlider"..i.."Low"]
+
+ if slider.disabled then
+ CDisableSlider(slider)
+ else
+ CEnableSlider(slider)
+ end
+
+ slider:SetMinMaxValues(v.minValue, v.maxValue)
+ slider:SetValueStep(v.valueStep)
+ -- Clamp stored value to slider range before setting
+ local storedVal = SexyMap2DB.borders[texture][v.value] or 0
+ if storedVal < v.minValue then storedVal = v.minValue end
+ if storedVal > v.maxValue then storedVal = v.maxValue end
+ slider:SetValue(storedVal)
+ slider:SetScript("OnValueChanged", _G[v.func])
+ string:SetText(v.text)
+ high:SetText(v.maxValue)
+ low:SetText(v.minValue)
+ end
+end
+
+
+
+function CTextureButton_OnClick(button)
+ local id = this.textureIndex
+ CTextureOptionFrame.selectedTexture = id
+ CTexture_Update()
+ CVariable_Update()
+end
+
+function CRotSpeedChanged()
+ local i = CTextureOptionFrame.selectedTexture
+ SexyMap2DB.borders[i].rotSpeed = this:GetValue()
+ CCreateBorder(SexyMap2DB.borders[i])
+end
+
+
+function CScaleChanged()
+ local i = CTextureOptionFrame.selectedTexture
+ local val = this:GetValue()
+ -- Clamp to 0.0 minimum to prevent wrapping
+ if val < 0 then val = 0 end
+ SexyMap2DB.borders[i].scale = val
+ CCreateBorder(SexyMap2DB.borders[i])
+end
+
+
+function CDisableSlider(slider)
+ local name = slider:GetName();
+ _G[name.."Thumb"]:Hide();
+ _G[name.."Text"]:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
+ _G[name.."Low"]:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
+ _G[name.."High"]:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
+end
+
+
+function CEnableSlider(slider)
+ local name = slider:GetName();
+ _G[name.."Thumb"]:Show();
+ _G[name.."Text"]:SetVertexColor(NORMAL_FONT_COLOR.r , NORMAL_FONT_COLOR.g , NORMAL_FONT_COLOR.b);
+ _G[name.."Low"]:SetVertexColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
+ _G[name.."High"]:SetVertexColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
+end
+
+function GameMenu_AddButton(button)
+ if GameMenu_InsertAfter == nil then
+ GameMenu_InsertAfter = GameMenuButtonMacros
+ end
+ if GameMenu_InsertBefore == nil then
+ GameMenu_InsertBefore = GameMenuButtonLogout
+ end
+
+ button:ClearAllPoints()
+ button:SetPoint( "TOP", GameMenu_InsertAfter:GetName(), "BOTTOM", 0, -1 )
+ GameMenu_InsertBefore:SetPoint( "TOP", button:GetName(), "BOTTOM", 0, -1 )
+ GameMenu_InsertAfter = button
+ GameMenuFrame:SetHeight( GameMenuFrame:GetHeight() + button:GetHeight() + 2 )
+end
+
+-------------------------------------------------
+-- Zone Text Toggle
+-------------------------------------------------
+function CZoneTextToggle_OnClick()
+ if this:GetChecked() then
+ SexyMap2DB.showZoneText = true
+ else
+ SexyMap2DB.showZoneText = false
+ end
+ CUpdateZoneText()
+end
+
+function CZoneTextToggle_Update()
+ if SexyMap2DB.showZoneText then
+ CZoneTextCheckbox:SetChecked(true)
+ else
+ CZoneTextCheckbox:SetChecked(false)
+ end
+end
+
+-------------------------------------------------
+-- Minimap Buttons Toggle
+-------------------------------------------------
+function CMinimapButtonsToggle_OnClick()
+ if this:GetChecked() then
+ SexyMap2DB.showMinimapButtons = true
+ else
+ SexyMap2DB.showMinimapButtons = false
+ end
+ CUpdateMinimapButtonsVisibility()
+end
+
+function CMinimapButtonsToggle_Update()
+ if SexyMap2DB.showMinimapButtons then
+ CMinimapButtonsCheckbox:SetChecked(true)
+ else
+ CMinimapButtonsCheckbox:SetChecked(false)
+ end
+end
+
+-------------------------------------------------
+-- Minimap Visibility Toggle (replaces the X button)
+-------------------------------------------------
+function CMinimapToggle_OnClick()
+ if this:GetChecked() then
+ SexyMap2DB.showMinimap = true
+ else
+ SexyMap2DB.showMinimap = false
+ end
+ CUpdateMinimapVisibility()
+end
+
+function CMinimapToggle_Update()
+ if SexyMap2DB.showMinimap then
+ CMinimapCheckbox:SetChecked(true)
+ else
+ CMinimapCheckbox:SetChecked(false)
+ end
+end
+
+-------------------------------------------------
+-- Map Scale Slider
+-------------------------------------------------
+function CMapScaleSlider_OnValueChanged()
+ local val = this:GetValue()
+ if val < 0.3 then val = 0.3 end
+ if val > 1.0 then val = 1.0 end
+ SexyMap2DB.mapScale = val
+ CApplyMapScale()
+ -- Update the value text
+ CMapScaleSliderValueText:SetText(string.format("%.2f", val))
+end
+
+
+function CMapScaleSlider_Update()
+ CMapScaleSlider:SetMinMaxValues(0.3, 1.0)
+ CMapScaleSlider:SetValueStep(0.05)
+ local val = SexyMap2DB.mapScale or 1.0
+ if val < 0.3 then val = 0.3 end
+ if val > 1.0 then val = 1.0 end
+ CMapScaleSlider:SetValue(val)
+ CMapScaleSliderLowText:SetText("0.30")
+ CMapScaleSliderHighText:SetText("1.00")
+ CMapScaleSliderValueText:SetText(string.format("%.2f", val))
+end
+
+
+-------------------------------------------------
+-- Set Defaults Button
+-------------------------------------------------
+function CSetDefaultsBtn_OnClick()
+ CSetDefaults()
+end
diff --git a/COptions.xml b/COptions.xml
new file mode 100644
index 0000000..4b5a8c0
--- /dev/null
+++ b/COptions.xml
@@ -0,0 +1,711 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ this:RegisterForDrag("LeftButton")
+
+
+ this:StartMoving()
+
+
+ this:StopMovingOrSizing()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CZoneTextToggle_OnClick()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CMinimapButtonsToggle_OnClick()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CMinimapToggle_OnClick()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CMapScaleSlider_OnValueChanged()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SexyMap.toc b/SexyMap.toc
new file mode 100644
index 0000000..078cfdd
--- /dev/null
+++ b/SexyMap.toc
@@ -0,0 +1,11 @@
+## Interface: 11200
+## Title: SexyMap - OctoWoW
+## Notes: OctoWoW-compatible backport of SexyMap with custom borders and shapes
+## Author: Packaged By Relationship
+## Version: 1.7
+## SavedVariables: SexyMap2DB
+## X-Website: https://github.com/Relationship-OctoWoW/SexyMap
+## X-GitHub: https://github.com/Relationship-OctoWoW/SexyMap
+
+CMap.xml
+COptions.xml
diff --git a/borders.lua b/borders.lua
new file mode 100644
index 0000000..f9566d4
--- /dev/null
+++ b/borders.lua
@@ -0,0 +1,115 @@
+local _G = getfenv(0)
+local defaultSize = 180
+local math = math
+local sin = math.sin
+local cos = math.cos
+borderTextures = {
+ ["AURARUNE256.BLP"] = "SPELLS\\AURARUNE256.BLP",
+ ["AuraRune256b.blp"] = "SPELLS\\AuraRune256b.blp",
+ ["AuraRune_A.blp"] = "SPELLS\\AuraRune_A.blp",
+ ["AuraRune_B.blp"] = "SPELLS\\AuraRune_B.blp",
+ ["Elite"] = "Interface\\TargetingFrame\\UI-TargetingFrame-Elite",
+ ["GENERICGLOW5.BLP"] = "PARTICLES\\GENERICGLOW5.BLP",
+ ["GENERICGLOW64.BLP"] = "SPELLS\\GENERICGLOW64.BLP",
+ ["gradientCircle.blp"] = "Interface\\GLUES\\MODELS\\UI_Tauren\\gradientCircle.blp",
+ ["Nature_Rune_128.blp"] = "SPELLS\\Nature_Rune_128.blp",
+ ["Rare"] = "Interface\\TargetingFrame\\UI-TargetingFrame-Rare",
+ ["ShamanStoneAir.blp"] = "World\\GENERIC\\PASSIVEDOODADS\\ShamanStone\\ShamanStoneAir.blp",
+ ["SHAMANSTONEEARTH.blp"] = "World\\GENERIC\\PASSIVEDOODADS\\ShamanStone\\SHAMANSTONEEARTH.blp",
+ ["ShamanStoneFlame.blp"] = "World\\GENERIC\\PASSIVEDOODADS\\ShamanStone\\ShamanStoneFlame.blp",
+ ["ShamanStoneWater.blp"] = "World\\GENERIC\\PASSIVEDOODADS\\ShamanStone\\ShamanStoneWater.blp",
+ ["Shockwave4.blp"] = "SPELLS\\Shockwave4.blp",
+ ["Shockwave_blue.blp"] = "World\\ENVIRONMENT\\DOODAD\\GENERALDOODADS\\ELEMENTALRIFTS\\Shockwave_blue.blp",
+ ["SHOCKWAVE_INVERTGREY.BLP"] = "SPELLS\\SHOCKWAVE_INVERTGREY.BLP",
+ ["TREANTLEAVES.BLP"] = "SPELLS\\TREANTLEAVES.BLP",
+ ["T_VFX_HERO_CIRCLE.BLP"] = "SPELLS\\T_VFX_HERO_CIRCLE.BLP",
+ -- Diablo preset textures (addon-local BLP files)
+ ["MAP_OVERLAY"] = "Interface\\AddOns\\SexyMap\\media\\map_overlay",
+ ["MAP_GLOSS"] = "Interface\\AddOns\\SexyMap\\media\\map_gloss",
+ ["MAP_INNERSHADOW"] = "Interface\\AddOns\\SexyMap\\media\\map_innershadow",
+ ["ZAHNRAD"] = "Interface\\AddOns\\SexyMap\\media\\zahnrad",
+ -- Renaitre textures (addon-local BLP files)
+ ["RENAITRE_FADE_BORDER"] = "Interface\\AddOns\\SexyMap\\media\\RenaitreFadeBorder",
+ ["RENAITRE_FADE_NORMAL"] = "Interface\\AddOns\\SexyMap\\media\\RenaitreFadeNormal",
+ ["RENAITRE_FADE_GLOSS"] = "Interface\\AddOns\\SexyMap\\media\\RenaitreFadeGloss",
+ -- Classic media textures (addon-local BLP files)
+ ["AUCHINDOUN_VORTEXCLOUD01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\auchindoun_vortexcloud01",
+ ["AURA_01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\aura_01",
+ ["BLADESEDGEPLANET04"] = "Interface\\AddOns\\SexyMap\\media\\classic\\bladesedgeplanet04",
+ ["DEATHSKY_VORTEXCLOUD01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\deathsky_vortexcloud01",
+ ["DEATHWINGFIGHTSKY_CLOUDSMASK03"] = "Interface\\AddOns\\SexyMap\\media\\classic\\deathwingfightsky_cloudsmask03",
+ ["DEATHWINGFIGHTSKY_PARTICLECLOUD"] = "Interface\\AddOns\\SexyMap\\media\\classic\\deathwingfightsky_particlecloud",
+ ["DEEPHOLMSKY_NEBULA01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\deepholmsky_nebula01",
+ ["GALAXY_02"] = "Interface\\AddOns\\SexyMap\\media\\classic\\galaxy_02",
+ ["HELLFIREPLANET03"] = "Interface\\AddOns\\SexyMap\\media\\classic\\hellfireplanet03",
+ ["HELLFIREPLANET_BLUE01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\hellfireplanet_blue01",
+ ["HELLFIREPLANET_RED01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\hellfireplanet_red01",
+ ["ICECROWN_CLOUDSA02_MASK01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\icecrown_cloudsa02_mask01",
+ ["ICECROWN_CLOUDSA02_MASK02"] = "Interface\\AddOns\\SexyMap\\media\\classic\\icecrown_cloudsa02_mask02",
+ ["LIGHTNING_NEW"] = "Interface\\AddOns\\SexyMap\\media\\classic\\lightning_new",
+ ["ROGUERUNE2"] = "Interface\\AddOns\\SexyMap\\media\\classic\\roguerune2",
+ ["SWATHSMALLSTONES"] = "Interface\\AddOns\\SexyMap\\media\\classic\\swathsmallstones",
+ ["TREANTLEAVES"] = "Interface\\AddOns\\SexyMap\\media\\classic\\treantleaves",
+ ["T_VFX_HERO_CIRCLE"] = "Interface\\AddOns\\SexyMap\\media\\classic\\t_vfx_hero_circle",
+ ["UL_SPINNINGROOMRINGS_RING07"] = "Interface\\AddOns\\SexyMap\\media\\classic\\ul_spinningroomrings_ring07",
+ ["WINTERGRASP_CLOUDMASK01"] = "Interface\\AddOns\\SexyMap\\media\\classic\\wintergrasp_cloudmask01",
+}
+
+function CCreateBorder(t)
+ texture = _G[t.name] or Minimap:CreateTexture(t.name)
+ -- Clamp scale to 0.0 minimum; 0.0 means invisible
+ local effectiveScale = t.scale or 1
+ if effectiveScale < 0 then effectiveScale = 0 end
+ if effectiveScale == 0 then
+ texture:Hide()
+ -- Still register in CTextures so we can update later
+ texture.settings = t
+ texture.angle = 0
+ CTextures[t.name] = t.name
+ return
+ end
+ texture:Show()
+ texture:SetBlendMode(t.blendMode or "ADD")
+ local texPath = borderTextures[t.texture] or t.texture
+ -- For addon-local paths (extensionless), append .blp for SetTexture compatibility in classic WoW
+ if texPath and not string.find(string.lower(texPath), ".blp") and not string.find(string.lower(texPath), ".tga") and string.find(texPath, "AddOns") then
+ texPath = texPath .. ".blp"
+ end
+ texture:SetTexture(texPath)
+ texture:SetWidth((t.width or defaultSize) * effectiveScale)
+ texture:SetHeight((t.height or defaultSize) * effectiveScale)
+ texture:SetVertexColor(t.r or 1, t.g or 1, t.b or 1)
+ texture:SetAlpha(t.a or 1)
+ texture:SetPoint(t.anchorPoint or "CENTER",
+ t.relativeTo or Minimap,
+ t.relativePoint or "CENTER",
+ t.xOffset or 0, t.yOffset or 0)
+ texture:SetDrawLayer(t.drawLayer or "ARTWORK")
+ texture.settings = t
+ texture.angle = 0
+ CTextures[t.name] = t.name
+ if t.rotSpeed and t.rotSpeed ~= 0 and not t.disableRotation then
+ CRotateTextures[t.name] = t.rotSpeed
+ end
+ if t.disableRotation then
+ texture:SetTexCoord(0, 1, 0, 1)
+ end
+ if t.rotation then
+ CRotateTexture(texture, t.rotation)
+ end
+end
+
+function CRotateTexture(self, change)
+ self.angle = (self.angle or 0) - change
+ if self.angle < 0 then self.angle = self.angle + 360 end
+ if self.angle > 360 then self.angle = self.angle - 360 end
+ --self.angle = self.angle % 360
+ s = sin(rad(self.angle))
+ c = cos(rad(self.angle))
+ self:SetTexCoord(
+ 0.5 - s, 0.5 + c, --Top Left Corner
+ 0.5 + c, 0.5 + s, --Bottom Left Corner
+ 0.5 - c, 0.5 - s, --Top Right Corner
+ 0.5 + s, 0.5 - c --Bottom Right Corner
+ )
+end
diff --git a/media/RenaitreFadeBorder.blp b/media/RenaitreFadeBorder.blp
new file mode 100644
index 0000000..dfe998f
Binary files /dev/null and b/media/RenaitreFadeBorder.blp differ
diff --git a/media/RenaitreFadeGloss.blp b/media/RenaitreFadeGloss.blp
new file mode 100644
index 0000000..b392821
Binary files /dev/null and b/media/RenaitreFadeGloss.blp differ
diff --git a/media/RenaitreFadeNormal.blp b/media/RenaitreFadeNormal.blp
new file mode 100644
index 0000000..bdef425
Binary files /dev/null and b/media/RenaitreFadeNormal.blp differ
diff --git a/media/classic/auchindoun_vortexcloud01.blp b/media/classic/auchindoun_vortexcloud01.blp
new file mode 100644
index 0000000..a0cb740
Binary files /dev/null and b/media/classic/auchindoun_vortexcloud01.blp differ
diff --git a/media/classic/aura_01.blp b/media/classic/aura_01.blp
new file mode 100644
index 0000000..f3a4b4f
Binary files /dev/null and b/media/classic/aura_01.blp differ
diff --git a/media/classic/bladesedgeplanet04.blp b/media/classic/bladesedgeplanet04.blp
new file mode 100644
index 0000000..dddba6f
Binary files /dev/null and b/media/classic/bladesedgeplanet04.blp differ
diff --git a/media/classic/deathsky_vortexcloud01.blp b/media/classic/deathsky_vortexcloud01.blp
new file mode 100644
index 0000000..ee46c0c
Binary files /dev/null and b/media/classic/deathsky_vortexcloud01.blp differ
diff --git a/media/classic/deathwingfightsky_cloudsmask03.blp b/media/classic/deathwingfightsky_cloudsmask03.blp
new file mode 100644
index 0000000..0dfe135
Binary files /dev/null and b/media/classic/deathwingfightsky_cloudsmask03.blp differ
diff --git a/media/classic/deathwingfightsky_particlecloud.blp b/media/classic/deathwingfightsky_particlecloud.blp
new file mode 100644
index 0000000..9c80adc
Binary files /dev/null and b/media/classic/deathwingfightsky_particlecloud.blp differ
diff --git a/media/classic/deepholmsky_nebula01.blp b/media/classic/deepholmsky_nebula01.blp
new file mode 100644
index 0000000..e998aef
Binary files /dev/null and b/media/classic/deepholmsky_nebula01.blp differ
diff --git a/media/classic/galaxy_02.blp b/media/classic/galaxy_02.blp
new file mode 100644
index 0000000..d8a2a42
Binary files /dev/null and b/media/classic/galaxy_02.blp differ
diff --git a/media/classic/hellfireplanet03.blp b/media/classic/hellfireplanet03.blp
new file mode 100644
index 0000000..53904c6
Binary files /dev/null and b/media/classic/hellfireplanet03.blp differ
diff --git a/media/classic/hellfireplanet_blue01.blp b/media/classic/hellfireplanet_blue01.blp
new file mode 100644
index 0000000..6a07588
Binary files /dev/null and b/media/classic/hellfireplanet_blue01.blp differ
diff --git a/media/classic/hellfireplanet_red01.blp b/media/classic/hellfireplanet_red01.blp
new file mode 100644
index 0000000..73a23fe
Binary files /dev/null and b/media/classic/hellfireplanet_red01.blp differ
diff --git a/media/classic/icecrown_cloudsa02_mask01.blp b/media/classic/icecrown_cloudsa02_mask01.blp
new file mode 100644
index 0000000..797710a
Binary files /dev/null and b/media/classic/icecrown_cloudsa02_mask01.blp differ
diff --git a/media/classic/icecrown_cloudsa02_mask02.blp b/media/classic/icecrown_cloudsa02_mask02.blp
new file mode 100644
index 0000000..f7e8563
Binary files /dev/null and b/media/classic/icecrown_cloudsa02_mask02.blp differ
diff --git a/media/classic/lightning_new.blp b/media/classic/lightning_new.blp
new file mode 100644
index 0000000..2c826b6
Binary files /dev/null and b/media/classic/lightning_new.blp differ
diff --git a/media/classic/roguerune2.blp b/media/classic/roguerune2.blp
new file mode 100644
index 0000000..0b6790f
Binary files /dev/null and b/media/classic/roguerune2.blp differ
diff --git a/media/classic/swathsmallstones.blp b/media/classic/swathsmallstones.blp
new file mode 100644
index 0000000..f8ef03e
Binary files /dev/null and b/media/classic/swathsmallstones.blp differ
diff --git a/media/classic/t_vfx_hero_circle.blp b/media/classic/t_vfx_hero_circle.blp
new file mode 100644
index 0000000..94eeb1b
Binary files /dev/null and b/media/classic/t_vfx_hero_circle.blp differ
diff --git a/media/classic/treantleaves.blp b/media/classic/treantleaves.blp
new file mode 100644
index 0000000..8bc6972
Binary files /dev/null and b/media/classic/treantleaves.blp differ
diff --git a/media/classic/ul_spinningroomrings_ring07.blp b/media/classic/ul_spinningroomrings_ring07.blp
new file mode 100644
index 0000000..ae9bc94
Binary files /dev/null and b/media/classic/ul_spinningroomrings_ring07.blp differ
diff --git a/media/classic/wintergrasp_cloudmask01.blp b/media/classic/wintergrasp_cloudmask01.blp
new file mode 100644
index 0000000..1a7496d
Binary files /dev/null and b/media/classic/wintergrasp_cloudmask01.blp differ
diff --git a/media/map_gloss.blp b/media/map_gloss.blp
new file mode 100644
index 0000000..19650f8
Binary files /dev/null and b/media/map_gloss.blp differ
diff --git a/media/map_innershadow.blp b/media/map_innershadow.blp
new file mode 100644
index 0000000..72deee2
Binary files /dev/null and b/media/map_innershadow.blp differ
diff --git a/media/map_overlay.blp b/media/map_overlay.blp
new file mode 100644
index 0000000..1327137
Binary files /dev/null and b/media/map_overlay.blp differ
diff --git a/media/zahnrad.blp b/media/zahnrad.blp
new file mode 100644
index 0000000..2f72799
Binary files /dev/null and b/media/zahnrad.blp differ
diff --git a/presets.lua b/presets.lua
new file mode 100644
index 0000000..fbfcb1d
--- /dev/null
+++ b/presets.lua
@@ -0,0 +1,1213 @@
+borderPresets = {
+ ["Diablo by Zork"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["name"] = "Ring",
+ ["scale"] = 1.45,
+ ["rotation"] = 225,
+ ["texture"] = "MAP_OVERLAY",
+ ["blendMode"] = "BLEND",
+ ["width"] = 364,
+ ["height"] = 182,
+ },
+ {
+ ["a"] = 1,
+ ["name"] = "Gloss",
+ ["scale"] = 0.84,
+ ["disableRotation"] = true,
+ ["texture"] = "MAP_GLOSS",
+ ["r"] = 0.9,
+ ["g"] = 0.95,
+ },
+ {
+ ["a"] = 1,
+ ["name"] = "Inner Shadow",
+ ["scale"] = 0.84,
+ ["disableRotation"] = true,
+ ["texture"] = "MAP_INNERSHADOW",
+ ["blendMode"] = "BLEND",
+ ["drawLayer"] = "OVERLAY",
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ },
+ {
+ ["a"] = 0.95,
+ ["name"] = "Cogwheel",
+ ["scale"] = 1.37,
+ ["rotSpeed"] = 60,
+ ["blendMode"] = "BLEND",
+ ["texture"] = "ZAHNRAD",
+ ["drawLayer"] = "BACKGROUND",
+ ["r"] = 0.18823529411765,
+ ["g"] = 0.17254901960784,
+ ["b"] = 0.13725490196078,
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Round",
+ },
+ ["Faded Square by Renaitre"] = {
+ ["borders"] = {
+ {
+ ["r"] = 0,
+ ["scale"] = 1.47,
+ ["g"] = 0,
+ ["rotation"] = 225,
+ ["blendMode"] = "BLEND",
+ ["name"] = "RenaitreFadeBorder",
+ ["b"] = 0,
+ ["texture"] = "RENAITRE_FADE_BORDER",
+ },
+ {
+ ["scale"] = 1.47,
+ ["g"] = 0,
+ ["rotation"] = 225,
+ ["name"] = "RenaitreFadeNormal",
+ ["drawLayer"] = "HIGHLIGHT",
+ ["blendMode"] = "BLEND",
+ ["r"] = 0.4235294117647059,
+ ["texture"] = "RENAITRE_FADE_NORMAL",
+ },
+ {
+ ["drawLayer"] = "OVERLAY",
+ ["name"] = "RenaitreFadeGloss",
+ ["scale"] = 1.48,
+ ["rotation"] = 225,
+ ["texture"] = "RENAITRE_FADE_GLOSS",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Square",
+ },
+ ["Blue Rune Circles"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["r"] = 0.3098039215686275,
+ ["name"] = "texture1",
+ ["b"] = 1,
+ ["scale"] = 1.4,
+ ["rotSpeed"] = -16,
+ ["g"] = 0.4784313725490196,
+ ["texture"] = "AURARUNE256.BLP",
+ },
+ {
+ ["a"] = 0.3799999952316284,
+ ["r"] = 0.196078431372549,
+ ["rotSpeed"] = 4,
+ ["b"] = 1,
+ ["scale"] = 2.1,
+ ["name"] = "texture2",
+ ["g"] = 0.2901960784313725,
+ ["texture"] = "AuraRune_A.blp",
+ },
+ {
+ ["a"] = 0.3,
+ ["name"] = "texture3",
+ ["b"] = 1,
+ ["scale"] = 1.6,
+ ["r"] = 0,
+ ["g"] = 0.2235294117647059,
+ ["texture"] = "T_VFX_HERO_CIRCLE.BLP",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Round",
+ },
+ ["Blue Rune Diamond"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["xOffset"] = -1,
+ ["rotSpeed"] = 0,
+ ["b"] = 1,
+ ["scale"] = 1.62,
+ ["g"] = 0.3450980392156863,
+ ["yOffset"] = 0,
+ ["rotation"] = 0,
+ ["name"] = "texture1",
+ ["drawLayer"] = "BACKGROUND",
+ ["r"] = 0,
+ ["texture"] = "AuraRune256b.blp",
+ },
+ {
+ ["a"] = 0.06999999284744263,
+ ["r"] = 0.3294117647058824,
+ ["scale"] = 2.1,
+ ["g"] = 0.5333333333333333,
+ ["yOffset"] = 0,
+ ["drawLayer"] = "ARTWORK",
+ ["name"] = "texture2",
+ ["disableRotation"] = true,
+ ["b"] = 1,
+ ["texture"] = "gradientCircle.blp",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Diamond",
+ },
+ ["Burning Sun"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["b"] = 0.04313725490196078,
+ ["name"] = "texture1",
+ ["r"] = 1,
+ ["scale"] = 1.82,
+ ["rotSpeed"] = 21,
+ ["g"] = 0.2901960784313725,
+ ["texture"] = "GENERICGLOW5.BLP",
+ },
+ {
+ ["a"] = 1,
+ ["b"] = 0.3529411764705882,
+ ["name"] = "texture2",
+ ["r"] = 1,
+ ["scale"] = 1.62,
+ ["rotSpeed"] = -18,
+ ["g"] = 0.8705882352941177,
+ ["texture"] = "GENERICGLOW5.BLP",
+ },
+ {
+ ["a"] = 0.449999988079071,
+ ["name"] = "texture3",
+ ["b"] = 0.3254901960784314,
+ ["scale"] = 1.35,
+ ["r"] = 1,
+ ["g"] = 0.6705882352941176,
+ ["texture"] = "T_VFX_HERO_CIRCLE.BLP",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Round",
+ },
+ ["Stargate"] = {
+ ["shape"] = "Round",
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["rotSpeed"] = -16,
+ ["b"] = 1,
+ ["scale"] = 1.4,
+ ["g"] = 0.6862745098039216,
+ ["name"] = "texture1",
+ ["r"] = 0.5764705882352941,
+ ["texture"] = "AURARUNE256.BLP",
+ },
+ {
+ ["a"] = 0.3799999952316284,
+ ["rotSpeed"] = 0,
+ ["b"] = 1,
+ ["rotation"] = 105,
+ ["name"] = "texture2",
+ ["scale"] = 2.05,
+ ["r"] = 0.2823529411764706,
+ ["g"] = 0.6588235294117647,
+ ["texture"] = "AuraRune_A.blp",
+ },
+ {
+ ["a"] = 0.3,
+ ["name"] = "texture3",
+ ["b"] = 1,
+ ["scale"] = 1.6,
+ ["r"] = 0,
+ ["g"] = 0.2235294117647059,
+ ["texture"] = "T_VFX_HERO_CIRCLE.BLP",
+ },
+ {
+ ["a"] = 1,
+ ["rotSpeed"] = -6,
+ ["name"] = "texture4",
+ ["b"] = 0.3529411764705882,
+ ["scale"] = 1.65,
+ ["r"] = 0.1137254901960784,
+ ["g"] = 0.1686274509803922,
+ ["texture"] = "AuraRune_B.blp",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ },
+ ["Simple Square"] = {
+ ["borders"] = {
+ {
+ ["a"] = 0.6,
+ ["name"] = "Square Border",
+ ["scale"] = 1.07,
+ ["disableRotation"] = true,
+ ["texture"] = "RENAITRE_FADE_BORDER",
+ ["blendMode"] = "BLEND",
+ ["r"] = 0.8,
+ ["g"] = 0.8,
+ ["b"] = 0.8,
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = true,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ },
+ ["settings"] = {
+ ["edgeSize"] = 17,
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["tile"] = false,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 0.8,
+ ["g"] = 0.8,
+ ["b"] = 0.8,
+ ["a"] = 1,
+ },
+ ["scale"] = 1.07,
+ },
+ ["shape"] = "Square",
+ },
+ ["Ruins"] = {
+ ["borders"] = {
+ {
+ ["a"] = 0.85,
+ ["name"] = "Ruins Border",
+ ["scale"] = 1.42,
+ ["disableRotation"] = true,
+ ["texture"] = "RENAITRE_FADE_BORDER",
+ ["blendMode"] = "BLEND",
+ ["r"] = 1,
+ ["g"] = 0.86,
+ ["b"] = 0.73,
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = true,
+ ["textureColor"] = {
+ ["a"] = 0.8,
+ ["b"] = 0.15,
+ ["g"] = 0.12,
+ ["r"] = 0.18,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 23,
+ ["insets"] = {
+ ["top"] = 5,
+ ["right"] = 5,
+ ["left"] = 5,
+ ["bottom"] = 5,
+ },
+ },
+ ["borderColor"] = {
+ ["a"] = 1,
+ ["b"] = 0.7254901960784314,
+ ["g"] = 0.8627450980392157,
+ ["r"] = 1,
+ },
+ ["scale"] = 1.42,
+ },
+ ["shape"] = "Square",
+ },
+ ["Emerald Portal"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["xOffset"] = 2,
+ ["rotSpeed"] = 8,
+ ["r"] = 0,
+ ["scale"] = 1.17,
+ ["g"] = 0.4745098039215686,
+ ["yOffset"] = -1,
+ ["blendMode"] = "ADD",
+ ["name"] = "texture1",
+ ["b"] = 0.01568627450980392,
+ ["texture"] = "AUCHINDOUN_VORTEXCLOUD01",
+ },
+ {
+ ["a"] = 1,
+ ["r"] = 1,
+ ["scale"] = 1.6,
+ ["g"] = 0.9725490196078431,
+ ["drawLayer"] = "BACKGROUND",
+ ["blendMode"] = "ADD",
+ ["name"] = "texture2",
+ ["b"] = 0.3490196078431372,
+ ["texture"] = "DEATHSKY_VORTEXCLOUD01",
+ },
+ {
+ ["a"] = 0.09000003337860107,
+ ["blendMode"] = "ADD",
+ ["name"] = "texture3",
+ ["b"] = 0.4431372549019608,
+ ["scale"] = 1.07,
+ ["r"] = 0.807843137254902,
+ ["g"] = 1,
+ ["texture"] = "DEEPHOLMSKY_NEBULA01",
+ },
+ {
+ ["a"] = 0.2599999904632568,
+ ["xOffset"] = -57,
+ ["rotSpeed"] = -8,
+ ["b"] = 0.05098039215686274,
+ ["scale"] = 0.8400000000000001,
+ ["g"] = 0.4156862745098039,
+ ["yOffset"] = 32,
+ ["blendMode"] = "ADD",
+ ["r"] = 0,
+ ["name"] = "texture4",
+ ["texture"] = "Nature_Rune_128.blp",
+ },
+ {
+ ["a"] = 0.1800000071525574,
+ ["xOffset"] = 39,
+ ["rotSpeed"] = 8,
+ ["b"] = 0.1176470588235294,
+ ["scale"] = 0.8700000000000001,
+ ["g"] = 0.4313725490196079,
+ ["yOffset"] = -45,
+ ["name"] = "texture5",
+ ["r"] = 0.4823529411764706,
+ ["texture"] = "Nature_Rune_128.blp",
+ },
+ {
+ ["a"] = 0.1200000047683716,
+ ["xOffset"] = 53,
+ ["rotSpeed"] = -13,
+ ["b"] = 0.7764705882352941,
+ ["scale"] = 0.78,
+ ["g"] = 1,
+ ["yOffset"] = 39,
+ ["name"] = "texture6",
+ ["r"] = 0.2941176470588235,
+ ["texture"] = "Nature_Rune_128.blp",
+ },
+ {
+ ["a"] = 0.09000003337860107,
+ ["xOffset"] = -48,
+ ["rotSpeed"] = -6,
+ ["b"] = 0.4352941176470588,
+ ["scale"] = 0.8500000000000001,
+ ["g"] = 1,
+ ["yOffset"] = -45,
+ ["name"] = "texture7",
+ ["r"] = 0.7607843137254902,
+ ["texture"] = "Nature_Rune_128.blp",
+ },
+ {
+ ["a"] = 0.14000004529953,
+ ["rotSpeed"] = -14,
+ ["name"] = "textue8",
+ ["b"] = 0.07450980392156863,
+ ["scale"] = 1.81,
+ ["r"] = 0.09019607843137255,
+ ["g"] = 0.3372549019607843,
+ ["texture"] = "Nature_Rune_128.blp",
+ },
+ {
+ ["a"] = 0.6599999964237213,
+ ["rotSpeed"] = -1,
+ ["b"] = 0.01568627450980392,
+ ["scale"] = 1.45,
+ ["g"] = 0.4666666666666667,
+ ["drawLayer"] = "BACKGROUND",
+ ["blendMode"] = "BLEND",
+ ["r"] = 0,
+ ["name"] = "texture9",
+ ["texture"] = "SHOCKWAVE_INVERTGREY.BLP",
+ },
+ {
+ ["a"] = 0.5800000131130219,
+ ["rotSpeed"] = 2,
+ ["b"] = 0.06666666666666667,
+ ["scale"] = 1.46,
+ ["g"] = 0.3098039215686275,
+ ["drawLayer"] = "BORDER",
+ ["name"] = "texture10",
+ ["r"] = 0.02352941176470588,
+ ["texture"] = "SHOCKWAVE_INVERTGREY.BLP",
+ },
+ {
+ ["a"] = 0.5,
+ ["rotSpeed"] = 0,
+ ["b"] = 1,
+ ["scale"] = 1.58,
+ ["g"] = 1,
+ ["rotation"] = 231,
+ ["blendMode"] = "BLEND",
+ ["r"] = 1,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "texture11",
+ ["texture"] = "TREANTLEAVES",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Round",
+ },
+ ["Shamanism"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["xOffset"] = 65,
+ ["b"] = 1,
+ ["scale"] = 0.4,
+ ["g"] = 1,
+ ["yOffset"] = 65,
+ ["disableRotation"] = true,
+ ["name"] = "texture1",
+ ["r"] = 1,
+ ["texture"] = "SHAMANSTONEEARTH.blp",
+ },
+ {
+ ["disableRotation"] = true,
+ ["xOffset"] = -65,
+ ["name"] = "texture2",
+ ["scale"] = 0.35,
+ ["texture"] = "ShamanStoneAir.blp",
+ ["yOffset"] = -65,
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = 65,
+ ["b"] = 1,
+ ["scale"] = 0.35,
+ ["g"] = 0.984313725490196,
+ ["yOffset"] = -65,
+ ["disableRotation"] = true,
+ ["name"] = "texture3",
+ ["r"] = 0.4392156862745098,
+ ["texture"] = "ShamanStoneWater.blp",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = -65,
+ ["r"] = 1,
+ ["scale"] = 0.35,
+ ["g"] = 1,
+ ["yOffset"] = 65,
+ ["disableRotation"] = true,
+ ["name"] = "texture4",
+ ["b"] = 1,
+ ["texture"] = "ShamanStoneFlame.blp",
+ },
+ {
+ ["a"] = 1,
+ ["rotSpeed"] = 9,
+ ["b"] = 1,
+ ["scale"] = 1.79,
+ ["g"] = 1,
+ ["drawLayer"] = "BORDER",
+ ["name"] = "texture5",
+ ["disableRotation"] = false,
+ ["rotation"] = 184,
+ ["r"] = 1,
+ ["blendMode"] = "ADD",
+ ["texture"] = "Shockwave4.blp",
+ },
+ {
+ ["a"] = 0.75,
+ ["rotSpeed"] = 10,
+ ["b"] = 1,
+ ["scale"] = 1.12,
+ ["g"] = 0.5568627450980392,
+ ["drawLayer"] = "BORDER",
+ ["name"] = "texture6",
+ ["disableRotation"] = true,
+ ["r"] = 0,
+ ["blendMode"] = "ADD",
+ ["texture"] = "Shockwave_blue.blp",
+ },
+ {
+ ["a"] = 0.3700000047683716,
+ ["name"] = "texture7",
+ ["rotSpeed"] = -1,
+ ["b"] = 0,
+ ["scale"] = 1.49,
+ ["r"] = 1,
+ ["g"] = 0.6313725490196078,
+ ["texture"] = "SHOCKWAVE_INVERTGREY.BLP",
+ },
+ {
+ ["a"] = 0.5,
+ ["xOffset"] = -65,
+ ["b"] = 0,
+ ["g"] = 0.2313725490196079,
+ ["yOffset"] = 65,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "texture8",
+ ["disableRotation"] = true,
+ ["r"] = 1,
+ ["texture"] = "GENERICGLOW64.BLP",
+ },
+ {
+ ["a"] = 0.4700000286102295,
+ ["xOffset"] = -65,
+ ["b"] = 0.9333333333333334,
+ ["scale"] = 1.11,
+ ["g"] = 0,
+ ["yOffset"] = -65,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "texture9",
+ ["disableRotation"] = false,
+ ["r"] = 1,
+ ["texture"] = "GENERICGLOW64.BLP",
+ },
+ {
+ ["a"] = 0.5100000202655792,
+ ["xOffset"] = 65,
+ ["r"] = 0,
+ ["scale"] = 1.11,
+ ["g"] = 0.04705882352941176,
+ ["yOffset"] = -65,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "texture10",
+ ["b"] = 1,
+ ["texture"] = "GENERICGLOW64.BLP",
+ },
+ {
+ ["a"] = 0.4000000357627869,
+ ["xOffset"] = 65,
+ ["b"] = 0,
+ ["scale"] = 1.1,
+ ["g"] = 1,
+ ["yOffset"] = 65,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "texture11",
+ ["r"] = 0.2588235294117647,
+ ["texture"] = "GENERICGLOW64.BLP",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Round",
+ },
+ ["Space by Ruka"] = {
+ ["borders"] = {
+ {
+ ["a"] = 0.56,
+ ["rotSpeed"] = -20,
+ ["b"] = 1,
+ ["scale"] = 1.6,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "Galaxy",
+ ["r"] = 0.5,
+ ["g"] = 0.5,
+ ["texture"] = "DEEPHOLMSKY_NEBULA01",
+ },
+ {
+ ["a"] = 0.78,
+ ["xOffset"] = -45,
+ ["rotSpeed"] = 5,
+ ["b"] = 1,
+ ["scale"] = 1.2,
+ ["g"] = 0.5,
+ ["yOffset"] = 65,
+ ["name"] = "Star",
+ ["blendMode"] = "BLEND",
+ ["r"] = 0.5,
+ ["texture"] = "GALAXY_02",
+ },
+ {
+ ["a"] = 0.64,
+ ["xOffset"] = -45,
+ ["rotSpeed"] = 5,
+ ["b"] = 1,
+ ["scale"] = 0.3,
+ ["g"] = 0.5,
+ ["yOffset"] = -65,
+ ["blendMode"] = "BLEND",
+ ["name"] = "Planet 1",
+ ["r"] = 0.5,
+ ["texture"] = "HELLFIREPLANET_BLUE01",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = -80,
+ ["rotSpeed"] = 15,
+ ["b"] = 1,
+ ["scale"] = 0.3,
+ ["g"] = 0.5,
+ ["yOffset"] = 0,
+ ["blendMode"] = "BLEND",
+ ["name"] = "Planet 2",
+ ["r"] = 0.5,
+ ["texture"] = "HELLFIREPLANET_RED01",
+ },
+ {
+ ["a"] = 0.92,
+ ["xOffset"] = 80,
+ ["rotSpeed"] = 10,
+ ["b"] = 1,
+ ["scale"] = 0.3,
+ ["g"] = 0.5,
+ ["yOffset"] = 0,
+ ["blendMode"] = "BLEND",
+ ["rotation"] = 179,
+ ["name"] = "Planet 3",
+ ["r"] = 0.5,
+ ["texture"] = "BLADESEDGEPLANET04",
+ },
+ {
+ ["a"] = 0.75,
+ ["xOffset"] = 45,
+ ["rotSpeed"] = 15,
+ ["b"] = 1,
+ ["scale"] = 0.4,
+ ["g"] = 0.5,
+ ["yOffset"] = -65,
+ ["name"] = "Vortex",
+ ["r"] = 0.5,
+ ["texture"] = "DEATHSKY_VORTEXCLOUD01",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = 45,
+ ["rotSpeed"] = 10,
+ ["b"] = 1,
+ ["scale"] = 0.3,
+ ["g"] = 0.5,
+ ["yOffset"] = 65,
+ ["rotation"] = 0,
+ ["name"] = "Planet 4",
+ ["r"] = 0.5,
+ ["texture"] = "HELLFIREPLANET03",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Large Circle",
+ },
+ ["Clouds by koccs"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["rotSpeed"] = 180,
+ ["b"] = 1,
+ ["scale"] = 0.6,
+ ["g"] = 1,
+ ["yOffset"] = 57,
+ ["xOffset"] = 0,
+ ["drawLayer"] = "OVERLAY",
+ ["name"] = "Vortex",
+ ["blendMode"] = "BLEND",
+ ["r"] = 1,
+ ["texture"] = "AUCHINDOUN_VORTEXCLOUD01",
+ },
+ {
+ ["a"] = 1,
+ ["name"] = "Border Cloud",
+ ["blendMode"] = "BLEND",
+ ["drawLayer"] = "BACKGROUND",
+ ["scale"] = 1.64,
+ ["rotSpeed"] = 30,
+ ["texture"] = "DEATHWINGFIGHTSKY_CLOUDSMASK03",
+ },
+ {
+ ["a"] = 1,
+ ["b"] = 0.5686274509803921,
+ ["scale"] = 1.35,
+ ["g"] = 0.5764705882352941,
+ ["r"] = 0.4901960784313725,
+ ["drawLayer"] = "BORDER",
+ ["name"] = "Fade",
+ ["rotation"] = 45,
+ ["texture"] = "ICECROWN_CLOUDSA02_MASK02",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = -42,
+ ["rotSpeed"] = -50,
+ ["b"] = 1,
+ ["scale"] = 0.85,
+ ["g"] = 1,
+ ["yOffset"] = 47,
+ ["drawLayer"] = "BACKGROUND",
+ ["blendMode"] = "BLEND",
+ ["name"] = "Effect Cloud 1",
+ ["r"] = 1,
+ ["texture"] = "DEATHWINGFIGHTSKY_PARTICLECLOUD",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = 55,
+ ["rotSpeed"] = 45,
+ ["b"] = 1,
+ ["scale"] = 0.85,
+ ["g"] = 1,
+ ["yOffset"] = -36,
+ ["drawLayer"] = "BACKGROUND",
+ ["blendMode"] = "BLEND",
+ ["name"] = "Effect Cloud 2",
+ ["r"] = 1,
+ ["texture"] = "DEATHWINGFIGHTSKY_PARTICLECLOUD",
+ },
+ {
+ ["a"] = 0.8,
+ ["xOffset"] = 10,
+ ["rotSpeed"] = 45,
+ ["b"] = 1,
+ ["scale"] = 0.77,
+ ["g"] = 1,
+ ["yOffset"] = -65,
+ ["blendMode"] = "BLEND",
+ ["name"] = "Effect Cloud 3",
+ ["r"] = 1,
+ ["texture"] = "ICECROWN_CLOUDSA02_MASK01",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = -45,
+ ["rotSpeed"] = -90,
+ ["b"] = 1,
+ ["scale"] = 1,
+ ["g"] = 1,
+ ["yOffset"] = -28,
+ ["drawLayer"] = "BACKGROUND",
+ ["name"] = "Effect Cloud 4",
+ ["r"] = 1,
+ ["texture"] = "WINTERGRASP_CLOUDMASK01",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Large Circle",
+ },
+ ["Rogue"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["rotSpeed"] = -32,
+ ["name"] = "Rogue Rune",
+ ["b"] = 0,
+ ["scale"] = 2.13,
+ ["r"] = 0.1450980392156863,
+ ["g"] = 0.00392156862745098,
+ ["texture"] = "ROGUERUNE2",
+ },
+ {
+ ["a"] = 1,
+ ["r"] = 0.6,
+ ["scale"] = 0.89,
+ ["g"] = 0.2078431372549019,
+ ["disableRotation"] = true,
+ ["name"] = "Glow",
+ ["b"] = 0.09411764705882353,
+ ["texture"] = "GENERICGLOW64.BLP",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Round",
+ },
+ ["Electric"] = {
+ ["borders"] = {
+ {
+ ["a"] = 1,
+ ["xOffset"] = -38,
+ ["scale"] = 0.42,
+ ["yOffset"] = 40,
+ ["rotation"] = 180,
+ ["name"] = "LightningNW",
+ ["texture"] = "LIGHTNING_NEW",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = 36,
+ ["scale"] = 0.42,
+ ["yOffset"] = 40,
+ ["rotation"] = 270,
+ ["name"] = "LightningNE",
+ ["texture"] = "LIGHTNING_NEW",
+ },
+ {
+ ["a"] = 1,
+ ["rotation"] = 90,
+ ["xOffset"] = -38,
+ ["name"] = "LightningSW",
+ ["scale"] = 0.42,
+ ["yOffset"] = -35,
+ ["texture"] = "LIGHTNING_NEW",
+ },
+ {
+ ["a"] = 1,
+ ["xOffset"] = 36,
+ ["scale"] = 0.42,
+ ["yOffset"] = -35,
+ ["name"] = "LightningSE",
+ ["texture"] = "LIGHTNING_NEW",
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = false,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ ["a"] = 1,
+ },
+ ["settings"] = {
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["tile"] = false,
+ ["edgeSize"] = 16,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 1,
+ ["g"] = 1,
+ ["b"] = 1,
+ ["a"] = 1,
+ },
+ ["scale"] = 1,
+ },
+ ["shape"] = "Diamond",
+ },
+ ["LL Corner Rounded"] = {
+ ["borders"] = {
+ {
+ ["a"] = 0.6,
+ ["name"] = "Corner Border",
+ ["scale"] = 1.1,
+ ["disableRotation"] = true,
+ ["texture"] = "RENAITRE_FADE_BORDER",
+ ["blendMode"] = "BLEND",
+ ["r"] = 0.8,
+ ["g"] = 0.8,
+ ["b"] = 0.8,
+ },
+ },
+ ["backdrop"] = {
+ ["show"] = true,
+ ["textureColor"] = {
+ ["r"] = 0,
+ ["g"] = 0,
+ ["b"] = 0,
+ },
+ ["settings"] = {
+ ["edgeSize"] = 17,
+ ["edgeFile"] = "Interface\\Tooltips\\UI-Tooltip-Border",
+ ["bgFile"] = "Interface\\Tooltips\\UI-Tooltip-Background",
+ ["tile"] = false,
+ ["insets"] = {
+ ["top"] = 4,
+ ["right"] = 4,
+ ["left"] = 4,
+ ["bottom"] = 4,
+ },
+ },
+ ["borderColor"] = {
+ ["r"] = 0.8,
+ ["g"] = 0.8,
+ ["b"] = 0.8,
+ ["a"] = 1,
+ },
+ ["scale"] = 1.1,
+ },
+ ["shape"] = "LL Corner Rounded",
+ },
+}
diff --git a/shapes.lua b/shapes.lua
new file mode 100644
index 0000000..e8adeb5
--- /dev/null
+++ b/shapes.lua
@@ -0,0 +1,75 @@
+-- shapes.lua - Minimap shape masks for SexyMap OctoWoW Edition
+-- Provides CApplyShape() which clips the minimap to a given shape
+--
+-- IMPORTANT: We use Minimap:SetMaskTexture() instead of creating overlay textures.
+-- Creating an overlay texture on top of the minimap blocks the map content and causes
+-- the minimap to appear as pure white. SetMaskTexture clips the minimap to the shape
+-- without covering it.
+--
+-- In WoW 1.12, SetMaskTexture(nil) does NOT remove the mask — it falls back to
+-- the default round mask. This means there is no way to show a truly square
+-- minimap via mask alone. For square shapes, we use the circle mask and rely
+-- on the border/backdrop visuals to give a square appearance.
+
+local _G = getfenv(0)
+
+-- The default round minimap mask.
+-- IMPORTANT: "Interface\Minimap\UI-Minimap-Background" is NOT a mask — it's a
+-- decorative border texture. Using it with SetMaskTexture causes green rendering.
+-- The correct default mask is the circle.blp we ship with the addon.
+local DEFAULT_MASK = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp"
+
+-- Shape texture paths (addon-local BLP files in shapes/ directory)
+-- All paths include .blp because SetMaskTexture does NOT auto-append .blp
+-- (unlike SetBackdrop which does auto-append it).
+local shapeTextures = {
+ ["Round"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
+ ["Square"] = "Square", -- special: no mask change, keep default round
+ ["Diamond"] = "Interface\\AddOns\\SexyMap\\shapes\\diamond.blp",
+ ["Hexagon"] = "Interface\\AddOns\\SexyMap\\shapes\\hexagon.blp",
+ ["Octagon"] = "Interface\\AddOns\\SexyMap\\shapes\\octagon.blp",
+ ["Heart"] = "Interface\\AddOns\\SexyMap\\shapes\\heart.blp",
+ ["Snowflake"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
+ ["LL Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\bottomleft.blp",
+ ["LR Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\bottomright.blp",
+ ["UL Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp", -- fallback, no topleft BLP
+ ["UR Corner Rounded"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp", -- fallback, no topright BLP
+ ["Large Circle"] = "Interface\\AddOns\\SexyMap\\shapes\\largecircle.blp",
+ ["Route66"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
+ ["Deathsky"] = "Interface\\AddOns\\SexyMap\\shapes\\deathsky_mask.blp",
+ ["VFX Border"] = "Interface\\AddOns\\SexyMap\\shapes\\circle.blp",
+ ["Left"] = "Interface\\AddOns\\SexyMap\\shapes\\left.blp",
+ ["Bottom"] = "Interface\\AddOns\\SexyMap\\shapes\\bottom.blp",
+}
+
+function CApplyShape(shapeName)
+ if not shapeName then return end
+
+ local texPath = shapeTextures[shapeName]
+
+ if not texPath then
+ -- Unknown shape: apply default round mask
+ Minimap:SetMaskTexture(DEFAULT_MASK)
+ return
+ end
+
+ -- Square shape: keep the default round mask.
+ -- WoW 1.12 does not support removing the mask entirely (SetMaskTexture(nil)
+ -- just resets to the default round mask). The square appearance for presets
+ -- like "Ruins" and "Simple Square" comes from their border textures and
+ -- backdrop frame, not from the minimap mask shape.
+ if texPath == "Square" then
+ Minimap:SetMaskTexture(DEFAULT_MASK)
+ return
+ end
+
+ -- Use SetMaskTexture to clip the minimap to the shape.
+ -- pcall protects against invalid texture paths
+ local ok, err = pcall(function()
+ Minimap:SetMaskTexture(texPath)
+ end)
+ if not ok then
+ -- Fallback to default round mask if the texture failed to load
+ Minimap:SetMaskTexture(DEFAULT_MASK)
+ end
+end
diff --git a/shapes/bottom.blp b/shapes/bottom.blp
new file mode 100644
index 0000000..5b0ed4d
Binary files /dev/null and b/shapes/bottom.blp differ
diff --git a/shapes/bottomleft.blp b/shapes/bottomleft.blp
new file mode 100644
index 0000000..4e6779f
Binary files /dev/null and b/shapes/bottomleft.blp differ
diff --git a/shapes/bottomright.blp b/shapes/bottomright.blp
new file mode 100644
index 0000000..a866035
Binary files /dev/null and b/shapes/bottomright.blp differ
diff --git a/shapes/circle.blp b/shapes/circle.blp
new file mode 100644
index 0000000..12a7090
Binary files /dev/null and b/shapes/circle.blp differ
diff --git a/shapes/deathsky_mask.blp b/shapes/deathsky_mask.blp
new file mode 100644
index 0000000..0a22b77
Binary files /dev/null and b/shapes/deathsky_mask.blp differ
diff --git a/shapes/diamond.blp b/shapes/diamond.blp
new file mode 100644
index 0000000..2953aa1
Binary files /dev/null and b/shapes/diamond.blp differ
diff --git a/shapes/heart.blp b/shapes/heart.blp
new file mode 100644
index 0000000..9e3176c
Binary files /dev/null and b/shapes/heart.blp differ
diff --git a/shapes/hexagon.blp b/shapes/hexagon.blp
new file mode 100644
index 0000000..eafe7be
Binary files /dev/null and b/shapes/hexagon.blp differ
diff --git a/shapes/largecircle.blp b/shapes/largecircle.blp
new file mode 100644
index 0000000..59198cb
Binary files /dev/null and b/shapes/largecircle.blp differ
diff --git a/shapes/left.blp b/shapes/left.blp
new file mode 100644
index 0000000..8c46c41
Binary files /dev/null and b/shapes/left.blp differ
diff --git a/shapes/octagon.blp b/shapes/octagon.blp
new file mode 100644
index 0000000..f1bee60
Binary files /dev/null and b/shapes/octagon.blp differ