--do not load if this is a classic version of the game
if ( DetailsFramework.IsTBCWow ( ) or DetailsFramework.IsWotLKWow ( ) ) then
return
end
local AceLocale = LibStub ( " AceLocale-3.0 " )
local Loc = AceLocale : GetLocale ( " Details " )
local SharedMedia = LibStub : GetLibrary ( " LibSharedMedia-3.0 " )
local DF = _G.DetailsFramework
---------------------------------------------------------------------------------------------
--varios debuffs tao doido com monk
--ignorar bloodlust, shield d priest
--reler os tanks ao sair de um grupo
local GetTime = GetTime --wow api local
local _UFC = UnitAffectingCombat --wow api local
local IsInRaid = IsInRaid --wow api local
local IsInGroup = IsInGroup --wow api local
local _UnitName = UnitName --wow api local
local _UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned
local UnitHealth = UnitHealth --wow api local
local UnitHealthMax = UnitHealthMax --wow api local
local _UnitIsPlayer = UnitIsPlayer --wow api local
local _UnitClass = UnitClass --wow api local
local _UnitDebuff = UnitDebuff --wow api local
local UnitGetIncomingHeals = UnitGetIncomingHeals
local _unpack = unpack
local UnitGetTotalAbsorbs = UnitGetTotalAbsorbs
---------------------------------------------------------------------------------------------
local DB_ANIMATION_TIME_DILATATION = 0.515321
local CONST_DEBUFF_AMOUNT = 5
local CONST_MAX_TANKS = 2
local _cstr = string.format --lua library local
local tinsert = table.insert --lua library local
local _table_remove = table.remove --lua library local
local ipairs = ipairs --lua library local
local pairs = pairs --lua library local
local _math_floor = math.floor --lua library local
local abs = math.abs --lua library local
local _math_min = math.min --lua library local
local _table_sort = table.sort
local ignored_debuffs = {
[ 80354 ] = true , --temporal displacement
[ 57724 ] = true , --sated
[ 6788 ] = true , --weakened soul
[ 124275 ] = true , --light stagger
[ 124274 ] = true , --moderate stagger
}
---------------------------------------------------------------------------------------------
--Create plugin Object
local Vanguard = Details : NewPluginObject ( " Details_Vanguard " )
--Main Frame
local VanguardFrame = Vanguard.Frame
local onUpdateFrame = CreateFrame ( " frame " )
Vanguard : SetPluginDescription ( " Show debuffs on each tanks in the raid, also shows incoming heal and damage and the last hits you took. " )
Vanguard.auraUpdateFrames = { }
for i = 1 , CONST_MAX_TANKS do
local auraUpdateFrame = CreateFrame ( " frame " , nil , UIParent )
Vanguard.auraUpdateFrames [ # Vanguard.auraUpdateFrames + 1 ] = auraUpdateFrame
end
local function CreatePluginFrames ( data )
--localize details functions
Vanguard.GetSpec = Vanguard.GetSpec
Vanguard.class_specs_coords = Vanguard.class_specs_coords
local framework = Vanguard : GetFramework ( )
--OnDetailsEvent Parser
function Vanguard : OnDetailsEvent ( event , ... )
if ( event == " HIDE " ) then --plugin hidded, disabled
VanguardFrame : UnregisterEvent ( " ROLE_CHANGED_INFORM " )
VanguardFrame : UnregisterEvent ( " GROUP_ROSTER_UPDATE " )
VanguardFrame : UnregisterEvent ( " PLAYER_TARGET_CHANGED " )
Vanguard : CombatEnd ( )
elseif ( event == " SHOW " ) then --plugin shown, enabled
if ( not Vanguard.db . first_run ) then
Vanguard.db . first_run = true
local welcome = CreateFrame ( " frame " , nil , UIParent , " BackdropTemplate " )
welcome : SetFrameStrata ( " TOOLTIP " )
welcome : SetPoint ( " center " , UIParent , " center " )
welcome : SetSize ( 400 , 200 )
DF : ApplyStandardBackdrop ( welcome )
local str = Details.gump : CreateLabel ( welcome , " Welcome to Vanguard! \n \n \n - The green-left bar represents the incoming healing plus absorbs on the tank. \n \n - The red-right show the incoming damage. \n \n - Tanks health bar and debuffs on them are shown in the bottom side. \n \n - Click anywhere to show options. " , nil , nil , " GameFontNormal " )
str : SetPoint ( 15 , - 15 )
str : SetWidth ( 375 )
local close_button = Details.gump : CreateButton ( welcome , function ( ) welcome : Hide ( ) end , 120 , 20 , " Close " )
close_button : SetTemplate ( Details.gump : GetTemplate ( " button " , " DETAILS_PLUGINPANEL_BUTTON_TEMPLATE " ) )
close_button : SetPoint ( " center " , welcome , " center " )
close_button : SetPoint ( " bottom " , welcome , " bottom " , 0 , 10 )
end
Vanguard.CurrentInstance = Vanguard : GetInstance ( Vanguard.instance_id )
VanguardFrame : RegisterEvent ( " ROLE_CHANGED_INFORM " )
VanguardFrame : RegisterEvent ( " GROUP_ROSTER_UPDATE " )
VanguardFrame : RegisterEvent ( " PLAYER_TARGET_CHANGED " )
Vanguard : ResetBars ( )
Vanguard : IdentifyTanks ( )
Vanguard.CurrentCombat = Details : GetCombat ( " current " )
VanguardFrame : SetFrameStrata ( Vanguard.CurrentInstance . baseframe : GetFrameStrata ( ) )
VanguardFrame : SetFrameLevel ( Vanguard.CurrentInstance . baseframe : GetFrameLevel ( ) + 5 )
if ( Vanguard : IsInCombat ( ) ) then
Vanguard : CombatStart ( )
end
VanguardFrame : SetPoint ( " topleft " , Vanguard.CurrentInstance . baseframe , " topleft " )
VanguardFrame : SetPoint ( " bottomright " , Vanguard.CurrentInstance . baseframe , " bottomright " )
elseif ( event == " COMBAT_PLAYER_ENTER " ) then --a new combat has been started
Vanguard.CurrentInstance = Vanguard : GetInstance ( Vanguard.instance_id )
Vanguard.CurrentCombat = select ( 1 , ... )
Vanguard.Running = true
Vanguard : CombatStart ( )
elseif ( event == " COMBAT_PLAYER_LEAVE " ) then --current combat has finished
Vanguard.CurrentCombat = select ( 1 , ... )
Vanguard : CombatEnd ( )
Vanguard : ResetBars ( )
--Vanguard:ResetBlocks()
elseif ( event == " GROUP_ONLEAVE " ) then
if ( Vanguard.Running ) then
Vanguard : CombatEnd ( )
Vanguard : ResetBars ( )
Vanguard : ResetBlocks ( )
end
Vanguard : IdentifyTanks ( )
elseif ( event == " DETAILS_STARTED " ) then
Vanguard.CurrentInstance = Vanguard : GetInstance ( Vanguard.instance_id )
Vanguard.CurrentCombat = Vanguard : GetCurrentCombat ( )
elseif ( event == " DETAILS_INSTANCE_ENDRESIZE " or event == " DETAILS_INSTANCE_SIZECHANGED " ) then
--Vanguard:OnResize()
elseif ( event == " PLUGIN_DISABLED " ) then
elseif ( event == " PLUGIN_ENABLED " ) then
elseif ( event == " DETAILS_OPTIONS_MODIFIED " ) then
Vanguard.RefreshWidgets ( )
end
end
--list with tank names
Vanguard.TankList = { } --tanks
Vanguard.TankHashNames = { } --tanks
Vanguard.TankBlocks = { } --tank frames
Vanguard.TankIncDamage = { } --tank damage taken from last 5 seconds
Vanguard.UnitIdCache = { }
--search for tanks in the raid or party group
function Vanguard : IdentifyTanks ( )
table.wipe ( Vanguard.TankList )
table.wipe ( Vanguard.TankHashNames )
table.wipe ( Vanguard.TankIncDamage )
table.wipe ( Vanguard.UnitIdCache )
for i = 1 , CONST_MAX_TANKS do
Vanguard.auraUpdateFrames [ i ] : UnregisterEvent ( " UNIT_AURA " )
end
--Vanguard.auraUpdateFrame:UnregisterEvent("UNIT_AURA")
if ( IsInRaid ( ) ) then
for i = 1 , GetNumGroupMembers ( ) , 1 do
local role = _UnitGroupRolesAssigned ( " raid " .. i )
if ( role == " TANK " ) then
local name , realm = UnitName ( " raid " .. i )
if ( realm ) then
name = name .. " - " .. realm
end
if ( not Vanguard.TankHashNames [ name ] ) then
Vanguard.TankList [ # Vanguard.TankList + 1 ] = name
Vanguard.TankHashNames [ name ] = # Vanguard.TankList
Vanguard.TankIncDamage [ name ] = { }
Vanguard.auraUpdateFrames [ # Vanguard.TankList ] : RegisterUnitEvent ( " UNIT_AURA " , " raid " .. i )
Vanguard.UnitIdCache [ name ] = " raid " .. i
end
end
end
elseif ( IsInGroup ( ) ) then
for i = 1 , GetNumGroupMembers ( ) - 1 , 1 do
local role = _UnitGroupRolesAssigned ( " party " .. i )
if ( role == " TANK " ) then
local name , realm = UnitName ( " party " .. i )
if ( realm ) then
name = name .. " - " .. realm
end
if ( not Vanguard.TankHashNames [ name ] ) then
Vanguard.TankList [ # Vanguard.TankList + 1 ] = name
Vanguard.TankHashNames [ name ] = # Vanguard.TankList
Vanguard.TankIncDamage [ name ] = { }
Vanguard.auraUpdateFrames [ # Vanguard.TankList ] : RegisterUnitEvent ( " UNIT_AURA " , " party " .. i )
Vanguard.UnitIdCache [ name ] = " party " .. i
end
end
end
local role = _UnitGroupRolesAssigned ( " player " )
if ( role == " TANK " ) then
local name , realm = UnitName ( " player " )
if ( realm ) then
name = name .. " - " .. realm
end
if ( not Vanguard.TankHashNames [ name ] ) then
Vanguard.TankList [ # Vanguard.TankList + 1 ] = name
Vanguard.TankHashNames [ name ] = # Vanguard.TankList
Vanguard.TankIncDamage [ name ] = { }
Vanguard.auraUpdateFrames [ # Vanguard.TankList ] : RegisterUnitEvent ( " UNIT_AURA " , " player " )
Vanguard.UnitIdCache [ name ] = " player "
end
end
else
local name , realm = UnitName ( " player " )
if ( realm ) then
name = name .. " - " .. realm
end
if ( not Vanguard.TankHashNames [ name ] ) then
Vanguard.TankList [ # Vanguard.TankList + 1 ] = name
Vanguard.TankHashNames [ name ] = # Vanguard.TankList
Vanguard.TankIncDamage [ name ] = { }
Vanguard.auraUpdateFrames [ # Vanguard.TankList ] : RegisterUnitEvent ( " UNIT_AURA " , " player " )
Vanguard.UnitIdCache [ name ] = " player "
end
end
Vanguard : RefreshTanks ( )
end
function Vanguard : ResetBars ( )
if ( Vanguard.db . show_inc_bars ) then
for i , tankblock in ipairs ( Vanguard.TankBlocks ) do
local bar = tankblock.heal_inc
bar : SetSplit ( 50 )
bar : SetLeftText ( tankblock.tankname_string )
bar : SetRightText ( " " )
bar : SetRightColor ( .25 , 0 , 0 , 1 )
bar : SetLeftColor ( 0 , .25 , 0 , 1 )
bar : SetHeight ( Vanguard.db . bar_height )
bar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
bar : SetBackgroundTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
bar : Show ( )
end
else
for i , tankblock in ipairs ( Vanguard.TankBlocks ) do
local bar = tankblock.heal_inc
bar : Hide ( )
end
end
end
function Vanguard : ResetBlocks ( )
for i , tblock in ipairs ( Vanguard.TankBlocks ) do
local _ , maxValue = tblock.unitFrame . healthBar : GetMinMaxValues ( )
tblock.unitFrame . healthBar : SetValue ( maxValue )
tblock.debuffs_using = 0
tblock.debuffs_next_index = 1
for i = 1 , CONST_DEBUFF_AMOUNT do
local dblock = tblock.debuffs_blocks [ i ]
dblock.texture : SetTexture ( nil )
dblock.stack : SetText ( " " )
dblock.stack_bg : Hide ( )
dblock : SetCooldown ( 0 , 0 , 0 , 0 )
dblock.in_use = nil
dblock.support . spellid = nil
end
end
end
local SetTank = function ( self , index )
local name = Vanguard.TankList [ index ]
self.tankname : SetText ( Vanguard : GetOnlyName ( name ) )
self.tankname_string = name
local bar = self.heal_inc
bar.tankname = name
local class , left , right , top , bottom , r , g , b = Vanguard : GetClass ( name )
local spec = Vanguard : GetSpec ( name )
if ( spec ) then
self.specicon : SetTexture ( Vanguard.CurrentInstance . row_info.spec_file )
self.specicon : SetTexCoord ( _unpack ( Vanguard.class_specs_coords [ spec ] ) )
else
self.specicon : SetTexture ( Vanguard.CurrentInstance . row_info.icon_file )
self.specicon : SetTexCoord ( left , right , top , bottom )
end
self.unitFrame : SetUnit ( Vanguard.UnitIdCache [ name ] )
self.unitFrame . healthBar : SetUnit ( Vanguard.UnitIdCache [ name ] )
self.unitFrame . castBar : SetUnit ( Vanguard.UnitIdCache [ name ] )
self.unitFrame . powerBar : SetUnit ( Vanguard.UnitIdCache [ name ] )
self.unitFrame . healthBar : SetColor ( r , g , b )
bar.lefticon = Vanguard.CurrentInstance . row_info.icon_file
bar.iconleft : SetTexCoord ( left , right , top , bottom )
bar : SetLeftText ( Vanguard : GetOnlyName ( name ) )
bar : SetLeftText ( name )
local width = Vanguard.db . tank_block_size
self : SetWidth ( width )
self : SetBackdropColor ( unpack ( Vanguard.db . tank_block_color ) )
self.unitFrame . healthBar.background : SetColorTexture ( unpack ( Vanguard.db . tank_block_color ) )
self.unitFrame . healthBar.Settings . BackgroundColor = Vanguard.db . tank_block_color
--texture
self.unitFrame . healthBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
self.unitFrame . powerBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
self.unitFrame . castBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
end
local debuff_on_enter = function ( self )
if ( self.spellid ) then
--self.texture:SetBlendMode("ADD")
GameTooltip : SetOwner ( self , " ANCHOR_TOPLEFT " )
GameTooltip : SetSpellByID ( self.spellid )
GameTooltip : Show ( )
end
end
local debuff_on_leave = function ( self )
--self.texture:SetBlendMode("BLEND")
if ( self.spellid ) then
GameTooltip : Hide ( )
end
end
local on_click = function ( self , button )
if ( button == " LeftButton " ) then
Vanguard.OpenOptionsPanel ( )
elseif ( button == " RightButton " ) then
local instance = Vanguard : GetPluginInstance ( )
if ( instance ) then
Details.switch : ShowMe ( instance )
end
end
end
function Vanguard : CreateTankBlock ( index )
--frame
local f = CreateFrame ( " button " , " VanguardTankBlock " .. index , VanguardFrame , " BackdropTemplate " )
f.SetTank = SetTank
f : SetSize ( Vanguard.db . tank_block_size , Vanguard.db . tank_block_size_height )
f : SetScript ( " OnMouseUp " , on_click )
if ( index == 1 ) then
f : SetPoint ( " bottomleft " , VanguardFrame , " bottomleft " , 0 + ( ( index - 1 ) * 155 ) , 0 )
else
f : SetPoint ( " left " , Vanguard.TankBlocks [ index - 1 ] , " right " , 5 , 0 )
end
f : SetBackdrop ( { bgFile = [[Interface\AddOns\Details\images\background]] , tile = true , tileSize = 16 , insets = { left = 0 , right = 0 , top = 0 , bottom = 0 } , edgeFile = [[Interface\Buttons\WHITE8X8]] , edgeSize = 1 } )
f : SetBackdropColor ( unpack ( Vanguard.db . tank_block_color ) )
f : SetBackdropBorderColor ( 0 , 0 , 0 , 1 )
--debuff icons
f.debufficons = { }
--tank health bar
local unitFrameSettingsOverride = {
ShowPowerBar = true ,
ShowCastBar = true ,
ShowBorder = false ,
CanModifyHealhBarColor = false ,
ShowTargetOverlay = false ,
ShowUnitName = false ,
ClearUnitOnHide = false ,
}
local healthBarSettingsOverride = {
ShowHealingPrediction = not DetailsFramework.IsTBCWow ( ) ,
ShowShields = not DetailsFramework.IsTBCWow ( ) ,
}
local castBarSettingsOverride = {
FadeInTime = 0.01 ,
FadeOutTime = 0.40 ,
SparkHeight = 16 ,
LazyUpdateCooldown = 0.1 ,
}
local powerBarSettingsOverride = {
ShowAlternatePower = false ,
}
f.unitFrame = DetailsFramework : CreateUnitFrame ( f , " VanguardTankUnitFrame " .. index , unitFrameSettingsOverride , healthBarSettingsOverride , castBarSettingsOverride , powerBarSettingsOverride )
f.unitFrame : SetPoint ( " topleft " , f , " topleft " , 1 , - 1 )
f.unitFrame : SetPoint ( " bottomright " , f , " bottomright " , - 1 , 1 )
--spec icon
f.specicon = f.unitFrame . healthBar : CreateTexture ( nil , " overlay " )
f.specicon : SetPoint ( " topleft " , f.unitFrame . healthBar , " topleft " , 5 , - 5 )
f.specicon : SetSize ( 14 , 14 )
--tank name
f.tankname = f.unitFrame . healthBar : CreateFontString ( nil , " overlay " , " GameFontNormal " )
f.tankname : SetPoint ( " left " , f.specicon , " right " , 2 , 1 )
f.unitFrame . castBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.unitFrame . healthBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.unitFrame . powerBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.unitFrame . powerBar.background : SetColorTexture ( 0 , 0 , 0 , 1 )
f.unitFrame . powerBar.background : SetVertexColor ( 0 , 0 , 0 , 1 )
--inc heals inc damage
f.heal_inc = DF : CreateSplitBar ( f , 294 , Vanguard.db . bar_height )
f.heal_inc : SetSize ( 294 , Vanguard.db . bar_height )
f.heal_inc : SetPoint ( " topleft " , VanguardFrame , " topleft " , 0 , ( ( index - 1 ) * - Vanguard.db . bar_height ) )
f.heal_inc : SetPoint ( " topright " , VanguardFrame , " topright " , 0 , ( ( index - 1 ) * - Vanguard.db . bar_height ) )
f.heal_inc . fontsize = 10
f.heal_inc : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.heal_inc : EnableAnimations ( )
f.heal_inc : SetScript ( " OnMouseUp " , on_click )
--debuffs blocks
f.debuffs_blocks = { }
f.debuffs_using = 0
f.debuffs_next_index = 1
for i = 1 , CONST_DEBUFF_AMOUNT do
local support_frame = CreateFrame ( " frame " , " VanguardSupportFrame_ " .. index .. " _ " .. i , f.unitFrame , " BackdropTemplate " )
support_frame : SetFrameLevel ( f.unitFrame : GetFrameLevel ( ) + 10 )
support_frame : SetSize ( 24 , 24 )
support_frame : SetScript ( " OnMouseUp " , on_click )
--icon texture
local texture = support_frame : CreateTexture ( support_frame : GetName ( ) .. " _Texture " , " overlay " )
texture : SetSize ( 24 , 24 )
texture : SetPoint ( " center " , support_frame , " center " , 0 , 0 )
local y = 3
local xOffSet = ( i - 1 ) * ( texture : GetWidth ( ) + 1 )
support_frame.offset = xOffSet
support_frame : SetPoint ( " left " , f , " left " , 5 + xOffSet , - 8 )
local dblock = CreateFrame ( " cooldown " , " VanguardTankDebuffCooldown " .. index .. " _ " .. i , support_frame , " CooldownFrameTemplate, BackdropTemplate " )
dblock : SetAlpha ( 0.7 )
dblock : SetPoint ( " topleft " , texture , " topleft " )
dblock : SetPoint ( " bottomright " , texture , " bottomright " )
--scripts
dblock : SetScript ( " OnMouseUp " , on_click )
dblock : SetScript ( " OnEnter " , debuff_on_enter )
dblock : SetScript ( " OnLeave " , debuff_on_leave )
dblock.texture = texture
dblock : SetHideCountdownNumbers ( true )
local elevateStringsFrame = CreateFrame ( " frame " , support_frame : GetName ( ) .. " _ElevateFrame " , support_frame )
elevateStringsFrame : SetAllPoints ( )
elevateStringsFrame : SetFrameLevel ( dblock : GetFrameLevel ( ) + 10 )
elevateStringsFrame : EnableMouse ( false )
local stack = elevateStringsFrame : CreateFontString ( elevateStringsFrame : GetName ( ) .. " _StackText " , " overlay " , " GameFontNormal " )
stack : SetPoint ( " bottomright " , dblock , " bottomright " , 0 , 0 )
DetailsFramework : SetFontColor ( stack , " yellow " )
local stack_bg = elevateStringsFrame : CreateTexture ( elevateStringsFrame : GetName ( ) .. " _StackBG " , " artwork " )
stack_bg : SetColorTexture ( 0 , 0 , 0 , 1 )
stack_bg : SetPoint ( " center " , stack , " center " , 0 , 0 )
stack_bg : SetSize ( 10 , 10 )
stack_bg : Hide ( )
dblock.Timer = dblock : CreateFontString ( dblock : GetName ( ) .. " _Timer " , " overlay " , " NumberFontNormal " )
dblock.Timer : SetPoint ( " center " )
dblock.stack = stack
dblock.stack_bg = stack_bg
dblock.support = support_frame
dblock.elevate_frame = elevateStringsFrame
f.debuffs_blocks [ i ] = dblock
end
Vanguard.TankBlocks [ index ] = f
Vanguard : ResetBars ( )
return f
end
function Vanguard : RefreshTanks ( )
Vanguard : ResetBlocks ( )
for i = 1 , # Vanguard.TankList do
local block = Vanguard.TankBlocks [ i ]
if ( not block ) then
block = Vanguard : CreateTankBlock ( i )
end
block : SetTank ( i )
block : SetSize ( Vanguard.db . tank_block_size , Vanguard.db . tank_block_size_height )
end
if ( Vanguard.Running ) then
Vanguard : CombatEnd ( )
Vanguard : CombatStart ( )
end
Vanguard.RefreshWidgets ( )
end
function Vanguard . RefreshWidgets ( )
local hostInstance = Vanguard : GetInstance ( Vanguard.instance_id )
local isClickThrough = hostInstance.clickthrough_window
local isClickThrough_InCombat = hostInstance.clickthrough_incombatonly
for i , f in pairs ( Vanguard.TankBlocks ) do
for debuffBlockId = 1 , CONST_DEBUFF_AMOUNT do
local debuffBlock = f.debuffs_blocks [ debuffBlockId ]
DetailsFramework : SetFontSize ( debuffBlock.Timer , Vanguard.db . aura_timer_text_size )
debuffBlock.support : SetPoint ( " left " , f , " left " , 5 + debuffBlock.support . offset , - 8 + Vanguard.db . aura_offset_y )
end
if ( isClickThrough ) then
if ( isClickThrough_InCombat ) then
if ( InCombatLockdown ( ) ) then
f : EnableMouse ( false )
f.unitFrame : EnableMouse ( false )
f.unitFrame . healthBar : EnableMouse ( false )
f.unitFrame . powerBar : EnableMouse ( false )
f.unitFrame . castBar : EnableMouse ( false )
for debuffBlockId = 1 , CONST_DEBUFF_AMOUNT do
local debuffBlock = f.debuffs_blocks [ debuffBlockId ]
debuffBlock : EnableMouse ( false )
debuffBlock.support : EnableMouse ( false )
--debuffBlock.elevate_frame:EnableMouse(false)
end
f.heal_inc : EnableMouse ( false )
else
f : EnableMouse ( true )
f.unitFrame : EnableMouse ( true )
f.unitFrame . healthBar : EnableMouse ( true )
f.unitFrame . powerBar : EnableMouse ( true )
f.unitFrame . castBar : EnableMouse ( true )
for debuffBlockId = 1 , CONST_DEBUFF_AMOUNT do
local debuffBlock = f.debuffs_blocks [ debuffBlockId ]
debuffBlock : EnableMouse ( true )
debuffBlock.support : EnableMouse ( true )
--debuffBlock.elevate_frame:EnableMouse(true)
debuffBlock : SetScript ( " OnMouseUp " , on_click )
end
f.heal_inc : EnableMouse ( true )
end
else
f : EnableMouse ( false )
f.unitFrame : EnableMouse ( false )
f.unitFrame . healthBar : EnableMouse ( false )
f.unitFrame . powerBar : EnableMouse ( false )
f.unitFrame . castBar : EnableMouse ( false )
for debuffBlockId = 1 , CONST_DEBUFF_AMOUNT do
local debuffBlock = f.debuffs_blocks [ debuffBlockId ]
debuffBlock : EnableMouse ( false )
debuffBlock.support : EnableMouse ( false )
--debuffBlock.elevate_frame:EnableMouse(false)
end
f.heal_inc : EnableMouse ( false )
end
else
f : EnableMouse ( true )
f.unitFrame : EnableMouse ( true )
f.unitFrame . healthBar : EnableMouse ( true )
f.unitFrame . powerBar : EnableMouse ( true )
f.unitFrame . castBar : EnableMouse ( true )
for debuffBlockId = 1 , CONST_DEBUFF_AMOUNT do
local debuffBlock = f.debuffs_blocks [ debuffBlockId ]
debuffBlock : EnableMouse ( true )
debuffBlock.support : EnableMouse ( true )
--debuffBlock.elevate_frame:EnableMouse(true)
debuffBlock : SetScript ( " OnMouseUp " , on_click )
end
f.heal_inc : EnableMouse ( true )
end
--texture
f.unitFrame . healthBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.unitFrame . powerBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.unitFrame . castBar : SetTexture ( SharedMedia : Fetch ( " statusbar " , Vanguard.db . tank_block_texture ) )
f.unitFrame . powerBar : ClearAllPoints ( )
f.unitFrame . healthBar : ClearAllPoints ( )
f.unitFrame . castBar : ClearAllPoints ( )
if ( not Vanguard.db . show_health_bar and not Vanguard.db . show_cast_bar and not Vanguard.db . show_power_bar ) then
f.unitFrame : Hide ( )
f.Center : Hide ( )
f : SetBackdropBorderColor ( 0 , 0 , 0 , 0 )
return
end
f.unitFrame : Show ( )
f.unitFrame . healthBar : Show ( )
f.Center : Show ( )
f : SetBackdropBorderColor ( 0 , 0 , 0 , 1 )
f.unitFrame . healthBar : SetPoint ( " topleft " , f , " topleft " , 0 , 0 )
f.unitFrame . healthBar : SetPoint ( " topright " , f , " topright " , 0 , 0 )
f.unitFrame . healthBar : SetPoint ( " bottomleft " , f , " bottomleft " , 0 , 0 )
f.unitFrame . healthBar : SetPoint ( " bottomright " , f , " bottomright " , 0 , 0 )
if ( Vanguard.db . show_cast_bar ) then
f.unitFrame . castBar : Show ( )
f.unitFrame . castBar : SetHeight ( Vanguard.db . tank_block_castbar_size_height )
if ( Vanguard.db . show_health_bar ) then
if ( Vanguard.db . show_power_bar ) then
f.unitFrame . castBar : SetPoint ( " bottomleft " , f , " bottomleft " , 0 , Vanguard.db . tank_block_powerbar_size_height )
f.unitFrame . castBar : SetPoint ( " bottomright " , f , " bottomright " , 0 , Vanguard.db . tank_block_powerbar_size_height )
else
f.unitFrame . castBar : SetPoint ( " bottomleft " , f , " bottomleft " , 0 , 0 )
f.unitFrame . castBar : SetPoint ( " bottomright " , f , " bottomright " , 0 , 0 )
end
else
f.unitFrame . castBar : SetPoint ( " topleft " , f , " topleft " , 0 , 0 )
f.unitFrame . castBar : SetPoint ( " topright " , f , " topright " , 0 , 0 )
end
end
f.unitFrame . castBar : Hide ( )
if ( Vanguard.db . show_power_bar ) then
f.unitFrame . powerBar : Show ( )
f.unitFrame . powerBar : SetHeight ( Vanguard.db . tank_block_powerbar_size_height )
f.unitFrame . powerBar : SetPoint ( " bottomleft " , f , " bottomleft " , 0 , 0 )
f.unitFrame . powerBar : SetPoint ( " bottomright " , f , " bottomright " , 0 , 0 )
else
f.unitFrame . powerBar : Hide ( )
end
end
end
function Vanguard . AnimateLeftWithAccel ( self , deltaTime )
local distance = ( self.AnimationStart - self.AnimationEnd ) / self.CurrentHealthMax * 100 --scale 1 - 100
local minTravel = min ( distance / 10 , 3 ) -- 10 = trigger distance to max speed 3 = speed scale on max travel
local maxTravel = max ( minTravel , 0.45 ) -- 0.45 = min scale speed on low travel speed
local calcAnimationSpeed = ( self.CurrentHealthMax * ( deltaTime * DB_ANIMATION_TIME_DILATATION ) ) * maxTravel --re-scale back to unit health, scale with delta time and scale with the travel speed
self.AnimationStart = self.AnimationStart - ( calcAnimationSpeed )
self : SetSplit ( self.AnimationStart )
self.CurrentHealth = self.AnimationStart
if ( self.Spark ) then
self.Spark : SetPoint ( " center " , self , " left " , self.AnimationStart / self.CurrentHealthMax * self : GetWidth ( ) , 0 )
self.Spark : Show ( )
end
if ( self.AnimationStart - 1 <= self.AnimationEnd ) then
self : SetSplit ( self.AnimationEnd )
self.CurrentHealth = self.AnimationEnd
self.IsAnimating = false
if ( self.Spark ) then
self.Spark : Hide ( )
end
end
end
function Vanguard . AnimateRightWithAccel ( self , deltaTime )
local distance = ( self.AnimationEnd - self.AnimationStart ) / self.CurrentHealthMax * 100 --scale 1 - 100 basis
local minTravel = math.min ( distance / 10 , 3 ) -- 10 = trigger distance to max speed 3 = speed scale on max travel
local maxTravel = math.max ( minTravel , 0.45 ) -- 0.45 = min scale speed on low travel speed
local calcAnimationSpeed = ( self.CurrentHealthMax * ( deltaTime * DB_ANIMATION_TIME_DILATATION ) ) * maxTravel --re-scale back to unit health, scale with delta time and scale with the travel speed
self.AnimationStart = self.AnimationStart + ( calcAnimationSpeed )
self : SetSplit ( self.AnimationStart )
self.CurrentHealth = self.AnimationStart
if ( self.AnimationStart + 1 >= self.AnimationEnd ) then
self : SetSplit ( self.AnimationEnd )
self.CurrentHealth = self.AnimationEnd
self.IsAnimating = false
end
end
onUpdateFrame.onUpdate = function ( self , deltaTime )
--do healthbar animation ~animation ~healthbar
for tank_name , block_index in pairs ( Vanguard.TankHashNames ) do
local tframe = Vanguard.TankBlocks [ block_index ]
local bar = tframe.heal_inc
if ( bar.IsAnimating ) then
bar.AnimateFunc ( bar , deltaTime )
end
end
end
function Vanguard : TrackIncoming ( )
for tank_name , block_index in pairs ( Vanguard.TankHashNames ) do
local shields = UnitGetTotalAbsorbs and UnitGetTotalAbsorbs ( tank_name ) or 0
local heals = UnitGetIncomingHeals and UnitGetIncomingHeals ( tank_name ) or 0
local events_table = Vanguard.CurrentCombat . player_last_events [ tank_name ]
local taken = 0
local timeNow = time ( )
if ( events_table ) then
for _ , event in ipairs ( events_table ) do
if ( event [ 1 ] and event [ 4 ] + 5 > timeNow ) then --damage event
taken = taken + event [ 3 ]
end
end
tinsert ( Vanguard.TankIncDamage , 1 , taken )
tremove ( Vanguard.TankIncDamage , 41 )
--taken = taken / 3.5
end
local tframe = Vanguard.TankBlocks [ block_index ]
--split animation
tframe.heal_inc : SetLeftText ( Vanguard : ToK ( shields + heals ) .. " [|cFFFFFF55 " .. Vanguard : ToK ( shields ) .. " |r] " )
tframe.heal_inc : SetRightText ( Vanguard : ToK ( _math_floor ( taken ) ) )
heals = heals + shields
local oldValue = tframe.heal_inc : GetValue ( )
local currentValue = 0
if ( taken > 0 and heals > 0 ) then
if ( taken > heals ) then
local p = heals / taken * 100
p = abs ( p - 100 )
p = p / 2
p = p + 50
p = abs ( p - 100 )
--tframe.heal_inc:SetSplit (p)
currentValue = p
else
local p = taken / heals * 100
p = abs ( p - 100 )
p = p / 2
p = p + 50
--tframe.heal_inc:SetSplit (p)
currentValue = p
end
elseif ( taken > 0 ) then
--tframe.heal_inc:SetSplit (6)
currentValue = 1
elseif ( heals > 0 ) then
--tframe.heal_inc:SetSplit (94)
currentValue = 99
end
--~animation
tframe.heal_inc . oldValue = oldValue
tframe.heal_inc . currentValue = currentValue --tframe.heal_inc:GetValue()
tframe.heal_inc . CurrentHealthMax = 100
tframe.heal_inc . AnimationStart = tframe.heal_inc . oldValue
tframe.heal_inc . AnimationEnd = tframe.heal_inc . currentValue
tframe.heal_inc . IsAnimating = true
if ( tframe.heal_inc . AnimationEnd > tframe.heal_inc . AnimationStart ) then
tframe.heal_inc . AnimateFunc = Vanguard.AnimateRightWithAccel
else
tframe.heal_inc . AnimateFunc = Vanguard.AnimateLeftWithAccel
end
end
end
function Vanguard : CombatStart ( )
Vanguard.Running = true
for i = 1 , CONST_MAX_TANKS do
Vanguard.auraUpdateFrames [ i ] : SetScript ( " OnEvent " , Vanguard.AuraUpdate )
end
if ( Vanguard.track_incoming ) then
Vanguard : CancelTimer ( Vanguard.track_incoming )
end
Vanguard.track_incoming = Vanguard : ScheduleRepeatingTimer ( " TrackIncoming " , 0.1 )
onUpdateFrame : SetScript ( " OnUpdate " , onUpdateFrame.onUpdate )
Vanguard.RefreshWidgets ( )
end
function Vanguard : CombatEnd ( )
Vanguard.Running = false
for i = 1 , CONST_MAX_TANKS do
Vanguard.auraUpdateFrames [ i ] : SetScript ( " OnEvent " , nil )
end
if ( Vanguard.track_incoming ) then
Vanguard : CancelTimer ( Vanguard.track_incoming )
end
onUpdateFrame : SetScript ( " OnUpdate " , nil )
Vanguard.RefreshWidgets ( )
end
local formatTime = function ( time )
if ( time >= 3600 ) then
return floor ( time / 3600 ) .. " h "
elseif ( time >= 60 ) then
return floor ( time / 60 ) .. " m "
else
return floor ( time )
end
end
function Vanguard . AuraUpdate ( self , event , unit )
local who_name = GetUnitName ( unit , true )
local tank_index = Vanguard.TankHashNames [ who_name ]
if ( tank_index ) then
local tframe = Vanguard.TankBlocks [ tank_index ]
local debuffBlockId = 1
-- print("powerBar shown:", tframe.unitFrame.powerBar:GetPoint(1))
-- print("castBar shown:", tframe.unitFrame.castBar.unit)
-- print("healthBar shown:", tframe.unitFrame.healthBar:GetPoint(1))
for i = 1 , 40 do
local name , icon , count , debuffType , duration , expirationTime , source , isStealable , nameplateShowPersonal , spellId , canApplyAura , isBossDebuff , castByPlayer = _UnitDebuff ( who_name , i )
if ( name and not ignored_debuffs [ spellId ] ) then -- and not castByPlayer
local dblock = tframe.debuffs_blocks [ debuffBlockId ]
debuffBlockId = debuffBlockId + 1
dblock.debuffName = name
dblock.texture : SetTexture ( icon )
dblock.texture : SetTexCoord ( .1 , .9 , .1 , .9 )
dblock.spellid = spellId
if ( count and count > 1 ) then
dblock.stack : SetText ( count )
dblock.stack : Show ( )
dblock.stack_bg : Show ( )
else
dblock.stack : SetText ( " " )
dblock.stack_bg : Hide ( )
end
local timeLeft = expirationTime - GetTime ( )
timeLeft = max ( timeLeft , 0 )
timeLeft = min ( timeLeft , 600 )
dblock.Timer : SetText ( formatTime ( timeLeft ) )
dblock.Timer : Show ( )
if ( ( timeLeft > 0 and timeLeft < 600 ) and ( floor ( expirationTime ) ~= dblock.expirationAt or not dblock : IsShown ( ) ) ) then
dblock : Show ( )
dblock : SetCooldown ( GetTime ( ) , timeLeft , 0 , 0 )
dblock.expirationAt = floor ( expirationTime )
dblock.expirationAtFloat = expirationTime
else
if ( ( timeLeft < 0 or timeLeft > 600 ) ) then
dblock : Hide ( )
end
end
if ( debuffBlockId == CONST_DEBUFF_AMOUNT + 1 ) then
break
end
else
if ( not name ) then
for o = debuffBlockId , CONST_DEBUFF_AMOUNT do
local dblock = tframe.debuffs_blocks [ o ]
dblock : Hide ( )
dblock.texture : SetTexture ( nil )
end
break
end
end
end
end
end
end
local build_options_panel = function ( )
local options_frame = Vanguard : CreatePluginOptionsFrame ( " VanguardOptionsWindow " , " Vanguard Options " , 1 )
local tank_texture_set = function ( _ , _ , value )
Vanguard.db . tank_block_texture = value ;
Vanguard : ResetBars ( )
Vanguard : RefreshTanks ( )
end
local texture_icon = [[Interface\TARGETINGFRAME\UI-PhasingIcon]]
local texture_icon = [[Interface\AddOns\Details\images\icons]]
local texture_icon_size = { 14 , 14 }
local texture_texcoord = { 469 / 512 , 505 / 512 , 249 / 512 , 284 / 512 }
local textures = SharedMedia : HashTable ( " statusbar " )
local texTable = { }
for name , texturePath in pairs ( textures ) do
texTable [ # texTable + 1 ] = { value = name , label = name , iconsize = texture_icon_size , statusbar = texturePath , onclick = tank_texture_set , icon = texture_icon , texcoord = texture_texcoord }
end
table.sort ( texTable , function ( t1 , t2 ) return t1.label < t2.label end )
local tank_texture_menu = texTable
--templates
local options_text_template = DF : GetTemplate ( " font " , " OPTIONS_FONT_TEMPLATE " )
local options_dropdown_template = DF : GetTemplate ( " dropdown " , " OPTIONS_DROPDOWN_TEMPLATE " )
local options_switch_template = DF : GetTemplate ( " switch " , " OPTIONS_CHECKBOX_TEMPLATE " )
local options_slider_template = DF : GetTemplate ( " slider " , " OPTIONS_SLIDER_TEMPLATE " )
local options_button_template = DF : GetTemplate ( " button " , " OPTIONS_BUTTON_TEMPLATE " )
local menu = {
{
type = " select " ,
get = function ( ) return Vanguard.db . tank_block_texture end ,
values = function ( ) return tank_texture_menu end ,
--desc = "Choose the texture used on tank blocks.",
name = " Texture "
} ,
{ type = " blank " } ,
{
type = " toggle " ,
get = function ( ) return Vanguard.db . show_inc_bars end ,
set = function ( self , fixedparam , value ) Vanguard.db . show_inc_bars = value ; Vanguard : ResetBars ( ) end ,
--desc = "Shows the incoming heal vs incoming damage.",
name = " Show Incoming Damage "
} ,
{
type = " range " ,
get = function ( ) return Vanguard.db . bar_height end ,
set = function ( self , fixedparam , value )
Vanguard.db . bar_height = value
Vanguard : ResetBars ( )
Vanguard : RefreshTanks ( )
end ,
min = 10 ,
max = 50 ,
step = 1 ,
--desc = "Inc Damage Height",
name = " Incoming Damage Height " ,
} ,
{ type = " blank " } ,
{
type = " toggle " ,
get = function ( ) return Vanguard.db . show_health_bar end ,
set = function ( self , fixedparam , value ) Vanguard.db . show_health_bar = value ; Vanguard : RefreshTanks ( ) ; Vanguard : ResetBars ( ) end ,
name = " Show Health Bar "
} ,
{
type = " toggle " ,
get = function ( ) return Vanguard.db . show_cast_bar end ,
set = function ( self , fixedparam , value ) Vanguard.db . show_cast_bar = value ; Vanguard : RefreshTanks ( ) ; Vanguard : ResetBars ( ) end ,
name = " Show Cast Bar "
} ,
{
type = " toggle " ,
get = function ( ) return Vanguard.db . show_power_bar end ,
set = function ( self , fixedparam , value ) Vanguard.db . show_power_bar = value ; Vanguard : RefreshTanks ( ) ; Vanguard : ResetBars ( ) end ,
name = " Show Power Bar "
} ,
{
type = " range " ,
get = function ( ) return Vanguard.db . tank_block_size end ,
set = function ( self , fixedparam , value ) Vanguard.db . tank_block_size = value ; Vanguard : RefreshTanks ( ) end ,
min = 70 ,
max = 250 ,
step = 1 ,
--desc = "Set the width of the blocks showing the tanks.",
name = " Health Bar Width " ,
} ,
{
type = " range " ,
get = function ( ) return Vanguard.db . tank_block_size_height end ,
set = function ( self , fixedparam , value ) Vanguard.db . tank_block_size_height = value ; Vanguard : RefreshTanks ( ) end ,
min = 10 ,
max = 100 ,
step = 1 ,
name = " Health Bar Height " ,
} ,
{
type = " range " ,
get = function ( ) return Vanguard.db . tank_block_castbar_size_height end ,
set = function ( self , fixedparam , value ) Vanguard.db . tank_block_castbar_size_height = value ; Vanguard : RefreshTanks ( ) end ,
min = 10 ,
max = 60 ,
step = 1 ,
name = " Cast Bar Height " ,
} ,
{
type = " range " ,
get = function ( ) return Vanguard.db . tank_block_powerbar_size_height end ,
set = function ( self , fixedparam , value ) Vanguard.db . tank_block_powerbar_size_height = value ; Vanguard : RefreshTanks ( ) end ,
min = 10 ,
max = 60 ,
step = 1 ,
name = " Power Bar Height " ,
} ,
{
type = " color " ,
get = function ( ) return Vanguard.db . tank_block_color end ,
set = function ( self , r , g , b , a )
local current = Vanguard.db . tank_block_color ;
current [ 1 ] , current [ 2 ] , current [ 3 ] , current [ 4 ] = r , g , b , a ;
Vanguard : RefreshTanks ( )
end ,
--desc = "Select the color of the tank block background.",
name = " Health Bar Background Color "
} ,
{ type = " blank " } ,
{
type = " range " ,
get = function ( ) return Vanguard.db . aura_offset_y end ,
set = function ( self , fixedparam , value ) Vanguard.db . aura_offset_y = value ; Vanguard.RefreshWidgets ( ) end ,
min = - 20 ,
max = 20 ,
step = 1 ,
name = " Debuff Y Offset " ,
} ,
{
type = " range " ,
get = function ( ) return Vanguard.db . aura_timer_text_size end ,
set = function ( self , fixedparam , value ) Vanguard.db . aura_timer_text_size = value ; Vanguard.RefreshWidgets ( ) end ,
min = 6 ,
max = 24 ,
step = 1 ,
name = " Debuff Text Size " ,
} ,
}
options_frame : SetSize ( 500 , 400 )
Vanguard : GetFramework ( ) : BuildMenu ( options_frame , menu , 15 , - 50 , 460 , true , options_text_template , options_dropdown_template , options_switch_template , true , options_slider_template , options_button_template )
end
Vanguard.OpenOptionsPanel = function ( )
if ( not VanguardOptionsWindow ) then
build_options_panel ( )
end
VanguardOptionsWindow : Show ( )
end
local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo
function Vanguard : OnEvent ( _ , event , arg1 , token , time , who_serial , who_name , who_flags , _ , alvo_serial , alvo_name , alvo_flags , _ , spellid , spellname , spellschool , tipo )
if ( event == " ADDON_LOADED " ) then
local AddonName = arg1
if ( AddonName == " Details_Vanguard " ) then
if ( _G.Details ) then
if ( DetailsFramework.IsClassicWow ( ) ) then
return
end
local MINIMAL_DETAILS_VERSION_REQUIRED = 1
local default_saved_table = {
show_inc_bars = true ,
tank_block_size = 150 ,
tank_block_height = 40 ,
tank_block_color = { 0.074509 , 0.035294 , 0.035294 , 0.832845 } ,
tank_block_texture = " Details Serenity " ,
first_run = false ,
bar_height = 24 ,
aura_timer_text_size = 14 ,
aura_offset_y = 0 ,
show_health_bar = true ,
show_power_bar = false ,
show_cast_bar = false ,
tank_block_size_height = 50 ,
tank_block_castbar_size_height = 16 ,
tank_block_powerbar_size_height = 10 ,
}
--Install
function Vanguard : OnDetailsEvent ( ) end --dummy func to stop warnings.
local install , saveddata = _G.Details : InstallPlugin ( " TANK " , " Vanguard " , " Interface \\ Icons \\ INV_Shield_04 " , Vanguard , " DETAILS_PLUGIN_VANGUARD " , MINIMAL_DETAILS_VERSION_REQUIRED , " Terciob " , " v3.0 " , default_saved_table )
if ( type ( install ) == " table " and install.error ) then
print ( install.error )
end
--Vanguard.db.first_run = false --debug
--create widgets
CreatePluginFrames ( )
--Register needed events
_G.Details : RegisterEvent ( Vanguard , " COMBAT_PLAYER_ENTER " )
_G.Details : RegisterEvent ( Vanguard , " COMBAT_PLAYER_LEAVE " )
_G.Details : RegisterEvent ( Vanguard , " DETAILS_INSTANCE_ENDRESIZE " )
_G.Details : RegisterEvent ( Vanguard , " DETAILS_INSTANCE_SIZECHANGED " )
_G.Details : RegisterEvent ( Vanguard , " GROUP_ONLEAVE " )
_G.Details : RegisterEvent ( Vanguard , " DETAILS_OPTIONS_MODIFIED " )
VanguardFrame : RegisterEvent ( " ZONE_CHANGED_NEW_AREA " )
VanguardFrame : RegisterEvent ( " PLAYER_ENTERING_WORLD " )
end
end
elseif ( event == " ROLE_CHANGED_INFORM " or event == " GROUP_ROSTER_UPDATE " ) then --raid changes
if ( Vanguard.CurrentInstance ) then
Vanguard : IdentifyTanks ( )
end
elseif ( event == " ZONE_CHANGED_NEW_AREA " or event == " PLAYER_ENTERING_WORLD " ) then --logon or map changes
if ( Vanguard.CurrentInstance ) then
Vanguard : IdentifyTanks ( )
end
end
end