Changed the health on death logs to be live percent (health % at hit moment), was before health amount divided by default character life amount

This commit is contained in:
Tercio Jose
2024-07-29 17:42:33 -03:00
committed by andrew6180
parent 41a347e606
commit beca97a948
14 changed files with 451 additions and 76 deletions
+1 -1
View File
@@ -1332,7 +1332,7 @@ detailsFramework.TabButtonMixin = {
---@return df_tabbutton ---@return df_tabbutton
function detailsFramework:CreateTabButton(parent, frameName) function detailsFramework:CreateTabButton(parent, frameName)
---@type df_tabbutton ---@type df_tabbutton
local tabButton = CreateFrame("button", frameName, parent) local tabButton = CreateFrame("button", frameName, parent, "BackdropTemplate")
tabButton:SetSize(50, 20) tabButton:SetSize(50, 20)
tabButton.bIsSelected = false tabButton.bIsSelected = false
+8 -5
View File
@@ -1,6 +1,6 @@
local dversion = 551 local dversion = 553
local major, minor = "DetailsFramework-1.0", dversion local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary(major, minor) local DF, oldminor = LibStub:NewLibrary(major, minor)
@@ -2505,6 +2505,9 @@ local templateOnLeave = function(frame)
end end
end end
DF.TemplateOnEnter = templateOnEnter
DF.TemplateOnLeave = templateOnLeave
---set a details framework template into a regular frame ---set a details framework template into a regular frame
---@param self table ---@param self table
---@param frame uiobject ---@param frame uiobject
@@ -2630,10 +2633,10 @@ DF.dropdown_templates["OPTIONS_DROPDOWN_TEMPLATE"] = {
tile = true tile = true
}, },
backdropcolor = {1, 1, 1, .7}, backdropcolor = {0.1, 0.1, 0.1, .7},
backdropbordercolor = {0, 0, 0, 1}, onentercolor = {0.3, 0.3, 0.3, .7},
onentercolor = {1, 1, 1, .9}, backdropbordercolor = {0, 0, 0, .7},
onenterbordercolor = {1, 1, 1, 1}, onenterbordercolor = {0.3, 0.3, 0.3, 0.8},
dropicon = "Interface\\BUTTONS\\arrow-Down-Down", dropicon = "Interface\\BUTTONS\\arrow-Down-Down",
dropiconsize = {16, 16}, dropiconsize = {16, 16},
+22
View File
@@ -268,6 +268,28 @@ function detailsFramework.Schedules.AfterById(time, callback, id, ...)
return newTimer return newTimer
end end
--Schedules a callback function to be executed after a specified time delay.
--It uniquely identifies each scheduled task by an ID, if another schedule with the same id is made, it will be ignore until the previous one is finished.
function detailsFramework.Schedules.AfterByIdNoCancel(time, callback, id, ...)
if (not detailsFramework.Schedules.ExecuteTimerTableNoCancel) then
detailsFramework.Schedules.ExecuteTimerTableNoCancel = {}
end
local alreadyHaveTimer = detailsFramework.Schedules.ExecuteTimerTableNoCancel[id]
if (alreadyHaveTimer) then
return
end
local newTimer = detailsFramework.Schedules.NewTimer(time, callback, ...)
detailsFramework.Schedules.ExecuteTimerTableNoCancel[id] = newTimer
C_Timer.After(time, function()
detailsFramework.Schedules.ExecuteTimerTableNoCancel[id] = nil
end)
return newTimer
end
--schedule a function to be called after 'time' --schedule a function to be called after 'time'
--prompt example: create a schedule that runs the function 'variable name' after 'time' amount of seconds --prompt example: create a schedule that runs the function 'variable name' after 'time' amount of seconds
function detailsFramework.Schedules.After(time, callback) function detailsFramework.Schedules.After(time, callback)
+40 -1
View File
@@ -287,7 +287,12 @@ detailsFramework.TextEntryCounter = detailsFramework.TextEntryCounter or 1
if (textentry:IsEnabled()) then if (textentry:IsEnabled()) then
textentry.current_bordercolor = textentry.current_bordercolor or {textentry:GetBackdropBorderColor()} textentry.current_bordercolor = textentry.current_bordercolor or {textentry:GetBackdropBorderColor()}
textentry:SetBackdropBorderColor(1, 1, 1, 1) local onEnterBorderColor = object.onenter_backdrop_border_color
if (onEnterBorderColor) then
textentry:SetBackdropBorderColor(detailsFramework:ParseColors(onEnterBorderColor))
else
textentry:SetBackdropBorderColor(1, 1, 1, 0.6)
end
end end
end end
@@ -522,11 +527,13 @@ function TextEntryMetaFunctions:SetTemplate(template)
if (template.backdrop) then if (template.backdrop) then
self.editbox:SetBackdrop(template.backdrop) self.editbox:SetBackdrop(template.backdrop)
end end
if (template.backdropcolor) then if (template.backdropcolor) then
local r, g, b, a = detailsFramework:ParseColors(template.backdropcolor) local r, g, b, a = detailsFramework:ParseColors(template.backdropcolor)
self.editbox:SetBackdropColor(r, g, b, a) self.editbox:SetBackdropColor(r, g, b, a)
self.onleave_backdrop = {r, g, b, a} self.onleave_backdrop = {r, g, b, a}
end end
if (template.backdropbordercolor) then if (template.backdropbordercolor) then
local r, g, b, a = detailsFramework:ParseColors(template.backdropbordercolor) local r, g, b, a = detailsFramework:ParseColors(template.backdropbordercolor)
self.editbox:SetBackdropBorderColor(r, g, b, a) self.editbox:SetBackdropBorderColor(r, g, b, a)
@@ -536,8 +543,40 @@ function TextEntryMetaFunctions:SetTemplate(template)
self.editbox.current_bordercolor[4] = a self.editbox.current_bordercolor[4] = a
self.onleave_backdrop_border_color = {r, g, b, a} self.onleave_backdrop_border_color = {r, g, b, a}
end end
if (template.onentercolor) then
local r, g, b, a = detailsFramework:ParseColors(template.onentercolor)
self.onenter_backdrop = {r, g, b, a}
self:HookScript("OnEnter", detailsFramework.TemplateOnEnter)
self.__has_onentercolor_script = true
end
if (template.onleavecolor) then
local r, g, b, a = detailsFramework:ParseColors(template.onleavecolor)
self.onleave_backdrop = {r, g, b, a}
self:HookScript("OnLeave", detailsFramework.TemplateOnLeave)
self.__has_onleavecolor_script = true
end
if (template.onenterbordercolor) then
local r, g, b, a = detailsFramework:ParseColors(template.onenterbordercolor)
self.onenter_backdrop_border_color = {r, g, b, a}
if (not self.__has_onentercolor_script) then
self:HookScript("OnEnter", detailsFramework.TemplateOnEnter)
end
end
if (template.onleavebordercolor) then
local r, g, b, a = detailsFramework:ParseColors(template.onleavebordercolor)
self.onleave_backdrop_border_color = {r, g, b, a}
if (not self.__has_onleavecolor_script) then
self:HookScript("OnLeave", detailsFramework.TemplateOnLeave)
end
end
end end
--TextEntryMetaFunctions.SetTemplate = DetailsFramework.SetTemplate
------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------
--object constructor --object constructor
+2
View File
@@ -60,6 +60,8 @@ end
openRaidLib.inGroup = false openRaidLib.inGroup = false
openRaidLib.UnitIDCache = {} openRaidLib.UnitIDCache = {}
openRaidLib.Util = openRaidLib.Util or {}
local CONST_CVAR_TEMPCACHE = "LibOpenRaidTempCache" local CONST_CVAR_TEMPCACHE = "LibOpenRaidTempCache"
local CONST_CVAR_TEMPCACHE_DEBUG = "LibOpenRaidTempCacheDebug" local CONST_CVAR_TEMPCACHE_DEBUG = "LibOpenRaidTempCacheDebug"
+3 -3
View File
@@ -19,12 +19,12 @@
local addonName, Details222 = ... local addonName, Details222 = ...
local version = GetBuildInfo() local version = GetBuildInfo()
Details.build_counter = 12819 Details.build_counter = 12820
Details.alpha_build_counter = 12819 --if this is higher than the regular counter, use it instead Details.alpha_build_counter = 12820 --if this is higher than the regular counter, use it instead
Details.dont_open_news = true Details.dont_open_news = true
Details.game_version = version Details.game_version = version
Details.userversion = version .. " " .. Details.build_counter Details.userversion = version .. " " .. Details.build_counter
Details.realversion = 158 --core version, this is used to check API version for scripts and plugins (see alias below) Details.realversion = 159 --core version, this is used to check API version for scripts and plugins (see alias below)
Details.gametoc = tvs Details.gametoc = tvs
Details.APIVersion = Details.realversion --core version Details.APIVersion = Details.realversion --core version
Details.version = Details.userversion .. " (core " .. Details.realversion .. ")" --simple stirng to show to players Details.version = Details.userversion .. " (core " .. Details.realversion .. ")" --simple stirng to show to players
+19
View File
@@ -940,6 +940,25 @@ local segmentTypeToString = {
end end
end end
function classCombat:CutDeathByTime(time)
local deathsTable = self:GetDeaths()
for i = #deathsTable, 1, -1 do
local deathTable = deathsTable[i]
local playerName, playerClass, deathTime, deathCombatTime, deathTimeString, playerMaxHealth, deathEvents, lastCooldown, spec = Details:UnpackDeathTable(deathTable)
for evIndex = 1, #deathEvents do
local event = deathEvents[evIndex]
local evType = event[1]
if (type(evType) == "boolean") then
local eventTime = event[4]
print(eventTime, deathTime)
if (eventTime+10 < deathTime) then
print("this event is ignored, and should be removed", event[1])
end
end
end
end
end
--return the total of a specific attribute --return the total of a specific attribute
local power_table = {0, 1, 3, 6, 0, "alternatepower"} local power_table = {0, 1, 3, 6, 0, "alternatepower"}
+4 -3
View File
@@ -205,8 +205,9 @@ function Details.ShowDeathTooltip(instance, lineFrame, combatObject, deathTable)
--death parser --death parser
for i, event in ipairs(events) do for i, event in ipairs(events) do
local currentHP = event[5] --local currentHP = event[5] * 100
local healthPercent = floor(currentHP / maxHP * 100) --local healthPercent = floor(currentHP / maxHP * 100)
local healthPercent = floor(event[5] * 100)
if (healthPercent > 100) then if (healthPercent > 100) then
healthPercent = 100 healthPercent = 100
end end
@@ -226,7 +227,7 @@ function Details.ShowDeathTooltip(instance, lineFrame, combatObject, deathTable)
local eventTime = event[4] local eventTime = event[4]
local source = Details:GetOnlyName(event[6] or "") local source = Details:GetOnlyName(event[6] or "")
if (eventTime + 12 > timeOfDeath) then if (eventTime + 10 > timeOfDeath) then
if (type(evType) == "boolean") then if (type(evType) == "boolean") then
--is damage or heal? --is damage or heal?
if (evType) then --bool true if (evType) then --bool true
+1 -1
View File
@@ -521,7 +521,7 @@
currentCombat:SetDateToNow(bSetStartTime, bSetEndTime) currentCombat:SetDateToNow(bSetStartTime, bSetEndTime)
currentCombat:SetEndTime(GetTime()) currentCombat:SetEndTime(GetTime())
--drop last events table to garbage collector --drop player last events table to garbage collector
currentCombat.player_last_events = {} currentCombat.player_last_events = {}
--flag instance type --flag instance type
+23
View File
@@ -2724,6 +2724,29 @@ function Details.FillTableWithPlayerSpells(completeListOfSpells)
end end
end end
end end
local getNumPetSpells = function()
--'HasPetSpells' contradicts the name and return the amount of pet spells available instead of a boolean
return HasPetSpells()
end
--get pet spells from the pet spellbook
local numPetSpells = getNumPetSpells()
if (numPetSpells) then
for i = 1, numPetSpells do
local spellName, _, unmaskedSpellId = GetSpellBookItemName(i, spellBookPetEnum)
if (unmaskedSpellId) then
unmaskedSpellId = GetOverrideSpell(unmaskedSpellId)
local bIsPassive = IsPassiveSpell(i, spellBookPetEnum)
if (spellName and not bIsPassive) then
completeListOfSpells[unmaskedSpellId] = true
end
end
end
end
--dumpt(completeListOfSpells)
return completeListOfSpells
end end
function Details.SavePlayTimeOnClass() function Details.SavePlayTimeOnClass()
+25 -25
View File
@@ -847,15 +847,15 @@
end end
--record death log --record death log
local t = last_events_cache[targetName] local actorLatestEvents = last_events_cache[targetName]
if (not t) then if (not actorLatestEvents) then
t = _current_combat:CreateLastEventsTable(targetName) actorLatestEvents = _current_combat:CreateLastEventsTable(targetName)
end end
local i = t.n local i = actorLatestEvents.n
local thisEvent = t [i] local thisEvent = actorLatestEvents[i]
thisEvent[1] = true --true if this is a damage || false for healing thisEvent[1] = true --true if this is a damage || false for healing
thisEvent[2] = spellId --spellid || false if this is a battle ress line thisEvent[2] = spellId --spellid || false if this is a battle ress line
thisEvent[3] = amount --amount of damage or healing thisEvent[3] = amount --amount of damage or healing
@@ -869,14 +869,14 @@
unitId = Details:GuessArenaEnemyUnitId(targetName) unitId = Details:GuessArenaEnemyUnitId(targetName)
end end
if (unitId) then if (unitId) then
thisEvent[5] = UnitHealth(unitId) thisEvent[5] = UnitHealth(unitId) / UnitHealthMax(unitId)
else else
thisEvent[5] = cacheAnything.arenaHealth[targetName] or 100000 thisEvent[5] = cacheAnything.arenaHealth[targetName] or 100000
end end
cacheAnything.arenaHealth[targetName] = thisEvent[5] cacheAnything.arenaHealth[targetName] = thisEvent[5]
else else
thisEvent[5] = UnitHealth(targetName) thisEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName)
end end
thisEvent[6] = sourceName --source name thisEvent[6] = sourceName --source name
@@ -890,9 +890,9 @@
i = i + 1 i = i + 1
if (i == _amount_of_last_events + 1) then if (i == _amount_of_last_events + 1) then
t.n = 1 actorLatestEvents.n = 1
else else
t.n = i actorLatestEvents.n = i
end end
end end
@@ -977,7 +977,7 @@
thisEvent[2] = spellId --spellid || false if this is a battle ress line thisEvent[2] = spellId --spellid || false if this is a battle ress line
thisEvent[3] = amount --amount of damage or healing thisEvent[3] = amount --amount of damage or healing
thisEvent[4] = time --parser time thisEvent[4] = time --parser time
thisEvent[5] = UnitHealth(targetName) --current unit heal thisEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName) --current unit heal
thisEvent[6] = sourceName --source name thisEvent[6] = sourceName --source name
thisEvent[7] = absorbed thisEvent[7] = absorbed
thisEvent[8] = spellType or school thisEvent[8] = spellType or school
@@ -1223,7 +1223,7 @@
this_event [2] = spellId --spellid || false if this is a battle ress line this_event [2] = spellId --spellid || false if this is a battle ress line
this_event [3] = amount --amount of damage or healing this_event [3] = amount --amount of damage or healing
this_event [4] = time --parser time this_event [4] = time --parser time
this_event [5] = UnitHealth(sourceName) --current unit heal this_event [5] = UnitHealth(sourceName) / UnitHealthMax(sourceName) --current unit heal
this_event [6] = sourceName --source name this_event [6] = sourceName --source name
this_event [7] = absorbed this_event [7] = absorbed
this_event [8] = school this_event [8] = school
@@ -1318,7 +1318,7 @@
this_event [2] = spellid --spellid || false if this is a battle ress line this_event [2] = spellid --spellid || false if this is a battle ress line
this_event [3] = amount --amount of damage or healing this_event [3] = amount --amount of damage or healing
this_event [4] = time --parser time this_event [4] = time --parser time
this_event [5] = UnitHealth(who_name) --current unit heal this_event [5] = UnitHealth(who_name) / UnitHealthMax(who_name) --current unit heal
this_event [6] = who_name --source name this_event [6] = who_name --source name
this_event [7] = absorbed this_event [7] = absorbed
this_event [8] = school this_event [8] = school
@@ -1438,7 +1438,7 @@
this_event [2] = spellid --spellid || false if this is a battle ress line this_event [2] = spellid --spellid || false if this is a battle ress line
this_event [3] = amount --amount of damage or healing this_event [3] = amount --amount of damage or healing
this_event [4] = time --parser time this_event [4] = time --parser time
this_event [5] = UnitHealth(alvo_name) --current unit heal this_event [5] = UnitHealth(alvo_name) / UnitHealthMax(alvo_name) --current unit heal
this_event [6] = who_name --source name this_event [6] = who_name --source name
this_event [7] = absorbed this_event [7] = absorbed
this_event [8] = spelltype or school this_event [8] = spelltype or school
@@ -1748,7 +1748,7 @@
end end
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
--HEALING serach key: ~healing | --HEALING serach key: ~healing ~heal |
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
-- https://github.com/TrinityCore/TrinityCore/blob/d81a9e5bc3b3e13b47332b3e7817bd0a0b228cbc/src/server/game/Spells/Auras/SpellAuraEffects.h#L313-L367 -- https://github.com/TrinityCore/TrinityCore/blob/d81a9e5bc3b3e13b47332b3e7817bd0a0b228cbc/src/server/game/Spells/Auras/SpellAuraEffects.h#L313-L367
@@ -2139,7 +2139,7 @@
end end
previousEvent[7] = previousEvent[7] or bIsShield previousEvent[7] = previousEvent[7] or bIsShield
previousEvent[1] = false --true if this is a damage || false for healing previousEvent[1] = false --true if this is a damage || false for healing
previousEvent[5] = UnitHealth(targetName) previousEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName)
previousEvent[11] = (previousEvent[11] or 0) + 1 --attempt to perform arithmetic on a boolean value (during battlegrounds - fix 02 Nov 2023) previousEvent[11] = (previousEvent[11] or 0) + 1 --attempt to perform arithmetic on a boolean value (during battlegrounds - fix 02 Nov 2023)
else else
local thisEvent = t[i] local thisEvent = t[i]
@@ -2158,12 +2158,12 @@
unitId = Details:GuessArenaEnemyUnitId(targetName) unitId = Details:GuessArenaEnemyUnitId(targetName)
end end
if (unitId) then if (unitId) then
thisEvent[5] = UnitHealth(unitId) thisEvent[5] = UnitHealth(unitId) / UnitHealthMax(unitId)
else else
thisEvent[5] = 0 thisEvent[5] = 0
end end
else else
thisEvent[5] = UnitHealth(targetName) thisEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName)
end end
thisEvent[6] = sourceName thisEvent[6] = sourceName
@@ -2304,7 +2304,7 @@
this_event [2] = spellid --spellid || false if this is a battle ress line this_event [2] = spellid --spellid || false if this is a battle ress line
this_event [3] = amount --amount of damage or healing this_event [3] = amount --amount of damage or healing
this_event [4] = time --parser time this_event [4] = time --parser time
this_event [5] = UnitHealth(alvo_name) --current unit heal this_event [5] = UnitHealth(alvo_name) / UnitHealthMax(alvo_name) --current unit heal
this_event [6] = who_name --source name this_event [6] = who_name --source name
this_event [7] = is_shield this_event [7] = is_shield
this_event [8] = absorbed this_event [8] = absorbed
@@ -2409,7 +2409,7 @@
thisEvent[2] = spellId --spellid thisEvent[2] = spellId --spellid
thisEvent[3] = 1 thisEvent[3] = 1
thisEvent[4] = time --parser time thisEvent[4] = time --parser time
thisEvent[5] = UnitHealth(targetName) --current unit heal thisEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName) --current unit heal
thisEvent[6] = sourceName --source name thisEvent[6] = sourceName --source name
thisEvent[7] = false thisEvent[7] = false
thisEvent[8] = false thisEvent[8] = false
@@ -2890,7 +2890,7 @@
thisEvent[2] = spellId --spellid thisEvent[2] = spellId --spellid
thisEvent[3] = 1 thisEvent[3] = 1
thisEvent[4] = time --parser time thisEvent[4] = time --parser time
thisEvent[5] = UnitHealth(targetName) --current unit heal thisEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName) --current unit heal
thisEvent[6] = sourceName --source name thisEvent[6] = sourceName --source name
thisEvent[7] = false thisEvent[7] = false
thisEvent[8] = false thisEvent[8] = false
@@ -2950,7 +2950,7 @@
thisEvent[2] = spellId --spellid thisEvent[2] = spellId --spellid
thisEvent[3] = stackSize or 1 thisEvent[3] = stackSize or 1
thisEvent[4] = time --parser time thisEvent[4] = time --parser time
thisEvent[5] = UnitHealth(targetName) --current unit heal thisEvent[5] = UnitHealth(targetName) / UnitHealthMax(targetName) --current unit heal
thisEvent[6] = sourceName --source name thisEvent[6] = sourceName --source name
thisEvent[7] = false thisEvent[7] = false
thisEvent[8] = false thisEvent[8] = false
@@ -3425,7 +3425,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
thisEvent[2] = spellId --spellid || false if this is a battle ress line thisEvent[2] = spellId --spellid || false if this is a battle ress line
thisEvent[3] = 1 --amount of damage or healing thisEvent[3] = 1 --amount of damage or healing
thisEvent[4] = time thisEvent[4] = time
thisEvent[5] = UnitHealth(sourceName) thisEvent[5] = UnitHealth(sourceName) / UnitHealthMax(sourceName)
thisEvent[6] = sourceName thisEvent[6] = sourceName
i = i + 1 i = i + 1
@@ -3888,7 +3888,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
spellId, spellId,
1, 1,
time, time,
UnitHealth(targetName), UnitHealth(targetName) / UnitHealthMax(targetName),
sourceName sourceName
}) })
break break
@@ -4099,6 +4099,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
--get the index of the last event recorded --get the index of the last event recorded
local lastIndex = recordedEvents.n local lastIndex = recordedEvents.n
--first, remove all healing events where the player was at full health
--here the event log gets reordered as in the parser it work with index recycling --here the event log gets reordered as in the parser it work with index recycling
if (lastIndex < _amount_of_last_events+1 and not recordedEvents[lastIndex][4]) then if (lastIndex < _amount_of_last_events+1 and not recordedEvents[lastIndex][4]) then
--the last events table amount of indexes is less than the amount of events to store --the last events table amount of indexes is less than the amount of events to store
@@ -4223,8 +4225,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
eventsBeforePlayerDeath[#eventsBeforePlayerDeath+1] = eventTable eventsBeforePlayerDeath[#eventsBeforePlayerDeath+1] = eventTable
end end
local maxHealth local maxHealth
if (thisPlayer.arena_enemy) then if (thisPlayer.arena_enemy) then
--this is an arena enemy, get the heal with the unit Id --this is an arena enemy, get the heal with the unit Id
+3 -1
View File
@@ -17,6 +17,8 @@ Details222.CooldownTracking = {
cooldownPanels = {}, cooldownPanels = {},
} }
local GetSpellTexture = C_Spell and C_Spell.GetSpellTexture or GetSpellTexture
function Details222.CooldownTracking.IsCooldownIgnored(spellId) function Details222.CooldownTracking.IsCooldownIgnored(spellId)
return Details.ocd_tracker.ignored_cooldowns[spellId] return Details.ocd_tracker.ignored_cooldowns[spellId]
end end
@@ -864,7 +866,7 @@ end
for spellId, spellInfo in pairs(LIB_OPEN_RAID_COOLDOWNS_INFO) do for spellId, spellInfo in pairs(LIB_OPEN_RAID_COOLDOWNS_INFO) do
if (spellInfo.class == className) then if (spellInfo.class == className) then
local spellName, _, spellIcon = GetSpellInfo(spellId) local spellName, _, spellIcon = Details222.GetSpellInfo(spellId)
if (spellName) then if (spellName) then
local smallSpellName = string.sub(spellName, 1, 12) local smallSpellName = string.sub(spellName, 1, 12)
+299 -35
View File
@@ -3,6 +3,7 @@
--this code should run only on beta periods of an new expansion --this code should run only on beta periods of an new expansion
local Details = _G.Details local Details = _G.Details
---@type detailsframework
local DF = _G.DetailsFramework local DF = _G.DetailsFramework
local _ local _
@@ -23,11 +24,26 @@ local scrollLineHeight = 20
Details.Survey = {} Details.Survey = {}
function Details.Survey.GetTargetCharacterForRealm() function Details.Survey.GetTargetCharacterForRealm()
if true then return "" end
if (UnitFactionGroup("player") == "Horde") then if (UnitFactionGroup("player") == "Horde") then
return "FistbirtbrezPQ" return "" --character name
end end
end end
---@class savedcooldowninfo
---@field cooldown number
---@field duration number
---@field type number|boolean
---@field silence number
---@field charges number
---@class savedcooldowninfoscrolldata
---@field spellId number
---@field type number|boolean
---@field spellName string
---@field savedCooldownInfo savedcooldowninfo
---@return table<spellid,savedcooldowninfo>
function Details.Survey.GetCategorySpellListForClass() function Details.Survey.GetCategorySpellListForClass()
local savedSpellsCategories = Details.spell_category_savedtable local savedSpellsCategories = Details.spell_category_savedtable
local unitClass = select(2, UnitClass("player")) local unitClass = select(2, UnitClass("player"))
@@ -36,10 +52,119 @@ function Details.Survey.GetCategorySpellListForClass()
thisClassSavedTable = {} thisClassSavedTable = {}
savedSpellsCategories[unitClass] = thisClassSavedTable savedSpellsCategories[unitClass] = thisClassSavedTable
end end
Details.FillTableWithPlayerSpells(thisClassSavedTable)
local allPlayerSpells = {}
Details.FillTableWithPlayerSpells(allPlayerSpells)
for spellId in pairs(allPlayerSpells) do
if (not thisClassSavedTable[spellId]) then
--get the cooldown time for the spell
local cooldownTime = GetSpellBaseCooldown(spellId)
local chargesInfo = C_Spell.GetSpellCharges(spellId)
local chargesAmount = 1
if (chargesInfo) then
chargesAmount = chargesInfo.maxCharges
--if the cooldown time doesn't match the requirement, check if the spell has charges and use the cooldown of the charge as the cooldown time
if (not cooldownTime or cooldownTime <= 5000) then
if (chargesInfo and chargesInfo.maxCharges > 0) then
cooldownTime = chargesInfo.cooldownDuration * 1000
end
end
end
if (cooldownTime and cooldownTime > 5000 and cooldownTime <= 360000) then --requirement: cooldown time must be greater than 5 seconds and lower then 6 minutes
local cooldownTable = LIB_OPEN_RAID_COOLDOWNS_INFO[spellId]
if (cooldownTable) then
thisClassSavedTable[spellId] = {cooldown = cooldownTime, duration = cooldownTable.duration or 0, type = cooldownTable.type or true, silence = cooldownTable.silence or 0, charges = cooldownTable.charges or chargesAmount}
else
thisClassSavedTable[spellId] = {cooldown = cooldownTime, duration = 0, type = true, silence = 0, charges = chargesAmount}
end
else
--local spellName = C_Spell.GetSpellInfo(spellId).name
--print("Cooldown not match:", spellName, spellId, cooldownTime)
end
end
end
return thisClassSavedTable return thisClassSavedTable
end end
---@param savedCooldownInfo savedcooldowninfo
---@param spellId number
---@param unitClass string
---@return string
local makeSpellExportString = function(savedCooldownInfo, spellId, unitClass)
local spellInfo = C_Spell.GetSpellInfo(spellId)
if (not spellInfo) then
Details:Msg("spell not found", spellId)
return ""
end
if (savedCooldownInfo.type == true) then
Details:Msg("spell not categorized:", spellInfo.name)
return ""
end
local spellName = spellInfo.name
if (savedCooldownInfo.type == 9) then --interrupt
return "["..spellId.."] = {cooldown = ".. (floor(savedCooldownInfo.cooldown / 1000)) ..",\tduration = "..savedCooldownInfo.duration..",\tsilence = ".. savedCooldownInfo.silence ..",\tspecs = {},\ttalent = false,\tcharges = " .. savedCooldownInfo.charges ..",\tclass = \""..unitClass.."\",\ttype = "..savedCooldownInfo.type.."}, --" .. spellName
else
return "["..spellId.."] = {cooldown = ".. (floor(savedCooldownInfo.cooldown / 1000)) ..",\tduration = "..savedCooldownInfo.duration..",\tspecs = {},\ttalent = false,\tcharges = " .. savedCooldownInfo.charges ..",\tclass = \""..unitClass.."\",\ttype = "..savedCooldownInfo.type.."}, --" .. spellName
end
end
function Details.Survey.ExportSpellCatogeryData()
local savedSpellsCategories = Details.spell_category_savedtable
local unitClass = select(2, UnitClass("player"))
local thisClassSavedTable = savedSpellsCategories[unitClass]
local exportString = "\n\n\n"
for spellId, savedCooldownInfo in pairs(thisClassSavedTable) do
---@type spellinfo
local spellInfo = C_Spell.GetSpellInfo(spellId)
---@cast savedCooldownInfo savedcooldowninfo
if (savedCooldownInfo.type ~= true) then
if (spellInfo) then
local stringToExport = makeSpellExportString(savedCooldownInfo, spellId, unitClass)
exportString = exportString .. stringToExport .. "\n"
end
end
end
exportString = exportString .. "\n\n\n"
dumpt(exportString)
end
function Details.Survey.ExportSingleSpellCatogeryData(line)
local spellId = line.spellId
local savedSpellsCategories = Details.spell_category_savedtable
local unitClass = select(2, UnitClass("player"))
local thisClassSavedTable = savedSpellsCategories[unitClass]
---@type savedcooldowninfo
local savedCooldownInfo = spellId and thisClassSavedTable[spellId]
if (savedCooldownInfo) then
---@type spellinfo
local spellInfo = C_Spell.GetSpellInfo(spellId)
if (spellInfo) then
local stringToExport = makeSpellExportString(savedCooldownInfo, spellId, unitClass)
if (stringToExport ~= "") then
dumpt("\n\n\n" .. stringToExport .. "\n\n\n")
end
end
end
return "something went wrong"
end
function Details.Survey.SendSpellCatogeryDataToTargetCharacter() function Details.Survey.SendSpellCatogeryDataToTargetCharacter()
local targetCharacter = Details.Survey.GetTargetCharacterForRealm() local targetCharacter = Details.Survey.GetTargetCharacterForRealm()
if (not targetCharacter) then if (not targetCharacter) then
@@ -146,8 +271,10 @@ function Details.Survey.OpenSpellCategoryScreen()
DetailsSpellCategoryFrame = DetailsFramework:CreateSimplePanel(UIParent) DetailsSpellCategoryFrame = DetailsFramework:CreateSimplePanel(UIParent)
local detailsSpellCategoryFrame = DetailsSpellCategoryFrame local detailsSpellCategoryFrame = DetailsSpellCategoryFrame
detailsSpellCategoryFrame:SetSize(scroll_width, windowHeight+26) detailsSpellCategoryFrame:SetSize(scroll_width, windowHeight+26)
detailsSpellCategoryFrame:SetTitle("Identifying and Categorizing Cooldown Spells") detailsSpellCategoryFrame:SetTitle("Details! Damage Meter: Spell Category Selection")
detailsSpellCategoryFrame.Data = {} detailsSpellCategoryFrame.Data = {}
detailsSpellCategoryFrame.Title:ClearAllPoints()
detailsSpellCategoryFrame.Title:SetPoint("left", detailsSpellCategoryFrame.TitleBar, "left", 5, 0)
--statusbar --statusbar
local statusBar = CreateFrame("frame", nil, detailsSpellCategoryFrame, "BackdropTemplate") local statusBar = CreateFrame("frame", nil, detailsSpellCategoryFrame, "BackdropTemplate")
@@ -162,26 +289,31 @@ function Details.Survey.OpenSpellCategoryScreen()
statusBar2:SetPoint("topleft", statusBar, "bottomleft") statusBar2:SetPoint("topleft", statusBar, "bottomleft")
statusBar2:SetPoint("topright", statusBar, "bottomright") statusBar2:SetPoint("topright", statusBar, "bottomright")
statusBar2:SetHeight(20) statusBar2:SetHeight(20)
statusBar2:SetAlpha(0.8) statusBar2:SetAlpha(0.99)
DF:ApplyStandardBackdrop(statusBar2) DF:ApplyStandardBackdrop(statusBar2)
DF:ApplyStandardBackdrop(statusBar2) DF:ApplyStandardBackdrop(statusBar2)
local dataInfoLabel = DF:CreateLabel(statusBar2, "This cooldown data is send to people on Details! team and shared in 'Open Raid' library where any weakaura or addon can use it", 12, "silver") local dataInfoLabel = DF:CreateLabel(statusBar2, "An AddOn By Terciob", 12, "white")
dataInfoLabel:SetPoint("center", 0, 0) dataInfoLabel:SetPoint("left", 5, 0)
dataInfoLabel.justifyH = "center" dataInfoLabel.justifyH = "center"
--create the header --create the header
local defaultWidth = 70
local headerTable = { local headerTable = {
{text = "Icon", width = 24}, {text = "Icon", width = 24},
{text = "Spell Name", width = 140}, {text = "Spell Name", width = 150},
{text = "NONE", width = 70}, {text = "NONE", width = defaultWidth},
{text = "Offensive CD", width = 100}, {text = "Offensive CD", width = defaultWidth},
{text = "Personal Defensive CD", width = 120}, {text = "Personal CD", width = defaultWidth},
{text = "Targeted Defensive CD", width = 120}, {text = "Targeted CD", width = defaultWidth},
{text = "Raid Defensive CD", width = 120}, {text = "Raid CD", width = defaultWidth},
{text = "Raid Utility CD", width = 100}, {text = "Utility CD", width = defaultWidth},
{text = "Interrupt", width = 70}, {text = "Interrupt", width = defaultWidth},
{text = "Dispel", width = 50}, {text = "Dispel", width = defaultWidth},
{text = "CC", width = 50}, {text = "CC", width = defaultWidth},
{text = "Racial", width = defaultWidth},
{text = "Cooldown", width = defaultWidth},
{text = "Duration", width = defaultWidth},
{text = "Export", width = defaultWidth},
} }
local headerOptions = { local headerOptions = {
padding = 2, padding = 2,
@@ -192,10 +324,11 @@ function Details.Survey.OpenSpellCategoryScreen()
maxLineWidth = maxLineWidth + headerSettings.width maxLineWidth = maxLineWidth + headerSettings.width
end end
detailsSpellCategoryFrame:SetWidth(maxLineWidth + 20) detailsSpellCategoryFrame:SetWidth(maxLineWidth + 50)
local thisClassSavedTable = Details.Survey.GetCategorySpellListForClass() local thisClassSavedTable = Details.Survey.GetCategorySpellListForClass()
local sendButton = DetailsFramework:CreateButton(statusBar, function() Details.Survey.SendSpellCatogeryDataToTargetCharacter(); DetailsSpellCategoryFrame:Hide() end, 800, 20, "SAVE and SEND") --local sendButton = DetailsFramework:CreateButton(statusBar, function() Details.Survey.SendSpellCatogeryDataToTargetCharacter(); DetailsSpellCategoryFrame:Hide() end, 800, 20, "SAVE and SEND")
local sendButton = DetailsFramework:CreateButton(statusBar, function() Details.Survey.ExportSpellCatogeryData(); DetailsSpellCategoryFrame:Hide() end, 800, 20, "EXPORT ALL")
sendButton:SetPoint("center", statusBar, "center", 0, 0) sendButton:SetPoint("center", statusBar, "center", 0, 0)
detailsSpellCategoryFrame.Header = DetailsFramework:CreateHeader(detailsSpellCategoryFrame, headerTable, headerOptions) detailsSpellCategoryFrame.Header = DetailsFramework:CreateHeader(detailsSpellCategoryFrame, headerTable, headerOptions)
@@ -204,21 +337,31 @@ function Details.Survey.OpenSpellCategoryScreen()
local tooltipDesc = {} local tooltipDesc = {}
tooltipDesc[2] = "|cffffff00" .. headerTable[4].text .. "|r|n" .. "Examples:\nPower Infusion, Ice Veins, Combustion, Adrenaline Rush" --ofensive cooldowns tooltipDesc[2] = "|cffffff00" .. headerTable[4].text .. "|r|n" .. "Examples:\nPower Infusion, Ice Veins, Combustion, Adrenaline Rush" --ofensive cooldowns
tooltipDesc[3] = "|cffffff00" .. headerTable[5].text .. "|r|n" .. "Examples:\nIce Block, Dispersion, Cloak of Shadows, Shield Wall " --personal cooldowns tooltipDesc[3] = "|cffffff00" .. headerTable[5].text .. "|r|n" .. "Examples:\nIce Block, Dispersion, Cloak of Shadows, Shield Wall " --personal cooldowns
tooltipDesc[4] = "|cffffff00" .. headerTable[6].text .. "|r|n" .. "Examples:\nBlessing of Sacrifice, Ironbark, Life Cocoon, Pain Suppression" --targetted devense cooldowns tooltipDesc[4] = "|cffffff00" .. headerTable[6].text .. "|r|n" .. "Examples:\nBlessing of Sacrifice, Ironbark, Life Cocoon, Pain Suppression" --targeted devense cooldowns
tooltipDesc[5] = "|cffffff00" .. headerTable[7].text .. "|r|n" .. "Examples:\nPower Word: Barrier, Spirit Link Totem, Tranquility, Anti-Magic Zone" --raid wide cooldowns tooltipDesc[5] = "|cffffff00" .. headerTable[7].text .. "|r|n" .. "Examples:\nPower Word: Barrier, Spirit Link Totem, Tranquility, Anti-Magic Zone" --raid wide cooldowns
tooltipDesc[6] = "|cffffff00" .. headerTable[8].text .. "|r|n" .. "Examples:\nStampeding Roar, Leap of Faith" tooltipDesc[6] = "|cffffff00" .. headerTable[8].text .. "|r|n" .. "Examples:\nStampeding Roar, Leap of Faith"
tooltipDesc[7] = "" tooltipDesc[7] = ""
tooltipDesc[8] = "" tooltipDesc[8] = ""
tooltipDesc[9] = "" tooltipDesc[9] = ""
tooltipDesc[10] = ""
tooltipDesc[11] = ""
tooltipDesc[12] = ""
tooltipDesc[13] = ""
tooltipDesc[14] = ""
tooltipDesc[15] = ""
--create the scroll bar --create the scroll bar
local scrollRefreshFunc = function(self, data, offset, totalLines) local scrollRefreshFunc = function(self, data, offset, totalLines)
for i = 1, totalLines do for i = 1, totalLines do
local index = i + offset local index = i + offset
local spellTable = data[index] ---@type savedcooldowninfoscrolldata
local savedCooldownScrollData = data[index]
if (spellTable) then if (savedCooldownScrollData) then
local spellId = spellTable[1] ---@type savedcooldowninfo
local savedCooldownInfo = savedCooldownScrollData.savedCooldownInfo
local spellId = savedCooldownScrollData.spellId
--get a line --get a line
local line = self:GetLine(i) local line = self:GetLine(i)
local spellName, _, spellIcon = Details.GetSpellInfo(spellId) local spellName, _, spellIcon = Details.GetSpellInfo(spellId)
@@ -227,16 +370,45 @@ function Details.Survey.OpenSpellCategoryScreen()
line.SpellNameText.text = spellName line.SpellNameText.text = spellName
local radioGroup = line.RadioGroup local radioGroup = line.RadioGroup
line.spellId = spellId line.spellId = spellId
line.spellTable = savedCooldownScrollData
local durationTextEntry = line.DurationEntry
durationTextEntry:SetText(savedCooldownInfo.duration or "")
local cooldownTextEntry = line.CooldownEntry
local cdTime = savedCooldownInfo.cooldown
if (cdTime) then
cdTime = floor(cdTime / 1000)
else
cdTime = 0
end
cooldownTextEntry:SetText(cdTime)
local hasOptionSelected = false local hasOptionSelected = false
local radioGroupOptions = {} local radioGroupOptions = {}
for o in ipairs({"", "", "", "", "", "", "", "", ""}) do local cooldownType = savedCooldownInfo.type
hasOptionSelected = spellTable[2] ~= 1
for o = 1, 10 do
if (not hasOptionSelected) then
hasOptionSelected = cooldownType ~= true
end
local bOptionIsNone = o == 1
radioGroupOptions[o] = { radioGroupOptions[o] = {
name = "", name = "",
param = o,
get = function() return spellTable[2] == o end, param = (bOptionIsNone and true) or (o - 1),
callback = function(param, optionId) spellTable[2] = param; thisClassSavedTable[spellId] = param; Details.spell_category_latest_save = time() end,
get = function()
return (bOptionIsNone and cooldownType == true and true) or (o - 1 == cooldownType)
end,
callback = function(param, radioButtonIndex)
savedCooldownInfo.type = param
savedCooldownScrollData.type = param
Details.spell_category_latest_save = time()
end,
} }
end end
radioGroup:SetOptions(radioGroupOptions) radioGroup:SetOptions(radioGroupOptions)
@@ -256,16 +428,21 @@ function Details.Survey.OpenSpellCategoryScreen()
if (not childrenFrame.haveTooltipAlready and childId > 1) then if (not childrenFrame.haveTooltipAlready and childId > 1) then
if (tooltipDesc[childId] and tooltipDesc[childId] ~= "") then if (tooltipDesc[childId] and tooltipDesc[childId] ~= "") then
childrenFrame:SetScript("OnEnter", function() childrenFrame:SetScript("OnEnter", function()
GameCooltip:Preset(2) line.CurrectLineTexture:Show()
GameCooltip:AddLine(tooltipDesc[childId]) if (line.spellId) then
GameCooltip:SetOwner(childrenFrame) GameTooltip:SetOwner(line, "ANCHOR_NONE")
GameCooltip:Show() GameTooltip:SetPoint("bottomright", line, "bottomleft", -2, 0)
GameCooltipFrame1:ClearAllPoints() GameTooltip:SetSpellByID(line.spellId)
GameCooltipFrame1:SetPoint("bottomright", line, "bottomleft", -2, 0) GameTooltip:Show()
end
end) end)
childrenFrame:SetScript("OnLeave", function() childrenFrame:SetScript("OnLeave", function()
line.CurrectLineTexture:Hide()
GameCooltip:Hide() GameCooltip:Hide()
GameTooltip:Hide()
end) end)
childrenFrame.haveTooltipAlready = true childrenFrame.haveTooltipAlready = true
end end
end end
@@ -278,6 +455,7 @@ function Details.Survey.OpenSpellCategoryScreen()
local lineOnEnter = function(self) local lineOnEnter = function(self)
self:SetBackdropColor(unpack(backdrop_color_on_enter)) self:SetBackdropColor(unpack(backdrop_color_on_enter))
self.CurrectLineTexture:Show()
if (self.spellId) then if (self.spellId) then
GameTooltip:SetOwner(self, "ANCHOR_NONE") GameTooltip:SetOwner(self, "ANCHOR_NONE")
GameTooltip:SetPoint("bottomright", self, "bottomleft", -2, 0) GameTooltip:SetPoint("bottomright", self, "bottomleft", -2, 0)
@@ -288,6 +466,7 @@ function Details.Survey.OpenSpellCategoryScreen()
local lineOnLeave = function(self) local lineOnLeave = function(self)
self:SetBackdropColor(unpack(self.backdropColor)) self:SetBackdropColor(unpack(self.backdropColor))
self.CurrectLineTexture:Hide()
GameTooltip:Hide() GameTooltip:Hide()
end end
@@ -296,6 +475,45 @@ function Details.Survey.OpenSpellCategoryScreen()
spellScroll:SetPoint("topleft", detailsSpellCategoryFrame, "topleft", startX, scrollY) spellScroll:SetPoint("topleft", detailsSpellCategoryFrame, "topleft", startX, scrollY)
detailsSpellCategoryFrame.SpellScroll = spellScroll detailsSpellCategoryFrame.SpellScroll = spellScroll
local onCommitSpellDuration = function(_, _, text, self)
local line = self:GetParent()
local amountOfTime = tonumber(text)
if (amountOfTime and type(amountOfTime) == "number") then
---@type savedcooldowninfoscrolldata
local spellTable = line.spellTable
local savedCooldownInfo = spellTable.savedCooldownInfo
savedCooldownInfo.duration = amountOfTime
end
end
local onCommitSpellCooldown = function(_, _, text, self)
local line = self:GetParent()
local amountOfTime = tonumber(text)
if (amountOfTime and type(amountOfTime) == "number") then
---@type savedcooldowninfoscrolldata
local spellTable = line.spellTable
local savedCooldownInfo = spellTable.savedCooldownInfo
savedCooldownInfo.cooldown = amountOfTime
end
end
local onEnterExportButton = function(self)
local line = self:GetParent()
line.CurrectLineTexture:Show()
if (line.spellId) then
GameTooltip:SetOwner(line, "ANCHOR_NONE")
GameTooltip:SetPoint("bottomright", line, "bottomleft", -2, 0)
GameTooltip:SetSpellByID(line.spellId)
GameTooltip:Show()
end
end
local onLeaveExportButton = function(self)
local line = self:GetParent()
line.CurrectLineTexture:Hide()
GameTooltip:Hide()
end
local scrollCreateline = function(self, lineId) --self is spellScroll local scrollCreateline = function(self, lineId) --self is spellScroll
local line = CreateFrame("frame", "$parentLine" .. lineId, self, "BackdropTemplate") local line = CreateFrame("frame", "$parentLine" .. lineId, self, "BackdropTemplate")
DF:Mixin(line, DF.HeaderFunctions) DF:Mixin(line, DF.HeaderFunctions)
@@ -311,6 +529,13 @@ function Details.Survey.OpenSpellCategoryScreen()
line.hasDataBackground = background line.hasDataBackground = background
background:Hide() background:Hide()
local currectLineTexture = line:CreateTexture(nil, "background")
currectLineTexture:SetColorTexture(1, .2, .2, 0.4)
currectLineTexture:SetPoint("topleft", line, "topleft", 0, 0)
currectLineTexture:SetPoint("bottomright", line, "bottomright", 0, 0)
currectLineTexture:Hide()
line.CurrectLineTexture = currectLineTexture
line:SetBackdrop(backdrop) line:SetBackdrop(backdrop)
if (lineId % 2 == 0) then if (lineId % 2 == 0) then
line.backdropColor = backdrop_color line.backdropColor = backdrop_color
@@ -331,6 +556,31 @@ function Details.Survey.OpenSpellCategoryScreen()
--164 is the with of the first two headers (icon and spell name) --164 is the with of the first two headers (icon and spell name)
local radioGroup = DF:CreateRadioGroup(line, {}, "$parentRadioGroup1", {width = maxLineWidth - 164, height = 20}, {offset_x = 0, amount_per_line = 7}) local radioGroup = DF:CreateRadioGroup(line, {}, "$parentRadioGroup1", {width = maxLineWidth - 164, height = 20}, {offset_x = 0, amount_per_line = 7})
--create a button to export the data shown in the this line
local exportButton = DF:CreateButton(line, function() Details.Survey.ExportSingleSpellCatogeryData(line) end, 70-2, 20, "Export")
exportButton:SetPoint("right", line, "right", -2, 0)
exportButton:SetTemplate("STANDARD_GRAY")
exportButton:SetHook("OnEnter", onEnterExportButton)
exportButton:SetHook("OnLeave", onLeaveExportButton)
--create a text entry to allow the user to write the duration of the spell
local durationEntry = DF:CreateTextEntry(line, onCommitSpellDuration, 50, 20)
durationEntry:SetNumeric(true)
durationEntry:SetMaxLetters(5)
durationEntry:SetTemplate(DF:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
durationEntry:SetPoint("right", exportButton, "left", -14, 0)
durationEntry:SetHook("OnEnter", onEnterExportButton)
durationEntry:SetHook("OnLeave", onLeaveExportButton)
--create a text entry to allow the user to write the cooldown of the spell
local cooldownEntry = DF:CreateTextEntry(line, onCommitSpellCooldown, 50, 20)
cooldownEntry:SetNumeric(true)
cooldownEntry:SetMaxLetters(5)
cooldownEntry:SetTemplate(DF:GetTemplate("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
cooldownEntry:SetPoint("right", durationEntry, "left", -22, 0)
cooldownEntry:SetHook("OnEnter", onEnterExportButton)
cooldownEntry:SetHook("OnLeave", onLeaveExportButton)
line:AddFrameToHeaderAlignment(icon) line:AddFrameToHeaderAlignment(icon)
line:AddFrameToHeaderAlignment(spellNameText) line:AddFrameToHeaderAlignment(spellNameText)
line:AddFrameToHeaderAlignment(radioGroup) line:AddFrameToHeaderAlignment(radioGroup)
@@ -339,6 +589,9 @@ function Details.Survey.OpenSpellCategoryScreen()
line.Icon = icon line.Icon = icon
line.SpellNameText = spellNameText line.SpellNameText = spellNameText
line.RadioGroup = radioGroup line.RadioGroup = radioGroup
line.ExportButton = exportButton
line.DurationEntry = durationEntry
line.CooldownEntry = cooldownEntry
return line return line
end end
@@ -350,10 +603,21 @@ function Details.Survey.OpenSpellCategoryScreen()
function spellScroll:RefreshScroll() function spellScroll:RefreshScroll()
--create a list of spells from the spell book --create a list of spells from the spell book
---@type savedcooldowninfoscrolldata[]
local indexedSpells = {} local indexedSpells = {}
for spellId, result in pairs(thisClassSavedTable) do for spellId, savedCooldownInfo in pairs(thisClassSavedTable) do
indexedSpells[#indexedSpells+1] = {spellId, result == true and 1 or result} ---@cast savedCooldownInfo savedcooldowninfo
local spellInfo = C_Spell.GetSpellInfo(spellId)
if (spellInfo) then
indexedSpells[#indexedSpells+1] = {
spellId = spellId,
type = savedCooldownInfo.type == true and 1 or savedCooldownInfo.type,
spellName = spellInfo.name,
savedCooldownInfo = savedCooldownInfo
}
end
end end
table.sort(indexedSpells, function(a, b) return a.spellName < b.spellName end) --sort by name
spellScroll:SetData(indexedSpells) spellScroll:SetData(indexedSpells)
spellScroll:Refresh() spellScroll:Refresh()
end end
+1 -1
View File
@@ -1539,7 +1539,7 @@ function SlashCmdList.DETAILS (msg, editbox)
elseif (msg == "generateracialslist") then elseif (msg == "generateracialslist") then
Details.GenerateRacialSpellList() Details.GenerateRacialSpellList()
elseif (msg == "survey") then elseif (msg == "spellcat") then
Details.Survey.OpenSurveyPanel() Details.Survey.OpenSurveyPanel()
else else