Кто-то сможет помочь произвести небольшую кастомизацию дефолтных плейтов?
1. Убрать прозрачность нейпмлейтов при активном выбранном таргете
393kd1Z1va8.jpg
2. Добавить значения хп (оставшиеся) в циферках на полоске здоровья
Спасибо
Кто-то сможет помочь произвести небольшую кастомизацию дефолтных плейтов?
1. Убрать прозрачность нейпмлейтов при активном выбранном таргете
393kd1Z1va8.jpg
2. Добавить значения хп (оставшиеся) в циферках на полоске здоровья
Спасибо
Последний раз редактировалось ida; 05.07.2020 в 11:55.
PHP код:
local function formatV(v)
if v > 0 then
if v < 1e3 then
return v
elseif v < 1e6 then
return ("%.1fk"):format(v/1e3)
else
return ("%.1fm"):format(v/1e6)
end
end
end
local function healthbar_valuechanged_cb(self,value)
self.text:SetText(formatV(value))
end
local function healthbar_show_cb(self)
self.text:SetText(formatV(self:GetValue()))
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_show_cb(healthbar)
healthbar:SetScript("OnValueChanged",healthbar_valuechanged_cb)
healthbar:SetScript("OnShow",healthbar_show_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)
@Sproody, ваша помощь все еще актуальна?
Последний раз редактировалось ida; 05.07.2020 в 17:59.
PHP код:
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 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_show_cb(healthbar)
healthbar:SetScript("OnValueChanged",healthbar_valuechanged_cb)
healthbar:SetScript("OnShow",healthbar_show_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)
Спасибо фурычит!
А можно ещё сюда запихать иконку класса?
С возможностью регулировать размер иконке в коде?
Screenshot_1.jpg
Вот вроде, пробуй. Если классы будет неверно определять - поиграйся с значением константы ACCURACYPHP код:
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)
Забыл об еще одном. Возможно убрать смешивание неймплейтов как здесь?
UMwbxdkQTHg.jpg
И сделать полное наложение плейта если они пересекаются, как здесь:
k7cZHpuz6ew.jpg
Спасибо!