да)
- - - Updated - - -
<br>блин, до меня дошло! Тестуры с дыркой это люди, которые НЕ в твоей группе!
Вид для печати
Обновил код в сообщении выше (взял код с панд), теперь логика как для миникарты. То есть если вы в рейде, то ВАША группа будет с цельными текстурами, а все игроки ВНЕ вашей группы будут иметь текстуры "пончики" (с дыркой по-середине).
- - - Updated - - -
Да, они от этого. Я по коду понял.
Вот этот BLIP_RAID_Y_OFFSET сдвигает текстуры на те, которые с дыркой для случая если IsInRaid() (в рейде) и UnitInParty(unit) (вне группы. Вне потому что BLIP_RAID_Y_OFFSET после else).Код:if ( IsInRaid() ) then
for i=1, MAX_PARTY_MEMBERS do
local partyMemberFrame = _G["WorldMapParty"..i];
partyMemberFrame:Hide();
end
for i=1, MAX_RAID_MEMBERS do
local unit = "raid"..i;
local partyX, partyY = GetPlayerMapPosition(unit);
local partyMemberFrame = _G["WorldMapRaid"..(playerCount + 1)];
if ( (partyX == 0 and partyY == 0) or UnitIsUnit(unit, "player") ) then
partyMemberFrame:Hide();
else
partyX = partyX * WorldMapDetailFrame:GetWidth();
partyY = -partyY * WorldMapDetailFrame:GetHeight();
partyMemberFrame:SetPoint("CENTER", "WorldMapDetailFrame", "TOPLEFT", partyX, partyY);
local class = select(2, UnitClass(unit));
if ( class ) then
if ( UnitInParty(unit) ) then
partyMemberFrame.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3],
BLIP_TEX_COORDS[class][4]
);
else
partyMemberFrame.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3] + BLIP_RAID_Y_OFFSET,
BLIP_TEX_COORDS[class][4] + BLIP_RAID_Y_OFFSET
);
end
end
partyMemberFrame.name = nil;
partyMemberFrame.unit = unit;
partyMemberFrame:Show();
playerCount = playerCount + 1;
end
end
Вложение 943484
Так нормально? biggrin:
Вложение 943508
Код
Чтобы не заморачиваться с настройками и не плодить тонну кода - размер иконок настраивается через глобальную переменную "WORLDMAP_UNITBUTTON_TEXTURE_SIZE" (в коде выделил красным). Сделал глобально, чтобы можно было быстро изменять размер из игры без перезагрузки пользовательского интерфейса. Достаточно просто использовать макрос:
Код:/run WORLDMAP_UNITBUTTON_TEXTURE_SIZE = <значение>
Код:local select = select
local GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty, PlayerIsPVPInactive = GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty, PlayerIsPVPInactive
WORLDMAP_UNITBUTTON_TEXTURE_SIZE = 64 -- default - 16
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;
for i=1,4 do
local partyUnitButton = _G["WorldMapParty"..i]
partyUnitButton:SetSize(WORLDMAP_UNITBUTTON_TEXTURE_SIZE, WORLDMAP_UNITBUTTON_TEXTURE_SIZE)
partyUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
for i=1,40 do
local raidUnitButton = _G["WorldMapRaid"..i]
raidUnitButton:SetSize(WORLDMAP_UNITBUTTON_TEXTURE_SIZE, WORLDMAP_UNITBUTTON_TEXTURE_SIZE)
raidUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
hooksecurefunc("WorldMapUnit_Update",function(self)
local unit = self.unit
if not UnitIsPlayer(unit) then return end
local class = select(2, UnitClass(unit))
if ( GetNumRaidMembers() > 0 ) then
if ( UnitInParty(unit) ) then
self.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3],
BLIP_TEX_COORDS[class][4]
);
else
self.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3] + BLIP_RAID_Y_OFFSET,
BLIP_TEX_COORDS[class][4] + BLIP_RAID_Y_OFFSET
);
end
else
self.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3],
BLIP_TEX_COORDS[class][4]
);
end
end)
hooksecurefunc('WorldMapUnit_OnEnter', function(self, motion)
local unit = self.unit
if not UnitIsPlayer(unit) then return end
local tooltipText = ""
local class = select(2, UnitClass(unit))
local name = UnitName(unit)
local color = RAID_CLASS_COLORS[class]
local coloredName = ("|cFF%02x%02x%02x%s|r"):format(color.r * 255, color.g * 255, color.b * 255, name)
if ( PlayerIsPVPInactive(unit) ) then
tooltipText = PLAYER_IS_PVP_AFK:format(coloredName)
else
tooltipText = coloredName
end
WorldMapTooltip:SetText(tooltipText)
WorldMapTooltip:Show()
end)
[свернуть]
Действительно полезная тема, раньше использовал Chinchilla map и там это было, но с переходом на ElvUI этого сильно нехватает. В шиншилле за это отвечает файл Ping.lua, я его отдельно залил (ссылка), может местные умельцы смогут как-то прикрутить код из него к стандартной карте. Было бы круто.
Вот (прям из сексимапа последнего перенес):
- - - Updated - - -Код:local UnitName, UnitClass = UnitName, UnitClass
local MinimapPingName = CreateFrame("Frame", "&parentName", MinimapPing)
MinimapPing.name = MinimapPingName
MinimapPingName:SetBackdrop({
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
insets = {left = 4, top = 4, right = 4, bottom = 4},
edgeSize = 16,
tile = true,
})
MinimapPingName:SetBackdropColor(0,0,0,0.8)
MinimapPingName:SetBackdropBorderColor(0,0,0,0.6)
MinimapPingName:SetPoint("TOP", MinimapPing, "BOTTOM", 0, 15)
MinimapPingName:SetFrameStrata("HIGH")
MinimapPingName.text = MinimapPingName:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
MinimapPingName.text:SetAllPoints()
MinimapPing:HookScript('OnEvent', function(self, event, unit)
if event ~= "MINIMAP_PING" or not unit then return end
local _, class = UnitClass(unit)
local color = class and RAID_CLASS_COLORS[class] or GRAY_FONT_COLOR
self.name.text:SetFormattedText("|cFF%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, UnitName(unit))
self.name:SetSize(self.name.text:GetStringWidth() + 12, self.name.text:GetStringHeight() + 10)
end)
Кстати, нашел более качественные текстуры
Вложение 943512
https://www.dropbox.com/s/swrsao8n5a...Blips.tga?dl=0
Чтобы их использовать достаточно указать путь до этой новой текстуры.
- - - Updated - - -Код:тут
partyUnitButton.icon:SetTexture(...)
и тут
raidUnitButton.icon:SetTexture(...)
Добавил поддержку BattlefieldMinimap (карта, которая отображается по Shift + M)
Вложение 943521
Теперь для корректировки размера иконок две переменные WORLDMAP_UNITBUTTON_TEXTURE_SIZE и BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE
Менять размер можно все также в самом файле или из игры с помощью макроса
Код:/run WORLDMAP_UNITBUTTON_TEXTURE_SIZE = <значение>
или
/run BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE = <значение>
Код:WORLDMAP_UNITBUTTON_TEXTURE_SIZE = 16 -- default - 16
BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE = 12 -- default - 12
local select = select
local GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty, PlayerIsPVPInactive = GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty, PlayerIsPVPInactive
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
local function OnLoad(frame)
local size = frame == "BattlefieldMinimap" and BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE or WORLDMAP_UNITBUTTON_TEXTURE_SIZE
for i=1,4 do
local partyUnitButton = _G[frame.."Party"..i]
partyUnitButton:SetSize(size, size)
partyUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
for i=1,40 do
local raidUnitButton = _G[frame.."Raid"..i]
raidUnitButton:SetSize(size, size)
raidUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
end
local function OnUpdate(self)
local unit = self.unit
if not UnitIsPlayer(unit) then return end
local class = select(2, UnitClass(unit))
if GetNumRaidMembers() > 0 then
if UnitInParty(unit) then
self.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3],
BLIP_TEX_COORDS[class][4]
)
else
self.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3] + BLIP_RAID_Y_OFFSET,
BLIP_TEX_COORDS[class][4] + BLIP_RAID_Y_OFFSET
)
end
else
self.icon:SetTexCoord(
BLIP_TEX_COORDS[class][1],
BLIP_TEX_COORDS[class][2],
BLIP_TEX_COORDS[class][3],
BLIP_TEX_COORDS[class][4]
)
end
end
local function OnEnter(self)
local unit = self.unit
if not UnitIsPlayer(unit) then return end
local tooltip = self:GetName():find("BattlefieldMinimap") and WorldMapTooltip or GameTooltip
local tooltipText = ""
local class = select(2, UnitClass(unit))
local color = RAID_CLASS_COLORS[class]
local coloredName = ("|cFF%02x%02x%02x%s|r"):format(color.r * 255, color.g * 255, color.b * 255, UnitName(unit))
if PlayerIsPVPInactive(unit) then
tooltipText = PLAYER_IS_PVP_AFK:format(coloredName)
else
tooltipText = coloredName
end
tooltip:SetText(tooltipText)
tooltip:Show()
end
do -- WorldMap
OnLoad("WorldMap")
hooksecurefunc("WorldMapUnit_Update", OnUpdate)
hooksecurefunc('WorldMapUnit_OnEnter', OnEnter)
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', OnEnter)
end)
end
Можно еще сделать отображение иконок в зависимости от роли, например для танка будет так
Вложение 943540
Но проблема в том, что эту роль очень плохо видно, да и кода гораздо больше становится. Мне кажется смысла в этом нет.
- - - Updated - - -
блин, нашел проблему с цветными никами в тултипе<br>
- - - Updated - - -
В общем было 2 проблемы:
1) цвета вообще не отображались
2) сломалась система, когда в тултипе объединялись имена
Поправил все это.
- - - Updated - - -Код:WORLDMAP_UNITBUTTON_TEXTURE_SIZE = 16 -- default - 16
BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE = 12 -- default - 12
local select = select
local GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty = GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty
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
local function GetColoredName(unit)
local name = UnitName(unit)
local class = select(2, UnitClass(unit))
local color = RAID_CLASS_COLORS[class]
local coloredName = ('|cFF%02x%02x%02x%s|r'):format(color.r * 255, color.g * 255, color.b * 255, name)
return name, coloredName
end
local function ColoringUnit(text, unit)
local name, coloredName = GetColoredName(unit)
return text:gsub(name, coloredName)
end
-- replace texture
local function OnLoad(frame)
local size = frame == 'BattlefieldMinimap' and BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE or WORLDMAP_UNITBUTTON_TEXTURE_SIZE
for i=1,4 do
local partyUnitButton = _G[frame..'Party'..i]
partyUnitButton:SetSize(size, size)
partyUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
for i=1,40 do
local raidUnitButton = _G[frame..'Raid'..i]
raidUnitButton:SetSize(size, size)
raidUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
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 unit = self.unit
if not UnitIsPlayer(unit) then return end
local unitButton;
local tooltip = frame == 'BattlefieldMinimap' and GameTooltip or WorldMapTooltip
local tooltipText = _G[tooltip:GetName()..'TextLeft1']:GetText()
if frame == 'WorldMap' then
-- Check player
if WorldMapPlayer:IsMouseOver() then
tooltipText = ColoringUnit(tooltipText, WorldMapPlayer.unit)
end
end
-- Check party
for i=1, MAX_PARTY_MEMBERS do
unitButton = _G[frame..'Party'..i]
if unitButton:IsVisible() and unitButton:IsMouseOver() then
tooltipText = ColoringUnit(tooltipText, unitButton.unit)
end
end
-- Check Raid
for i=1, MAX_RAID_MEMBERS do
unitButton = _G[frame..'Raid'..i]
if unitButton:IsVisible() and unitButton:IsMouseOver() then
tooltipText = ColoringUnit(tooltipText, unitButton.unit)
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
Обновил код в посте. Переписал фикс вышеуказанных проблем в адекватный вид.
вот с этим проблема. На сколько я понял эта стрелка (фрейм игрока на карте мира) создается сишной частью и с этим взаимодействовать никак нельзя. У меня вообще ничего не получилось с ней сделать. Как вариант можно попробовать отобразить флаг поверх стрелки. В коде выше я добавил 2 строкиКод:WORLDMAP_UNITBUTTON_TEXTURE_SIZE = 16 -- default - 16
BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE = 12 -- default - 12
local showCurrentHP = true
local select = select
local GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty = GetNumRaidMembers, UnitIsPlayer, UnitClass, UnitInParty
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 k, 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)
if not showCurrentHP then return text end
local name = UnitName(unit)
local HP = UnitHealth(unit) / UnitHealthMax(unit) * 100
HP = ("%.2f"):format(HP)
return text:gsub(name, '%1 %['..HP..'%%%]')
end
-- replace texture
local function OnLoad(frame)
-- Interface\\Minimap\\PartyRaidBlips.blp
-- Interface\\AddOns\\!my_addons\\BetterPartyRaidBlips.tga
local size = frame == 'BattlefieldMinimap' and BATTLEFIELDMINIMAP_UNITBUTTON_TEXTURE_SIZE or WORLDMAP_UNITBUTTON_TEXTURE_SIZE
for i=1,4 do
local partyUnitButton = _G[frame..'Party'..i]
partyUnitButton:SetSize(size, size)
partyUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
for i=1,40 do
local raidUnitButton = _G[frame..'Raid'..i]
raidUnitButton:SetSize(size, size)
raidUnitButton.icon:SetTexture('Interface\\Minimap\\PartyRaidBlips.blp')
end
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 unit = self.unit
if not UnitIsPlayer(unit) then return end
local unitButton;
local tooltip = frame == 'BattlefieldMinimap' and GameTooltip or WorldMapTooltip
local tooltipText = _G[tooltip:GetName()..'TextLeft1']:GetText()
if frame == 'WorldMap' then
-- Check player
if WorldMapPlayer:IsMouseOver() then
tooltipText = AddCurrentHP(tooltipText, WorldMapPlayer.unit)
tooltipText = ColoringUnit(tooltipText, WorldMapPlayer.unit)
end
end
-- Check party
for i=1, MAX_PARTY_MEMBERS do
unitButton = _G[frame..'Party'..i]
if unitButton:IsVisible() and unitButton:IsMouseOver() then
tooltipText = AddCurrentHP(tooltipText, unitButton.unit)
tooltipText = ColoringUnit(tooltipText, unitButton.unit)
end
end
-- Check Raid
for i=1, MAX_RAID_MEMBERS do
unitButton = _G[frame..'Raid'..i]
if unitButton:IsVisible() and unitButton:IsMouseOver() then
tooltipText = AddCurrentHP(tooltipText, unitButton.unit)
tooltipText = ColoringUnit(tooltipText, unitButton.unit)
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)
WorldMapFlag1:SetFrameStrata('HIGH')
WorldMapFlag2:SetFrameStrata('HIGH')
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
Сходи на БГ, посмотри, будет ли флаг сверху отображаться? Если нет, попробуй изменить значения последовательно наКод:WorldMapFlag1:SetFrameStrata('HIGH')
WorldMapFlag2:SetFrameStrata('HIGH')
DIALOG
FULLSCREEN
FULLSCREEN_DIALOG
TOOLTIP
Если ничего не поможет, то я хз что с этим можно сделать.
текст на миникарте, в котором пишется ник пингующего отображается не в тултипе (не GameTooltip), а во фрейме, созданном с нуля. Если хочешь, чтобы было одинаково тогда нужно переписать, чтобы в тултипе писало.
Вот так будет. Даже кода раза в 2 меньше стало biggrin
Код:local select = select
local UnitName, UnitClass = UnitName, UnitClass
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)
Artur91425 красавчик спс
Все, на сегодня хватит. Остальное потом допилю.
Последняя версия. Сделал более адекватные настройки и добавил отображение имени при пинге в этот код.
Код:local SETTINGS = {
BLIP_TEXTURE = 'Interface\\Minimap\\PartyRaidBlips.blp',
WorldMap = {
UnitButtonSize = 16, -- default - 16
ShowCurrentHP = true,
HP_format = '%.2f',
},
BattlefieldMinimap = {
UnitButtonSize = 12, -- default - 12
ShowCurrentHP = true,
HP_format = '%.2f',
},
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].ShowCurrentHP then return text end
local name = UnitName(unit)
local HP = SETTINGS[frame].HP_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 unit = self.unit
if not UnitIsPlayer(unit) then return end
local unitButton;
local tooltip = frame == 'BattlefieldMinimap' and GameTooltip or WorldMapTooltip
local tooltipText = _G[tooltip:GetName()..'TextLeft1']:GetText()
if frame == 'WorldMap' then
-- Check player
if WorldMapPlayer:IsMouseOver() then
tooltipText = AddCurrentHP(tooltipText, WorldMapPlayer.unit, frame)
tooltipText = ColoringUnit(tooltipText, WorldMapPlayer.unit)
end
end
-- Check party
for i=1, MAX_PARTY_MEMBERS do
unitButton = _G[frame..'Party'..i]
if unitButton:IsVisible() and unitButton:IsMouseOver() then
tooltipText = AddCurrentHP(tooltipText, unitButton.unit, frame)
tooltipText = ColoringUnit(tooltipText, unitButton.unit)
end
end
-- Check Raid
for i=1, MAX_RAID_MEMBERS do
unitButton = _G[frame..'Raid'..i]
if unitButton:IsVisible() and unitButton:IsMouseOver() then
tooltipText = AddCurrentHP(tooltipText, unitButton.unit, frame)
tooltipText = ColoringUnit(tooltipText, unitButton.unit)
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
Это меняется тут:
цифра показывает количество знаков после запятой.Код:HP_format = '%.2f'
Насчет цвета вот тут почитай https://wowwiki-archive.fandom.com/wiki/UI_escape_sequences
но я думаю чуть-чуть видоизменить этот формат. Сейчас, например, скобки "[" и "]" не входят в настройки и чтобы их как-то поменять или убрать нужно в коде ниже редачить.
нет кастомных тултипов. Это стандартная логика в игре. Я никакие новые тултипы не создаю. Просто беру текст из тултипа и в нем раскрашиваю ники, а затем записываю в тот же тултип результат. Разделять текст в тултипе по типу объекта думаю будет очень геморно, да и не нужно это.
вот тут да, недоработка
С миникартой беда. Все эти отметки на миникарте также сишной частью создаются и взаимодействовать с ними вообще никак нельзя. Я пока хз к чему прицепиться, чтобы тултип обрабатывать. Пока разобрался как с миникарты стрелку игрока убрать biggrin