Go to Page... |
|
Thread Tools | Display Modes |
02-27-21, 06:31 PM | #1 |
Arena ClassSpec-Icons appear/mirror friendly/neutral nameplates
Hello,
I use alot of scripts for pvp and one of the codes is giving me trouble since Shadowlands. Code:
local U = UnitIsUnit; local GetNamePlate = C_NamePlate.GetNamePlateForUnit; local frame = CreateFrame("frame"); local data = {}; function NamePlate_Added(...) local nameplateId = ...; local nameplate = GetNamePlate(nameplateId).UnitFrame; for i=1,5 do if UnitIsUnit(nameplateId, "arena"..i) then addIcon(data[i], nameplate); end end end function NamePlate_Removed(...) local nameplateId = ...; local nameplate = GetNamePlate(nameplateId).UnitFrame; if (nameplate.iconClass) then nameplate.iconClass:Hide(); end end function SetupIcons() for i = 1, GetNumArenaOpponentSpecs() do local specID = GetArenaOpponentSpec(i) if specID > 0 then local id, name, description, icon, role, class = GetSpecializationInfoByID(specID); data[i] = icon; end end end function addIcon (icon, frame) local button = CreateFrame("Button", "ClassIcon", frame); local txt = button:CreateTexture(); txt:SetTexture(icon); txt:SetAllPoints(); button:SetNormalTexture(txt); button:SetWidth(20); button:SetHeight(20); button:SetPoint("RIGHT", 10, -5); frame.iconClass = button; end frame:RegisterEvent('NAME_PLATE_UNIT_ADDED'); frame:RegisterEvent('NAME_PLATE_UNIT_REMOVED'); frame:RegisterEvent('ARENA_PREP_OPPONENT_SPECIALIZATIONS'); frame:SetScript('OnEvent', function (self, event, ...) if (event == "ARENA_PREP_OPPONENT_SPECIALIZATIONS") then SetupIcons(); elseif (event == 'NAME_PLATE_UNIT_ADDED') then NamePlate_Added(...) elseif (event == 'NAME_PLATE_UNIT_REMOVED') then NamePlate_Removed(...); end end) Also I get lua.errors which I couldnt fix myself but I dont think it is related to this problem itself: Code:
Message: Interface\AddOns\RulezPvPScripts\core.lua:21: attempt to index local 'nameplate' (a nil value) Time: Sun Feb 28 00:59:43 2021 Count: 2 Stack: Interface\AddOns\RulezPvPScripts\core.lua:21: attempt to index local 'nameplate' (a nil value) [string "@Interface\AddOns\RulezPvPScripts\core.lua"]:21: in function `NamePlate_Removed' [string "@Interface\AddOns\RulezPvPScripts\core.lua"]:60: in function <Interface\AddOns\RulezPvPScripts\core.lua:54> Locals: nameplateId = "nameplate1" nameplate = nil (*temporary) = "nameplate1" (*temporary) = NamePlate1 { OnSizeChanged = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:485 GetPreferredInsets = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:466 GetAdditionalInsetPadding = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:455 NCIconsCount = 0 ApplyOffsets = <function> defined =[C]:-1 NCIcons = <table> { } OnRemoved = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:424 OnAdded = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:413 template = "NamePlateUnitFrameTemplate" 0 = <userdata> OnOptionsUpdated = <function> defined @Interface\AddOns\Blizzard_NamePlates\Blizzard_NamePlates.lua:431 } (*temporary) = "attempt to index local 'nameplate' (a nil value)" GetNamePlate = <function> defined =[C]:-1 It is not my own code so it would be really kind if someone is able to fix it up. For friendly nameplates I use a different code because I need different positioning and Iconsize (smaller nameplates): Code:
local frame = CreateFrame("Frame") frame:SetScript("OnEvent", function(self, event, unit) local namePlate = GetNamePlateForUnit(unit) if event == "NAME_PLATE_UNIT_ADDED" and UnitIsFriend("player", unit) then local _, class = UnitClass(unit) if iconTexture[class] then local icon = namePlate[iconKey] if not icon then icon = namePlate:CreateTexture(nil, "OVERLAY") icon:SetPoint('CENTER', 0, 29.46) icon:SetSize(24, 24) namePlate[iconKey] = icon end icon:SetTexture(iconTexture[class]) icon:Show() return end end if namePlate[iconKey] then namePlate[iconKey]:Hide() end end) frame:RegisterEvent("NAME_PLATE_UNIT_ADDED") frame:RegisterEvent("NAME_PLATE_UNIT_REMOVED") local f = CreateFrame("Frame") f:RegisterEvent("PLAYER_LOGIN") f:RegisterEvent("PLAYER_ENTERING_WORLD") f:SetScript("OnEvent", function() nameplateSize() end) function nameplateSize() and to rewrite the second code with friendly_units but to show spec-icons instead of class-icons (see example) in arenas? Basically friendly and enemy nameplate class-icons outside of arena/pvp (or when :GetSpec isnt working) and turn to friendly/enemy specialization-icons inside arena/pvp (if possible). I know its a mess and alot of work but I usually just put all the stuff mixed together in one addon and I dont have alot of expierence with lua. It would be really helpful and maybe its possible to create a small addon with both functions/codes (friendly, enemy) with the possibility to seperate edit friendly icons from enemy icons in sizes/positioning (no ingame config just simple lua-code). I would also like to share the result to the community if someone get this to work. Thank you for reading. Attachments: Issues (wrong/discplacement_example), Friendly_Nameplates (default_ like usually), Enemy_Nameplates (default_ like usually) The icon on the top of the first image is from BigDebuffs which is bugged too but addon related (already reportet). Last edited by rulezyx : 03-01-21 at 06:49 AM. |
|
WoWInterface » Developer Discussions » Lua/XML Help » Arena ClassSpec-Icons appear/mirror friendly/neutral nameplates |
«
Previous Thread
|
Next Thread
»
|
Display Modes |
Switch to Linear Mode |
Switch to Hybrid Mode |
Threaded Mode |
|
|