Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Карта! - Страница 2

Упомянутые в теме пользователи:

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 13 по 24 из 27

Тема: Карта!

  1. #13
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Artur91425, о ахах, ты про это?

    Вложение 943474
    да)

    - - - Updated - - -

    <br>блин, до меня дошло! Тестуры с дыркой это люди, которые НЕ в твоей группе!

  2. 1 пользователь сказал cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (13.06.2021)

  3. #14
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Обновил код в сообщении выше (взял код с панд), теперь логика как для миникарты. То есть если вы в рейде, то ВАША группа будет с цельными текстурами, а все игроки ВНЕ вашей группы будут иметь текстуры "пончики" (с дыркой по-середине).

    - - - Updated - - -

    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Нет, точки не от этого, и не от пвп статуса)

    - - - Updated - - -

    Бог знает от чего они, мне не ответили)

    Да, они от этого. Я по коду понял.
    Код:
        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
    Вот этот BLIP_RAID_Y_OFFSET сдвигает текстуры на те, которые с дыркой для случая если IsInRaid() (в рейде) и UnitInParty(unit) (вне группы. Вне потому что BLIP_RAID_Y_OFFSET после else).
    Вложение 943484

  4. 1 пользователь сказал cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (13.06.2021)

  5. #15
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Artur91425, спасибо, лучший)

    Вложение 943497

    - - - Updated - - -

    Есть вариант добавления в этот код скалирования иконок? Используя такой вариант карты они получаются слишком мелкими, лишним это не будет.

    И еще неплохо было бы изменить тултипы, сделав окрас ников в цвет классов, с процентным соотношением хп рядом, как в аддоне который кидал Экзорцист, а я бы отблагодарил тебя чем нибудь позже за помощь)
    Так нормально? :
    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)
    [свернуть]

  6. 1 пользователь сказал cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (13.06.2021)

  7. #16
    Эксперт Аватар для mekas
    Регистрация
    18.03.2012
    Адрес
    Undercity
    Сообщений
    579
    Поблагодарил(а)
    445
    Получено благодарностей: 271 (сообщений: 154).
    Репутация: 272
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Есть еще такая штука в сексимапе, показывающая никнеймы пингующих игроков, этого очень сильно не хватает стандартной миникарте)

    Вложение 943417
    Действительно полезная тема, раньше использовал Chinchilla map и там это было, но с переходом на ElvUI этого сильно нехватает. В шиншилле за это отвечает файл Ping.lua, я его отдельно залил (ссылка), может местные умельцы смогут как-то прикрутить код из него к стандартной карте. Было бы круто.

  8. 1 пользователь сказал cпасибо mekas за это полезное сообщение:

    6Grimmjow6 (14.06.2021)

  9. #17
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Есть еще такая штука в сексимапе, показывающая никнеймы пингующих игроков, этого очень сильно не хватает стандартной миникарте)

    Вложение 943417
    Вот (прям из сексимапа последнего перенес):
    Код:
    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)
    - - - Updated - - -

    Кстати, нашел более качественные текстуры
    Capture1.PNG

    https://www.dropbox.com/s/swrsao8n5a...Blips.tga?dl=0

    Чтобы их использовать достаточно указать путь до этой новой текстуры.
    Код:
    тут
    partyUnitButton.icon:SetTexture(...)
    и тут
    raidUnitButton.icon:SetTexture(...)
    - - - Updated - - -

    Добавил поддержку 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

  10. 2 пользователей сказали cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (13.06.2021),mekas (13.06.2021)

  11. #18
    Эксперт Аватар для mekas
    Регистрация
    18.03.2012
    Адрес
    Undercity
    Сообщений
    579
    Поблагодарил(а)
    445
    Получено благодарностей: 271 (сообщений: 154).
    Репутация: 272
    Цитата Сообщение от Artur91425 Посмотреть сообщение
    Вот (прям из сексимапа последнего перенес)

  12. #19
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Можно еще сделать отображение иконок в зависимости от роли, например для танка будет так
    Capture.PNG
    Но проблема в том, что эту роль очень плохо видно, да и кода гораздо больше становится. Мне кажется смысла в этом нет.

    - - - Updated - - -

    блин, нашел проблему с цветными никами в тултипе<br>

    - - - Updated - - -

    В общем было 2 проблемы:
    1) цвета вообще не отображались
    2) сломалась система, когда в тултипе объединялись имена

    Поправил все это.

    Код:
    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
    - - - Updated - - -

    Обновил код в посте. Переписал фикс вышеуказанных проблем в адекватный вид.

  13. 1 пользователь сказал cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (14.06.2021)

  14. #20
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    - добавить отображение % хп в тултипы игроков на карте, как в репортере.
    Код:
    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
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    - сделать что бы фрейм игрока не отображался поверх флага, такое лишь с фреймом игрока, тоесть нас, по дефолту. Фреймы игроков команды меняются на флаг, кружочек пропадает и остается лишь флаг с тултипом, с фреймом игрока не мешало бы сделать то же самое, думаю так будет лучше.
    вот с этим проблема. На сколько я понял эта стрелка (фрейм игрока на карте мира) создается сишной частью и с этим взаимодействовать никак нельзя. У меня вообще ничего не получилось с ней сделать. Как вариант можно попробовать отобразить флаг поверх стрелки. В коде выше я добавил 2 строки
    Код:
    WorldMapFlag1:SetFrameStrata('HIGH')
    WorldMapFlag2:SetFrameStrata('HIGH')
    Сходи на БГ, посмотри, будет ли флаг сверху отображаться? Если нет, попробуй изменить значения последовательно на
    DIALOG
    FULLSCREEN
    FULLSCREEN_DIALOG
    TOOLTIP
    Если ничего не поможет, то я хз что с этим можно сделать.

  15. 2 пользователей сказали cпасибо Artur91425 за это полезное сообщение:

    (Станислав) (14.06.2021),HA1DEKS (14.06.2021)

  16. #21
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Немного уменьшить тултип на карте, увеличить на миникарте и будет классно
    текст на миникарте, в котором пишется ник пингующего отображается не в тултипе (не 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)

  17. 1 пользователь сказал cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (14.06.2021)

  18. #22
    Старожил Аватар для (Станислав)
    Регистрация
    09.06.2016
    Сообщений
    152
    Поблагодарил(а)
    89
    Получено благодарностей: 27 (сообщений: 17).
    Репутация: 27
    Artur91425 красавчик спс

  19. #23
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Все, на сегодня хватит. Остальное потом допилю.
    Последняя версия. Сделал более адекватные настройки и добавил отображение имени при пинге в этот код.
    Код:
    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

  20. 2 пользователей сказали cпасибо Artur91425 за это полезное сообщение:

    (Станислав) (14.06.2021),HA1DEKS (14.06.2021)

  21. #24
    Почетный флудер Аватар для Artur91425
    Регистрация
    25.10.2012
    Адрес
    Россия
    Сообщений
    2,772
    Поблагодарил(а)
    339
    Получено благодарностей: 558 (сообщений: 391).
    Репутация: 1047
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    - отображение % здоровья из вида 100.00% в 100%, еще я не понял как изменить цвет)
    Это меняется тут:
    Код:
    HP_format = '%.2f'
    цифра показывает количество знаков после запятой.
    Насчет цвета вот тут почитай https://wowwiki-archive.fandom.com/wiki/UI_escape_sequences
    но я думаю чуть-чуть видоизменить этот формат. Сейчас, например, скобки "[" и "]" не входят в настройки и чтобы их как-то поменять или убрать нужно в коде ниже редачить.
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    - баг отображения тултипов рядом с техникой. Сейчас кастомные и дефолтные тултипы существуют вместе и отображаются в зависимости от того какой из них первый попадет под курсор.
    нет кастомных тултипов. Это стандартная логика в игре. Я никакие новые тултипы не создаю. Просто беру текст из тултипа и в нем раскрашиваю ники, а затем записываю в тот же тултип результат. Разделять текст в тултипе по типу объекта думаю будет очень геморно, да и не нужно это.
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    Игрок попадающий в тултип разрушителя.
    вот тут да, недоработка
    Цитата Сообщение от Xайдекс Посмотреть сообщение
    По скольку в тултипе пинга есть окрас по классу то и отображаемых на миникарте союзников покрасить можно, друлям с выслеживанием гуманоидов будет проще жить)))
    С миникартой беда. Все эти отметки на миникарте также сишной частью создаются и взаимодействовать с ними вообще никак нельзя. Я пока хз к чему прицепиться, чтобы тултип обрабатывать. Пока разобрался как с миникарты стрелку игрока убрать

  22. 1 пользователь сказал cпасибо Artur91425 за это полезное сообщение:

    HA1DEKS (14.06.2021)

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •