NUM_ALWAYS_UP_UI_FRAMES = 0; NUM_EXTENDED_UI_FRAMES = 0; MAX_WORLDSTATE_SCORE_BUTTONS = 20; MAX_NUM_STAT_COLUMNS = 7; WORLDSTATESCOREFRAME_BASE_COLUMNS = 6; WORLDSTATESCOREFRAME_PADDING = 35; WORLDSTATESCOREFRAME_COLUMN_SPACING = 76; WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET = -30; WORLDSTATEALWAYSUPFRAME_TIMESINCELAST = -25; WORLDSTATEALWAYSUPFRAME_TIMESINCESTART = 0; WORLDSTATEALWAYSUPFRAME_TIMETORUN = 60; WORLDSTATEALWAYSUPFRAME_DEFAULTINTERVAL = 5; WORLDSTATEALWAYSUPFRAME_SUSPENDEDCHATFRAMES = {}; local inBattleground = false; -- FILTERED_BG_CHAT_ADD_GLOBALS = { "ERR_RAID_MEMBER_ADDED_S", "ERR_BG_PLAYER_JOINED_SS" }; FILTERED_BG_CHAT_SUBTRACT_GLOBALS = { "ERR_RAID_MEMBER_REMOVED_S", "ERR_BG_PLAYER_LEFT_S" }; --Filtered at the end of BGs only FILTERED_BG_CHAT_END_GLOBALS = { "LOOT_ITEM", "LOOT_ITEM_MULTIPLE", "CREATED_ITEM", "CREATED_ITEM_MULTIPLE", "ERR_RAID_MEMBER_REMOVED_S", "ERR_BG_PLAYER_LEFT_S" }; FILTERED_BG_CHAT_ADD = {}; FILTERED_BG_CHAT_SUBTRACT = {}; FILTERED_BG_CHAT_END = {}; ADDED_PLAYERS = {}; SUBTRACTED_PLAYERS = {}; CLASS_BUTTONS = { ["WARRIOR"] = {0, 0.25, 0, 0.25}, ["MAGE"] = {0.25, 0.49609375, 0, 0.25}, ["ROGUE"] = {0.49609375, 0.7421875, 0, 0.25}, ["DRUID"] = {0.7421875, 0.98828125, 0, 0.25}, ["HUNTER"] = {0, 0.25, 0.25, 0.5}, ["SHAMAN"] = {0.25, 0.49609375, 0.25, 0.5}, ["PRIEST"] = {0.49609375, 0.7421875, 0.25, 0.5}, ["WARLOCK"] = {0.7421875, 0.98828125, 0.25, 0.5}, ["PALADIN"] = {0, 0.25, 0.5, 0.75}, ["DEATHKNIGHT"] = {0.25, 0.49609375, 0.5, 0.75}, }; ExtendedUI = {}; -- Always up stuff (i.e. capture the flag indicators) function WorldStateAlwaysUpFrame_OnLoad(self) self:RegisterEvent("UPDATE_WORLD_STATES"); self:RegisterEvent("UPDATE_BATTLEFIELD_SCORE"); WorldStateAlwaysUpFrame_Update(); self:RegisterEvent("PLAYER_ENTERING_WORLD"); self:RegisterEvent("ZONE_CHANGED"); self:RegisterEvent("ZONE_CHANGED_INDOORS"); self:RegisterEvent("ZONE_CHANGED_NEW_AREA"); self:RegisterEvent("PLAYER_ENTERING_BATTLEGROUND"); self:RegisterEvent("WORLD_STATE_UI_TIMER_UPDATE"); FILTERED_BG_CHAT_ADD = {}; FILTERED_BG_CHAT_SUBTRACT = {}; FILTERED_BG_CHAT_END = {}; local chatString; for _, str in next, FILTERED_BG_CHAT_ADD_GLOBALS do chatString = _G[str]; if ( chatString ) then chatString = string.gsub(chatString, "%[", "%%["); chatString = string.gsub(chatString, "%]", "%%]"); chatString = string.gsub(chatString, "%%s", "(.-)") tinsert(FILTERED_BG_CHAT_ADD, chatString); end end local chatString; for _, str in next, FILTERED_BG_CHAT_SUBTRACT_GLOBALS do chatString = _G[str]; if ( chatString ) then chatString = string.gsub(chatString, "%[", "%%["); chatString = string.gsub(chatString, "%]", "%%]"); chatString = string.gsub(chatString, "%%s", "(.-)") tinsert(FILTERED_BG_CHAT_SUBTRACT, chatString); end end for _, str in next, FILTERED_BG_CHAT_END_GLOBALS do chatString = _G[str]; if ( chatString ) then chatString = string.gsub(chatString, "%[", "%%["); chatString = string.gsub(chatString, "%]", "%%]"); chatString = string.gsub(chatString, "%%s", "(.-)"); tinsert(FILTERED_BG_CHAT_END, chatString); end end end function WorldStateAlwaysUpFrame_OnEvent(self, event, ...) if ( event == "PLAYER_ENTERING_WORLD" ) then WorldStateFrame_ToggleBattlefieldMinimap(); WorldStateAlwaysUpFrame_StopBGChatFilter(self); elseif ( event == "PLAYER_ENTERING_BATTLEGROUND" ) then WorldStateAlwaysUpFrame_StartBGChatFilter(self); else WorldStateAlwaysUpFrame_Update(); end end function WorldStateAlwaysUpFrame_Update() local numUI = GetNumWorldStateUI(); local name, frame, frameText, frameDynamicIcon, frameIcon, frameFlash, flashTexture, frameDynamicButton; local extendedUI, extendedUIState1, extendedUIState2, extendedUIState3, uiInfo; local uiType, text, icon, state, dynamicIcon, tooltip, dynamicTooltip, flash, relative; local inInstance, instanceType = IsInInstance(); local alwaysUpShown = 1; local extendedUIShown = 1; for i=1, numUI do uiType, state, text, icon, dynamicIcon, tooltip, dynamicTooltip, extendedUI, extendedUIState1, extendedUIState2, extendedUIState3 = GetWorldStateUIInfo(i); if ( (uiType ~= 1) or ((WORLD_PVP_OBJECTIVES_DISPLAY == "1") or (WORLD_PVP_OBJECTIVES_DISPLAY == "2" and IsSubZonePVPPOI()) or (instanceType == "pvp")) ) then if ( state > 0 ) then -- Handle always up frames and extended ui's completely differently if ( extendedUI ~= "" ) then -- extendedUI uiInfo = ExtendedUI[extendedUI] name = uiInfo.name..extendedUIShown; if ( extendedUIShown > NUM_EXTENDED_UI_FRAMES ) then frame = uiInfo.create(extendedUIShown); NUM_EXTENDED_UI_FRAMES = extendedUIShown; else frame = _G[name]; end uiInfo.update(extendedUIShown, extendedUIState1, extendedUIState2, extendedUIState3); frame:Show(); extendedUIShown = extendedUIShown + 1; else -- Always Up name = "AlwaysUpFrame"..alwaysUpShown; if ( alwaysUpShown > NUM_ALWAYS_UP_UI_FRAMES ) then frame = CreateFrame("Frame", name, WorldStateAlwaysUpFrame, "WorldStateAlwaysUpTemplate"); NUM_ALWAYS_UP_UI_FRAMES = alwaysUpShown; else frame = _G[name]; end if ( alwaysUpShown == 1 ) then frame:SetPoint("TOP", WorldStateAlwaysUpFrame, -23 , -20); else relative = _G["AlwaysUpFrame"..(alwaysUpShown - 1)]; frame:SetPoint("TOP", relative, "BOTTOM"); end frameText = _G[name.."Text"]; frameIcon = _G[name.."Icon"]; frameDynamicIcon = _G[name.."DynamicIconButtonIcon"]; frameFlash = _G[name.."Flash"]; flashTexture = _G[name.."FlashTexture"]; frameDynamicButton = _G[name.."DynamicIconButton"]; frameText:SetText(text); frameIcon:SetTexture(icon); frameDynamicIcon:SetTexture(dynamicIcon); flash = nil; if ( dynamicIcon ~= "" ) then flash = dynamicIcon.."Flash" end flashTexture:SetTexture(flash); frameDynamicButton.tooltip = dynamicTooltip; if ( state == 2 ) then UIFrameFlash(frameFlash, 0.5, 0.5, -1); frameDynamicButton:Show(); elseif ( state == 3 ) then UIFrameFlashStop(frameFlash); frameDynamicButton:Show(); else UIFrameFlashStop(frameFlash); frameDynamicButton:Hide(); end alwaysUpShown = alwaysUpShown + 1; end if ( icon ~= "" ) then frame.tooltip = tooltip; else frame.tooltip = nil; end frame:Show(); end end end for i=alwaysUpShown, NUM_ALWAYS_UP_UI_FRAMES do frame = _G["AlwaysUpFrame"..i]; frame:Hide(); end for i=extendedUIShown, NUM_EXTENDED_UI_FRAMES do frame = _G["WorldStateCaptureBar"..i]; if ( frame ) then frame:Hide(); end end end function WorldStateAlwaysUpFrame_OnUpdate(self, elapsed) WORLDSTATEALWAYSUPFRAME_TIMESINCELAST = WORLDSTATEALWAYSUPFRAME_TIMESINCELAST + elapsed; WORLDSTATEALWAYSUPFRAME_TIMESINCESTART = WORLDSTATEALWAYSUPFRAME_TIMESINCESTART + elapsed; if ( WORLDSTATEALWAYSUPFRAME_TIMESINCELAST >= WORLDSTATEALWAYSUPFRAME_DEFAULTINTERVAL ) then local subtractedPlayers, playerString = 0; for i in next, SUBTRACTED_PLAYERS do if ( not playerString ) then playerString = i; else playerString = playerString .. PLAYER_LIST_DELIMITER .. i; end subtractedPlayers = subtractedPlayers + 1; end local message, info; if ( subtractedPlayers > 0 ) then info = ChatTypeInfo["SYSTEM"]; if ( subtractedPlayers > 1 and subtractedPlayers <= 3 ) then message = ERR_PLAYERLIST_LEFT_BATTLE; DEFAULT_CHAT_FRAME:AddMessage(string.format(message, subtractedPlayers, playerString), info.r, info.g, info.b, info.id); elseif ( subtractedPlayers > 3 ) then message = ERR_PLAYERS_LEFT_BATTLE_D; DEFAULT_CHAT_FRAME:AddMessage(string.format(message, subtractedPlayers), info.r, info.g, info.b, info.id); else message = ERR_PLAYER_LEFT_BATTLE_D; DEFAULT_CHAT_FRAME:AddMessage(string.format(message, playerString), info.r, info.g, info.b, info.id); end for i in next, SUBTRACTED_PLAYERS do SUBTRACTED_PLAYERS[i] = nil; end end local addedPlayers, playerString = 0; for i in next, ADDED_PLAYERS do if ( not playerString ) then playerString = i; else playerString = playerString .. PLAYER_LIST_DELIMITER .. i; end addedPlayers = addedPlayers + 1; end if ( addedPlayers > 0 ) then info = ChatTypeInfo["SYSTEM"]; if ( addedPlayers > 1 and addedPlayers <= 3 ) then message = ERR_PLAYERLIST_JOINED_BATTLE; DEFAULT_CHAT_FRAME:AddMessage(string.format(message, addedPlayers, playerString), info.r, info.g, info.b, info.id); elseif ( addedPlayers > 3 ) then message = ERR_PLAYERS_JOINED_BATTLE_D; DEFAULT_CHAT_FRAME:AddMessage(string.format(message, addedPlayers), info.r, info.g, info.b, info.id); else message = ERR_PLAYER_JOINED_BATTLE_D; DEFAULT_CHAT_FRAME:AddMessage(string.format(message, playerString), info.r, info.g, info.b, info.id); end for i in next, ADDED_PLAYERS do ADDED_PLAYERS[i] = nil; end end WORLDSTATEALWAYSUPFRAME_TIMESINCELAST = 0; elseif ( WORLDSTATEALWAYSUPFRAME_TIMESINCESTART >= WORLDSTATEALWAYSUPFRAME_TIMETORUN ) then WORLDSTATEALWAYSUPFRAME_TIMESINCELAST = WORLDSTATEALWAYSUPFRAME_DEFAULTINTERVAL; WorldStateAlwaysUpFrame_OnUpdate(self, 0); self:SetScript("OnUpdate", nil); end end function WorldStateAlwaysUpFrame_StartBGChatFilter (self) inBattleground = true; -- Reset the OnUpdate timer variables WORLDSTATEALWAYSUPFRAME_TIMESINCELAST = -25; WORLDSTATEALWAYSUPFRAME_TIMESINCESTART = 0; ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", WorldStateAlwaysUpFrame_FilterChatMsgSystem); ChatFrame_AddMessageEventFilter("CHAT_MSG_LOOT", WorldStateAlwaysUpFrame_FilterChatMsgLoot); self:SetScript("OnUpdate", WorldStateAlwaysUpFrame_OnUpdate); end function WorldStateAlwaysUpFrame_StopBGChatFilter (self) inBattleground = false; ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", WorldStateAlwaysUpFrame_FilterChatMsgSystem); ChatFrame_RemoveMessageEventFilter("CHAT_MSG_LOOT", WorldStateAlwaysUpFrame_FilterChatMsgLoot); for i in next, ADDED_PLAYERS do ADDED_PLAYERS[i] = nil; end for i in next, SUBTRACTED_PLAYERS do SUBTRACTED_PLAYERS[i] = nil; end self:SetScript("OnUpdate", nil); end function WorldStateAlwaysUpFrame_FilterChatMsgSystem (self, event, ...) local playerName; local message = ...; if ( GetBattlefieldWinner() ) then -- Filter out leaving messages when the battleground is over. for i, str in next, FILTERED_BG_CHAT_SUBTRACT do playerName = string.match(message, str); if ( playerName ) then return true; end end elseif ( WORLDSTATEALWAYSUPFRAME_TIMESINCESTART < WORLDSTATEALWAYSUPFRAME_TIMETORUN ) then -- Filter out leaving and joining messages when the battleground starts. for i, str in next, FILTERED_BG_CHAT_ADD do playerName = string.match(message, str); if ( playerName ) then -- Trim realm names playerName = string.match(playerName, "([^%-]+)%-?.*"); ADDED_PLAYERS[playerName] = true; return true; end end for i, str in next, FILTERED_BG_CHAT_SUBTRACT do playerName = string.match(message, str); if ( playerName ) then playerName = string.match(playerName, "([^%-]+)%-?.*"); SUBTRACTED_PLAYERS[playerName] = true; return true; end end end return false; end local matchString = string.gsub(LOOT_ITEM_CREATED_SELF, "%%s%.", ".+") function WorldStateAlwaysUpFrame_FilterChatMsgLoot (self, event, ...) if ( GetBattlefieldWinner() ) then local message = ...; -- Suppress loot messages for other players at the end of battlefields and arenas if ( not string.match(message, matchString) ) then return true; end end return false; end function WorldStateFrame_ToggleBattlefieldMinimap() local _, instanceType = IsInInstance(); if ( instanceType ~= "pvp" and instanceType ~= "none" ) then if ( BattlefieldMinimap and BattlefieldMinimap:IsShown() ) then BattlefieldMinimap:Hide(); end return; end if ( WorldStateFrame_CanShowBattlefieldMinimap() ) then if ( not BattlefieldMinimap ) then BattlefieldMinimap_LoadUI(); end BattlefieldMinimap:Show(); end end function WorldStateFrame_CanShowBattlefieldMinimap() local _, instanceType = IsInInstance(); if ( instanceType == "pvp" ) then return GetCVar("showBattlefieldMinimap") == "1"; end if ( instanceType == "none" ) then return GetCVar("showBattlefieldMinimap") == "2"; end return false; end -- UI Specific functions function CaptureBar_Create(id) local frame = CreateFrame("Frame", "WorldStateCaptureBar"..id, UIParent, "WorldStateCaptureBarTemplate"); return frame; end function CaptureBar_Update(id, value, neutralPercent) local position = 25 + 124*(1 - value/100); local bar = _G["WorldStateCaptureBar"..id]; local barSize = 121; if ( not bar.oldValue ) then bar.oldValue = position; end -- Show an arrow in the direction the bar is moving if ( position < bar.oldValue ) then _G["WorldStateCaptureBar"..id.."IndicatorLeft"]:Show(); _G["WorldStateCaptureBar"..id.."IndicatorRight"]:Hide(); elseif ( position > bar.oldValue ) then _G["WorldStateCaptureBar"..id.."IndicatorLeft"]:Hide(); _G["WorldStateCaptureBar"..id.."IndicatorRight"]:Show(); else _G["WorldStateCaptureBar"..id.."IndicatorLeft"]:Hide(); _G["WorldStateCaptureBar"..id.."IndicatorRight"]:Hide(); end -- Figure out if the ticker is in neutral territory or on a faction's side if ( value > (50 + neutralPercent/2) ) then _G["WorldStateCaptureBar"..id.."LeftIconHighlight"]:Show(); _G["WorldStateCaptureBar"..id.."RightIconHighlight"]:Hide(); elseif ( value < (50 - neutralPercent/2) ) then _G["WorldStateCaptureBar"..id.."LeftIconHighlight"]:Hide(); _G["WorldStateCaptureBar"..id.."RightIconHighlight"]:Show(); else _G["WorldStateCaptureBar"..id.."LeftIconHighlight"]:Hide(); _G["WorldStateCaptureBar"..id.."RightIconHighlight"]:Hide(); end -- Setup the size of the neutral bar local middleBar = _G["WorldStateCaptureBar"..id.."MiddleBar"]; local leftLine = _G["WorldStateCaptureBar"..id.."LeftLine"]; if ( neutralPercent == 0 ) then middleBar:SetWidth(1); leftLine:Hide(); else middleBar:SetWidth(neutralPercent/100*barSize); leftLine:Show(); end bar.oldValue = position; _G["WorldStateCaptureBar"..id.."Indicator"]:SetPoint("CENTER", "WorldStateCaptureBar"..id, "LEFT", position, 0); end -- This has to be after all the functions are loaded ExtendedUI["CAPTUREPOINT"] = { name = "WorldStateCaptureBar", create = CaptureBar_Create, update = CaptureBar_Update, onHide = CaptureBar_Hide, } -------------- FINAL SCORE FUNCTIONS --------------- function WorldStateScoreFrame_OnLoad(self) self:RegisterEvent("UPDATE_BATTLEFIELD_SCORE"); self:RegisterEvent("UPDATE_WORLD_STATES"); self:RegisterEvent("PLAYER_ENTERING_WORLD"); -- Tab Handling code PanelTemplates_SetNumTabs(self, 3); UIDropDownMenu_Initialize( ScorePlayerDropDown, ScorePlayerDropDown_Initialize, "MENU"); end function WorldStateScoreFrame_Update() local isArena, isRegistered = IsActiveBattlefieldArena(); if ( isArena ) then -- Hide unused tabs WorldStateScoreFrameTab1:Hide(); WorldStateScoreFrameTab2:Hide(); WorldStateScoreFrameTab3:Hide(); -- Hide unused columns WorldStateScoreFrameTeam:Hide(); WorldStateScoreFrameDeaths:Hide(); WorldStateScoreFrameHK:Hide(); -- Reanchor some columns. WorldStateScoreFrameDamageDone:SetPoint("LEFT", "WorldStateScoreFrameKB", "RIGHT", -5, 0); if ( isRegistered ) then WorldStateScoreFrameTeam:Show(); WorldStateScoreFrameHonorGained:Show(); WorldStateScoreFrameHonorGainedText:SetText(SCORE_RATING_CHANGE); WorldStateScoreFrameHonorGained.sortType = "team"; WorldStateScoreFrameHonorGained.tooltip = RATING_CHANGE_TOOLTIP; WorldStateScoreFrameTeamSkill:Show(); WorldStateScoreFrameTeamSkillText:SetText(SCORE_TEAM_SKILL); WorldStateScoreFrameTeamSkill.sortType = "team"; WorldStateScoreFrameTeamSkill.tooltip = TEAM_SKILL_TOOLTIP; WorldStateScoreFrameKB:SetPoint("LEFT", "WorldStateScoreFrameTeam", "RIGHT", -10, 0); else WorldStateScoreFrameHonorGained:Hide(); WorldStateScoreFrameTeamSkill:Hide(); WorldStateScoreFrameKB:SetPoint("LEFT", "WorldStateScoreFrameName", "RIGHT", 4, 0); end else -- Show Tabs WorldStateScoreFrameTab1:Show(); WorldStateScoreFrameTab2:Show(); WorldStateScoreFrameTab3:Show(); WorldStateScoreFrameTeam:Hide(); WorldStateScoreFrameTeamSkill:Hide(); WorldStateScoreFrameDeaths:Show(); WorldStateScoreFrameHK:Show(); WorldStateScoreFrameHonorGained.sortType = "cp"; WorldStateScoreFrameHonorGainedText:SetText(SCORE_HONOR_GAINED); WorldStateScoreFrameHonorGained.tooltip = HONOR_GAINED_TOOLTIP; WorldStateScoreFrameHKText:SetText(SCORE_HONORABLE_KILLS); WorldStateScoreFrameHonorGained:Show(); -- Reanchor some columns. WorldStateScoreFrameDamageDone:SetPoint("LEFT", "WorldStateScoreFrameHK", "RIGHT", -5, 0); WorldStateScoreFrameKB:SetPoint("LEFT", "WorldStateScoreFrameName", "RIGHT", 4, 0); end --Show the frame if its hidden and there is a victor local battlefieldWinner = GetBattlefieldWinner(); if ( battlefieldWinner ) then -- Show the final score frame, set textures etc. ShowUIPanel(WorldStateScoreFrame); if ( isArena ) then WorldStateScoreFrameLeaveButton:SetText(LEAVE_ARENA); WorldStateScoreFrameTimerLabel:SetText(TIME_TO_PORT_ARENA); else WorldStateScoreFrameLeaveButton:SetText(LEAVE_BATTLEGROUND); WorldStateScoreFrameTimerLabel:SetText(TIME_TO_PORT); end WorldStateScoreFrameLeaveButton:Show(); WorldStateScoreFrameTimerLabel:Show(); WorldStateScoreFrameTimer:Show(); -- Show winner if ( isArena ) then if ( isRegistered ) then local teamName = GetBattlefieldTeamInfo(battlefieldWinner); if ( teamName ) then WorldStateScoreWinnerFrameText:SetFormattedText(VICTORY_TEXT_ARENA_WINS, teamName); else WorldStateScoreWinnerFrameText:SetText(VICTORY_TEXT_ARENA_DRAW); end else WorldStateScoreWinnerFrameText:SetText(_G["VICTORY_TEXT_ARENA"..battlefieldWinner]); end if ( battlefieldWinner == 0 ) then -- Green Team won WorldStateScoreWinnerFrameLeft:SetVertexColor(0.19, 0.57, 0.11); WorldStateScoreWinnerFrameRight:SetVertexColor(0.19, 0.57, 0.11); WorldStateScoreWinnerFrameText:SetVertexColor(0.1, 1.0, 0.1); else -- Gold Team won WorldStateScoreWinnerFrameLeft:SetVertexColor(0.85, 0.71, 0.26); WorldStateScoreWinnerFrameRight:SetVertexColor(0.85, 0.71, 0.26); WorldStateScoreWinnerFrameText:SetVertexColor(1, 0.82, 0); end else WorldStateScoreWinnerFrameText:SetText(_G["VICTORY_TEXT"..battlefieldWinner]); if ( battlefieldWinner == 0 ) then -- Horde won WorldStateScoreWinnerFrameLeft:SetVertexColor(0.52, 0.075, 0.18); WorldStateScoreWinnerFrameRight:SetVertexColor(0.5, 0.075, 0.18); WorldStateScoreWinnerFrameText:SetVertexColor(1.0, 0.1, 0.1); else -- Alliance won WorldStateScoreWinnerFrameLeft:SetVertexColor(0.11, 0.26, 0.51); WorldStateScoreWinnerFrameRight:SetVertexColor(0.11, 0.26, 0.51); WorldStateScoreWinnerFrameText:SetVertexColor(0, 0.68, 0.94); end end WorldStateScoreWinnerFrame:Show(); else WorldStateScoreWinnerFrame:Hide(); WorldStateScoreFrameLeaveButton:Hide(); WorldStateScoreFrameTimerLabel:Hide(); WorldStateScoreFrameTimer:Hide(); end -- Update buttons local numScores = GetNumBattlefieldScores(); local scoreButton, buttonIcon, buttonClass, buttonName, buttonNameText, nameButton, buttonKills, buttonKillingBlows, buttonDeaths, buttonHonorGained, buttonTeamSkill, buttonFaction, columnButtonText, columnButtonIcon, buttonFactionLeft, buttonFactionRight, buttonDamage, buttonHealing, buttonTeam; local name, kills, killingBlows, honorableKills, deaths, honorGained, faction, rank, race, class, classToken, damageDone, healingDone; local teamName, teamRating, newTeamRating, teamSkill; local index; local columnData; -- ScrollFrame update local hasScrollBar; if ( numScores > MAX_WORLDSTATE_SCORE_BUTTONS ) then hasScrollBar = 1; WorldStateScoreScrollFrame:Show(); else WorldStateScoreScrollFrame:Hide(); end FauxScrollFrame_Update(WorldStateScoreScrollFrame, numScores, MAX_WORLDSTATE_SCORE_BUTTONS, 16 ); -- Setup Columns local text, icon, tooltip, columnButton; local numStatColumns = GetNumBattlefieldStats(); local columnButton, columnButtonText, columnTextButton, columnIcon; local honorGainedAnchorFrame = "WorldStateScoreFrameHealingDone"; for i=1, MAX_NUM_STAT_COLUMNS do if ( i <= numStatColumns ) then text, icon, tooltip = GetBattlefieldStatInfo(i); columnButton = _G["WorldStateScoreColumn"..i]; columnButtonText = _G["WorldStateScoreColumn"..i.."Text"]; columnButtonText:SetText(text); columnButton.icon = icon; columnButton.tooltip = tooltip; columnTextButton = _G["WorldStateScoreButton1Column"..i.."Text"]; if ( icon ~= "" ) then columnTextButton:SetPoint("CENTER", "WorldStateScoreColumn"..i, "CENTER", 6, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); else columnTextButton:SetPoint("CENTER", "WorldStateScoreColumn"..i, "CENTER", -1, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); end if ( i == numStatColumns ) then honorGainedAnchorFrame = "WorldStateScoreColumn"..i; end _G["WorldStateScoreColumn"..i]:Show(); else _G["WorldStateScoreColumn"..i]:Hide(); end end if ( isArena and isRegistered ) then WorldStateScoreFrameTeamSkill:SetPoint("LEFT", honorGainedAnchorFrame, "RIGHT", 10, 0); honorGainedAnchorFrame = "WorldStateScoreFrameTeamSkill"; end -- Anchor the bonus honor gained to the last column shown WorldStateScoreFrameHonorGained:SetPoint("LEFT", honorGainedAnchorFrame, "RIGHT", 5, 0); -- Last button shown is what the player count anchors to local lastButtonShown = "WorldStateScoreButton1"; local teamDataFailed, coords; for i=1, MAX_WORLDSTATE_SCORE_BUTTONS do -- Need to create an index adjusted by the scrollframe offset index = FauxScrollFrame_GetOffset(WorldStateScoreScrollFrame) + i; scoreButton = _G["WorldStateScoreButton"..i]; if ( hasScrollBar ) then scoreButton:SetWidth(WorldStateScoreFrame.scrollBarButtonWidth); else scoreButton:SetWidth(WorldStateScoreFrame.buttonWidth); end if ( index <= numScores ) then buttonClass = _G["WorldStateScoreButton"..i.."ClassButtonIcon"]; buttonName = _G["WorldStateScoreButton"..i.."Name"]; buttonNameText = _G["WorldStateScoreButton"..i.."NameText"]; buttonTeam = _G["WorldStateScoreButton"..i.."Team"]; buttonKills = _G["WorldStateScoreButton"..i.."HonorableKills"]; buttonKillingBlows = _G["WorldStateScoreButton"..i.."KillingBlows"]; buttonDeaths = _G["WorldStateScoreButton"..i.."Deaths"]; buttonDamage = _G["WorldStateScoreButton"..i.."Damage"]; buttonHealing = _G["WorldStateScoreButton"..i.."Healing"]; buttonTeamSkill = _G["WorldStateScoreButton"..i.."TeamSkill"]; buttonHonorGained = _G["WorldStateScoreButton"..i.."HonorGained"]; buttonFactionLeft = _G["WorldStateScoreButton"..i.."FactionLeft"]; buttonFactionRight = _G["WorldStateScoreButton"..i.."FactionRight"]; name, killingBlows, honorableKills, deaths, honorGained, faction, rank, race, class, classToken, damageDone, healingDone = GetBattlefieldScore(index); if ( classToken ) then coords = CLASS_BUTTONS[classToken]; buttonClass:SetTexture("Interface\\WorldStateFrame\\Icons-Classes"); buttonClass:SetTexCoord(coords[1], coords[2], coords[3], coords[4]); buttonClass:Show(); else buttonClass:Hide(); end buttonNameText:SetText(name); if ( not race ) then race = ""; end if ( not class ) then class = ""; end buttonName.name = name; buttonName.tooltip = race.." "..class; _G["WorldStateScoreButton"..i.."ClassButton"].tooltip = class; buttonKillingBlows:SetText(killingBlows); buttonDamage:SetText(damageDone); buttonHealing:SetText(healingDone); teamDataFailed = 0; teamName, teamRating, newTeamRating, teamSkill = GetBattlefieldTeamInfo(faction); if ( not teamRating ) then teamDataFailed = 1; end if ( not newTeamRating ) then teamDataFailed = 1; end if ( isArena ) then if ( isRegistered ) then buttonTeam:SetText(teamName); buttonTeam:Show(); buttonTeamSkill:SetText(teamSkill); buttonTeamSkill:Show(); if ( teamDataFailed == 1 ) then buttonHonorGained:SetText("-------"); else buttonHonorGained:SetText(tostring(newTeamRating - teamRating)); end buttonHonorGained:Show(); else buttonTeamSkill:Hide(); buttonHonorGained:Hide(); buttonTeam:Hide(); end buttonKills:Hide(); buttonDeaths:Hide(); else buttonKills:SetText(honorableKills); buttonDeaths:SetText(deaths); buttonHonorGained:SetText(honorGained); buttonTeam:Hide(); buttonTeamSkill:Hide(); buttonKills:Show(); buttonDeaths:Show(); buttonHonorGained:Show(); end for j=1, MAX_NUM_STAT_COLUMNS do columnButtonText = _G["WorldStateScoreButton"..i.."Column"..j.."Text"]; columnButtonIcon = _G["WorldStateScoreButton"..i.."Column"..j.."Icon"]; if ( j <= numStatColumns ) then -- If there's an icon then move the icon left and format the text with an "x" in front columnData = GetBattlefieldStatData(index, j); if ( _G["WorldStateScoreColumn"..j].icon ~= "" ) then if ( columnData > 0 ) then columnButtonText:SetFormattedText(FLAG_COUNT_TEMPLATE, columnData); columnButtonIcon:SetTexture(_G["WorldStateScoreColumn"..j].icon..faction); columnButtonIcon:Show(); else columnButtonText:SetText(""); columnButtonIcon:Hide(); end else columnButtonText:SetText(columnData); columnButtonIcon:Hide(); end columnButtonText:Show(); else columnButtonText:Hide(); columnButtonIcon:Hide(); end end if ( faction ) then if ( faction == 0 ) then if ( isArena ) then -- Green Team buttonFactionLeft:SetVertexColor(0.19, 0.57, 0.11); buttonFactionRight:SetVertexColor(0.19, 0.57, 0.11); buttonNameText:SetVertexColor(0.1, 1.0, 0.1); else -- Horde buttonFactionLeft:SetVertexColor(0.52, 0.075, 0.18); buttonFactionRight:SetVertexColor(0.5, 0.075, 0.18); buttonNameText:SetVertexColor(1.0, 0.1, 0.1); end else if ( isArena ) then -- Gold Team buttonFactionLeft:SetVertexColor(0.85, 0.71, 0.26); buttonFactionRight:SetVertexColor(0.85, 0.71, 0.26); buttonNameText:SetVertexColor(1, 0.82, 0); else -- Alliance buttonFactionLeft:SetVertexColor(0.11, 0.26, 0.51); buttonFactionRight:SetVertexColor(0.11, 0.26, 0.51); buttonNameText:SetVertexColor(0, 0.68, 0.94); end end if ( ( not isArena ) and ( name == UnitName("player") ) ) then buttonNameText:SetVertexColor(1.0, 0.82, 0); end buttonFactionLeft:Show(); buttonFactionRight:Show(); else buttonFactionLeft:Hide(); buttonFactionRight:Hide(); end lastButtonShown = scoreButton:GetName(); scoreButton:Show(); else scoreButton:Hide(); end end -- Count number of players on each side local numHorde = 0; local numAlliance = 0; for i=1, numScores do name, killingBlows, honorableKills, deaths, honorGained, faction, rank, race, class = GetBattlefieldScore(i); if ( faction ) then if ( faction == 0 ) then numHorde = numHorde + 1; else numAlliance = numAlliance + 1; end end end -- Set count text and anchor team count to last button shown WorldStateScorePlayerCount:Show(); if ( numHorde > 0 and numAlliance > 0 ) then WorldStateScorePlayerCount:SetText(format(PLAYER_COUNT_ALLIANCE, numAlliance).." / "..format(PLAYER_COUNT_HORDE, numHorde)); elseif ( numAlliance > 0 ) then WorldStateScorePlayerCount:SetFormattedText(PLAYER_COUNT_ALLIANCE, numAlliance); elseif ( numHorde > 0 ) then WorldStateScorePlayerCount:SetFormattedText(PLAYER_COUNT_HORDE, numHorde); else WorldStateScorePlayerCount:Hide(); end if ( isArena ) then WorldStateScorePlayerCount:Hide(); end WorldStateScorePlayerCount:SetPoint("TOPLEFT", lastButtonShown, "BOTTOMLEFT", 15, -6); WorldStateScoreBattlegroundRunTime:SetText(TIME_ELAPSED.." "..SecondsToTime(GetBattlefieldInstanceRunTime()/1000, 1)); WorldStateScoreBattlegroundRunTime:SetPoint("TOPRIGHT", lastButtonShown, "BOTTOMRIGHT", -20, -7); end function WorldStateScoreFrame_Resize(width) local isArena, isRegistered = IsActiveBattlefieldArena(); local columns = WORLDSTATESCOREFRAME_BASE_COLUMNS; local scrollBar = 37; local name; if ( not width ) then width = WORLDSTATESCOREFRAME_PADDING + WorldStateScoreFrameName:GetWidth() + WorldStateScoreFrameClass:GetWidth(); if ( isArena ) then columns = 3; if ( isRegistered ) then columns = 5; width = width + WorldStateScoreFrameTeam:GetWidth(); else width = width + 43; end end columns = columns + 1 + GetNumBattlefieldStats(); width = width + (columns*WORLDSTATESCOREFRAME_COLUMN_SPACING); if ( WorldStateScoreScrollFrame:IsShown() ) then width = width + scrollBar; end end WorldStateScoreFrame:SetWidth(width); WorldStateScoreFrameTopBackground:SetWidth(WorldStateScoreFrame:GetWidth()-129); WorldStateScoreFrameTopBackground:SetTexCoord(0, WorldStateScoreFrameTopBackground:GetWidth()/256, 0, 1.0); WorldStateScoreFrame.scrollBarButtonWidth = WorldStateScoreFrame:GetWidth() - 165; WorldStateScoreFrame.buttonWidth = WorldStateScoreFrame:GetWidth() - 137; WorldStateScoreScrollFrame:SetWidth(WorldStateScoreFrame.scrollBarButtonWidth); -- Position Column data horizontally local buttonTeam, buttonTeamSkill, buttonKills, buttonKillingBlows, buttonDeaths, buttonDamage, buttonHealing, buttonHonorGained, buttonReturnedIcon, buttonCapturedIcon; for i=1, MAX_WORLDSTATE_SCORE_BUTTONS do if ( isRegistered ) then buttonTeam = _G["WorldStateScoreButton"..i.."Team"]; buttonTeamSkill = _G["WorldStateScoreButton"..i.."TeamSkill"]; end buttonKills = _G["WorldStateScoreButton"..i.."HonorableKills"]; buttonKillingBlows = _G["WorldStateScoreButton"..i.."KillingBlows"]; buttonDeaths = _G["WorldStateScoreButton"..i.."Deaths"]; buttonDamage = _G["WorldStateScoreButton"..i.."Damage"]; buttonHealing = _G["WorldStateScoreButton"..i.."Healing"]; buttonHonorGained = _G["WorldStateScoreButton"..i.."HonorGained"]; if ( i == 1 ) then if ( isRegistered ) then buttonTeam:SetPoint("LEFT", "WorldStateScoreFrameTeam", "LEFT", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); buttonTeamSkill:SetPoint("CENTER", "WorldStateScoreFrameTeamSkill", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); end buttonKills:SetPoint("CENTER", "WorldStateScoreFrameHK", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); buttonKillingBlows:SetPoint("CENTER", "WorldStateScoreFrameKB", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); buttonDeaths:SetPoint("CENTER", "WorldStateScoreFrameDeaths", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); buttonDamage:SetPoint("CENTER", "WorldStateScoreFrameDamageDone", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); buttonHealing:SetPoint("CENTER", "WorldStateScoreFrameHealingDone", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); buttonHonorGained:SetPoint("CENTER", "WorldStateScoreFrameHonorGained", "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); for j=1, MAX_NUM_STAT_COLUMNS do _G["WorldStateScoreButton"..i.."Column"..j.."Text"]:SetPoint("CENTER", _G["WorldStateScoreColumn"..j], "CENTER", 0, WORLDSTATECOREFRAME_BUTTON_TEXT_OFFSET); end else if ( isRegistered ) then buttonTeam:SetPoint("LEFT", "WorldStateScoreButton"..(i-1).."Team", "LEFT", 0, -16); buttonTeamSkill:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."TeamSkill", "CENTER", 0, -16); end buttonKills:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."HonorableKills", "CENTER", 0, -16); buttonKillingBlows:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."KillingBlows", "CENTER", 0, -16); buttonDeaths:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."Deaths", "CENTER", 0, -16); buttonDamage:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."Damage", "CENTER", 0, -16); buttonHealing:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."Healing", "CENTER", 0, -16); buttonHonorGained:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."HonorGained", "CENTER", 0, -16); for j=1, MAX_NUM_STAT_COLUMNS do _G["WorldStateScoreButton"..i.."Column"..j.."Text"]:SetPoint("CENTER", "WorldStateScoreButton"..(i-1).."Column"..j.."Text", "CENTER", 0, -16); end end end return width; end function WorldStateScoreFrameTab_OnClick(tab) local faction = tab:GetID(); PanelTemplates_SetTab(WorldStateScoreFrame, faction); if ( faction == 2 ) then faction = 1; elseif ( faction == 3 ) then faction = 0; else faction = nil; end WorldStateScoreFrameLabel:SetFormattedText(STAT_TEMPLATE, tab:GetText()); SetBattlefieldScoreFaction(faction); PlaySound("igCharacterInfoTab"); end function ToggleWorldStateScoreFrame() if ( WorldStateScoreFrame:IsShown() ) then HideUIPanel(WorldStateScoreFrame); else if ( not IsActiveBattlefieldArena() and MiniMapBattlefieldFrame.status == "active" ) then ShowUIPanel(WorldStateScoreFrame); end end end -- Report AFK feature local AFK_PLAYER_CLICKED = nil; function ScorePlayer_OnMouseUp(self, mouseButton) if ( mouseButton == "RightButton" ) then if ( not UnitIsUnit(self.name,"player") and UnitInRaid(self.name)) then AFK_PLAYER_CLICKED = self.name; ToggleDropDownMenu(1, nil, ScorePlayerDropDown, self:GetName(), 0, -5); end end end function ScorePlayerDropDown_OnClick() ReportPlayerIsPVPAFK(AFK_PLAYER_CLICKED); PlaySound("UChatScrollButton"); AFK_PLAYER_CLICKED = nil; end function ScorePlayerDropDown_Cancel() AFK_PLAYER_CLICKED = nil; PlaySound("UChatScrollButton"); end function ScorePlayerDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); info.text = PVP_REPORT_AFK; info.func = ScorePlayerDropDown_OnClick; UIDropDownMenu_AddButton(info); info = UIDropDownMenu_CreateInfo(); info.text = CANCEL; info.func = ScorePlayerDropDown_Cancel; UIDropDownMenu_AddButton(info); end