Thread Tools Display Modes
Prev Previous Post   Next Post Next
05-15-19, 10:04 PM   #1
galvin
A Frostmaul Preserver
AddOn Author - Click to view addons
Join Date: Nov 2006
Posts: 265
Getting protected function call error

I accounted for being in combat.
The error:
2x [ADDON_ACTION_BLOCKED] AddOn 'GalvinUnitBars' tried to call the protected function '<unnamed>:Hide()'.
!BugGrabber\BugGrabber.lua:573: in function <!BugGrabber\BugGrabber.lua:573>
[C]: in function `Hide'
GalvinUnitBars\Main.lua:917: in function <GalvinUnitBars\Main.lua:912>
[C]: in function `UIParent_ManageFramePositions'
FrameXML\BuffFrame.lua:332: in function `BuffFrame_UpdateAllBuffAnchors'
FrameXML\BuffFrame.lua:104: in function `BuffFrame_Update'
FrameXML\BuffFrame.lua:49: in function <FrameXML\BuffFrame.lua:45>

Locals:
InCombatSkipped

All the code can be found at:
https://repos.curseforge.com/wow/gal...bars/tags/6.30 release


Code:
-------------------------------------------------------------------------------
-- APBStopMoving
--
-- Stops moving the alternate power bars
-------------------------------------------------------------------------------
local function APBStopMoving(Frame)
  if Frame == APBMover then
    UnitBars.APBPos = { Frame:GetPoint() }
  else
    UnitBars.APBTimerPos = { Frame:GetPoint() }
  end
  Frame:StopMovingOrSizing()
end

-------------------------------------------------------------------------------
-- APBSetMover
--
-- Turns moving on or off for both Alternate Power Bars
--
-- Type : 'apb' and 'timer'. or nil for both
-------------------------------------------------------------------------------
function GUB.Main:APBSetMover(Type)
  local Hide = false
  if UnitBars.APBMoverOptionsDisabled then
    Hide = true
  end

  if Type == nil or Type == 'apb' then
    if not Hide and Main.APBMoverEnabled then
      APBMover:Show()
    else
      APBMover:Hide()
    end
  end
  if Type == nil or Type == 'timer' then
    if not Hide and Main.APBBuffTimerMoverEnabled then
      APBBuffTimerMover:Show()
    else
      APBBuffTimerMover:Hide()
    end
  end
end

-------------------------------------------------------------------------------
-- APBReset
--
-- Reset the alternate power bar movers to default position
-------------------------------------------------------------------------------
function GUB.Main:APBReset()
  APBMover:ClearAllPoints()
  APBMover:SetPoint('CENTER', 0, 0)

  APBBuffTimerMover:ClearAllPoints()
  APBBuffTimerMover:SetPoint('CENTER', 0, -75)

  UnitBars.APBPos = {'CENTER', 0, 0}
  UnitBars.APBTimerPos = {'CENTER', 0, -75}

  Main:DoBlizzAltPowerBar()
end

-------------------------------------------------------------------------------
-- InitAltPowerBar
--
-- This sets up the blizzard alternate power bar for hiding/showing/moving
-------------------------------------------------------------------------------
local function InitAltPowerBar()
  local APBPos = UnitBars.APBPos
  local APBTimerPos = UnitBars.APBTimerPos

  APBMover = CreateFrame('Frame', nil, UIParent)
  APBMover:SetSize(75, 50)
  APBMover:SetMovable(true)
  APBMover:SetBackdrop(SelectFrameBorder)
  APBMover:SetScript('OnMouseDown', APBMover.StartMoving)
  APBMover:SetScript('OnMouseUp', APBStopMoving)
  APBMover:SetFrameStrata('HIGH')
  APBMover:SetClampedToScreen(true)

  local FontString = APBMover:CreateFontString(nil)
  FontString:SetAllPoints()
  FontString:SetFont([[Fonts\FRIZQT__.TTF]], 13, 'THICKOUTLINE')
  FontString:SetJustifyH('CENTER')
  FontString:SetJustifyV('MIDDLE')
  FontString:SetText('APB')


  if next(APBPos) == nil then
    APBMover:SetPoint('CENTER', 0, 0)
  else
    APBMover:SetPoint(unpack(APBPos))
  end

  APBBuffTimerMover = CreateFrame('Frame', nil, UIParent)
  APBBuffTimerMover:SetPoint('CENTER')
  APBBuffTimerMover:SetSize(250, 75)
  APBBuffTimerMover:SetMovable(true)
  APBBuffTimerMover:SetBackdrop(SelectFrameBorder)
  APBBuffTimerMover:SetScript('OnMouseDown', APBBuffTimerMover.StartMoving)
  APBBuffTimerMover:SetScript('OnMouseUp', APBStopMoving)
  APBBuffTimerMover:SetFrameStrata('HIGH')
  APBBuffTimerMover:SetClampedToScreen(true)

  local FontString = APBBuffTimerMover:CreateFontString(nil)
  FontString:SetAllPoints()
  FontString:SetFont([[Fonts\FRIZQT__.TTF]], 13, 'THICKOUTLINE')
  FontString:SetJustifyH('CENTER')
  FontString:SetJustifyV('MIDDLE')
  FontString:SetText('TIMER')

  if next(APBTimerPos) == nil then
    APBBuffTimerMover:SetPoint('CENTER', 0, -75)
  else
    APBBuffTimerMover:SetPoint(unpack(APBTimerPos))
  end

  -- Hook secure func for alt power bars
  hooksecurefunc('PlayerBuffTimerManager_UpdateTimers', function()
    if not UnitAffectingCombat('player') then
      Main.DoBlizzAltPowerBar()
    end
  end)

  -- This is used to make sure the power bar can be repositioned after reload UI
  hooksecurefunc('UIParent_ManageFramePositions', function()
    if not UnitAffectingCombat('player') then

      local APBMoverOptionsDisabled = UnitBars.APBMoverOptionsDisabled
      PlayerPowerBarAlt:SetMovable(true)
      PlayerPowerBarAlt:SetUserPlaced(not APBMoverOptionsDisabled)

      if not APBMoverOptionsDisabled then
        PlayerPowerBarAlt:ClearAllPoints()
        PlayerPowerBarAlt:SetPoint('CENTER', APBMover, 'CENTER')
      end
    end
  end)

  Main:APBSetMover()
end

-------------------------------------------------------------------------------
-- DoBlizzAltPowerBar
--
-- Hides and shows the blizzard alt power bar and BuffTimer frame
-- And positions them if moving is enable
--
-- Blizzard code will not modify the positon of the alt power bar when
-- SetUserPlaced is set to true
-- This also hides things like the darkmoon faire timers
--
-- NOTES: This function is also called when PlayerBuffTimerManager_UpdateTimers()
--        is called. This secure function call is done in InitAltPowerBar()
-------------------------------------------------------------------------------
function GUB.Main:DoBlizzAltPowerBar()
  local BuffTimer = nil
  local APBMoverOptionsDisabled = UnitBars.APBMoverOptionsDisabled
  BlizzAltPowerVisible = UnitBars.APBDisabled or APBUseBlizz[AltPowerBarID] or false

  -- Look for bufftimers for darkmoon faire or similar
  for TimerIndex = 1, 10 do
    BuffTimer = _G[format('BuffTimer%s', TimerIndex)]

    if BuffTimer then
      if BuffTimer:IsVisible() then
        break
      else
        -- Clear points incase mover is disabled
        BuffTimer:ClearAllPoints()
      end
    end
  end

  -- Need to do SetMovable otherwise SetUserPlaced causes an error
  PlayerPowerBarAlt:SetMovable(true)

  if not BlizzAltPowerVisible then -- hide
    PlayerPowerBarAlt:SetUserPlaced(false)
    PlayerPowerBarAlt:Hide()

    if BuffTimer then
      BuffTimer:Hide()
      BuffTimer:ClearAllPoints()
    end
  else -- show
    PlayerPowerBarAlt:SetUserPlaced(not APBMoverOptionsDisabled)

    if not APBMoverOptionsDisabled then
      PlayerPowerBarAlt:ClearAllPoints()
      PlayerPowerBarAlt:SetPoint('CENTER', APBMover, 'CENTER')

      if BuffTimer then
        BuffTimer:ClearAllPoints()
        BuffTimer:SetPoint('CENTER', APBBuffTimerMover, 'CENTER')
      end
    end
  end
end

-------------------------------------------------------------------------------
-- EABReset
--
-- Reset the extra action button to default position
-------------------------------------------------------------------------------
function GUB.Main:EABReset()
  EABMover:ClearAllPoints()
  EABMover:SetPoint('CENTER', 0, -150)

  UnitBars.EABPos = {'CENTER', 0, -150}

  Main:DoBlizzAltPowerBar()
end

-------------------------------------------------------------------------------
-- InitExtraActionButton
--
-- This sets up the extra action button for hiding/showing/moving
-------------------------------------------------------------------------------
local function InitExtraActionButton()
  local EABPos = UnitBars.EABPos

  EABMover = CreateFrame('Frame', nil, UIParent)
  EABMover:SetSize(ExtraActionButton1:GetSize())
  EABMover:SetMovable(true)
  EABMover:SetBackdrop(SelectFrameBorder)
  EABMover:SetScript('OnMouseDown', EABMover.StartMoving)
  EABMover:SetScript('OnMouseUp', function()
    UnitBars.EABPos = { EABMover:GetPoint() }
    EABMover:StopMovingOrSizing()
  end)
  EABMover:SetFrameStrata('HIGH')
  EABMover:SetClampedToScreen(true)

  local FontString = EABMover:CreateFontString(nil)
  FontString:SetAllPoints()
  FontString:SetFont([[Fonts\FRIZQT__.TTF]], 13, 'THICKOUTLINE')
  FontString:SetJustifyH('CENTER')
  FontString:SetJustifyV('MIDDLE')
  FontString:SetText('EAB')

  -- Hook secure func for extra action button
  hooksecurefunc('UIParent_ManageFramePositions', function()
    if not UnitAffectingCombat('player') then
      Main.DoExtraActionButton()
    end
  end)

  if next(EABPos) == nil then
    EABMover:SetPoint(ExtraActionButton1:GetPoint())
  else
    EABMover:SetPoint(unpack(EABPos))
  end
  Main:DoExtraActionButton()
end

-------------------------------------------------------------------------------
-- DoExtraActionButton
--
-- Hides and shows the blizzard extra action button frame
-- And positions them if moving is enable
-------------------------------------------------------------------------------
function GUB.Main:DoExtraActionButton()
  if not UnitBars.EABMoverOptionsDisabled then
    if Main.EABMoverEnabled then
      EABMover:Show()
    else
      EABMover:Hide()
    end
    ExtraActionButton1:ClearAllPoints()
    ExtraActionButton1:SetPoint('CENTER', EABMover, 'CENTER')
  else
    EABMover:Hide()
  end
end
  Reply With Quote
 

WoWInterface » Developer Discussions » Lua/XML Help » Getting protected function call error

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off