WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Legion Beta archived threads (https://www.wowinterface.com/forums/forumdisplay.php?f=177)
-   -   [PTR,7.1] Nameplate Color Change causes lua error in combat. (https://www.wowinterface.com/forums/showthread.php?t=54635)

thomasjohnshannon 10-11-16 09:05 PM

[PTR,7.1] Nameplate Color Change causes lua error in combat.
 
When any addon modifies the color of the default nameplates it will cause the following error when a new nameplate is created during combat.

Code:

1x [ADDON_ACTION_BLOCKED] AddOn '!Colorz' tried to call the protected function 'SetTargetClampingInsets()'.
!BugGrabber\BugGrabber.lua:573: in function <!BugGrabber\BugGrabber.lua:573>
[C]: in function `SetTargetClampingInsets'
...eBlizzard_NamePlates\Blizzard_NamePlates.lua:221: in function `SetupClassNameplateBars'
...eBlizzard_NamePlates\Blizzard_NamePlates.lua:74: in function `OnNamePlateAdded'
...eBlizzard_NamePlates\Blizzard_NamePlates.lua:38: in function <...eBlizzard_NamePlates\Blizzard_NamePlates.lua:32>

This seems be true no matter how the code works. Directly setting the status bar color, setting DefaultCompactNamePlate(Friendly/Enemy)FrameOptions.useClassColors to true, or modifying UnitSelectionColor all cause the same error.

zork 10-12-16 12:35 AM

The error is pretty clear about that. The problem is not you setting the color but the addon !Colorz trying to call SetTargetClampingInsets. That function is protected now.

With 7.1 some of the nameplate related function calls become restricted.

http://us.battle.net/forums/en/wow/topic/20749494846

On that note. You can build nameplates with oUF now. http://www.wowinterface.com/forums/s...ad.php?t=54584

If you are already using oUF for your unitframes you can get rid of the second set of unit event handlers and use oUF for all units.

thomasjohnshannon 10-12-16 03:41 PM

I know about the restrictions and none of the addons that I have tested touch SetTargetClampingInsets in any way. This is the entire Colorz addon and as you can see it shouldn't be interacting with that function that is only used in NamePlateDriverMixin:SetupClassNameplateBars().

Lua Code:
  1. -- Sets manabar color for default unit frames.
  2. local function CustomManaColor(manaBar)
  3.     local powerType = UnitPowerType(manaBar.unit);
  4.  
  5.     if ( powerType == 0 ) then
  6.         manaBar:SetStatusBarColor(0,0.55,1)
  7.     end
  8. end
  9. hooksecurefunc('UnitFrameManaBar_UpdateType',CustomManaColor)
  10.  
  11. CUSTOM_FACTION_BAR_COLORS = {
  12.     [1] = {r = 1, g = 0, b = 0},
  13.     [2] = {r = 1, g = 0, b = 0},
  14.     [3] = {r = 1, g = 1, b = 0},
  15.     [4] = {r = 1, g = 1, b = 0},
  16.     [5] = {r = 0, g = 1, b = 0},
  17.     [6] = {r = 0, g = 1, b = 0},
  18.     [7] = {r = 0, g = 1, b = 0},
  19.     [8] = {r = 0, g = 1, b = 0},
  20. }
  21.  
  22. function GameTooltip_UnitColor(unit)
  23.  
  24.     local r, g, b
  25.  
  26.     if (UnitIsDead(unit) or UnitIsGhost(unit) or UnitIsTapDenied(unit)) then
  27.         r = 0.5
  28.         g = 0.5
  29.         b = 0.5
  30.     elseif (UnitIsPlayer(unit)) then
  31.         if (UnitIsFriend(unit, 'player')) then
  32.             local _, class = UnitClass(unit)
  33.             if ( class ) then
  34.                 r = RAID_CLASS_COLORS[class].r
  35.                 g = RAID_CLASS_COLORS[class].g
  36.                 b = RAID_CLASS_COLORS[class].b
  37.             else
  38.                 r = 0.60
  39.                 g = 0.60
  40.                 b = 0.60
  41.             end
  42.         elseif (not UnitIsFriend(unit, 'player')) then
  43.             r = 1
  44.             g = 0
  45.             b = 0
  46.         end
  47.     elseif (UnitPlayerControlled(unit)) then
  48.         if (UnitCanAttack(unit, 'player')) then
  49.             if (not UnitCanAttack('player', unit)) then
  50.                 r = 157/255
  51.                 g = 197/255
  52.                 b = 255/255
  53.             else
  54.                 r = 1
  55.                 g = 0
  56.                 b = 0
  57.             end
  58.         elseif (UnitCanAttack('player', unit)) then
  59.             r = 1
  60.             g = 1
  61.             b = 0
  62.         elseif (UnitIsPVP(unit)) then
  63.             r = 0
  64.             g = 1
  65.             b = 0
  66.         else
  67.             r = 157/255
  68.             g = 197/255
  69.             b = 255/255
  70.         end
  71.     else
  72.         local reaction = UnitReaction(unit, 'player')
  73.  
  74.         if (reaction) then
  75.             r = CUSTOM_FACTION_BAR_COLORS[reaction].r
  76.             g = CUSTOM_FACTION_BAR_COLORS[reaction].g
  77.             b = CUSTOM_FACTION_BAR_COLORS[reaction].b
  78.         else
  79.             r = 157/255
  80.             g = 197/255
  81.             b = 255/255
  82.         end
  83.     end
  84.  
  85.     return r, g, b
  86. end
  87.  
  88. UnitSelectionColor = GameTooltip_UnitColor

zork 10-12-16 03:58 PM

This line is giving you the error:
https://github.com/tomrus88/Blizzard...lates.lua#L221
Called here:
https://github.com/tomrus88/Blizzard...Plates.lua#L74
From here:
https://github.com/tomrus88/Blizzard...Plates.lua#L38

You manipulate a Blizzard global making all secure code accessing that global insecure. This results in an error in secure environment.

Btw ... that is an error from a taint right? (Interface action blocked etc...)
If it is a taint the error can come from anywhere.

thomasjohnshannon 10-12-16 05:01 PM

I made a quick video to show what is going on. In Colorz if I comment out "UnitSelectionColor = GameTooltip_UnitColor" it will stop the error but as said in my first post it doesn't seem to matter what method you are using.

My nameplate addon hooks CompactUnitFrame_UpdateHealthColor with the following code.

Lua Code:
  1. hooksecurefunc("CompactUnitFrame_UpdateHealthColor", function(frame)
  2.     if ( not nPlates.FrameIsNameplate(frame) ) then return end
  3.  
  4.     if ( not UnitIsConnected(frame.unit) ) then
  5.         local r, g, b = 0.5, 0.5, 0.5
  6.     else
  7.         if ( frame.optionTable.healthBarColorOverride ) then
  8.             local healthBarColorOverride = frame.optionTable.healthBarColorOverride
  9.             r, g, b = healthBarColorOverride.r, healthBarColorOverride.g, healthBarColorOverride.b
  10.         else
  11.             local localizedClass, englishClass = UnitClass(frame.unit)
  12.             local classColor = RAID_CLASS_COLORS[englishClass]
  13.             if ( UnitIsPlayer(frame.unit) and classColor and frame.optionTable.useClassColors ) then
  14.                     r, g, b = classColor.r, classColor.g, classColor.b
  15.             elseif ( CompactUnitFrame_IsTapDenied(frame) ) then
  16.                 r, g, b = 0.1, 0.1, 0.1
  17.             elseif ( frame.optionTable.colorHealthBySelection ) then
  18.                 if ( frame.optionTable.considerSelectionInCombatAsHostile and CompactUnitFrame_IsOnThreatListWithPlayer(frame.displayedUnit) ) then
  19.                     if ( nPlatesDB.TankMode ) then
  20.                         local target = frame.displayedUnit.."target"
  21.                         local isTanking, threatStatus = UnitDetailedThreatSituation("player", frame.displayedUnit)
  22.                         if ( isTanking and threatStatus ) then
  23.                             if ( threatStatus >= 3 ) then
  24.                                 r, g, b = 0.0, 1.0, 0.0
  25.                             elseif ( threatStatus == 2 ) then
  26.                                 r, g, b = 1.0, 0.6, 0.2
  27.                             end
  28.                         elseif ( nPlates.UseOffTankColor(target) ) then
  29.                             r, g, b = nPlatesDB.OffTankColor.r, nPlatesDB.OffTankColor.g, nPlatesDB.OffTankColor.b
  30.                         else
  31.                             r, g, b = 1.0, 0.0, 0.0;
  32.                         end
  33.                     else
  34.                         r, g, b = 1.0, 0.0, 0.0;
  35.                     end
  36.                 else
  37.                     r, g, b = UnitSelectionColor(frame.unit, frame.optionTable.colorHealthWithExtendedColors)
  38.                 end
  39.             elseif ( UnitIsFriend("player", frame.unit) ) then
  40.                 r, g, b = 0.0, 1.0, 0.0
  41.             else
  42.                 r, g, b = 1.0, 0.0, 0.0
  43.             end
  44.         end
  45.     end
  46.  
  47.         -- Execute Range Coloring
  48.  
  49.     if ( nPlatesDB.ShowExecuteRange and nPlates.IsInExecuteRange(frame) ) then
  50.         r, g, b = nPlatesDB.ExecuteColor.r, nPlatesDB.ExecuteColor.g, nPlatesDB.ExecuteColor.b
  51.     end
  52.  
  53.     if ( r ~= frame.healthBar.r or g ~= frame.healthBar.g or b ~= frame.healthBar.b ) then
  54.         frame.healthBar:SetStatusBarColor(r, g, b)
  55.  
  56.         if ( frame.optionTable.colorHealthWithExtendedColors ) then
  57.             frame.selectionHighlight:SetVertexColor(r, g, b)
  58.         else
  59.             frame.selectionHighlight:SetVertexColor(1, 1, 1)
  60.         end
  61.  
  62.         frame.healthBar.r, frame.healthBar.g, frame.healthBar.b = r, g, b
  63.     end
  64.  
  65.         -- Healthbar Border Coloring
  66.  
  67.     if ( frame.healthBar.beautyBorder ) then
  68.         for i = 1, 8 do
  69.             if ( UnitIsUnit(frame.displayedUnit, "target") ) then
  70.                 frame.healthBar.beautyBorder[i]:SetVertexColor(r,g,b,1)
  71.             else
  72.                 frame.healthBar.beautyBorder[i]:SetVertexColor(unpack(borderColor))
  73.             end
  74.         end
  75.     end
  76. end)

If you comment out "frame.healthBar.r, frame.healthBar.g, frame.healthBar.b = r, g, b" from the code the error is gone but since that is the code that actually sets the color it doesn't work without it.

Ketho 10-12-16 06:13 PM

I can confirm it can happen in combat with just this snippet
Lua Code:
  1. DefaultCompactNamePlateFriendlyFrameOptions.useClassColors = true

taintLog (apparently same as the error log)
Code:

Interface\FrameXML\CompactUnitFrame.lua:372 CompactUnitFrame_UpdateHealthColor()
An action was blocked in combat because of taint from Test - SetTargetClampingInsets()
    Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:221 NamePlateDriverFrame:SetupClassNameplateBars()
    Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:74 NamePlateDriverFrame:OnNamePlateAdded()
    Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:38


No idea really what is happening now, with the 7.1 nameplate changes as explained by zork :s

Phanx 10-12-16 07:17 PM

Also, you cannot do this:

Code:

frame.healthBar.r, frame.healthBar.g, frame.healthBar.b = r, g, b
If you do, then your (insecure) values get read into Blizzard (secure) code and introduce taint, which breaks All The Things.

thomasjohnshannon 10-12-16 07:22 PM

Quote:

Originally Posted by Phanx (Post 319864)
Also, you cannot do this:

Code:

frame.healthBar.r, frame.healthBar.g, frame.healthBar.b = r, g, b
If you do, then your (insecure) values get read into Blizzard (secure) code and introduce taint, which breaks All The Things.

That is how the function is currently setup on live and I haven't have any issues with it.

thomasjohnshannon 10-17-16 12:26 AM

Using SetStatusBarColor seems to work now but the the rest still bugs out.

zork 10-17-16 01:11 AM

Well you could do your nameplates with oUF. Would solve your issues. :)

Tercioo 10-25-16 07:17 AM

I can confirm that changing nearly any member of a blizzard nameplate is triggering protected errors.
This small snipped does trigger issues already:

C_Timer.NewTicker (1, function()
NamePlate1.UnitFrame.healthBar.r = 0
end)

We could just use "NamePlate1.UnitFrame.healthBar:SetStatusBarColor (1, 0, 0)" but without changing the .r .g .b values the blizzard nameplate addon will "think" the color is the same and won't trigger color changes by it self due to that.

Ketho 12-18-16 06:47 PM

So does anyone know how to change the nameplate colors without tainting them (in combat)?

I still don't understand what changed in 7.1 for nameplates to get tainted, while it had worked fine previously

(update 2-13) http://www.wowinterface.com/forums/s...ad.php?t=55127

Resike 12-21-16 05:39 PM

I don't think this issue is strictly related to coloring and nameplates. I use the default plates and i don't have any coloring addon, and i still get this taint occasionally. Which mean the taint itself spread to this values somehow after a while anyway.


All times are GMT -6. The time now is 08:02 AM.

vBulletin © 2020, Jelsoft Enterprises Ltd
© 2004 - 2020 MMOUI