You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

655 lines
27 KiB

local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local B = Cell.bFuncs
local A = Cell.animations
local P = Cell.pixelPerfectFuncs
local npcFrame = CreateFrame("Frame", "CellNPCFrame", Cell.frames.mainFrame, "SecureHandlerStateTemplate")
Cell.frames.npcFrame = npcFrame
-- Cell.StylizeFrame(npcFrame, {1, 0.5, 0.5})
local anchors = {
["solo"] = CellSoloFramePlayer,
["party"] = CellPartyFrameHeaderUnitButton1Pet,
["raid"] = CellNPCFrameAnchor,
}
for k, v in pairs(anchors) do
npcFrame:SetFrameRef(k, v)
end
-------------------------------------------------
-- separateAnchor
-------------------------------------------------
local tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY
local separateAnchor = CreateFrame("Frame", "CellSeparateNPCFrameAnchor", Cell.frames.mainFrame, "BackdropTemplate")
Cell.frames.separateNpcFrameAnchor = separateAnchor
separateAnchor:SetMovable(true)
separateAnchor:SetClampedToScreen(true)
P.Size(separateAnchor, 20, 10)
PixelUtil.SetPoint(separateAnchor, "TOPLEFT", CellParent, "CENTER", 1, -1)
-- Cell.StylizeFrame(separateAnchor, {0, 1, 0, 0.4})
local hoverFrame = CreateFrame("Frame", nil, npcFrame)
hoverFrame:SetPoint("TOP", separateAnchor, 0, 1)
hoverFrame:SetPoint("BOTTOM", separateAnchor, 0, -1)
hoverFrame:SetPoint("LEFT", separateAnchor, -1, 0)
hoverFrame:SetPoint("RIGHT", separateAnchor, 1, 0)
A.ApplyFadeInOutToMenu(separateAnchor, hoverFrame)
local dumb = Cell.CreateButton(separateAnchor, nil, "accent", {20, 10}, false, true)
dumb:Hide()
dumb:SetFrameStrata("MEDIUM")
dumb:SetAllPoints(separateAnchor)
dumb:SetScript("OnDragStart", function()
separateAnchor:StartMoving()
separateAnchor:SetUserPlaced(false)
end)
dumb:SetScript("OnDragStop", function()
separateAnchor:StopMovingOrSizing()
P.SavePosition(separateAnchor, Cell.vars.currentLayoutTable["npc"]["position"])
end)
dumb:HookScript("OnEnter", function()
hoverFrame:GetScript("OnEnter")(hoverFrame)
CellTooltip:SetOwner(dumb, "ANCHOR_NONE")
CellTooltip:SetPoint(tooltipPoint, dumb, tooltipRelativePoint, tooltipX, tooltipY)
CellTooltip:AddLine(L["Friendly NPC Frame"])
CellTooltip:Show()
end)
dumb:HookScript("OnLeave", function()
hoverFrame:GetScript("OnLeave")(hoverFrame)
CellTooltip:Hide()
end)
function npcFrame:UpdateSeparateAnchor()
local show
if Cell.vars.currentLayoutTable["npc"]["separate"] then
for _, b in ipairs(Cell.unitButtons.npc) do
show = b:IsShown()
if show then break end
end
end
hoverFrame:EnableMouse(show)
if show then
dumb:Show()
if CellDB["general"]["fadeOut"] then
if hoverFrame:IsMouseOver() then
separateAnchor.fadeIn:Play()
else
separateAnchor.fadeOut:GetScript("OnFinished")(separateAnchor.fadeOut)
end
end
else
dumb:Hide()
end
end
-------------------------------------------------
-- NOTE: update each npc unit button
-------------------------------------------------
local pointUpdater = [[
local orientation, point, anchorPoint, unitSpacing = ...
-- print(orientation, point, anchorPoint, unitSpacing)
local last
for i = 1, 8 do
local button = self:GetFrameRef("button"..i)
button:ClearAllPoints()
if button:IsVisible() then
if last then
-- NOTE: anchor to last
if orientation == "vertical" then
button:SetPoint(point, last, anchorPoint, 0, unitSpacing)
else
button:SetPoint(point, last, anchorPoint, unitSpacing, 0)
end
else
button:SetPoint("TOPLEFT", self)
end
last = button
end
end
self:CallMethod("UpdateSeparateAnchor")
]]
npcFrame:SetAttribute("pointUpdater", pointUpdater)
-------------------------------------------------
-- create buttons
-------------------------------------------------
for i = 1, 8 do
local button = CreateFrame("Button", npcFrame:GetName().."Button"..i, npcFrame, "CellUnitButtonTemplate")
tinsert(Cell.unitButtons.npc, button)
Cell.unitButtons.npc.units["boss"..i] = button
-- button.type = "npc" -- layout setup
button:SetAttribute("unit", "boss"..i)
-- button:SetAttribute("unit", "player")
-- for testing ------------------------------
-- if i == 1 then
-- button:SetAttribute("unit", "target")
-- RegisterUnitWatch(button)
-- end
-- if i == 7 then
-- button:SetAttribute("unit", "player")
-- RegisterUnitWatch(button)
-- elseif i == 2 then
-- button:SetAttribute("unit", "target")
-- RegisterAttributeDriver(button, "state-visibility", "[@target, exists] show; hide")
-- elseif i == 4 then
-- button:SetAttribute("unit", "target")
-- RegisterAttributeDriver(button, "state-visibility", "[@target, help] show; hide")
-- elseif i == 6 then
-- button:SetAttribute("unit", "target")
-- RegisterAttributeDriver(button, "state-visibility", "[@target, harm] show; hide")
-- end
-- if i >= 6 then
-- UnregisterAttributeDriver(button, "state-visibility")
-- button:SetAttribute("unit", "target")
-- RegisterUnitWatch(button)
-- local bar = Cell.CreateStatusBar(nil, button, 10, 5, 1, false, nil, nil, Cell.vars.whiteTexture, {1, 1, 1, 1})
-- bar:SetFrameLevel(button.widgets.healthBar:GetFrameLevel() + 1)
-- bar.border:Hide()
-- bar:SetPoint("BOTTOMLEFT", button.widgets.healthBar)
-- bar:SetPoint("BOTTOMRIGHT", button.widgets.healthBar)
-- bar:SetScript("OnUpdate", function()
-- local health = UnitHealth("boss"..i)
-- local healthMax = UnitHealthMax("boss"..i)
-- bar:SetValue(health / healthMax)
-- end)
-- end
---------------------------------------------
-- NOTE: save reference for re-point
npcFrame:SetFrameRef("button"..i, button)
-- NOTE: update each npc unitbutton's point on show/hide
button.helper = CreateFrame("Frame", nil, button, "SecureHandlerShowHideTemplate")
button.helper:SetFrameRef("npcFrame", npcFrame)
button.helper:SetAttribute("pointUpdater", [[
local orientation = self:GetAttribute("orientation")
local point = self:GetAttribute("point")
local anchorPoint = self:GetAttribute("anchorPoint")
local unitSpacing = self:GetAttribute("unitSpacing")
local npcFrame = self:GetFrameRef("npcFrame")
self:RunFor(npcFrame, npcFrame:GetAttribute("pointUpdater"), orientation, point, anchorPoint, unitSpacing)
]])
button.helper:SetAttribute("_onshow", [[ self:RunAttribute("pointUpdater") ]])
button.helper:SetAttribute("_onhide", [[ self:RunAttribute("pointUpdater") ]])
end
-------------------------------------------------
-- FIXME: fix health updating boss678
-- ! BLIZZARD, FIX IT!
-------------------------------------------------
local boss678_guidToButton = {}
local boss678_buttonToGuid = {}
local cleu = CreateFrame("Frame")
cleu:SetScript("OnEvent", function()
local timestamp, subEvent, _, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags = CombatLogGetCurrentEventInfo()
if boss678_guidToButton[destGUID] then
if subEvent == "SPELL_HEAL" or subEvent == "SPELL_PERIODIC_HEAL" or subEvent == "SPELL_DAMAGE" or subEvent == "SPELL_PERIODIC_DAMAGE" then
-- print("UpdateHealth:", boss678_guidToButton[destGUID]:GetName())
B.UpdateHealth(boss678_guidToButton[destGUID])
elseif subEvent == "SPELL_AURA_REFRESH" or subEvent == "SPELL_AURA_APPLIED" or subEvent == "SPELL_AURA_REMOVED" or subEvent == "SPELL_AURA_APPLIED_DOSE" or subEvent == "SPELL_AURA_REMOVED_DOSE" then
B.UpdateAuras(boss678_guidToButton[destGUID])
end
end
end)
for i = 6, 8 do
local button = Cell.unitButtons.npc[i]
button.helper:HookScript("OnShow", function()
local guid = UnitGUID(button.states.unit)
if not guid then return end
boss678_buttonToGuid[i] = guid
boss678_guidToButton[guid] = button
-- update now
B.UpdateAll(button)
end)
button.helper:HookScript("OnHide", function()
boss678_guidToButton[boss678_buttonToGuid[i] or ""] = nil
boss678_buttonToGuid[i] = nil
button.helper.elapsed = nil
button.helper.elapsed2 = nil
button.helper.elapsed3 = nil
if F.Getn(boss678_buttonToGuid) == 0 then
cleu:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
end
end)
button.helper:HookScript("OnUpdate", function(self, elapsed)
button.helper.elapsed = (button.helper.elapsed or 0) + elapsed
button.helper.elapsed2 = (button.helper.elapsed2 or 0) + elapsed
button.helper.elapsed3 = (button.helper.elapsed3 or 0) + elapsed
if button.helper.elapsed >= 0.25 then
local guid = UnitGUID(button.states.unit)
-- check old guid
if guid and boss678_buttonToGuid[i] ~= guid then --! unit changed
-- remove old
boss678_guidToButton[boss678_buttonToGuid[i] or ""] = nil
-- add new
boss678_buttonToGuid[i] = guid
boss678_guidToButton[guid] = button
-- update now
B.UpdateAll(button)
end
button.helper.elapsed = 0
end
if button.helper.elapsed2 >= 1 then
if not cleu:IsEventRegistered("COMBAT_LOG_EVENT_UNFILTERED") then
cleu:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
end
button.helper.elapsed2 = 0
end
if button.helper.elapsed3 >= 5 then
B.UpdateHealth(button)
B.UpdateHealthMax(button)
button.helper.elapsed3 = 0
end
end)
end
-------------------------------------------------
-- update point when group type changed
-------------------------------------------------
npcFrame:SetAttribute("_onstate-groupstate", [[
-- print("groupstate", newstate)
self:SetAttribute("group", newstate)
local petstate = self:GetAttribute("pet")
local anchor = self:GetFrameRef(newstate)
local orientation = self:GetAttribute("orientation")
local point = self:GetAttribute("point")
local anchorPoint = self:GetAttribute("anchorPoint")
local groupAnchorPoint = self:GetAttribute("groupAnchorPoint")
local unitSpacing = self:GetAttribute("unitSpacing")
local groupSpacing = self:GetAttribute("groupSpacing")
self:ClearAllPoints()
if orientation == "vertical" then
if newstate == "raid" then
self:SetPoint(point, anchor)
elseif newstate == "party" then
-- NOTE: at first time petstate == nil
if petstate == "nopet" then
self:SetPoint(point, self:GetFrameRef("solo"), groupAnchorPoint, groupSpacing, 0)
else
self:SetPoint(point, self:GetFrameRef("party"), groupAnchorPoint, groupSpacing, 0)
end
else -- solo
self:SetPoint(point, anchor, groupAnchorPoint, groupSpacing, 0)
end
else
if newstate == "raid" then
self:SetPoint(point, anchor)
elseif newstate == "party" then
-- NOTE: at first time petstate == nil
if petstate == "nopet" then
self:SetPoint(point, self:GetFrameRef("solo"), groupAnchorPoint, 0, groupSpacing)
else
self:SetPoint(point, self:GetFrameRef("party"), groupAnchorPoint, 0, groupSpacing)
end
else -- solo
self:SetPoint(point, anchor, groupAnchorPoint, 0, groupSpacing)
end
end
-- NOTE: update each npc button
self:RunAttribute("pointUpdater", orientation, point, anchorPoint, unitSpacing)
]])
-------------------------------------------------
-- update point when pet state changed
-------------------------------------------------
npcFrame:SetAttribute("_onstate-petstate", [[
-- print("petstate", newstate)
self:SetAttribute("pet", newstate)
if self:GetAttribute("group") == "party" then
local orientation = self:GetAttribute("orientation")
local point = self:GetAttribute("point")
local anchorPoint = self:GetAttribute("anchorPoint")
local groupAnchorPoint = self:GetAttribute("groupAnchorPoint")
local unitSpacing = self:GetAttribute("unitSpacing")
local groupSpacing = self:GetAttribute("groupSpacing")
self:ClearAllPoints()
if orientation == "vertical" then
if newstate == "nopet" then
self:SetPoint(point, self:GetFrameRef("solo"), groupAnchorPoint, groupSpacing, 0)
else
self:SetPoint(point, self:GetFrameRef("party"), groupAnchorPoint, groupSpacing, 0)
end
else
if newstate == "nopet" then
self:SetPoint(point, self:GetFrameRef("solo"), groupAnchorPoint, 0, groupSpacing)
else
self:SetPoint(point, self:GetFrameRef("party"), groupAnchorPoint, 0, groupSpacing)
end
end
end
]])
-- RegisterStateDriver(npcFrame, "petstate", "[@pet,exists] pet; [@partypet1,exists] pet1; [@partypet2,exists] pet2; [@partypet3,exists] pet3; [@partypet4,exists] pet4; nopet")
-------------------------------------------------
-- functions
-------------------------------------------------
local function UpdatePosition()
local layout = Cell.vars.currentLayoutTable
-- update npcFrame anchor if separate from main
if layout["npc"]["separate"] then
npcFrame:ClearAllPoints()
P.LoadPosition(separateAnchor, layout["npc"]["position"])
local anchor
if layout["pet"]["sameArrangementAsMain"] then
anchor = layout["main"]["anchor"]
else
anchor = layout["npc"]["anchor"]
end
if CellDB["general"]["menuPosition"] == "top_bottom" then
P.Size(separateAnchor, 20, 10)
if anchor == "BOTTOMLEFT" then
npcFrame:SetPoint("BOTTOMLEFT", separateAnchor, "TOPLEFT", 0, 4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPLEFT", "BOTTOMLEFT", 0, -3
elseif anchor == "BOTTOMRIGHT" then
npcFrame:SetPoint("BOTTOMRIGHT", separateAnchor, "TOPRIGHT", 0, 4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPRIGHT", "BOTTOMRIGHT", 0, -3
elseif anchor == "TOPLEFT" then
npcFrame:SetPoint("TOPLEFT", separateAnchor, "BOTTOMLEFT", 0, -4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMLEFT", "TOPLEFT", 0, 3
elseif anchor == "TOPRIGHT" then
npcFrame:SetPoint("TOPRIGHT", separateAnchor, "BOTTOMRIGHT", 0, -4)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMRIGHT", "TOPRIGHT", 0, 3
end
else
P.Size(separateAnchor, 10, 20)
if anchor == "BOTTOMLEFT" then
npcFrame:SetPoint("BOTTOMLEFT", separateAnchor, "BOTTOMRIGHT", 4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMRIGHT", "BOTTOMLEFT", -3, 0
elseif anchor == "BOTTOMRIGHT" then
npcFrame:SetPoint("BOTTOMRIGHT", separateAnchor, "BOTTOMLEFT", -4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "BOTTOMLEFT", "BOTTOMRIGHT", 3, 0
elseif anchor == "TOPLEFT" then
npcFrame:SetPoint("TOPLEFT", separateAnchor, "TOPRIGHT", 4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPRIGHT", "TOPLEFT", -3, 0
elseif anchor == "TOPRIGHT" then
npcFrame:SetPoint("TOPRIGHT", separateAnchor, "TOPLEFT", -4, 0)
tooltipPoint, tooltipRelativePoint, tooltipX, tooltipY = "TOPLEFT", "TOPRIGHT", 3, 0
end
end
end
npcFrame:UpdateSeparateAnchor()
end
local function UpdateMenu(which)
if not which or which == "lock" then
if CellDB["general"]["locked"] then
dumb:RegisterForDrag()
else
dumb:RegisterForDrag("LeftButton")
end
end
if not which or which == "fadeOut" then
if CellDB["general"]["fadeOut"] then
separateAnchor.fadeOut:Play()
else
separateAnchor.fadeIn:Play()
end
end
if which == "position" then
UpdatePosition()
end
end
Cell.RegisterCallback("UpdateMenu", "NPCFrame_UpdateMenu", UpdateMenu)
local previousLayout
local function NPCFrame_UpdateLayout(layout, which)
-- if previousLayout == layout and not which then return end
-- previousLayout = layout
-- visibility
if layout == "hide" then
UnregisterAttributeDriver(npcFrame, "state-visibility")
npcFrame:Hide()
return
end
RegisterAttributeDriver(npcFrame, "state-visibility", "[@raid1,exists] show;[@party1,exists] show;show")
-- update
layout = Cell.vars.currentLayoutTable
if not which or strfind(which, "size$") then
local width, height
if layout["npc"]["sameSizeAsMain"] then
width, height = unpack(layout["main"]["size"])
else
width, height = unpack(layout["npc"]["size"])
end
P.Size(npcFrame, width, height)
for _, b in ipairs(Cell.unitButtons.npc) do
P.Size(b, width, height)
end
end
-- NOTE: SetOrientation BEFORE SetPowerSize
if not which or which == "barOrientation" then
for _, b in ipairs(Cell.unitButtons.npc) do
B.SetOrientation(b, layout["barOrientation"][1], layout["barOrientation"][2])
end
end
if not which or strfind(which, "power$") or which == "barOrientation" or which == "powerFilter" then
for _, b in ipairs(Cell.unitButtons.npc) do
if layout["npc"]["sameSizeAsMain"] then
B.SetPowerSize(b, layout["main"]["powerSize"])
else
B.SetPowerSize(b, layout["npc"]["powerSize"])
end
end
end
if not which or which == "pet" then
if not layout["pet"]["partyEnabled"] or layout["pet"]["partyDetached"] then
npcFrame:SetFrameRef("party", CellPartyFrameHeaderUnitButton1)
anchors["party"] = CellPartyFrameHeaderUnitButton1
else
npcFrame:SetFrameRef("party", CellPartyFrameHeaderUnitButton1Pet)
anchors["party"] = CellPartyFrameHeaderUnitButton1Pet
end
end
if not which or strfind(which, "arrangement$") or which == "npc" or which == "pet" then
local groupType = F.GetGroupType()
npcFrame:ClearAllPoints()
local orientation, anchor, spacingX, spacingY
if layout["npc"]["sameArrangementAsMain"] then
orientation = layout["main"]["orientation"]
anchor = layout["main"]["anchor"]
spacingX = layout["main"]["spacingX"]
spacingY = layout["main"]["spacingY"]
else
orientation = layout["npc"]["orientation"]
anchor = layout["npc"]["anchor"]
spacingX = layout["npc"]["spacingX"]
spacingY = layout["npc"]["spacingY"]
end
local point, anchorPoint, groupAnchorPoint, unitSpacing, groupSpacing
if orientation == "vertical" then
if anchor == "BOTTOMLEFT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMLEFT", "TOPLEFT", "BOTTOMRIGHT"
unitSpacing = spacingY
groupSpacing = spacingX
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMRIGHT", "TOPRIGHT", "BOTTOMLEFT"
unitSpacing = spacingY
groupSpacing = -spacingX
elseif anchor == "TOPLEFT" then
point, anchorPoint, groupAnchorPoint = "TOPLEFT", "BOTTOMLEFT", "TOPRIGHT"
unitSpacing = -spacingY
groupSpacing = spacingX
elseif anchor == "TOPRIGHT" then
point, anchorPoint, groupAnchorPoint = "TOPRIGHT", "BOTTOMRIGHT", "TOPLEFT"
unitSpacing = -spacingY
groupSpacing = -spacingX
end
if not layout["npc"]["separate"] then
-- update whole NPCFrame point
if groupType == "raid" then
npcFrame:SetPoint(point, anchors["raid"])
elseif groupType == "party" then
if npcFrame:GetAttribute("pet") == "nopet" then
npcFrame:SetPoint(point, anchors["solo"], groupAnchorPoint, P.Scale(groupSpacing), 0)
else
npcFrame:SetPoint(point, anchors["party"], groupAnchorPoint, P.Scale(groupSpacing), 0)
end
else -- solo
npcFrame:SetPoint(point, anchors["solo"], groupAnchorPoint, P.Scale(groupSpacing), 0)
end
end
else
if anchor == "BOTTOMLEFT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMLEFT", "BOTTOMRIGHT", "TOPLEFT"
unitSpacing = spacingX
groupSpacing = spacingY
elseif anchor == "BOTTOMRIGHT" then
point, anchorPoint, groupAnchorPoint = "BOTTOMRIGHT", "BOTTOMLEFT", "TOPRIGHT"
unitSpacing = -spacingX
groupSpacing = spacingY
elseif anchor == "TOPLEFT" then
point, anchorPoint, groupAnchorPoint = "TOPLEFT", "TOPRIGHT", "BOTTOMLEFT"
unitSpacing = spacingX
groupSpacing = -spacingY
elseif anchor == "TOPRIGHT" then
point, anchorPoint, groupAnchorPoint = "TOPRIGHT", "TOPLEFT", "BOTTOMRIGHT"
unitSpacing = -spacingX
groupSpacing = -spacingY
end
if not layout["npc"]["separate"] then
-- update whole NPCFrame point
if groupType == "raid" then
npcFrame:SetPoint(point, anchors["raid"])
elseif groupType == "party" then
if npcFrame:GetAttribute("pet") == "nopet" then
npcFrame:SetPoint(point, anchors["solo"], groupAnchorPoint, 0, P.Scale(groupSpacing))
else
npcFrame:SetPoint(point, anchors["party"], groupAnchorPoint, 0, P.Scale(groupSpacing))
end
else -- solo
npcFrame:SetPoint(point, anchors["solo"], groupAnchorPoint, 0, P.Scale(groupSpacing))
end
end
end
-- save point data
npcFrame:SetAttribute("orientation", orientation)
npcFrame:SetAttribute("point", point)
npcFrame:SetAttribute("anchorPoint", anchorPoint)
npcFrame:SetAttribute("groupAnchorPoint", groupAnchorPoint)
npcFrame:SetAttribute("unitSpacing", P.Scale(unitSpacing))
npcFrame:SetAttribute("groupSpacing", P.Scale(groupSpacing))
local last
for i = 1, 8 do
local button = Cell.unitButtons.npc[i]
button.helper:SetAttribute("orientation", orientation)
button.helper:SetAttribute("point", point)
button.helper:SetAttribute("anchorPoint", anchorPoint)
button.helper:SetAttribute("unitSpacing", P.Scale(unitSpacing))
-- update each npc button now
if button:IsVisible() then
button:ClearAllPoints()
if last then
if orientation == "vertical" then
button:SetPoint(point, last, anchorPoint, 0, P.Scale(unitSpacing))
else
button:SetPoint(point, last, anchorPoint, P.Scale(unitSpacing), 0)
end
else
button:SetPoint("TOPLEFT", npcFrame)
end
last = button
end
end
end
if not which or strfind(which, "arrangement$") or which == "npc" then
UpdatePosition()
end
if not which or which == "npc" then
if layout["npc"]["enabled"] then
-- NOTE: RegisterAttributeDriver
for i, b in ipairs(Cell.unitButtons.npc) do
RegisterAttributeDriver(b, "state-visibility", "[@boss"..i..", help] show; hide")
-- RegisterAttributeDriver(b, "state-visibility", "[@player, help] show; hide")
end
if layout["npc"]["separate"] then
UnregisterStateDriver(npcFrame, "groupstate")
UnregisterStateDriver(npcFrame, "petstate")
-- load separate npc frame position
P.LoadPosition(separateAnchor, layout["npc"]["position"])
else
-- RegisterStateDriver(npcFrame, "groupstate", "[group:raid] raid;[group:party] party;solo")
RegisterStateDriver(npcFrame, "groupstate", "[@raid1,exists] raid;[@party1,exists] party;solo")
RegisterStateDriver(npcFrame, "petstate", "[@pet,exists] pet; [@partypet1,exists] pet1; [@partypet2,exists] pet2; [@partypet3,exists] pet3; [@partypet4,exists] pet4; nopet")
end
else
-- NOTE: RegisterAttributeDriver
for _, b in ipairs(Cell.unitButtons.npc) do
UnregisterAttributeDriver(b, "state-visibility")
b:Hide()
end
end
end
end
Cell.RegisterCallback("UpdateLayout", "NPCFrame_UpdateLayout", NPCFrame_UpdateLayout)
-- local function NPCFrame_UpdateVisibility(which)
-- if not which or which == "solo" or which == "party" then
-- local showSolo = CellDB["general"]["showSolo"] and "show" or "hide"
-- local showParty = CellDB["general"]["showParty"] and "show" or "hide"
-- -- RegisterAttributeDriver(npcFrame, "state-visibility", "[group:raid] show; [group:party] "..showParty.."; "..showSolo)
-- RegisterAttributeDriver(npcFrame, "state-visibility", "[@raid1,exists] show;[@party1,exists] "..showParty..";"..showSolo)
-- end
-- end
-- Cell.RegisterCallback("UpdateVisibility", "NPCFrame_UpdateVisibility", NPCFrame_UpdateVisibility)