Xrystal |
10-19-20 04:57 AM |
Solved: Call failed: RestrictedFrames.lua:82: Invalid frame handle
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)
|