SHOW:
|
|
- or go back to the newest paste.
| 1 | local Core = LibStub("AceAddon-3.0"):GetAddon("BasicUI")
| |
| 2 | local Module = Core:NewModule("Unitframes", "AceEvent-3.0")
| |
| 3 | ||
| 4 | ---------------- | |
| 5 | -- Unitframes -- | |
| 6 | ---------------- | |
| 7 | ||
| 8 | local CUSTOM_FACTION_BAR_COLORS = {
| |
| 9 | [1] = {r = 1, g = 0, b = 0},
| |
| 10 | [2] = {r = 1, g = 0, b = 0},
| |
| 11 | [3] = {r = 1, g = 1, b = 0},
| |
| 12 | [4] = {r = 1, g = 1, b = 0},
| |
| 13 | [5] = {r = 0, g = 1, b = 0},
| |
| 14 | [6] = {r = 0, g = 1, b = 0},
| |
| 15 | [7] = {r = 0, g = 1, b = 0},
| |
| 16 | [8] = {r = 0, g = 1, b = 0},
| |
| 17 | } | |
| 18 | ||
| 19 | -- Font Style | |
| 20 | local shorts = {
| |
| 21 | { 1e10, 1e9, "%.0fB" }, -- 10b+ as 12b
| |
| 22 | { 1e9, 1e9, "%.1fB" }, -- 1b+ as 8.3b
| |
| 23 | { 1e7, 1e6, "%.0fM" }, -- 10m+ as 14m
| |
| 24 | { 1e6, 1e6, "%.1fM" }, -- 1m+ as 7.4m
| |
| 25 | { 1e5, 1e3, "%.0fK" }, -- 100k+ as 840k
| |
| 26 | { 1e3, 1e3, "%.1fK" }, -- 1k+ as 2.5k
| |
| 27 | { 0, 1, "%d" }, -- < 1k as 974
| |
| 28 | } | |
| 29 | for i = 1, #shorts do | |
| 30 | shorts[i][4] = shorts[i][3] .. " (%.0f%%)" | |
| 31 | end | |
| 32 | ||
| 33 | ------------------------------------------------------------------------ | |
| 34 | ||
| 35 | local db, enabled | |
| 36 | ||
| 37 | function Module:OnEnable() | |
| 38 | if InCombatLockdown() then | |
| 39 | return self:RegisterEvent("PLAYER_REGEN_ENABLED", "OnEnable")
| |
| 40 | end | |
| 41 | self:UnregisterEvent("PLAYER_REGEN_ENABLED")
| |
| 42 | ||
| 43 | db = Core.db.profile | |
| 44 | ||
| 45 | if enabled or not db.unitframes.enable then return end | |
| 46 | enabled = true -- since most of this stuff is non-undoable (eg. hooksecurefunc) | |
| 47 | ||
| 48 | -- Update Unit Frames | |
| 49 | - | self:RunUnitFunctions("OnEnable")
|
| 49 | + | self:ApplySettings() |
| 50 | ||
| 51 | -- Disable healing/damage spam over player/pet frame: | |
| 52 | PlayerHitIndicator:SetText(nil) | |
| 53 | PlayerHitIndicator.SetText = function() end | |
| 54 | PetHitIndicator:SetText(nil) | |
| 55 | PetHitIndicator.SetText = function() end | |
| 56 | ||
| 57 | -- Change other frames' name backgrounds to match player frame | |
| 58 | for _, region in pairs({
| |
| 59 | TargetFrameNameBackground, | |
| 60 | FocusFrameNameBackground, | |
| 61 | Boss1TargetFrameNameBackground, | |
| 62 | Boss2TargetFrameNameBackground, | |
| 63 | Boss3TargetFrameNameBackground, | |
| 64 | Boss4TargetFrameNameBackground, | |
| 65 | }) do | |
| 66 | region:SetTexture(0, 0, 0, 0.5) | |
| 67 | end | |
| 68 | ||
| 69 | -- Font Style / Color thanks to Phanx from WoWinterface. | |
| 70 | hooksecurefunc("TextStatusBar_UpdateTextStringWithValues", function(statusBar, fontString, value, valueMin, valueMax)
| |
| 71 | if value == 0 then | |
| 72 | return fontString:SetText("")
| |
| 73 | end | |
| 74 | ||
| 75 | local style = GetCVar("statusTextDisplay")
| |
| 76 | if style == "PERCENT" then | |
| 77 | return fontString:SetFormattedText("%.0f%%", value / valueMax * 100)
| |
| 78 | end | |
| 79 | for i = 1, #shorts do | |
| 80 | local t = shorts[i] | |
| 81 | if value >= t[1] then | |
| 82 | if style == "BOTH" then | |
| 83 | return fontString:SetFormattedText(t[4], value / t[2], value / valueMax * 100) | |
| 84 | else | |
| 85 | if value < valueMax then | |
| 86 | for j = 1, #shorts do | |
| 87 | local v = shorts[j] | |
| 88 | if valueMax >= v[1] then | |
| 89 | return fontString:SetFormattedText(t[3] .. " / " .. v[3], value / t[2], valueMax / v[2]) | |
| 90 | end | |
| 91 | end | |
| 92 | end | |
| 93 | return fontString:SetFormattedText(t[3], value / t[2]) | |
| 94 | end | |
| 95 | end | |
| 96 | end | |
| 97 | end) | |
| 98 | ||
| 99 | -- Font Color | |
| 100 | hooksecurefunc("UnitFrame_Update", function(self, isParty)
| |
| 101 | if not self.name or not self:IsShown() then return end | |
| 102 | ||
| 103 | local PET_COLOR = { r = 157/255, g = 197/255, b = 255/255 }
| |
| 104 | local unit, color = self.unit | |
| 105 | if UnitPlayerControlled(unit) then | |
| 106 | if UnitIsPlayer(unit) then | |
| 107 | local _, class = UnitClass(unit) | |
| 108 | color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[class] | |
| 109 | else | |
| 110 | color = PET_COLOR | |
| 111 | end | |
| 112 | elseif UnitIsDeadOrGhost(unit) or UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) then | |
| 113 | color = GRAY_FONT_COLOR | |
| 114 | else | |
| 115 | color = CUSTOM_FACTION_BAR_COLORS[UnitIsEnemy(unit, "player") and 1 or UnitReaction(unit, "player") or 5] | |
| 116 | end | |
| 117 | ||
| 118 | if not color then | |
| 119 | color = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)["PRIEST"] | |
| 120 | end | |
| 121 | ||
| 122 | self.name:SetTextColor(color.r, color.g, color.b) | |
| 123 | - | function Module:RunUnitFunctions(event, addon) |
| 123 | + | |
| 124 | - | if not InCombatLockdown() then |
| 124 | + | |
| 125 | - | for unit, func in pairs(self.UnitFunctions) do |
| 125 | + | |
| 126 | - | if db.unitframes[unit].enable then |
| 126 | + | |
| 127 | - | if not func(self) then |
| 127 | + | |
| 128 | - | self.UnitFunctions[unit] = nil |
| 128 | + | |
| 129 | function Module:ApplySettings(event) | |
| 130 | if event then | |
| 131 | self:UnregisterEvent(event) | |
| 132 | end | |
| 133 | - | if next(self.UnitFunctions) then |
| 133 | + | |
| 134 | - | -- Something wasn't able to run, try again later. |
| 134 | + | |
| 135 | - | self:RegisterEvent("ADDON_LOADED", "RunUnitFunctions")
|
| 135 | + | return self:RegisterEvent("PLAYER_REGEN_ENABLED", "ApplySettings")
|
| 136 | - | else |
| 136 | + | |
| 137 | - | -- All done. |
| 137 | + | |
| 138 | - | self:UnregisterEvent("ADDON_LOADED")
|
| 138 | + | local failure |
| 139 | for unit, func in pairs(self.UnitFunctions) do | |
| 140 | if db.unitframes[unit].enable then | |
| 141 | if func(self) then | |
| 142 | failure = true | |
| 143 | end | |
| 144 | end | |
| 145 | end | |
| 146 | ||
| 147 | if failure then | |
| 148 | self:RegisterEvent("ADDON_LOADED", "ApplySettings")
| |
| 149 | end | |
| 150 | end | |
| 151 | ||
| 152 | ------------------------------------------------------------------------ | |
| 153 | ||
| 154 | Module.UnitFunctions = {
| |
| 155 | - | -- Disable healing/damage spam over player/pet frame: |
| 155 | + | |
| 156 | - | PlayerHitIndicator:SetText(nil) |
| 156 | + | |
| 157 | - | PlayerHitIndicator.SetText = function() end |
| 157 | + | |
| 158 | - | PetHitIndicator:SetText(nil) |
| 158 | + | |
| 159 | - | PetHitIndicator.SetText = function() end |
| 159 | + | |
| 160 | PlayerFrameAlternateManaBarText:SetFont(db.media.fontNormal, db.unitframes.player.fontSize, "THINOUTLINE") | |
| 161 | ||
| 162 | PetFrameHealthBarText:SetFont(db.media.fontNormal, db.unitframes.player.fontSizepet,"THINOUTLINE") | |
| 163 | PetFrameManaBarText:SetFont(db.media.fontNormal, db.unitframes.player.fontSizepet, "THINOUTLINE") | |
| 164 | end, | |
| 165 | ||
| 166 | target = function(self) | |
| 167 | TargetFrame:SetScale(db.unitframes.target.scale) | |
| 168 | TargetFrameTextureFrameHealthBarText:SetFont(db.media.fontNormal, db.unitframes.target.fontSize, "THINOUTLINE") | |
| 169 | TargetFrameTextureFrameManaBarText:SetFont(db.media.fontNormal, db.unitframes.target.fontSize, "THINOUTLINE") | |
| 170 | end, | |
| 171 | ||
| 172 | focus = function(self) | |
| 173 | FocusFrame:SetScale(db.unitframes.focus.scale) | |
| 174 | FocusFrameTextureFrameHealthBarText:SetFont(db.media.fontNormal, db.unitframes.focus.fontSize,"THINOUTLINE") | |
| 175 | FocusFrameTextureFrameManaBarText:SetFont(db.media.fontNormal, db.unitframes.focus.fontSize,"THINOUTLINE") | |
| 176 | end, | |
| 177 | ||
| 178 | party = function(self) | |
| 179 | for i = 1, MAX_PARTY_MEMBERS do | |
| 180 | local partyFrame = "PartyMemberFrame"..i | |
| 181 | _G[partyFrame]:SetScale(db.unitframes.party.scale) | |
| 182 | _G[partyFrame.."HealthBarText"]:SetFont(db.media.fontNormal, db.unitframes.party.fontSize, "THINOUTLINE") | |
| 183 | _G[partyFrame.."ManaBarText"]:SetFont(db.media.fontNormal, db.unitframes.party.fontSize, "THINOUTLINE") | |
| 184 | end | |
| 185 | end, | |
| 186 | ||
| 187 | arena = function(self) | |
| 188 | if not ArenaEnemyFrame1 then | |
| 189 | return true | |
| 190 | end | |
| 191 | ||
| 192 | for i = 1, MAX_ARENA_ENEMIES do | |
| 193 | local prepFrame = "ArenaPrepFrame"..i | |
| 194 | _G[prepFrame]:SetScale(db.unitframes.arena.scale) | |
| 195 | _G[prepFrame.."HealthBarText"]:SetFont(db.media.fontNormal, db.unitframes.arena.fontSize,"THINOUTLINE") | |
| 196 | _G[prepFrame.."ManaBarText"]:SetFont(db.media.fontNormal, db.unitframes.arena.fontSize, "THINOUTLINE") | |
| 197 | ||
| 198 | local arenaFrame = "ArenaEnemyFrame"..i | |
| 199 | _G[arenaFrame]:SetScale(db.unitframes.arena.scale) | |
| 200 | _G[arenaFrame.."HealthBarText"]:SetFont(db.media.fontNormal, db.unitframes.arena.fontSize,"THINOUTLINE") | |
| 201 | _G[arenaFrame.."ManaBarText"]:SetFont(db.media.fontNormal, db.unitframes.arena.fontSize, "THINOUTLINE") | |
| 202 | end | |
| 203 | end, | |
| 204 | ||
| 205 | boss = function(self) | |
| 206 | for i = 1, MAX_BOSS_FRAMES do | |
| 207 | local bossFrame = "Boss"..i.."TargetFrame" | |
| 208 | _G[bossFrame]:SetScale(db.unitframes.boss.scale) | |
| 209 | end | |
| 210 | end, | |
| 211 | ||
| 212 | } |