local sIsRestoredAfterDc = false ;
VUHDO_IN_COMBAT_RELOG = false ;
VUHDO_DEBUG = { } ;
VUHDO_RAID = { } ;
local VUHDO_RAID ;
VUHDO_RAID_NAMES = { } ;
local VUHDO_RAID_NAMES = VUHDO_RAID_NAMES ;
VUHDO_GROUPS = { } ;
local VUHDO_GROUPS = VUHDO_GROUPS ;
VUHDO_RAID_GUIDS = { } ;
local VUHDO_RAID_GUIDS = VUHDO_RAID_GUIDS ;
VUHDO_EMERGENCIES = { } ;
local VUHDO_EMERGENCIES = VUHDO_EMERGENCIES ;
VUHDO_CLUSTER_BASE_RAID = { } ;
local VUHDO_CLUSTER_BASE_RAID = VUHDO_CLUSTER_BASE_RAID ;
VUHDO_PLAYER_TARGETS = { } ;
local VUHDO_IS_SUSPICIOUS_ROSTER = false ;
local VUHDO_RAID_SORTED = { } ;
local VUHDO_MAINTANKS = { } ;
local VUHDO_INTERNAL_TOGGLES = { } ;
local VUHDO_PANEL_UNITS = { } ;
setmetatable ( VUHDO_PANEL_UNITS , VUHDO_META_NEW_ARRAY ) ;
-- TODO: make local
VUHDO_BOSS_UNITS = { } ;
local VUHDO_MAX_BOSS_FRAMES = 8 ;
for i = 1 , VUHDO_MAX_BOSS_FRAMES do -- FIXME: Blizzard forgot to update the MAX_BOSS_FRAMES constant for 9.2
local bossUnitId = format ( " boss%d " , i ) ;
VUHDO_BOSS_UNITS [ bossUnitId ] = true ;
end
VUHDO_PLAYER_CLASS = nil ;
VUHDO_PLAYER_NAME = nil ;
VUHDO_PLAYER_RAID_ID = nil ;
VUHDO_PLAYER_GROUP = nil ;
-- Backdrops
BACKDROP_VUHDO_TOOLTIP = {
bgFile = " Interface \\ Tooltips \\ UI-Tooltip-Background " ,
edgeFile = " Interface \\ Tooltips \\ UI-Tooltip-Border " ,
tile = true ,
tileSize = 8 ,
edgeSize = 8 ,
insets = { left = 3 , right = 3 , top = 3 , bottom = 3 } ,
} ;
-- BURST CACHE ---------------------------------------------------
local VUHDO_CONFIG ;
local VUHDO_PET_2_OWNER ;
local VUHDO_OWNER_2_PET ;
local VUHDO_getUnitIds ;
local VUHDO_getUnitNo ;
local VUHDO_isInRange ;
local VUHDO_determineDebuff ;
local VUHDO_getUnitGroup ;
local VUHDO_tableUniqueAdd ;
local VUHDO_getTargetUnit ;
local VUHDO_updateHealthBarsFor ;
local VUHDO_trimInspected ;
local VUHDO_getPlayerRaidUnit ;
local VUHDO_getModelType ;
local VUHDO_isConfigDemoUsers ;
local VUHDO_updateBouquetsForEvent ;
local VUHDO_resetClusterCoordDeltas ;
local VUHDO_getUnitZoneName ;
local VUHDO_isModelInPanel ;
local VUHDO_isAltPowerActive ;
local VUHDO_isModelConfigured ;
local VUHDO_determineRole ;
local VUHDO_getUnitHealthPercent ;
local VUHDO_isUnitInModel ;
local VUHDO_isUnitInModelIterative ;
local VUHDO_isUnitInPanel ;
local VUHDO_initDynamicPanelModels ;
local VUHDO_updateBuffRaidGroup ;
local GetRaidTargetIndex = GetRaidTargetIndex ;
local UnitIsDeadOrGhost = UnitIsDeadOrGhost ;
local UnitIsFeignDeath = UnitIsFeignDeath ;
local UnitExists = UnitExists ;
local UnitHealth = UnitHealth ;
-- Disable local alias so function can be overloaded by Velhari Health Fix addon
--local UnitHealthMax = UnitHealthMax;
local string = string ;
local UnitIsAFK = UnitIsAFK ;
local UnitIsConnected = UnitIsConnected ;
local UnitIsCharmed = UnitIsCharmed ;
local UnitInRaid = UnitInRaid ;
local UnitHasVehicleUI = UnitHasVehicleUI ;
local UnitTargetsVehicleInRaidUI = UnitTargetsVehicleInRaidUI ;
local UnitCanAttack = UnitCanAttack ;
local GetNumGroupMembers = GetNumGroupMembers ;
local UnitName = UnitName ;
local UnitPower = UnitPower ;
local UnitPowerMax = UnitPowerMax ;
local UnitThreatSituation = UnitThreatSituation ;
local UnitClass = UnitClass ;
local UnitPowerType = UnitPowerType ;
local UnitHasVehicleUI = UnitHasVehicleUI ;
local UnitGroupRolesAssigned = UnitGroupRolesAssigned ;
local GetRaidRosterInfo = GetRaidRosterInfo ;
local InCombatLockdown = InCombatLockdown ;
local IsInRaid = IsInRaid ;
local table = table ;
local UnitGUID = UnitGUID ;
local tinsert = tinsert ;
local tremove = tremove ;
local strfind = strfind ;
--local VUHDO_PANEL_MODELS;
local GetTime = GetTime ;
local pairs = pairs ;
local ipairs = ipairs ;
local twipe = table.wipe ;
local tsort = table.sort ;
local _ ;
local sTrigger ;
local sCurrentMode ;
function VUHDO_vuhdoInitLocalOverrides ( )
VUHDO_CONFIG = _G [ " VUHDO_CONFIG " ] ;
VUHDO_RAID = _G [ " VUHDO_RAID " ] ;
VUHDO_PET_2_OWNER = _G [ " VUHDO_PET_2_OWNER " ] ;
VUHDO_OWNER_2_PET = _G [ " VUHDO_OWNER_2_PET " ] ;
VUHDO_getUnitIds = _G [ " VUHDO_getUnitIds " ] ;
VUHDO_getUnitNo = _G [ " VUHDO_getUnitNo " ] ;
VUHDO_isInRange = _G [ " VUHDO_isInRange " ] ;
VUHDO_determineDebuff = _G [ " VUHDO_determineDebuff " ] ;
VUHDO_getUnitGroup = _G [ " VUHDO_getUnitGroup " ] ;
VUHDO_updateHealthBarsFor = _G [ " VUHDO_updateHealthBarsFor " ] ;
VUHDO_tableUniqueAdd = _G [ " VUHDO_tableUniqueAdd " ] ;
VUHDO_trimInspected = _G [ " VUHDO_trimInspected " ] ;
VUHDO_getTargetUnit = _G [ " VUHDO_getTargetUnit " ] ;
VUHDO_getModelType = _G [ " VUHDO_getModelType " ] ;
VUHDO_isModelInPanel = _G [ " VUHDO_isModelInPanel " ] ;
VUHDO_isAltPowerActive = _G [ " VUHDO_isAltPowerActive " ] ;
VUHDO_getPlayerRaidUnit = _G [ " VUHDO_getPlayerRaidUnit " ] ;
VUHDO_isModelConfigured = _G [ " VUHDO_isModelConfigured " ] ;
VUHDO_isUnitInModel = _G [ " VUHDO_isUnitInModel " ] ;
VUHDO_isUnitInModelIterative = _G [ " VUHDO_isUnitInModelIterative " ] ;
VUHDO_isUnitInPanel = _G [ " VUHDO_isUnitInPanel " ] ;
VUHDO_initDynamicPanelModels = _G [ " VUHDO_initDynamicPanelModels " ] ;
VUHDO_updateBuffRaidGroup = _G [ " VUHDO_updateBuffRaidGroup " ] ;
--VUHDO_PANEL_MODELS = _G["VUHDO_PANEL_MODELS"];
VUHDO_determineRole = _G [ " VUHDO_determineRole " ] ;
VUHDO_getUnitHealthPercent = _G [ " VUHDO_getUnitHealthPercent " ] ;
VUHDO_isConfigDemoUsers = _G [ " VUHDO_isConfigDemoUsers " ] ;
VUHDO_updateBouquetsForEvent = _G [ " VUHDO_updateBouquetsForEvent " ] ;
VUHDO_resetClusterCoordDeltas = _G [ " VUHDO_resetClusterCoordDeltas " ] ;
VUHDO_getUnitZoneName = _G [ " VUHDO_getUnitZoneName " ] ;
VUHDO_INTERNAL_TOGGLES = _G [ " VUHDO_INTERNAL_TOGGLES " ] ;
VUHDO_PANEL_UNITS = _G [ " VUHDO_PANEL_UNITS " ] ;
sTrigger = VUHDO_CONFIG [ " EMERGENCY_TRIGGER " ] ;
sCurrentMode = VUHDO_CONFIG [ " MODE " ] ;
VUHDO_DEFAULT_PROFILE = _G [ " VUHDO_DEFAULT_PROFILE " ] ;
VUHDO_DEFAULT_LAYOUT = _G [ " VUHDO_DEFAULT_LAYOUT " ] ;
end
----------------------------------------------------
local VUHDO_UNIT_AFK_DC = { } ;
--
local function VUHDO_updateAllRaidNames ( )
twipe ( VUHDO_RAID_NAMES ) ;
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
if not VUHDO_isSpecialUnit ( tUnit ) then
-- ensure not to overwrite a player name with a pet's identical name
if not VUHDO_RAID_NAMES [ tInfo [ " name " ] ] or not tInfo [ " isPet " ] then
VUHDO_RAID_NAMES [ tInfo [ " name " ] ] = tUnit ;
end
end
end
end
--
local function VUHDO_isValidEmergency ( anInfo )
return not anInfo [ " isPet " ] and anInfo [ " range " ] and not anInfo [ " dead " ]
and anInfo [ " connected " ] and not anInfo [ " charmed " ] ;
end
--
local function VUHDO_setTopEmergencies ( aMaxAnz )
twipe ( VUHDO_EMERGENCIES ) ;
for tIndex , tUnit in ipairs ( VUHDO_RAID_SORTED ) do
VUHDO_EMERGENCIES [ tUnit ] = tIndex ;
if tIndex == aMaxAnz then return ; end
end
end
--
local VUHDO_EMERGENCY_SORTERS = {
[ VUHDO_MODE_EMERGENCY_MOST_MISSING ]
= function ( aUnit , anotherUnit )
return VUHDO_RAID [ aUnit ] [ " healthmax " ] - VUHDO_RAID [ aUnit ] [ " health " ]
> VUHDO_RAID [ anotherUnit ] [ " healthmax " ] - VUHDO_RAID [ anotherUnit ] [ " health " ] ;
end ,
[ VUHDO_MODE_EMERGENCY_PERC ]
= function ( aUnit , anotherUnit )
return VUHDO_RAID [ aUnit ] [ " health " ] / VUHDO_RAID [ aUnit ] [ " healthmax " ]
< VUHDO_RAID [ anotherUnit ] [ " health " ] / VUHDO_RAID [ anotherUnit ] [ " healthmax " ] ;
end ,
[ VUHDO_MODE_EMERGENCY_LEAST_LEFT ]
= function ( aUnit , anotherUnit )
return VUHDO_RAID [ aUnit ] [ " health " ] < VUHDO_RAID [ anotherUnit ] [ " health " ] ;
end ,
}
--
local function VUHDO_sortEmergencies ( )
twipe ( VUHDO_RAID_SORTED ) ;
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
if not VUHDO_isSpecialUnit ( tUnit )
and VUHDO_getUnitHealthPercent ( tInfo ) < sTrigger and VUHDO_isValidEmergency ( tInfo ) then
VUHDO_RAID_SORTED [ # VUHDO_RAID_SORTED + 1 ] = tUnit ;
end
end
tsort ( VUHDO_RAID_SORTED , VUHDO_EMERGENCY_SORTERS [ sCurrentMode ] ) ;
VUHDO_setTopEmergencies ( VUHDO_CONFIG [ " MAX_EMERGENCIES " ] ) ;
end
-- Avoid reordering sorting by max-health if someone dies or gets offline
local tEmptyInfo = { } ;
local function VUHDO_getUnitSortMaxHp ( aUnit )
return VUHDO_RAID [ aUnit ] [
( ( VUHDO_RAID [ aUnit ] or tEmptyInfo ) [ " sortMaxHp " ] ~= nil and InCombatLockdown ( ) )
and " sortMaxHp " or " healthmax "
] ;
end
--
local tIsAfk ;
local tIsConnected ;
local function VUHDO_updateAfkDc ( aUnit )
tIsAfk = UnitIsAFK ( aUnit ) ;
tIsConnected = UnitIsConnected ( aUnit ) ;
if tIsAfk or not tIsConnected then
if not VUHDO_UNIT_AFK_DC [ aUnit ] then VUHDO_UNIT_AFK_DC [ aUnit ] = GetTime ( ) ; end
else
VUHDO_UNIT_AFK_DC [ aUnit ] = nil ;
end
return tIsAfk , tIsConnected , VUHDO_RAID [ aUnit ] ~= nil and tIsConnected ~= VUHDO_RAID [ aUnit ] [ " connected " ] ;
end
--
function VUHDO_getAfkDcTime ( aUnit )
return VUHDO_UNIT_AFK_DC [ aUnit ] ;
end
-- Sets a Member info into raid array
local tUnitId ;
local tIsPet ;
local tClassName ;
local tPowerType ;
local tIsAfk , tIsConnected ;
local tLocalClass ;
local tIsDead ;
local tClassId ;
local tInfo ;
local tNewHealth ;
local tName , tRealm ;
local tIsDcChange ;
local tOwner ;
function VUHDO_setHealth ( aUnit , aMode )
tInfo = VUHDO_RAID [ aUnit ] ;
tUnitId = VUHDO_getUnitIds ( ) ;
tOwner = VUHDO_PET_2_OWNER [ aUnit ] ;
tIsPet = tOwner ~= nil ;
if strfind ( aUnit , tUnitId , 1 , true ) or tIsPet or aUnit == " player " or VUHDO_isSpecialUnit ( aUnit ) then
tIsDead = UnitIsDeadOrGhost ( aUnit ) and not UnitIsFeignDeath ( aUnit ) ;
if tIsDead then
VUHDO_removeAllDebuffIcons ( aUnit ) ;
VUHDO_removeHots ( aUnit ) ;
VUHDO_initEventBouquetsFor ( aUnit ) ;
end
if 1 == aMode then -- VUHDO_UPDATE_ALL
tLocalClass , tClassName = UnitClass ( aUnit ) ;
tPowerType = UnitPowerType ( aUnit ) ;
tIsAfk , tIsConnected , _ = VUHDO_updateAfkDc ( aUnit ) ;
if not VUHDO_RAID [ aUnit ] then VUHDO_RAID [ aUnit ] = { } ; end
tInfo = VUHDO_RAID [ aUnit ] ;
tInfo [ " ownerUnit " ] = tOwner ;
if tIsPet and tClassId then
if VUHDO_USER_CLASS_COLORS [ " petClassColor " ] and VUHDO_RAID [ tInfo [ " ownerUnit " ] ] then
tClassId = VUHDO_RAID [ tInfo [ " ownerUnit " ] ] [ " classId " ] or VUHDO_ID_PETS ;
else
tClassId = VUHDO_ID_PETS ;
end
else
tClassId = VUHDO_CLASS_IDS [ tClassName ] ;
end
tName , tRealm = UnitName ( aUnit ) ;
tInfo [ " healthmax " ] = UnitHealthMax ( aUnit ) ;
tInfo [ " health " ] = UnitHealth ( aUnit ) ;
tInfo [ " name " ] = tName ;
tInfo [ " number " ] = VUHDO_getUnitNo ( aUnit ) ;
tInfo [ " unit " ] = aUnit ;
tInfo [ " class " ] = tClassName ;
tInfo [ " range " ] = VUHDO_isInRange ( aUnit ) ;
tInfo [ " debuff " ] , tInfo [ " debuffName " ] = VUHDO_determineDebuff ( aUnit ) ;
tInfo [ " isPet " ] = tIsPet ;
tInfo [ " powertype " ] = tonumber ( tPowerType ) ;
tInfo [ " power " ] = UnitPower ( aUnit ) ;
tInfo [ " powermax " ] = UnitPowerMax ( aUnit ) ;
tInfo [ " charmed " ] = UnitIsCharmed ( aUnit ) and UnitCanAttack ( " player " , aUnit ) ;
tInfo [ " aggro " ] = false ;
tInfo [ " group " ] = VUHDO_getUnitGroup ( aUnit , tIsPet ) ;
tInfo [ " dead " ] = tIsDead ;
tInfo [ " afk " ] = tIsAfk ;
tInfo [ " connected " ] = tIsConnected ;
tInfo [ " threat " ] = UnitThreatSituation ( aUnit ) or 0 ;
tInfo [ " threatPerc " ] = 0 ;
tInfo [ " isVehicle " ] = UnitHasVehicleUI ( aUnit ) ;
tInfo [ " petUnit " ] = VUHDO_OWNER_2_PET [ aUnit ] ;
tInfo [ " targetUnit " ] = VUHDO_getTargetUnit ( aUnit ) ;
tInfo [ " classId " ] = tClassId ;
tInfo [ " sortMaxHp " ] = VUHDO_getUnitSortMaxHp ( aUnit ) ;
tInfo [ " role " ] = VUHDO_determineRole ( aUnit ) ;
tInfo [ " fullName " ] = ( tRealm or " " ) ~= " " and ( tName .. " - " .. tRealm ) or tName ;
tInfo [ " raidIcon " ] = GetRaidTargetIndex ( aUnit ) ;
tInfo [ " visible " ] = UnitIsVisible ( aUnit ) ; -- Reihenfolge beachten
tInfo [ " zone " ] , tInfo [ " map " ] = VUHDO_getUnitZoneName ( aUnit ) ; -- ^^
tInfo [ " baseRange " ] = UnitInRange ( aUnit ) or " player " == aUnit ;
tInfo [ " isAltPower " ] = VUHDO_isAltPowerActive ( aUnit ) ;
--[[tInfo["missbuff"] = nil;
tInfo [ " mibucateg " ] = nil ;
tInfo [ " mibuvariants " ] = nil ; ] ]
if tLocalClass == tName then
tInfo [ " className " ] = UnitCreatureType ( aUnit ) or " " ;
else
tInfo [ " className " ] = tLocalClass or " " ;
end
if not VUHDO_isSpecialUnit ( aUnit ) then
if not tIsPet and tInfo [ " fullName " ] == tName and VUHDO_RAID_NAMES [ tName ] then
VUHDO_IS_SUSPICIOUS_ROSTER = true ;
end
-- ensure not to overwrite a player name with a pet's identical name
if not VUHDO_RAID_NAMES [ tName ] or not tIsPet then
VUHDO_RAID_NAMES [ tName ] = aUnit ;
end
end
elseif tInfo then
tIsAfk , tInfo [ " connected " ] , tIsDcChange = VUHDO_updateAfkDc ( aUnit ) ;
if tIsDcChange then
VUHDO_updateBouquetsForEvent ( aUnit , 19 ) ; -- VUHDO_UPDATE_DC
end
if 2 == aMode then -- VUHDO_UPDATE_HEALTH
tNewHealth = UnitHealth ( aUnit ) ;
if not tIsDead and tInfo [ " health " ] > 0 then
tInfo [ " lifeLossPerc " ] = tNewHealth / tInfo [ " health " ] ;
end
tInfo [ " health " ] = tNewHealth ;
if tInfo [ " dead " ] ~= tIsDead then
if not tIsDead then
tInfo [ " healthmax " ] = UnitHealthMax ( aUnit ) ;
end
tInfo [ " dead " ] = tIsDead ;
VUHDO_updateHealthBarsFor ( aUnit , 10 ) ; -- VUHDO_UPDATE_ALIVE
VUHDO_updateBouquetsForEvent ( aUnit , 10 ) ; -- VUHDO_UPDATE_ALIVE
end
elseif 3 == aMode then -- VUHDO_UPDATE_HEALTH_MAX
tInfo [ " dead " ] = tIsDead ;
tInfo [ " healthmax " ] = UnitHealthMax ( aUnit ) ;
tInfo [ " sortMaxHp " ] = VUHDO_getUnitSortMaxHp ( aUnit ) ;
elseif 6 == aMode then -- VUHDO_UPDATE_AFK
tInfo [ " afk " ] = tIsAfk ;
end
tInfo [ " dead " ] = tIsDead ;
end
end
end
local VUHDO_setHealth = VUHDO_setHealth ;
--
local function VUHDO_setHealthSafe ( aUnit , aMode )
if UnitExists ( aUnit ) then VUHDO_setHealth ( aUnit , aMode ) ; end
end
-- Callback for UNIT_HEALTH / UNIT_MAXHEALTH events
local tOwner ;
local tIsPet ;
function VUHDO_updateHealth ( aUnit , aMode )
-- as of patch 7.1 we are seeing empty units on health related events
if not aUnit then
return ;
end
tIsPet = VUHDO_RAID [ aUnit ] and VUHDO_RAID [ aUnit ] [ " isPet " ] ;
if not tIsPet or VUHDO_INTERNAL_TOGGLES [ 26 ] then -- VUHDO_UPDATE_PETS -- Enth�lt nur Pets als eigene Balken, vehicles werden ?ber owner dargestellt s.unten
VUHDO_setHealth ( aUnit , aMode ) ;
VUHDO_updateHealthBarsFor ( aUnit , aMode ) ;
end
if tIsPet then -- Vehikel?
tOwner = VUHDO_RAID [ aUnit ] [ " ownerUnit " ] ;
-- tOwner may not be present when leaving a vehicle
if VUHDO_RAID [ tOwner ] and VUHDO_RAID [ tOwner ] [ " isVehicle " ] then
VUHDO_setHealth ( tOwner , aMode ) ;
VUHDO_updateHealthBarsFor ( tOwner , aMode ) ;
end
end
if 1 ~= sCurrentMode -- VUHDO_MODE_NEUTRAL
and ( 2 == aMode or 3 == aMode ) then -- VUHDO_UPDATE_HEALTH -- VUHDO_UPDATE_HEALTH_MAX
-- Remove old emergencies
VUHDO_FORCE_RESET = true ;
for tUnit , _ in pairs ( VUHDO_EMERGENCIES ) do
VUHDO_updateHealthBarsFor ( tUnit , 11 ) ; -- VUHDO_UPDATE_EMERGENCY
end
VUHDO_sortEmergencies ( ) ;
-- Set new Emergencies
VUHDO_FORCE_RESET = false ;
for tUnit , _ in pairs ( VUHDO_EMERGENCIES ) do
VUHDO_updateHealthBarsFor ( tUnit , 11 ) ; -- VUHDO_UPDATE_EMERGENCY
end
end
end
--
local tIcon ;
function VUHDO_updateAllRaidTargetIndices ( )
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
tIcon = GetRaidTargetIndex ( tUnit ) ;
if tInfo [ " raidIcon " ] ~= tIcon then
tInfo [ " raidIcon " ] = tIcon ;
VUHDO_updateBouquetsForEvent ( tUnit , 24 ) ; -- VUHDO_UPDATE_RAID_TARGET
end
end
end
-- Add to groups 1-8
local function VUHDO_addUnitToGroup ( aUnit , aGroupNum )
if " player " ~= aUnit or not VUHDO_CONFIG [ " OMIT_SELF " ] then
if not VUHDO_CONFIG [ " OMIT_OWN_GROUP " ] or aGroupNum ~= VUHDO_PLAYER_GROUP then
tinsert ( VUHDO_GROUPS [ aGroupNum ] or { } , aUnit ) ;
end
if VUHDO_PLAYER_GROUP == aGroupNum then tinsert ( VUHDO_GROUPS [ 10 ] , aUnit ) ; end -- VUHDO_ID_GROUP_OWN
end
end
--
local function VUHDO_addUnitToClass ( aUnit , aClassId )
if ( " player " ~= aUnit or not VUHDO_CONFIG [ " OMIT_SELF " ] ) and aClassId then
tinsert ( VUHDO_GROUPS [ aClassId ] , aUnit ) ;
end
end
--
local function VUHDO_removeUnitFromRaidGroups ( aUnit )
for tModelId , tAllUnits in pairs ( VUHDO_GROUPS ) do
if tModelId ~= 41 and tModelId ~= 42 and tModelId ~= 43 and tModelId ~= 44 then -- VUHDO_ID_MAINTANKS -- VUHDO_ID_PRIVATE_TANKS -- VUHDO_ID_MAIN_ASSISTS -- VUHDO_ID_BOSSES
for tIndex , tUnit in pairs ( tAllUnits ) do
if tUnit == aUnit then tremove ( tAllUnits , tIndex ) ; end
end
end
end
end
--
local function VUHDO_removeSpecialFromAllRaidGroups ( )
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
if VUHDO_CONFIG [ " OMIT_MAIN_TANKS " ] and VUHDO_isModelConfigured ( 41 ) and VUHDO_isUnitInModelIterative ( tUnit , 41 ) then -- VUHDO_ID_MAINTANKS
VUHDO_removeUnitFromRaidGroups ( tUnit ) ; -- VUHDO_ID_MAINTANKS
elseif VUHDO_CONFIG [ " OMIT_PLAYER_TARGETS " ] and VUHDO_isModelConfigured ( 42 ) and VUHDO_isUnitInModelIterative ( tUnit , 42 ) then -- VUHDO_ID_PRIVATE_TANKS
VUHDO_removeUnitFromRaidGroups ( tUnit ) ; -- VUHDO_ID_PRIVATE_TANKS
elseif VUHDO_CONFIG [ " OMIT_MAIN_ASSIST " ] and VUHDO_isModelConfigured ( 43 ) and VUHDO_isUnitInModelIterative ( tUnit , 43 ) then -- VUHDO_ID_MAIN_ASSISTS
VUHDO_removeUnitFromRaidGroups ( tUnit ) ; -- VUHDO_ID_MAIN_ASSISTS
elseif VUHDO_isModelConfigured ( 44 ) and VUHDO_isUnitInModelIterative ( tUnit , 44 ) then -- VUHDO_ID_BOSSES
VUHDO_removeUnitFromRaidGroups ( tUnit ) ; -- VUHDO_ID_BOSSES
end
end
end
--
local tRole ;
local function VUHDO_addUnitToSpecial ( aUnit )
if VUHDO_CONFIG [ " OMIT_DFT_MTS " ] and " TANK " == ( UnitGroupRolesAssigned ( aUnit ) ) then
tinsert ( VUHDO_GROUPS [ 41 ] , aUnit ) ; -- VUHDO_ID_MAINTANKS
return ;
end
if not IsInRaid ( ) then return ; end
_ , _ , _ , _ , _ , _ , _ , _ , _ , tRole = GetRaidRosterInfo ( VUHDO_RAID [ aUnit ] [ " number " ] ) ;
if " MAINTANK " == tRole then tinsert ( VUHDO_GROUPS [ 41 ] , aUnit ) ; -- VUHDO_ID_MAINTANKS
elseif " MAINASSIST " == tRole then tinsert ( VUHDO_GROUPS [ 43 ] , aUnit ) ; end -- VUHDO_ID_MAIN_ASSISTS
end
--
local function VUHDO_addUnitToCtraMainTanks ( )
local tUnit ;
for tCnt = 1 , 8 do -- VUHDO_MAX_MTS
tUnit = VUHDO_MAINTANKS [ tCnt ] ;
if tUnit then VUHDO_tableUniqueAdd ( VUHDO_GROUPS [ 41 ] , tUnit ) ; end -- VUHDO_ID_MAINTANKS
end
end
--
local function VUHDO_addUnitToPrivateTanks ( )
if not VUHDO_CONFIG [ " OMIT_TARGET " ] then tinsert ( VUHDO_GROUPS [ 42 ] , " target " ) ; end -- VUHDO_ID_PRIVATE_TANKS
if not VUHDO_CONFIG [ " OMIT_FOCUS " ] then tinsert ( VUHDO_GROUPS [ 42 ] , " focus " ) ; end -- VUHDO_ID_PRIVATE_TANKS
local tUnit ;
for tName , _ in pairs ( VUHDO_PLAYER_TARGETS ) do
tUnit = VUHDO_RAID_NAMES [ tName ] ;
if tUnit then VUHDO_tableUniqueAdd ( VUHDO_GROUPS [ 42 ] , tUnit ) ; -- VUHDO_ID_PRIVATE_TANKS
else VUHDO_PLAYER_TARGETS [ tName ] = nil ; end
end
end
--
local function VUHDO_addUnitToBosses ( )
for bossUnitId , _ in pairs ( VUHDO_BOSS_UNITS ) do
VUHDO_tableUniqueAdd ( VUHDO_GROUPS [ 44 ] , bossUnitId ) ; -- VUHDO_ID_BOSSES
end
end
--
local tVehicleInfo = { [ " isVehicle " ] = true } ;
local function VUHDO_addUnitToPets ( aPetUnit )
if ( VUHDO_RAID [ VUHDO_RAID [ aPetUnit ] [ " ownerUnit " ] ] or tVehicleInfo ) [ " isVehicle " ] then return ; end
tinsert ( VUHDO_GROUPS [ 40 ] , aPetUnit ) ; -- VUHDO_ID_PETS
end
--
local tRole ;
local function VUHDO_addUnitToRole ( aUnit )
if " player " == aUnit and VUHDO_CONFIG [ " OMIT_SELF " ] then return ; end
tRole = VUHDO_RAID [ aUnit ] [ " role " ] or 62 ; -- -- VUHDO_ID_RANGED_DAMAGE
tinsert ( VUHDO_GROUPS [ tRole ] , aUnit ) ;
if tRole == 63 or tRole == 62 then tinsert ( VUHDO_GROUPS [ 51 ] , aUnit ) ; -- VUHDO_ID_RANGED_HEAL -- VUHDO_ID_RANGED_DAMAGE -- VUHDO_ID_RANGED
elseif tRole == 61 or tRole == 60 then tinsert ( VUHDO_GROUPS [ 50 ] , aUnit ) ; end -- VUHDO_ID_MELEE_DAMAGE -- VUHDO_ID_MELEE_TANK -- VUHDO_ID_MELEE
end
--
local function VUHDO_addUnitToVehicles ( aUnit )
if VUHDO_RAID [ aUnit ] [ " petUnit " ] then tinsert ( VUHDO_GROUPS [ 70 ] , VUHDO_RAID [ aUnit ] [ " petUnit " ] ) ; end -- VUHDO_ID_VEHICLES
end
--
local function VUHDO_updateGroupArrays ( anWasMacroRestore )
-- Get an empty array for each group
for tType , tTypeMembers in pairs ( VUHDO_ID_TYPE_MEMBERS ) do
for _ , tMember in pairs ( tTypeMembers ) do
if not VUHDO_GROUPS [ tMember ] then VUHDO_GROUPS [ tMember ] = { } ;
else twipe ( VUHDO_GROUPS [ tMember ] ) ; end
end
end
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
if not tInfo [ " isPet " ] then
if not VUHDO_isSpecialUnit ( tUnit ) then
VUHDO_addUnitToGroup ( tUnit , tInfo [ " group " ] ) ;
VUHDO_addUnitToClass ( tUnit , tInfo [ " classId " ] ) ;
VUHDO_addUnitToVehicles ( tUnit ) ;
VUHDO_addUnitToSpecial ( tUnit ) ;
end
else
VUHDO_addUnitToPets ( tUnit ) ;
end
end
VUHDO_GROUPS [ 80 ] [ 1 ] = " player " ; -- VUHDO_ID_SELF
VUHDO_GROUPS [ 81 ] [ 1 ] = " pet " ; -- VUHDO_ID_SELF_PET
VUHDO_GROUPS [ 82 ] [ 1 ] = " target " ; -- VUHDO_ID_TARGET
VUHDO_GROUPS [ 83 ] [ 1 ] = " focus " ; -- VUHDO_ID_FOCUS
VUHDO_addUnitToCtraMainTanks ( ) ;
VUHDO_addUnitToPrivateTanks ( ) ;
VUHDO_addUnitToBosses ( ) ;
-- Need MTs for role estimation
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
if not VUHDO_isSpecialUnit ( tUnit ) and not tInfo [ " isPet " ] then
VUHDO_addUnitToRole ( tUnit ) ;
end
end
if not anWasMacroRestore then
VUHDO_removeSpecialFromAllRaidGroups ( ) ;
end
VUHDO_initDynamicPanelModels ( ) ;
end
-- Uniquely buffer all units defined in a panel
local tPanelUnits = { } ;
local tHasVehicles ;
local tVehicleUnit ;
local function VUHDO_updateAllPanelUnits ( )
VUHDO_resetRemoveFromRaidGroupsCache ( ) ;
for tPanelNum = 1 , 10 do -- VUHDO_MAX_PANELS
twipe ( VUHDO_PANEL_UNITS [ tPanelNum ] ) ;
if VUHDO_PANEL_MODELS [ tPanelNum ] then
tHasVehicles = VUHDO_isModelInPanel ( tPanelNum , 70 ) ; -- VUHDO_ID_VEHICLES
twipe ( tPanelUnits ) ;
for tUnit , _ in pairs ( VUHDO_RAID ) do
if VUHDO_isUnitInPanel ( tPanelNum , tUnit ) then tPanelUnits [ tUnit ] = tUnit ; end
if tHasVehicles and not VUHDO_RAID [ tUnit ] [ " isPet " ] then
tVehicleUnit = VUHDO_RAID [ tUnit ] [ " petUnit " ] ;
if tVehicleUnit then tPanelUnits [ tVehicleUnit ] = tVehicleUnit end -- e.g. "focus", "target"
end
end
if VUHDO_isModelInPanel ( tPanelNum , 42 ) then -- VUHDO_ID_PRIVATE_TANKS
if not VUHDO_CONFIG [ " OMIT_TARGET " ] then tPanelUnits [ " target " ] = " target " ; end
if not VUHDO_CONFIG [ " OMIT_FOCUS " ] then tPanelUnits [ " focus " ] = " focus " ; end
end
if VUHDO_isModelInPanel ( tPanelNum , 82 ) then -- VUHDO_ID_TARGET
tPanelUnits [ " target " ] = " target " ;
end
if VUHDO_isModelInPanel ( tPanelNum , 83 ) then -- VUHDO_ID_FOCUS
tPanelUnits [ " focus " ] = " focus " ;
end
for _ , tUnit in pairs ( tPanelUnits ) do
tinsert ( VUHDO_PANEL_UNITS [ tPanelNum ] , tUnit ) ;
end
end
end
end
--
local function VUHDO_updateAllGuids ( )
twipe ( VUHDO_RAID_GUIDS ) ;
for tUnit , _ in pairs ( VUHDO_RAID ) do
if tUnit ~= " focus " and tUnit ~= " target " then
VUHDO_RAID_GUIDS [ UnitGUID ( tUnit ) or 0 ] = tUnit ;
end
end
end
--
local function VUHDO_convertMainTanks ( )
-- Discard deprecated
for tCnt = 1 , 8 do -- VUHDO_MAX_MTS
if not VUHDO_RAID_NAMES [ VUHDO_MAINTANK_NAMES [ tCnt ] or " * " ] then
VUHDO_MAINTANK_NAMES [ tCnt ] = nil ;
end
end
-- Convert to units instead of names
twipe ( VUHDO_MAINTANKS ) ;
for tCnt , tName in pairs ( VUHDO_MAINTANK_NAMES ) do
VUHDO_MAINTANKS [ tCnt ] = VUHDO_RAID_NAMES [ tName ] ;
end
end
--
local function VUHDO_createClusterUnits ( )
twipe ( VUHDO_CLUSTER_BASE_RAID ) ;
VUHDO_resetClusterCoordDeltas ( ) ;
for tUnit , tInfo in pairs ( VUHDO_RAID ) do
if not tInfo [ " isPet " ] and " focus " ~= tUnit and " target " ~= tUnit then
VUHDO_CLUSTER_BASE_RAID [ # VUHDO_CLUSTER_BASE_RAID + 1 ] = tInfo ;
end
end
end
--
-- Reload all raid members into the raid array e.g. in case of raid roster change
function VUHDO_reloadRaidMembers ( )
local tPlayer ;
local tMaxMembers ;
local tUnit , tPetUnit ;
local tWasRestored = false ;
VUHDO_IS_SUSPICIOUS_ROSTER = false ;
if GetNumGroupMembers ( ) == 0 and not UnitExists ( " party1 " ) and not sIsRestoredAfterDc then
VUHDO_IN_COMBAT_RELOG = true ;
tWasRestored = VUHDO_buildRaidFromMacro ( ) ;
VUHDO_updateAllRaidNames ( ) ;
if ( tWasRestored ) then
VUHDO_normalRaidReload ( true ) ;
end
sIsRestoredAfterDc = true ;
elseif VUHDO_isConfigDemoUsers ( ) then
VUHDO_demoSetupResetUsers ( ) ;
VUHDO_reloadRaidDemoUsers ( ) ;
VUHDO_updateAllRaidNames ( ) ;
else
VUHDO_PLAYER_RAID_ID = VUHDO_getPlayerRaidUnit ( ) ;
VUHDO_IN_COMBAT_RELOG = false ;
sIsRestoredAfterDc = true ;
tUnit , tPetUnit = VUHDO_getUnitIds ( ) ;
tMaxMembers = ( " raid " == tUnit ) and GetNumGroupMembers ( ) or ( " party " == tUnit ) and 4 or 0 ;
twipe ( VUHDO_RAID ) ;
twipe ( VUHDO_RAID_NAMES ) ;
for tCnt = 1 , tMaxMembers do
tPlayer = tUnit .. tCnt ;
if UnitExists ( tPlayer ) and tPlayer ~= VUHDO_PLAYER_RAID_ID then
VUHDO_setHealth ( tPlayer , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_setHealthSafe ( tPetUnit .. tCnt , 1 ) ; -- VUHDO_UPDATE_ALL
end
end
VUHDO_setHealthSafe ( " player " , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_setHealthSafe ( " pet " , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_setHealthSafe ( " focus " , 1 ) ; -- VUHDO_UPDATE_ALL
if VUHDO_INTERNAL_TOGGLES [ 27 ] then -- VUHDO_UPDATE_PLAYER_TARGET
VUHDO_setHealthSafe ( " target " , 1 ) ; -- VUHDO_UPDATE_ALL
end
for bossUnitId , _ in pairs ( VUHDO_BOSS_UNITS ) do
if UnitExists ( bossUnitId ) then
VUHDO_setHealth ( bossUnitId , 1 ) ; -- VUHDO_UPDATE_ALL
else
-- FIXME: find a more efficient way to trigger boss removal
VUHDO_removeHots ( bossUnitId ) ;
VUHDO_resetDebuffsFor ( bossUnitId ) ;
VUHDO_removeAllDebuffIcons ( bossUnitId ) ;
VUHDO_updateTargetBars ( bossUnitId ) ;
table.wipe ( VUHDO_RAID [ bossUnitId ] or tEmptyInfo ) ;
VUHDO_RAID [ bossUnitId ] = nil ;
VUHDO_updateHealthBarsFor ( bossUnitId , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_initEventBouquetsFor ( bossUnitId ) ;
end
end
VUHDO_TIMERS [ " MIRROR_TO_MACRO " ] = 8 ;
end
VUHDO_PLAYER_GROUP = VUHDO_getUnitGroup ( VUHDO_PLAYER_RAID_ID , false ) ;
VUHDO_trimInspected ( ) ;
VUHDO_convertMainTanks ( ) ;
VUHDO_updateGroupArrays ( tWasRestored ) ;
VUHDO_updateAllPanelUnits ( ) ;
VUHDO_updateAllGuids ( ) ;
VUHDO_updateBuffRaidGroup ( ) ;
VUHDO_updateBuffPanel ( ) ;
if sCurrentMode ~= 1 then VUHDO_sortEmergencies ( ) ; end -- VUHDO_MODE_NEUTRAL
VUHDO_createClusterUnits ( ) ;
if VUHDO_IS_SUSPICIOUS_ROSTER then VUHDO_normalRaidReload ( ) ; end
end
--
local tPlayer ;
local tMaxMembers ;
local tUnitType = " foo " ;
local tPetUnitType ;
local tInfo ;
local tIsDcChange ;
local tName , tRealm ;
local tOldUnitType ;
local tPet ;
function VUHDO_refreshRaidMembers ( )
VUHDO_PLAYER_RAID_ID = VUHDO_getPlayerRaidUnit ( ) ;
VUHDO_IN_COMBAT_RELOG = false ;
tOldUnitType = tUnitType ;
tUnitType , tPetUnitType = VUHDO_getUnitIds ( ) ;
tMaxMembers = ( " raid " == tUnitType ) and 40 or ( " party " == tUnitType ) and 4 or 0 ;
for tCnt = 1 , tMaxMembers do
tPlayer = tUnitType .. tCnt ;
if UnitExists ( tPlayer ) and tPlayer ~= VUHDO_PLAYER_RAID_ID then
tInfo = VUHDO_RAID [ tPlayer ] ;
if not tInfo or VUHDO_RAID_GUIDS [ UnitGUID ( tPlayer ) ] ~= tPlayer then
--VUHDO_xMsg("VUHDO_refreshRaidMembers", "VUHDO_setHealth", tPlayer or "no player", tInfo and "in raid" or "not in raid", VUHDO_RAID_GUIDS[UnitGUID(tPlayer)] or "no raid guid");
VUHDO_setHealth ( tPlayer , 1 ) ; -- VUHDO_UPDATE_ALL
else
tInfo [ " group " ] = VUHDO_getUnitGroup ( tPlayer , false ) ;
tInfo [ " isVehicle " ] = UnitHasVehicleUI ( tPlayer ) ;
if ( tInfo [ " isVehicle " ] ) then
local tRaidId = UnitInRaid ( tPlayer ) ;
if ( tRaidId and not UnitTargetsVehicleInRaidUI ( tPlayer ) ) then
tInfo [ " isVehicle " ] = false ;
end
end
tInfo [ " afk " ] , tInfo [ " connected " ] , tIsDcChange = VUHDO_updateAfkDc ( tPlayer ) ;
if tIsDcChange then
VUHDO_updateBouquetsForEvent ( tPlayer , 19 ) ; -- VUHDO_UPDATE_DC
end
VUHDO_setHealthSafe ( tPetUnitType .. tCnt , 1 ) ; -- VUHDO_UPDATE_ALL
end
elseif VUHDO_RAID [ tPlayer ] then
VUHDO_RAID [ tPlayer ] [ " connected " ] = false ;
tPet = VUHDO_RAID [ tPlayer ] [ " petUnit " ] ;
if VUHDO_RAID [ tPet ] then
VUHDO_RAID [ tPet ] [ " connected " ] = false ;
end
end
end
VUHDO_setHealthSafe ( " player " , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_setHealthSafe ( " pet " , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_setHealthSafe ( " focus " , 1 ) ; -- VUHDO_UPDATE_ALL
if VUHDO_INTERNAL_TOGGLES [ 27 ] then -- VUHDO_UPDATE_PLAYER_TARGET
VUHDO_setHealthSafe ( " target " , 1 ) ; -- VUHDO_UPDATE_ALL
end
for bossUnitId , _ in pairs ( VUHDO_BOSS_UNITS ) do
if UnitExists ( bossUnitId ) then -- and UnitIsFriend("player", bossUnitId) then
tInfo = VUHDO_RAID [ bossUnitId ] ;
if not tInfo or VUHDO_RAID_GUIDS [ UnitGUID ( bossUnitId ) ] ~= bossUnitId then
VUHDO_setHealth ( bossUnitId , 1 ) ; -- VUHDO_UPDATE_ALL
else
tInfo [ " group " ] = VUHDO_getUnitGroup ( bossUnitId , false ) ;
tInfo [ " isVehicle " ] = UnitHasVehicleUI ( bossUnitId ) ;
tInfo [ " afk " ] = false ;
tInfo [ " connected " ] = true ;
end
else
-- FIXME: find a more efficient way to trigger boss removal
VUHDO_removeHots ( bossUnitId ) ;
VUHDO_resetDebuffsFor ( bossUnitId ) ;
VUHDO_removeAllDebuffIcons ( bossUnitId ) ;
VUHDO_updateTargetBars ( bossUnitId ) ;
table.wipe ( VUHDO_RAID [ bossUnitId ] or tEmptyInfo ) ;
VUHDO_RAID [ bossUnitId ] = nil ;
VUHDO_updateHealthBarsFor ( bossUnitId , 1 ) ; -- VUHDO_UPDATE_ALL
VUHDO_initEventBouquetsFor ( bossUnitId ) ;
end
end
VUHDO_PLAYER_GROUP = VUHDO_getUnitGroup ( VUHDO_PLAYER_RAID_ID , false ) ;
VUHDO_updateAllRaidNames ( ) ;
VUHDO_trimInspected ( ) ;
VUHDO_convertMainTanks ( ) ;
VUHDO_updateGroupArrays ( false ) ;
VUHDO_updateAllPanelUnits ( ) ;
VUHDO_updateAllGuids ( ) ;
VUHDO_updateBuffRaidGroup ( ) ;
if sCurrentMode ~= 1 then VUHDO_sortEmergencies ( ) ; end -- VUHDO_MODE_NEUTRAL
VUHDO_createClusterUnits ( ) ;
end