You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1481 lines
59 KiB

local Plater = _G.Plater
local GameCooltip = GameCooltip2
local DF = DetailsFramework
local _
local UnitPower = _G.UnitPower
local UnitPowerMax = _G.UnitPowerMax
local abs = _G.abs
local IS_WOW_PROJECT_MAINLINE = WOW_PROJECT_ID == WOW_PROJECT_MAINLINE
local IS_WOW_PROJECT_NOT_MAINLINE = WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE
4 years ago
local IS_WOW_PROJECT_CLASSIC_ERA = WOW_PROJECT_ID == WOW_PROJECT_CLASSIC
3 years ago
local IS_WOW_PROJECT_CLASSIC_WRATH = IS_WOW_PROJECT_NOT_MAINLINE and ClassicExpansionAtLeast and LE_EXPANSION_WRATH_OF_THE_LICH_KING and ClassicExpansionAtLeast(LE_EXPANSION_WRATH_OF_THE_LICH_KING)
--local IS_WOW_PROJECT_CLASSIC_CATACLYSM = IS_WOW_PROJECT_NOT_MAINLINE and ClassicExpansionAtLeast and LE_EXPANSION_CATACLYSM and ClassicExpansionAtLeast(LE_EXPANSION_CATACLYSM)
4 years ago
local PlayerClass = select(2, UnitClass("player"))
4 years ago
local CONST_SPECID_MONK_WINDWALKER = 269
local CONST_SPECID_MAGE_ARCANE = 62
local CONST_SPECID_ROGUE_ASSASSINATION = 259
local CONST_SPECID_ROGUE_OUTLAW = 260
local CONST_SPECID_ROGUE_SUBTLETY = 261
local CONST_SPECID_DRUID_FERAL = 103
local CONST_SPECID_PALADIN_HOLY = 65
local CONST_SPECID_PALADIN_PROTECTION = 66
local CONST_SPECID_PALADIN_RETRIBUTION = 70
local CONST_SPECID_WARLOCK_AFFLICTION = 265
local CONST_SPECID_WARLOCK_DEMONOLOGY = 266
local CONST_SPECID_WARLOCK_DESTRUCTION = 267
local CONST_SPECID_DK_UNHOLY = 252
local CONST_SPECID_DK_FROST = 251
local CONST_SPECID_DK_BLOOD = 250
3 years ago
local CONST_SPECID_EVOKER_DEVASTATION = 1467
local CONST_SPECID_EVOKER_PRESERVATION = 1468
local CONST_SPECID_EVOKER_AUGMENTATION = 1473
4 years ago
local CONST_NUM_RESOURCES_WIDGETS = PlayerClass == "DEATHKNIGHT" and 6 or 10
4 years ago
local CONST_WIDGET_WIDTH = 20
local CONST_WIDGET_HEIGHT = 20
--store the time of the last combo point gained in order to play the show animation when a combo point is awarded
local lastComboPointGainedTime = 0
--when 'runOnNextFrame' is used instead of 'C_Timer.After', it's to indicate the func will skip the current frame and run on the next one
4 years ago
local runOnNextFrame = function(func)
_G.C_Timer.After(0, func)
end
--[=[
resource frame: the frame which is anchored into the health bar, controls the size, scale and position
resource bar: is anchored (setallpoints) into the resource frame, hold all combo points textures and animations
widget: is each individual widget representing a single resource
default settings:
alignment settings
resource_padding = 1,
size settings:
block_size = 20,
block_texture_background = "Interface\\COMMON\\Indicator-Gray"
block_texture_artwork = "Interface\\COMMON\\Indicator-Yellow"
block_texture_overlay = "Interface\\CHARACTERFRAME\\TempPortraitAlphaMaskSmall"
--]=]
4 years ago
--this table store the resource creation functions, these functions are declared in the Plater_Resources_Frames file
local resourceWidgetCreationFunctions = {}
function Plater.Resources.GetResourceWidgetCreationTable()
return resourceWidgetCreationFunctions
4 years ago
end
4 years ago
function Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(specId)
--function to create the resource bar
return resourceWidgetCreationFunctions[specId]
4 years ago
end
4 years ago
--store functions to create the widgets for the class and the function to update them
local resourceWidgetsFunctions = {} --this table has created when only monk combo point was finished, perhaps in the future this need to be more organized
4 years ago
--store functions used to create the resource bar for each type of resource
local resourceBarCreateFuncByEnumName = {}
--power
4 years ago
local PowerEnum = Enum.PowerType
local SPELL_POWER_MANA = SPELL_POWER_MANA or (PowerEnum and PowerEnum.Mana) or 0
local SPELL_POWER_RAGE = SPELL_POWER_RAGE or (PowerEnum and PowerEnum.Rage) or 1
local SPELL_POWER_FOCUS = SPELL_POWER_FOCUS or (PowerEnum and PowerEnum.Focus) or 2
local SPELL_POWER_ENERGY = SPELL_POWER_ENERGY or (PowerEnum and PowerEnum.Energy) or 3
4 years ago
local SPELL_POWER_COMBO_POINTS = SPELL_POWER_COMBO_POINTS or (PowerEnum and PowerEnum.ComboPoints) or 4
local SPELL_POWER_RUNES = SPELL_POWER_RUNES or (PowerEnum and PowerEnum.Runes) or 5
local SPELL_POWER_RUNIC_POWER = SPELL_POWER_RUNIC_POWER or (PowerEnum and PowerEnum.RunicPower) or 6
local SPELL_POWER_SOUL_SHARDS = SPELL_POWER_SOUL_SHARDS or (PowerEnum and PowerEnum.SoulShards) or 7
local SPELL_POWER_LUNAR_POWER = SPELL_POWER_LUNAR_POWER or (PowerEnum and PowerEnum.LunarPower) or 8
local SPELL_POWER_HOLY_POWER = SPELL_POWER_HOLY_POWER or (PowerEnum and PowerEnum.HolyPower) or 9
local SPELL_POWER_ALTERNATE_POWER = SPELL_POWER_ALTERNATE_POWER or (PowerEnum and PowerEnum.Alternate) or 10
local SPELL_POWER_MAELSTROM = SPELL_POWER_MAELSTROM or (PowerEnum and PowerEnum.Maelstrom) or 11
local SPELL_POWER_CHI = SPELL_POWER_CHI or (PowerEnum and PowerEnum.Chi) or 12
local SPELL_POWER_INSANITY = SPELL_POWER_INSANITY or (PowerEnum and PowerEnum.Insanity) or 13
local SPELL_POWER_OBSOLETE = SPELL_POWER_OBSOLETE or (PowerEnum and PowerEnum.Obsolete) or 14
local SPELL_POWER_OBSOLETE2 = SPELL_POWER_OBSOLETE2 or (PowerEnum and PowerEnum.Obsolete2) or 15
local SPELL_POWER_ARCANE_CHARGES = SPELL_POWER_ARCANE_CHARGES or (PowerEnum and PowerEnum.ArcaneCharges) or 16
local SPELL_POWER_FURY = SPELL_POWER_FURY or (PowerEnum and PowerEnum.Fury) or 17
local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 18
3 years ago
local SPELL_POWER_ESSENCE = SPELL_POWER_ESSENCE or (PowerEnum and PowerEnum.Essence) or 19
4 years ago
local specsWithResource = {
[CONST_SPECID_MONK_WINDWALKER] = true,
[CONST_SPECID_MAGE_ARCANE] = true,
[CONST_SPECID_ROGUE_ASSASSINATION] = true,
[CONST_SPECID_ROGUE_OUTLAW] = true,
[CONST_SPECID_ROGUE_SUBTLETY] = true,
[CONST_SPECID_DRUID_FERAL] = true,
[CONST_SPECID_PALADIN_HOLY] = true,
[CONST_SPECID_PALADIN_PROTECTION] = true,
[CONST_SPECID_PALADIN_RETRIBUTION] = true,
[CONST_SPECID_WARLOCK_AFFLICTION] = true,
[CONST_SPECID_WARLOCK_DEMONOLOGY] = true,
[CONST_SPECID_WARLOCK_DESTRUCTION] = true,
[CONST_SPECID_DK_UNHOLY] = true,
[CONST_SPECID_DK_FROST] = true,
[CONST_SPECID_DK_BLOOD] = true,
[CONST_SPECID_EVOKER_DEVASTATION] = true,
[CONST_SPECID_EVOKER_PRESERVATION] = true,
[CONST_SPECID_EVOKER_AUGMENTATION] = true,
4 years ago
}
local resourceTypes = {
[SPELL_POWER_INSANITY] = true, --shadow priest
[SPELL_POWER_CHI] = true, --monk
[SPELL_POWER_HOLY_POWER] = true, --paladins
[SPELL_POWER_LUNAR_POWER] = true, --balance druids
[SPELL_POWER_SOUL_SHARDS] = true, --warlock affliction
[SPELL_POWER_COMBO_POINTS] = true, --combo points
[SPELL_POWER_MAELSTROM] = true, --shamans
[SPELL_POWER_PAIN] = true, --demonhunter tank
[SPELL_POWER_RUNES] = true, --dk
[SPELL_POWER_ARCANE_CHARGES] = true, --mage
[SPELL_POWER_FURY] = true, --warrior demonhunter dps
[SPELL_POWER_ESSENCE] = true, --evoker
}
local energyTypes = {
[SPELL_POWER_MANA] = true,
[SPELL_POWER_RAGE] = true,
[SPELL_POWER_ENERGY] = true,
[SPELL_POWER_RUNIC_POWER] = true,
[SPELL_POWER_ESSENCE] = true,
}
local resourcePowerType = {
[SPELL_POWER_COMBO_POINTS] = SPELL_POWER_ENERGY, --combo points
[SPELL_POWER_SOUL_SHARDS] = SPELL_POWER_MANA, --warlock
[SPELL_POWER_LUNAR_POWER] = SPELL_POWER_MANA, --druid
[SPELL_POWER_HOLY_POWER] = SPELL_POWER_MANA, --paladin
[SPELL_POWER_INSANITY] = SPELL_POWER_MANA, --shadowpriest
[SPELL_POWER_MAELSTROM] = SPELL_POWER_MANA, --shaman
[SPELL_POWER_CHI] = SPELL_POWER_MANA, --monk
[SPELL_POWER_PAIN] = SPELL_POWER_ENERGY, --demonhuinter
[SPELL_POWER_RUNES] = SPELL_POWER_RUNIC_POWER, --dk
[SPELL_POWER_ARCANE_CHARGES] = SPELL_POWER_MANA, --mage
[SPELL_POWER_FURY] = SPELL_POWER_RAGE, --warrior
[SPELL_POWER_ESSENCE] = SPELL_POWER_MANA, --evoker
}
4 years ago
-- the power types which update functions should update on
local classPowerTypes = {
["ROGUE"] = "COMBO_POINTS",
["MONK"] = "CHI",
["PALADIN"] = "HOLY_POWER",
["WARLOCK"] = "SOUL_SHARDS",
["DRUID"] = "COMBO_POINTS",
["MAGE"] = "ARCANE_CHARGES",
["DEATHKNIGHT"] = "RUNES",
["EVOKER"] = "ESSENCE",
4 years ago
}
local doesClassUseResource = function(class)
return classPowerTypes[class]
4 years ago
end
local doesSpecUseResource = function(specId)
return specsWithResource[specId]
4 years ago
end
--these power types can active a combo point function
local powerTypesFilter = {
["COMBO_POINTS"] = true,
["CHI"] = true,
["HOLY_POWER"] = true,
["SOUL_SHARDS"] = true,
["ARCANE_CHARGES"] = true,
["RUNES"] = true,
["ESSENCE"] = true,
4 years ago
}
local eventsFilter = {
["UNIT_POWER_POINT_CHARGE"] = true,
["RUNE_POWER_UPDATE"] = true,
["RUNE_TYPE_UPDATE"] = IS_WOW_PROJECT_NOT_MAINLINE,
["UPDATE_SHAPESHIFT_FORM"] = true,
}
4 years ago
local CONST_ENUMNAME_COMBOPOINT = "ComboPoints"
local CONST_ENUMNAME_HOLYPOWER = "HolyPower"
local CONST_ENUMNAME_RUNES = "Runes"
local CONST_ENUMNAME_ARCANECHARGES = "ArcaneCharges"
local CONST_ENUMNAME_CHI = "Chi"
local CONST_ENUMNAME_SOULCHARGES = "SoulShards"
3 years ago
local CONST_ENUMNAME_ESSENCE = "Essence"
4 years ago
--cache
local DB_USE_PLATER_RESOURCE_BAR = false
local DB_PLATER_RESOURCE_BAR_ON_PERSONAL = false
local DB_PLATER_RESOURCE_BAR_ANCHOR
--local DB_PLATER_RESOURCE_BAR_HEIGHT
local DB_PLATER_RESOURCE_BAR_SCALE
local DB_PLATER_RESOURCE_PADDING
local DB_PLATER_RESOURCE_GROW_DIRECTON
4 years ago
local DB_PLATER_RESOURCE_SHOW_DEPLETED
local DB_PLATER_RESOURCE_SHOW_NUMBER
4 years ago
local getPlateFrameForResourceFrame = function()
local plateFrame = nil
if (not DB_USE_PLATER_RESOURCE_BAR) then
-- do nothing
4 years ago
elseif (not DB_PLATER_RESOURCE_BAR_ON_PERSONAL or IS_WOW_PROJECT_NOT_MAINLINE) then
--target nameplate
plateFrame = C_NamePlate.GetNamePlateForUnit("target")
4 years ago
elseif (IS_WOW_PROJECT_MAINLINE) then
--personal bar
plateFrame = C_NamePlate.GetNamePlateForUnit("player")
end
4 years ago
return plateFrame
4 years ago
end
4 years ago
--Plater.Resources
--when plater in the main file refreshes its upvalues, this function is also called
--called from plater.lua on Plater.RefreshDBUpvalues()
function Plater.Resources.RefreshResourcesDBUpvalues()
local profile = Plater.db.profile
--resourceGlobalSettings: where options for all resources are stored
local resourceGlobalSettings = profile.resources_settings.global_settings
DB_USE_PLATER_RESOURCE_BAR = resourceGlobalSettings.show
DB_PLATER_RESOURCE_BAR_ON_PERSONAL = resourceGlobalSettings.personal_bar
DB_PLATER_RESOURCE_BAR_ANCHOR = resourceGlobalSettings.anchor
--DB_PLATER_RESOURCE_BAR_HEIGHT = resourceGlobalSettings.width
DB_PLATER_RESOURCE_BAR_SCALE = resourceGlobalSettings.scale
DB_PLATER_RESOURCE_PADDING = resourceGlobalSettings.padding
DB_PLATER_RESOURCE_GROW_DIRECTON = resourceGlobalSettings.grow_direction
DB_PLATER_RESOURCE_SHOW_DEPLETED = resourceGlobalSettings.show_depleted
DB_PLATER_RESOURCE_SHOW_NUMBER = resourceGlobalSettings.show_number
--check if the frame exists if the player opt-in to use plater resources
if (DB_USE_PLATER_RESOURCE_BAR) then
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (not mainResourceFrame) then
C_Timer.After(0, function()
--create on next frame
Plater.Resources.CreateMainResourceFrame()
Plater.Resources.UpdateResourceFrameToUse()
Plater.Resources.UpdateResourceFramePosition()
end)
else
Plater.Resources.CreateMainResourceFrame()
Plater.Resources.UpdateResourceFrameToUse()
Plater.Resources.UpdateResourceFramePosition()
local resourceBar = Plater.Resources.GetResourceBarInUse()
--characters without resources to show may not have a resource bar created for them
if (not resourceBar) then
return
end
--amount of resources the player has now
local currentResources = PlayerClass == "DEATHKNIGHT" and 6 or UnitPower("player", Plater.Resources.playerResourceId)
--resources amount got updated?
if (currentResources) then
--which update method to use
if (DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResources_WithDepleted(resourceBar, currentResources)
else
Plater.Resources.UpdateResources_NoDepleted(resourceBar, currentResources)
end
end
--update the resource bar
Plater.Resources.UpdateResourceBar(nil, resourceBar)
end
else
--player opt-out of using plater resources on this character
Plater.Resources.HidePlaterResourceFrame()
end
end
4 years ago
--base frame for the class or spec resource bar, it's a child of the main resource frame 'PlaterNameplatesResourceFrame'
--the function passed is responsible to build textures and animations
local createResourceBar = function(parent, frameName, func, widgetWidth, widgetHeight)
local resourceBar = CreateFrame("frame", frameName, parent)
resourceBar:EnableMouse(false)
resourceBar:EnableMouseWheel(false)
--store all widgets
resourceBar.widgets = {}
--store all background textures (created on plater_resources_frames), this texture is the default texture shown when the combo point isn't active
resourceBar.widgetsBackground = {}
--create widgets which are frames holding textures and animations
if (func) then
for i = 1, CONST_NUM_RESOURCES_WIDGETS do
local newWidget = func(resourceBar, "$parentCPO" .. i)
resourceBar.widgets[#resourceBar.widgets + 1] = newWidget
newWidget:EnableMouse(false)
newWidget:EnableMouseWheel(false)
newWidget:SetSize(widgetWidth or CONST_WIDGET_WIDTH, widgetHeight or CONST_WIDGET_HEIGHT)
newWidget:Hide()
local CPOID = DF:CreateLabel(newWidget, i, 12, "white", nil, nil, nil, "overlay")
CPOID:SetPoint("bottom", newWidget, "top", 0, 5)
CPOID:Hide()
newWidget.numberId = CPOID
end
end
return resourceBar
end
local function updateWotLKDKRuneTextures(resourceBar)
if IS_WOW_PROJECT_NOT_MAINLINE then
--wrath classic
local RUNETYPE_BLOOD = 1
local RUNETYPE_FROST = 2
local RUNETYPE_UNHOLY = 3
local RUNETYPE_DEATH = 4
local iconTextures = {}
iconTextures[RUNETYPE_BLOOD] = "Interface\\PlayerFrame\\UI-PlayerFrame-Deathknight-Blood"
iconTextures[RUNETYPE_FROST] = "Interface\\PlayerFrame\\UI-PlayerFrame-Deathknight-Frost"
iconTextures[RUNETYPE_UNHOLY] = "Interface\\PlayerFrame\\UI-PlayerFrame-Deathknight-Unholy"
iconTextures[RUNETYPE_DEATH] = "Interface\\PlayerFrame\\UI-PlayerFrame-Deathknight-Death"
for i =1, #resourceBar.widgets do
local runeType = GetRuneType(i)
resourceBar.widgets[i].texture:SetTexture(iconTextures[runeType])
resourceBar.widgets[i].texture:Show()
end
end
end
4 years ago
--> functions for class and specs resources
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_CHI] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_MONK_WINDWALKER)
local newResourceBar = createResourceBar(mainResourceFrame, "$parentMonk2Resource", resourceWidgetCreationFunc) --windwalker chi
mainResourceFrame.resourceBars[CONST_SPECID_MONK_WINDWALKER] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_CHI
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnResourceChanged
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_CHI] = newResourceBar
return newResourceBar
end
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_ARCANECHARGES] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_MAGE_ARCANE)
local newResourceBar = createResourceBar(mainResourceFrame, "$parentArcaneMageResource", resourceWidgetCreationFunc)
mainResourceFrame.resourceBars[CONST_SPECID_MAGE_ARCANE] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_ARCANE_CHARGES
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnResourceChanged
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_ARCANECHARGES] = newResourceBar
return newResourceBar
end
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_COMBOPOINT] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_ROGUE_OUTLAW)
local newResourceBar = createResourceBar(mainResourceFrame, "$parentRogueResource", resourceWidgetCreationFunc, 13, 13)
mainResourceFrame.widgetWidth = 13
mainResourceFrame.widgetHeight = 13
mainResourceFrame.resourceBars[CONST_SPECID_ROGUE_ASSASSINATION] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_ROGUE_OUTLAW] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_ROGUE_SUBTLETY] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_DRUID_FERAL] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_COMBO_POINTS
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnComboPointsChanged
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_COMBOPOINT] = newResourceBar
return newResourceBar
end
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_SOULCHARGES] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_WARLOCK_AFFLICTION)
local newResourceBar = createResourceBar(mainResourceFrame, "$parentWarlockResource", resourceWidgetCreationFunc, 17, 22)
mainResourceFrame.widgetWidth = 17
mainResourceFrame.widgetHeight = 22
mainResourceFrame.resourceBars[CONST_SPECID_WARLOCK_AFFLICTION] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_WARLOCK_DEMONOLOGY] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_WARLOCK_DESTRUCTION] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_SOUL_SHARDS
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnSoulChardsChanged
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_SOULCHARGES] = newResourceBar
return newResourceBar
end
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_HOLYPOWER] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_PALADIN_RETRIBUTION)
local newResourceBar = createResourceBar(mainResourceFrame, "$parentPaladinResource", resourceWidgetCreationFunc, 25, 19)
mainResourceFrame.widgetWidth = 25
mainResourceFrame.widgetHeight = 19
mainResourceFrame.resourceBars[CONST_SPECID_PALADIN_HOLY] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_PALADIN_PROTECTION] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_PALADIN_RETRIBUTION] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_HOLY_POWER
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnResourceChanged
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_HOLYPOWER] = newResourceBar
return newResourceBar
end
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_RUNES] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_DK_FROST)
mainResourceFrame.widgetWidth = IS_WOW_PROJECT_MAINLINE and 16 or 18--24
3 years ago
mainResourceFrame.widgetHeight = IS_WOW_PROJECT_MAINLINE and 16 or 18--24
local newResourceBar = createResourceBar(mainResourceFrame, "$parentDeathKnightResource", resourceWidgetCreationFunc, mainResourceFrame.widgetWidth, mainResourceFrame.widgetHeight)
mainResourceFrame.resourceBars[CONST_SPECID_DK_UNHOLY] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_DK_FROST] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_DK_BLOOD] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_RUNES
-- for rune sorting
newResourceBar.runeIndexes = {};
for i = 1, #newResourceBar.widgets do
tinsert(newResourceBar.runeIndexes, i);
end
if IS_WOW_PROJECT_MAINLINE then
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnRunesChanged
else
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnRunesChangedWotLK
updateWotLKDKRuneTextures(newResourceBar)
end
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_RUNES] = newResourceBar
return newResourceBar
end
resourceBarCreateFuncByEnumName[CONST_ENUMNAME_ESSENCE] = function(mainResourceFrame)
local resourceWidgetCreationFunc = Plater.Resources.GetCreateResourceWidgetFunctionForSpecId(CONST_SPECID_EVOKER_DEVASTATION)
local newResourceBar = createResourceBar(mainResourceFrame, "$parentEvokerResource", resourceWidgetCreationFunc, 24, 24)
3 years ago
mainResourceFrame.widgetWidth = 24
mainResourceFrame.widgetHeight = 24
mainResourceFrame.resourceBars[CONST_SPECID_EVOKER_DEVASTATION] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_EVOKER_PRESERVATION] = newResourceBar
mainResourceFrame.resourceBars[CONST_SPECID_EVOKER_AUGMENTATION] = newResourceBar
newResourceBar.resourceId = SPELL_POWER_ESSEMCE
newResourceBar.updateResourceFunc = resourceWidgetsFunctions.OnEssenceChanged
tinsert(mainResourceFrame.allResourceBars, newResourceBar)
mainResourceFrame.resourceBarsByEnumName[CONST_ENUMNAME_ESSENCE] = newResourceBar
return newResourceBar
end
4 years ago
--> this funtion is called once at the logon, it initializes the main frame
function Plater.Resources.CreateMainResourceFrame()
if (not DB_USE_PLATER_RESOURCE_BAR) then
--ignore if the settings are off
--return
--nop, can't ignore because must have a main resource frame
end
if (_G.PlaterNameplatesResourceFrame) then
--ignore if the resource frame is already created
return
end
--create the main frame, this frame is the fundation for the resource bar
--this frame is anchored to nameplates to show the amount of resources
local mainResourceFrame = CreateFrame("frame", "PlaterNameplatesResourceFrame", UIParent)
--> create tables to store the resource bars created
--store the resources bars by class or spec (hash table with class name or spec e.g. resourceBars[73] = resourceBar)
mainResourceFrame.resourceBars = {}
--store all resource bars created (index table)
mainResourceFrame.allResourceBars = {}
--store the resource bar by its _G.Enum.PowerType name (hash table where the key is a string from _G.Enum.PowerType), e.g. resourceBarsByEnum["HolyPower"] = resourceBar
mainResourceFrame.resourceBarsByEnumName = {}
--set the OnEvent function
mainResourceFrame:SetScript("OnEvent", function(self, event, unit, powerType, ...)
--if (event == "UPDATE_SHAPESHIFT_FORM") then
--it's guarantee to trigger only on druids
--else
--get the current shown resource bar, then get its update func and call it passing the mainResourceFrame as #1 and the resourceBar itself as #2 argument
local currentResourceBar = self.currentResourceBarShown
if (currentResourceBar) then
local updateResourceFunc = currentResourceBar.updateResourceFunc
if (updateResourceFunc) then
--check if the power type passes the filter
if (powerTypesFilter[powerType] or eventsFilter[event]) then
lastComboPointGainedTime = GetTime()
Plater.StartLogPerformanceCore("Plater-Resources", "Events", event)
updateResourceFunc(self, currentResourceBar, false, event, unit, powerType)
Plater.EndLogPerformanceCore("Plater-Resources", "Events", event)
end
end
end
--end
end)
--get/create the resource frame set in the options panel
Plater.Resources.UpdateResourceFrameToUse()
end
--this function get the value set by the player in the options panel and create a resource bar for what the player selected
--for instance, players could select to use paladin style combo points on the rogues
function Plater.Resources.UpdateResourceFrameToUse()
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (not mainResourceFrame) then
Plater.Resources.CreateMainResourceFrame()
mainResourceFrame = Plater.Resources.GetMainResourceFrame()
end
--grab the player class
local playerClass = PlayerClass or select(2, UnitClass("player"))
4 years ago
--the resourceId to query the amount of resources the player has
Plater.Resources.playerResourceId = Plater.Resources.GetResourceIdForPlayer()
if (IS_WOW_PROJECT_NOT_MAINLINE) then --classic
if (playerClass == "ROGUE" or playerClass == "DRUID") then
local classResourceFunc = resourceBarCreateFuncByEnumName[CONST_ENUMNAME_COMBOPOINT]
if (classResourceFunc) then
local resourceBar = classResourceFunc(mainResourceFrame)
4 years ago
mainResourceFrame.currentResourceBarShown = resourceBar
Plater.Resources.UpdateResourceBar(nil, resourceBar)
return resourceBar
end
elseif (playerClass == "DEATHKNIGHT") then
local classResourceFunc = resourceBarCreateFuncByEnumName[CONST_ENUMNAME_RUNES]
if (classResourceFunc) then
local resourceBar = classResourceFunc(mainResourceFrame)
3 years ago
mainResourceFrame.currentResourceBarShown = resourceBar
Plater.Resources.UpdateResourceBar(nil, resourceBar)
return resourceBar
end
end
else
--return if there's no resource for this character
if (not Plater.Resources.playerResourceId) then
return
end
--get the resource to use on this character, players can change which resource model to use in the options panel
local resourceEnumName = Plater.Resources.GetResourceEnumNameForPlayer()
--if no enum name, this class does not use a resource bar
if (not resourceEnumName) then
return
end
--hide all resource bars already created
for _, thisResourceBar in pairs(mainResourceFrame.resourceBarsByEnumName) do
thisResourceBar:Hide()
end
--get the resource bar
local resourceBar = mainResourceFrame.resourceBarsByEnumName[resourceEnumName]
--if the resource bar isn't yet created, create now
if (not resourceBar) then
local createResourceBarFunc = resourceBarCreateFuncByEnumName[resourceEnumName]
if (createResourceBarFunc) then
resourceBar = createResourceBarFunc(mainResourceFrame)
end
end
mainResourceFrame.currentResourceBarShown = resourceBar
Plater.Resources.UpdateResourceBar(nil, resourceBar)
return resourceBar
end
end
function Plater.Resources.GetMainResourceFrame()
local mainResourceFrame = _G.PlaterNameplatesResourceFrame
if (mainResourceFrame) then
return mainResourceFrame
else
Plater.Resources.CreateMainResourceFrame()
mainResourceFrame = _G.PlaterNameplatesResourceFrame
return mainResourceFrame
end
end
function Plater.Resources.GetResourceBarInUse()
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (mainResourceFrame) then
return mainResourceFrame.currentResourceBarShown
end
end
function Plater.Resources.EnableEvents()
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (not mainResourceFrame or mainResourceFrame.eventsEnabled) then
return
end
mainResourceFrame:RegisterUnitEvent("UNIT_POWER_FREQUENT", "player")
mainResourceFrame:RegisterUnitEvent("UNIT_MAXPOWER", "player")
if (IS_WOW_PROJECT_MAINLINE and (PlayerClass == "ROGUE" or PlayerClass == "EVOKER")) then
mainResourceFrame:RegisterUnitEvent("UNIT_POWER_POINT_CHARGE", "player")
end
if (PlayerClass == "DRUID") then
mainResourceFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
end
if (PlayerClass == "DEATHKNIGHT") then
mainResourceFrame:RegisterEvent("RUNE_POWER_UPDATE")
if IS_WOW_PROJECT_NOT_MAINLINE then
mainResourceFrame:RegisterEvent("RUNE_TYPE_UPDATE")
end
end
4 years ago
mainResourceFrame.eventsEnabled = true
mainResourceFrame.currentResourceBarShown.updateResourceFunc(mainResourceFrame, mainResourceFrame.currentResourceBarShown, true)
end
function Plater.Resources.DisableEvents()
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (not mainResourceFrame or not mainResourceFrame.eventsEnabled) then
return
end
mainResourceFrame:UnregisterEvent("UNIT_POWER_FREQUENT")
mainResourceFrame:UnregisterEvent("UNIT_MAXPOWER")
if (IS_WOW_PROJECT_MAINLINE and (PlayerClass == "ROGUE" or PlayerClass == "EVOKER")) then
mainResourceFrame:UnregisterEvent("UNIT_POWER_POINT_CHARGE")
end
if (PlayerClass == "DRUID") then
mainResourceFrame:UnregisterEvent("UPDATE_SHAPESHIFT_FORM")
end
mainResourceFrame.eventsEnabled = false
end
4 years ago
--> called when use plater resource bar is disabled or when no match on rules to show it; only called from inside this file
function Plater.Resources.HidePlaterResourceFrame()
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (mainResourceFrame) then
Plater.Resources.DisableEvents()
mainResourceFrame:Hide()
return
end
end
4 years ago
--> currently is called from:
--player spec change (PLAYER_SPECIALIZATION_CHANGED)
function Plater.Resources.OnSpecChanged()
-- update DK rune visuals:
if PlayerClass == "DEATHKNIGHT" then
local resourceBar = Plater.Resources.GetResourceBarInUse()
if not resourceBar then return end
if IS_WOW_PROJECT_MAINLINE then
local specIndex = GetSpecialization()
for i =1, #resourceBar.widgets do
resourceBar.widgets[i].texture:SetAtlas("DK-"..Plater.Resources.GetRuneKeyBySpec(specIndex).."-Rune-Ready")
resourceBar.widgets[i].cooldown:SetSwipeTexture("Interface\\PlayerFrame\\DK-"..Plater.Resources.GetRuneKeyBySpec(specIndex).."-Rune-CDFill")
resourceBar.widgets[i].cooldown:SetEdgeTexture("Interface\\PlayerFrame\\DK-"..Plater.Resources.GetCDEdgeBySpec(specIndex).."-Rune-CDSpark")
end
else
updateWotLKDKRuneTextures(resourceBar)
end
end
Plater.Resources.CanUsePlaterResourceFrame()
end
--> check if plater settings allow the use of these resources and check if the class and spec has a resource to show
--decides if the resource is shown or not
--TODO: hide/show here?
function Plater.Resources.CanUsePlaterResourceFrame()
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
local retVal = false
--check first if this class has any resource to be used
if (not doesClassUseResource(PlayerClass)) then
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return retVal
end
--nameplate which will have the resource bar
local plateFrame = getPlateFrameForResourceFrame()
if (not plateFrame) then
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return retVal
end
local playerClass = PlayerClass
if (IS_WOW_PROJECT_NOT_MAINLINE) then
if (playerClass == "ROGUE" or playerClass == "DEATHKNIGHT" or (playerClass == "DRUID" and (GetShapeshiftFormID() == 1 or Plater.db.profile.resources_settings.druid_show_always))) then
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return true
end
else
--spec index from 1 to 4 (see specialization frame pressing N ingame), characters below level 10 might have a bigger index
local specIndexSelected = GetSpecialization()
local specId = GetSpecializationInfo(specIndexSelected)
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (specId) then
local doesSpecIdUseResource = doesSpecUseResource(specId)
--player maybe in guardian spec but is using feral form
local isInFeralForm = PlayerClass == "DRUID" and (GetShapeshiftFormID() == 1 or Plater.db.profile.resources_settings.druid_show_always)
if (doesSpecIdUseResource or isInFeralForm) then --TODO: Druid can use it in all specs. stance check needed! (implementing)
--get the resource bar
local resourceBar = Plater.Resources.GetResourceBarInUse()
if (resourceBar) then
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return true
end
else
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return retVal
end
else
--if no specialization, player might be low level
if (UnitLevel("player") < 10) then
--should get by class?
if (playerClass == "ROGUE") then
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return true
end
end
end
end
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "CanUsePlaterResourceFrame")
return retVal
end
4 years ago
--> currently is called from:
--player target has changed, this is called from Plater.lua target changed function
function Plater.Resources.UpdateResourceFramePosition()
Plater.Resources.UpdateMainResourceFrame(getPlateFrameForResourceFrame())
end
--this function receives the nameplate where the resource bar will be attached
function Plater.Resources.UpdateMainResourceFrame(plateFrame)
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "UpdateMainResourceFrame")
--get the main resource frame
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
if (not mainResourceFrame) then
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateMainResourceFrame")
return
end
if (not plateFrame) then
Plater.Resources.HidePlaterResourceFrame()
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateMainResourceFrame")
return
end
4 years ago
if (not Plater.Resources.CanUsePlaterResourceFrame()) then
Plater.Resources.HidePlaterResourceFrame()
4 years ago
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateMainResourceFrame")
return
end
4 years ago
Plater.Resources.EnableEvents()
4 years ago
if (IS_WOW_PROJECT_NOT_MAINLINE) then
local resourceBar = Plater.Resources.GetResourceBarInUse()
Plater.Resources.UpdateResourceBar(plateFrame, resourceBar)
else
local resourceBar = Plater.Resources.GetResourceBarInUse()
Plater.Resources.UpdateResourceBar(plateFrame, resourceBar)
end
--make its parent be the healthBar from the nameplate where it is anchored to
local healthBar = plateFrame.unitFrame.healthBar
mainResourceFrame:SetParent(healthBar)
--update the resource anchor
Plater.SetAnchor(mainResourceFrame, DB_PLATER_RESOURCE_BAR_ANCHOR)
--update the size
mainResourceFrame:SetWidth(healthBar:GetWidth())
mainResourceFrame:SetHeight(2)
mainResourceFrame:SetScale(DB_PLATER_RESOURCE_BAR_SCALE)
mainResourceFrame:SetFrameStrata(healthBar:GetFrameStrata())
mainResourceFrame:SetFrameLevel(healthBar:GetFrameLevel() + 25)
4 years ago
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateMainResourceFrame")
end
4 years ago
--called from 'UpdateMainResourceFrame'
--this funtion receives the nameplate and the bar to show
function Plater.Resources.UpdateResourceBar(plateFrame, resourceBar) --note: plateFrame not in use in this function
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "UpdateResourceBar")
--main resource frame
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
--hide all resourcebar widgets
for i = 1, #resourceBar.widgets do
resourceBar.widgets[i]:Hide()
resourceBar.widgets[i].numberId:SetShown(DB_PLATER_RESOURCE_SHOW_NUMBER) --numberId is a fontstring above the combo point showing the combo point number
end
--check if the bar already shown isn't the bar asking to be shown
if (mainResourceFrame.currentResourceBarShown) then
if (mainResourceFrame.currentResourceBarShown ~= resourceBar) then
mainResourceFrame.currentResourceBarShown:Hide()
end
end
mainResourceFrame.currentResourceBarShown = resourceBar
--show the resource bar
resourceBar:Show()
resourceBar:SetHeight(1)
mainResourceFrame:Show()
-- hide blizzard resources
if DB_USE_PLATER_RESOURCE_BAR then
local resourceFrame = NamePlateDriverFrame and NamePlateDriverFrame.classNamePlateMechanicFrame
if (resourceFrame and not resourceFrame:IsForbidden()) then
resourceFrame:Hide()
end
local alternatePowerFrame = NamePlateDriverFrame and NamePlateDriverFrame.classNamePlateAlternatePowerBar
if (alternatePowerFrame and not alternatePowerFrame:IsForbidden()) then
alternatePowerFrame:Hide()
end
end
if (DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResourcesFor_ShowDepleted(mainResourceFrame, resourceBar)
else
Plater.Resources.UpdateResourcesFor_HideDepleted(mainResourceFrame, resourceBar)
end
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateResourceBar")
end
--update the resources widgets when hiding the resources background for depleted
--on this type, the location of each resource icon is depending on the amount shown
function Plater.Resources.UpdateResourcesFor_HideDepleted(mainResourceFrame, resourceBar)
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "UpdateResourcesFor_HideDepleted")
--get the table with the widgets created
local widgetTable = resourceBar.widgets
--fallback if it is not implemented/created
if (not widgetTable[1]) then
return
end
--store the amount of widgets currently in use - as we are hiding before update: 0
resourceBar.widgetsInUseAmount = 0
--set the amount of resources the player has - 0 before update
resourceBar.lastResourceAmount = 0
for i = 1, CONST_NUM_RESOURCES_WIDGETS do
local thisResourceWidget = widgetTable[i]
thisResourceWidget.inUse = false
thisResourceWidget:Hide()
resourceBar.widgetsBackground[i]:Hide()
end
mainResourceFrame.currentResourceBarShown.updateResourceFunc(mainResourceFrame, mainResourceFrame.currentResourceBarShown, true)
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateResourcesFor_HideDepleted")
end
4 years ago
--update the resources widgets when using the resources showing the background of depleted
--on this type, the location of each resource icon is precomputed
function Plater.Resources.UpdateResourcesFor_ShowDepleted(mainResourceFrame, resourceBar)
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "UpdateResourcesFor_ShowDepleted")
4 years ago
--get the table with the widgets created
local widgetTable = resourceBar.widgets
4 years ago
--fallback if it is not implemented/created
if (not widgetTable[1]) then
return
end
--warning: calling UnitPowerMax with a nil resource id is returning a default resource amount, example in shadow priest which returns max insanity amount
local totalWidgetsShown = PlayerClass == "DEATHKNIGHT" and 6 or UnitPowerMax("player", Plater.Resources.playerResourceId)
--store the amount of widgets currently in use
resourceBar.widgetsInUseAmount = totalWidgetsShown
--set the amount of resources the player has
resourceBar.lastResourceAmount = 0
--get the default size of each widget
local widgetWidth = mainResourceFrame.widgetWidth or CONST_WIDGET_WIDTH
local widgetHeight = mainResourceFrame.widgetHeight or CONST_WIDGET_HEIGHT
--sum of the width of all resources shown
local totalWidth = 0
local isGrowingToLeft = DB_PLATER_RESOURCE_GROW_DIRECTON == "left"
local firstWidgetIndex = 1
local firstWindowPoint = isGrowingToLeft and "right" or "left"
--set the point of the first widget within the resource bar
local firstWidget = widgetTable[firstWidgetIndex]
firstWidget:SetPoint(firstWindowPoint, resourceBar, firstWindowPoint, 0, 0)
local firstWidgetBackground = resourceBar.widgetsBackground[firstWidgetIndex]
firstWidgetBackground:SetSize(widgetWidth, widgetHeight)
firstWidgetBackground:Show()
firstWidgetBackground:ClearAllPoints()
firstWidgetBackground:SetPoint(firstWindowPoint, resourceBar, firstWindowPoint, 0, 0)
for i = 1, totalWidgetsShown do
local thisResourceWidget
local lastResourceWidget
if (isGrowingToLeft and false) then
i = abs(i-(totalWidgetsShown+1))
thisResourceWidget = widgetTable[i]
lastResourceWidget = widgetTable[i+1]
else
thisResourceWidget = widgetTable[i]
lastResourceWidget = widgetTable[i-1]
end
thisResourceWidget:SetSize(widgetWidth, widgetHeight)
if (i ~= firstWidgetIndex) then
--adjust the point of widgets
thisResourceWidget:ClearAllPoints()
if (isGrowingToLeft) then
thisResourceWidget:SetPoint("right", lastResourceWidget, "left", -DB_PLATER_RESOURCE_PADDING, 0)
else
thisResourceWidget:SetPoint("left", lastResourceWidget, "right", DB_PLATER_RESOURCE_PADDING, 0)
end
thisResourceWidget:Hide() -- ensure 'reset'. will be shown through update later, if needed.
local widgetBackground = resourceBar.widgetsBackground[i]
widgetBackground:SetSize(widgetWidth, widgetHeight)
widgetBackground:Show()
--add the spacing into the total width occupied
totalWidth = totalWidth + DB_PLATER_RESOURCE_PADDING
end
totalWidth = totalWidth + widgetWidth
end
for i = totalWidgetsShown+1, CONST_NUM_RESOURCES_WIDGETS do
local thisResourceWidget = widgetTable[i]
thisResourceWidget.inUse = false
thisResourceWidget:Hide()
resourceBar.widgetsBackground[i]:Hide()
end
resourceBar:SetWidth(totalWidth)
resourceBar:SetPoint("center", mainResourceFrame, "center", 0, 0)
--[[
for i = 1, totalWidgetsShown do
local thisResourceWidget = widgetTable[i]
local widgetBackground = resourceBar.widgetsBackground[i]
--print(widgetBackground:GetSize())
--print(widgetBackground:IsShown())
--print(widgetBackground:GetPoint(1))
--print(widgetBackground:GetName())
--print(widgetBackground:GetTexture())
end
]]--
4 years ago
mainResourceFrame.currentResourceBarShown.updateResourceFunc(mainResourceFrame, mainResourceFrame.currentResourceBarShown, true)
4 years ago
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateResourcesFor_ShowDepleted")
end
--realign the combat points after the amount of available combo points change
--this amount isn't the max amount of combo points but the current resources deom UnitPower
function Plater.Resources.UpdateResources_NoDepleted(resourceBar, currentResources)
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "UpdateResources_NoDepleted")
--main resource frame
local mainResourceFrame = Plater.Resources.GetMainResourceFrame()
--get the table with the widgets created to represent the resource points
local widgetTable = resourceBar.widgets
4 years ago
--fallback if it is not implemented/created
if (not widgetTable[1]) then return end
--get the default size of each widget
local widgetWidth = mainResourceFrame.widgetWidth or CONST_WIDGET_WIDTH
local widgetHeight = mainResourceFrame.widgetHeight or CONST_WIDGET_HEIGHT
--sum of the width of all resources shown
local totalWidth = 0
local now = GetTime()
for i = 1, currentResources do
local thisResourceWidget = widgetTable[i]
local lastResourceWidget = widgetTable[i-1]
local thisResouceBackground = resourceBar.widgetsBackground[ i ]
if (not thisResourceWidget.inUse) then
thisResourceWidget:Show()
thisResouceBackground:Show()
thisResourceWidget.inUse = true
if (lastComboPointGainedTime == now) then
thisResourceWidget.ShowAnimation:Play()
end
thisResourceWidget:SetSize (widgetWidth, widgetHeight)
end
thisResourceWidget:ClearAllPoints()
resourceBar.widgetsBackground[i]:ClearAllPoints()
if (not lastResourceWidget) then --this is the first widget, anchor it into the left side of the frame
resourceBar.widgetsBackground[i]:SetPoint("left", resourceBar, "left", 0, 0)
thisResourceWidget:SetPoint("left", resourceBar, "left", 0, 0)
else --no the first anchor into the latest widget
resourceBar.widgetsBackground[i]:SetPoint("left", lastResourceWidget, "right", DB_PLATER_RESOURCE_PADDING, 0)
thisResourceWidget:SetPoint("left", lastResourceWidget, "right", DB_PLATER_RESOURCE_PADDING, 0)
totalWidth = totalWidth + DB_PLATER_RESOURCE_PADDING --add the gap into the total width size
end
lastResourceWidget = thisResourceWidget
totalWidth = totalWidth + widgetWidth
end
--hide non used widgets
for i = currentResources+1, CONST_NUM_RESOURCES_WIDGETS do
local thisResourceWidget = widgetTable[i]
thisResourceWidget.inUse = false
thisResourceWidget:Hide()
resourceBar.widgetsBackground[i]:Hide()
end
resourceBar:SetWidth(totalWidth)
resourceBar:SetPoint(DB_PLATER_RESOURCE_GROW_DIRECTON, mainResourceFrame, DB_PLATER_RESOURCE_GROW_DIRECTON, 0, 0)
--store current resources
resourceBar.widgetsInUseAmount = currentResources
--save the amount of resources
resourceBar.lastResourceAmount = currentResources
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateResources_NoDepleted")
end
function Plater.Resources.UpdateResources_WithDepleted(resourceBar, currentResources)
Plater.StartLogPerformanceCore("Plater-Resources", "Update", "UpdateResources_WithDepleted")
4 years ago
--fallback if it is not implemented/created
if (not resourceBar.widgets[1]) then return end
--calculate how many widgets need to be shown or need to be hide
if (currentResources < resourceBar.lastResourceAmount) then --hide widgets
for i = floor(resourceBar.lastResourceAmount), currentResources+1, -1 do
resourceBar.widgets[i].ShowAnimation:Stop()
resourceBar.widgets[i]:Hide()
end
4 years ago
elseif (currentResources > resourceBar.lastResourceAmount) then --show widgets
for i = floor(resourceBar.lastResourceAmount) + 1, currentResources do
resourceBar.widgets[i]:Show()
if (lastComboPointGainedTime == GetTime()) then
resourceBar.widgets[i].ShowAnimation:Play()
end
end
end
--save the amount of resources
resourceBar.lastResourceAmount = currentResources
Plater.EndLogPerformanceCore("Plater-Resources", "Update", "UpdateResources_WithDepleted")
end
4 years ago
-- CLASS SPECIFIC UPDATE FUNCTIONS
--generic update
function resourceWidgetsFunctions.OnResourceChanged(mainResourceFrame, resourceBar, forcedRefresh, event, unit, powerType)
if (event == "UNIT_MAXPOWER" and DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResourcesFor_ShowDepleted(mainResourceFrame, resourceBar)
forcedRefresh = true
end
--ensure to only update for proper power type or if forced
--powerType showing the Enum name of the power
if (not forcedRefresh and powerType and powerType ~= classPowerTypes[PlayerClass]) then
return
end
--amount of resources the player has now
local currentResources = UnitPower("player", Plater.Resources.playerResourceId)
--resources amount got updated?
if (currentResources == resourceBar.lastResourceAmount and not forcedRefresh) then
return
end
--which update method to use
if (DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResources_WithDepleted(resourceBar, currentResources)
else
Plater.Resources.UpdateResources_NoDepleted(resourceBar, currentResources)
end
end
--rogue/druid CP
function resourceWidgetsFunctions.OnComboPointsChanged(mainResourceFrame, resourceBar, forcedRefresh, event, unit, powerType)
if (event == "UNIT_MAXPOWER" and DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResourcesFor_ShowDepleted(mainResourceFrame, resourceBar)
forcedRefresh = true
end
if IS_WOW_PROJECT_MAINLINE and (event == "UNIT_POWER_POINT_CHARGE" or forcedRefresh) then
4 years ago
--fallback if it is not implemented/created
if (not resourceBar.widgets[1]) then return end
--charges changed
local chargedPowerPoints = GetUnitChargedPowerPoints("player")
--chargedPowerPoints = {[1] = random(1,2), [2] = random(3,5)} --testing
local maxPowerPoints = UnitPowerMax("player", Plater.Resources.playerResourceId)
for i = 1, maxPowerPoints do
local widget = resourceBar.widgets[i]
local isCharged = chargedPowerPoints and tContains(chargedPowerPoints, i)
if (widget.isCharged ~= isCharged) then
widget.isCharged = isCharged
if (isCharged) then
widget.texture:SetAtlas("ComboPoints-ComboPoint-Kyrian")
widget.background:SetAtlas("ComboPoints-PointBg-Kyrian")
widget.ShowAnimation:Play()
else
widget.texture:SetAtlas("ComboPoints-ComboPoint")
widget.background:SetAtlas("ComboPoints-PointBg")
end
end
end
if not forcedRefresh then
return
end
end
-- ensure to only update for proper power type or if forced
if not forcedRefresh and powerType and powerType ~= classPowerTypes[PlayerClass] then
return
end
--amount of resources the player has now
local currentResources
if Plater.PlayerHasTargetNonSelf then
currentResources = GetComboPoints("player", "target")
else
currentResources = UnitPower("player", Plater.Resources.playerResourceId)
end
4 years ago
--resources amount got updated?
if (currentResources == resourceBar.lastResourceAmount and not forcedRefresh) then
return
end
--which update method to use
if (DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResources_WithDepleted(resourceBar, currentResources)
else
Plater.Resources.UpdateResources_NoDepleted(resourceBar, currentResources)
end
end
--DK runes update
local function RuneComparison(runeAIndex, runeBIndex)
local runeAStart, runeADuration, runeARuneReady = GetRuneCooldown(runeAIndex)
local runeBStart, runeBDuration, runeBRuneReady = GetRuneCooldown(runeBIndex)
if (runeARuneReady ~= runeBRuneReady) then
return runeARuneReady;
end
if (runeAStart ~= runeBStart) then
return runeAStart < runeBStart
end
return runeAIndex < runeBIndex
end
function resourceWidgetsFunctions.OnRunesChanged(mainResourceFrame, resourceBar, forcedRefresh, event)
resourceBar.runesOnCooldown = resourceBar.runesOnCooldown or {}
table.sort(resourceBar.runeIndexes, RuneComparison);
for index, runeIndex in ipairs(resourceBar.runeIndexes) do
local runeButton = resourceBar.widgets[index]
runeButton:Show()
local cooldown = runeButton.cooldown
local start, duration, runeReady = GetRuneCooldown(runeIndex)
if not runeReady then
resourceBar.runesOnCooldown[index] = runeIndex
if start and start > 0 then
cooldown:SetAlpha(1)
cooldown:SetCooldown(start, duration)
end
if not DB_PLATER_RESOURCE_SHOW_DEPLETED then
cooldown:SetAlpha(0)
end
runeButton.ShowAnimation:Stop()
--runeButton.texture:SetAlpha(0)
runeButton.texture:Hide()
else
--runeButton.texture:SetAtlas("DK-"..Plater.Resources.GetRuneKeyBySpec(specIndex).."-Rune-Ready")
if (resourceBar.runesOnCooldown[index]) then
local _, _, runeReadyNow = GetRuneCooldown(resourceBar.runesOnCooldown[index])
if (runeReadyNow) then
resourceBar.runesOnCooldown[index] = nil
runeButton.ShowAnimation:Play()
--runeButton.texture:SetAlpha(1)
runeButton.texture:Show()
else
--runeButton.texture:SetAlpha(0)
runeButton.texture:Hide()
end
else
--runeButton.texture:SetAlpha(1)
runeButton.texture:Show()
end
cooldown:SetAlpha(0)
cooldown:Hide()
end
end
end
function resourceWidgetsFunctions.OnRunesChangedWotLK(mainResourceFrame, resourceBar, forcedRefresh, event)
3 years ago
resourceBar.runesOnCooldown = resourceBar.runesOnCooldown or {}
if (event and event == "RUNE_TYPE_UPDATE") then
updateWotLKDKRuneTextures(resourceBar)
return
end
3 years ago
for index = 1, 6 do
local runeButton = resourceBar.widgets[index]
--runeButton.background:Hide()
3 years ago
runeButton:Show()
local cooldown = runeButton.cooldown
local start, duration, runeReady = GetRuneCooldown(index)
if not runeReady then
resourceBar.runesOnCooldown[index] = true
if start then
cooldown:SetAlpha(1)
3 years ago
CooldownFrame_Set(cooldown, start, duration, 1, true);
end
if not DB_PLATER_RESOURCE_SHOW_DEPLETED then
cooldown:SetAlpha(0)
end
runeButton.ShowAnimation:Stop()
runeButton.texture:SetAlpha(0)
3 years ago
else
if (resourceBar.runesOnCooldown[index]) then
local _, _, runeReadyNow = GetRuneCooldown(index)
if (runeReadyNow) then
resourceBar.runesOnCooldown[index] = nil
runeButton.ShowAnimation:Play()
runeButton.texture:SetAlpha(1)
end
else
runeButton.texture:SetAlpha(1)
end
cooldown:SetAlpha(0)
3 years ago
cooldown:Hide()
end
end
end
--WL soul chards
local widthByFillAmount = {
[0] = 0,
[1] = 6,
[2] = 12,
[3] = 14,
[4] = 18,
[5] = 22,
[6] = 22,
[7] = 24,
[8] = 20,
[9] = 18,
[10] = 0,
};
function resourceWidgetsFunctions.OnSoulChardsChanged(mainResourceFrame, resourceBar, forcedRefresh, event, unit, powerType)
if (event == "UNIT_MAXPOWER" and DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResourcesFor_ShowDepleted(mainResourceFrame, resourceBar)
forcedRefresh = true
end
-- ensure to only update for proper power type or if forced
if not forcedRefresh and powerType and powerType ~= classPowerTypes[PlayerClass] then
return
end
--amount of resources the player has now
local shardPower = UnitPower("player", Plater.Resources.playerResourceId, true)
local shardModifier = UnitPowerDisplayMod(Enum.PowerType.SoulShards)
local currentResources = (shardModifier ~= 0) and (shardPower / shardModifier) or 0
-- how to handle partial?
local actualResources = currentResources
local isDestro = GetSpecialization() == SPEC_WARLOCK_DESTRUCTION
if isDestro then
currentResources = math.floor(currentResources) + 1 -- ensure partial is shown
else
currentResources = math.floor(currentResources)
end
4 years ago
--resources amount got updated?
if (currentResources == resourceBar.lastResourceAmount and not forcedRefresh) then
return
end
4 years ago
--which update method to use
if (DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResources_WithDepleted(resourceBar, currentResources)
else
Plater.Resources.UpdateResources_NoDepleted(resourceBar, currentResources)
end
resourceBar.lastResourceAmount = actualResources
for i = 1, resourceBar.widgetsInUseAmount do
local widget = resourceBar.widgets[i]
local fillAmount = Saturate(actualResources - i + 1)
local active = fillAmount >= 1
if active then
widget.texture:Show()
widget.fillBar:SetValue(0)
else
widget.texture:Hide()
widget.fillBar:SetValue(fillAmount)
end
widget.glowtexture:SetShown(fillAmount > 0 and fillAmount < 1)
if (widget.glowtexture:IsShown()) then
local sparkWidthIndex = math.floor(fillAmount * 10)
local fullOffset = widthByFillAmount[sparkWidthIndex]
widget.glowtexture:SetPoint("TOPLEFT", widget.fillBar:GetStatusBarTexture(), "TOP", -(fullOffset/2), 2)
widget.glowtexture:SetPoint("BOTTOMRIGHT", widget.fillBar:GetStatusBarTexture(), "TOP", fullOffset/2, -2)
end
end
end
--Evoker Essence
local FillingAnimationTime = 5.0;
local evokerEssenceOnUpdate = function(self, elapsed)
local pace,interrupted = GetPowerRegenForPowerType(Plater.Resources.playerResourceId)
if (pace == nil or pace == 0) then
pace = 0.2
end
local cooldownDuration = 1 / pace
local animationSpeedMultiplier = FillingAnimationTime / cooldownDuration
self.EssenceFilling.FillingAnim:SetAnimationSpeedMultiplier(animationSpeedMultiplier)
self.EssenceFilling.CircleAnim:SetAnimationSpeedMultiplier(animationSpeedMultiplier)
end
function resourceWidgetsFunctions.OnEssenceChanged(mainResourceFrame, resourceBar, forcedRefresh, event, unit, powerType)
if (event == "UNIT_MAXPOWER" and DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResourcesFor_ShowDepleted(mainResourceFrame, resourceBar)
forcedRefresh = true
end
-- ensure to only update for proper power type or if forced
if not forcedRefresh and powerType and powerType ~= classPowerTypes[PlayerClass] then
return
end
--amount of resources the player has now
local currentResources = UnitPower("player", Plater.Resources.playerResourceId)
local maxResources = UnitPowerMax("player", Plater.Resources.playerResourceId)
local isAtMaxPoints = currentResources == maxResources
local pace, interrupted = GetPowerRegenForPowerType(Plater.Resources.playerResourceId)
if (pace == nil or pace == 0) then
pace = 0.2
end
--resources amount got updated?
if (currentResources == resourceBar.lastResourceAmount and not forcedRefresh) then
--return --this somehow fucks up because UnitPartialPower returns weird shit.
end
--which update method to use
if (DB_PLATER_RESOURCE_SHOW_DEPLETED) then
Plater.Resources.UpdateResources_WithDepleted(resourceBar, currentResources + (isAtMaxPoints and 0 or 1))
else
Plater.Resources.UpdateResources_NoDepleted(resourceBar, currentResources + (isAtMaxPoints and 0 or 1))
end
resourceBar.lastResourceAmount = currentResources
for i = 1, min(currentResources, resourceBar.widgetsInUseAmount) do
local widget = resourceBar.widgets[i]
--widget.EssenceFull:Show()
widget.EssenceFull:Hide()
if not widget.EssenceFillDone:IsShown() then
widget.EssenceFillDone:Show()
widget.EssenceFillDone.AnimInOrig:Play()
end
widget.EssenceFilling.FillingAnim:Stop()
widget.EssenceFilling.CircleAnim:Stop()
widget.EssenceFilling:Hide()
--widget.EssenceFillDone:Show()
widget.EssenceEmpty:Hide()
widget:SetScript("OnUpdate", nil)
widget:Show()
end
for i = currentResources + 2, resourceBar.widgetsInUseAmount do
local widget = resourceBar.widgets[i]
if (widget.EssenceFull:IsShown() or widget.EssenceFilling:IsShown() or widget.EssenceFillDone:IsShown()) then
widget.EssenceDepleting:Show()
if (not widget.EssenceDepleting.AnimIn:IsPlaying()) then
widget.EssenceDepleting.AnimIn:Play()
end
widget.EssenceFilling.FillingAnim:Stop()
widget.EssenceFilling.CircleAnim:Stop()
widget.EssenceFilling:Hide()
widget.EssenceEmpty:Hide()
widget.EssenceFillDone.AnimIn:Stop()
widget.EssenceFillDone:Hide()
widget.EssenceFull:Hide()
end
widget:SetScript("OnUpdate", nil)
widget:Show()
end
local cooldownDuration = 1 / pace
local animationSpeedMultiplier = FillingAnimationTime / cooldownDuration
local widget = resourceBar.widgets[currentResources + 1]
if (not isAtMaxPoints and widget )then --this just fucks up: and not (widget.EssenceFilling.FillingAnim:IsPlaying() or widget.EssenceFull:IsShown())) then
widget.EssenceDepleting.AnimIn:Stop()
widget.EssenceFillDone.AnimIn:Stop()
widget.EssenceFilling:Show()
widget.EssenceDepleting:Hide()
widget.EssenceEmpty:Hide()
widget.EssenceFillDone:Hide()
widget.EssenceFull:Hide()
local partial = UnitPartialPower("player", Plater.Resources.playerResourceId) / 1000.0
if partial == 0 then
partial = 0.001
end
widget.EssenceFilling.FillingAnim:SetAnimationSpeedMultiplier(animationSpeedMultiplier)
widget.EssenceFilling.CircleAnim:SetAnimationSpeedMultiplier(animationSpeedMultiplier)
widget.EssenceFilling.FillingAnim:Restart(false, partial * widget.EssenceFilling.FillingAnim:GetDuration())
widget.EssenceFilling.CircleAnim:Restart(false, partial * widget.EssenceFilling.CircleAnim:GetDuration())
widget:SetScript("OnUpdate", evokerEssenceOnUpdate)
end
end