mirror of
https://github.com/Bluewhale1337/ElvUIModernized.git
synced 2026-07-27 08:24:44 +00:00
update some more (still needs more work)
This commit is contained in:
@@ -0,0 +1,354 @@
|
||||
--[[
|
||||
Name: LibDruidMana-1.0
|
||||
Revision: $Rev: 29 $
|
||||
Author: Cameron Kenneth Knight (ckknight@gmail.com)
|
||||
Inspired By: SmartyCat by Darravis
|
||||
Website: http://www.wowace.com/
|
||||
Description: A library to provide data on mana for druids in bear or cat form.
|
||||
License: LGPL v2.1
|
||||
]]
|
||||
|
||||
if(select(2, UnitClass("player")) ~= "DRUID") then return; end
|
||||
|
||||
local MAJOR_VERSION = "LibDruidMana-1.0"
|
||||
local MINOR_VERSION = 90001 + tonumber(string.match("$Revision: 29 $", "%d+"))
|
||||
|
||||
local floor = math.floor
|
||||
|
||||
local GetManaRegen = GetManaRegen
|
||||
local GetNumSpellTabs = GetNumSpellTabs
|
||||
local GetSpellName = GetSpellName
|
||||
local GetSpellTabInfo = GetSpellTabInfo
|
||||
local GetSpellTexture = GetSpellTexture
|
||||
local GetTime = GetTime
|
||||
local UnitMana = UnitMana
|
||||
local UnitManaMax = UnitManaMax
|
||||
local UnitPowerType = UnitPowerType
|
||||
local UnitStat = UnitStat
|
||||
|
||||
local lib, oldMinor = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
|
||||
if not lib then return end
|
||||
local oldLib
|
||||
if oldMinor then
|
||||
oldLib = {}
|
||||
for k, v in pairs(lib) do
|
||||
oldLib[k] = v
|
||||
lib[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local regenMana, maxMana, currMana, currInt, fiveSecondRule
|
||||
currMana, maxMana = 0, 0
|
||||
local bearID, bearName, catName
|
||||
|
||||
-- frame for events and OnUpdate
|
||||
local frame
|
||||
if oldLib and oldLib.frame then
|
||||
frame = oldLib.frame
|
||||
frame:UnregisterAllEvents()
|
||||
frame:SetScript("OnEvent", nil)
|
||||
frame:SetScript("OnUpdate", nil)
|
||||
for k in pairs(frame) do
|
||||
if k ~= 0 then
|
||||
frame[k] = nil
|
||||
end
|
||||
end
|
||||
else
|
||||
frame = CreateFrame("Frame", MAJOR_VERSION .. "_Frame")
|
||||
end
|
||||
lib.frame = frame
|
||||
|
||||
-- tooltip for scanning the mana cost for shapeshifting.
|
||||
local tt
|
||||
if oldLib and oldLib.tt then
|
||||
tt = oldLib.tt
|
||||
else
|
||||
tt = CreateFrame("GameTooltip", MAJOR_VERSION .. "_Tooltip")
|
||||
end
|
||||
lib.tt = tt
|
||||
if not tt.left then
|
||||
tt.left = {}
|
||||
tt.right = {}
|
||||
end
|
||||
for i = table.getn(tt.left) + 1, 30 do
|
||||
local left, right = tt:CreateFontString(), tt:CreateFontString()
|
||||
tt.left[i] = left
|
||||
tt.right[i] = right
|
||||
left:SetFontObject(GameFontNormal)
|
||||
right:SetFontObject(GameFontNormal)
|
||||
tt:AddFontStrings(left, right)
|
||||
end
|
||||
tt:SetOwner(UIParent, "ANCHOR_NONE")
|
||||
|
||||
-- set of functions to call when mana is updated
|
||||
local registry = oldLib and oldLib.registry or {}
|
||||
lib.registry = registry
|
||||
|
||||
local function getShapeshiftCost()
|
||||
if not bearID then return 0 end
|
||||
|
||||
tt:ClearLines()
|
||||
tt:SetSpell(bearID, "spell")
|
||||
|
||||
if not tt:IsOwned(UIParent) then
|
||||
tt:SetOwner(UIParent, "ANCHOR_NONE")
|
||||
end
|
||||
|
||||
local line = tt.left[2]:GetText()
|
||||
if line then
|
||||
line = tonumber(string.match(line, "(%d+)"))
|
||||
end
|
||||
|
||||
return line or 0
|
||||
end
|
||||
|
||||
frame:SetScript("OnEvent", function(...)
|
||||
this[event](this, unpack(arg))
|
||||
end)
|
||||
|
||||
local SetMax_time = nil
|
||||
local UpdateMana_time = nil
|
||||
local killFSR_time = nil
|
||||
|
||||
frame:SetScript("OnUpdate", function(this, elapsed)
|
||||
local currentTime = GetTime()
|
||||
if SetMax_time and SetMax_time <= currentTime then
|
||||
SetMax_time = nil
|
||||
this:SetMax()
|
||||
end
|
||||
if UpdateMana_time and UpdateMana_time <= currentTime then
|
||||
UpdateMana_time = UpdateMana_time + 2
|
||||
this:UpdateMana()
|
||||
end
|
||||
if killFSR_time and killFSR_time <= currentTime then
|
||||
killFSR_time = nil
|
||||
fiveSecondRule = false
|
||||
end
|
||||
end)
|
||||
|
||||
function frame:PLAYER_LOGIN()
|
||||
self.PLAYER_LOGIN = nil
|
||||
|
||||
self:LEARNED_SPELL_IN_TAB()
|
||||
|
||||
self:RegisterEvent("UNIT_DISPLAYPOWER")
|
||||
|
||||
if UnitPowerType("player") == 0 then
|
||||
self:UNIT_DISPLAYPOWER("player")
|
||||
end
|
||||
end
|
||||
|
||||
function frame:UNIT_DISPLAYPOWER(unit)
|
||||
if unit ~= "player" or UnitPowerType("player") ~= 0 then return end
|
||||
|
||||
self:UnregisterEvent("UNIT_DISPLAYPOWER")
|
||||
self.UNIT_DISPLAYPOWER = nil
|
||||
|
||||
maxMana = UnitManaMax("player")
|
||||
currMana = UnitMana("player")
|
||||
local _
|
||||
_, currInt = UnitStat("player", 4)
|
||||
|
||||
self:RegisterEvent("UNIT_MANA")
|
||||
self:RegisterEvent("UNIT_MAXMANA")
|
||||
self:RegisterEvent("UNIT_INVENTORY_CHANGED")
|
||||
self:RegisterEvent("PLAYER_AURAS_CHANGED")
|
||||
self:RegisterEvent("LEARNED_SPELL_IN_TAB")
|
||||
self:RegisterEvent("PLAYER_ENTERING_WORLD")
|
||||
self:RegisterEvent("PLAYER_LEAVING_WORLD")
|
||||
self:RegisterEvent("COMBAT_TEXT_UPDATE")
|
||||
|
||||
self:Update()
|
||||
end
|
||||
|
||||
function frame:PLAYER_ENTERING_WORLD()
|
||||
if UnitPowerType("player") ~= 0 then
|
||||
SetMax_time = GetTime() + 7
|
||||
end
|
||||
end
|
||||
|
||||
function frame:PLAYER_LEAVING_WORLD()
|
||||
SetMax_time = nil
|
||||
UpdateMana_time = nil
|
||||
killFSR_time = nil
|
||||
end
|
||||
|
||||
function frame:UNIT_MANA(unit)
|
||||
if unit ~= "player" then return end
|
||||
|
||||
if UnitPowerType("player") == 0 then
|
||||
currMana = UnitMana("player")
|
||||
maxMana = UnitManaMax("player")
|
||||
self:Update()
|
||||
else
|
||||
if regenMana and not UpdateMana_time then
|
||||
-- Update mana every 2 seconds
|
||||
UpdateMana_time = GetTime() + 2
|
||||
self:UpdateMana()
|
||||
end
|
||||
-- if mana hasn't been updated for 7 seconds, set current mana to the max mana
|
||||
SetMax_time = GetTime() + 7
|
||||
end
|
||||
end
|
||||
|
||||
function frame:UNIT_MAXMANA(unit)
|
||||
if unit ~= "player" then return end
|
||||
|
||||
local _, int = UnitStat("player", 4)
|
||||
if UnitPowerType("player") == 0 then
|
||||
maxMana = UnitManaMax("player")
|
||||
currMana = UnitMana("player")
|
||||
currInt = int
|
||||
elseif currInt ~= int then
|
||||
-- int buff maybe
|
||||
maxMana = maxMana + ((int - currInt) * 15)
|
||||
currInt = int
|
||||
if currMana > maxMana then
|
||||
currMana = maxMana
|
||||
end
|
||||
end
|
||||
|
||||
self:Update()
|
||||
end
|
||||
frame.UNIT_INVENTORY_CHANGED = frame.UNIT_MAXMANA
|
||||
|
||||
function frame:PLAYER_AURAS_CHANGED()
|
||||
-- possibly losing the bear/cat buff
|
||||
if UnitPowerType("player") == 0 then
|
||||
regenMana = false
|
||||
SetMax_time = nil
|
||||
UpdateMana_time = nil
|
||||
killFSR_time = nil
|
||||
currMana = UnitMana("player")
|
||||
maxMana = UnitManaMax("player")
|
||||
end
|
||||
|
||||
self:Update()
|
||||
end
|
||||
|
||||
function frame:COMBAT_TEXT_UPDATE()
|
||||
-- if the spell is cast for either bear or cat, deduct the cost.
|
||||
-- we can't rely on UNIT_DISPLAYPOWER since you could switch from bear -> bear, never calling that, so we check the spellcast.
|
||||
if (bearName and arg2 == bearName) or (catName and arg2 == catName) then
|
||||
regenMana = true
|
||||
fiveSecondRule = true
|
||||
killFSR_time = GetTime() + 5
|
||||
currMana = currMana - getShapeshiftCost()
|
||||
end
|
||||
end
|
||||
|
||||
function frame:LEARNED_SPELL_IN_TAB()
|
||||
for i = 1, GetNumSpellTabs() do
|
||||
local _, texture, offset, numSpells = GetSpellTabInfo(i)
|
||||
-- the spell tab that shows the bear is the feral tree, gonna check for bear form and cat form, gleam important info
|
||||
if string.find(texture, "Ability_Racial_BearForm") then
|
||||
for j = offset + 1, offset + numSpells do
|
||||
if string.find(GetSpellTexture(j, "spell"), "Ability_Racial_BearForm") then
|
||||
bearID = j
|
||||
bearName = GetSpellName(j, "spell")
|
||||
elseif string.find(GetSpellTexture(j, "spell"), "Ability_Druid_CatForm") then
|
||||
catName = GetSpellName(j, "spell")
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function frame:UpdateMana()
|
||||
print(this)
|
||||
local regen, castingRegen = GetManaRegen()
|
||||
if fiveSecondRule then
|
||||
currMana = currMana + floor(castingRegen * 2 + 0.5)
|
||||
else
|
||||
currMana = currMana + floor(regen * 2 + 0.5)
|
||||
end
|
||||
|
||||
if currMana >= maxMana then
|
||||
currMana = maxMana
|
||||
|
||||
-- we're at max mana, no need for any more checking
|
||||
SetMax_time = nil
|
||||
UpdateMana_time = nil
|
||||
killFSR_time = nil
|
||||
end
|
||||
|
||||
self:Update()
|
||||
end
|
||||
|
||||
function frame:SetMax()
|
||||
currMana = maxMana
|
||||
|
||||
-- we're at max mana, no need for any more checking
|
||||
SetMax_time = nil
|
||||
UpdateMana_time = nil
|
||||
killFSR_time = nil
|
||||
|
||||
self:Update()
|
||||
end
|
||||
local i = 0
|
||||
local lastMaxMana, lastCurrMana = 0, 0
|
||||
function frame:Update()
|
||||
if lastMaxMana == maxMana and lastCurrMana == currMana then return end
|
||||
|
||||
lastMaxMana = maxMana
|
||||
lastCurrMana = currMana
|
||||
|
||||
-- trigger event
|
||||
for func in pairs(registry) do
|
||||
local success, ret = pcall(func, currMana, maxMana)
|
||||
if not success then
|
||||
geterrorhandler()(ret)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- if IsLoggedIn() then
|
||||
frame:PLAYER_LOGIN()
|
||||
-- else
|
||||
-- frame:RegisterEvent("PLAYER_LOGIN")
|
||||
-- end
|
||||
|
||||
function lib:GetCurrentMana()
|
||||
return currMana
|
||||
end
|
||||
|
||||
function lib:GetMaximumMana()
|
||||
return maxMana
|
||||
end
|
||||
|
||||
function lib:AddListener(tab, method)
|
||||
local func
|
||||
if type(tab) == "table" then
|
||||
if type(method) ~= "string" then
|
||||
error(format("Bad argument #3 to `AddListener'. Expected %q, got %q.", "string", type(method)), 2)
|
||||
elseif type(tab[method]) ~= "function" then
|
||||
error(format("Bad argument #3 to `AddListener'. Expected method, got %q.", type(tab[method])), 2)
|
||||
end
|
||||
func = function(...)
|
||||
return tab[method](tab, unpack(arg))
|
||||
end
|
||||
elseif type(tab) == "function" then
|
||||
func = tab
|
||||
if method and type(method) ~= "string" then
|
||||
method = true
|
||||
end
|
||||
else
|
||||
error(format("Bad argument #2 to `AddListener'. Expected %q or %q, got %q.", "table", "function", type(tab)), 2)
|
||||
end
|
||||
|
||||
registry[func] = method
|
||||
end
|
||||
|
||||
function lib:RemoveListener(method)
|
||||
if type(method) ~= "string" then
|
||||
error(format("Bad argument #2 to `RemoveListener'. Expected %q, got %q.", "string", type(method)), 2)
|
||||
end
|
||||
|
||||
for func, methodName in pairs(registry) do
|
||||
if methodName == method then
|
||||
registry[func] = nil
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||
<Script file="LibDruidMana-1.0.lua"/>
|
||||
</Ui>
|
||||
@@ -0,0 +1,152 @@
|
||||
if(select(2, UnitClass("player")) ~= "DRUID") then return; end
|
||||
|
||||
local ns = oUF
|
||||
local oUF = ns.oUF
|
||||
|
||||
local LDM = LibStub("LibDruidMana-1.0")
|
||||
|
||||
local function UpdateColor(element, cur, max)
|
||||
local parent = element.__owner
|
||||
|
||||
local r, g, b, t
|
||||
if(element.colorClass) then
|
||||
t = parent.colors.class['DRUID']
|
||||
elseif(element.colorSmooth) then
|
||||
r, g, b = parent.ColorGradient(cur, max, unpack(element.smoothGradient or parent.colors.smooth))
|
||||
elseif(element.colorPower) then
|
||||
t = parent.colors.power[0]
|
||||
end
|
||||
|
||||
if(t) then
|
||||
r, g, b = t[1], t[2], t[3]
|
||||
end
|
||||
|
||||
if(b) then
|
||||
element:SetStatusBarColor(r, g, b)
|
||||
|
||||
local bg = element.bg
|
||||
if(bg) then
|
||||
local mu = bg.multiplier or 1
|
||||
bg:SetVertexColor(r * mu, g * mu, b * mu)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function Update(self, event, unit, currMana, maxMana)
|
||||
if(unit ~= 'player') then return end
|
||||
|
||||
local element = self.DruidAltMana
|
||||
if(element.PreUpdate) then element:PreUpdate(unit) end
|
||||
|
||||
local cur, max = currMana, maxMana
|
||||
if not (cur and max) then
|
||||
cur, max = LDM:GetCurrentMana(), LDM:GetMaximumMana()
|
||||
end
|
||||
|
||||
element:SetMinMaxValues(0, max)
|
||||
element:SetValue(cur)
|
||||
|
||||
element:UpdateColor(cur, max)
|
||||
|
||||
if(element.PostUpdate) then
|
||||
return element:PostUpdate(unit, cur, max, event)
|
||||
end
|
||||
end
|
||||
|
||||
local function Path(self, ...)
|
||||
return (self.DruidAltMana.Override or Update) (self, unpack(arg))
|
||||
end
|
||||
|
||||
local function ElementEnable(self)
|
||||
self:RegisterEvent("UNIT_MANA", Path)
|
||||
self:RegisterEvent("UNIT_MAXMANA", Path)
|
||||
|
||||
self.DruidAltMana:Show()
|
||||
|
||||
if self.DruidAltMana.PostUpdateVisibility then
|
||||
self.DruidAltMana:PostUpdateVisibility(true, not self.DruidAltMana.isEnabled)
|
||||
end
|
||||
|
||||
self.DruidAltMana.isEnabled = true
|
||||
|
||||
Path(self, 'ElementEnable', 'player', UnitPowerType("player", 0))
|
||||
end
|
||||
|
||||
local function ElementDisable(self)
|
||||
self:UnregisterEvent("UNIT_MANA", Path)
|
||||
self:UnregisterEvent("UNIT_MAXMANA", Path)
|
||||
|
||||
self.DruidAltMana:Hide()
|
||||
|
||||
if self.DruidAltMana.PostUpdateVisibility then
|
||||
self.DruidAltMana:PostUpdateVisibility(false, self.DruidAltMana.isEnabled)
|
||||
end
|
||||
|
||||
self.DruidAltMana.isEnabled = nil
|
||||
|
||||
Path(self, 'ElementDisable', 'player', UnitPowerType("player", 0))
|
||||
end
|
||||
|
||||
local function Visibility(self, event, unit)
|
||||
local shouldEnable
|
||||
|
||||
if UnitPowerType("player") ~= 0 then
|
||||
shouldEnable = true
|
||||
end
|
||||
|
||||
if(shouldEnable) then
|
||||
ElementEnable(self)
|
||||
else
|
||||
ElementDisable(self)
|
||||
end
|
||||
end
|
||||
|
||||
local function VisibilityPath(self, ...)
|
||||
return (self.DruidAltMana.OverrideVisibility or Visibility) (self, unpack(arg))
|
||||
end
|
||||
|
||||
local function ForceUpdate(element)
|
||||
return VisibilityPath(element.__owner, 'ForceUpdate', element.__owner.unit)
|
||||
end
|
||||
|
||||
local function Enable(self, unit)
|
||||
local element = self.DruidAltMana
|
||||
if(element and unit == 'player') then
|
||||
element.__owner = self
|
||||
element.ForceUpdate = ForceUpdate
|
||||
|
||||
LDM:AddListener(function(currMana, maxMana)
|
||||
Update(self, "Listener", "player", currMana, maxMana)
|
||||
end, "oUF_DruidMana")
|
||||
|
||||
self:RegisterEvent('PLAYER_LOGIN', VisibilityPath) -- need?
|
||||
self:RegisterEvent('PLAYER_ENTERING_WORLD', VisibilityPath)
|
||||
self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath) -- need?
|
||||
self:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
|
||||
|
||||
if(element:IsObjectType('StatusBar') and not element:GetStatusBarTexture()) then
|
||||
element:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
|
||||
end
|
||||
|
||||
if(not element.UpdateColor) then
|
||||
element.UpdateColor = UpdateColor
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local function Disable(self)
|
||||
local element = self.DruidAltMana
|
||||
if(element) then
|
||||
ElementDisable(self)
|
||||
LDM:RemoveListener("oUF_DruidMana")
|
||||
|
||||
self:UnregisterEvent('PLAYER_LOGIN', VisibilityPath) -- need?
|
||||
self:UnregisterEvent('PLAYER_ENTERING_WORLD', VisibilityPath)
|
||||
self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath) -- need?
|
||||
self:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
|
||||
end
|
||||
end
|
||||
|
||||
oUF:AddElement("DruidAltMana", VisibilityPath, Enable, Disable)
|
||||
@@ -0,0 +1,4 @@
|
||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||
<Include file="LibDruidMana-1.0\LibDruidMana-1.0.xml"/>
|
||||
<Script file="oUF_DruidMana.lua"/>
|
||||
</Ui>
|
||||
Reference in New Issue
Block a user