Make raid first-frame state deterministic

This commit is contained in:
Dusk-92
2026-08-30 10:30:50 +02:00
parent dbb7cd3f69
commit bd2186c87b
8 changed files with 91 additions and 42 deletions
+1
View File
@@ -79,6 +79,7 @@ module.enable = function(self)
frame.aggro.tex:SetVertexColor(1, 0, 0, 1)
frame.aggro.tex:SetPoint("TOPLEFT", frame.aggro, "TOPLEFT", 2, -2)
frame.aggro.tex:SetPoint("BOTTOMRIGHT", frame.aggro, "BOTTOMRIGHT", -2, 2)
frame.aggro:Hide()
end,
update = function(frame, event)
+3 -1
View File
@@ -31,7 +31,9 @@ module.enable = function(self)
end,
update = function(frame, event)
if event and event == 'UNIT_COMBAT' then
if event then
if event ~= 'UNIT_COMBAT' then return end
-- update with latest values
if arg1 ~= frame.unitstr then return end
CombatFeedback_OnCombatEvent(arg2, arg3, arg4, arg5)
+6 -1
View File
@@ -59,8 +59,10 @@ module.enable = function(self)
this.elapsed = 0
if ShaguTweaksRaidHeaders then
local foundHeader = false
for i = 1, 8 do
if ShaguTweaksRaidHeaders[i] then
foundHeader = true
local _, anchor = ShaguTweaksRaidHeaders[i]:GetPoint()
if anchor then
ShaguTweaksRaidHeaders[i]:ClearAllPoints()
@@ -72,7 +74,10 @@ module.enable = function(self)
end
end
end
this:Hide()
if foundHeader then
this:Hide()
end
elseif this.total >= 10 then
-- Fail closed instead of polling forever if headers never materialize.
this:Hide()
+3 -1
View File
@@ -56,13 +56,15 @@ module.enable = function(self)
frame.dispel[dtype].tex:SetVertexColor(unpack(color))
frame.dispel[dtype].tex:SetPoint("TOPLEFT", frame.dispel[dtype], "TOPLEFT", 2, -2)
frame.dispel[dtype].tex:SetPoint("BOTTOMRIGHT", frame.dispel[dtype], "BOTTOMRIGHT", -2, 2)
frame.dispel[dtype]:Hide()
end
end,
update = function(frame, event)
-- ignore empty or unrelated events
if not event then return end
if arg1 and frame.unitstr ~= arg1 then return end
if (event == "UNIT_AURA" or event == "UNIT_AURASTATE")
and arg1 ~= frame.unitstr then return end
-- affected debuffs
frame.affected = frame.affected or {}
+36 -19
View File
@@ -23,38 +23,33 @@ module.enable = function(self)
events = { },
create = function(frame)
-- skip if already initialized
if init then return else init = true end
if init then return end
init = true
-- create shortcut to raid.cluster
local cluster = frame:GetParent()
-- initialize header frame on cluster
local header = CreateFrame("Frame", "ShaguTweaksRaidHeaders", cluster)
header:SetFrameLevel(128)
header:SetScale(.9)
header:SetAllPoints(cluster)
header:RegisterEvent("PLAYER_ENTERING_WORLD")
header:RegisterEvent("RAID_ROSTER_UPDATE")
header:SetScript("OnEvent", function()
for i = 1, 40 do
if math.mod(i, 5) == 1 then
local group = math.ceil(i/5)
-- create header base frame
local function UpdateHeaders()
if not cluster.frames then return end
for group = 1, 8 do
local index = (group - 1) * 5 + 1
local anchorFrame = cluster.frames[index]
if anchorFrame then
if not header[group] then
header[group] = header[group] or CreateFrame("Frame", "ShaguTweaksRaidGroupHeader" .. group, header)
header[group]:SetPoint("TOP", cluster.frames[i], "TOP", 0, 6)
header[group] = CreateFrame("Frame", "ShaguTweaksRaidGroupHeader" .. group, header)
header[group]:SetPoint("TOP", anchorFrame, "TOP", 0, 6)
header[group]:SetWidth(42)
header[group]:SetHeight(16)
header[group]:SetBackdrop(backdrop)
header[group]:SetBackdropBorderColor(.8, .8, .8, 1)
header[group]:SetBackdropColor(.4, .4, .4, 1)
ShaguTweaks.DarkenFrame(header[group])
end
-- create header text
if not header[group].text then
header[group].text = header[group]:CreateFontString(nil, "HIGH", "GameFontWhite")
header[group].text:SetFont(STANDARD_TEXT_FONT, 7, "THINOUTLINE")
header[group].text:SetAllPoints(header[group])
@@ -63,14 +58,36 @@ module.enable = function(self)
header[group].text:SetText("Group " .. group)
end
-- toggle visibility if needed
if RAID_SUBGROUP_LISTS and RAID_SUBGROUP_LISTS[group] and table.getn(RAID_SUBGROUP_LISTS[group]) > 0 then
local inRaid = RAID_SUBGROUP_LISTS
and RAID_SUBGROUP_LISTS[group]
and table.getn(RAID_SUBGROUP_LISTS[group]) > 0
local inParty = group == 1
and not UnitInRaid("player")
and GetNumPartyMembers() > 0
if inRaid or inParty then
header[group]:Show()
else
header[group]:Hide()
end
end
end
end
header.Update = UpdateHeaders
header:RegisterEvent("PLAYER_ENTERING_WORLD")
header:RegisterEvent("RAID_ROSTER_UPDATE")
header:RegisterEvent("PARTY_MEMBERS_CHANGED")
header:SetScript("OnEvent", UpdateHeaders)
-- The header container is created while the first raid unit frame is
-- still being built. Wait until all 40 anchors exist, then initialize
-- once even if the PLAYER_ENTERING_WORLD event that created us was missed.
header:SetScript("OnUpdate", function()
if cluster.frames and cluster.frames[40] then
UpdateHeaders()
this:SetScript("OnUpdate", nil)
end
end)
end,
+14 -14
View File
@@ -23,6 +23,7 @@ module.enable = function(self)
frame.predict:SetVertexColor(0, 1, 0, 1)
frame.predict:SetPoint("TOPLEFT", frame.bar, "TOPLEFT", 0, 0)
frame.predict:SetPoint("BOTTOMLEFT", frame.bar, "BOTTOMLEFT", 0, 0)
frame.predict:Hide()
end,
update = function(frame, event)
@@ -30,22 +31,21 @@ module.enable = function(self)
local heal = ShaguTweaks.libpredict:UnitGetIncomingHeals(frame.unitstr)
local res = ShaguTweaks.libpredict:UnitHasIncomingResurrection(frame.unitstr)
-- update bar size if required
if heal ~= frame.predict_lastval then
if heal and heal > 0 then
local health, maxHealth = UnitHealth(frame.unitstr), UnitHealthMax(frame.unitstr)
local barWidth = frame.bar:GetWidth()
local healthWidth = maxHealth > 0 and barWidth * health / maxHealth or 0
local incWidth = maxHealth > 0 and barWidth * heal / maxHealth or 0
frame.predict:SetWidth(math.min(barWidth, healthWidth + incWidth))
frame.predict:Show()
else
frame.predict:Hide()
end
frame.predict_lastval = heal
-- Health can change while the incoming-heal amount stays constant, so
-- recalculate the projected width on every 250ms prediction tick.
if heal and heal > 0 then
local health, maxHealth = UnitHealth(frame.unitstr), UnitHealthMax(frame.unitstr)
local barWidth = frame.bar:GetWidth()
local healthWidth = maxHealth > 0 and barWidth * health / maxHealth or 0
local incWidth = maxHealth > 0 and barWidth * heal / maxHealth or 0
frame.predict:SetWidth(math.min(barWidth, healthWidth + incWidth))
frame.predict:Show()
else
frame.predict:Hide()
end
frame.predict_lastval = heal
-- update healing state
if heal and heal > 0 then
frame.info = "|cff22ff22+" .. heal .. "|r"
+9 -4
View File
@@ -40,13 +40,18 @@ module.enable = function(self)
local unitstr = index == 1 and "player" or "party" .. index-1
-- assign party to first raid group of frames
this.cluster.frames[index].unitstr = unitstr
this.cluster.frames[index].groupid = 1
this.cluster.frames[index]:Show()
local frame = this.cluster.frames[index]
frame.unitstr = unitstr
frame.groupid = 1
-- save required raid frame size
if UnitExists(unitstr) then
frame:Show()
if ShaguTweaks.UnitFrame_Refresh then
ShaguTweaks.UnitFrame_Refresh(frame)
end
y = math.max(y, index)
else
frame:Hide()
end
end
end
+19 -2
View File
@@ -93,6 +93,14 @@ local UnitFrame_NewComponent = function(name, object)
table.insert(components, object)
end
local UnitFrame_Refresh = function(frame)
if not frame or not frame.unitstr or not UnitName(frame.unitstr) then return end
for _, component in ipairs(components) do
component.update(frame, "FRAME_REFRESH")
end
end
local UnitFrame_OnEnter = function()
if not this.unitstr then return end
@@ -251,7 +259,8 @@ UnitFrame_NewComponent('health', {
update = function(frame, event)
-- ignore empty or unrelated events
if not event then return end
if arg1 and frame.unitstr ~= arg1 then return end
if (event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH")
and arg1 ~= frame.unitstr then return end
-- update statusbar values
frame.bar:SetMinMaxValues(0, UnitHealthMax(frame.unitstr))
@@ -295,7 +304,11 @@ UnitFrame_NewComponent('mana', {
update = function(frame, event)
-- ignore empty or unrelated events
if not event then return end
if arg1 and frame.unitstr ~= arg1 then return end
if (event == "UNIT_MANA" or event == "UNIT_MAXMANA"
or event == "UNIT_ENERGY" or event == "UNIT_MAXENERGY"
or event == "UNIT_RAGE" or event == "UNIT_MAXRAGE"
or event == "UNIT_DISPLAYPOWER")
and arg1 ~= frame.unitstr then return end
-- update mana bar values
frame.mana:SetMinMaxValues(0, UnitManaMax(frame.unitstr))
@@ -376,6 +389,7 @@ UnitFrame_NewComponent('highlight', {
highlight:SetBackdrop(backdrop.border)
highlight:SetPoint("TOPLEFT", frame, "TOPLEFT", -1.5,1.5)
highlight:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", 1.5,-1.5)
highlight:Hide()
frame.highlight = highlight
end,
@@ -420,6 +434,7 @@ UnitFrame_NewComponent('target', {
right:SetHeight(8)
right:SetBlendMode('ADD')
target:Hide()
frame.target = target
end,
@@ -486,6 +501,7 @@ UnitFrame_NewComponent('range', {
})
ShaguTweaks.UnitFrame_NewComponent = UnitFrame_NewComponent
ShaguTweaks.UnitFrame_Refresh = UnitFrame_Refresh
-- Bring everything to life
module.enable = function(self)
@@ -517,6 +533,7 @@ module.enable = function(self)
frame.unitstr = 'raid' .. unit
frame.groupid = group
frame:Show()
UnitFrame_Refresh(frame)
-- save required raid frame size
x = math.max(x, frame.left)