12-18-15, 05:57 AM | #1 |
Need help with Nameplate Castbar
I'm working on a little nameplate addon but i got two problems left i can't solve at the moment.
Code:
spellIcon:ClearAllPoints(); spellIcon:SetWidth(CASTBAR_HEIGHT * (BAR_BORDER + 1)); spellIcon:SetHeight(CASTBAR_HEIGHT * (BAR_BORDER + 1)); spellIcon:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMLEFT", -4, 0); local SpellIconOverlay = castBar:CreateTexture(nil, "MEDIUM", nil, -2); SpellIconOverlay:SetTexture("Interface\\AddOns\\Test\\SpellIcon"); SpellIconOverlay:SetVertexColor(0, 0, 0); SpellIconOverlay:SetWidth((CASTBAR_HEIGHT * (BAR_BORDER + 1)) + 1); SpellIconOverlay:SetHeight((CASTBAR_HEIGHT * (BAR_BORDER + 1)) + 1); SpellIconOverlay:SetPoint("CENTER", castBar.spellIcon, "CENTER", 0, 0); stays behind the actual spell icon, and if i try to us :SetFrameLevel("LOW") on the Spellicon i get bombed with this error: Code:
Message: ...e\AddOns\Test\Test.lua:173: attempt to call method 'SetFrameLevel' (a nil value) the second Problem is the spell name, i want to shorten it if its gets longer then a specific amount of letters, i have a function for that which i use on the name of the unit that works fine, but i can't use it on the CastbarText, at the moment it seems to me that it is the same problem as above. same attempt like on the name: Code:
castBar.spellName = utf8sub(castBar.spellName:GetText(), 27, false); Code:
Message: ...e\AddOns\Test\Test.lua:18: attempt to index local 'string' (a nil value) Or simply has a list of the content of these Tables i seem to dumb to find ? Thanks, Basso |
|
12-18-15, 09:24 AM | #2 |
We need to see your code.
|
|
12-18-15, 09:59 AM | #3 |
Code:
-- Nephilist Nameplates v1.0 -- by lieandswell / Neph <Nephthys @ Hyjal-US> local function NephilistTest(input) if ( input ) then DEFAULT_CHAT_FRAME:AddMessage(input); else DEFAULT_CHAT_FRAME:AddMessage("Test"); end end -- Local copies of global variables and often-used functions local _G = _G; local WorldFrame = WorldFrame; local string = string; local function utf8sub(string, i, dots) local bytes = string:len() if bytes <= i then return string else local len, pos = 0, 1 while pos <= bytes do len = len + 1 local c = string:byte(pos) if c > 0 and c <= 127 then pos = pos + 1 elseif c >= 194 and c <= 223 then pos = pos + 2 elseif c >= 224 and c <= 239 then pos = pos + 3 elseif c >= 240 and c <= 244 then pos = pos + 4 end if len == i then break end end if len == i and pos <= bytes then return string:sub(1, pos - 1)..'*' else return string end end end -- AddOn variables local newNamePlates = {}; local FONT = 'Interface\\AddOns\\NephilistNameplates\\ROADWAY.ttf' local NAMEPLATE_SCALE = 1; local FONT_SIZE = 14; local NONTARGET_ALPHA = 0.5; local BAR_BORDER = 2; local HEALTHBAR_WIDTH = 130; -- Default nameplate width is ~130 local HEALTHBAR_HEIGHT = 4; local HEALTHBAR_SIZE = {HEALTHBAR_WIDTH, HEALTHBAR_HEIGHT}; local CASTBAR_WIDTH = HEALTHBAR_WIDTH -15; local CASTBAR_HEIGHT = HEALTHBAR_HEIGHT; local CASTBAR_SIZE = {CASTBAR_WIDTH, CASTBAR_HEIGHT}; local RED = {0.7, 0.1, 0.1, 1}; local YELLOW = {0.7, 0.7, 0.1, 1}; local GREEN = {0.1, 0.6, 0.1, 1}; local BLUE = {0.1, 0.2, 0.7, 1}; local LVLC = {0, 0, 0}; local trash = CreateFrame("Frame"); trash:Hide(); local function ProcessOldNamePlate(namePlate) namePlate.nameFrame = namePlate.NameContainer; namePlate.name = namePlate.NameContainer.NameText; namePlate.barFrame = namePlate.ArtContainer; namePlate.border = namePlate.ArtContainer.Border; namePlate.oldHighlight = namePlate.ArtContainer.Highlight; namePlate.level = namePlate.ArtContainer.LevelText; namePlate.raidIcon = namePlate.ArtContainer.RaidTargetIcon; namePlate.eliteDragon = namePlate.ArtContainer.EliteIcon; namePlate.threatTexture = namePlate.ArtContainer.AggroWarningTexture; namePlate.bossIcon = namePlate.ArtContainer.HighLevelIcon; namePlate.healthBar = namePlate.ArtContainer.HealthBar; namePlate.healthBar.barTexture = namePlate.healthBar:GetRegions(); namePlate.castBar = namePlate.ArtContainer.CastBar; namePlate.castBar.barTexture = namePlate.castBar:GetRegions(); namePlate.castBar.border = namePlate.ArtContainer.CastBarBorder; namePlate.castBar.spellIcon = namePlate.ArtContainer.CastBarSpellIcon; namePlate.castBar.shield = namePlate.ArtContainer.CastBarFrameShield; namePlate.castBar.spellName = namePlate.ArtContainer.CastBarText; namePlate.castBar.nameShadow = namePlate.ArtContainer.CastBarTextBG; -- Reuse some elements of old nameplate namePlate.healthBar:SetParent(namePlate.newPlate); namePlate.castBar:SetParent(namePlate.newPlate); namePlate.raidIcon:SetParent(namePlate.healthBar); -- namePlate.highlight:SetParent(namePlate.newPlate); -- Nameplates are secure and Hide() will taint, so... -- Reparent text frames we don't need/want so they don't get shown namePlate.nameFrame:SetParent(trash); namePlate.level:SetParent(trash); -- Hide unused textures with SetTexture(nil) namePlate.border:SetTexture(nil); namePlate.oldHighlight:SetTexture(nil); namePlate.threatTexture:SetTexture(nil); namePlate.castBar.border:SetTexture(nil); namePlate.castBar.nameShadow:SetTexture(nil); end local function MakeNewHealthBar(namePlate) local healthBar = namePlate.healthBar; healthBar:SetStatusBarTexture("Interface\\AddOns\\NephilistNamePlates\\NephilistBarClean"); -- HealthBar Size and position set in NamePlate_OnShow() local healthBarBackground = healthBar:CreateTexture(nil, "ARTWORK", nil, -5); healthBarBackground:SetTexture("Interface\\AddOns\\NephilistNamePlates\\NephilistBarClean"); healthBarBackground:SetVertexColor(unpack(LVLC)); healthBarBackground:SetWidth(HEALTHBAR_WIDTH + 2 * BAR_BORDER); healthBarBackground:SetHeight(HEALTHBAR_HEIGHT + 2 * BAR_BORDER); healthBarBackground:SetPoint("CENTER"); local newName = healthBar:CreateFontString(nil, "LOW", "GameFontNormal"); newName:SetFont(FONT, FONT_SIZE,'THINOUTLINE'); newName:SetPoint("BOTTOMLEFT", healthBar, "BOTTOMLEFT", 0, 0); namePlate.newName = newName; local LVL = healthBar:CreateFontString(nil, "LOW", "GameFontNormal"); LVL:SetFont(FONT, FONT_SIZE-4,'THINOUTLINE'); LVL:SetPoint("TOPRIGHT", healthBarBackground, "BOTTOMRIGHT", 0, -2); namePlate.LVL = LVL; local raidIcon = namePlate.raidIcon; raidIcon:SetHeight(6 * HEALTHBAR_HEIGHT); raidIcon:SetWidth(6 * HEALTHBAR_HEIGHT); raidIcon:ClearAllPoints(); raidIcon:SetPoint("BOTTOM", healthBar, "TOP", 0, 24); local highlight = healthBar:CreateTexture(nil, "ARTWORK", nil, -6); highlight:SetTexture("Interface\\AddOns\\NephilistNamePlates\\NephilistBarClean"); highlight:SetVertexColor(1, 1, 1); highlight:SetWidth(HEALTHBAR_WIDTH + 3 * BAR_BORDER); highlight:SetHeight(HEALTHBAR_HEIGHT + 3 * BAR_BORDER); -- highlight:ClearAllPoints(); highlight:SetPoint("CENTER"); namePlate.highlight = highlight; end local function MakeNewCastBar(nameplate) local castBar = nameplate.castBar local spellIcon = nameplate.castBar.spellIcon castBar:SetStatusBarTexture("Interface\\AddOns\\NephilistNamePlates\\NephilistBarClean"); castBar.point = {"BOTTOMRIGHT", nameplate.healthBar, "TOPRIGHT", 0, 15}; castBar.size = CASTBAR_SIZE; -- castBar.size and castBar.point used to set size and position in CastBar_OnShow() local castBarBackground = castBar:CreateTexture(nil, "ARTWORK", nil, -2); castBarBackground:SetTexture("Interface\\AddOns\\NephilistNamePlates\\NephilistBarClean"); castBarBackground:SetVertexColor(0, 0, 0); castBarBackground:SetWidth(CASTBAR_WIDTH + 2 * BAR_BORDER); castBarBackground:SetHeight(CASTBAR_HEIGHT + 2 * BAR_BORDER); castBarBackground:SetPoint("CENTER"); spellIcon:ClearAllPoints(); --spellIcon:SetFrameLevel("LOW"); spellIcon:SetWidth(CASTBAR_HEIGHT * (BAR_BORDER + 1)); spellIcon:SetHeight(CASTBAR_HEIGHT * (BAR_BORDER + 1)); spellIcon:SetPoint("BOTTOMRIGHT", castBar, "BOTTOMLEFT", -4, 0); local SpellIconBackground = castBar:CreateTexture(nil, "MEDIUM", nil, -2); SpellIconBackground:SetTexture("Interface\\AddOns\\NephilistNamePlates\\SpellIcon"); SpellIconBackground:SetVertexColor(0, 0, 0); SpellIconBackground:SetWidth((CASTBAR_HEIGHT * (BAR_BORDER + 1)) + 1); SpellIconBackground:SetHeight((CASTBAR_HEIGHT * (BAR_BORDER + 1)) + 1); SpellIconBackground:SetPoint("CENTER", castBar.spellIcon, "CENTER", 0, 0); castBar.spellName:SetFont(FONT, FONT_SIZE,'THINOUTLINE'); castBar.spellName:ClearAllPoints(); castBar.spellName:SetPoint("BOTTOMLEFT"); --castBar.spellName = utf8sub(castBar.spellName:GetText(), 27, false); castBar.shield:SetDrawLayer("OVERLAY", -6); castBar.shield:SetTexture("Interface\\HELPFRAME\\HelpIcon-AccountSecurity"); castBar.shield:SetDesaturated(true); -- Shield size and position set in CastBar_OnShow() end local function NamePlate_OnShow(namePlate) local healthBar = namePlate.healthBar; healthBar:SetWidth(HEALTHBAR_WIDTH); healthBar:SetHeight(HEALTHBAR_HEIGHT); healthBar:ClearAllPoints(); healthBar:SetPoint("CENTER", namePlate.barFrame, "CENTER", 0, 0); -- Mute colors local red, green, blue, alpha = healthBar.barTexture:GetVertexColor(); --[[ if ( red > 0.99 ) and ( green < 0.01 ) and ( blue < 0.01 ) then -- Red healthBar.barTexture:SetVertexColor(0.7, 0.1, 0.1, 1); elseif ( red > 0.99 ) and ( green > 0.99 ) and ( blue < 0.01 ) then -- Yellow healthBar.barTexture:SetVertexColor(0.7, 0.7, 0.1, 1); elseif ( red < 0.01 ) and ( green > 0.99 ) and ( blue < 0.01 ) then -- Green healthBar.barTexture:SetVertexColor(0.1, 0.6, 0.1, 1); elseif ( red < 0.01 ) and ( green < 0.01 ) and ( blue > 0.99 ) then -- Blue healthBar.barTexture:SetVertexColor(0.1, 0.2, 0.7, 1); end --]] if ( red > 0.99 ) and ( green < 0.01 ) and ( blue < 0.01 ) then -- Red healthBar.barTexture:SetVertexColor(unpack(RED)); elseif ( red > 0.99 ) and ( green > 0.99 ) and ( blue < 0.01 ) then -- Yellow healthBar.barTexture:SetVertexColor(unpack(YELLOW)); elseif ( red < 0.01 ) and ( green > 0.99 ) and ( blue < 0.01 ) then -- Green healthBar.barTexture:SetVertexColor(unpack(GREEN)); elseif ( red < 0.01 ) and ( green < 0.01 ) and ( blue > 0.99 ) then -- Blue healthBar.barTexture:SetVertexColor(unpack(BLUE)); end local name = utf8sub(namePlate.name:GetText(), 27, false) or "Unknown"; namePlate.newName:SetText(name); namePlate.newName:SetTextColor(0.8, 0.8, 0.8); local level, elite = tonumber(namePlate.level:GetText()), namePlate.eliteDragon:IsShown() if namePlate.bossIcon:IsShown() then namePlate.LVL:SetText("Boss") elseif elite then namePlate.LVL:SetText(level..(elite and "+" or "")) else namePlate.LVL:SetText(level); end namePlate.LVL:SetTextColor(0.8, 0.8, 0.8); namePlate.eliteDragon:SetTexture(nil); namePlate.bossIcon:SetTexture(nil); local scale = namePlate.barFrame:GetScale(); if (scale > 0.9) then namePlate.newPlate:SetScale(NAMEPLATE_SCALE); else namePlate.newPlate:SetScale(0.7 * NAMEPLATE_SCALE); end namePlate.newPlate:Show(); end local function NamePlate_OnHide(namePlate) namePlate.newPlate:Hide(); end local function CastBar_OnShow(castBar) castBar:SetSize(unpack(castBar.size)); castBar:ClearAllPoints(); castBar:SetPoint(unpack(castBar.point)); if ( castBar.shield:IsShown() ) then castBar.shield:ClearAllPoints(); castBar.shield:SetPoint("CENTER", castBar.spellIcon, "CENTER", 0, 0); castBar.shield:SetWidth(2.4 * CASTBAR_HEIGHT); castBar.shield:SetHeight(2.4 * CASTBAR_HEIGHT); castBar.shield:SetVertexColor(0.8, 0.8, 0.8, 1); castBar:SetStatusBarColor(0.35, 0.35, 0.35); else castBar:SetStatusBarColor(0.77, 0.77, 0.77); end end -- Instead of anchoring new nameplate directly to Blizzard nameplate, track nameplate position -- with SetPoint(). Attaching frames to default nameplates will kill your framerate. local function PositionNamePlate(namePlate) local positionFrame = CreateFrame("Frame", nil, namePlate.newPlate); positionFrame:SetPoint("BOTTOMLEFT", WorldFrame); positionFrame:SetPoint("TOPRIGHT", namePlate, "CENTER"); positionFrame:SetScript("OnSizeChanged", function(self, x, y) if ( namePlate:IsShown() ) then namePlate.newPlate:Hide(); -- Supposedly increases framerate. Not convinced. namePlate.newPlate:SetPoint("TOP", WorldFrame, "BOTTOMLEFT", x, y); namePlate.newPlate:Show(); end end) end local function MakeNewNamePlate(namePlate) namePlate.newPlate = CreateFrame("Frame", nil, WorldFrame); newNamePlates[namePlate] = namePlate.newPlate; ProcessOldNamePlate(namePlate); MakeNewHealthBar(namePlate); MakeNewCastBar(namePlate); NamePlate_OnShow(namePlate); if ( not namePlate:IsShown() ) then namePlate.newPlate:Hide(); end CastBar_OnShow(namePlate.castBar); namePlate:HookScript("OnShow", NamePlate_OnShow); namePlate:HookScript("OnHide", NamePlate_OnHide); namePlate.castBar:HookScript("OnShow", CastBar_OnShow); namePlate.castBar:HookScript("OnValueChanged", CastBar_OnShow); -- Sometimes the castBar isn't getting redrawn. Why not? Something to do with channeled spells. PositionNamePlate(namePlate); end local numChildren = -1; WorldFrame:HookScript("OnUpdate", function(self, elapsed) -- Detect new nameplates and process any we haven't already local currentChildren = select("#", WorldFrame:GetChildren()); if ( numChildren ~= currentChildren ) then for i = 1, currentChildren do local namePlate = select(i, WorldFrame:GetChildren()); local name = namePlate:GetName(); if ( name and string.match(name, "^NamePlate%d+$") and not newNamePlates[namePlate] ) then MakeNewNamePlate(namePlate); end end numChildren = currentChildren; end for namePlate, newPlate in next, newNamePlates do if ( namePlate:IsShown() ) then -- Fade out unselected nameplates if ( namePlate:GetAlpha() > 0.99 ) then newPlate:SetAlpha(1); else newPlate:SetAlpha(NONTARGET_ALPHA); end -- Show/hide highlight if ( namePlate.oldHighlight:IsShown() ) then namePlate.highlight:Show(); else namePlate.highlight:Hide(); end end end end) |
|
12-18-15, 10:09 AM | #4 |
Your first error is because you try to call SetFrameLevel on a texture and it's only works on frames.
The second error could be caused because some spells have no names or you call it too early. |
|
12-18-15, 12:59 PM | #5 | |
thanks for your hint. but im at my wits end with the fucking border but without it it looks somewhat stupid, i love clean black borders green one for better visibility as attachment. is there any simple way to put my border overlay over the spellIcon im overlooking ? creating a frame over it is to much of code and workarounds for that, because i also need to show and hide it dynamically. Last edited by Basso : 12-18-15 at 01:02 PM. |
||
12-18-15, 01:16 PM | #6 | |
http://www.wowinterface.com/downloads/info19844 That would be the easiest way. |
||
12-18-15, 02:38 PM | #7 | |
|
||
WoWInterface » Developer Discussions » Lua/XML Help » Need help with Nameplate Castbar |
«
Previous Thread
|
Next Thread
»
|
Display Modes |
Linear Mode |
Switch to Hybrid Mode |
Switch to Threaded Mode |
|
|