Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- declare addon ------------------------------------------------------------
- local ACM, private = ...
- local LibStub = LibStub
- -- local variables ----------------------------------------------------------
- local allManaValues = {} -- stores all values during combat
- local span = 1100 -- this is the left and right limit of manaburn or managain in absolute MPS value (user setting?)
- local numsegments = 10 -- negative/positive half-bar number of segments (center segment excluded)
- local segment_span = span/numsegments -- how much MPS per segment?
- -- declare the database
- local db
- function ACM:OnInitialize()
- self:CreateManaBar()
- end
- function ACM:OnEnable()
- self:RegisterEvent("PLAYER_REGEN_ENABLED")
- self:RegisterEvent("PLAYER_REGEN_DISABLED")
- end
- function ACM:CreateManaBar()
- -- build and set frame
- private.manaDisplay = CreateFrame("Frame", "manaDisplay", UIParent)
- private.manaDisplay:SetHeight(20)
- private.manaDisplay:SetWidth(210)
- BackDrop:EnhanceBackdrop(private.manaDisplay)
- local TEXTURE = "Interface\\BUTTONS\\WHITE8X8"
- private.manaDisplay:SetBackdrop({
- bgFile = TEXTURE, tile = false, tileSize = 16,
- edgeFile = self.db.profile.barBorder, edgeSize = 16,
- insets = { left = 4, right = 4, top = 4, bottom = 4 },
- })
- private.manaDisplay:SetBackdropGradient("HORIZONTAL", 1, 0, 0, 0, 1, 0)
- -- private.manaDisplay:SetBackdropBorderColor(0.6, 0.6, 0.6, 1)
- private.manaDisplay:SetAlpha(1)
- -- create the segments that the pointer is attached to
- for i = 1, 21 do
- local t = private.manaDisplay.segments[i] or private.manaDisplay:CreateTexture(nil, "ARTWORK")
- t:SetPoint("LEFT", private.manaDisplay.segments[i - 1], "RIGHT", 0, 0)
- t:SetWidth(private.manaDisplay:GetWidth() / 21)
- t:SetHeight(private.manaDisplay:GetHeight() - 10)
- t:SetTexture(TEXTURE)
- t:SetAlpha(0.8)
- private.manaDisplay.segments[i] = t
- end
- end
- local function round(input, idp)
- local mult = 10^(idp or 0)
- if input >= 0 then return math.floor(input * mult + 0.5) / mult
- else return math.ceil(input * mult - 0.5) / mult end
- end
- local in_combat
- function ACM:PLAYER_REGEN_ENABLED()
- in_combat = false
- private.manaDisplay:SetScript("OnUpdate", nil)
- -- reset indicator to posistion 0, which is 11, or centre
- private.manaDisplay.indicator:SetPoint("CENTER", private.manaDisplay.segments[11], "RIGHT")
- -- calculate overall average gain or loss of Mana
- local allManaSum = 0
- local t = allManaValues
- for k = 1, #t do
- local v = t[k]
- allManaSum = allManaSum + v
- end
- local combatAverage = round((allManaSum / #t))
- combatAverage = nil
- allManaValues = {}
- end
- function ACM:PLAYER_REGEN_DISABLED()
- if #self.db.char.logs > 20 then
- table.remove(self.db.char.logs, 1) -- keep log file to a max of 20 entries, removing oldest
- end
- in_combat = true
- local firstManaValue = UnitPower("player", SPELL_POWER_MANA)
- -- must show the display in combat, or nothing happens, including calculating/printing overall average
- if not private.manaDisplay:IsShown() then
- private.manaDisplay:Show()
- end
- private.manaDisplay.leftSide:SetText("")
- private.manaDisplay.rightSide:SetText("")
- local counter = 0
- private.manaDisplay:SetScript("OnUpdate", function(self, elapsed)
- counter = counter + elapsed
- if counter < 1 then return end
- counter = 0
- local currentMana = UnitPower("player", SPELL_POWER_MANA)
- local deltaMana = currentMana - firstManaValue or currentMana
- firstManaValue = currentMana
- local numManaValues = #allManaValues + 1
- allManaValues[numManaValues] = deltaMana
- -- get 10 (or less, if there are less) recent values
- local count = numManaValues >= 10 and 10 or numManaValues
- for index = numManaValues - count + 1, numManaValues - 1 do
- deltaMana = deltaMana + allManaValues[index]
- end
- local average = deltaMana / count
- local average_normalized = floor(min(min(abs(average)/segment_span,numsegments),numsegments)+0.5)-- normalized to absolute 'segment units'
- local pointer = 11 -- 1-21 means 11 = center spot, 1-10 segments left, 12-21 segments right
- if average < 0 then
- pointer = (mumsegments + 1) - average_normalized
- elseif average > 0 then
- pointer = average_normalized + (numsegments + 1)
- end
- private.manaDisplay.indicator:SetPoint("CENTER", private.manaDisplay.segments[pointer], "RIGHT")
- -- losing mana
- if average < 0 then
- -- respect user's display settings
- if self.db.profile.showLeft then
- private.manaDisplay.leftSide:SetFormattedText(L["Full Burn!"] .."\n%d", average)
- private.manaDisplay.rightSide:SetText("")
- else
- private.manaDisplay.leftSide:SetFormattedText(average)
- private.manaDisplay.rightSide:SetText("")
- end
- -- gaining mana
- elseif average > 1 then
- -- more respecting
- if self.db.profile.showRight then
- private.manaDisplay.rightSide:SetFormattedText(L["Gaining Mana!"] .."\n%d", average)
- private.manaDisplay.leftSide:SetText("")
- else
- private.manaDisplay.rightSide:SetFormattedText(average)
- private.manaDisplay.leftSide:SetText("")
- end
- -- breaking even
- else
- private.manaDisplay.leftSide:SetText("")
- private.manaDisplay.rightSide:SetText("")
- end
- end)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement