-
Notifications
You must be signed in to change notification settings - Fork 134
/
boot.lua
2190 lines (1918 loc) · 94 KB
/
boot.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--global name declaration
--use lua-language-server annotations to help the linter:
--https://github.com/LuaLS/lua-language-server/wiki/Annotations#documenting-types
--follow definitions declared in the file definitions.lua
--follow game api definitions in the file LibLuaServer.lua
_ = nil
_G.Details = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0")
--add the original name to the global namespace
_detalhes = _G.Details --[[GLOBAL]]
__details_debug = __details_debug or {}
if (__details_debug.prescience_timeline) then
wipe(__details_debug.prescience_timeline)
end
local addonName, Details222 = ...
local version, build, date, tvs = GetBuildInfo()
Details.build_counter = 13317
Details.alpha_build_counter = 13317 --if this is higher than the regular counter, use it instead
Details.dont_open_news = true
Details.game_version = version
Details.userversion = version .. " " .. Details.build_counter
Details.realversion = 161 --core version, this is used to check API version for scripts and plugins (see alias below)
Details.gametoc = tvs
Details.APIVersion = Details.realversion --core version
Details.version = Details.userversion .. " (core " .. Details.realversion .. ")" --simple stirng to show to players
Details.acounter = 1 --in case of a second release with the same .build_counter
Details.curseforgeVersion = C_AddOns and C_AddOns.GetAddOnMetadata and C_AddOns.GetAddOnMetadata("Details", "Version")
if (not Details.curseforgeVersion and GetAddOnMetadata) then
Details.curseforgeVersion = GetAddOnMetadata("Details", "Version")
end
function Details:GetCoreVersion()
return Details.realversion
end
Details.BFACORE = 131 --core version on BFA launch
Details.SHADOWLANDSCORE = 143 --core version on Shadowlands launch
Details.DRAGONFLIGHT = 147 --core version on Dragonflight launch
Details.V11CORE = 160 --core version on V11 launch
Details = Details
local gameVersionPrefix = "VCT" --v1, v4, v11
Details.gameVersionPrefix = gameVersionPrefix
pcall(function() Details.version_alpha_id = tonumber(Details.curseforgeVersion:match("%-(%d+)%-")) end)
--WD 10288 RELEASE 10.0.2
--WD 10288 ALPHA 21 10.0.2
function Details.GetVersionString()
local curseforgeVersion = Details.curseforgeVersion or ""
local alphaId = curseforgeVersion:match("%-(%d+)%-")
if (not alphaId) then
--this is a release version
alphaId = "RELEASE"
else
alphaId = "ALPHA " .. alphaId
end
return Details.gameVersionPrefix .. " " .. Details.build_counter .. " " .. alphaId .. " " .. Details.game_version .. ""
end
Details.DefaultTooltipIconSize = 20
--namespace for the player breakdown window
Details.PlayerBreakdown = {}
Details222.PlayerBreakdown = {
DamageSpellsCache = {}
}
Details222.StartUp = {}
Details222.Unknown = _G["UNKNOWN"]
--namespace color
Details222.ColorScheme = {
["gradient-background"] = {0.1215, 0.1176, 0.1294, 0.8},
}
function Details222.ColorScheme.GetColorFor(colorScheme)
return Details222.ColorScheme[colorScheme]
end
function Details222.DebugMsg(...)
if (Details.debug) then
print("|cFFCCAAAADetails! Debug:|r", ...)
end
end
--cache of frames to call :SetColor() when the color scheme changes
Details222.RegisteredFramesToColor = {}
Details222.TrainingDummiesNpcId = {
[194649] = true, --valdraken
[189617] = true, --valdraken
[194644] = true, --valdraken
[198594] = true, --valdraken
[194643] = true, --valdraken
[189632] = true, --valdraken
[194648] = true, --valdraken
[194646] = true, --valdraken
[197834] = true, --valdraken
[31146] = true, --orgrimmar
[153285] = true, --orgrimmar
[114840] = true, --orgrimmar
[114832] = true, --stormwind
[153292] = true, --stormwind
}
---@type details_storage_feature
---@diagnostic disable-next-line: missing-fields
local storage = {
DiffNames = {"normal", "heroic", "mythic", "raidfinder", "10player", "25player", "10playerheroic", "25playerheroic", "raidfinderclassic", "raidfindertimewalking", "timewalking"},
DiffNamesHash = {normal = 14, heroic = 15, mythic = 16, raidfinder = 17, ["10player"] = 3, ["25player"] = 4, ["10playerheroic"] = 5, ["25playerheroic"] = 6, raidfinderclassic = 7, raidfindertimewalking = 151, timewalking = 33},
DiffIdToName = {
[14] = "normal",
[15] = "heroic",
[16] = "mythic",
[17] = "raidfinder",
[3] = "10player",
[4] = "25player",
[5] = "10playerheroic",
[6] = "25playerheroic",
[7] = "raidfinderclassic",
[8] = "mythicdungeon",
[151] = "raidfindertimewalking",
[33] = "timewalking"
},
IsDebug = false
}
Details222.storage = storage
--namespace for damage spells (spellTable)
Details222.DamageSpells = {}
--namespace for texture
Details222.Textures = {}
Details222.Debug = {
DebugPets = false,
DebugPlayerPets = false,
DebugBuff = false,
}
Details222.Tvs = tvs
--namespace for pet
Details222.Pets = {}
Details222.PetContainer = {
---@type table<guid, petdata>
Pets = {},
---@type table<guid, boolean>
IgnoredActors = {},
---table that stores the player guid as keys and their petguid as values
---this is useful to know which pets are the legit class pet from the UNIT_PET event
---@type table<guid, guid>
UnitPetCache = {},
}
--auto run code
Details222.AutoRunCode = {}
--options panel
Details222.OptionsPanel = {}
--store bar icons (left side of the damage bar)
Details222.BarIconSetList = {}
Details222.Instances = {}
Details222.Combat = {}
Details222.MythicPlus = {
Charts = {},
Frames = {},
}
Details222.Notes = {}
Details222.MythicPlusBreakdown = {}
Details222.EJCache = {}
Details222.Segments = {}
Details222.Tables = {}
Details222.Mixins = {}
Details222.Cache = {}
Details222.Perf = {}
Details222.Cooldowns = {}
Details222.GarbageCollector = {}
Details222.BreakdownWindow = {}
Details222.PlayerStats = {}
Details222.LoadSavedVariables = {}
Details222.SaveVariables = {}
Details222.GuessSpecSchedules = {
Schedules = {},
}
Details222.Profiling = {}
Details222.ProfilingCache = {}
Details222.TimeMachine = {}
Details222.OnUseItem = {Trinkets = {}}
Details222.Date = {
GetDateForLogs = function()
return _G.date("%Y-%m-%d %H:%M:%S")
end,
}
Details222.ClassCache = {}
Details222.ClassCache.ByName = {}
Details222.ClassCache.ByGUID = {}
Details222.UnitIdCache = {}
Details222.Roskash = {}
Details222.SpecHelpers = {
[1473] = {},
}
Details222.IgnoredWorldAuras = {}
Details222.OneHourAuras = {}
Details222.Parser = {}
Details222.Actors = {}
Details222.CurrentDPS = {
Cache = {}
}
--store all data from the encounter journal
Details222.EncounterJournalDump = {}
--aura scanner
Details222.AuraScan = {}
---@type instancedifficulty
Details222.InstanceDifficulty = {
["DungeonNormal"] = 1,
["DungeonHeroic"] = 2,
["DungeonMythic"] = 23,
["DungeonMythicPlus"] = 8,
["RaidLFR"] = 17,
["RaidNormal"] = 14,
["RaidHeroic"] = 15,
["RaidMythic"] = 16,
}
Details222.DHook = hooksecurefunc
local emptyFunction = function()end
local emptyTable = {}
---context manager is a system that evaluates where the player is and create a set of extra rules that fit the content the player is doing
---@class contextmanager : table
---@field instanceType string
---@field instanceName string
---@field instanceId number
---@field instanceDifficulty number
---@field lastInstanceType string
---@field lastInstanceName string
---@field lastInstanceDifficulty number
---@field contextId string
---@field bContextStarted boolean
---@field bContextFinished boolean
---@field bHasContext boolean
---@field fHasLostInterest function
---@field fOnContextFinished function
---@field fOnCombatFinished function
---@field eventFrame frame
---@field DetailsEventListener table
---@field contextEventTable table
---@field StartContext function
---@field CheckContextInterest function
---@field FinishContext function
---@field GetContext function
--tells what is the activity the player is doing
Details222.ContextManager = {
instanceType = "INIT",
instanceName = "INIT",
instanceDifficulty = 0,
lastInstanceType = "INIT",
lastInstanceName = "INIT",
lastInstanceDifficulty = 0,
contextId = "INIT",
bContextStarted = false,
bContextFinished = false,
bHasContext = false,
fOnContextFinished = emptyFunction,
fHasLostInterest = emptyFunction,
fOnCombatFinished = emptyFunction,
contextEventTable = emptyTable,
eventFrame = CreateFrame("frame"),
---start a new context, this is called from the CheckContextInterest() function
---@param self contextmanager
---@param instanceId number
---@param instanceName string
---@param instanceType string
---@param difficultyId number
---@param contextEventTable table
---@param fOnCombatFinished function run when details! finishes a combat
---@param fOnContextFinished function run when the context is finished
---@param fHasLostInterest function run when CheckContextInterest() fails to find a context
StartContext = function(self, instanceId, instanceName, instanceType, difficultyId, contextEventTable, fOnCombatFinished, fOnContextFinished, fHasLostInterest)
self.instanceType = instanceType
self.instanceName = instanceName
self.instanceId = instanceId
self.instanceDifficulty = difficultyId
self.bContextStarted = true
self.bContextFinished = false
self.bHasContext = true
self.fOnContextFinished = fOnContextFinished
self.fHasLostInterest = fHasLostInterest
self.fOnCombatFinished = fOnCombatFinished
self.contextEventTable = contextEventTable
--create an event listener to grab the event when Details! finishes a combat
if (not self.DetailsEventListener) then
self.DetailsEventListener = Details:CreateEventListener()
end
self.DetailsEventListener:UnregisterEvent("COMBAT_PLAYER_LEAVE")
--register the onFinishCombat for the context
self.DetailsEventListener:RegisterEvent("COMBAT_PLAYER_LEAVE", fOnCombatFinished)
--unregister all events
self.eventFrame:UnregisterAllEvents()
--register the events that the context require
for i = 1, #contextEventTable.events do
self.eventFrame:RegisterEvent(contextEventTable.events[i])
end
--if the callback function returns true, the context is finished
self.eventFrame:SetScript("OnEvent", function(eventFrame, event, ...)
if (contextEventTable.callback(event, ...)) then
Details222.DebugMsg("context manager event", event)
--context completed
Details222.DebugMsg("Context Completed!")
C_Timer.After(1, fOnContextFinished)
C_Timer.After(1.1, function() self:FinishContext() end)
end
end)
Details222.DebugMsg("a new context has been set.")
end,
---check if the player is in a context of interest
---@param self contextmanager
---@param instanceId number
---@param instanceName string
---@param instanceType string
---@param difficultyId number
CheckContextInterest = function(self, instanceId, instanceName, instanceType, difficultyId)
Details222.DebugMsg("Checking for new context:", instanceId, instanceName, instanceType, difficultyId)
--normal, heroic and mythic0 dungeons on Retail
local diffTable = Details222.InstanceDifficulty
if (difficultyId == diffTable.DungeonNormal or difficultyId == diffTable.DungeonHeroic or difficultyId == diffTable.DungeonMythic) then
if (DetailsFramework.IsDragonflightAndBeyond()) then
--check if the player is in the same context
if (self.bHasContext and self.instanceId == instanceId and self.instanceType == instanceType and self.instanceName == instanceName and self.instanceDifficulty == difficultyId) then
return
end
do return end
--if a context is found, finishes it before a new one is created
if (self.bHasContext) then
--discard the context
Details222.DebugMsg("had an active context, finishing it.")
self:FinishContext()
end
--set a new context where at the end of the dungeon it creates an overall segment for the run
--function to verify if context is finished, in this case if all objectives of the dungeon has been completed by listening to the SCENARIO_COMPLETED event
local contextEventTable = {
events = {"SCENARIO_COMPLETED"},
callback = function(...)
--when a context return true, the context is finished and will trigger a call on the fOnContextFinished function
return true
end
}
--create a contextId to tag combats that are part of the same context
self.contextId = instanceName .. tostring(time())
--called when a combat finishes and this context is still active
local fOnCombatFinished = function()
local currentCombat = Details:GetCurrentCombat()
currentCombat.context = self.contextId
end
---this function evaluates if this context has lost its interest and should be discarded, return true if the context is no longer valid
local fHasLostInterest = function(instanceId, instanceName, instanceType, difficultyId)
--check if the player is still in the same context
if (self.instanceId ~= instanceId or self.instanceType ~= instanceType or self.instanceName ~= instanceName or self.instanceDifficulty ~= difficultyId) then
return true
end
end
--will ba called when the context finishes, in this case when the SCENARIO_COMPLETED event is triggered
local fOnContextFinished = function()
--check if this is not a mythic+ run
if (C_ChallengeMode.GetActiveChallengeMapID() or C_ChallengeMode.GetActiveKeystoneInfo() or C_ChallengeMode.IsChallengeModeActive()) then
print("did not start as this is a m+ run")
return
else
print("this is not a m+ run")
end
---@type combat[]
local interestCombats = {}
--get all segments
local segments = Details:GetCombatSegments()
for i = 1, #segments do
local segment = segments[i]
if (segment.context == self.contextId) then
interestCombats[#interestCombats+1] = segment
end
end
if (#interestCombats > 0) then
--start a new combat
Details222.StartCombat()
Details222.DebugMsg("merging", #interestCombats, "combats into a single combat.")
---@type combat
local currentCombat = Details:GetCurrentCombat()
--iterate over all interest combats
for i = 1, #interestCombats do
local interestCombat = interestCombats[i]
--add the combat to the new combat
currentCombat:AddCombat(interestCombat, i == 1, i == #interestCombats)
end
Details222.DebugMsg("combat time:", currentCombat:GetCombatTime())
--finish the new combat
Details:EndCombat()
currentCombat.is_trash = false
currentCombat.combat_type = DETAILS_SEGMENTTYPE_DUNGEON_OVERALL
currentCombat.is_dungeon_overall = true
end
Details222.DebugMsg("overall segment has been created.")
end
self:StartContext(instanceId, instanceName, instanceType, difficultyId, contextEventTable, fOnCombatFinished, fOnContextFinished, fHasLostInterest)
return
end
else
--if no context is found, check if there is a current context and check if it lost its interest
if (self.bHasContext) then
if (self.fHasLostInterest(self, instanceId, instanceName, instanceType, difficultyId)) then
Details222.DebugMsg("no context found, but context is active, finishing the current context.")
--discard the context
self:FinishContext()
end
end
end
end,
---finish the current context
---@param self contextmanager
FinishContext = function(self)
if (not self.bHasContext or not self.bContextStarted or self.bContextFinished) then
return
end
--mark this context as finished
self.bContextFinished = true
--reset context
self.instanceType = "INIT"
self.instanceName = "INIT"
self.contextId = "INIT"
self.instanceId = -1
self.instanceDifficulty = 0
self.bContextStarted = false
self.bHasContext = false
self.fOnContextFinished = emptyFunction
self.fHasLostInterest = emptyFunction
self.fOnCombatFinished = emptyFunction
self.contextEventTable = emptyTable
end,
---return the current contextIndex
---@param self contextmanager
---@return number|boolean, string?, string?, number?
GetContext = function(self)
if (self.bHasContext) then
return self.instanceId, self.instanceName, self.instanceType, self.instanceDifficulty
end
return false
end,
}
local GetSpellInfo = C_Spell and C_Spell.GetSpellInfo or GetSpellInfo
Details222.GetSpellInfo = GetSpellInfo
local UnitBuff = C_UnitAuras and C_UnitAuras.GetBuffDataByIndex or UnitBuff
Details222.UnitBuff = UnitBuff
local UnitDebuff = C_UnitAuras and C_UnitAuras.GetDebuffDataByIndex or UnitDebuff
Details222.UnitDebuff = UnitDebuff
if (C_Spell and C_Spell.GetSpellInfo) then
Details222.GetSpellInfo = function(...)
local result = GetSpellInfo(...)
if result then
return result.name, 1, result.iconID
end
end
end
if (C_UnitAuras and C_UnitAuras.GetAuraDataByIndex) then
Details222.UnitBuff = function(unitToken, index, filter)
local auraData = UnitBuff(unitToken, index, filter)
if (not auraData) then
return nil
end
return AuraUtil.UnpackAuraData(auraData)
end
Details222.UnitDebuff = function(unitToken, index, filter)
local auraData = UnitDebuff(unitToken, index, filter)
if (not auraData) then
return nil
end
return AuraUtil.UnpackAuraData(auraData)
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--initialization stuff
local _
do
local _detalhes = _G.Details
_detalhes.resize_debug = {}
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
--[=[
Added /note command to create and share a note in mythic+ dungeons.
Rogues do not exit combat when using vanish on combat dummies!!!
New Mythic+ damage graphic.
New Mythic+ Run Completion Panel, more complete and compact.
Major improvements on buff tracking uptime.
Added a buff filter to ignore weekly buffs.
Major overhaul on statistics system, record defeated raid bosses while in guild.
Major bug fixes and stability improvements by refactoring legacy code.
Health for death log now uses health percent at the moment of the hit instead of percent based on the unit normalized max health.
Added an option to limit the number of segments saved for wipes at the same boss.
Added WoW 11 trinket data.
Options panel won't trigger errors when opening in combat.
Updated spells for spec detection for wow 11 (Flamanis).
Add anonymization options to the event tracker (Flamanis).
Fixed several issues with classic and pvp battlegrounds (Flamanis).
Major fixes related to pet detection and pet data (Flamanis).
Made Details! survive for another expansion (Details! Team).
--]=]
local news = {
{"v11.0.2.13000.160", "September 07th, 2024"},
"Added /note command to create and share a note in mythic+ dungeons.",
"Rogues do not exit combat when using vanish on combat dummies!!!",
"New Mythic+ damage graphic.",
"New Mythic+ Run Completion Panel, more complete and compact.",
"Major improvements on buff tracking uptime.",
"Added a buff filter to ignore weekly buffs.",
"Major overhaul on statistics system, record defeated raid bosses while in guild.",
"Major bug fixes and stability improvements by refactoring legacy code.",
"Health for death log now uses health percent at the moment of the hit instead of percent based on the unit normalized max health.",
"Added an option to limit the number of segments saved for wipes at the same boss.",
"Added WoW 11 trinket data.",
"Options panel won't trigger errors when opening in combat.",
"Updated spells for spec detection for wow 11 (Flamanis).",
"Add anonymization options to the event tracker (Flamanis).",
"Fixed several issues with classic and pvp battlegrounds (Flamanis).",
"Major fixes related to pet detection and pet data (Flamanis).",
"Made Details! survive for another expansion (Details! Team).",
{"v10.2.7.12800.156", "June 06th, 2024"},
"Added transliteration for pet names in Cyrillic.",
"Fixed an error with extra power bars (alternate power) on cataclysm classic.",
"Fixed a rare error shown as 'combat already deleted' when trying to reset data.",
"Fixed an issue which was preventing to open the death recap window.",
"Fixed cataclysm classic attempting to calculate Evoker buffs.",
"Fixed battleground problems with cataclysm classic. (Flamanis)",
"Fixed an issue with player nicknames not showing properly when the player isn't inside a guild. (Flamanis)",
{"v10.2.7.12755.156", "May 19th, 2024"},
"Pet names on tooltips are now transliterate from Cyrillic.",
"Default segments amount are now 25 and save 15, users with different amount set won't have their settings changed.",
"Fixed an error when the user opens the death recap.",
"Merging the effects of All-Totem of the Mastr (Flamanis).",
"Added a season setting to stop right click for bookmark: '/run Details.no_bookmark = true' stop the right click for bookmark in combat or not.\n/run Details.no_bookmark_on_combat = true stop the right click for bookmark only in combat.\nYou need to run this command every time you log in or add it into the Auto Run Code.",
"A few changes has been done in an attempt to fix the loot squares not showing properly in the mythic+ end screen.",
"The options panel now cannot be dragged outside the screen, this will stop users with two monitors to acciently moving the window out of screen.",
"Tooltip bar colors are now fixed and won't lost its setting on reload.",
"The buff Rallied to Victory should now be shown in the player breakdown window Auras tab.",
{"v10.2.6.12699.156", "May 03th, 2024"},
"Framework and Backend upgrades.",
"Added Toc data for Cata classic.",
"Warrior Arms Whirlwind has been merged into one spell (WillowGryph).",
"Added an option to control the horizontal gap between two groupped windows (Elitesparkle).",
"Fixed an issue where looting two itens at the end of a mythic+ would result in the icon of one item and the tooltip of another.",
"Fixed the preview of the Wallpaper option where it was too high positioned reaching the title bar.",
{"v10.2.6.12650.156", "April 23th, 2024"},
"Framework and Backend upgrades.",
"Added prist's void tendrils to crowd control list.",
"Fixes for asian clients where the spell names were not showing properly when the spell name is too long.",
"Cataclysm Clasic and MOP Remix are now working.",
{"v10.2.6.12578.156", "March 25th, 2024"},
"Added phase and elapsed time for boss wipes on the segment selection menu.",
"Added an option to toggle between rounded and squared tooltips.",
"Fixed an issue with icons not showing on classic versions of the game.",
"Changed Augmentation tooltip color to darkgreen.",
"When leaving a m+ dungeon, Details! will wait for the player to re-enter the dungeon before finishing and creating the overall m+ segment.",
"Added a function for artists add custom icon sets for class or specs: Details:AddCustomIconSet(path, dropdownOptionName[[[[[, isSpecIcons], icon], texCoords], iconSize], iconColor]) (Flamanis).",
{"v10.2.5.12550.156", "March 13th, 2024"},
"Added a combat selection option into the breakdown window, providing convenience when browsing damage or healing data in that window.",
"Added a report button to the breakdown window, allowing you to report spell damage, targets, and phases directly from that window.",
"Added combat comparison (Compare tab), allowing you to compare yourself between different combats. This is especially useful for training dummies.",
"Added the option to show or hide the Augmentation Evoker extra bar.",
"Added bar texture option 'Skyline Compact' and alert sounds 'Details Truck' and 'Details Bass Drop'.",
"The menu for combat selection has received a visual update.",
"Breakdown options received text settings, these settings also change the text in the display selection (right click at window title bar).",
"Applied a visual patch for windows other than the main ones, making them with rounded corners.",
{"v10.2.5.12329.155", "February 18th, 2024"},
"Frame for 'Ask to Erase Data' can now be moved.",
"Small bug fixes and continued development on End of Mythic+ Panel.",
{"v10.2.5.12307.155", "February 13th, 2024"},
"Fixed the deaths display, where the windows wasn't usig custom text scripts.",
"Fixed an issue with custom displays, where it was unable to use class colors in their texts.",
"More development and bug fixes on the new Mythic+ Run Completion panel.",
"Framework Update.",
{"v10.2.5.12294.155", "February 08th, 2024"},
"General fixes applied to the Mythic+ Panel.",
"The Mythic+ section in the options panel can now be translated.",
"More fixes for text color.",
{"v10.2.5.12281.155", "February 07th, 2024"},
"Released the new panel for the Mythic+ Run Completion.",
"The list of Crowd Control spells is now sourced from the Lib Open Raid.",
"Fixed an issue where the Player Color feature wouldn't work properly if not using class colors.",
"Fixed an error with Vanilla, where it was trying to access talent data from Retail.",
{"v10.2.5.12255.155", "February 04th, 2024"},
"Dungeon followers now correctly show into the damage done section.",
"Fixed an error while statusbar plugin options.",
"Backend code maintenance.",
{"v10.2.5.12236.155", "January 20th, 2024"},
"Added Blistering Scales and Mana Restored to the Evoker Predicted Damage bar.",
"Fixed an issue which was making the Evoker Predicted Damage bar to show beyond the window width.",
"Fixed the key level up animation at the new End of Mythic+ Run panel.",
"Lib Open Raid updated to use Burst communications (Grim). The command /keys should give all Keys of the party almost instantly now.",
"Framework updated and other minor fixes.",
{"v10.2.0.12220.155", "January 14th, 2024"},
"Ignoring the heal of Smoldering Seedling trinket (Flamanis).",
"Attribute Judgement of Light to the healed on Wrath (Flamanis).",
"Fixed an error while scrolling down target npcs in the breakdown window.",
"Fixed an error when clicking to open the Death Recap by Details!.",
"End of Mythic Run panel got updates.",
"Many tooltips in Details! are now rouded!",
"Evoker extra bar tooltip's, now also show the uptime of Black Attunement and Prescience applications.",
"Breakdown Window now show Plater Npc Colors in the target box.",
"Added event: 'COMBAT_MYTHICPLUS_OVERALL_READY', trigger when the overall segment for the mythic+ is ready.",
"Added event: 'COMBAT_PLAYER_LEAVING', trigger at the beginning of the leave combat process.",
"Added: Details:IsInMythicPlus() return true if the player is on a mythic dungeon run.",
"CombatObjects now have the key 'is_challenge' if the combat is a part of a challenge mode or mythic+ run.",
"Lib Open Raid updated.",
{"v10.2.0.12188.155", "December 28th, 2023"},
"Dreamwalker's Healing Potion now shows in the Healing Potion & Stone custom display.",
"Added the 'Remove Battleground Segments' option to the menu that opens when hovering over the erase button.",
"Attempt to fix Battleground faction icons, shown on enemy players damage bars.",
"API: Actor:GetSpellContainer(containerName) now also accepts dispelwhat, interrupt, interruptwhat, interrupttargets.",
"Fixed custom scripts showing the damage text too close to the dps text.",
"Fixed Dynamic Overall Data, showing overlapped texts for damage and dps.",
"Fixed an error when hovering over some spells in the Auras panel on the Player Breakdown window.",
"Fixed the character item level, which was not showing for players that left the party group on the Player Breakdown window.",
"Fixed boss images not showing at the segments selection menu.",
"Other updates related to encounter journal and mythic+, both under development.",
"Update Details! Framework for bug fixes.",
"Update lib Open Raid (more cooldowns added).",
{"v10.2.0.12109.155", "December 14th, 2023"},
"Classic now uses the same combat log reader as retail (Flamanis).",
"Merged Rage of Fyr'alath spells (equara)",
"Added Rogue Ambushes to merged spells (WillowGryph).",
"The Remove Common Segments option now also removes segments trash between raid bosses.",
"Fixed an issue where auras applied before combat start, such as Power Infusion and Prescience, which are counted towards the target, were not being accounted for.",
"Added to Combat Class: classCombat:GetRunTimeNoDefault(). This returns the run time of the Mythic+ if available, nil otherwise.",
{"v10.2.0.12096.155", "December 1st, 2023"},
"Added Mythic+ Overall DPS calculation options: 'Use Total Combat Time' and 'Use Run Time'. These options are available in the Mythic Dungeon section of the options panel. The option 'Use Run Time', takes the player's damage and divide by the total elapsed time of the run.",
"Added reset options: 'Remove Common Segments' and 'Reset, but keep Mythic+ Overall Segments'.",
"Added trinket 'Corrupted Starlight' and 'Dreambinder, Loom of the Great Cycle' extra information.",
"Fixes for the API change of distance checks.",
"Fixed some panels in the options panel, not closing at pressing the X button.",
"Fixed the Pet of a Pet detection non ending loop (Flamanis).",
"Fixed the issue of combats having only 1 second of duration.",
"Fixed the Damage Graphic not showing after a Mythic+ run.",
"Fixed an issue while renaming a spell, the change wouldn't stick and the spell would be renamed back to the original name.",
"Fixed death logs now showing the green healing bar.",
"Fixed Augmentation Evoker not showing the extra predicted damage bar.",
"Fixed an issue where users were unable to see interrupts and cooldowns.",
"Added to Combat Class: combat:GetRunTime(). This returns the run time if available or combat:GetCombatTime() if not.",
{"v10.2.0.12023.155", "November 08th, 2023"},
"Several fixes to make the addon work with the combat log changes done on patch 10.2.0.",
"Added trinket data for patch 10.2.0.",
"Fixed an issue with death tooltips going off-screen when the window is too close to a screen border.",
"Fixed a spam of errors during battlegrounds when an enemy player heal with a dot spell.",
{"v10.1.7.12012.155", "October 27th, 2023"},
"Implemented [Pip's Emerald Friendship Badge] trinket buffs.",
"Implemented the amount of times 'On Use' trinkets are used.",
"10.2 trinket damage spells renamed to the item name.",
"Framework Upgrade",
"Lib OpenRaid Upgrade.",
"Fixed the issue 'Segment Not Found' while resetting data.",
"Fixed Rogue icon",
"Fixed an issue with the healing merge amount on death tooltips (Flamanis).",
"Fixed 'extraStatusbar' showing in wrong views (non-player-dmg) (Continuity).",
"Removed LibCompress (Flamanis).",
{"v10.1.7.11914.155", "September 13th, 2023"},
"Added an extra bar within the evoker damage bar, this new bar when hovered over shows the buff uptime of Ebon Might and Prescience on all players.",
"ToC Files of all plugins got updated.",
"Fixed the error 'Attempt to compare string with number' on vanilla (Flamanis).",
"Fixed the error 'object:ToolTip() is invalid'.",
{"v10.1.7.11901.155", "September 09th, 2023"},
"Evoker Predicted Damage improvements.",
"Improved spellId check for first hit when entering a combat (Flamanis).",
"Replaced Classic Era deprecated functions (Flamanis).",
"Change DF/pictureedit frame heirarchy to allow for close button and Done button to work right (Flamanis).",
"Unlocked Retail Streamer plugin for Classic Era (Flamanis).",
"Attempt to fix death log healing spam where a spell has multiple heals in the same millisecond.",
"Fixed an error with the old comparison window.",
{"v10.1.7.11856.155", "August 13th, 2023"},
"Fixed an issue with importing a profile with a corrupted time type.",
"Added Elemental Shaman overload spells (WillowGryph).",
{"v10.1.5.11855.155", "August 12th, 2023"},
"Forcing update interval to 0.1 on arenas matches using the real-time dps feature.",
"More parser cleanups and code improvements.",
"Auras tab now ignores regular 'world auras' (those weekly buffs of reputation, etc)",
"Fixed the player info tooltip (hovering the spec icon) height not being updated for Evoker Predicted damage.",
"Framework Update.",
"Lib Open Raid Update.",
"Code cleanup and refactoring.",
{"v10.1.5.11773.151", "July 30th, 2023"},
"Add animIn/animOut checks for the welcome window (Flamanis)",
"Fixed an issue with players with the time measurement 'real time' (Flamanis).",
{"v10.1.5.11770.151", "July 29th, 2023"},
"Removed 'Real Time DPS' from the time measure dropdown.",
"Added 'Show 'Real Time' DPS' toggle to show real time dps while in combat.",
"Added 'Order Bars By Real Time DPS' toggle to order bars by the amount of real time dps.",
"Added 'Always Use Real Time in Arenas' toggle to always use real time dps in Arenas.",
"Added .last_dps_realtime to player actors, caches the latest real time dps calculated.",
"Fixed breakdown window not opening when there's player data available at the window.",
"Fixed Augmented Evoker buffs placed before the combat start not being counted.",
"Cyclical pet ownership fix (Flamanis).",
"Added: Details:FindBuffCastedBy(unitId, buffSpellId, casterName), return up to 19 parameters",
"Framework and OpenRaid upgrades.",
{"v10.1.5.11718.151", "July 20th, 2023"},
"Renamed damageActor.extra_bar to damageActor.total_extra",
"Added: Details:ShowExtraStatusbar(barLineObject, amount, amountPercent, extraAmount)",
"Add the evoker predicted damage to overall data.",
"If any damage actor has 'total_extra' bigger than 0, the extra bar is shown.",
"List of spec names for spec tooltip detection now load at Startup not at lua compiling.",
"Renamed InstaciaCallFunction to InstanceCallDetailsFunc.",
"Fixed things about the Real Time DPS; Open Raid Lib Update.",
"Fixed Details:FindDebuffDuration(unitId, spellId, casterName) which wasn't taking the casterName in consideration.",
"Fixes on Encounter Details plugin.",
"Fixed an issue of clicking in a plugin icon in the title bar of Details! but the plugin wouldn't open.",
{"v10.1.5.11718.151", "July 13th, 2023"},
"Added: Hovering over the Augmented Evoker icon shows the Evoker's damage, along with an estimated damage done by its buffs.",
"Auras tab at the Breakdown Window, now shows damage buffs received from other players (Ebon Might, Precience and Power Infusion).",
"Auras tab now ignores regular 'world auras' (those weekly buffs of reputation, etc).",
"Added individual bar for Neltharus Weapons. Weapons on final boss and the Burning Chain (Flamanis).",
"Update interval is set to 0.1 on arenas matches using the real-time dps feature.",
"Evoker's predicted damage done is now also shown in the overall data.",
"Removed 'Real Time DPS' from the time measure dropdown.",
"Added 'Show Real Time DPS' toggle to show real time dps while in combat.",
"Added 'Order Bars By Real Time DPS' toggle to order bars by the amount of real time dps.",
"Added 'Always Use Real Time in Arenas' toggle to always use real time dps in Arenas.",
"Fixed an issue where the Breakdown Window was not refreshing when the data was reset.",
"Fixed an issue where clicking on a plugin icon in the Details! title bar would not open the plugin.",
"Fixed bugs reported for the Encounter Details plugin.",
"Fixed bugs reported for the Real Time DPS.",
"Fixed Welcome Window sometimes not opening for new instalations (Flamanis).",
"*Combat start code verification cleanup (Flamanis).",
"*Added .last_dps_realtime to player actors, caches the latest real time dps calculated.",
"*Added: actordamage.total_extra for cases where there's a secondary bar for a damage actor.",
"*If any damage actor has 'total_extra' bigger than 0, the extra bar is shown.",
"*Added: Details:ShowExtraStatusbar(lineFrame, amount, extraAmount, totalAmount, topAmount, instanceObject, onEnterFunc, onLeaveFunc)",
"*Renamed 'InstaciaCallFunction' to 'InstanceCallDetailsFunc'.",
"*Renamed 'PegaHabilidade' to GetOrCreateSpell.",
"*Renamed 'PegarCombatente' to 'GetOrCreateActor'.",
"*List of spec names for spec tooltip detection now load at Startup not at lua compiling stage.",
"*Fixed custom displays ignoring actor.customColor.",
"*Details! Framework and LibOpenRaid upgrades.",
{"v10.1.0.11700.151", "July 11th, 2023"},
"Effective time is used when displaying tooltips information.",
"Wrap the specid name locatlization cache in a Details Framework check.",
"More fixes for real time dps.",
"Don't populate overall segment on load and force refresh window on segment swap.",
"Added: spec detection from the specialization name shown on tooltip.",
"Improvements to class detection by using GetPlayerInfoByGUID()",
"Removed Breath of Eons from spec detection for augmentation evokers.",
"When DBM/BW send a callback, check if the current combat in details is valid.",
"When the actor is considered a ungroupped player, check if that player has a spec and show the spec icon instead.",
"Segments locked don't swap windows to overall.",
"Use the new API 'SetSegment' over 'TrocaTabela' for the segment selector.",
"Sort damage taken tooltip on damage amount.",
"Added: Details:GetBossEncounterTexture(encounterName); Added combat.bossIcon; Added combat.bossTimers.",
"Added: Details:DoesCombatWithUIDExists(uniqueCombatId); Details:GetCombatByUID(uniqueCombatId); combat:GetCombatUID().",
"Added: Details:RemoveSegmentByCombatObject(combatObject).",
"Details:UnpackDeathTable(deathTable) now return the spec of the character as the last parameter returned.",
"classCombat:GetTimeData(chartName) now check if the combat has a TimeData table or return an empty table; Added classCombat:EraseTimeData(chartName).",
"Code for Dispel has been modernized, deathTable now includes the key .spec.",
"Added: key .unixtime into is_boss to know when the boss was killed.",
"Fixed an issue with auto run code not saving properly.",
"Ignore vessel periodic damage when out of combat.",
"More fixes for Augmentation Evoker on 10.1.5.",
"Another wave of code changes, modernizations and refactoring.",
"Combat Objects which has been discarded due to any reason will have the boolean member: __destroyed set to true. With this change, 3rd party code can see if the data cached is up to date or obsolete.",
"Removed several deprecated code from March 2023 and earlier.",
"Large amount of code cleanup and refactoring, some functions got renamed, they are listed below:",
"- 'TravarTempos' renamed to 'LockActivityTime'.",
"- 'ClearTempTables' renamed to 'ClearCacheTables'.",
"- 'SpellIsDot' renamed to 'SetAsDotSpell'.",
"- 'FlagCurrentCombat' remamed to 'FlagNewCombat_PVPState'.",
"- 'segmentClass:AddCombat(combatObject)' renamed to 'Details222.Combat.AddCombat(combatToBeAdded)'.",
"- 'CurrentCombat.verifica_combate' timer is now obsolete.",
"- 'Details.last_closed_combat' is now obsolete.",
"- 'Details.EstaEmCombate' is now obsolete.",
"- 'Details.options' is now obsolete.",
"- Spec Guess Timers are now stored within Details222.GuessSpecSchedules.Schedules, all timers are killed at the end of the combat or at a data reset.",
"- Initial time delay to send the startup signal (event sent when details has started) reduced from 5 to 4 seconds.",
"- Fixed some division by zero on ptr 10.1.5.",
"- Fixed DETAILS_STARTED event not triggering in some cases due to 'event not registered'.",
"Fixed Auto Run Code window not closing by click on the close button.",
"Set up statusbar options instead of using metatable.",
"More code cleanup and framework updates.",
"TimeData code modernizations.",
"Implementations to show plugins in the breakdown window.",
"Damage Taken by Spell overhaul, now it uses modern Details API.",
"Time Machine overhaul.",
"Splitted the window_playerbreakdown_spells.lua into three more files.",
"Added IconTexture directive to the TOC files.",
"Disabled time captures for spellTables, this should be done by a plugin.",
"Replacing table.wipe with Details:Destroy().",
}
local newsString = "|cFFF1F1F1"
for i = 1, #news do
local line = news[i]
if (type(line) == "table") then
local version = line[1]
local date = line[2]
newsString = newsString .. "|cFFFFFF00" .. version .. " (|cFFFF8800" .. date .. "|r):|r\n\n"
else
if (line ~= "") then
newsString = newsString .. "|cFFFFFF00-|r " .. line .. "\n\n"
else
newsString = newsString .. " \n"
end
end
end
Loc["STRING_VERSION_LOG"] = newsString
Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r "
--startup
_detalhes.max_windowline_columns = 11
_detalhes.initializing = true
_detalhes.enabled = true
_detalhes.__index = _detalhes
_detalhes._tempo = time()
_detalhes.debug = false
_detalhes.debug_chr = false
_detalhes.opened_windows = 0
_detalhes.last_combat_time = 0
_detalhes.last_zone_type = "INIT"
_detalhes.last_zone_id = -1
--store functions to create options frame
Details.optionsSection = {}
--containers
--armazenas as fun��es do parser - All parse functions
_detalhes.parser = {}
_detalhes.parser_functions = {}
Details222.parser_frame = CreateFrame("Frame")
Details222.parser_frame:Hide()
_detalhes.pvp_parser_frame = CreateFrame("Frame")
_detalhes.MacroList = {
{Name = "Click on Your Own Bar", Desc = "To open the player details window on your character, like if you click on your bar in the damage window. The number '1' is the window number where it'll click.", MacroText = "/script Details:OpenPlayerDetails(1)"},
{Name = "Open Encounter Breakdown", Desc = "Open the encounter breakdown plugin. Details! Encounter Breakdown (plugin) must be enabled.", MacroText = "/script Details:OpenPlugin ('Encounter Breakdown')"},
{Name = "Open Damage per Phase", Desc = "Open the encounter breakdown plugin in the phase tab. Details! Encounter Breakdown (plugin) must be enabled.", MacroText = "/script Details:OpenPlugin ('Encounter Breakdown'); local a=Details_EncounterDetails and Details_EncounterDetails.buttonSwitchPhases:Click()"},
{Name = "Reset Data", Desc = "Reset the overall and regular segments data. Use 'ResetSegmentOverallData' to reset only the overall.", MacroText = "/script Details:ResetSegmentData()"},
{Name = "Change What the Window Shows", Desc = "Make a window show different data. SetDisplay uses (segment, displayGroup, displayID), the menu from the sword icon is in order (damage = group 1, overheal is: displayGroup 2 displayID 3.", MacroText = "/script Details:GetWindow(1):SetDisplay( DETAILS_SEGMENTID_CURRENT, 4, 5 )"},
{Name = "Toggle Window Height to Max Size", Desc = "Make a window be 450 pixel height, pressing the macro again toggle back to the original size. The number '1' if the window number. Hold a click in any window to show their number.", MacroText = "/script Details:GetWindow(1):ToggleMaxSize()"},
-- /script Details:OpenPlugin ('Advanced Death Logs'); local a = Details_DeathGraphsModeEnduranceButton and Details_DeathGraphsModeEnduranceButton.MyObject:Click()
{Name = "Report What is Shown In the Window", Desc = "Report the current data shown in the window, the number 1 is the window number, replace it to report another window.", MacroText = "/script Details:FastReportWindow(1)"},
}
--current instances of the exp (need to maintain) - deprecated july 2024 - should do this automatically
Details.InstancesToStoreData = { --mapId
[2657] = true, --Nerub-ar Palace v11 T1
[2294] = true, --Nerub-ar Palace v11 T1
}
--store shield information for absorbs
_detalhes.ShieldCache = {}
--armazena as fun��es dos frames - Frames functions
_detalhes.gump = _G ["DetailsFramework"]
function _detalhes:GetFramework()
return self.gump
end
GameCooltip = GameCooltip2
--anima��es dos icones
_detalhes.icon_animations = {
load = {
in_use = {},
available = {},
},
}
--make a color namespace
Details.Colors = {}
function Details.Colors.GetMenuTextColor()
return "orange"
end
function Details:GetTextureAtlasTable()
return Details.TextureAtlas
end
--armazena as fun��es para inicializa��o dos dados - Metatable functions
_detalhes.refresh = {}
--armazena as fun��es para limpar e guardas os dados - Metatable functions
_detalhes.clear = {}
--armazena a config do painel de fast switch
_detalhes.switch = {}
--armazena os estilos salvos
_detalhes.savedStyles = {}
--armazena quais atributos possue janela de atributos - contain attributes and sub attributos wich have a detailed window (left click on a row)
_detalhes.row_singleclick_overwrite = {}
--report
_detalhes.ReportOptions = {}
--armazena os buffs registrados - store buffs ids and functions
_detalhes.Buffs = {} --initialize buff table
-- cache de grupo
_detalhes.cache_damage_group = {}
_detalhes.cache_healing_group = {}
_detalhes.cache_npc_ids = {}
--cache de specs
_detalhes.cached_specs = {}
_detalhes.cached_talents = {}
--ignored pets
_detalhes.pets_ignored = {}
_detalhes.pets_no_owner = {}
--dual candidates
_detalhes.duel_candidates = {}
--armazena as skins dispon�veis para as janelas
_detalhes.skins = {}
--armazena os hooks das fun��es do parser
---@type table<detailshook, function[]>
_detalhes.hooks = {}
--informa��es sobre a luta do boss atual
_detalhes.encounter_end_table = {}
_detalhes.encounter_table = {}
_detalhes.encounter_counter = {}
_detalhes.encounter_dungeons = {}
--unitId dos inimigos dentro de uma arena
_detalhes.arena_enemies = {}
--reliable char data sources
--actors that are using details! and sent character data, we don't need query inspect on these actors