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.

803 lines
35 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
--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
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: wildcard to reference a texture, fontstring or a frame containing textures and fontstring
--]=]
--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"
--]=]
--[=[
- quando o plater é iniciado, criar um unico frame para o resource que irá pular para a nameplate que é alvo
- quando uma nameplate é mostrada no jogo, confere se o novo resource esta ativo e se ele é mostrado na nameplate alvo e se o jogador tem spec que usa
- quando o alvo é mudado, faz as checagens acima tbm
- se é mostrado na personal bar, apenas adicionar ela
- funcões que serão necessárias:
- criação do frame do resource quando o plater for iniciado (CreateResourceBar)
- precisa mostra o resource em uma nameplate (UpdateResourceBar)
- verifica se a spec que o jogador esta usando possui uma barra de resource
- cache e verificações no codigo do plater
- variaveis que precisam de cache: esta usando o novo resource e se esta usando target (ou no personal bar)
- ao mudar de target > conferir se esta usando o novo resource > conferir se esta usando resource em nameplate > conferir se a namepalte é o alvo
- se a spec do jogador não usar uma barra de resource, por false que o jogador esta usando o novo resource
--]=]
local CONST_NUM_COMBO_POINTS = 10
local CONST_WIDGET_WIDTH = 20
local CONST_WIDGET_HEIGHT = 20
local animationFunctions = {}
--power
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
local SPELL_POWER_COMBO_POINTS2 = 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
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_POINTS2] = 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
}
local energyTypes = {
[SPELL_POWER_MANA] = true,
[SPELL_POWER_RAGE] = true,
[SPELL_POWER_ENERGY] = true,
[SPELL_POWER_RUNIC_POWER] = true,
}
local resourcePowerType = {
[SPELL_POWER_COMBO_POINTS2] = 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
}
--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
local DB_PLATER_RESOURCE_SHOW_DEPLATED
local DB_PLATER_RESOURCE_SHOW_NUMBER
--when plater in the main file refreshes its upvalues, this function is also called
--called from plater.lua on Plater.RefreshDBUpvalues()
function Plater.RefreshResourcesDBUpvalues()
local profile = Plater.db.profile
DB_USE_PLATER_RESOURCE_BAR = profile.plater_resources_show
DB_PLATER_RESOURCE_BAR_ON_PERSONAL = profile.plater_resources_personal_bar
DB_PLATER_RESOURCE_BAR_ANCHOR = profile.plater_resources_anchor
--DB_PLATER_RESOURCE_BAR_HEIGHT = profile.plater_resource_width
DB_PLATER_RESOURCE_BAR_SCALE = profile.plater_resources_scale
DB_PLATER_RESOURCE_PADDING = profile.plater_resources_padding
DB_PLATER_RESOURCE_GROW_DIRECTON = profile.plater_resources_grow_direction
DB_PLATER_RESOURCE_SHOW_DEPLATED = profile.plater_resources_show_depleted
DB_PLATER_RESOURCE_SHOW_NUMBER = profile.plater_resources_show_number
--check if the frame exists if the player opt-in to use plater resources
if (DB_USE_PLATER_RESOURCE_BAR) then
if (not _G.PlaterNameplatesResourceFrame) then
C_Timer.After (2, Plater.CreatePlaterResourceFrame)
end
end
end
--base frame for the class or spec resource bar, it's a child of the main frame called 'PlaterNameplatesResourceFrame'
--the function passed is responsible to build textures and animations
local create_resource_bar = function (parent, frameName, func)
local resourceBar = CreateFrame("frame", frameName, parent)
resourceBar:EnableMouse (false)
resourceBar:EnableMouseWheel (false)
--store all widgets
resourceBar.widgets = {}
--store all background textures
resourceBar.widgetsBackground = {}
--create widgets which are frames holding textures and animations
for i = 1, CONST_NUM_COMBO_POINTS do
local newWidget = func(resourceBar, "$parentCPO" .. i)
resourceBar.widgets [#resourceBar.widgets + 1] = newWidget
newWidget:EnableMouse(false)
newWidget:EnableMouseWheel(false)
newWidget:SetSize(20, 20)
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
return resourceBar
end
--separated resources functions for class and specs
local resource_monk = function(platerResourceFrame)
--platerResourceFrame.resourceBars [268] = create_resource_bar (platerResourceFrame, "$parentMonk1Resource") --brewmaster chi bar
local newResourceBar = create_resource_bar (platerResourceFrame, "$parentMonk2Resource", animationFunctions.CreateMonkComboPoints) --windwalker chi
platerResourceFrame.resourceBars [269] = newResourceBar
tinsert (platerResourceFrame.allResourceBars, newResourceBar)
newResourceBar.resourceId = SPELL_POWER_CHI
newResourceBar.updateResourceFunc = animationFunctions.OnComboPointsChanged
end
--each function create a resource frame for its class or spec
local resource_mage_arcane = function(platerResourceFrame)
local newResourceBar = create_resource_bar (platerResourceFrame, "$parentArcaneResource")
platerResourceFrame.resourceBars [62] = newResourceBar
tinsert (platerResourceFrame.allResourceBars, newResourceBar)
newResourceBar.resourceId = SPELL_POWER_ARCANE_CHARGES
newResourceBar.updateResourceFunc = false
end
local resource_rogue_druid_cpoints = function(platerResourceFrame)
local newResourceBar = create_resource_bar (platerResourceFrame, "$parentRogueResource")
newResourceBar.resourceId = SPELL_POWER_COMBO_POINTS2
tinsert (platerResourceFrame.allResourceBars, newResourceBar)
--rogue
if (Plater.PlayerClass == "DRUID") then
platerResourceFrame.resourceBars ["ROGUE"] = newResourceBar
newResourceBar.classId = "ROGUE"
newResourceBar.updateResourceFunc = false
--druid
elseif (Plater.PlayerClass == "DRUID") then
platerResourceFrame.resourceBars [103] = newResourceBar
newResourceBar.classId = "DRUID"
newResourceBar.updateResourceFunc = false
end
end
local resource_warlock = function(platerResourceFrame)
local newResourceBar = create_resource_bar (platerResourceFrame, "$parentWarlockResource")
platerResourceFrame.resourceBars ["WARLOCK"] = newResourceBar
tinsert (platerResourceFrame.allResourceBars, newResourceBar)
newResourceBar.resourceId = SPELL_POWER_SOUL_SHARDS
newResourceBar.updateResourceFunc = false
newResourceBar.classId = "WARLOCK"
end
local resource_paladin = function(platerResourceFrame)
local newResourceBar = create_resource_bar (platerResourceFrame, "$parentPaladinResource")
platerResourceFrame.resourceBars [70] = newResourceBar
tinsert (platerResourceFrame.allResourceBars, newResourceBar)
newResourceBar.resourceId = SPELL_POWER_HOLY_POWER
newResourceBar.updateResourceFunc = false
newResourceBar.classId = "PALADIN"
end
local resource_dk = function(platerResourceFrame)
local newResourceBar = create_resource_bar (platerResourceFrame, "$parentDKResource")
platerResourceFrame.resourceBars ["DEATHKNIGHT"] = newResourceBar
tinsert (platerResourceFrame.allResourceBars, newResourceBar)
newResourceBar.resourceId = SPELL_POWER_RUNES
newResourceBar.updateResourceFunc = false
newResourceBar.classId = "DEATHKNIGHT"
end
--this funtion is called once at the logon, it'll create the resource frames for the class
function Plater.CreatePlaterResourceFrame()
if (not DB_USE_PLATER_RESOURCE_BAR) then
return
end
if (PlaterNameplatesResourceFrame) then
return
end
--create a frame attached to UIParent, this frame is the fondation for the resource bar
local platerResourceFrame = CreateFrame("frame", "PlaterNameplatesResourceFrame")
--store the resources bars created for the class or spec (hash table)
platerResourceFrame.resourceBars = {}
--store all resource bars created (index table)
platerResourceFrame.allResourceBars = {}
--grab the player class
local playerClass = Plater.PlayerClass
if (IS_WOW_PROJECT_NOT_MAINLINE) then --classic
else
if (playerClass == "MAGE") then
resource_mage_arcane(platerResourceFrame)
elseif (playerClass == "ROGUE" or playerClass == "DRUID") then
resource_rogue_druid_cpoints(platerResourceFrame)
elseif (playerClass == "WARLOCK") then
resource_warlock(platerResourceFrame)
elseif (playerClass == "PALADIN") then
resource_paladin(platerResourceFrame)
elseif (playerClass == "DEATHKNIGHT") then
resource_dk(platerResourceFrame)
elseif (playerClass == "MONK") then
resource_monk(platerResourceFrame)
end
end
--run the function to update the
platerResourceFrame:SetScript ("OnEvent", function(self, event, ...)
self.currentBarShown.updateResourceFunc(self, self.currentBarShown)
end)
end
function Plater.ResourceFrame_EnableEvents()
local platerResourceFrame = _G.PlaterNameplatesResourceFrame
platerResourceFrame:RegisterUnitEvent ("UNIT_POWER_FREQUENT", "player")
platerResourceFrame:RegisterUnitEvent ("UNIT_MAXPOWER", "player")
end
function Plater.ResourceFrame_DisableEvents()
local platerResourceFrame = _G.PlaterNameplatesResourceFrame
platerResourceFrame:UnregisterEvent ("UNIT_POWER_FREQUENT")
platerResourceFrame:UnregisterEvent ("UNIT_MAXPOWER")
end
--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.HidePlaterResourceFrame()
if (PlaterNameplatesResourceFrame) then
Plater.ResourceFrame_DisableEvents()
return PlaterNameplatesResourceFrame:Hide()
end
end
local canUsePlaterResourceFrame = function()
if IS_WOW_PROJECT_NOT_MAINLINE then return end
--nameplate which will have the resource bar
local nameplateAnchor
if (not DB_USE_PLATER_RESOURCE_BAR) then
return Plater.HidePlaterResourceFrame()
elseif (not DB_PLATER_RESOURCE_BAR_ON_PERSONAL) then
--target nameplate
nameplateAnchor = C_NamePlate.GetNamePlateForUnit ("target")
--if the player has no target, this will return nil
if (not nameplateAnchor) then
return Plater.HidePlaterResourceFrame()
end
else
--personal bar
nameplateAnchor = C_NamePlate.GetNamePlateForUnit ("player")
--if the player nameplate does not exists, just quit
if (not nameplateAnchor) then
return Plater.HidePlaterResourceFrame()
end
end
if (IS_WOW_PROJECT_NOT_MAINLINE) then
else
local specIndex = GetSpecializationInfo (GetSpecialization())
if (specIndex) then
local playerClass = Plater.PlayerClass
--check if the resource bar is used by all specs in the player class by comparing it to the class name
local resourceBarByClass = _G.PlaterNameplatesResourceFrame.resourceBars[playerClass]
if (resourceBarByClass) then
resourceBarByClass.resourceClass = playerClass
resourceBarByClass.resourceSpec = false
Plater.ResourceFrame_EnableEvents()
Plater.UpdatePlaterResourceFrame(nameplateAnchor)
return Plater.UpdatePlaterResourceBar(nameplateAnchor, resourceBarByClass)
end
--check if the current player spec uses a resource bar
local resourceBarBySpec = _G.PlaterNameplatesResourceFrame.resourceBars[specIndex]
if (resourceBarBySpec) then
resourceBarBySpec.resourceClass = false
resourceBarBySpec.resourceSpec = specIndex
Plater.ResourceFrame_EnableEvents()
Plater.UpdatePlaterResourceFrame(nameplateAnchor)
return Plater.UpdatePlaterResourceBar(nameplateAnchor, resourceBarBySpec)
end
else
--if no specialization, player might be low level
if (UnitLevel("player") < 10) then
--should get by class?
if (playerClass == "ROGUE") then
Plater.ResourceFrame_EnableEvents()
Plater.UpdatePlaterResourceFrame(nameplateAnchor)
return Plater.UpdatePlaterResourceBar(nameplateAnchor, _G.PlaterNameplatesResourceFrame.resourceBars ["ROGUE"])
end
end
end
end
return Plater.HidePlaterResourceFrame()
end
--currently is called from:
--player spec change (PLAYER_SPECIALIZATION_CHANGED)
--player target has changed
--decides if the resource is shown or not
function Plater.CanUsePlaterResourceFrame()
return runOnNextFrame(canUsePlaterResourceFrame)
end
--called when 'CanUsePlaterResourceFrame' gives green flag to show the resource bar
--this function receives the nameplate where the resource bar will be attached
function Plater.UpdatePlaterResourceFrame(plateFrame)
if IS_WOW_PROJECT_NOT_MAINLINE then return end
--get the main resource frame
local platerResourceFrame = _G.PlaterNameplatesResourceFrame
--make its parent be the healthBar from the nameplate where it is anchored to
platerResourceFrame:SetParent(plateFrame.unitFrame.healthBar)
--update the resource anchor
Plater.SetAnchor(platerResourceFrame, DB_PLATER_RESOURCE_BAR_ANCHOR)
--update the size
local healthBarWidth = plateFrame.unitFrame.healthBar:GetWidth()
platerResourceFrame:SetWidth(healthBarWidth)
platerResourceFrame:SetHeight(2)
platerResourceFrame:SetScale(DB_PLATER_RESOURCE_BAR_SCALE)
end
--called when 'CanUsePlaterResourceFrame' gives green flag to show the resource bar
--this funtion receives the nameplate and the bar to show
function Plater.UpdatePlaterResourceBar(plateFrame, resourceBar)
--main resource frame
local platerResourceFrame = _G.PlaterNameplatesResourceFrame
--hide all resourcebar widgets
for i = 1, #resourceBar.widgets do
resourceBar.widgets[i]:Hide()
resourceBar.widgets[i].numberId:SetShown(DB_PLATER_RESOURCE_SHOW_NUMBER)
end
--check if the bar already shown isn't the bar asking to be shown
if (platerResourceFrame.currentBarShown) then
if (platerResourceFrame.currentBarShown ~= resourceBar) then
platerResourceFrame.currentBarShown:Hide()
end
end
platerResourceFrame.currentBarShown = resourceBar
if (DB_PLATER_RESOURCE_SHOW_NUMBER) then
end
--show the resource bar
resourceBar:Show()
resourceBar:SetHeight(1)
platerResourceFrame:Show()
if (IS_WOW_PROJECT_NOT_MAINLINE) then
else
if (DB_PLATER_RESOURCE_SHOW_DEPLATED) then
Plater.UpdateResourcesFor_ShowDepleted(platerResourceFrame, resourceBar)
end
end
end
--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.UpdateResourcesFor_ShowDepleted(platerResourceFrame, resourceBar)
--get the table with the widgets created to represent monk wind walker chi
local widgetTable = resourceBar.widgets
--get the total of widgets to show
local totalWidgetsShown = UnitPowerMax("player", resourceBar.resourceId)
--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 = CONST_WIDGET_WIDTH
local widgetHeight = CONST_WIDGET_HEIGHT
--sum of the width of all resources shown
local totalWidth = 0
local isGrowingToLeft = DB_PLATER_RESOURCE_GROW_DIRECTON == "left"
local firstWidgetIndex = isGrowingToLeft and totalWidgetsShown or 1
local firstWidgetIndex = 1
local firstWindowPoint = isGrowingToLeft and "right" or "left"
local firstWidget = widgetTable[firstWidgetIndex]
firstWidget:SetPoint(firstWindowPoint, resourceBar, firstWindowPoint, 0, 0)
resourceBar.widgetsBackground[ firstWidgetIndex ]:Show()
resourceBar.widgetsBackground[ firstWidgetIndex ]:ClearAllPoints()
resourceBar.widgetsBackground[ firstWidgetIndex ]: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
resourceBar.widgetsBackground[ i ]:Show()
resourceBar.widgetsBackground[ i ]:ClearAllPoints()
thisResourceWidget:ClearAllPoints()
if (isGrowingToLeft) then
resourceBar.widgetsBackground[ i ]:SetPoint("right", lastResourceWidget, "left", -DB_PLATER_RESOURCE_PADDING, 0)
thisResourceWidget:SetPoint("right", lastResourceWidget, "left", -DB_PLATER_RESOURCE_PADDING, 0)
else
resourceBar.widgetsBackground[ i ]:SetPoint("left", lastResourceWidget, "right", DB_PLATER_RESOURCE_PADDING, 0)
thisResourceWidget:SetPoint("left", lastResourceWidget, "right", DB_PLATER_RESOURCE_PADDING, 0)
end
--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_COMBO_POINTS do
local thisResourceWidget = widgetTable[i]
thisResourceWidget:Hide()
end
resourceBar:SetWidth(totalWidth)
resourceBar:SetPoint("center", platerResourceFrame, "center", 0, 0)
platerResourceFrame.currentBarShown.updateResourceFunc(platerResourceFrame, platerResourceFrame.currentBarShown, true)
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
local updateResources_noDepleted = function(resourceBar, currentResources)
--main resource frame
local platerResourceFrame = _G.PlaterNameplatesResourceFrame
--get the table with the widgets created to represent monk wind walker chi
local widgetTable = resourceBar.widgets
--get the default size of each widget
local widgetWidth = CONST_WIDGET_WIDTH
local widgetHeight = CONST_WIDGET_HEIGHT
--sum of the width of all resources shown
local totalWidth = 0
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
thisResourceWidget.ShowAnimation:Play()
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_COMBO_POINTS 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, platerResourceFrame, DB_PLATER_RESOURCE_GROW_DIRECTON, 0, 0)
--save the amount of resources
resourceBar.lastResourceAmount = currentResources
end
local updateResources_withDepleted = function(resourceBar, currentResources)
--calculate how many widgets need to be shown or need to be hide
if (currentResources < resourceBar.lastResourceAmount) then --hide widgets
for i = resourceBar.lastResourceAmount, currentResources+1, -1 do
resourceBar.widgets[ i ]:Hide()
end
elseif (currentResources > resourceBar.lastResourceAmount) then --show widgets
for i = resourceBar.lastResourceAmount + 1, currentResources do
resourceBar.widgets[ i ]:Show()
resourceBar.widgets[ i ].ShowAnimation:Play()
end
end
--save the amount of resources
resourceBar.lastResourceAmount = currentResources
end
function animationFunctions.OnComboPointsChanged(platerResourceFrame, resourceBar, forcedRefresh)
--amount of resources the player has now
local currentResources = UnitPower("player", resourceBar.resourceId)
--resources amount got updated?
if (currentResources == resourceBar.lastResourceAmount and not forcedRefresh) then
return
end
--which update method to use
if (DB_PLATER_RESOURCE_SHOW_DEPLATED) then
return updateResources_withDepleted(resourceBar, currentResources)
else
return updateResources_noDepleted(resourceBar, currentResources)
end
end
--functions to create the class or spec resources widgets
animationFunctions.CreateMonkComboPoints = function(parent, frameName)
--> create the main frame
local MonkWWComboPoint = CreateFrame ("frame", frameName, parent)
--create background
local Background = parent:CreateTexture (nil, "BORDER")
Background:SetTexture ([[Interface\PLAYERFRAME\MonkUIAtlas]])
Background:SetDrawLayer ("BORDER", 1)
Background:SetPoint ("center", MonkWWComboPoint, "center", 0, 0)
Background:SetSize (CONST_WIDGET_WIDTH, CONST_WIDGET_HEIGHT)
Background:SetVertexColor (0.98431158065796, 0.99215465784073, 0.99999779462814, 0.99999779462814)
Background:SetTexCoord (0.5513224029541, 0.61600479125977, 0.025, 0.1610000038147)
parent.widgetsBackground [ #parent.widgetsBackground + 1 ] = Background
--> single animation group
local MainAnimationGroup = MonkWWComboPoint:CreateAnimationGroup()
MainAnimationGroup:SetLooping ("NONE")
MainAnimationGroup:SetToFinalAlpha(true)
--> widgets:
----------------------------------------------
local BallTexture = MonkWWComboPoint:CreateTexture (nil, "ARTWORK")
BallTexture:SetTexture ([[Interface\PLAYERFRAME\MonkUIAtlas]])
BallTexture:SetDrawLayer ("ARTWORK", 0)
BallTexture:SetPoint ("center", MonkWWComboPoint, "center", 0, 0)
BallTexture:SetSize (CONST_WIDGET_WIDTH * 0.90, CONST_WIDGET_HEIGHT * 0.90)
BallTexture:SetTexCoord (0.6427360534668, 0.70684181213379, 0.02872227191925, 0.15893713951111)
--> animations for BallTexture
BallTexture.scale = MainAnimationGroup:CreateAnimation ("SCALE")
BallTexture.scale:SetTarget (BallTexture)
BallTexture.scale:SetOrder (1)
BallTexture.scale:SetDuration (0.195999994874)
BallTexture.scale:SetFromScale (0, 0)
BallTexture.scale:SetToScale (1, 1)
BallTexture.scale:SetOrigin ("center", 0, 0)
BallTexture.scale = MainAnimationGroup:CreateAnimation ("SCALE")
BallTexture.scale:SetTarget (BallTexture)
BallTexture.scale:SetOrder (2)
BallTexture.scale:SetDuration (0.046000000089407)
BallTexture.scale:SetFromScale (1, 1)
BallTexture.scale:SetToScale (1.1999999284744, 1.1999999284744)
BallTexture.scale:SetOrigin ("center", 0, 0)
BallTexture.scale = MainAnimationGroup:CreateAnimation ("SCALE")
BallTexture.scale:SetTarget (BallTexture)
BallTexture.scale:SetOrder (3)
BallTexture.scale:SetDuration (0.016000000759959)
BallTexture.scale:SetFromScale (1.1999999284744, 1.1999999284744)
BallTexture.scale:SetToScale (1, 1)
BallTexture.scale:SetOrigin ("center", 0, 0)
----------------------------------------------
local UpSpark = MonkWWComboPoint:CreateTexture (nil, "OVERLAY")
UpSpark:SetTexture ([[Interface\QUESTFRAME\ObjectiveTracker]])
UpSpark:SetDrawLayer ("OVERLAY", 0)
UpSpark:SetPoint ("center", MonkWWComboPoint, "center", 0, 0)
UpSpark:SetSize (CONST_WIDGET_WIDTH * 0.89, CONST_WIDGET_HEIGHT * 0.89)
UpSpark:SetTexCoord (0.7108479309082, 0.83905952453613, 0.0010000000149012, 0.12888721466064)
--> animations for UpSpark
UpSpark.scale = MainAnimationGroup:CreateAnimation ("SCALE")
UpSpark.scale:SetTarget (UpSpark)
UpSpark.scale:SetOrder (1)
UpSpark.scale:SetDuration (0.195999994874)
UpSpark.scale:SetFromScale (0, 0)
UpSpark.scale:SetToScale (1, 1)
UpSpark.scale:SetOrigin ("center", 0, 0)
UpSpark.alpha = MainAnimationGroup:CreateAnimation ("ALPHA")
UpSpark.alpha:SetTarget (UpSpark)
UpSpark.alpha:SetOrder (1)
UpSpark.alpha:SetDuration (0.195999994874)
UpSpark.alpha:SetFromAlpha (0)
UpSpark.alpha:SetToAlpha (0.40382900834084)
UpSpark.rotation = MainAnimationGroup:CreateAnimation ("ROTATION")
UpSpark.rotation:SetTarget (UpSpark)
UpSpark.rotation:SetOrder (1)
UpSpark.rotation:SetDuration (0.195999994874)
UpSpark.rotation:SetDegrees (60)
UpSpark.rotation:SetOrigin ("center", 0, 0)
UpSpark.rotation = MainAnimationGroup:CreateAnimation ("ROTATION")
UpSpark.rotation:SetTarget (UpSpark)
UpSpark.rotation:SetOrder (2)
UpSpark.rotation:SetDuration (0.195999994874)
UpSpark.rotation:SetDegrees (15)
UpSpark.rotation:SetOrigin ("center", 0, 0)
UpSpark.alpha = MainAnimationGroup:CreateAnimation ("ALPHA")
UpSpark.alpha:SetTarget (UpSpark)
UpSpark.alpha:SetOrder (2)
UpSpark.alpha:SetDuration (0.096000000834465)
UpSpark.alpha:SetFromAlpha (0.4038280248642)
UpSpark.alpha:SetToAlpha (0.25)
UpSpark.rotation = MainAnimationGroup:CreateAnimation ("ROTATION")
UpSpark.rotation:SetTarget (UpSpark)
UpSpark.rotation:SetOrder (3)
UpSpark.rotation:SetDuration (0.195999994874)
UpSpark.rotation:SetDegrees (60)
UpSpark.rotation:SetOrigin ("center", 0, 0)
UpSpark.alpha = MainAnimationGroup:CreateAnimation ("ALPHA")
UpSpark.alpha:SetTarget (UpSpark)
UpSpark.alpha:SetOrder (3)
UpSpark.alpha:SetDuration (0.195999994874)
UpSpark.alpha:SetFromAlpha (0.25)
UpSpark.alpha:SetToAlpha (0)
----------------------------------------------
local BackgroundSpark = MonkWWComboPoint:CreateTexture (nil, "BACKGROUND")
BackgroundSpark:SetTexture ([[Interface\PVPFrame\PvPHonorSystem]])
BackgroundSpark:SetDrawLayer ("BACKGROUND", 0)
BackgroundSpark:SetPoint ("center", MonkWWComboPoint, "center", 0, 0)
BackgroundSpark:SetSize (CONST_WIDGET_WIDTH * 1.39, CONST_WIDGET_HEIGHT * 1.39)
BackgroundSpark:SetTexCoord (0.0096916198730469, 0.1160000038147, 0.43700000762939, 0.54200000762939)
--> animations for BackgroundSpark
BackgroundSpark.alpha = MainAnimationGroup:CreateAnimation ("ALPHA")
BackgroundSpark.alpha:SetTarget (BackgroundSpark)
BackgroundSpark.alpha:SetOrder (1)
BackgroundSpark.alpha:SetDuration (0.195999994874)
BackgroundSpark.alpha:SetFromAlpha (0)
BackgroundSpark.alpha:SetToAlpha (1)
BackgroundSpark.rotation = MainAnimationGroup:CreateAnimation ("ROTATION")
BackgroundSpark.rotation:SetTarget (BackgroundSpark)
BackgroundSpark.rotation:SetOrder (1)
BackgroundSpark.rotation:SetDuration (0.195999994874)
BackgroundSpark.rotation:SetDegrees (2)
BackgroundSpark.rotation:SetOrigin ("center", 0, 0)
BackgroundSpark.alpha = MainAnimationGroup:CreateAnimation ("ALPHA")
BackgroundSpark.alpha:SetTarget (BackgroundSpark)
BackgroundSpark.alpha:SetOrder (2)
BackgroundSpark.alpha:SetDuration (0.195999994874)
BackgroundSpark.alpha:SetFromAlpha (0.34612736105919)
BackgroundSpark.alpha:SetToAlpha (0.24995632469654)
BackgroundSpark.alpha = MainAnimationGroup:CreateAnimation ("ALPHA")
BackgroundSpark.alpha:SetTarget (BackgroundSpark)
BackgroundSpark.alpha:SetOrder (3)
BackgroundSpark.alpha:SetDuration (0.195999994874)
BackgroundSpark.alpha:SetFromAlpha (0.25)
BackgroundSpark.alpha:SetToAlpha (0)
--> test the animation
--MainAnimationGroup:Play()
MonkWWComboPoint.ShowAnimation = MainAnimationGroup
return MonkWWComboPoint
end