WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Lua/XML Help (https://www.wowinterface.com/forums/forumdisplay.php?f=16)
-   -   Nameplate's castbar won't change its texture (https://www.wowinterface.com/forums/showthread.php?t=56817)

Lyak 10-31-18 12:35 AM

Nameplate's castbar won't change its texture
 
Hi all,

I've been a user of kui nameplate, but have recently decided to work on my private nameplate addon which I honestly don't know why LOL..........

Anyways!

I have started to working on media updates like font, statusbar texture, etc as my first job.

Everything is working fine except from the statusbar texture of castbar.

Please have a look at the code.
Lua Code:
  1. ------------------------------------------
  2. -- Variable
  3. ------------------------------------------
  4.  
  5. local LSM = LibStub("LibSharedMedia-3.0");
  6. local fontA = LSM:Fetch("font", "fontA");
  7. local textureB = LSM:Fetch("statusbar", "textureB");
  8.  
  9. local UpdateMedia;
  10. local CreateAuraFrame;
  11. local CreateHealthText;
  12.  
  13. local OnEvent;
  14.  
  15. ------------------------------------------
  16. -- Function
  17. ------------------------------------------
  18.  
  19. function UpdateMedia(nameplate)
  20.     local unitFrame = nameplate.UnitFrame;
  21.  
  22.     local name = unitFrame.name;
  23.     if (name) then
  24.         name:SetFont(fontA, 14, "OUTLINE");
  25.     end
  26.  
  27.     local healthBar = unitFrame.healthBar;
  28.     if (healthBar) then
  29.         healthBar:SetStatusBarTexture(textureB);
  30.     end
  31.  
  32.     local castBar = unitFrame.castBar;
  33.     if (castBar) then
  34.         castBar:SetStatusBarTexture(textureB);
  35.  
  36.         castBar.Text:SetFont(fontA, 12, "OUTLINE");
  37.     end
  38. end
  39.  
  40. function OnEvent(self, event, ...)
  41.     if (event == "NAME_PLATE_CREATED") then
  42.         local nameplate = ...;
  43.         if (nameplate and nameplate.UnitFrame) then
  44.             UpdateMedia(nameplate);
  45.             -- CreateAuraFrame(nameplate);
  46.             -- CreateHealthText(nameplate);
  47.         end
  48.     end
  49. end
  50.  
  51. local handler = CreateFrame("Frame");
  52. handler:RegisterEvent("NAME_PLATE_CREATED");
  53. handler:RegisterEvent("NAME_PLATE_UNIT_ADDED");
  54. handler:RegisterEvent("NAME_PLATE_UNIT_REMOVED");
  55. handler:SetScript("OnEvent", OnEvent);

It looks like Blizzard's code is keep updating the castbar's texture which I dug into, but failed :(

Could anyone please correct me if I am getting it wrong?

As always, thank you in advance!

Lyak 11-01-18 01:10 AM

I've also tried something like this:

Lua Code:
  1. ------------------------------------------
  2. -- Variable
  3. ------------------------------------------
  4.  
  5. local LSM = LibStub("LibSharedMedia-3.0");
  6. local fontA = LSM:Fetch("font", "fontA");
  7. local textureB = LSM:Fetch("statusbar", "textureB");
  8.  
  9. local UpdateMedia;
  10. local CreateAuraFrame;
  11. local CreateHealthText;
  12.  
  13. local OnEvent;
  14.  
  15. ------------------------------------------
  16. -- Function
  17. ------------------------------------------
  18.  
  19. function UpdateMedia(nameplate)
  20.     local unitFrame = nameplate.UnitFrame;
  21.  
  22.     local name = unitFrame.name;
  23.     if (name) then
  24.         name:SetFont(fontA, 14, "OUTLINE");
  25.     end
  26.  
  27.     local healthBar = unitFrame.healthBar;
  28.     if (healthBar) then
  29.         healthBar:SetStatusBarTexture(textureB);
  30.     end
  31.  
  32.     local castBar = unitFrame.castBar;
  33.     if (castBar) then
  34.         castBar._SetStatusBarTexture = castBar.SetStatusBarTexture;
  35.         castBar:SetStatusBarTexture(textureB);
  36.         castBar.SetStatusBarTexture = function(...) end;
  37.  
  38.         castBar.Text:SetFont(fontA, 12, "OUTLINE");
  39.     end
  40. end
  41.  
  42. function OnEvent(self, event, ...)
  43.     if (event == "NAME_PLATE_CREATED") then
  44.         local nameplate = ...;
  45.         if (nameplate and nameplate.UnitFrame) then
  46.             UpdateMedia(nameplate);
  47.             -- CreateAuraFrame(nameplate);
  48.             -- CreateHealthText(nameplate);
  49.         end
  50.     end
  51. end
  52.  
  53. local handler = CreateFrame("Frame");
  54. handler:RegisterEvent("NAME_PLATE_CREATED");
  55. handler:RegisterEvent("NAME_PLATE_UNIT_ADDED");
  56. handler:RegisterEvent("NAME_PLATE_UNIT_REMOVED");
  57. handler:SetScript("OnEvent", OnEvent);

So, on nameplate creation, the SetStatusBarTexture is backed up with a name _SetStatusBarTexture, call SetStatusBarTexture then SetStatusBarTexture is now set to empty function.

This worked fine when the player is not in the combat, but once the player is in the combat, it causes the following error.

Code:

1x [ADDON_ACTION_BLOCKED] AddOn 'LyakNameplate' tried to call the protected function 'SetTargetClampingInsets()'
Would there be any secure way to tweak the texture of nameplate's castbar...?

jeruku 11-01-18 09:01 AM

In this case you may need to change the texture every time it is set by the default UI. This can be achieved using the funciton hooksecurefunc. Otherwise you will keep tainting the UI.

This work around is provided you can not find where it keeps resetting the texture. If you happen to know where/how it is being reset there may be some other options.

Lua Code:
  1. -- So instead of:
  2. -- castBar.SetStatusBarTexture = function(...) end
  3.     -- You'd use:
  4.     local redundant
  5.     hooksecurefunc(castBar, "SetStatusBarTexture", function(self, ...)
  6.         if not redundant then
  7.             redundant = true
  8.             self:SetStatusBarTexture(textureB)
  9.             redundant = false
  10.         end
  11.     end)

Lyak 11-03-18 03:26 AM

Hi jeruku,

Yeah, I am currently using hooksecurefunc as a temporary solution although I didn't update this thread.
(Sorry was damn tired and didn't have much time to update here :o)

I am keep trying to find the best solution for this ;)


All times are GMT -6. The time now is 06:09 PM.

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