
Сообщение от
Попкина_Сладость
Спасибо фурычит!
А можно ещё сюда запихать иконку класса?
С возможностью регулировать размер иконке в коде?
Screenshot_1.jpg
PHP код:
local CLASSICON_SIZE = 28
local ACCURACY = 8
local CLASS_ICON_TCOORDS = CLASS_ICON_TCOORDS
local UnitClass = UnitClass
local pairs = pairs
local math_round
do
local math_floor = math.floor
math_round = function(x)
return math_floor(x+0.5)
end
end
local function GetUnitTypeByNameplateRGB(r,g,b)
if g + b == 0 then -- red
return "enemy"
elseif r + b == 0 then -- green
return "friend_pvp"
elseif r + g == 0 then -- blue
return "friend_nopvp"
elseif r + g > 1.99 and b == 0 then -- yellow
return "neutral"
else
return "enemy_player"
end
end
local GetClassByRGB
do
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
GetClassByRGB = function(r,g,b)
for class,tbl in pairs(RAID_CLASS_COLORS) do
if math_round(tbl.r*ACCURACY) == math_round(r*ACCURACY)
and math_round(tbl.g*ACCURACY) == math_round(g*ACCURACY)
and math_round(tbl.b*ACCURACY) == math_round(b*ACCURACY) then
return class
end
end
end
end
local function healthbar_UpdateClassIcon(self,r,g,b)
if GetUnitTypeByNameplateRGB(r,g,b) == "enemy_player" then
local class = GetClassByRGB(r,g,b)
if class then
self.classIcon:SetTexCoord(unpack(CLASS_ICON_TCOORDS[class]))
self.classIcon:Show()
return
end
end
self.classIcon:Hide()
end
local function healthbar_valuechanged_cb(self,value)
self.text:SetText(value)
end
local function healthbar_show_cb(self)
self.text:SetText(self:GetValue())
end
local function healthbar_update_cb(self)
local r,g,b = self:GetStatusBarColor()
if not (r == self.r and g == self.g and b == self.b) then
healthbar_UpdateClassIcon(self,r,g,b)
self.r,self.g,self.b = r,g,b
end
end
local function nameplate_update_cb(self)
self:SetAlpha(1)
end
local function InitNamePlate(frame)
local healthbar = frame:GetChildren()
healthbar.text = healthbar:CreateFontString(nil,"ARTWORK")
healthbar.text:SetFont("Fonts\\FRIZQT__.TTF",11,"OUTLINE")
healthbar.text:SetPoint("CENTER")
healthbar.classIcon = healthbar:CreateTexture(nil,"BORDER")
healthbar.classIcon:SetPoint("RIGHT",healthbar,"LEFT",-4,0)
healthbar.classIcon:SetSize(CLASSICON_SIZE,CLASSICON_SIZE)
healthbar.classIcon:SetTexture("Interface\\TargetingFrame\\UI-Classes-Circles")
healthbar.classIcon:Hide()
healthbar_show_cb(healthbar)
healthbar:SetScript("OnValueChanged",healthbar_valuechanged_cb)
healthbar:SetScript("OnShow",healthbar_show_cb)
healthbar:SetScript("OnUpdate",healthbar_update_cb)
frame:SetScript("OnUpdate",nameplate_update_cb)
end
local function IdentifyFrame(self)
if self:GetName() then return end
if self.GetRegions then
local region = self:GetRegions()
if region.GetTexture then
local texturePath = region:GetTexture()
if texturePath == "Interface\\TargetingFrame\\UI-TargetingFrame-Flash" then
return "NamePlate"
elseif texturePath == "Interface\\Tooltips\\ChatBubble-Background" then
return "ChatBubble"
end
end
end
end
local function iterateChildrens(object,...)
if not object then return end
local type = IdentifyFrame(object)
if type == "NamePlate" then
InitNamePlate(object)
elseif type == "ChatBubble" then
--InitChatBubble(object)
end
return iterateChildrens(...)
end
local select,WorldFrame = select,WorldFrame
local lastWorldFrameChildsCount = 0
CreateFrame("frame"):SetScript("OnUpdate",function()
local worldFrameChildsCount = WorldFrame:GetNumChildren()
if worldFrameChildsCount ~= lastWorldFrameChildsCount then
iterateChildrens(select(lastWorldFrameChildsCount+1,WorldFrame:GetChildren()))
lastWorldFrameChildsCount = worldFrameChildsCount
end
end)
Вот вроде, пробуй. Если классы будет неверно определять - поиграйся с значением константы ACCURACY