diff --git a/core/bridge.lua b/core/bridge.lua deleted file mode 100644 index 3921255..0000000 --- a/core/bridge.lua +++ /dev/null @@ -1,10 +0,0 @@ -BNP = BNP or {} - -function BNP:RegisterPlate(plate) - plate = plate or this - if not plate then return end - if BNP.plates[plate] then return end - - BNP.plates[plate] = true - BNP.detected = BNP.detected + 1 -end diff --git a/core/compat_shagutweaks.lua b/core/compat_shagutweaks.lua deleted file mode 100644 index a4ccf97..0000000 --- a/core/compat_shagutweaks.lua +++ /dev/null @@ -1,94 +0,0 @@ -BNP = BNP or {} - --- Robust ShaguTweaks compatibility. --- BNP owns Scale / Class Colors / Castbar while loaded. --- ShaguTweaks settings are NOT changed. - -BNP.shaguCompat = BNP.shaguCompat or { - patched = {}, - registerHooked = false, -} - -local wanted = { - ["Nameplate Scale"] = true, - ["Nameplate Class Colors"] = true, - ["Nameplate Castbar"] = true, -} - -local function IsWantedTitle(title) - if not title then return false end - - if wanted[title] then return true end - - if ShaguTweaks and ShaguTweaks.T then - if title == ShaguTweaks.T["Nameplate Scale"] then return true end - if title == ShaguTweaks.T["Nameplate Class Colors"] then return true end - if title == ShaguTweaks.T["Nameplate Castbar"] then return true end - end - - return false -end - -local function DisableModule(mod) - if not mod or type(mod) ~= "table" then return false end - if not IsWantedTitle(mod.title) then return false end - if mod.BNPCompatibilityPatched then return true end - - mod.BNPOriginalEnable = mod.enable - mod.enable = function(self) - return - end - - mod.BNPCompatibilityPatched = true - BNP.shaguCompat.patched[mod.title or "?"] = true - return true -end - -local function PatchExistingModules() - if not ShaguTweaks or not ShaguTweaks.mods then return end - - local title, mod - for title, mod in pairs(ShaguTweaks.mods) do - -- Some registered module tables use localized title as the map key. - if mod and not mod.title then mod.title = title end - DisableModule(mod) - end -end - -local function HookRegister() - if not ShaguTweaks or not ShaguTweaks.register then return end - if BNP.shaguCompat.registerHooked then return end - - local originalRegister = ShaguTweaks.register - - ShaguTweaks.register = function(self, mod) - local registered = originalRegister(self, mod) - DisableModule(registered or mod) - return registered - end - - BNP.shaguCompat.registerHooked = true -end - -function BNP:ApplyShaguTweaksCompatibility() - if not ShaguTweaks then return false end - - -- Covers BNP loading before Shagu's modules register. - HookRegister() - - -- Covers BNP loading after Shagu's modules registered. - PatchExistingModules() - - return true -end - --- Try immediately in case ShaguTweaks is already loaded. -BNP:ApplyShaguTweaksCompatibility() - --- Also retry after every addon load. This safely covers all Vanilla/Turtle --- load-order variations without touching ShaguTweaks saved settings. -local loader = CreateFrame("Frame") -loader:RegisterEvent("ADDON_LOADED") -loader:SetScript("OnEvent", function() - BNP:ApplyShaguTweaksCompatibility() -end) diff --git a/core/config.lua b/core/config.lua deleted file mode 100644 index 4ca2fe8..0000000 --- a/core/config.lua +++ /dev/null @@ -1,104 +0,0 @@ -BNP = BNP or {} - -BNP.defaults = BNP.defaults or { - nameplateScale = 1.0, - iconSize = 18, - tankMode = false, - classColors = true, - castbars = true, - castbarHeight = 6, - minimapAngle = 225, - healthPercent = false, - healthText = "off", - targetFocus = true, - targetGlowColor = "white", - targetOnTop = true, -} - -function BNP:InitConfig() - BNP_DB = BNP_DB or {} - - if BNP_DB.nameplateScale == nil then BNP_DB.nameplateScale = self.defaults.nameplateScale end - if BNP_DB.iconSize == nil then BNP_DB.iconSize = self.defaults.iconSize end - if BNP_DB.tankMode == nil then BNP_DB.tankMode = self.defaults.tankMode end - if BNP_DB.classColors == nil then BNP_DB.classColors = self.defaults.classColors end - if BNP_DB.castbars == nil then BNP_DB.castbars = self.defaults.castbars end - if BNP_DB.castbarHeight == nil then BNP_DB.castbarHeight = self.defaults.castbarHeight end - if BNP_DB.minimapAngle == nil then BNP_DB.minimapAngle = self.defaults.minimapAngle end - if BNP_DB.healthPercent == nil then BNP_DB.healthPercent = self.defaults.healthPercent end - if BNP_DB.healthText == nil then - -- Backwards-compatible migration from the old Health % checkbox. - BNP_DB.healthText = BNP_DB.healthPercent and "percent" or self.defaults.healthText - end - if BNP_DB.targetFocus == nil then BNP_DB.targetFocus = self.defaults.targetFocus end - if BNP_DB.targetGlowColor == nil then BNP_DB.targetGlowColor = self.defaults.targetGlowColor end - if BNP_DB.targetOnTop == nil then BNP_DB.targetOnTop = self.defaults.targetOnTop end -end - -function BNP:GetNameplateScale() - return (BNP_DB and tonumber(BNP_DB.nameplateScale)) or self.defaults.nameplateScale -end - -function BNP:GetIconSize() - return (BNP_DB and tonumber(BNP_DB.iconSize)) or self.defaults.iconSize -end - -function BNP:IsTankModeEnabled() - return BNP_DB and BNP_DB.tankMode and true or false -end - -function BNP:AreClassColorsEnabled() - return not BNP_DB or BNP_DB.classColors ~= false -end - -function BNP:AreCastbarsEnabled() - return not BNP_DB or BNP_DB.castbars ~= false -end - -function BNP:GetCastbarHeight() - local value = (BNP_DB and tonumber(BNP_DB.castbarHeight)) or self.defaults.castbarHeight - if value < 4 then value = 4 end - if value > 14 then value = 14 end - return value -end - -function BNP:GetHealthTextMode() - local mode = (BNP_DB and BNP_DB.healthText) or self.defaults.healthText or "off" - if mode ~= "off" and mode ~= "percent" and mode ~= "hp" and mode ~= "both" then - mode = "off" - end - return mode -end - -function BNP:IsHealthPercentEnabled() - local mode = self:GetHealthTextMode() - return mode == "percent" or mode == "both" -end - -function BNP:IsHealthTextEnabled() - return self:GetHealthTextMode() ~= "off" -end - -function BNP:IsTargetFocusEnabled() - return not BNP_DB or BNP_DB.targetFocus ~= false -end - -function BNP:IsTargetOnTopEnabled() - return not BNP_DB or BNP_DB.targetOnTop ~= false -end - -function BNP:GetTargetGlowColor() - local key = (BNP_DB and BNP_DB.targetGlowColor) or self.defaults.targetGlowColor or "white" - - local colors = { - white = { 1.00, 1.00, 1.00 }, - gold = { 1.00, 0.82, 0.10 }, - blue = { 0.25, 0.55, 1.00 }, - green = { 0.25, 1.00, 0.35 }, - red = { 1.00, 0.20, 0.20 }, - purple = { 0.75, 0.35, 1.00 }, - } - - local c = colors[key] or colors.white - return c[1], c[2], c[3], key -end diff --git a/core/core.lua b/core/core.lua deleted file mode 100644 index 8a1e7e2..0000000 --- a/core/core.lua +++ /dev/null @@ -1,37 +0,0 @@ -BNP = BNP or {} -BNP.version = "1.0.5" -BNP.plates = BNP.plates or {} -BNP.detected = 0 -BNP.debugEnabled = false - -function BNP:Print(msg) - if DEFAULT_CHAT_FRAME then - DEFAULT_CHAT_FRAME:AddMessage("|cff33ff99Blizz Nameplates+:|r " .. tostring(msg)) - end -end - -local eventFrame = CreateFrame("Frame") -eventFrame:RegisterEvent("VARIABLES_LOADED") -eventFrame:SetScript("OnEvent", function() - BNP_DB = BNP_DB or {} - - if BNP.InitConfig then BNP:InitConfig() end - if BNP.CreateMinimapButton then BNP:CreateMinimapButton() end - if BNP.InstallTankMode then BNP:InstallTankMode() end - - if BNP_DB.debugEnabled == nil then BNP_DB.debugEnabled = false end - BNP.debugEnabled = BNP_DB.debugEnabled - - if CombatLogAdd and SpellInfo then - BNP:Print(BNP.version .. " loaded. Standalone nameplates + SuperWoW tracking active.") - if ShaguTweaks then - BNP:ApplyShaguTweaksCompatibility() - local count = 0 - local k - for k in pairs(BNP.shaguCompat.patched or {}) do count = count + 1 end - BNP:Print("ShaguTweaks compatibility active (" .. tostring(count) .. "/3 nameplate modules suppressed).") - end - else - BNP:Print("ERROR: SuperWoW API not detected. Blizz Nameplates+ requires SuperWoW.") - end -end) diff --git a/core/libnameplate.lua b/core/libnameplate.lua deleted file mode 100644 index c275cfd..0000000 --- a/core/libnameplate.lua +++ /dev/null @@ -1,119 +0,0 @@ -BNP = BNP or {} - -BNP.libnameplate = BNP.libnameplate or { - OnInit = {}, - OnShow = {}, - OnUpdate = {}, -} - -local lib = BNP.libnameplate -local known = {} -local initializedChildren = 0 - -local function IsNamePlate(frame) - if not frame or not frame.GetObjectType then return false end - if frame:GetObjectType() ~= "Button" then return false end - - local firstRegion = frame:GetRegions() - if not firstRegion or not firstRegion.GetObjectType or not firstRegion.GetTexture then - return false - end - - if firstRegion:GetObjectType() ~= "Texture" then return false end - return firstRegion:GetTexture() == "Interface\\Tooltips\\Nameplate-Border" -end - -local function AttachPlateShortcuts(plate) - if plate.BNPShortcutsReady then return end - - -- Vanilla Blizzard nameplates expose the health StatusBar as their first child. - local healthbar = plate:GetChildren() - plate.healthbar = healthbar - - -- Vanilla region order: - -- 1 border, 2 glow, 3 name, 4 level, 5 level icon, 6 raid icon. - local regions = { plate:GetRegions() } - plate.border = regions[1] - plate.glow = regions[2] - plate.name = regions[3] - plate.level = regions[4] - plate.levelicon = regions[5] - plate.raidicon = regions[6] - - plate.BNPShortcutsReady = true -end - -local function Fire(list, plate) - plate = plate or this - if not plate then return end - - local i - for i = 1, table.getn(list) do - if list[i] then - pcall(list[i], plate) - end - end -end - -local function RegisterPlate(plate) - plate = plate or this - if not plate then return end - if known[plate] then return end - known[plate] = true - - AttachPlateShortcuts(plate) - - if BNP.RegisterPlate then - BNP:RegisterPlate(plate) - end - - Fire(lib.OnInit, plate) - if plate:IsShown() then - Fire(lib.OnShow, plate) - end - - -- Run OnShow callbacks when Blizzard reuses the same plate. - local oldOnShow = plate:GetScript("OnShow") - plate:SetScript("OnShow", function(self) - local current = self or this or plate - if not current then return end - if oldOnShow then oldOnShow(current) end - AttachPlateShortcuts(current) - Fire(lib.OnShow, current) - end) -end - -local scanner = CreateFrame("Frame") -local scanElapsed = 0 - -scanner:SetScript("OnUpdate", function() - scanElapsed = scanElapsed + arg1 - if scanElapsed < 0.10 then return end - scanElapsed = 0 - - local count = WorldFrame:GetNumChildren() - - -- Full scan only when WorldFrame gained children. This mirrors the lightweight - -- discovery strategy used by Shagu's Vanilla nameplate code. - if count > initializedChildren then - local children = { WorldFrame:GetChildren() } - local i - for i = 1, table.getn(children) do - local frame = children[i] - if not known[frame] and IsNamePlate(frame) then - RegisterPlate(frame) - end - end - initializedChildren = count - end - - -- Compatibility callback list for modules that want a throttled plate update. - if table.getn(lib.OnUpdate) > 0 then - local plate - for plate in pairs(known) do - if plate:IsShown() then - Fire(lib.OnUpdate, plate) - end - end - end -end) diff --git a/core/options.lua b/core/options.lua deleted file mode 100644 index b02dd26..0000000 --- a/core/options.lua +++ /dev/null @@ -1,413 +0,0 @@ -BNP = BNP or {} - -local function Round(value, step) - return math.floor((value / step) + 0.5) * step -end - -local sliderCount = 0 -local function CreateSlider(parent, label, minValue, maxValue, step, y) - sliderCount = sliderCount + 1 - local slider = CreateFrame("Slider", "BNPOptionsSlider" .. sliderCount, parent, "OptionsSliderTemplate") - slider:SetPoint("TOPLEFT", parent, "TOPLEFT", 28, y) - slider:SetWidth(220) - slider:SetHeight(16) - slider:SetMinMaxValues(minValue, maxValue) - slider:SetValueStep(step) - getglobal(slider:GetName() .. "Low"):SetText(tostring(minValue)) - getglobal(slider:GetName() .. "High"):SetText(tostring(maxValue)) - getglobal(slider:GetName() .. "Text"):SetText(label) - return slider -end - -local function CreateCheck(parent, label, y, onclick) - local check = CreateFrame("CheckButton", nil, parent, "UICheckButtonTemplate") - check:SetPoint("TOPLEFT", parent, "TOPLEFT", 22, y) - check:SetWidth(24) - check:SetHeight(24) - - local text = parent:CreateFontString(nil, "OVERLAY", "GameFontNormal") - text:SetPoint("LEFT", check, "RIGHT", 4, 0) - text:SetText(label) - - check:SetScript("OnClick", onclick) - return check -end - -function BNP:CreateOptions() - if self.optionsFrame then return end - - local frame = CreateFrame("Frame", "BNPOptionsFrame", UIParent) - frame:SetWidth(290) - frame:SetHeight(575) - frame:SetPoint("CENTER", UIParent, "CENTER", 0, 80) - frame:SetFrameStrata("DIALOG") - frame:SetBackdrop({ - bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", - edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, tileSize = 32, edgeSize = 32, - insets = { left = 11, right = 12, top = 12, bottom = 11 } - }) - frame:SetMovable(true) - frame:EnableMouse(true) - frame:RegisterForDrag("LeftButton") - frame:SetScript("OnDragStart", function() this:StartMoving() end) - frame:SetScript("OnDragStop", function() this:StopMovingOrSizing() end) - frame:Hide() - - local title = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge") - title:SetPoint("TOP", frame, "TOP", 0, -18) - title:SetText("Blizz Nameplates+") - - local version = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") - version:SetPoint("TOP", title, "BOTTOM", 0, -4) - version:SetText("Version " .. tostring(BNP.version or "?")) - frame.versionText = version - - local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton") - close:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -5, -5) - - local scale = CreateSlider(frame, "Nameplate Scale", 0.70, 1.50, 0.05, -78) - scale:SetScript("OnValueChanged", function() - if not BNP_DB then return end - local value = Round(this:GetValue(), 0.05) - BNP_DB.nameplateScale = value - getglobal(this:GetName() .. "Text"):SetText("Nameplate Scale: " .. string.format("%.2f", value)) - if BNP.ApplyNameplateScaleAll then BNP:ApplyNameplateScaleAll() end - end) - frame.scaleSlider = scale - - local icon = CreateSlider(frame, "Debuff Icon Size", 12, 32, 1, -133) - icon:SetScript("OnValueChanged", function() - if not BNP_DB then return end - local value = math.floor(this:GetValue() + 0.5) - BNP_DB.iconSize = value - getglobal(this:GetName() .. "Text"):SetText("Debuff Icon Size: " .. value) - if BNP.RefreshAllAuraLayouts then BNP:RefreshAllAuraLayouts() end - end) - frame.iconSlider = icon - - local castbarHeight = CreateSlider(frame, "Castbar Height", 4, 14, 1, -188) - castbarHeight:SetScript("OnValueChanged", function() - if not BNP_DB then return end - local value = math.floor(this:GetValue() + 0.5) - BNP_DB.castbarHeight = value - getglobal(this:GetName() .. "Text"):SetText("Castbar Height: " .. value) - if BNP.RefreshCastbarHeights then BNP:RefreshCastbarHeights() end - end) - frame.castbarHeightSlider = castbarHeight - - local classColors = CreateCheck(frame, "Class Colors", -226, function() - BNP_DB.classColors = this:GetChecked() and true or false - if BNP_DB.classColors then - local plate - for plate in pairs(BNP.plates or {}) do - plate.BNPClassColorApplied = nil - plate.BNPClassR = nil - plate.BNPClassG = nil - plate.BNPClassB = nil - end - end - end) - frame.classColorsCheck = classColors - - local castbars = CreateCheck(frame, "Castbars", -256, function() - local enabled = this:GetChecked() and true or false - if BNP.SetCastbarsEnabled then - BNP:SetCastbarsEnabled(enabled) - else - BNP_DB.castbars = enabled - end - end) - frame.castbarsCheck = castbars - - local tank = CreateCheck(frame, "Tank Mode", -286, function() - BNP_DB.tankMode = this:GetChecked() and true or false - if BNP.UpdateTankMode then BNP:UpdateTankMode() end - end) - frame.tankCheck = tank - - local healthTextLabel = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal") - healthTextLabel:SetPoint("TOPLEFT", frame, "TOPLEFT", 28, -318) - healthTextLabel:SetText("Health Text") - - local healthTextDropdown = CreateFrame("Frame", "BNPHealthTextDropdown", frame, "UIDropDownMenuTemplate") - healthTextDropdown:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -330) - UIDropDownMenu_SetWidth(150, healthTextDropdown) - - local healthModeLabels = { - off = "Off", - percent = "Percent", - hp = "HP", - both = "HP + Percent", - } - - local function SetHealthTextMode(mode) - if not healthModeLabels[mode] then mode = "off" end - - BNP_DB.healthText = mode - -- Keep the legacy setting synchronized for backwards compatibility. - BNP_DB.healthPercent = (mode == "percent" or mode == "both") - - UIDropDownMenu_SetSelectedValue(healthTextDropdown, mode) - UIDropDownMenu_SetText(healthModeLabels[mode], healthTextDropdown) - - if BNP.RefreshHealthPercent then BNP:RefreshHealthPercent() end - end - - UIDropDownMenu_Initialize(healthTextDropdown, function() - local modes = { "off", "percent", "hp", "both" } - local i - for i = 1, table.getn(modes) do - local mode = modes[i] - local info = {} - info.text = healthModeLabels[mode] - info.value = mode - info.func = function() - SetHealthTextMode(this.value) - end - info.checked = (BNP:GetHealthTextMode() == mode) - UIDropDownMenu_AddButton(info) - end - end) - - frame.healthTextDropdown = healthTextDropdown - frame.SetHealthTextMode = SetHealthTextMode - - local targetFocus = CreateCheck(frame, "Target Glow", -374, function() - BNP_DB.targetFocus = this:GetChecked() and true or false - if BNP.RefreshTargetFocus then BNP:RefreshTargetFocus() end - end) - frame.targetFocusCheck = targetFocus - - local glowColorLabel = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal") - glowColorLabel:SetPoint("TOPLEFT", frame, "TOPLEFT", 28, -406) - glowColorLabel:SetText("Target Glow Color") - - local glowColorDropdown = CreateFrame("Frame", "BNPTargetGlowColorDropdown", frame, "UIDropDownMenuTemplate") - glowColorDropdown:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -418) - UIDropDownMenu_SetWidth(150, glowColorDropdown) - - local glowColorLabels = { - white = "White", - gold = "Gold", - blue = "Blue", - green = "Green", - red = "Red", - purple = "Purple", - } - - local function SetTargetGlowColor(color) - if not glowColorLabels[color] then color = "white" end - - BNP_DB.targetGlowColor = color - UIDropDownMenu_SetSelectedValue(glowColorDropdown, color) - UIDropDownMenu_SetText(glowColorLabels[color], glowColorDropdown) - - if BNP.RefreshTargetFocus then BNP:RefreshTargetFocus() end - end - - UIDropDownMenu_Initialize(glowColorDropdown, function() - local colors = { "white", "gold", "blue", "green", "red", "purple" } - local i - for i = 1, table.getn(colors) do - local color = colors[i] - local info = {} - info.text = glowColorLabels[color] - info.value = color - info.func = function() - SetTargetGlowColor(this.value) - end - info.checked = ((BNP_DB and BNP_DB.targetGlowColor) or "white") == color - UIDropDownMenu_AddButton(info) - end - end) - - frame.glowColorDropdown = glowColorDropdown - frame.SetTargetGlowColor = SetTargetGlowColor - - local targetOnTop = CreateCheck(frame, "Target Plate on Top", -462, function() - BNP_DB.targetOnTop = this:GetChecked() and true or false - if BNP.RefreshTargetOnTop then BNP:RefreshTargetOnTop() end - end) - frame.targetOnTopCheck = targetOnTop - - local note = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") - note:SetPoint("TOPLEFT", frame, "TOPLEFT", 28, -502) - note:SetWidth(235) - note:SetJustifyH("LEFT") - note:SetText("Changes are applied immediately.\nTank Mode: green = targeting you, red = targeting someone else.") - - self.optionsFrame = frame -end - -function BNP:SyncOptions() - self:CreateOptions() - local frame = self.optionsFrame - frame.scaleSlider:SetValue(self:GetNameplateScale()) - frame.iconSlider:SetValue(self:GetIconSize()) - frame.castbarHeightSlider:SetValue(self:GetCastbarHeight()) - frame.classColorsCheck:SetChecked(self:AreClassColorsEnabled()) - frame.castbarsCheck:SetChecked(self:AreCastbarsEnabled()) - frame.tankCheck:SetChecked(self:IsTankModeEnabled()) - if frame.healthTextDropdown then - local mode = self:GetHealthTextMode() - UIDropDownMenu_SetSelectedValue(frame.healthTextDropdown, mode) - local labels = { off = "Off", percent = "Percent", hp = "HP", both = "HP + Percent" } - UIDropDownMenu_SetText(labels[mode] or "Off", frame.healthTextDropdown) - end - frame.targetFocusCheck:SetChecked(self:IsTargetFocusEnabled()) - - if frame.glowColorDropdown then - local _, _, _, color = self:GetTargetGlowColor() - local labels = { - white = "White", - gold = "Gold", - blue = "Blue", - green = "Green", - red = "Red", - purple = "Purple", - } - UIDropDownMenu_SetSelectedValue(frame.glowColorDropdown, color or "white") - UIDropDownMenu_SetText(labels[color] or "White", frame.glowColorDropdown) - end - - frame.targetOnTopCheck:SetChecked(self:IsTargetOnTopEnabled()) - frame.versionText:SetText("Version " .. tostring(self.version or "?")) -end - -function BNP:ToggleOptions() - self:SyncOptions() - if self.optionsFrame:IsShown() then - self.optionsFrame:Hide() - else - self.optionsFrame:Show() - end -end - -function BNP:CreateMinimapButton() - if self.minimapButton then return end - - BNP_DB = BNP_DB or {} - if BNP_DB.minimapAngle == nil then BNP_DB.minimapAngle = 225 end - - local button = CreateFrame("Button", "BNPMinimapButton", Minimap) - button:SetWidth(31) - button:SetHeight(31) - button:SetFrameStrata("MEDIUM") - button:SetFrameLevel((Minimap:GetFrameLevel() or 1) + 8) - button:RegisterForClicks("LeftButtonUp") - button:RegisterForDrag("LeftButton") - button:EnableMouse(true) - button:SetMovable(true) - - -- Classic round minimap-button background. - local bg = button:CreateTexture(nil, "BACKGROUND") - bg:SetTexture("Interface\\Minimap\\UI-Minimap-Background") - bg:SetWidth(22) - bg:SetHeight(22) - bg:SetPoint("CENTER", button, "CENTER", 0, 0) - button.bg = bg - - -- Addon identity: simple BN+ lettering instead of a spell/item icon. - -- Rendered directly by the client, so no external texture file is needed. - local iconBG = button:CreateTexture(nil, "ARTWORK") - iconBG:SetTexture(0.03, 0.03, 0.03, 1) - iconBG:SetWidth(20) - iconBG:SetHeight(20) - iconBG:SetPoint("CENTER", button, "CENTER", 0, 0) - button.iconBG = iconBG - - local label = button:CreateFontString(nil, "OVERLAY") - label:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE") - label:SetPoint("CENTER", button, "CENTER", 0, 0) - label:SetText("BN+") - label:SetTextColor(0.20, 0.60, 1.00) - button.label = label - - -- Standard Blizzard circular minimap border. - local border = button:CreateTexture(nil, "OVERLAY") - border:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder") - border:SetWidth(54) - border:SetHeight(54) - border:SetPoint("TOPLEFT", button, "TOPLEFT", 0, 0) - button.border = border - - local highlight = button:CreateTexture(nil, "HIGHLIGHT") - highlight:SetTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight") - highlight:SetBlendMode("ADD") - highlight:SetAllPoints(button) - button.highlight = highlight - - local function UpdatePosition() - local angle = tonumber(BNP_DB.minimapAngle) or 225 - local radius = 78 - local rad = math.rad(angle) - - button:ClearAllPoints() - button:SetPoint( - "CENTER", - Minimap, - "CENTER", - math.cos(rad) * radius, - math.sin(rad) * radius - ) - end - - local function UpdateAngleFromCursor() - local mx, my = Minimap:GetCenter() - local scale = 1 - if UIParent.GetEffectiveScale then - scale = UIParent:GetEffectiveScale() or 1 - elseif UIParent.GetScale then - scale = UIParent:GetScale() or 1 - end - local cx, cy = GetCursorPosition() - cx = cx / scale - cy = cy / scale - - local dx = cx - mx - local dy = cy - my - - local angle - if math.atan2 then - angle = math.deg(math.atan2(dy, dx)) - else - if dx == 0 then - angle = dy >= 0 and 90 or -90 - else - angle = math.deg(math.atan(dy / dx)) - if dx < 0 then angle = angle + 180 end - end - end - BNP_DB.minimapAngle = angle - UpdatePosition() - end - - button:SetScript("OnDragStart", function() - this:SetScript("OnUpdate", UpdateAngleFromCursor) - end) - - button:SetScript("OnDragStop", function() - this:SetScript("OnUpdate", nil) - UpdateAngleFromCursor() - end) - - button:SetScript("OnClick", function() - BNP:ToggleOptions() - end) - - button:SetScript("OnEnter", function() - GameTooltip:SetOwner(this, "ANCHOR_LEFT") - GameTooltip:SetText("Blizz Nameplates+") - GameTooltip:AddLine("Left-click: Open settings", 1, 1, 1) - GameTooltip:AddLine("Drag: Move minimap button", 0.8, 0.8, 0.8) - GameTooltip:Show() - end) - - button:SetScript("OnLeave", function() - GameTooltip:Hide() - end) - - UpdatePosition() - self.minimapButton = button -end diff --git a/core/ui.lua b/core/ui.lua deleted file mode 100644 index 57b6782..0000000 --- a/core/ui.lua +++ /dev/null @@ -1,15 +0,0 @@ -BNP = BNP or {} - --- Central visual constants. Keeping these values in one place lets us polish --- the Blizzard-style presentation without touching aura tracking logic. -BNP.UI = BNP.UI or { - ICON_SIZE = 18, - ICON_OFFSET_Y = 15, - ICON_SPACING = 2, - TIMER_FONT = "Fonts\\FRIZQT__.TTF", - TIMER_SIZE = 8, - TIMER_OFFSET_X = 0, - TIMER_OFFSET_Y = 0, - TIMER_SHADOW_X = 1, - TIMER_SHADOW_Y = -1, -}