-- ForeverUI: player frame extras: PvP icon, raid group, play time and damage taken. -- They live in ForeverUI.PlayerFrame's overlayHolder (above the art) and move with the frame. -- Sizes and offsets: camelot PlayerFrame_ShowPvPIcon (circle at scale 0.8) and mainline -- PlayerFrame.xml (GroupIndicator, PlayerPlayTime, HitIndicator). local frame = ForeverUI.PlayerFrame local holder = frame.overlayHolder local PVP_CIRCLE = "ui-hud-unitframe-smallcircle" local PVP_FFA = "ui-hud-unitframe-player-pvp-ffaicon" local PVP_FACTION = { Alliance = "ui-hud-unitframe-smallcircle-alliance", Horde = "ui-hud-unitframe-smallcircle-horde", } local GROUP_LEFT = "ui-hud-unitframe-player-groupindicatorleft" local GROUP_RIGHT = "ui-hud-unitframe-player-groupindicatorright" local GROUP_MID = "_ui-hud-unitframe-player-groupindicatormid" local PLAYTIME_TIRED_ATLAS = "ui-hud-unitframe-player-playtimetired" local PLAYTIME_UNHEALTHY_ATLAS = "ui-hud-unitframe-player-playtimeunhealthy" -- ------------------------------------------------------------------- PvP local pvpCircle = holder:CreateTexture(nil, "ARTWORK") ForeverUI.SetAtlas(pvpCircle, PVP_CIRCLE) pvpCircle:SetPoint("TOP", frame, "TOPLEFT", 20, -50) pvpCircle:SetWidth(39 * 0.8) pvpCircle:SetHeight(39 * 0.8) pvpCircle:Hide() local pvpIcon = holder:CreateTexture(nil, "OVERLAY") pvpIcon:SetPoint("CENTER", pvpCircle, "CENTER", 0, 0) pvpIcon:Hide() local function updatePvP() local faction = UnitFactionGroup("player") if UnitIsPVPFreeForAll("player") then if ForeverUI.SetAtlas(pvpIcon, PVP_FFA) then pvpIcon:SetWidth(24 * 0.8) pvpIcon:SetHeight(27 * 0.8) pvpCircle:Show() pvpIcon:Show() return end elseif faction and faction ~= "Neutral" and UnitIsPVP("player") then local atlas = PVP_FACTION[faction] if atlas and ForeverUI.SetAtlas(pvpIcon, atlas) then pvpIcon:SetWidth(24 * 0.8) pvpIcon:SetHeight(27 * 0.8) pvpCircle:Show() pvpIcon:Show() return end end pvpCircle:Hide() pvpIcon:Hide() end -- ------------------------------------------------------------ raid group local groupIndicator = CreateFrame("Frame", nil, holder) groupIndicator:SetWidth(10) groupIndicator:SetHeight(16) groupIndicator:SetPoint("BOTTOMRIGHT", frame, "TOPLEFT", 210, -29) groupIndicator:Hide() local groupLeft = groupIndicator:CreateTexture(nil, "BACKGROUND") ForeverUI.SetAtlas(groupLeft, GROUP_LEFT) groupLeft:SetPoint("TOPLEFT") local groupRight = groupIndicator:CreateTexture(nil, "BACKGROUND") ForeverUI.SetAtlas(groupRight, GROUP_RIGHT) groupRight:SetPoint("TOPRIGHT") local groupMid = groupIndicator:CreateTexture(nil, "BACKGROUND") ForeverUI.SetAtlas(groupMid, GROUP_MID, true) groupMid:SetPoint("LEFT", groupLeft, "RIGHT") groupMid:SetPoint("RIGHT", groupRight, "LEFT") local groupText = groupIndicator:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall") groupText:SetAlpha(0.7) groupText:SetPoint("LEFT", 20, 2) local function updateGroup() local members = GetNumRaidMembers and GetNumRaidMembers() or 0 if members == 0 then groupIndicator:Hide() return end local playerName = UnitName("player") for index = 1, members do local name, _, subgroup = GetRaidRosterInfo(index) if name == playerName and subgroup then groupText:SetText(GROUP .. " " .. subgroup) groupIndicator:SetWidth(groupText:GetWidth() + 40) groupIndicator:Show() return end end groupIndicator:Hide() end -- ------------------------------------------------------------- play time local playTime = CreateFrame("Frame", nil, holder) playTime:SetWidth(29) playTime:SetHeight(29) playTime:SetPoint("TOPLEFT", frame, "TOPRIGHT", -21, -24) playTime:EnableMouse(true) playTime:Hide() local playTimeIcon = playTime:CreateTexture(nil, "ARTWORK") playTimeIcon:SetAllPoints(playTime) playTime:SetScript("OnEnter", function(self) if not self.tooltip then return end GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetText(self.tooltip, nil, nil, nil, nil, true) end) playTime:SetScript("OnLeave", function() GameTooltip:Hide() end) local function updatePlayTime() if PartialPlayTime and PartialPlayTime() then ForeverUI.SetAtlas(playTimeIcon, PLAYTIME_TIRED_ATLAS, true) playTime.tooltip = PLAYTIME_TIRED playTime:Show() elseif NoPlayTime and NoPlayTime() then ForeverUI.SetAtlas(playTimeIcon, PLAYTIME_UNHEALTHY_ATLAS, true) playTime.tooltip = PLAYTIME_UNHEALTHY playTime:Show() else playTime:Hide() end end -- ---------------------------------------------------------- damage taken local hitText = holder:CreateFontString(nil, "OVERLAY", "NumberFontNormalHuge") hitText:SetPoint("CENTER", frame, "TOPLEFT", 54, -50) hitText:Hide() if CombatFeedback_Initialize then CombatFeedback_Initialize(frame, hitText, 30) end -- ---------------------------------------------------------------- events local extras = CreateFrame("Frame") extras:RegisterEvent("PLAYER_ENTERING_WORLD") extras:RegisterEvent("PLAYER_FLAGS_CHANGED") extras:RegisterEvent("UNIT_FACTION") extras:RegisterEvent("RAID_ROSTER_UPDATE") extras:RegisterEvent("PARTY_MEMBERS_CHANGED") extras:RegisterEvent("PLAYTIME_CHANGED") extras:RegisterEvent("UNIT_COMBAT") extras:SetScript("OnEvent", function(_self, event, unit, action, descriptor, damage, damageType) if event == "UNIT_COMBAT" then if unit == "player" and CombatFeedback_OnCombatEvent then CombatFeedback_OnCombatEvent(frame, action, descriptor, damage, damageType) end return end if event == "PLAYTIME_CHANGED" then updatePlayTime() return end if event == "RAID_ROSTER_UPDATE" or event == "PARTY_MEMBERS_CHANGED" then updateGroup() return end if event == "UNIT_FACTION" and unit ~= "player" then return end updatePvP() if event == "PLAYER_ENTERING_WORLD" then updateGroup() updatePlayTime() end end) -- The client's CombatFeedback code animates the damage text: UNIT_COMBAT feeds it (above) -- and it runs every frame, as in PlayerFrame_OnUpdate. extras:SetScript("OnUpdate", function(_self, elapsed) if CombatFeedback_OnUpdate then CombatFeedback_OnUpdate(frame, elapsed) end end) ForeverUI.PlayerFrameExtras = { pvpCircle = pvpCircle, pvpIcon = pvpIcon, groupIndicator = groupIndicator, groupText = groupText, playTime = playTime, playTimeIcon = playTimeIcon, hitText = hitText, updatePvP = updatePvP, updateGroup = updateGroup, updatePlayTime = updatePlayTime, }