Код:
local SETTINGS = {
BLIP_TEXTURE = 'Interface\\Minimap\\PartyRaidBlips.blp',
WorldMap = {
UnitButtonSize = 16, -- default - 16
CurrentHP = {
show = true,
format = '|cffffffff[%.2f%%%%]|r',
},
},
BattlefieldMinimap = {
UnitButtonSize = 12, -- default - 12
CurrentHP = {
show = true,
format = '|cffffffff[%.2f%%%%]|r',
},
},
Minimap = {
ShowPingName = true,
}
}
local select = select
local UnitIsPlayer, UnitClass, UnitName = UnitIsPlayer, UnitClass, UnitName
local GetNumRaidMembers, UnitInParty, CreateFrame = GetNumRaidMembers, UnitInParty, CreateFrame
local BLIP_TEX_COORDS = {
['WARRIOR'] = { 0, 0.125, 0, 0.25 },
['PALADIN'] = { 0.125, 0.25, 0, 0.25 },
['HUNTER'] = { 0.25, 0.375, 0, 0.25 },
['ROGUE'] = { 0.375, 0.5, 0, 0.25 },
['PRIEST'] = { 0.5, 0.625, 0, 0.25 },
['DEATHKNIGHT'] = { 0.625, 0.75, 0, 0.25 },
['SHAMAN'] = { 0.75, 0.875, 0, 0.25 },
['MAGE'] = { 0.875, 1, 0, 0.25 },
['WARLOCK'] = { 0, 0.125, 0.25, 0.5 },
['DRUID'] = { 0.25, 0.375, 0.25, 0.5 }
}
local BLIP_RAID_Y_OFFSET = 0.5
-- add hex string to RAID_CLASS_COLORS
for _, v in pairs(RAID_CLASS_COLORS) do
v.colorStr = ("ff%.2x%.2x%.2x"):format(v.r * 255, v.g * 255, v.b * 255)
end
local function GetColoredName(unit)
local name = UnitName(unit)
local class = select(2, UnitClass(unit))
local colorHexString = RAID_CLASS_COLORS[class].colorStr
local coloredName = ('|c%s%s|r'):format(colorHexString, name)
return name, coloredName
end
local function ColoringUnit(text, unit)
local name, coloredName = GetColoredName(unit)
return text:gsub(name, coloredName)
end
local function AddCurrentHP(text, unit, frame)
if not SETTINGS[frame].CurrentHP.show then return text end
local name = UnitName(unit)
local HP = SETTINGS[frame].CurrentHP.format:format(UnitHealth(unit) / UnitHealthMax(unit) * 100)
return text:gsub(name, '%1 '..HP)
end
-- replace texture
local function OnLoad(frame)
local size = SETTINGS[frame].UnitButtonSize
for i=1,4 do
local partyUnitButton = _G[frame..'Party'..i]
partyUnitButton:SetSize(size, size)
partyUnitButton.icon:SetTexture(SETTINGS.BLIP_TEXTURE)
end
for i=1,40 do
local raidUnitButton = _G[frame..'Raid'..i]
raidUnitButton:SetSize(size, size)
raidUnitButton.icon:SetTexture(SETTINGS.BLIP_TEXTURE)
end
-- draw a PvP flag above the player arrow
WorldMapFlag1:SetFrameStrata('HIGH')
WorldMapFlag2:SetFrameStrata('HIGH')
end
-- set the correct texture depending on the class
local function OnUpdate(self)
local unit = self.unit
if not UnitIsPlayer(unit) then return end
local class = select(2, UnitClass(unit))
local coord = BLIP_TEX_COORDS[class]
if GetNumRaidMembers() > 0 then
if UnitInParty(unit) then
self.icon:SetTexCoord(coord[1], coord[2], coord[3], coord[4])
else
self.icon:SetTexCoord(coord[1], coord[2], coord[3] + BLIP_RAID_Y_OFFSET, coord[4] + BLIP_RAID_Y_OFFSET)
end
else
self.icon:SetTexCoord(coord[1], coord[2], coord[3], coord[4])
end
end
-- coloring nicknames
local function OnEnter(self, frame)
local tooltip = frame == 'BattlefieldMinimap' and GameTooltip or WorldMapTooltip
local tooltipText = _G[tooltip:GetName()..'TextLeft1']:GetText()
local unit_type, max_members
if GetNumRaidMembers() > 0 then
unit_type = 'raid'
max_members = MAX_RAID_MEMBERS
else
unit_type = 'party'
max_members = MAX_PARTY_MEMBERS
end
for i=1, max_members do
if UnitName(unit_type..i) then
tooltipText = AddCurrentHP(tooltipText, unit_type..i, frame)
tooltipText = ColoringUnit(tooltipText, unit_type..i)
end
end
tooltip:SetText(tooltipText)
tooltip:Show()
end
do -- WorldMap
OnLoad('WorldMap')
hooksecurefunc('WorldMapUnit_Update', OnUpdate)
hooksecurefunc('WorldMapUnit_OnEnter', function(self)
OnEnter(self, 'WorldMap')
end)
end
do -- BattlefieldMinimap
local f = CreateFrame('Frame')
f:RegisterEvent('ADDON_LOADED')
f:SetScript('OnEvent', function(self, event, addon)
if addon ~= 'Blizzard_BattlefieldMinimap' then return end
OnLoad('BattlefieldMinimap')
hooksecurefunc('BattlefieldMinimap_OnUpdate', OnUpdate)
hooksecurefunc('BattlefieldMinimapUnit_OnEnter', function(self)
OnEnter(self, 'BattlefieldMinimap')
end)
end)
end
do -- Minimap
if SETTINGS.Minimap.ShowPingName then
local MinimapPingTooltip = CreateFrame("GameTooltip", '$parentName', MinimapPing, 'GameTooltipTemplate')
MinimapPing:HookScript('OnEvent', function(self, event, unit)
if event ~= "MINIMAP_PING" or not unit then return end
local class = select(2, UnitClass(unit))
local color = RAID_CLASS_COLORS[class]
MinimapPingTooltip:SetOwner(MinimapPing, 'ANCHOR_BOTTOM', 0, 15)
MinimapPingTooltip:SetText(UnitName(unit), color.r, color.g, color.b)
MinimapPingTooltip:Show()
end)
end
end