HA1DEKS (13.06.2021)
Обновил код в сообщении выше (взял код с панд), теперь логика как для миникарты. То есть если вы в рейде, то ВАША группа будет с цельными текстурами, а все игроки ВНЕ вашей группы будут иметь текстуры "пончики" (с дыркой по-середине).
- - - 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
Последний раз редактировалось Artur91425; 13.06.2021 в 16:51.
HA1DEKS (13.06.2021)
Так нормально?:
Untitled.png
Код
Чтобы не заморачиваться с настройками и не плодить тонну кода - размер иконок настраивается через глобальную переменную "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)[свернуть]
Последний раз редактировалось Artur91425; 13.06.2021 в 19:22.
HA1DEKS (13.06.2021)
Действительно полезная тема, раньше использовал Chinchilla map и там это было, но с переходом на ElvUI этого сильно нехватает. В шиншилле за это отвечает файл Ping.lua, я его отдельно залил (ссылка), может местные умельцы смогут как-то прикрутить код из него к стандартной карте. Было бы круто.
6Grimmjow6 (14.06.2021)
Вот (прям из сексимапа последнего перенес):
- - - 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)
Кстати, нашел более качественные текстуры
Capture1.PNG
https://www.dropbox.com/s/swrsao8n5a...Blips.tga?dl=0
Чтобы их использовать достаточно указать путь до этой новой текстуры.
- - - Updated - - -Код:тут partyUnitButton.icon:SetTexture(...) и тут raidUnitButton.icon:SetTexture(...)
Добавил поддержку BattlefieldMinimap (карта, которая отображается по Shift + M)
WoWScrnShot_061321_203639.jpg
Теперь для корректировки размера иконок две переменные 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
Последний раз редактировалось Artur91425; 13.06.2021 в 20:58.
Можно еще сделать отображение иконок в зависимости от роли, например для танка будет так
Capture.PNG
Но проблема в том, что эту роль очень плохо видно, да и кода гораздо больше становится. Мне кажется смысла в этом нет.
- - - 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
Обновил код в посте. Переписал фикс вышеуказанных проблем в адекватный вид.
Последний раз редактировалось Artur91425; 14.06.2021 в 00:35.
HA1DEKS (14.06.2021)
вот с этим проблема. На сколько я понял эта стрелка (фрейм игрока на карте мира) создается сишной частью и с этим взаимодействовать никак нельзя. У меня вообще ничего не получилось с ней сделать. Как вариант можно попробовать отобразить флаг поверх стрелки. В коде выше я добавил 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
Если ничего не поможет, то я хз что с этим можно сделать.
(Станислав) (14.06.2021),HA1DEKS (14.06.2021)
текст на миникарте, в котором пишется ник пингующего отображается не в тултипе (не GameTooltip), а во фрейме, созданном с нуля. Если хочешь, чтобы было одинаково тогда нужно переписать, чтобы в тултипе писало.
Вот так будет. Даже кода раза в 2 меньше стало
Код: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; 14.06.2021 в 02:27.
HA1DEKS (14.06.2021)
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
(Станислав) (14.06.2021),HA1DEKS (14.06.2021)
Это меняется тут:
цифра показывает количество знаков после запятой.Код:HP_format = '%.2f'
Насчет цвета вот тут почитай https://wowwiki-archive.fandom.com/wiki/UI_escape_sequences
но я думаю чуть-чуть видоизменить этот формат. Сейчас, например, скобки "[" и "]" не входят в настройки и чтобы их как-то поменять или убрать нужно в коде ниже редачить.
нет кастомных тултипов. Это стандартная логика в игре. Я никакие новые тултипы не создаю. Просто беру текст из тултипа и в нем раскрашиваю ники, а затем записываю в тот же тултип результат. Разделять текст в тултипе по типу объекта думаю будет очень геморно, да и не нужно это.
вот тут да, недоработка
С миникартой беда. Все эти отметки на миникарте также сишной частью создаются и взаимодействовать с ними вообще никак нельзя. Я пока хз к чему прицепиться, чтобы тултип обрабатывать. Пока разобрался как с миникарты стрелку игрока убрать![]()
Последний раз редактировалось Artur91425; 14.06.2021 в 11:18.
HA1DEKS (14.06.2021)