WoWInterface

WoWInterface (https://www.wowinterface.com/forums/index.php)
-   Lua/XML Help (https://www.wowinterface.com/forums/forumdisplay.php?f=16)
-   -   Abbrev Names in UFs (https://www.wowinterface.com/forums/showthread.php?t=34832)

Porsha 09-06-10 08:31 PM

Abbrev Names in UFs
 
HI again all...I ripped this piece of code out of Dawns Nameplates that I am using to try and get my target and target of target to show abbrev names in her format:

I.e. (from her config)
names longer than this number will be abbreviated, for example: Sunreaver Mage Guardian becomes S. M. Guardian

I have a code that changes the names to a certain number of characters (thank you Nin) but if the name is longer than I want, it cuts off the last few characters. I wish to have the format like above :)

here is the working code I use now:

local tmpunitname

if (unit=="pet" or unit == "focus") then
tmpunitname = UnitName(unit)
local count = 4


if tmpunitname and tmpunitname:len() > count then
tmpunitname = tmpunitname:sub(1, count, self)
end
end


if (unit=="target" or unit == "targettarget") then
tmpunitname = UnitName(unit)
local count = 20


if tmpunitname and tmpunitname:len() > count then
tmpunitname = tmpunitname:sub(1, count, self)
end
end


And this is the len string I got from Dawns nameplates:

-- string format
local utf8sub = function(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 >= 192 and c <= 223) then
pos = pos + 2
elseif (c >= 224 and c <= 239) then
pos = pos + 3
elseif (c >= 240 and c <= 247) 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)..(dots and '...' or '')
else
return string
end
end
end


I have worked for a few hours trying to change words that match the UF layout but I can figure this out and finally gave up coming here to see if anyone can help.

thank you muches!

Porsha 09-06-10 10:32 PM

Well, i found this on a search but it isnt working either:

--this part goes near the top of your layout, before the style function

oUF.Tags["[abbreviatedname]"] = [[function(u)
local name = UnitName(u)
return (string.len(name) > 10) and string.gsub(name, "%s?(.)%S+%s", "%1. ") or name
end
]]
oUF.TagEvents["[abbreviatedname]"] = "UNIT_NAME_UPDATE"


-- snip, next part is inside your style function.

local name = self.Health:CreateFontString(nil, 'OVERLAY', 'GameFontHighlightSmallLeft')
name:SetPoint('LEFT',self.Health) --replace this line with your own positioning code
name:SetPoint('RIGHT',self.Health) --replace this line with your own positioning code
self:Tag(name, '[abbreviatedname]')
self.Name = name


So.....waiting for someone who may can help me out :) thanks a lot!

Taroven 09-07-10 03:44 AM

Edit: I totally didn't read the first thread all the way through... really need sleep. That tag seems like it should work. What exactly is the problem you're having with it?

yj589794 09-07-10 04:09 AM

That Tag is for oUF 1.3.x, if you are using oUF 1.4 or above you need to change it to:
Code:

oUF.Tags["abbreviatedname"] = [[function(u)
        local name = UnitName(u)
        return (string.len(name) > 10) and string.gsub(name, "%s?(.)%S+%s", "%1. ") or name
end]]
oUF.TagEvents["abbreviatedname"] = "UNIT_NAME_UPDATE"

with this in your layout:
Code:

local name = self.Health:CreateFontString(nil, 'OVERLAY', 'GameFontHighlightSmallLeft')
name:SetPoint('LEFT',self.Health) --replace this line with your own positioning code
name:SetPoint('RIGHT',self.Health) --replace this line with your own positioning code
self:Tag(name, '[abbreviatedname]')


Porsha 09-07-10 08:59 AM

I'm using oUF 1.3

Maybe I didnt give all the infor so this may be a long copy and paste, sorry.

This is what the layout has now concerning names:

-- -------------------------------------------------------------------------------------------------
-- NAME UPDATE
-- -------------------------------------------------------------------------------------------------

local updateName = function(self, event, unit)
if(self.unit ~= unit) then return end
local name = UnitName(unit)
self.Name:SetText(name)

local color
if UnitIsPlayer(unit) then
local _, c = UnitClass(unit)
color = RAID_CLASS_COLORS[c]

else
color = UnitReactionColor[UnitReaction(unit, "player")]
end

if color then
self.Name:SetTextColor(color.r,color.g,color.b,1)
end


if unit=="target" or unit=="targettarget" or unit=="focus" or unit=="pet" then
updateLevel(self, unit, name)
end
end

-- -------------------------------------------------------------------------------------------------
-- HEALTH UPDATE
-- -------------------------------------------------------------------------------------------------

local updateHealth = function(self, event, unit, bar, min, max)
local cur, maxhp = min, max
local missing = maxhp-cur
local d = floor(cur/maxhp*100)
local color
local tmpunitname

if (unit=="pet" or unit == "focus") then
tmpunitname = UnitName(unit)
local count = 4


if tmpunitname and tmpunitname:len() > count then
tmpunitname = tmpunitname:sub(1, count, self)
end
end


if (unit=="target" or unit == "targettarget") then
tmpunitname = UnitName(unit)
local count = 20


if tmpunitname and tmpunitname:len() > count then
tmpunitname = tmpunitname:sub(1, count, self)
end
end

if UnitIsPlayer(unit) then
local _, c = UnitClass(unit)
color = RAID_CLASS_COLORS[c]

else
color = UnitReactionColor[UnitReaction(unit, "player")]
end

if color then
self.Healthpanel:SetBackdropColor(0,0,0,0)
self.Health2:SetVertexColor(color.r,color.g,color.b,1)
self.Name2:SetTextColor(color.r,color.g,color.b,1)
end

if(unit=="pet" or unit == "focus") then
if(self.unit ~= unit) then return end
local min, max = UnitHealth(unit), UnitHealthMax(unit)
self.Health2:SetPoint('LEFT', 56.2 * (min / max), 0)
self.Health2:SetVertexColor(self.ColorGradient(min / max, unpack(self.colors.smooth)))

else
self.Health2:SetPoint('LEFT', 201 * (min / max), 0)
end

if(UnitIsDead(unit)) then
bar.value:SetText"|cffffffffDead|cffff0000!"
self.Health2:SetVertexColor(0,0,0,0)
self.Health:SetStatusBarColor(0,0,0,0)

elseif(UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit)) then
bar.value:SetText"|cffffffffTapped|cffff0000!"


elseif(UnitIsGhost(unit)) then
bar.value:SetText"|cffffffffGhost|cffff0000!"
self.Health2:SetVertexColor(0,0,0,0)
self.Health:SetStatusBarColor(0,0,0,0)

elseif(not UnitIsConnected(unit)) then
bar.value:SetText"|cffffffffOff|cffff0000!"
self.Health2:SetVertexColor(0,0,0,0)
self.Health:SetStatusBarColor(0,0,0,0)

elseif(unit == "player") then
if(min ~= max) then
bar.value:SetText("|cffff0000-|r"..numberize(missing))
else
bar.value:SetText("|cff98fb98"..numberize(cur))
end

elseif(unit=="target") then
if(min ~= max) then
bar.value:SetFormattedText('|cffffffff%s|r |cff00ff00: |r%d',numberize(cur), (min/max)*100)
self.Name2:SetText(tmpunitname)
else
bar.value:SetText("|cff98fb98"..numberize(cur))
self.Name2:SetText(tmpunitname)
end
elseif(unit=="targettarget") then
if(min ~= max) then
bar.value:SetText("|cffff0000-|r"..numberize(missing))
self.Name2:SetText(tmpunitname)

else
self.Name2:SetText(tmpunitname)
bar.value:SetText("|cff98fb98"..numberize(cur))
end

elseif(unit == "focus") then
if(min ~= max) then
bar.value:SetText("|cffff0000-|r"..numberize(missing))
self.Name2:SetText(tmpunitname)

else
self.Name2:SetText(tmpunitname)
bar.value:SetText("|cff98fb98"..numberize(cur))
end

elseif(unit == "pet") then
bar.value:SetText("|cff98fb98"..numberize(cur))
end
self:UNIT_NAME_UPDATE(event, unit)
end



Now with this setup I can truncate the name to whatever length but it cuts if off at the end of the name.

I guess im not sure where to put the proper codes to get them to work. When I delete everything about (tmpunitname) and add in that code then replace this original line that calls the code (this is the original thats in the layout now before any changes):

-- -------------------------------------------------------------------------------------------------
-- NAME's
-- -------------------------------------------------------------------------------------------------
self.Name = self.Health:CreateFontString(nil, 'OVERLAY')
self.Name:SetWidth(200)
self.Name:SetHeight(fontsize)
self.Name:SetFont(font,fontsize, "OUTLINEMONOCHROME")
self.Name:SetShadowOffset(1,-1)
self.Name:SetShadowColor(0,0,0)

-- -------------------------------------------------------------------------------------------------
-- NAME's
-- -------------------------------------------------------------------------------------------------

self.Name2 = self.Health:CreateFontString(nil, "OVERLAY")
self.Name2:SetWidth(200)
self.Name2:SetHeight(fontsize)
self.Name2:SetFont(font,fontsize, "OUTLINEMONOCHROME")
self.Name2:SetShadowOffset(1,-1)
self.Name2:SetShadowColor(0,0,0)

I get an error that tells me its trying to call "name" but found nil?


I guess I need to know what to delete or change and where to do that ><

I still want my focus and pet to be truncated to 4 characters though.

Geez, I hope this isnt confusing - I am using 1.3 oUF (as that is what Nins is coded from).


thanks all for the help so far!

Maybe thats why Dawns didnt work in mine! Shes using 1.4 - sigh well I dont know what to change to make it work with 1.3


BTW, this code turns to red text in note++ (i thought that meant it was commented out? so.....and I suppose to remove the brackets? I do that - maybe thats why it didnt work? Im so confused ><

oUF.Tags["abbreviatedname"] = [[function(u)
local name = UnitName(u)
return (string.len(name) > 10) and string.gsub(name, "%s?(.)%S+%s", "%1. ") or name
end]]
oUF.TagEvents["abbreviatedname"] = "UNIT_NAME_UPDATE"

yj589794 09-07-10 09:40 AM

OK, you code is using custom update routines so, unless you want to rewrite your entire layout, do not look at Tags.

======

Going back to your original post:

The utf8sub function is a custom routine to handle special characters (certain accented characters and other non-standard latin characters). The standard Lua sub routine does not handle UTF8 characters gracefully, so it is effectively a direct replacement.
For what you are trying to do, it is not required.

change the following and it should do what you require:
Code:

local tmpunitname

if (unit=="pet" or unit == "focus") then
        tmpunitname = UnitName(unit)
        local count = 4

        tmpunitname = (string.len(tmpunitname) > count) and string.gsub(tmpunitname, "%s?(.)%S+%s", "%1. ") or tmpunitname

        if tmpunitname and tmpunitname:len() > count then
                tmpunitname = tmpunitname:sub(1, count, self)
        end
end


if (unit=="target" or unit == "targettarget") then
        tmpunitname = UnitName(unit)
        local count = 20

        tmpunitname = (string.len(tmpunitname) > count) and string.gsub(tmpunitname, "%s?(.)%S+%s", "%1. ") or tmpunitname

        if tmpunitname and tmpunitname:len() > count then
                tmpunitname = tmpunitname:sub(1, count, self)
        end
end


Porsha 09-07-10 09:58 AM

/squeels

thank you SO much! And of course the game is down /sigh but yes...I see what you're saying - I had the right idea but didnt know what to do with it LOL

/hugs

edit: WOOT it works! thanks again (just had to remove the second call for Name2 and change all the self.Name2 to self.Name)


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

vBulletin © 2024, Jelsoft Enterprises Ltd
© 2004 - 2022 MMOUI