I thought I had posted this last night/early this morning but maybe I was so tired I forgot to click submit rofl. Any help towards a resolution is appreciated
Anyway .. to make a long story short ..
nUI keeps giving me this error when the actionbar needs to switch during combat. Three scenarios currently exist where this happens:
1. Druid Form changing
2. Rogue Stealthing
3. Jade Forest Mine Cart Ride
In all 3 instances the action bar needs to change back to page 1 while still in combat. I have narrowed it down to being a problem somewhere in nUI .. but not with the actual action bar changing as that same code is in a standalone addon and works perfectly. So the question is has someone come across this and identified the root cause in their own addons to help me identify where it might be in nUI. The only thing I can think of is that somewhere in its almost 14 year history nUI has retained some elements that were valid in the old days, had minimal effect over several years and now rears its ugly head a bit too often for me.
The error itself:
Lua Code:
{
["message"] = "Interface\\FrameXML\\RestrictedExecution.lua:431: Call failed: Interface\\FrameXML\\RestrictedFrames.lua:82: Invalid frame handle",
["time"] = "2020/10/18 21:29:26",
["locals"] = "InCombatSkipped",
["stack"] = "[string \"=[C]\"]: ?\n[string \"@Interface\\FrameXML\\RestrictedExecution.lua\"]:431: in function <Interface\\FrameXML\\RestrictedExecution.lua:420>\n[string \"=(tail call)\"]: ?\n[string \"=(tail call)\"]: ?\n[string \"@Interface\\FrameXML\\SecureHandlers.lua\"]:115: in function <Interface\\FrameXML\\SecureHandlers.lua:110>\n[string \"=[C]\"]: in function `SetAttribute'\n[string \"@Interface\\FrameXML\\SecureStateDriver.lua\"]:114: in function <Interface\\FrameXML\\SecureStateDriver.lua:95>\n[string \"@Interface\\FrameXML\\SecureStateDriver.lua\"]:127: in function <Interface\\FrameXML\\SecureStateDriver.lua:119>",
["session"] = 263,
["counter"] = 39,
}, -- [4]
For completions sake this is my standalone code that works flawlessly which I aim to add to my nUI replacement somewhere down the line.
Main Menu Bar
Lua Code:
local addon,data = ...
data = data or {}
data.BlizzUI = data.BlizzUI or CreateFrame("Frame")
--MainMenuBarArtFrame:SetParent(data.BlizzUI)
data.BlizzUI:Hide()
local BUTTON_SIZE, BUTTON_SPACING = 50, 1
------------------------------------------------------
--[[ Bar Setup ]]--
------------------------------------------------------
local barFrame = CreateFrame("Frame", "XBar_Main", UIParent, "SecureHandlerStateTemplate")
barFrame:SetSize((BUTTON_SIZE + BUTTON_SPACING) * NUM_ACTIONBAR_BUTTONS, BUTTON_SIZE)
barFrame:SetPoint("CENTER")
local background = barFrame:CreateTexture(nil, "BACKGROUND")
background:SetColorTexture(0, 0, 0, 0.5)
background:SetAllPoints()
barFrame:Execute([[
ActionButtons = newtable()
]])
------------------------------------------------------
--[[ Button Setup ]]--
------------------------------------------------------
local buttons = { }
for id = 1, NUM_ACTIONBAR_BUTTONS do
local button = CreateFrame("CheckButton", "$parent_Button" .. id, barFrame, "ActionBarButtonTemplate")
button:SetID(id)
button:SetSize(BUTTON_SIZE, BUTTON_SIZE)
if id ~= 1 then
button:SetPoint("LEFT", buttons[id - 1], "RIGHT", BUTTON_SPACING, 0)
else
button:SetPoint("LEFT", 5, 0)
end
local background = button:CreateTexture(nil, "BACKGROUND")
background:SetColorTexture(1, 1, 1, 0.5)
background:SetAllPoints()
button.NormalTexture:Hide()
barFrame:SetFrameRef("button", button)
barFrame:Execute(([[
ActionButtons[%s] = self:GetFrameRef("button")
]]):format(id))
buttons[id] = button
end
barFrame.Buttons = buttons
------------------------------------------------------
--[[ Secure Stuff ]]--
------------------------------------------------------
barFrame:Execute([[
self:SetAttribute("frameref-button", nil)
]])
barFrame:SetAttribute('_onstate-page', ([[
if not newstate then return end
newstate = tonumber(newstate)
if HasVehicleActionBar() then
-- print("Vehicle")
newPage = GetVehicleBarIndex() or 0
elseif HasOverrideActionBar() then
--print("Override")
newPage = GetOverrideBarIndex() or 0
elseif HasTempShapeshiftActionBar() then
--print("Shapeshift")
newPage = GetTempShapeshiftBarIndex() or 0
elseif HasBonusActionBar() and GetActionBarPage() == 1 then
--print("BonusBar")
newPage = GetBonusBarIndex() or 0
else
--print("Other")
newPage = 0
end
--print("NewPage: ",newPage)
--print("newstate: ",newstate)
if ( newPage == 0 ) then
newstate = GetActionBarPage()
end
self:SetAttribute("actionpage", newstate)
for id = 1, #ActionButtons do
ActionButtons[id]:SetAttribute('actionpage', newstate)
end
]]):gsub('NUM_ACTIONBAR_BUTTONS', NUM_ACTIONBAR_BUTTONS))
------------------------------------------------------
--[[ Registration Stuff ]]--
------------------------------------------------------
RegisterStateDriver(
barFrame, "page", string.format(
"[vehicleui][possessbar] %d; [vehicleui] %d; [overridebar] %d; [shapeshift] %d; " ..
"[bar:2] 2; [bar:3] 3; [bar:4] 4; [bar:5] 5; [bar:6] 6; " ..
"[bonusbar:1] 7; [bonusbar:2] 8; [bonusbar:3] 9; [bonusbar:4] 10; [bonusbar:5] 11; 1",
GetVehicleBarIndex(), GetVehicleBarIndex(), GetOverrideBarIndex(), GetTempShapeshiftBarIndex())
);
OverrideActionBarLeaveFrameLeaveButton:SetParent(barFrame)
OverrideActionBarLeaveFrameLeaveButton:SetAllPoints(buttons[12])
RegisterStateDriver(OverrideActionBarLeaveFrameLeaveButton, "visibility", "[canexitvehicle] show; hide")
local function OnEvent(self,event,...)
if event == "UPDATE_VEHICLE_ACTIONBAR" then
barFrame:Execute(([[ self:SetAttribute('state-page',GetVehicleBarIndex()) ]]))
elseif event == "UPDATE_OVERRIDE_ACTIONBAR" then
barFrame:Execute(([[ self:SetAttribute('state-page',GetOverrideBarIndex()) ]]))
end
end
barFrame:RegisterEvent("UPDATE_VEHICLE_ACTIONBAR")
barFrame:RegisterEvent("UPDATE_OVERRIDE_ACTIONBAR")
barFrame:SetScript("OnEvent",OnEvent)
Stance Bar
Lua Code:
local addon,data = ...
data = data or {}
data.BlizzUI = data.BlizzUI or CreateFrame("Frame")
--StanceBarFrame:SetParent(data.BlizzUI)
data.BlizzUI:Hide()
local BUTTON_SIZE, BUTTON_SPACING = 50, 1
------------------------------------------------------
--[[ Bar Setup ]]--
------------------------------------------------------
local barFrame = CreateFrame("Frame", "XBar_Stance", UIParent, "SecureFrameTemplate")
barFrame:SetSize((BUTTON_SIZE + BUTTON_SPACING) * NUM_STANCE_SLOTS, BUTTON_SIZE)
barFrame:SetPoint("BOTTOMLEFT", XBar_Main, "TOPLEFT",0,0)
local background = barFrame:CreateTexture(nil, "BACKGROUND")
background:SetColorTexture(0, 0, 0, 0.5)
background:SetAllPoints()
------------------------------------------------------
--[[ Button Setup ]]--
------------------------------------------------------
local buttons = { }
for id = 1, NUM_STANCE_SLOTS do
local button = CreateFrame("CheckButton", "$parent_Button" .. id, barFrame, "StanceButtonTemplate")
button.actionType = "SHAPESHIFTBUTTON";
button:SetID(id)
button:SetNormalTexture( "" );
button:SetSize(BUTTON_SIZE, BUTTON_SIZE)
if id ~= 1 then
button:SetPoint("LEFT", buttons[id - 1], "RIGHT", BUTTON_SPACING, 0)
else
button:SetPoint("LEFT", 5, 0)
end
local background = button:CreateTexture(nil, "BACKGROUND")
background:SetColorTexture(1, 1, 1, 0.5)
background:SetAllPoints()
-- Set Cooldown
local start, duration, enable = GetShapeshiftFormCooldown(id);
CooldownFrame_Set(button.cooldown, start, duration, enable);
-- Set Icon
local texture, name, isActive, isCastable = GetShapeshiftFormInfo( id );
button.icon:SetTexture(texture);
-- Set Check Status
if ( isActive ) then
button:SetChecked(true);
else
button:SetChecked(false);
end
-- Set Cast Status
if ( isCastable ) then
button.icon:SetVertexColor(1.0, 1.0, 1.0);
else
button.icon:SetVertexColor(0.4, 0.4, 0.4);
end
button.NormalTexture:Hide()
buttons[id] = button
end
barFrame.Buttons = buttons
function barFrame:UpdateButtons()
for i = 0, 10 do
local button = barFrame.Buttons[i] or nil
if button then
-- Set Icon
local texture, name, isActive, isCastable = GetShapeshiftFormInfo( i );
button.icon:SetTexture(texture);
-- Set Check Status
if ( isActive ) then
button:SetChecked(true);
else
button:SetChecked(false);
end
-- Set Cooldown
local start, duration, enable = GetShapeshiftFormCooldown(i);
CooldownFrame_Set(button.cooldown, start, duration, enable);
button.cooldown:SetDrawSwipe()
button.cooldown:Show()
end
end
end
------------------------------------------------------
--[[ Registration Stuff ]]--
------------------------------------------------------
RegisterStateDriver( barFrame, "visibility", "[bonusbar:5] hide; show" );
local function OnEvent(self,event,...)
--print(event,...)
if event == "UPDATE_SHAPESHIFT_FORM" or
event == "UPDATE_SHAPESHIFT_FORMS" or
event == "UPDATE_SHAPESHIFT_COOLDOWN" or
event == "UPDATE_SHAPESHIFT_USABLE" then
if InCombatLockdown() then
barFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
else
barFrame:UpdateButtons()
end
elseif event == "PLAYER_REGEN_ENABLED" then
self:UnregisterEvent(event)
barFrame:UpdateButtons()
end
end
barFrame:RegisterEvent("UPDATE_SHAPESHIFT_COOLDOWN")
barFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
barFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORMS")
barFrame:RegisterEvent("UPDATE_SHAPESHIFT_USABLE")
barFrame:SetScript("OnEvent",OnEvent)