From bfdce8071bf4a371b904079679cc15101d56b06b Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Tue, 18 Jul 2023 18:19:38 -0300 Subject: [PATCH] Bug Fixed --- Definitions.lua | 1 + core/control.lua | 13 +- core/meta.lua | 11 +- .../window_playerbreakdown.lua | 9 +- frames/window_main.lua | 2 +- .../Details_EncounterDetails/Definitions.lua | 585 ------------------ 6 files changed, 29 insertions(+), 592 deletions(-) delete mode 100644 plugins/Details_EncounterDetails/Definitions.lua diff --git a/Definitions.lua b/Definitions.lua index c51ead83..09543a44 100644 --- a/Definitions.lua +++ b/Definitions.lua @@ -361,6 +361,7 @@ ---@field BreakdownPluginSelectionFrame frame frame which has buttons to select a plugin to show in the breakdown window ---@field BreakdownTabsFrame frame where the tab buttons are located (parent frame) ---@field RegisteredPluginButtons button[] table which contains plugins buttons that are registered to the breakdown window +---@field RefreshPlayerScroll fun() refresh the player scroll frame (shown in the left side of the breakdown window) ---@field RegisterPluginButton fun(button: button, pluginObject: table, pluginAbsolutename: string) register a plugin button to the breakdown window ---@field GetShownPluginObject fun() : table get the plugin object that is currently shown in the breakdown window diff --git a/core/control.lua b/core/control.lua index e0bd45ec..1c7d0c21 100644 --- a/core/control.lua +++ b/core/control.lua @@ -1908,8 +1908,17 @@ end if (not bForceRefresh) then --update player details window if opened - if (breakdownWindowFrame.ativo) then - return breakdownWindowFrame.jogador:MontaInfo() + if (Details.BreakdownWindowFrame:IsShown()) then + ---@type actor + local actorObject = Details:GetActorObjectFromBreakdownWindow() + if (actorObject and not actorObject.__destroyed) then + return actorObject:MontaInfo() --MontaInfo a nil value + else + Details:Msg("Invalid actor object on breakdown window.") + if (actorObject.__destroyed) then + Details:Msg("Invalidation Reason:", actorObject.__destroyedBy) + end + end end end return diff --git a/core/meta.lua b/core/meta.lua index 3d311534..027f8166 100644 --- a/core/meta.lua +++ b/core/meta.lua @@ -639,7 +639,7 @@ local classTypeUtility = Details.atributos.misc end end - ---start/restart the internal garbage collector runtime + ---start/restart the internal garbage collector runtime ~garbage ---@param bShouldForceCollect boolean if true, the garbage collector will run regardless of the time interval ---@param lastEvent unixtime no call is passing lastEvent at the moment function Details222.GarbageCollector.RestartInternalGarbageCollector(bShouldForceCollect, lastEvent) @@ -797,13 +797,18 @@ local classTypeUtility = Details.atributos.misc end actorContainer:Cleanup() + + --refresh the breakdown window + if (Details.BreakdownWindowFrame:IsShown()) then + Details222.BreakdownWindow.RefreshPlayerScroll() + end end actorContainer.need_refresh = true - end + end --end of containerId loop return amountCleaned - end + end --end of collectGarbage function ---run the garbage collector ---@param overriteLastEvent unixtime diff --git a/frames/window_breakdown/window_playerbreakdown.lua b/frames/window_breakdown/window_playerbreakdown.lua index 023d2700..a8a2a29c 100644 --- a/frames/window_breakdown/window_playerbreakdown.lua +++ b/frames/window_breakdown/window_playerbreakdown.lua @@ -205,7 +205,8 @@ function Details:GetDisplayTypeFromBreakdownWindow() return breakdownWindowFrame.atributo, breakdownWindowFrame.sub_atributo end ---return the actor object in use by the breakdown window +---return the actor object in use by the breakdown window +---@return actor actorObject function Details:GetActorObjectFromBreakdownWindow() return breakdownWindowFrame.jogador end @@ -218,6 +219,12 @@ function Details:IsBreakdownWindowOpen() return breakdownWindowFrame.ativo end +function Details222.BreakdownWindow.RefreshPlayerScroll() + if (breakdownWindowFrame.playerScrollBox) then + breakdownWindowFrame.playerScrollBox:Refresh() + end +end + ---open the breakdown window ---@param self details ---@param instanceObject instance diff --git a/frames/window_main.lua b/frames/window_main.lua index a70516b5..3f19194e 100644 --- a/frames/window_main.lua +++ b/frames/window_main.lua @@ -2250,7 +2250,7 @@ local iconFrame_OnEnter = function(self) end end - if (actor.spec == 1473) then + if (actor.spec == 1473 and actor.tipo == DETAILS_ATTRIBUTE_DAMAGE) then local damageDone = math.floor(actor.total + actor.extra_bar) GameCooltip:AddLine("Evoker Predicted Damage:", Details:Format(damageDone) .. " (" .. Details:Format(damageDone / Details:GetCurrentCombat():GetCombatTime()) .. ")", 1, "white") GameCooltip:AddIcon([[]], 1, 1, 1, 20) diff --git a/plugins/Details_EncounterDetails/Definitions.lua b/plugins/Details_EncounterDetails/Definitions.lua deleted file mode 100644 index 2454053b..00000000 --- a/plugins/Details_EncounterDetails/Definitions.lua +++ /dev/null @@ -1,585 +0,0 @@ - - ----@alias plugintype ----| "SOLO" ----| "RAID" ----| "TOOLBAR" ----| "STATUSBAR" - ----@alias detailsevent ----| "DETAILS_INSTANCE_OPEN" ----| "DETAILS_INSTANCE_CLOSE" ----| "DETAILS_INSTANCE_SIZECHANGED" ----| "DETAILS_INSTANCE_STARTRESIZE" ----| "DETAILS_INSTANCE_ENDRESIZE" ----| "DETAILS_INSTANCE_STARTSTRETCH" ----| "DETAILS_INSTANCE_ENDSTRETCH" ----| "DETAILS_INSTANCE_CHANGESEGMENT" ----| "DETAILS_INSTANCE_CHANGEATTRIBUTE" ----| "DETAILS_INSTANCE_CHANGEMODE" ----| "DETAILS_INSTANCE_NEWROW" ----| "DETAILS_OPTIONS_MODIFIED" ----| "DETAILS_DATA_RESET" ----| "DETAILS_DATA_SEGMENTREMOVED" ----| "COMBAT_ENCOUNTER_START" ----| "COMBAT_ENCOUNTER_END" ----| "COMBAT_PLAYER_ENTER" ----| "COMBAT_PLAYER_LEAVE" ----| "COMBAT_PLAYER_TIMESTARTED" ----| "COMBAT_BOSS_WIPE" ----| "COMBAT_BOSS_DEFEATED" ----| "COMBAT_BOSS_FOUND" ----| "COMBAT_INVALID" ----| "COMBAT_PREPOTION_UPDATED" ----| "COMBAT_CHARTTABLES_CREATING" ----| "COMBAT_CHARTTABLES_CREATED" ----| "COMBAT_ENCOUNTER_PHASE_CHANGED" ----| "COMBAT_ARENA_START" ----| "COMBAT_ARENA_END" ----| "COMBAT_MYTHICDUNGEON_START" ----| "COMBAT_MYTHICDUNGEON_END" ----| "GROUP_ONENTER" ----| "GROUP_ONLEAVE" ----| "ZONE_TYPE_CHANGED" ----| "REALM_CHANNEL_ENTER" ----| "REALM_CHANNEL_LEAVE" ----| "COMM_EVENT_RECEIVED" ----| "COMM_EVENT_SENT" ----| "UNIT_SPEC" ----| "UNIT_TALENTS" ----| "PLAYER_TARGET" ----| "DETAILS_PROFILE_APPLYED" - ----@alias containertype number this container type is the number used to identify the actorcontainer type when using combat:GetContainer(containertype), can be 1, 2, 3, or 4. - ----@alias actorclass string this is the class of the actor, can be "WARRIOR", "PALADIN", "HUNTER", "ROGUE", "PRIEST", "DEATHKNIGHT", "SHAMAN", "MAGE", "WARLOCK", "MONK", "DRUID", "DEMONHUNTER" ----@alias actorspec number this is the specID of the actor ----@alias uniquecombatid number a unique ID to point to a single combat, each character has its ID counter, use with Details:DoesCombatWithUIDExists(); Details:GetCombatByUID(); retrive with combat:GetCombatUID() - ----@class petinfo : table ----@field key1 ownername ----@field key2 guid ----@field key3 unixtime ----@field key4 boolean ----@field key5 petname ----@field key6 guid - ----@class details ----@field SpellTableMixin spelltablemixin ----@field GetInstance fun(self: details) : instance ----@field GetWindow fun(self: details) : instance this is an alias of GetInstance ----@field GetCombat fun(self: details) : combat ----@field GetSpellSchoolFormatedName fun(self: details, spellschool: spellschool) : string ----@field CommaValue fun(self: details, number: number) : string ----@field CreateEventListener fun(self: details) : table - ----@class detailseventlistener : table ----@field RegisterEvent fun(self: detailseventlistener, event: detailsevent, callback: function) ----@field UnregisterEvent fun(self: detailseventlistener, event: detailsevent) - ----@class deathtable : table ----@field key1 any[] what happened to the player before death ----@field key2 number unix time ----@field key3 string player name ----@field key4 string player class ----@field key5 number max health ----@field key6 string time of death as string ----@field dead boolean just a boolean to indicate this is a death table ----@field last_cooldown {key1: unixtime, key2: spellid} ----@field dead_at combattime ----@field spec specializationid - ----@class customspellinfo : {name: string, isPassive: boolean, itemId: number, icon: string|number} ----@class customiteminfo: {itemId: number, isPassive: boolean} ----@class savedspelldata : {key1: number, key2: string, key3: number} ----@class alternatepowertable : {last: number, total: number} - ----@class combat : table ----@field bIsClosed boolean if true the combat is closed (passed by the EndCombat() function) ----@field __destroyedBy string ----@field amountCasts {[string]: table} ----@field instance_type instancetype "raid" or "party" or "pvp" or "arena" or "none" or "scenario" ----@field end_time number ----@field start_time number ----@field combat_counter number ----@field is_trash boolean while in raid this is set to true if the combat isn't raid boss, in dungeon this is set to true if the combat isn't a boss or if the dungeon isn't a mythic+ ----@field raid_roster table [unitName] = unitGUID ----@field overall_added boolean is true when the combat got added into the overall combat ----@field is_mythic_dungeon_trash boolean ----@field is_mythic_dungeon_run_id number ----@field is_mythic_dungeon_segment boolean ----@field trinketProcs table> ----@field alternate_power table ----@field totals {key1: table, key2: table, key3: table, key3: table} ----@field totals_grupo {key1: table, key2: table, key3: table, key3: table} ----@field __destroyed boolean ----@field PhaseData table ----@field is_boss table ----@field is_world_trash_combat boolean when true this combat is a regular combat done in the world, not in a dungeon, raid, battleground, arena, ... ----@field player_last_events table record the latest events of each player, latter used to build the death log ----@field GetCombatUID fun(combat: combat) : uniquecombatid ----@field GetTimeData fun(combat: combat, dataName: string) : table ----@field GetPhases fun(combat: combat) : table ----@field GetCombatTime fun(combat) : number ----@field GetDeaths fun(combat) : table --get the table which contains the deaths of the combat ----@field GetStartTime fun(combat: combat) : number ----@field SetStartTime fun(combat: combat, time: number) ----@field GetEndTime fun(combat: combat) : number ----@field GetDifficulty fun(combat: combat) : number return the dungeon or raid difficulty for boss fights ----@field GetEncounterCleuID fun(combat: combat) : number return the encounterId for boss fights, this number is gotten from the ENCOUNTER_START event ----@field GetBossInfo fun(combat: combat) : table a table containing many informations about the boss fight ----@field SetEndTime fun(combat: combat, time: number) ----@field CopyDeathsFrom fun(combat1: combat, combat2: combat, bMythicPlus: boolean) copy the deaths from combat2 to combat1, use true on bMythicPlus if the combat is from a mythic plus run ----@field GetContainer fun(combat: combat, containerType: containertype) : actorcontainer get an actorcontainer, containerType can be 1 for damage, 2 heal, 3 resources, 4 utility ----@field GetSpellCastAmount fun(combat: combat, actorName: string, spellName: string) : number get the amount of times a spell was casted ----@field RemoveActorFromSpellCastTable fun(combat: combat, actorName: string) ----@field GetSpellCastTable fun(combat: combat, actorName: string|nil) : table ----@field GetSpellUptime fun(combat: combat, actorName: string, spellId: number, auraType: string|nil) : number get the uptime of a buff or debuff ----@field GetActor fun(combat: combat, containerType: number, playerName: string) : actor ----@field CreateAlternatePowerTable fun(combat: combat, actorName: string) : alternatepowertable ----@field GetCombatNumber fun(combat: combat) : number get a unique number representing the combatId, each combat has a unique number ----@field SetDate fun(combat: combat, startDate: string, endDate: string) set the start and end date of the combat, format: "H:M:S" ----@field GetDate fun(combat: combat) : string, string get the start and end date of the combat, format: "H:M:S" ----@field GetRoster fun(combat: combat) : table get the roster of the combat, the table contains the names of the players in the combat ----@field InstanceType fun(combat: combat) : string get the instance type of the combat, can be "raid" or "party" or "pvp" or "arena" or "none" ----@field IsTrash fun(combat: combat) : boolean is true if the combat is a trash combat - ----@class actorcontainer : table contains two tables _ActorTable and _NameIndexTable, the _ActorTable contains the actors, the _NameIndexTable contains the index of the actors in the _ActorTable, making quick to reorder them without causing overhead ----@field need_refresh boolean when true the container is dirty and needs to be refreshed ----@field _ActorTable table array of actors ----@field _NameIndexTable table [actorName] = actorIndex in the _ActorTable, actorcontainer:Remap() refreshes the _NameIndexTable ----@field GetActor fun(container: actorcontainer, actorName: string) get an actor by its name ----@field GetSpellSource fun(container: actorcontainer, spellId: number) get the first actor found which casted the spell ----@field GetAmount fun(container: actorcontainer, actorName: string, key: string) get the amount of actor[key] ----@field GetTotal fun(container: actorcontainer, key: string) get the total amount of actor[key] for all actors ----@field GetTotalOnRaid fun(container: actorcontainer, key: string, combat: combat) get the total amount of actor[key] only for the actors which are in the raid ----@field GetActorTable fun(container: actorcontainer) get the table which contains the actors ----@field ListActors fun(container: actorcontainer) usage: for index, actorObject in container:ListActors() do ----@field RemoveActor fun(container: actorcontainer, actor: actor) remove an actor from the container ----@field GetType fun(container: actorcontainer) : number get the container type, 1 for damage, 2 for heal, 3 for energy, 4 for utility ----@field Remap fun(container: actorcontainer) refreshes the _NameIndexTable part of the container ----@field Cleanup fun(container: actorcontainer) remove all destroyed actors from the container - ----@class spellcontainer : table ----@field _ActorTable table store [spellId] = spelltable ----@field GetSpell fun(container: spellcontainer, spellId: number) get a spell by its id, does not create if not found ----@field ListActors fun(container: spellcontainer) : any, any usage: for spellId, spelltable in container:ListActors() do ----@field ListSpells fun(container: spellcontainer) : any, any usage: for spellId, spelltable in container:ListActors() do ----@field HasTwoOrMoreSpells fun(container: spellcontainer) : boolean return true if the container has two or more spells ----@field GetOrCreateSpell fun(self: spellcontainer, spellId: number, bCanCreateSpellIfMissing: boolean|nil, cleuToken: string|nil) : spelltable - ----@class friendlyfiretable : table ----@field total number total amount of friendly fire caused by the actor ----@field spells table spellId = total - ----@class spelltable : table ----@field uptime number ----@field total number ----@field spellschool number ----@field counter number amount of hits ----@field c_amt number critical hits by a damage or heal spell ----@field c_min number min damage or healing done by critical hits of the spell ----@field c_max number min damage or healing done by critical hits of the spell ----@field c_total number total damage or heal made by critical hits of the spell ----@field n_amt number normal hits by a damage or heal spell ----@field n_min number min damage or healing done by normal hits of the spell ----@field n_max number min damage or healing done by normal hits of the spell ----@field n_total number total damage or heal made by normal hits of the spell ----@field targets table store the [target name] = total value ----@field targets_overheal table ----@field targets_absorbs table ----@field extra table store extra data ----@field id number --spellid ----@field is_shield boolean --true if the spell is a shield ----@field successful_casted number successful casted times (only for enemies) ----@field g_amt number glacing hits ----@field g_dmg number ----@field r_amt number --resisted ----@field r_dmg number ----@field b_amt number --blocked ----@field b_dmg number ----@field a_amt number --absorved ----@field a_dmg number ----@field e_total number ----@field e_amt number ----@field e_lvl table ----@field e_dmg table ----@field e_heal table ----@field isReflection boolean ----@field totalabsorb number healing absorbed ----@field absorbed number damage absorbed by shield | healing absorbed by buff or debuff ----@field overheal number ----@field totaldenied number - ----@class targettable : {[string]: number} - ----@class actor : table ----@field owner actor ----@field tipo number the container type ----@field ownerName string name of the owner of the pet, a pet without an owner is considered an orphan and be suitable for garbage collection ----@field pets table ----@field arena_enemy boolean if true the actor is an enemy in an arena match ----@field dps_started boolean if true the actor started to do damage or healing ----@field start_time unixtime when this actor started to be tracked ----@field end_time number when this actor stopped to be tracked, end_time - start_time is the activity time of the actor ----@field displayName string actor name shown in the regular window ----@field pvp boolean indicates if the actor is a part of a pvp match ----@field flag_original number original actor flag from what was received in the combat log ----@field debuff_uptime_spells table ----@field buff_uptime_spells table ----@field spells spellcontainer ----@field aID number|string actorID is a realm-playername or npcID ----@field spellicon number|string ----@field cooldowns_defensive_spells table ----@field nome string name of the actor ----@field isTank boolean if true the player had the spec TANK during the combat ----@field serial string ----@field spec number ----@field grupo boolean ----@field fight_component boolean ----@field boss_fight_component boolean ----@field pvp_component boolean ----@field boss boolean ----@field last_event unixtime ----@field total_without_pet number ----@field total number ----@field targets targettable ----@field GetSpell fun(actor: actor, spellId: number) : spelltable ----@field BuildSpellTargetFromBreakdownSpellData fun(actor: actor, bkSpellData: spelltableadv) : table ----@field BuildSpellTargetFromSpellTable fun(actor: actor, spellTable: spelltable) : table ----@field raid_targets table ----@field IsPlayer fun(actor: actor) : boolean return true if the actor is controlled by a player ----@field IsPetOrGuardian fun(actor: actor) : boolean return true if the actor is a pet or guardian ----@field IsGroupPlayer fun(actor: actor) : boolean return true if the actor is a player in the group (or was in the group during the combat) ----@field GetSpellContainer fun(actor: actor, containerType: "debuff"|"buff"|"spell"|"cooldowns"|"dispel") : spellcontainer ----@field Class fun(actor: actor) : string get the ingame class of the actor ----@field Spec fun(actor: actor) : string get the ingame spec of the actor ----@field Name fun(actor: actor) : string get the name of the actor ----@field Tempo fun(actor: actor) : number get the activity or effective time of the actor ----@field GetPets fun(actor: actor) : table get a table with all pet names that belong to the player ----@field GetSpellList fun(actor: actor) : table ----@field GetSpellContainerNames fun(container: actorcontainer) : string[] get the table which contains the names of the spell containers - ----@class actordamage : actor ----@field friendlyfire_total number ----@field friendlyfire table ----@field damage_taken number amount of damage the actor took during the segment ----@field damage_from table store the name of the actors which damaged the actor, format: [actorName] = true ----@field totalabsorbed number amount of damage dealt by the actor by got absorbed by the target, this is a "ABSORB" type of miss but still counts as damage done - ----@class actorheal : actor ----@field healing_taken number amount of healing the actor took during the segment ----@field totalover number amount of healing that was overhealed ----@field totalabsorb number amount of healing that was absorbed ----@field heal_enemy_amt number amount of healing done to enemies this included enemy to enemy heals ----@field totaldenied number amount of healing that was denied by the target - from cleu event SPELL_HEAL_ABSORBED ----@field totalover_without_pet number amount of healing that was overhealed without the pet healing ----@field healing_from table store the name of the actors which healed the actor, format: [actorName] = true ----@field heal_enemy table store the amount of healing done by each spell that landed into an enemy, format: [spellId] = healing done ----@field targets_overheal table [targetName] = overheal ----@field targets_absorbs table [targetName] = absorbs - ----@class actorresource : actor ----@field powertype number power type of the actor ----@field alternatepower number alternate power of the actor - ----@class actorutility : actor ----@field cc_break number amount of times the actor broke a cc ----@field interrupt number amount of times the actor interrupted a spell ----@field ress number amount of times the actor ressed a player ----@field dead number amount of times the actor died ----@field cooldowns_defensive number amount of times the actor used a defensive cooldown ----@field buff_uptime number amount of time the actor had a buff ----@field debuff_uptime number amount of time the actor had a debuff ----@field cc_done number amount of times the actor applyed a crowdcontrol on a target ----@field cc_done_targets table [targetName] = amount of times the actor cc'd the target ----@field cc_done_spells spellcontainer ----@field dispell number amount of times the actor dispelled a buff or debuff ----@field dispell_spells spellcontainer ----@field dispell_targets table [targetName] = amount ----@field dispell_oque table [spellId] = amount, amount of times the actor dispelled the spellId - ---interrupt_targets interrupt_spells interrompeu_oque ---cc_break_targets cc_break_spells cc_break_oque - - ----@class segmentid : number ----@class instanceid : number ----@class attributeid : number ----@class modeid : number - ----@class instance : table ----@field segmento segmentid ----@field showing combat ----@field meu_id instanceid ----@field is_interacting boolean ----@field modo modeid ----@field atributo attributeid ----@field sub_atributo attributeid ----@field ativa boolean ----@field freezed boolean ----@field sub_atributo_last table ----@field row_info table ----@field GetSize fun(instance: instance) : width, height ----@field GetInstanceGroup fun() : table ----@field GetCombat fun(instance: instance) ----@field ChangeIcon fun(instance: instance) ----@field CheckIntegrity fun(instance: instance) ----@field SetMode fun(instance: instance, mode: modeid) ----@field GetMode fun(instance: instance) : modeid ----@field IsInteracting fun(instance: instance) : boolean ----@field IsLowerInstance fun(instance: instance) : boolean ----@field IsEnabled fun(instance: instance) : boolean ----@field GetId fun(instance: instance) : instanceid ----@field GetSegmentId fun(instance: instance) : segmentid ----@field RefreshCombat fun(instance: instance) ----@field Freeze fun(instance: instance) ----@field UnFreeze fun(instance: instance) ----@field SetSegment fun(instance: instance, segment: segmentid, force: boolean|nil) ----@field GetDisplay fun(instance: instance) : attributeid, attributeid ----@field ResetWindow fun(instance: instance, resetType: number|nil, segmentId: segmentid|nil) ----@field RefreshData fun(instance: instance, force: boolean|nil) ----@field RefreshWindow fun(instance: instance, force: boolean|nil) - ----@class trinketdata : table ----@field itemName string ----@field spellName string ----@field lastActivation number ----@field lastPlayerName string ----@field totalCooldownTime number ----@field activations number ----@field lastCombatId number ----@field minTime number ----@field maxTime number ----@field averageTime number - ----@class tabframe : frame this is the tab frame object for the breakdown window - ----@class breakdownwindow : frame ----@field shownPluginObject table ----@field BreakdownSideMenuFrame frame frame attached to the left or right side of the breakdown window ----@field BreakdownPluginSelectionFrame frame frame which has buttons to select a plugin to show in the breakdown window ----@field BreakdownTabsFrame frame where the tab buttons are located (parent frame) ----@field RegisteredPluginButtons button[] table which contains plugins buttons that are registered to the breakdown window ----@field RegisterPluginButton fun(button: button) register a plugin button to the breakdown window ----@field GetShownPluginObject fun() : table get the plugin object that is currently shown in the breakdown window - - ----@class breakdownscrolldata : table ----@field totalValue number total done by the actor ----@field combatTime number ----@field [spelltableadv] spelltableadv indexed part of the table - ----@class headercolumndatasaved : {enabled: boolean, width: number, align: string} - ----@class breakdownexpandbutton : button ----@field texture texture - ----@class breakdownspellscrollframe : df_scrollboxmixin, scrollframe ----@field Header df_headerframe ----@field RefreshMe fun(scrollFrame: breakdownspellscrollframe, data: table|nil) ----@field SortKey string ----@field SortOrder string - ----@class breakdowntargetscrollframe : df_scrollboxmixin, scrollframe ----@field Header df_headerframe ----@field RefreshMe fun(scrollFrame: breakdowntargetscrollframe, data: table|nil) - ----@class breakdowngenericscrollframe : df_scrollboxmixin, scrollframe ----@field Header df_headerframe ----@field RefreshMe fun(scrollFrame: breakdowngenericscrollframe, data: table|nil) - ----@class breakdownphasescrollframe : df_scrollboxmixin, scrollframe ----@field Header df_headerframe ----@field RefreshMe fun(scrollFrame: breakdownphasescrollframe, data: table|nil) - ----@class breakdownphasebar : button, df_headerfunctions ----@field index number ----@field Icon texture ----@field InLineTexts fontstring[] ----@field statusBar breakdownspellbarstatusbar - ----@class breakdowngenericbar : button, df_headerfunctions ----@field index number ----@field rank number ----@field name string ----@field percent number ----@field amount number ----@field total number ----@field actorName string ----@field Icon texture ----@field InLineTexts fontstring[] ----@field statusBar breakdownspellbarstatusbar ----@field bIsFromLeftScroll boolean ----@field bIsFromRightScroll boolean - ----@class breakdowntargetbar : button, df_headerfunctions ----@field index number ----@field rank number ----@field name string ----@field percent number ----@field amount number ----@field total number ----@field actorName string ----@field bkTargetData breakdowntargettable ----@field Icon texture ----@field InLineTexts fontstring[] ----@field statusBar breakdownspellbarstatusbar - ----@class breakdownspellbar : button, df_headerfunctions ----@field index number ----@field rank number ----@field spellId number ----@field name string ----@field combatTime number ----@field perSecond number ----@field percent number ----@field amountCasts number ----@field average number ----@field castAverage number ----@field onMouseUpTime number GetTime() of when the spellbar got OnMouseUp event ----@field cursorPosX number mouse position when the spellbar got OnMouseDown event ----@field cursorPosY number mouse position when the spellbar got OnMouseDown event ----@field spellTable spelltable ----@field bkSpellData spelltableadv ----@field statusBar breakdownspellbarstatusbar ----@field expandButton breakdownexpandbutton ----@field spellIconFrame frame ----@field spellIcon texture ----@field targetsSquareFrame breakdowntargetframe ----@field targetsSquareTexture texture ----@field overlayTexture texture ----@field bIsExpandedSpell boolean ----@field ExpandedChildren breakdownspellbar[] store the spellbars which are expanded from this spellbar (spellbars shown when the expand button is pressed) ----@field InLineTexts fontstring[] - ----@class breakdownspellbarstatusbar : statusbar ----@field backgroundTexture texture ----@field overlayTexture texture ----@field highlightTexture texture - ----spelltableadv is similar to spelltable but allow custom members, methods and any modification isn't save to saved variables ----@class spelltableadv : spelltable, spelltablemixin ----@field expanded boolean if is true the show the nested spells ----@field spellTables spelltable[] ----@field nestedData bknesteddata[] ----@field bCanExpand boolean ----@field expandedIndex number ----@field bIsExpanded boolean ----@field statusBarValue number ----@field npcId npcid ----@field actorName string --when showing an actor header, this is the actor name ----@field bIsActorHeader boolean if this is true, the spellbar is an actor header, which is a bar with the actor name with the actor spells nested ----@field actorIcon textureid|texturepath - ----@class bknesteddata : {spellId: number, spellTable: spelltable, actorName: string, value: number, bIsActorHeader: boolean} fills .nestedData table in spelltableadv, used to store the nested spells data, 'value' is set when the breakdown sort the values by the selected header - ----@class breakdowntargetframe : frame ----@field spellId number ----@field bkSpellData spelltableadv ----@field spellTable spelltable ----@field texture texture ----@field bIsMainLine boolean - ----@class breakdowntargettablelist : breakdowntargettable[] ----@field totalValue number ----@field totalValueOverheal number ----@field combatTime number - ----@class breakdowntargettable : table ----@field name string ----@field total number ----@field overheal number|nil ----@field absorbed number|nil ----@field statusBarValue number - ----@class breakdownspelldatalist : spelltableadv[] ----@field totalValue number ----@field combatTime number - ----@class breakdownspellstab : tabframe ----@field SpellScrollFrame breakdownspellscrollframe ----@field SpellBlockFrame breakdownspellblockframe - ----@class breakdownspellblockframe : frame container for the spellblocks in the breakdown window ----@field SpellBlocks breakdownspellblock[] array of spellblocks ----@field blocksInUse number number of blocks currently in use ----@field UpdateBlocks fun(self: breakdownspellblockframe) update the blocks ----@field ClearBlocks fun(self: breakdownspellblockframe) clear all blocks ----@field GetBlock fun(self: breakdownspellblockframe, index: number) : breakdownspellblock return the block at the index ----@field GetBlocksInUse fun(self: breakdownspellblockframe) : number return the number of blocks currently in use ----@field GetBlocksAmount fun(self: breakdownspellblockframe) : number return the total blocks created ----@field ShowEmptyBlock fun(self: breakdownspellblockframe, index: number) show the empty block - ----@class breakdownspellblock : statusbar breakdownspellblock object which is created inside the breakdownspellblockframe ----@field Lines breakdownspellblockline[] ----@field reportButton button ----@field overlay texture ----@field statusBarTexture texture ----@field sparkTexture texture ----@field gradientTexture texture ----@field backgroundTexture texture ----@field GetLine fun(self: breakdownspellblock, index: number) : breakdownspellblockline ----@field GetLines fun(self: breakdownspellblock) : breakdownspellblockline, breakdownspellblockline, breakdownspellblockline ----@field SetColor fun(self: breakdownspellblock, r: any, g: number|nil, b: number|nil, a: number|nil) - ----@class breakdownspellblockline : frame a line inside a breakdownspellblock, there's 3 of them in each breakdownspellblock ----@field leftText fontstring ----@field centerText fontstring ----@field rightText fontstring - ----@class breakdownspelltab ----@field selectedSpellBar breakdownspellbar ----@field TabFrame breakdownspellstab ----@field mainAttribute number ----@field subAttribute number ----@field TargetScrollFrame breakdowntargetscrollframe ----@field PhaseScrollFrame breakdownphasescrollframe ----@field GenericScrollFrameLeft breakdowngenericscrollframe ----@field GenericScrollFrameRight breakdowngenericscrollframe ----@field SpellContainerFrame df_framecontainer ----@field BlocksContainerFrame df_framecontainer ----@field TargetsContainerFrame df_framecontainer ----@field PhaseContainerFrame df_framecontainer ----@field GenericContainerFrameLeft df_framecontainer ----@field GenericContainerFrameRight df_framecontainer ----@field GetActor fun() : actor ----@field GetCombat fun() : combat ----@field GetInstance fun() : instance ----@field GetSpellScrollFrame fun() : breakdownspellscrollframe ----@field GetSpellBlockFrame fun() : breakdownspellblockframe ----@field GetTargetScrollFrame fun() : breakdowntargetscrollframe ----@field GetSpellScrollContainer fun() : df_framecontainer ----@field GetSpellBlockContainer fun() : df_framecontainer ----@field GetTargetScrollContainer fun() : df_framecontainer ----@field OnProfileChange fun() ----@field UpdateHeadersSettings fun(containerType: string) ----@field BuildHeaderTable fun(containerType: string) : {name: string, width: number, text: string, align: string}[] ----@field SelectSpellBar fun(spellBar: breakdownspellbar) ----@field UnSelectSpellBar fun() ----@field GetSelectedSpellBar fun() : breakdownspellbar ----@field HasSelectedSpellBar fun() : boolean ----@field OnShownTab fun() ----@field OnCreateTabCallback fun(tabButton: button, tabFrame: frame) ----@field CreateSpellBlock fun(spellBlockContainer: breakdownspellblockframe, index: number) : breakdownspellblock ----@field CreateSpellBlockContainer fun(tabFrame: tabframe) : breakdownspellblockframe ----@field UpdateShownSpellBlock fun() ----@field CreateTargetContainer fun(tabFrame: tabframe) : breakdowntargetscrollframe ----@field CreateGenericContainers fun(tabFrame: tabframe) : breakdowngenericscrollframe, breakdowngenericscrollframe ----@field CreateSpellScrollContainer fun(tabFrame: tabframe) : breakdownspellscrollframe ----@field CreateTargetBar fun(self: breakdowntargetscrollframe, index: number) : breakdowntargetbar ----@field CreateSpellBar fun(self: breakdownspellscrollframe, index: number) : breakdownspellbar - ----@class timemachine : table ----@field Ticker fun() runs each second and check if actors are performing damage and healing actions, if the actor isn't, stop the activity time of that actor ----@field Start fun() start the time machine, called once from the start.lua ----@field Cleanup fun() check for actors with __destroyed flag and remove them from the time machine ----@field Restart fun() reset all data inside the time machine ----@field AddActor fun(actor: actor) add the actor to the time machine ----@field RemoveActor fun(actor: actor) remove the actor from the time machine ----@field StopTime fun(actor: actor) stop the time of the actor ----@field SetOrGetPauseState fun(actor: actor, bPause: boolean|nil) : boolean|nil set or get the pause state of the actor, if bPause is nil, then it will return the current pause state - ----@class details222 : table ----@field TimeMachine timemachine -