-- ## Tracks battleground queues and statistics. -- ## -- ## This mod was adapted from TitanBG 1600 developed by Sphiromi. -- ## -- ## Name : TitanBG (Updated) -- ## Author : Maina (Chromaggus), Sphiromi -- ## Version : 1.2.3 -- ## -- ## Version 1.2.3 -- ## * Added a slash command to toggle the options menu. This command is /titabg or /tbg. -- ## * Fixed a problem with timers being cleared when moving around Stormpike Graveyard in Alterac Valley. -- ## * Fixed a problem with the Warsong Gulch flag tracker incorrectly extracting names containing special characters. -- ## * Fixed a problem with the Warsong Gulch flag tracker throwing errors in German and French clients, as a result of incorrect class name translations. -- ## * Fixed a problem with incorrect slash commands throwing errors. -- ## -- ## Version 1.2.2.1 -- ## * Fixed a problem with the Warsong Gulch flag tracker not displaying the player occasionally. -- ## * Fixed a problem with player statistics not being correctly tracked. -- ## -- ## Version 1.2.2 -- ## * Fixed a problem with the join battleground popup not joining when the accept button is clicked in the German client. -- ## * Fixed a problem with errors being generated when non-standard characters are used in player names in Warsong Gulch. -- ## * Fixed a problem with changing battlegrounds from Arathi Basin to another, occasionally throwing arithmetic errors. -- ## * Fixed a problem with nil value errors occuring when the current flag carrier leaves Warsong Gulch. -- ## * Fixed a problem with the Warsong Gulch flag runner name occasionally not being hidden when the flag is dropped or captured. -- ## * Fixed a problem with unassociated popups being modified to contain battleground information, if the original battleground ready popup was hidden. -- ## * Fixed a problem where the time left before the battleground queue expires would still show, even if it was disabled, while auto joining. -- ## * Updated the French translation. -- ## * Updated existing Warlock coloring to appear lighter. -- ## -- ## Version 1.2.1 -- ## * Added an option to choose if you still wish to automatically release if you have a Soulstone or Shaman Ressurect available. -- ## * Fixed a problem with the player statistics not showing. -- ## * Fixed a problem with the 'BattlefieldMinimapCloseButton' frame not existing. -- ## * Fixed a problem with the Blizzard instance array throwing nil value errors. -- ## * Fixed a problem with the Warsong Gulch flag tracker throwing nil value errors. -- ## * Updated options to use a stand alone frame. -- ## * Updated the French translation. -- ## -- ## Version 1.2.0 -- ## * Added the ability to overwrite similar settings in other addons. -- ## * Added the ability to play custom sounds when a battleground is ready. -- ## * Added the ability to play the battleground ready sound periodically or only once. -- ## * Added the ability to automatically show the battleground minimap, when entering a battleground. -- ## * Added the ability to show the battleground minimap while not in a battleground. -- ## * Added the ability to display players in the battleground on the button. -- ## * Added the ability to display the instance number of the battleground ready to be joined in the button and tooltip. -- ## * Added the ability to display the amount of time before a battleground queue expires in the button and tooltip. -- ## * Added the ability to show the active battleground and queue information in separate tooltips while in a battleground. -- ## * Added the ability to hide active information while in a battleground, when a queue is ready to be joined. -- ## * Added the ability to track who is carrying the Warsong Gulch flag and the ability to target them easily. -- ## * Added, to the Arathi Basin estimations, the ability to calculate the amount of nodes the enemy needs to capture in order to win. -- ## * Added, to the Arathi Basin estimations, the ability to calculate the approximate amount of time before the amount of nodes needed increases. -- ## * Added the ability to invert the on screen capture timers, so that they are displayed bottom to top, rather than top to bottom. -- ## * Fixed a problem with the auto join timer counting down, even if not enabled. -- ## * Fixed a problem with the addon performing various actions even when not enabled. -- ## * Fixed a problem with the French translation causing errors. -- ## * Updated the battleground ready popup to display the auto join time and the time until the queue expires. -- ## * Removed the battleground raid invitation system. -- ## * Removed the ability to auto accept raid invites in a battleground. -- ## -- ## Version 1.1.2 -- ## * Added a French translation, provided by Triel on Curse Gaming. -- ## * Fixed a problem with the Arathi Basin estimators not working for languages other than English, even before the patch. -- ## * Fixed a problem with the recent patch causing Arathi Basin estimations to throw an error. -- ## * Fixed a problem with new installations of the addon throwing nil value errors. -- ## * Updated on the screen timers to be unlocked when the user first installs the addon. An explanation has been added to the frame to make this process clearer. -- ## * Updated it so that on the screen capture timers can now be clicked through. -- ## * Updated to World of Warcraft patch 1.12. -- ## -- ## Version 1.1.1 -- ## * !! WARNING !! This version will reset all previous settings. -- ## -- ## * Added the option to display queue times on the Titan Panel, in the format of [Time in Queue/Estimated Wait Time]. -- ## * Added the ability for the addon to estimate who will win an Arathi Basin. -- ## * Added the ability for the addon to estimate the final score in Arathi Basin (with an accuracy of within 10 points). -- ## * Added the ability for the addon to estimate how long the battle will take in Arathi Basin. -- ## * Added the ability for the addon to estimate how many nodes your team needs to capture in order to win, if they are losing, in Arathi Basin. -- ## * Added the ability for the addon to remember how many open battlegrounds existed for each battleground when the user last checked. -- ## * Added French localization to the .xml file. -- ## * Fixed a problem with existing queues being abandoned when the addon is first loaded. -- ## * Fixed a problem with the bonus honor not being displayed correctly. -- ## * Fixed a problem with it only displaying four timers on the screen, when there should have been five. -- ## * Fixed problems with abnormal behaviour when hiding or showing various UI elements. -- ## * Updated German translation to include previously missing variables. -- ## * Updated saved variable names for consistency. -- ## -- ## Version 1.1.0.1 -- ## * Emergency fix for the errors caused by version 1.1.0. -- ## -- ## Version 1.1.0 -- ## * Added statistics and capture tracking for Arathi Basin, previously not implemented. -- ## * Added statistics tracking for Warsong Gulch, previously implemented but not printed. -- ## * Added an on the screen display of the capture timers for Alterac Valley and Arathi Basin. -- ## * Added German translation, provided by Szeraxenia on Der Rat von Dalaran. -- ## * Added showing of ready to join queues in the button text, when already in a battleground. -- ## * Fixed the auto join timer. -- ## * Fixed minor issues with disbanding a raid, or leaving a raid group on completion. -- ## * Updated statistics and capture tracking code. -- ## * Updated 'Location Statistics' to 'Player Objective Statistics' for clarification. -- ## -- ## Version 1.0.2 -- ## * Updated the capture timers to correspond to faction colour. Red will now indicate it is going to be captured by the Horde. Blue indicates it will be captured by the Alliance. -- ## * Updated all code, so that the localization file can be easily modified into other languages. -- ## * Updated various display functions to include faster processing. -- ## -- ## Version 1.0.1 -- ## * Added function to determine if the user is currently interacting with a battleground in any fashion. -- ## * Fixed issue with the showing and hiding of the minimap button when not in the queue. -- ## * Updated toc files to the current patch. -- ## -- ## Version 1.0.0 -- ## * Removed auto ressurect ability, implemented by Blizzard. -- ## * Removed sound to be played on queue pop, implemented by Blizzard. -- ## * Added auto invite and mass invite abilities. -- ## * Added auto remove ability. -- ## * Added auto promote ability. -- ## * Added auto free for all looting ability. -- ## * Added hide join battleground popup. -- ## * Fixed auto join ability. -- ## * Fixed auto release ability. -- ## * Fixed hide minimap button. -- ## * Updated addon to work with multiple queues. -- ## * Updated and reorganised menus and options. -- Addon information variables. TITAN_TITANBG_ID = "TitanBG"; TITANBG_ARTWORK_PATH = "Interface\\AddOns\\Titan\\TitanBG\\Artwork\\TitanBG"; TITAN_TITANBG_FREQ = 0.5; -- Checking variables. -- Status of battlegrounds. Must be exactly as returned by the first variable of GetBattlefieldStatus(i). TITANBG_BG_STATUS_NONE = "none"; TITANBG_BG_STATUS_QUEUED = "queued"; TITANBG_BG_STATUS_CONFIRM = "confirm"; TITANBG_BG_STATUS_ACTIVE = "active"; -- Faction names. EXACTLY as returned by UnitFactionGroup("player") or UnitFactionGroup("target"). TITANBG_HORDE = "Horde"; TITANBG_ALLIANCE = "Alliance"; -- Colors and icons. TITANBG_ICON_CAP_BLANK = {0.75, 0.875, 0.125, 0.25}; TITANBG_ICON_BUTTON_SPACER = "*"; TITANBG_COLOR_BLUE = "|cff0097d0"; TITANBG_COLOR_RED = RED_FONT_COLOR_CODE; TITANBG_COLOR_GREEN = GREEN_FONT_COLOR_CODE; TITANBG_COLOR_GREY = "|cffb6b6b6"; TITANBG_COLOR_WHITE = HIGHLIGHT_FONT_COLOR_CODE; TITANBG_COLOR_YELLOW = NORMAL_FONT_COLOR_CODE; TITANBG_COLOR_YELLOW_LIGHT = LIGHTYELLOW_FONT_COLOR_CODE; TITANBG_COLOR_PURPLE = "|cffd94fff"; TITANBG_COLOR_CLASS = { ["WARRIOR"] = { color = "|cffbba58d", }, ["DRUID"] = { color = "|cffffad0f", }, ["MAGE"] = { color = "|cff3fd7ff", }, ["WARLOCK"] = { color = "|cffc783ff", }, ["ROGUE"] = { color = "|cffffe92f", }, ["HUNTER"] = { color = "|cff70ce56", }, ["PRIEST"] = { color = "|cffffffff", }, ["PALADIN"] = { color = "|cfffe9ee9", }, ["SHAMAN"] = { color = "|cfffe9ee9", }, }; -- Sounds TITANBG_SOUNDS_BGWARNING = { [1] = { name = TITANBG_SOUND_DEFAULT, file = "", }, [2] = { name = TITANBG_SOUND_BELL, file = "Sound\\Doodad\\BoatDockedWarning.wav", }, [3] = { name = TITANBG_SOUND_CHIME, file = "Sound\\Spells\\ShaysBell.wav", }, [4] = { name = TITANBG_SOUND_CRASH, file = "Sound\\Doodad\\ArcaneCrystalOpen.wav", }, [5] = { name = TITANBG_SOUND_CYMBAL, file = "Sound\\interface\\LevelUp.wav", }, [6] = { name = TITANBG_SOUND_HORN, file = "Sound\\Doodad\\DwarfHorn.wav", }, [7] = { name = TITANBG_SOUND_LIGHTNING, file = "Sound\\Doodad\\BlastedLandsLightningbolt01Stand-Bolt.wav", }, [8] = { name = TITANBG_SOUND_TRUMPET, file = "Sound\\interface\\levelup2.wav", }, [9] = { name = TITANBG_SOUND_WHISTLE, file = "Sound\\Spells\\PetCall.wav", }, }; -- Player information variables. local _player_name = UNKNOWNOBJECT; local _player_faction = TITANBG_HORDE; local _player_enemy_faction = TITANBG_HORDE; local _player_zone = UNKNOWN; local _player_realm = UNKNOWNOBJECT; -- Auto join and leave. local _autojoin_bg = ""; -- Which battleground we are auto joining. local _autojoin_time = 0; local _autojoin_paused = 0; local _autojoin_delay = 10; -- Delay until the battleground is joined, in seconds. local _autoleave_time = 0; local _autoleave_paused = 0; local _autoleave_delay = 10; -- Delay until the battleground is joined, in seconds. -- Capture delays. local _capture_delay_av = 300; -- Alterac Valley. local _capture_delay_ab = 60; -- Arathi Basin. -- Battleground information variables. local _active_init_stored = false; -- If the active nodes have been stored on load. _bgs = { }; -- Battleground infromation. _active = { }; -- Information on the current active battleground. local _update_number = 0; -- The id number of the last battleground information update. local _display_queue_tt = false; -- Display the secondary tooltip, or the primary one. local _timetonodeincrease = 0; -- Amount of seconds until the nodes needing to be captured increases. local _bgready_sound_delay = 20; -- Number of seconds between battleground ready sounds if repetitive. local _popups = { }; -- Popups that appear on the screen containing queue information. -- Friend's list tracking in active battlegrounds. local _friendlist = { }; local _friendasked = false; local _friendstring = ""; -- Indicates the addon was successfully loaded. _addon_loaded = false; _vars_loaded = false; local _titan_loaded = false; -- Tracking variables. local _blizzard_releasesoul = false; local _blizzard_interactbg = false; local _blizzard_manualshowbg = nil; -- "SHOW": Show battlemap. "HIDE": Don't show battlemap. local _titan_titanbg_leftclick = false; -- Arathi Basin time until number of nodes required increases. local _ab_timeinc_check = false; local _ab_timeinc_sec = 0; local _ab_timeinc_update = 0; local _ab_timeing_update_delay = 0.05; -- ##################### -- ## EVENT FUNCTIONS ## -- ##################### -- ## Events occuring when caught in game by the system. function TitanPanelTitanBGButton_OnEvent(event, arg1) if (event == "ADDON_LOADED") then -- If the addon is being loaded for the first time, make sure sv_menu exists. if (sv_menu == nil) then sv_menu = {}; end if (sv_menu["ShowLabelText"] == nil) then sv_menu["ShowLabelText"]= true; end if (sv_menu["D_B_Spacers"] == nil) then sv_menu["D_B_Spacers"] = true; end if (sv_menu["D_B_Time"] == nil) then sv_menu["D_B_Time"] = true; end if (sv_menu["D_B_Kills"] == nil) then sv_menu["D_B_Kills"] = true; end if (sv_menu["D_B_KillingBlows"] == nil) then sv_menu["D_B_KillingBlows"] = true; end if (sv_menu["D_B_Deaths"] == nil) then sv_menu["D_B_Deaths"] = true; end if (sv_menu["D_B_Honor"] == nil) then sv_menu["D_B_Honor"] = true; end if (sv_menu["D_B_Standing"] == nil) then sv_menu["D_B_Standing"] = true; end if (sv_menu["D_B_Players"] == nil) then sv_menu["D_B_Players"] = true; end if (sv_menu["D_BG_SeperateActiveQueue"] == nil) then sv_menu["D_BG_SeperateActiveQueue"] = false; end if (sv_menu["D_TT_QueueTimers"] == nil) then sv_menu["D_TT_QueueTimers"] = true; end if (sv_menu["D_B_QueueExpire"] == nil) then sv_menu["D_B_QueueExpire"] = true; end if (sv_menu["D_TT_RememberOpenBgs"] == nil) then sv_menu["D_TT_RememberOpenBgs"] = false; end if (sv_menu["D_TT_ABWinEstimates"] == nil) then sv_menu["D_TT_ABWinEstimates"] = true; end if (sv_menu["D_TT_PlayerStats"] == nil) then sv_menu["D_TT_PlayerStats"] = true; end if (sv_menu["D_TT_LocationStats"] == nil) then sv_menu["D_TT_LocationStats"] = false; end if (sv_menu["D_TT_Friends"] == nil) then sv_menu["D_TT_Friends"] = false; end if (sv_menu["D_TT_Capture"] == nil) then sv_menu["D_TT_Capture"] = true; end if (sv_menu["D_TT_FlagTracker"] == nil) then sv_menu["D_TT_FlagTracker"] = true; end if (sv_menu["D_OS_PanelLock"] == nil) then sv_menu["D_OS_PanelLock"] = false; end if (sv_menu["D_OS_CaptureShow"] == nil) then sv_menu["D_OS_CaptureShow"] = true; end if (sv_menu["D_NT_TimersInvert"] == nil) then sv_menu["D_NT_TimersInvert"] = false; end if (sv_menu["D_OS_WSG_Show"] == nil) then sv_menu["D_OS_WSG_Show"] = true; end if (sv_menu["D_OS_WSG_Click"] == nil) then sv_menu["D_OS_WSG_Click"] = true; end if (sv_menu["D_OS_WSG_ColorClass"] == nil) then sv_menu["D_OS_WSG_ColorClass"] = true; end if (sv_menu["D_OS_WSG_TextClass"] == nil) then sv_menu["D_OS_WSG_TextClass"] = true; end if (sv_menu["D_OS_WSG_Invert"] == nil) then sv_menu["D_OS_WSG_Invert"] = false; end if (sv_menu["D_OS_WSG_AttachScore"] == nil) then sv_menu["D_OS_WSG_AttachScore"] = false; end if (sv_menu["I_OverwriteOtherSettings"] == nil) then sv_menu["I_OverwriteOtherSettings"] = true; end if (sv_menu["B_HideMinimapButton"] == nil) then sv_menu["B_HideMinimapButton"] = false; end if (sv_menu["D_S_Sound"] == nil) then sv_menu["D_S_Sound"] = false; end if (sv_menu["D_S_PlayWhatSound"] == nil) then sv_menu["D_S_PlayWhatSound"] = 1; end if (sv_menu["D_S_RepeatSound"] == nil) then sv_menu["D_S_RepeatSound"] = false; end if (sv_menu["B_AutoShowBGMinimap"] == nil) then sv_menu["B_AutoShowBGMinimap"] = true; end if (sv_menu["B_HideJoinPopup"] == nil) then sv_menu["B_HideJoinPopup"] = false; end if (sv_menu["B_AutoJoinBG"] == nil) then sv_menu["B_AutoJoinBG"] = false; end if (sv_menu["B_AutoLeaveBG"] == nil) then sv_menu["B_AutoLeaveBG"] = false; end if (sv_menu["B_AutoRelease"] == nil) then sv_menu["B_AutoRelease"] = false; end if (sv_menu["B_ReleaseCheck"] == nil) then sv_menu["B_ReleaseCheck"] = true; end if (sv_menu["B_ReplaceActive"] == nil) then sv_menu["B_ReplaceActive"] = true; end if (sv_menu["D_POP_QueueExpire"] == nil) then sv_menu["D_POP_QueueExpire"] = true; end -- Indicate the addon has finished loading. _addon_loaded = true; -- Reset storage values. if (sv_menu["AddonEnabled"]) then TitanPanelTitanBG_ZonesChanged(); end elseif (event == "VARIABLES_LOADED") then -- If the battlefield minimap hasn't been loaded, load it. if (not BattlefieldMinimap) then BattlefieldMinimap_LoadUI(); end TitanPanelTitanBG_StoreFunctions(); TitanPanelTitanBG_HookFunctions(); _vars_loaded = true; -- Store player information variables. elseif (event == "PLAYER_ENTERING_WORLD") then TitanPanelTitanBG_ResetPlayerInformation(); elseif (event == "FRIENDLIST_UPDATE") then local nFriends = GetNumFriends(); _friendlist = { }; local indexf; for indexf=1, nFriends do local fname,_,_,_,_ = GetFriendInfo(indexf); _friendlist[fname] = 1; end -- ## Alliance message for Warsong Gulch. elseif (event == "CHAT_MSG_BG_SYSTEM_ALLIANCE" and _player_zone == TITANBG_BG_WSG) then _active.stats.wsg.alliance.msg = arg1; -- ## Horde message for Warsong Gulch. elseif (event == "CHAT_MSG_BG_SYSTEM_HORDE" and _player_zone == TITANBG_BG_WSG) then _active.stats.wsg.horde.msg = arg1; -- ## Hide join popup and minimap button. elseif (event == "UPDATE_BATTLEFIELD_STATUS" and sv_menu["AddonEnabled"]) then TitanPanelTitanBG_ToggleMiniMapIcon(); TitanPanelTitanBG_HideBattlegroundReadyPopup(); -- ## Actions taken the the user changes zones. elseif (event == "ZONE_CHANGED_NEW_AREA" and sv_menu["AddonEnabled"]) then TitanPanelTitanBG_ZonesChanged(); -- If the user opens the battlefield queue window. elseif (event == "BATTLEFIELDS_SHOW" and sv_menu["AddonEnabled"]) then TitanPanelTitanBG_StoreActiveInstanceInformation(); end end -- ## Performed periodically on shedule. function TitanPanelTitanBGButton_CheckEvents() -- If the addon is being shown on titan panel, indicate such. if (not _titan_loaded and _vars_loaded and TitanPanelSettings) then _titan_loaded = true; -- Check if the addon is being displayed in Titan. if (TitanPanel_IsPluginShown(TITAN_TITANBG_ID)) then sv_menu["AddonEnabled"] = true; else sv_menu["AddonEnabled"] = false; end TitanPanelTitanBG_HookFunctions(); end -- Update the stored battleground information. TitanPanelTitanBG_StoreBattlegroundInformation(); -- Update non titan display of captures and flags. if (_addon_loaded and TitanPanelTitanBG_IsBattleground(_player_zone)) then TitanPanelTitanBG_NT_UpdateCaptures(); TitanPanelTitanBG_NT_UpdateFlags(); end -- Check if the battleground minimap needs to be shown. if (_addon_loaded) then TitanPanelTitanBG_ToggleBattlefieldMinimap(); TitanPanelTitanBG_ChangeAttachFlagTracker(); end end -- ## Performs periodic updates. function TitanPanelTitanBG_OnUpdate() -- Check how much time the losing team has before they have to capture another node. if (_player_zone == TITANBG_BG_AB and _addon_loaded and sv_menu["AddonEnabled"]) then -- Checks the amount of time until the amount of nodes needing to be captured increases. -- Cannot be done as a basic loop as it can lock up the game. if (GetTime() - _ab_timeinc_update >= _ab_timeing_update_delay) then _ab_timeinc_update = GetTime(); if (not _ab_timeinc_check) then _ab_timeinc_sec = 0; _ab_timeinc_check = true; end _ab_timeinc_sec = _ab_timeinc_sec + 30; local winner, win_time = TitanPanelTitanBG_AB_GetWinner(_active.stats.ab.bases_alliance, _active.stats.ab.bases_horde); if (winner ~= nil) then local complete = false; -- If the player's faction isn't going to win. if (winner ~= UnitFactionGroup("player")) then local bases = TitanPanelTitanBG_AB_NodesRequiredToWin(_player_faction); complete = TitanPanelTitanBG_AB_TimeLeftToCapture(_player_faction, bases, _ab_timeinc_sec); -- Otherwise, if their faction is going to win. else local bases = TitanPanelTitanBG_AB_NodesRequiredToWin(_player_enemy_faction); complete = TitanPanelTitanBG_AB_TimeLeftToCapture(_player_enemy_faction, bases, _ab_timeinc_sec); end if (complete) then _ab_timeinc_check = false; _timetonodeincrease = _ab_timeinc_sec; end if (win_time < _ab_timeinc_sec) then _ab_timeinc_check = false; _timetonodeincrease = win_time; end end end end end -- ############################ -- ## BATTLEGROUND FUNCTIONS ## -- ############################ -- ## Performed when the user changes zones. function TitanPanelTitanBG_ZonesChanged() local zone = GetRealZoneText(); if (zone ~= _player_zone) then _player_zone = zone; -- Reset any existing active battleground information. TitanPanelTitanBG_ResetActiveInformation(); -- If this is a battleground. if (TitanPanelTitanBG_IsBattleground(_player_zone)) then -- Store any existing captures. _active.captures = { }; TitanPanelTitanBG_CheckMap(_player_zone, true); _active_init_stored = true; _autojoin_bg = ""; _autojoin_time = 0; _autojoin_paused = 0; _autoleave_time = 0; _autoleave_paused = 0; end -- Reset basic battleground data. TitanPanelTitanBG_ResetBattlegroundInformation(); -- Reset zone data. _blizzard_manualshowbg = nil; _display_queue_tt = false; _ab_timeinc_check = false; -- Check if the battleground minimap needs to be shown. if (_addon_loaded) then -- Hide and show items as necessary. TitanPanelTitanBG_ToggleLockCaptures(); TitanPanelTitanBG_ToggleMiniMapIcon(); TitanPanelTitanBG_HideBattlegroundReadyPopup(); TitanPanelTitanBG_ToggleClickFlagRunner(); TitanPanelTitanBG_InvertFlagTracker(); -- Update non titan display of captures and flags. TitanPanelTitanBG_NT_UpdateCaptures(true); TitanPanelTitanBG_NT_UpdateFlags(); end end end -- ## Determines if a given zone is a battleground. function TitanPanelTitanBG_IsBattleground(zone) if (zone == TITANBG_BG_AV or zone == TITANBG_BG_AB or zone == TITANBG_BG_WSG) then return true; else return false; end end -- ## Stores information on a battleground and performs any actions based on this information that require periodic checks. function TitanPanelTitanBG_StoreBattlegroundInformation() if (_update_number > 1000) then _update_number = 0; end _bgs.queue = 0; -- Perform battlefield actions. for i = 1, MAX_BATTLEFIELD_QUEUES do local status, name, instance = GetBattlefieldStatus(i); -- If this battleground is active, collect information on this battleground. if (status == TITANBG_BG_STATUS_ACTIVE) then -- Update friend information. if (not _friendasked) then ShowFriends(); _friendasked = true; end if (GetBattlefieldWinner() ~= nil) then -- If a battleground is finished, get ready to leave it. if (sv_menu["B_AutoLeaveBG"] and _autoleave_time == 0) then _autoleave_time = GetTime() + _autoleave_delay; _autoleave_paused = 0; end -- If paused, update timer. if (_autoleave_paused > 0 and sv_menu["B_AutoLeaveBG"]) then _autoleave_time = _autoleave_paused + GetTime(); end -- Auto leave a battleground if complete. if (TitanPanelTitanBG_IsBattleground(_player_zone) and sv_menu["B_AutoLeaveBG"] and math.floor(_autoleave_time - GetTime()) <= 0) then TitanPanelTitanBG_AcceptBattlefieldPort(i, nil, true); _autoleave_time = 0; _autoleave_paused = 0; end end TitanPanelTitanBG_StoreActiveInformation(name, status, instance, i); -- Otherwise, if this battleground is waiting for confirmation, perform auto join. elseif (status == TITANBG_BG_STATUS_CONFIRM) then -- If a battleground is ready for confirmation, start the auto join timer. if (sv_menu["B_AutoJoinBG"] and (_autojoin_bg == "" or _autojoin_bg == nil)) then _autojoin_bg = name; _autojoin_time = GetTime() + _autojoin_delay; _autojoin_paused = 0; end -- If paused, update timer. if (_autojoin_paused > 0 and sv_menu["B_AutoJoinBG"]) then _autojoin_time = _autojoin_paused + GetTime(); end -- Auto join a battleground if not already in a battleground. if (not TitanPanelTitanBG_IsBattleground(_player_zone) and _autojoin_bg == name and math.floor(_autojoin_time - GetTime()) <= 0) then TitanPanelTitanBG_AutoJoinBattleground(i); end end -- If this is a battleground, store status infromation. if (TitanPanelTitanBG_IsBattleground(name)) then if (status == TITANBG_BG_STATUS_QUEUED or status == TITANBG_BG_STATUS_CONFIRM) then _bgs.queue = _bgs.queue + 1; end -- Check if a new sound needs to be played. if (_bgs.names[name].status ~= status and status == TITANBG_BG_STATUS_CONFIRM) then _bgs.names[name].sound = true; _bgs.names[name].sound_timer = 0; elseif (status ~= TITANBG_BG_STATUS_CONFIRM) then _bgs.names[name].sound = false; _bgs.names[name].sound_timer = 0; end -- Play a new sound for this battleground. if (_bgs.names[name].sound and sv_menu["D_S_PlayWhatSound"] > 0) then local PlayReadySound = function() if (sv_menu["D_S_PlayWhatSound"] == 1) then PlaySound("PVPTHROUGHQUEUE", true); else PlaySoundFile(TITANBG_SOUNDS_BGWARNING[sv_menu["D_S_PlayWhatSound"]].file); end end -- If repeat the sound periodically. if (sv_menu["D_S_RepeatSound"]) then if (GetTime() - _bgs.names[name].sound_timer >= _bgready_sound_delay) then _bgs.names[name].sound_timer = GetTime(); PlayReadySound(); end else PlayReadySound(); _bgs.names[name].sound = false; end end _bgs.names[name].index = i; _bgs.names[name].status = status; _bgs.names[name].instance = instance; _bgs.names[name].update = _update_number; if (status == TITANBG_BG_STATUS_CONFIRM) then _bgs.names[name].expires = GetBattlefieldPortExpiration(i) / 1000; else _bgs.names[name].expires = 0; end _bgs.blizzard[i] = name; -- Otherwise, this slot is not being used by blizzard. else if (_bgs.blizzard[i]) then _bgs.blizzard[i] = nil; end end end -- Reset all the battlegrounds that were not updated. for i = 1, table.getn(_bgs.index) do if (_bgs.names[_bgs.index[i]].update ~= _update_number) then _bgs.names[_bgs.index[i]].index = 0; _bgs.names[_bgs.index[i]].status = TITANBG_BG_STATUS_NONE; _bgs.names[_bgs.index[i]].instance = 0; _bgs.names[_bgs.index[i]].update = nil; _bgs.names[_bgs.index[i]].expires = 0; _bgs.names[_bgs.index[i]].sound = false; _bgs.names[_bgs.index[i]].sound_timer = 0; if (_autojoin_bg == _bgs.index[i]) then _autojoin_bg = ""; _autojoin_time = 0; _autojoin_paused = 0; end end end local i = 1; -- Process battleround popups. if (_titan_loaded and _addon_loaded and not sv_menu["B_HideJoinPopup"]) then while (i <= table.getn(_popups)) do if ((_popups[i].dialog.text_arg1 == _popups[i].text_arg1 and _popups[i].dialog.text_arg2 == _popups[i].text_arg2) and _popups[i].which == "CONFIRM_BATTLEFIELD_ENTRY" and (_bgs.blizzard[_popups[i].data] and _bgs.names[_bgs.blizzard[_popups[i].data]].status == TITANBG_BG_STATUS_CONFIRM)) then local expire = ""; -- Check if the queue expire time is to be shown. if (sv_menu["D_POP_QueueExpire"]) then expire = " (" .. TITANBG_COLOR_RED .. SecondsToTime(GetBattlefieldPortExpiration(_popups[i].data) / 1000) .. TITANBG_COLOR_GREEN .. ")"; end -- If the user is not already in a battleground and is autojoining. if (TitanPanelTitanBG_IsBattleground(_player_zone) == false and sv_menu["B_AutoJoinBG"] and _autojoin_time > GetTime() and string.find(_popups[i].text_arg1, _autojoin_bg)) then local autojoin = SecondsToTime(_autojoin_time - GetTime()); if (_autojoin_paused > 0) then autojoin = autojoin .. TITANBG_COLOR_WHITE .. "(" .. TITANBG_TOOLTIP_PAUSED .. ")"; getglobal(_popups[i].dialog:GetName().."Button2"):SetText(TITANBG_TOOLTIP_UNPAUSE); else getglobal(_popups[i].dialog:GetName().."Button2"):SetText(KEY_PAUSE); end _popups[i].text:SetText(TITANBG_COLOR_GREEN .. string.gsub(string.gsub(TITANBG_AUTOJOIN, "{bg}", TITANBG_COLOR_WHITE .. _popups[i].text_arg1 .. TITANBG_COLOR_GREEN, 1), "{time}", TITANBG_COLOR_YELLOW .. autojoin .. TITANBG_COLOR_GREEN .. expire, 1)); -- If the user is in a battleground or is not autojoining. else _popups[i].text:SetText(TITANBG_COLOR_GREEN .. string.gsub(string.gsub(TITANBG_CONFIRMJOIN, "{bg}", TITANBG_COLOR_WHITE .. _popups[i].text_arg1 .. TITANBG_COLOR_GREEN, 1), "{time}", TITANBG_COLOR_GREEN .. expire, 1)); end else table.remove(_popups, i); i = i - 1; end i = i + 1; end end _update_number = _update_number + 1; end -- ## Stores information about the instances that were active when a user looked at the queue window. function TitanPanelTitanBG_StoreActiveInstanceInformation() local name, _, _, _, _, _, _, _, _ = GetBattlefieldInfo(); local instances = GetNumBattlefields(); local bg = _bgs.names[name]; if (bg ~= nil) then bg.open_instances = instances; bg.open_age = GetTime(); end end -- ## Indicates if the person is currently in a battleground queue or in a battleground. function TitanPanelTitanBG_InBGQueue() local in_queue = false; -- Loop through and check on the status of the battlegrounds. for i = 1, MAX_BATTLEFIELD_QUEUES do local status, _, _ = GetBattlefieldStatus(i); -- If the user is in a queue or in a battleground. if (status ~= TITANBG_BG_STATUS_NONE) then in_queue = true; break; end end return in_queue; end -- ## Collects information on a specified battleground. function TitanPanelTitanBG_StoreActiveInformation(bg_name, bg_status, bg_instance, bg_i) -- Request new data for GetBattlefieldScore(). RequestBattlefieldScoreData(); -- Run checks on the battlefield map information. if (_active_init_stored) then TitanPanelTitanBG_CheckMap(bg_name, false); end -- Clear the friend's list string. _friendstring = ""; _active.stats.bg.name = bg_name; _active.stats.bg.index = bg_i; _active.stats.bg.instance = bg_instance; _active.stats.bg.run = GetBattlefieldInstanceRunTime(); _active.stats.bg.total = 0; _active.stats.bg.horde = 0; _active.stats.bg.alliance = 0; -- Loop through all the players. for i = 1, 80 do local name, killingblows, kills, deaths, honor, faction, rank, race, class = GetBattlefieldScore(i); local player_id = ""; local player_name = ""; local server = ""; if (name ~= nil) then _active.stats.bg.total = _active.stats.bg.total + 1; if (string.find(name, "-")) then server = string.sub(name, string.find(name, "-") + 1, string.len(name)); player_name = string.sub(name, 1, string.find(name, "-") - 1); else player_name = name; server = _player_realm; end if (faction == 0) then _active.stats.bg.horde = _active.stats.bg.horde + 1; player_id = player_name .. "|Horde"; else _active.stats.bg.alliance = _active.stats.bg.alliance + 1; player_id = player_name .. "|Alliance"; end local player = TitanBG_GetPlayerData(player_id); -- Store the player information. if (not player and player_name ~= "" and player_name ~= nil) then player = { id = player_id, name = player_name, server = server, faction = faction, class = class, rank = rank, }; table.insert(_active.stats.wsg.players, player); end end -- If this is the current player. if (player_name == _player_name) then _active.stats.player.standing = i; _active.stats.player.kills = kills; _active.stats.player.deaths = deaths; _active.stats.player.killing_blows = killingblows; _active.stats.player.honor = honor; -- Create the friend's list string. elseif ( _friendlist[name] and sv_menu["D_TT_Friends"] ) then _friendstring = _friendstring.."\n"..name.."\t"; _friendstring = _friendstring..TitanUtils_GetHighlightText("#: ")..TitanUtils_GetGreenText(i)..", "; _friendstring = _friendstring..TitanUtils_GetHighlightText(TITANBG_S_KILLINGBLOWS)..TitanUtils_GetGreenText(killingblows)..", "; _friendstring = _friendstring..TitanUtils_GetHighlightText(TITANBG_S_KILLS)..TitanUtils_GetGreenText(kills)..", "; _friendstring = _friendstring..TitanUtils_GetHighlightText(TITANBG_S_DEATHS)..TitanUtils_GetRedText(deaths); end end -- How many battleground statistics are there. local sColumns = GetNumBattlefieldStats(); -- Loop through the statistics. for j = 1, MAX_NUM_STAT_COLUMNS do if (j <= sColumns) then local cData = GetBattlefieldStatData(_active.stats.player.standing, j); -- Collect player capture stats on Alterac Valley. if (bg_name == TITANBG_BG_AV) then if (j == 1) then _active.stats.av.gy_assulted = cData; elseif (j == 2) then _active.stats.av.gy_defended = cData; elseif (j == 3) then _active.stats.av.towers_assaulted = cData; elseif (j == 4) then _active.stats.av.towers_defended = cData; elseif (j == 5) then _active.stats.av.mines_captured = cData; elseif (j == 6) then _active.stats.av.leaders_killed = cData; elseif (j == 7) then _active.stats.av.secondary_obj = cData; end -- Collect player capture stats on Warsong Gulch. elseif (name == TITANBG_BG_WSG) then if (j == 1) then _active.stats.wsg.flag_captures = cData; elseif (j == 2) then _active.stats.wsg.flag_returns = cData; end -- Collect player capture stats on Arathi Basin. elseif (name == TITANBG_BG_AB) then if (j == 1) then _active.stats.ab.bases_assulted = cData; elseif (j == 2) then _active.stats.ab.bases_defended = cData; end end end end end -- ## Returns data on a player in the battleground. -- ## -- ## Variables -- ## * id: Is the player 'name|faction'. For example, 'Maina|Alliance'. function TitanBG_GetPlayerData(id) for i = 1, table.getn(_active.stats.wsg.players) do if (_active.stats.wsg.players[i].id == id) then return _active.stats.wsg.players[i]; end end return nil; end -- ## Checks on the location in the battleground and their capture status. function TitanPanelTitanBG_CheckMap(bg_name, just_entered) local marks = GetNumMapLandmarks(); local delay = 0; -- Reset base owned tracking variables. _active.stats.ab.bases_alliance = 0; _active.stats.ab.bases_horde = 0; -- If this is a cap on enter, reset capture information. if (just_entered) then _active.captures = { }; end -- Determine delay based on battleground. if (bg_name == TITANBG_BG_AV) then delay = _capture_delay_av; elseif (bg_name == TITANBG_BG_AB) then delay = _capture_delay_ab; end for i = 1, marks, 1 do local name, _, txture, _, _ = GetMapLandmarkInfo(i); local owned = TitanPanelTitanBG_OwnedBy(txture); -- Determine who this item is owned by and if we are in ab, increase the count for that faction. if (bg_name == TITANBG_BG_AB) then if (owned == "Alliance") then _active.stats.ab.bases_alliance = _active.stats.ab.bases_alliance + 1; elseif (owned == "Horde") then _active.stats.ab.bases_horde = _active.stats.ab.bases_horde + 1; end end -- Set up the local capture information. local c = { name = "", -- What is the name of this item. cap = 0, -- Time when the point will be capped. If zero, capped on enter. who = "", -- Who the point will be capped by. t = 15, -- The texture of the cap. }; -- Store data. c.name = name; c.who = TitanPanelTitanBG_CappedBy(txture); c.t = txture; -- Location of the capture in the capture's list. local loc = -1; -- Loop through and find the capture if it is in the list. if (table.getn(_active.captures) > 0) then for j = 1, table.getn(_active.captures) do if (_active.captures[j].name == c.name) then loc = j; break; end end end -- If this is a new item being contested, store data. if (loc == -1 and c.who ~= "") then -- If the time capped is known, store the time to cap. if (not just_entered) then c.cap = GetTime() + delay; end table.insert(_active.captures, c); -- Otherwise, remove any item not contested. elseif (loc > -1 and (c.who == "" or (c.who ~= "" and _active.captures[loc].who ~= c.who))) then table.remove(_active.captures, loc); end end -- If this is Warsong Gulch, collect flag information. if (_player_zone == TITANBG_BG_WSG) then _active.stats.wsg.alliance.flag = GetWorldStateUIInfo(1); _active.stats.wsg.horde.flag = GetWorldStateUIInfo(2); -- Collect alliance flag information. if (_active.stats.wsg.alliance.msg ~= "") then -- Flag picked up. The faction the message is for is the same as the faction of the player carrying the flag. -- "The Horde flag was picked up by Maina!". if (string.find(_active.stats.wsg.alliance.msg, TITANBG_WSG_PICKEDUP)) then _active.stats.wsg.alliance.msg = string.gsub(_active.stats.wsg.alliance.msg, TITANBG_WSG_PICKEDUP, ""); _active.stats.wsg.alliance.player = string.sub(_active.stats.wsg.alliance.msg, string.find(_active.stats.wsg.alliance.msg, "([^%p^%s]+)")); -- Flag dropped. The faction the message is for is the faction that owns the flag. The player dropping the flag is the enemy. -- "The Alliance flag was dropped by Maina!". elseif (string.find(_active.stats.wsg.alliance.msg, TITANBG_WSG_DROPPED)) then _active.stats.wsg.horde.player = ""; -- Flag captured. The faction the message is for is the same as the faction of the player carrying the flag. -- "Maina captured the Horde flag!". elseif (string.find(_active.stats.wsg.alliance.msg, TITANBG_WSG_CAPTURED)) then _active.stats.wsg.alliance.player = ""; end _active.stats.wsg.alliance.msg = ""; end -- Collect horde flag information. if (_active.stats.wsg.horde.msg ~= "") then -- Flag picked up. The faction the message is for is the same as the faction of the player carrying the flag. -- "The Alliance flag was picked up by Maina!". if (string.find(_active.stats.wsg.horde.msg, TITANBG_WSG_PICKEDUP)) then _active.stats.wsg.horde.msg = string.gsub(_active.stats.wsg.horde.msg, TITANBG_WSG_PICKEDUP, ""); _active.stats.wsg.horde.player = string.sub(_active.stats.wsg.horde.msg, string.find(_active.stats.wsg.horde.msg, "([^%p^%s]+)")); -- Flag dropped. The faction the message is for is the faction that owns the flag. The player dropping the flag is the enemy. -- "The Horde flag was dropped by Maina!". elseif (string.find(_active.stats.wsg.horde.msg, TITANBG_WSG_DROPPED)) then _active.stats.wsg.alliance.player = ""; -- Flag captured. The faction the message is for is the same as the faction of the player carrying the flag. -- "Maina captured the Alliance flag!". elseif (string.find(_active.stats.wsg.horde.msg, TITANBG_WSG_CAPTURED)) then _active.stats.wsg.horde.player = ""; end _active.stats.wsg.horde.msg = ""; end end end -- TEXTURE KEY (Alterac Valley) -- -- Mine -- 0: None -- 1: Horde -- 2: Alliance -- -- Graveyard -- 7: Free -- 12: Horde -- 3: Contested (Horde, Assulted by the Alliance) -- 14: Alliance -- 13: Contested (Alliance, Assulted by the Horde) -- -- Tower -- 9: Horde -- 8: Contested (Horde, Assulted by the Alliance) -- 10: Alliance -- 11: Contested (Alliance, Assulted by the Horde) -- TEXTURE KEY (Arathi Basin) -- -- Lumber Mill -- 21: None -- 25: Horde -- 22: Contested (Horde, Assulted by the Alliance) -- 23: Alliance -- 24: Contested (Alliance, Assulted by the Horde) -- -- Mine -- 16: None -- 20: Horde -- 17: Contested (Horde, Assulted by the Alliance) -- 18: Alliance -- 19: Contested (Alliance, Assulted by the Horde) -- -- Blacksmith -- 26: None -- 30: Horde -- 27: Contested (Horde, Assulted by the Alliance) -- 28: Alliance -- 29: Contested (Alliance, Assulted by the Horde) -- -- Farm -- 31: None -- 35: Horde -- 32: Contested (Horde, Assulted by the Alliance) -- 33: Alliance -- 34: Contested (Alliance, Assulted by the Horde) -- -- Stables -- 36: None -- 40: Horde -- 37: Contested (Horde, Assulted by the Alliance) -- 38: Alliance -- 39: Contested (Alliance, Assulted by the Horde) -- ## Determines who the point will be capped by. If not under contestation, return a zero length string. function TitanPanelTitanBG_CappedBy(t) local capped = ""; if (t == 3 or t == 8 or t == 22 or t == 17 or t == 27 or t == 32 or t == 37) then capped = "Alliance"; elseif (t == 13 or t == 11 or t == 24 or t == 19 or t == 29 or t == 34 or t == 39) then capped = "Horde"; end return capped; end -- ## Determines who owns the point, if it is not under contestation. Otherwise, returns a zero length string. function TitanPanelTitanBG_OwnedBy(t) local owned = ""; if (t == 2 or t == 14 or t == 10 or t == 23 or t == 18 or t == 28 or t == 33 or t == 38) then owned = "Alliance"; elseif (t == 1 or t == 12 or t == 9 or t == 25 or t == 20 or t == 30 or t == 35 or t == 40) then owned = "Horde"; end return owned; end -- ## Automatically joins a battleground. function TitanPanelTitanBG_AutoJoinBattleground(i) if (sv_menu["B_AutoJoinBG"]) then TitanPanelTitanBG_AcceptBattlefieldPort(i, 1, true); _autojoin_bg = ""; _autojoin_time = 0; end end -- ## Determines who is likely to win the Arathi Basin game. -- ## -- ## Variables -- ## * b_alliance: Number of bases held by the Alliance. -- ## * b_horde: Number of bases held by the Horde. -- ## * a_extra: Extra resources to add to the alliance side when performing a future prediction check. -- ## * h_extra: Extra resources to add to the horde side when performing a future prediction check. -- ## -- ## Returns -- ## * The team that will win. Nil/"Horde"/"Alliance". -- ## * The amount of time it will take them to win. Nil/time in seconds. -- ## * Final score held by the Alliance. -- ## * Final score held by the Horde. function TitanPanelTitanBG_AB_GetWinner(b_alliance, b_horde, a_extra, h_extra) -- Get the amount of resources held by the teams. local a_resources, h_resources = TitanPanelTitanBG_AB_GetResources(); -- -- If we are checking possible future scenarios, add the extra resources. if (a_extra ~= nil and h_extra ~= nil) then a_resources = a_resources + a_extra; h_resources = h_resources + h_extra; end -- Get the amount of resources per second. local a_res_sec = TitanPanelTitanBG_AB_GetResourcesPerSecond(b_alliance); local h_res_sec = TitanPanelTitanBG_AB_GetResourcesPerSecond(b_horde); -- The amount of time left until the team gathers 2000 resources. local a_timeleft = -1; local h_timeleft = -1; -- Catch division by zero exceptions. if (a_res_sec > 0) then a_timeleft = (2000 - a_resources) / a_res_sec; end if (h_res_sec > 0) then h_timeleft = (2000 - h_resources) / h_res_sec; end -- Determine final scores at the end. local a_final = a_resources; local h_final = h_resources; if (a_res_sec > 0) then a_final = math.floor((a_final + (math.floor(h_timeleft / 30) * (a_res_sec * 30))) / 10) * 10; end if (h_res_sec > 0) then h_final = math.floor((h_final + (math.floor(a_timeleft / 30) * (h_res_sec * 30))) / 10) * 10; end -- Unknown who will win. if (a_timeleft == -1 and h_timeleft == -1) then return nil, nil, nil, nil; -- Alliance will win. elseif ((a_timeleft > -1 and a_timeleft < h_timeleft) or (a_timeleft > -1 and h_timeleft == -1)) then return "Alliance", a_timeleft, 2000, h_final; -- Horde will win. elseif ((h_timeleft > -1 and h_timeleft < a_timeleft) or (h_timeleft > -1 and a_timeleft == -1)) then return "Horde", h_timeleft, a_final, 2000; end -- Otherwise return unknown. return nil, nil, nil, nil; end -- ## Determines how many resources per second a team gets with the amount of bases they're holding. function TitanPanelTitanBG_AB_GetResourcesPerSecond(bases) if (bases == 1) then return (25.0 / 30.0); elseif (bases == 2) then return (300.0 / 9.0) / 30.0; elseif (bases == 3) then return 50.0 / 30.0; elseif (bases == 4) then return 100.0 / 30.0; elseif (bases == 5) then return 900.0 / 30.0; else return 0; end end -- ## Gets the current resources for both factions. function TitanPanelTitanBG_AB_GetResources() local a_resources = 0; local h_resources = 0; -- Get the amount of resources owned by each team. local _, a_text, _, _, _, _ = GetWorldStateUIInfo(1); local _, h_text, _, _, _, _ = GetWorldStateUIInfo(2); -- Extract the resources. if (a_text and h_text and _player_zone == TITANBG_BG_AB and string.find(a_text, TITANBG_AB_RESOURCES_DP) and string.find(h_text, TITANBG_AB_RESOURCES_DP)) then a_resources = string.sub(a_text, string.find(a_text, TITANBG_AB_RESOURCES_DP) + 11, string.find(a_text, "/") - 1); h_resources = string.sub(h_text, string.find(h_text, TITANBG_AB_RESOURCES_DP) + 11, string.find(h_text, "/") - 1); end return a_resources, h_resources; end -- ## Determines how many nodes are required to win. -- ## -- ## Returns -- ## * TITANBG_AB_IMPOSSIBLE: If not possible to win. -- ## OR: Number of nodes required to win. function TitanPanelTitanBG_AB_NodesRequiredToWin(faction, a_resources, h_resources) local nodes = TITANBG_AB_IMPOSSIBLE; local bases = 0; -- Determine which faction we are checking is. if (faction == TITANBG_ALLIANCE) then bases = _active.stats.ab.bases_alliance; else bases = _active.stats.ab.bases_horde; end -- Try different base numbers. for i = 1, (5 - bases) do local winner = nil; if (faction == TITANBG_ALLIANCE) then winner = TitanPanelTitanBG_AB_GetWinner(bases + i, _active.stats.ab.bases_horde - i, a_resources, h_resources); else winner = TitanPanelTitanBG_AB_GetWinner(_active.stats.ab.bases_alliance - i, bases + i, a_resouces, h_resources); end -- If the winner is the faction, then stop. if (winner == faction) then nodes = i; break; end end return nodes; end -- ## Determines how long it will take until the amount of nodes needing to be captured in order to win increases. -- ## -- ## Variables -- ## * faction: The faction we are checking. -- ## * initial: The number of nodes that need to be captured by the faction in order to win. function TitanPanelTitanBG_AB_TimeLeftToCapture(faction, initial, seconds) local nodes = nil; local complete = false; local a_resources = 0; local h_resources = 0; -- Get the amount of resources per second. local a_res_sec = TitanPanelTitanBG_AB_GetResourcesPerSecond(_active.stats.ab.bases_alliance); local h_res_sec = TitanPanelTitanBG_AB_GetResourcesPerSecond(_active.stats.ab.bases_horde); -- Get the amount of resources produced in this time period. a_resources = a_res_sec * seconds; h_resources = h_res_sec * seconds; -- Check the amount of nodes nodes = TitanPanelTitanBG_AB_NodesRequiredToWin(faction, a_resources, h_resources); if (nodes ~= initial) then complete = true; end return complete; end -- ###################### -- ## ACTION FUNCTIONS ## -- ###################### -- ## Events that occur when the user clicks on the addon. function TitanPanelTitanBGButton_OnClick(button) if (button == "LeftButton") then -- Check on auto join pauses. if (not TitanPanelTitanBG_IsBattleground(_player_zone)) then -- If the user want to pause the auto join timer. if (sv_menu["B_AutoJoinBG"] and _autojoin_paused == 0) then _autojoin_paused = _autojoin_time - GetTime(); -- If the user wants to unpause the auto join timer. elseif (sv_menu["B_AutoJoinBG"] and _autojoin_paused > 0) then _autojoin_paused = 0; end -- Check on auto leave pauses. elseif (GetBattlefieldWinner() ~= nil) then -- If the user want to pause the auto leave timer. if (sv_menu["B_AutoLeaveBG"] and _autoleave_paused == 0) then _autoleave_paused = _autoleave_time - GetTime(); -- If the user wants to unpause the auto leave timer. elseif (sv_menu["B_AutoLeaveBG"] and _autoleave_paused > 0) then _autoleave_paused = 0; end end -- Show the battlemap. if (IsShiftKeyDown() and not IsControlKeyDown()) then if ((sv_menu["B_AutoShowBGMinimap"] and BattlefieldMinimap:IsShown()) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and BattlefieldMinimap:IsShown())) then _blizzard_manualshowbg = "HIDE"; elseif ((not sv_menu["B_AutoShowBGMinimap"] and not BattlefieldMinimap:IsShown()) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and not BattlefieldMinimap:IsShown())) then _blizzard_manualshowbg = "SHOW"; else _blizzard_manualshowbg = nil; end TitanPanelTitanBG_ToggleBattlefieldMinimap(); end -- If the user is in a battleground. if (TitanPanelTitanBG_IsBattleground(_player_zone) and (GetBattlefieldWinner() == nil or not WorldStateScoreFrame:IsVisible()) and not IsControlKeyDown() and not IsShiftKeyDown()) then ToggleWorldStateScoreFrame(); end _titan_titanbg_leftclick = true; end end -- ## Toggles a specified variable in the menu. function TitanPanelTitanBGButton_ToggleVar() TitanToggleVar(TITAN_TITANBG_ID, this.value); TitanPanelButton_UpdateButton(TITAN_TITANBG_ID); end -- ## Releases a player's corpse. function TitanPanelTitanBG_RepopMe() if ((sv_menu["B_AutoRelease"] and TitanPanelTitanBG_IsBattleground(_player_zone) and UnitIsDeadOrGhost("player")) or _blizzard_releasesoul) then if ((sv_menu["B_ReleaseCheck"] and not HasSoulstone()) or not sv_menu["B_ReleaseCheck"]) then Hook_RepopMe(); end end end -- ## Ports a user into the battleground, or leaves the queue. function TitanPanelTitanBG_AcceptBattlefieldPort(index, accept, titanbg) -- Check if called by a blizzard drop down menu functions. if (this.arg1) then index = this.arg1; accept = this.arg2; titanbg = true; end -- If called by a Blizzard or a TitanBG function, then perform this action. if (_blizzard_interactbg or titanbg) then TitanPanelRightClickMenu_Close(); Hook_AcceptBattlefieldPort(index, accept); end end -- ## Toggles the locking of the capture timers on the screen. function TitanPanelTitanBG_ToggleLockCaptures() -- Lock the on screen capture timers. if (sv_menu["D_OS_PanelLock"] or not sv_menu["AddonEnabled"]) then TitanPanelTitanBG_Display_Capture:Hide(); -- Unlock the on screen capture timers. else TitanPanelTitanBG_Display_Capture:Show(); end end -- ## Hides or shows the battleground mini map button. function TitanPanelTitanBG_ToggleMiniMapIcon() -- Hide the mini map button if the user wants it hidden. if ((sv_menu["B_HideMinimapButton"] and TitanPanelTitanBG_InBGQueue() and sv_menu["AddonEnabled"]) or (not sv_menu["AddonEnabled"] and not TitanPanelTitanBG_InBGQueue())) then MiniMapBattlefieldFrame:Hide(); elseif (TitanPanelTitanBG_InBGQueue()) then MiniMapBattlefieldFrame:Show(); end end -- ## Hides or shows the battleground minimap. function TitanPanelTitanBG_ToggleBattlefieldMinimap() -- If this is a battleground or a world pvp area, determine if the battlemap needs to be shown or hidden. if (sv_menu["AddonEnabled"]) then local showmap = sv_menu["B_AutoShowBGMinimap"]; -- Check if the user has changed the settings for this zone manually. if (_blizzard_manualshowbg) then if (_blizzard_manualshowbg == "SHOW") then showmap = true; elseif (_blizzard_manualshowbg == "HIDE") then showmap = false; end end -- If the battlefield minimap hasn't been loaded, load it. if (not BattlefieldMinimap) then BattlefieldMinimap_LoadUI(); end -- If we want to show the battlemap. if (showmap and not BattlefieldMinimap:IsShown() and sv_menu["AddonEnabled"] and (TitanPanelTitanBG_IsBattleground(_player_zone) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and _blizzard_manualshowbg ~= nil))) then BattlefieldMinimap:Show(); -- If we want to hide the battlemap. elseif ((not showmap and BattlefieldMinimap:IsShown()) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and _blizzard_manualshowbg == nil)) then if (BattlefieldMinimap) then BattlefieldMinimap:Hide(); end end end end -- ## Enables and disables click targetting of the flag runner. function TitanPanelTitanBG_ToggleClickFlagRunner() if (sv_menu["D_OS_WSG_Click"]) then TitanPanelTitanBG_Display_Flag_1:EnableMouse(true); TitanPanelTitanBG_Display_Flag_2:EnableMouse(true); TitanPanelTitanBG_Display_Flag_1_Button:EnableMouse(true); TitanPanelTitanBG_Display_Flag_2_Button:EnableMouse(true); else TitanPanelTitanBG_Display_Flag_1:EnableMouse(false); TitanPanelTitanBG_Display_Flag_2:EnableMouse(false); TitanPanelTitanBG_Display_Flag_1_Button:EnableMouse(false); TitanPanelTitanBG_Display_Flag_2_Button:EnableMouse(false); end end -- Changes the attachment points of the flag tracker. function TitanPanelTitanBG_InvertFlagTracker() if (not sv_menu["D_OS_WSG_Invert"]) then TitanPanelTitanBG_Display_Flag_1:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_2:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_1:SetPoint("TOPLEFT", "TitanPanelTitanBG_Display_Capture", "TOPLEFT"); TitanPanelTitanBG_Display_Flag_2:SetPoint("TOPLEFT", "TitanPanelTitanBG_Display_Flag_1", "BOTTOMLEFT"); else TitanPanelTitanBG_Display_Flag_1:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_2:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_1:SetPoint("BOTTOMLEFT", "TitanPanelTitanBG_Display_Flag_2", "TOPLEFT"); TitanPanelTitanBG_Display_Flag_2:SetPoint("BOTTOMLEFT", "TitanPanelTitanBG_Display_Capture", "BOTTOMLEFT"); end end -- Attaches the flag tracker to the score frame. function TitanPanelTitanBG_ChangeAttachFlagTracker() if (_player_zone == TITANBG_BG_WSG) then if (not sv_menu["D_OS_WSG_AttachScore"]) then TitanPanelTitanBG_Display_Flag_1_Button:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_2_Button:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_1_Button:SetPoint("TOPLEFT", "TitanPanelTitanBG_Display_Flag_1_Icon", "TOPRIGHT", 0, -2); TitanPanelTitanBG_Display_Flag_2_Button:SetPoint("TOPLEFT", "TitanPanelTitanBG_Display_Flag_2_Icon", "TOPRIGHT", 0, -2); else if (AlwaysUpFrame1DynamicIconButton ~= nil and AlwaysUpFrame2DynamicIconButton ~= nil) then TitanPanelTitanBG_Display_Flag_1_Button:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_2_Button:ClearAllPoints(); TitanPanelTitanBG_Display_Flag_1_Button:SetPoint("TOPLEFT", "AlwaysUpFrame1DynamicIconButton", "TOPRIGHT", 2, -4); TitanPanelTitanBG_Display_Flag_2_Button:SetPoint("TOPLEFT", "AlwaysUpFrame2DynamicIconButton", "TOPRIGHT", 2, -4); end end end end -- ## Overwrites the similar settings in other addons. function TitanPanelTitanBG_ToggleOverwriteOtherSettings() -- If we are overwriting the settings of other addons. if (sv_menu["I_OverwriteOtherSettings"] and sv_menu["AddonEnabled"]) then -- Blizzard WorldStateFrame_ToggleMinimap = TitanPanelTitanBG_ToggleBattlefieldMinimap; RepopMe = TitanPanelTitanBG_RepopMe; AcceptBattlefieldPort = TitanPanelTitanBG_AcceptBattlefieldPort; -- TITAN HONOR PLUS -- Auto battleground minimap. if (TitanPanelHonorPlus_ToggleVar_AutoBGMap) then TitanPanelHonorPlus_ToggleVar_AutoBGMap = function() TitanPanelTitanBG_MessagePopup(TITANBG_MESSAGE_ACTIONOVERWRITTEN, 140); Hook_TitanPanelHonorPlus_ToggleVar_AutoBGMap(); end end -- Auto join battleground. if (TitanPanelHonorPlus_ToggleVar_AutoJoinBG) then TitanPanelHonorPlus_ToggleVar_AutoJoinBG = function() TitanPanelTitanBG_MessagePopup(TITANBG_MESSAGE_ACTIONOVERWRITTEN, 140); Hook_TitanPanelHonorPlus_ToggleVar_AutoJoinBG(); end TitanHonorPlus_CheckBGConfirm = function() end TitanHonorPlus_StaticPopup_OnHide = function() end end -- Auto release on death. if (TitanPanelHonorPlus_ToggleVar_AutoRelease) then TitanPanelHonorPlus_ToggleVar_AutoRelease = function() TitanPanelTitanBG_MessagePopup(TITANBG_MESSAGE_ACTIONOVERWRITTEN, 140); Hook_TitanPanelHonorPlus_ToggleVar_AutoRelease(); end end -- If we don't want to overwrite the settings of other addons. else -- Blizzard WorldStateFrame_ToggleMinimap = Hook_WorldStateFrame_ToggleMinimap; RepopMe = Hook_RepopMe; AcceptBattlefieldPort = Hook_AcceptBattlefieldPort; -- TITAN HONOR PLUS -- Auto battleground minimap. if (Hook_TitanPanelHonorPlus_ToggleVar_AutoBGMap) then TitanPanelHonorPlus_ToggleVar_AutoBGMap = Hook_TitanPanelHonorPlus_ToggleVar_AutoBGMap; end -- Auto join battleground. if (Hook_TitanPanelHonorPlus_ToggleVar_AutoJoinBG) then TitanPanelHonorPlus_ToggleVar_AutoJoinBG = Hook_TitanPanelHonorPlus_ToggleVar_AutoJoinBG; TitanHonorPlus_CheckBGConfirm = Hook_TitanHonorPlus_CheckBGConfirm; TitanHonorPlus_StaticPopup_OnHide = Hook_TitanHonorPlus_StaticPopup_OnHide; end -- Auto release on death. if (Hook_TitanPanelHonorPlus_ToggleVar_AutoRelease) then TitanPanelHonorPlus_ToggleVar_AutoRelease = Hook_TitanPanelHonorPlus_ToggleVar_AutoRelease; end end end -- ## Hides the battleground ready popup. function TitanPanelTitanBG_HideBattlegroundReadyPopup() if (sv_menu["B_HideJoinPopup"]) then StaticPopup_Hide("CONFIRM_BATTLEFIELD_ENTRY"); end end -- ##################### -- ## TITAN FUNCTIONS ## -- ##################### -- ## Creates the text located on the titan bar. function TitanPanelTitanBGButton_SetButtonText(id) TitanPanelTitanBGButton_CheckEvents(); local text = ""; -- The tooltip text. local active = ""; -- Active battleground data. local ready = ""; -- Ready battleground data. local queue = ""; -- Queue battleground data. local spacer = TITANBG_COLOR_BLUE .. TITANBG_ICON_BUTTON_SPACER; -- If the user wants to display the label text, display it. if (sv_menu["ShowLabelText"]) then -- Loop through and process all the battlegrounds. for i = 1, table.getn(_bgs.index) do if (_bgs.names[_bgs.index[i]].status ~= TITANBG_BG_STATUS_NONE) then -- Get active battleground text. if (_bgs.names[_bgs.index[i]].status == TITANBG_BG_STATUS_ACTIVE) then active = active .. TitanPanelTitanBGButton_GetButtonText(_bgs.names[_bgs.index[i]]); -- Ready battleground data. elseif (_bgs.names[_bgs.index[i]].status == TITANBG_BG_STATUS_CONFIRM) then if (ready ~= "") then ready = ready .. " "; end ready = ready .. TitanPanelTitanBGButton_GetButtonText(_bgs.names[_bgs.index[i]]); -- Queue data. else if (queue ~= "") then queue = queue .. " "; end queue = queue .. TitanPanelTitanBGButton_GetButtonText(_bgs.names[_bgs.index[i]]); end end end -- If this is a battleground, don't display generic queue information. if (TitanPanelTitanBG_IsBattleground(_player_zone)) then queue = ""; -- If a queue is ready and the user wants to active information hidden. if (sv_menu["B_ReplaceActive"] and ready ~= "") then active = ""; end end if (active ~= "" and ready ~= "") then ready = " " .. ready; end if ((active ~= "" or ready ~= "") and queue ~= "") then queue = " " .. queue; end if (sv_menu["D_B_Spacers"]) then text = (spacer .. " " .. active .. ready .. queue .. " " .. spacer); else text = (active .. ready .. queue); end -- If nothing is going on, show place holder. if (active == "" and ready == "" and queue == "") then text = TITANBG_COLOR_YELLOW .. TITANBG_MENU_HEADER; end end -- Return the button text. return text; end function TitanPanelTitanBGButton_GetButtonText(bg) local text = ""; local short = TITANBG_COLOR_GREEN .. bg.short; -- If the user is queued for a BG. if (bg.status == TITANBG_BG_STATUS_QUEUED) then -- If the user wants to go into the first BG available. if (bg.instance == 0) then text = short .. ": " .. TITANBG_COLOR_WHITE .. TITANBG_FIRST_AVAILABLE; -- If the user wants to go into a specific bg. else text = short .. ": " .. TITANBG_COLOR_WHITE .. bg.instance; end -- If the user wants to display the time in the queue and wait time, show it. if (sv_menu["D_B_Time"]) then local wait_time = GetBattlefieldEstimatedWaitTime(bg.index); local in_queue = SecondsToTimeAbbrev(GetBattlefieldTimeWaited(bg.index) / 1000); -- Unavailable. if (wait_time == 0) then wait_time = TITANBG_COLOR_RED .. "?"; -- Time. else wait_time = SecondsToTimeAbbrev(wait_time / 1000, 1); end text = text .. TITANBG_COLOR_YELLOW .. " [" .. TITANBG_COLOR_WHITE .. in_queue .. TITANBG_COLOR_YELLOW .. "/" .. wait_time .. TITANBG_COLOR_YELLOW .."]"; end -- If the user can join a battleground on confirmation. elseif (bg.status == TITANBG_BG_STATUS_CONFIRM) then -- If auto joining and not currently in a battleground. if (not TitanPanelTitanBG_IsBattleground(_player_zone) and sv_menu["B_AutoJoinBG"] and _autojoin_time > GetTime() and _autojoin_bg == bg.name) then text = short .. " " .. bg.instance ..": " .. TITANBG_COLOR_GREEN .. SecondsToTime(_autojoin_time - GetTime()); if (_autojoin_paused > 0) then text = text .. TITANBG_COLOR_WHITE .. " (" .. TITANBG_COLOR_GREEN .. TITANBG_BUTTON_PAUSED .. TITANBG_COLOR_WHITE .. ")"; end -- If currently in a battleground or not auto joining. else text = short .. " " .. bg.instance ..": " .. TITANBG_COLOR_GREEN .. TITANBG_LABEL_READY; end if (sv_menu["D_B_QueueExpire"]) then text = text .. TITANBG_COLOR_YELLOW .." (" .. TITANBG_COLOR_RED .. SecondsToTime(bg.expires) .. TITANBG_COLOR_YELLOW ..")"; end -- If the user is currently in a battleground. elseif (bg.status == TITANBG_BG_STATUS_ACTIVE) then text = short .. " " .. bg.instance; if (sv_menu["D_B_Players"] and _active.stats.bg.total > 0) then text = text .. TITANBG_COLOR_WHITE .. " (".. TITANBG_COLOR_BLUE .. _active.stats.bg.alliance .. TITANBG_COLOR_WHITE .. ":" .. TITANBG_COLOR_RED .. _active.stats.bg.horde .. TITANBG_COLOR_WHITE .. ")"; end text = text .. TITANBG_COLOR_YELLOW .. ": "; if (sv_menu["D_B_Standing"] and _active.stats.player.standing ~= nil) then text = text .. TITANBG_COLOR_YELLOW .. TITANBG_S_STANDING .. TITANBG_COLOR_WHITE .. _active.stats.player.standing .. " "; end if (sv_menu["D_B_KillingBlows"] and _active.stats.player.killing_blows ~= nil) then text = text .. TITANBG_COLOR_YELLOW .. TITANBG_S_KILLINGBLOWS .. TITANBG_COLOR_GREEN .. _active.stats.player.killing_blows .. " "; end if (sv_menu["D_B_Kills"] and _active.stats.player.kills ~= nil) then text = text .. TITANBG_COLOR_YELLOW .. TITANBG_S_KILLS .. TITANBG_COLOR_GREEN .. _active.stats.player.kills .. " "; end if (sv_menu["D_B_Deaths"] and _active.stats.player.deaths ~= nil) then text = text .. TITANBG_COLOR_YELLOW .. TITANBG_S_DEATHS .. TITANBG_COLOR_RED .. _active.stats.player.deaths .. " "; end if (sv_menu["D_B_Honor"] and _active.stats.player.honor ~= nil) then text = text .. TITANBG_COLOR_YELLOW .. TITANBG_S_HONOR .. TITANBG_COLOR_WHITE .. _active.stats.player.honor .. " "; end -- If the player is auto leaving the battleground. if (sv_menu["B_AutoLeaveBG"] and _autoleave_time > GetTime()) then text = short .. " " .. bg.instance ..": " .. TITANBG_COLOR_RED .. SecondsToTime(_autoleave_time - GetTime()); if (_autoleave_paused > 0) then text = text .. TITANBG_COLOR_WHITE .. " (" .. TITANBG_COLOR_RED .. TITANBG_BUTTON_PAUSED .. TITANBG_COLOR_WHITE .. ")"; end end end return text; end -- ## Creates the text located on the titan bar. function TitanPanelTitanBGButton_SetTooltipText(id) local text = ""; -- The tooltip text. local active = ""; -- Active battleground data. local ready = ""; -- Ready battleground data. local queue = ""; -- Queue battleground data. local empty = ""; -- Irrelevant battleground data. local hint = ""; -- Any hints to add to the end. -- Loop through and process all the battlegrounds. for i = 1, table.getn(_bgs.index) do -- No battleground interaction. if (_bgs.names[_bgs.index[i]].status == TITANBG_BG_STATUS_NONE) then if (empty ~= "") then empty = empty .. "\n"; end empty = empty .. TitanPanelTitanBGButton_GetTooltipText(_bgs.names[_bgs.index[i]]); -- Active battleground data. elseif (_bgs.names[_bgs.index[i]].status == TITANBG_BG_STATUS_ACTIVE) then if (active ~= "") then active = active .. "\n\n"; end active = active .. TitanPanelTitanBGButton_GetTooltipText(_bgs.names[_bgs.index[i]]); -- Ready battleground data. elseif (_bgs.names[_bgs.index[i]].status == TITANBG_BG_STATUS_CONFIRM) then if (ready ~= "") then ready = ready .. "\n"; end ready = ready .. TitanPanelTitanBGButton_GetTooltipText(_bgs.names[_bgs.index[i]]); -- Queue data. else if (queue ~= "") then queue = queue .. "\n\n"; end queue = queue .. TitanPanelTitanBGButton_GetTooltipText(_bgs.names[_bgs.index[i]]); end end -- Show hints. if (not TitanPanelTitanBG_IsBattleground(_player_zone)) then hint = hint .. "\n"; if (not TitanPanelTitanBG_IsBattleground(_player_zone) and _autojoin_time > 0 and ready ~= "" and sv_menu["B_AutoJoinBG"]) then hint = hint .. "\n" .. TITANBG_COLOR_RED .. TITANBG_AUTOJOIN_HINT; end hint = hint .. "\n" .. TITANBG_COLOR_RED .. TITANBG_MINIMAP_HINT; end -- If the user wants two tooltips. if (sv_menu["D_BG_SeperateActiveQueue"] and TitanPanelTitanBG_IsBattleground(_player_zone)) then hint = hint .. "\n\n" .. TITANBG_COLOR_RED .. TITANBG_TOOLTIP_HINT; if (_display_queue_tt) then if (ready ~= "" and queue ~= "") then queue = "\n\n" .. queue; end if ((ready ~= "" or queue ~= "") and empty ~= "") then empty = "\n\n" .. empty; end text = "\n" .. ready .. queue .. empty .. hint; else text = "\n" .. active .. hint; end -- If the user wants to display everthing in one tooltip. else if (ready ~= "" and active ~= "") then active = "\n\n" .. active; end if ((ready ~= "" or active ~= "") and queue ~= "") then queue = "\n\n" .. queue; end if ((ready ~= "" or active ~= "" or queue ~= "") and empty ~= "") then empty = "\n\n" .. empty; end text = "\n" .. ready .. active .. queue .. empty .. hint; end return text; end -- ## Creates the tooltip text for the addon. function TitanPanelTitanBGButton_GetTooltipText(bg) local text = ""; -- If the user is not queued for the battleground. if (bg.status == TITANBG_BG_STATUS_NONE) then text = text .. TITANBG_COLOR_GREY .. string.gsub(TITANBG_NOT_IN_QUEUE_LONG, "{bg}", bg.name, 1); -- If the user is queued for the battleground. elseif (bg.status == TITANBG_BG_STATUS_QUEUED) then local wait_time = GetBattlefieldEstimatedWaitTime(bg.index); local in_queue = GetBattlefieldTimeWaited(bg.index); text = text .. TITANBG_COLOR_GREEN .. string.upper(bg.name) .. "\n"; if (bg.instance ~= 0) then text = text .. TITANBG_COLOR_GREY .. string.gsub(TITANBG_QUEUED_PREF, "{bg}", bg.name .. " " .. bg.instance, 1); else text = text .. TITANBG_COLOR_GREY .. string.gsub(TITANBG_QUEUED_NOPREF, "{bg}", bg.name, 1); end -- If the user knows how many active battlegrounds there were previously. if (bg.open_age > 0 and sv_menu["D_TT_RememberOpenBgs"]) then local age = ""; -- If older than 10 minutes, display age. if (GetTime() - bg.open_age >= 300) then age = TITANBG_COLOR_YELLOW .. " [" .. TITANBG_COLOR_WHITE .. SecondsToTimeAbbrev(GetTime() - bg.open_age) .. TITANBG_COLOR_YELLOW .. "]"; end text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_ACTIVE_INSTANCES .. "\t" .. TITANBG_COLOR_WHITE .. bg.open_instances .. age; end if (sv_menu["D_TT_QueueTimers"]) then text = text .. "\n\n" .. TITANBG_COLOR_YELLOW .. TITANBG_ESTIMATED_WAIT; if (wait_time == 0) then text = text .. "\t" .. TITANBG_COLOR_RED .. QUEUE_TIME_UNAVAILABLE .. "."; elseif (wait_time < 60000) then text = text .. "\t" .. TITANBG_COLOR_GREEN .. TITANBG_LESS_THAN_ONE_MIN; else text = text .. "\t" .. TITANBG_COLOR_WHITE .. SecondsToTime(wait_time / 1000, 1); end text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_TIME_IN_QUEUE .. "\t" .. TITANBG_COLOR_WHITE .. SecondsToTime(in_queue / 1000); -- Estimated time remaining. if (wait_time > in_queue) then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_ESTIMATED_REMAINING .. "\t" .. TITANBG_COLOR_WHITE .. SecondsToTime((wait_time - in_queue) / 1000); end end -- If the user can now accept to go into the battleground. elseif (bg.status == TITANBG_BG_STATUS_CONFIRM) then local expire = ""; -- Check if the queue expire time is to be shown. if (sv_menu["D_POP_QueueExpire"]) then expire = " (" .. TITANBG_COLOR_RED .. SecondsToTime(bg.expires) .. TITANBG_COLOR_GREEN .. ")"; end -- If the user is not already in a battleground and is autojoining. if (TitanPanelTitanBG_IsBattleground(_player_zone) == false and sv_menu["B_AutoJoinBG"] and _autojoin_time > GetTime() and _autojoin_bg == bg.name) then local autojoin = SecondsToTime(_autojoin_time - GetTime()); if (_autojoin_paused > 0) then autojoin = autojoin .. TITANBG_COLOR_WHITE .. "(" .. TITANBG_TOOLTIP_PAUSED .. ")"; end text = text .. TITANBG_COLOR_GREEN .. string.gsub(string.gsub(TITANBG_AUTOJOIN, "{bg}", TITANBG_COLOR_WHITE .. bg.name .. TITANBG_COLOR_GREEN, 1), "{time}", TITANBG_COLOR_YELLOW .. autojoin .. TITANBG_COLOR_GREEN .. expire, 1); -- If the user is in a battleground or is not autojoining. else text = text .. TITANBG_COLOR_GREEN .. string.gsub(string.gsub(TITANBG_CONFIRMJOIN, "{bg}", TITANBG_COLOR_WHITE .. bg.name .. TITANBG_COLOR_GREEN, 1), "{time}", TITANBG_COLOR_GREEN .. expire, 1); end -- If the battleground is currently active. elseif (bg.status == TITANBG_BG_STATUS_ACTIVE) then text = TITANBG_COLOR_GREEN .. string.upper(bg.name) .. "\n" .. text; -- If the player is auto leaving the battleground. if (sv_menu["B_AutoLeaveBG"] and _autoleave_time > GetTime()) then local autoleave = SecondsToTime(_autoleave_time - GetTime()); if (_autoleave_paused > 0) then autoleave = autoleave .. TITANBG_COLOR_WHITE .. "(" .. TITANBG_TOOLTIP_PAUSED .. ")"; end text = text .. TITANBG_COLOR_RED .. string.gsub(TITANBG_AUTOLEAVE, "{time}", autoleave .. TITANBG_COLOR_RED, 1) .. "\n\n"; end text = text .. TITANBG_COLOR_YELLOW .. bg.name .. " " .. bg.instance .. ":"; -- Print the instance and the run time. if (_active.stats.bg.run > 0) then text = text .. "\t" .. TITANBG_COLOR_WHITE .. SecondsToTime(_active.stats.bg.run/1000, 1); else text = text .. "\t" .. TITANBG_COLOR_RED .. TITANBG_INSTANCE_RUN_TIME_NA; end -- Print the number of players. if (_active.stats.bg.total > 0) then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYERS .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.bg.total; text = text .. TITANBG_COLOR_YELLOW .. " [" .. TITANBG_COLOR_BLUE .. _active.stats.bg.alliance .. TITANBG_COLOR_YELLOW .. "]"; text = text .. TITANBG_COLOR_YELLOW .. " [" .. TITANBG_COLOR_RED .. _active.stats.bg.horde .. TITANBG_COLOR_YELLOW .. "]"; end -- If this is Arathi Basin, print who is likely to win this battleground. if (bg.name == TITANBG_BG_AB and sv_menu["D_TT_ABWinEstimates"] and GetBattlefieldWinner() == nil) then local winner, win_time, alliance_score, horde_score, nodes = TitanPanelTitanBG_AB_GetWinner(_active.stats.ab.bases_alliance, _active.stats.ab.bases_horde); text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_WIN_ESTIMATE; -- If unknown. if (winner == nil) then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_WINNER .. "\t" .. TITANBG_COLOR_WHITE .. TITANBG_AB_WINNER_UNKNOWN; -- If Horde. elseif (winner == "Horde") then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_WINNER .. "\t" .. TITANBG_COLOR_RED .. FACTION_HORDE; -- If Alliance. elseif (winner == "Alliance") then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_WINNER .. "\t" .. TITANBG_COLOR_BLUE .. FACTION_ALLIANCE; end if (winner ~= nil) then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_FINAL_SCORE .. "\t" .. TITANBG_COLOR_BLUE .. alliance_score .. TITANBG_COLOR_WHITE .. " : " .. TITANBG_COLOR_RED .. horde_score; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_TIME_LEFT .. "\t" .. TITANBG_COLOR_WHITE .. SecondsToTimeAbbrev(win_time); -- Determine number of bases the player needs to win. -- If the player's faction isn't going to win. if (winner ~= UnitFactionGroup("player")) then local bases = TitanPanelTitanBG_AB_NodesRequiredToWin(_player_faction); text = text .. "\n\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_TO_WIN .. "\t" .. TITANBG_COLOR_WHITE .. bases; -- Otherwise, if their faction is going to win. else local bases = TitanPanelTitanBG_AB_NodesRequiredToWin(_player_enemy_faction); text = text .. "\n\n" .. TITANBG_COLOR_YELLOW .. TITANBG_AB_TO_WIN_ENEMY .. "\t" .. TITANBG_COLOR_WHITE .. bases; end -- Time left until the number of nodes needed increases. if (_timetonodeincrease > 0) then text = text .. TITANBG_COLOR_YELLOW .. " (" .. TITANBG_COLOR_RED .. SecondsToTimeAbbrev(_timetonodeincrease) .. TITANBG_COLOR_YELLOW .. ")"; end end end -- Print information on the user. if (sv_menu["D_TT_PlayerStats"]) then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_PLAYER_STATS; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_STANDING .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.player.standing; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_KILLINGBLOWS .. "\t" .. TITANBG_COLOR_GREEN .. _active.stats.player.killing_blows; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_KILLS .. "\t" .. TITANBG_COLOR_GREEN .. _active.stats.player.kills; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_DEATHS .. "\t" .. TITANBG_COLOR_RED .. _active.stats.player.deaths; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_BONUSHONOR .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.player.honor; end -- Print information on the locations in Alterac Valley. if (sv_menu["D_TT_LocationStats"] and bg.name == TITANBG_BG_AV) then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_LOCATION_STATS; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_GYASSAULTED .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.gy_assulted; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_GYDEFENDED .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.gy_defended; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_TASSAULTED .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.towers_assaulted; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_TDEFENDED .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.towers_defended; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_MCAPTURED .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.mines_captured; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_LKILLED .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.leaders_killed; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_SECOBJ .. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.av.secondary_obj; -- Print information on the locations in Warsong Gulch. elseif (sv_menu["D_TT_LocationStats"] and bg.name == TITANBG_BG_WSG) then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_LOCATION_STATS; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_FCAPTURED.. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.wsg.flag_captures; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_FRETURNED.. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.wsg.flag_returns; -- Print information on the locations in Arathi Basin. elseif (sv_menu["D_TT_LocationStats"] and bg.name == TITANBG_BG_AB) then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_LOCATION_STATS; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_BSASSULTED.. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.ab.bases_assulted; text = text .. "\n" .. TITANBG_COLOR_YELLOW .. TITANBG_PLAYER_BSDEFENDED.. "\t" .. TITANBG_COLOR_WHITE .. _active.stats.ab.bases_defended; end -- Print information on friends. if ( sv_menu["D_TT_Friends"] and _friendstring ~= "" ) then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_FRIENDS; text = text .. _friendstring; end -- Print information on incoming captures. if (sv_menu["D_TT_Capture"] and _active.captures ~= nil and table.getn(_active.captures) > 0 and GetBattlefieldWinner() == nil) then local capInfo = ""; for i = 1, table.getn(_active.captures) do local eta = ""; -- If the capture was done while the player was not there, show unknown. if (_active.captures[i].cap == 0) then eta = TITANBG_CAPTURE_UNKNOWN; -- Otherwise, show the timer. else eta = SecondsToTime(_active.captures[i].cap - GetTime()); -- If there is a capture imminent, indicate. if (eta == "") then eta = TITANBG_CAPTURE_IMINENT; end end -- If not unknown, display timers. if (eta ~= TITANBG_CAPTURE_UNKNOWN) then if (_active.captures[i].who == "Horde") then capInfo = capInfo .. "\n" .. TITANBG_COLOR_YELLOW .. _active.captures[i].name .. "\t" .. TITANBG_COLOR_RED .. eta; elseif (_active.captures[i].who == "Alliance") then capInfo = capInfo .. "\n" .. TITANBG_COLOR_YELLOW .. _active.captures[i].name .. "\t" .. TITANBG_COLOR_BLUE .. eta; end end end -- If any valid captures, print them. if (capInfo ~= "") then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_CAPTURE_TIMERS .. capInfo; end end -- Print information on flag caps. if (sv_menu["D_TT_FlagTracker"] and ((_active.stats.wsg.horde.player ~= "" and _active.stats.wsg.horde.player ~= nil) or (_active.stats.wsg.alliance.player ~= "" and _active.stats.wsg.alliance.player ~= nil)) and GetBattlefieldWinner() == nil) then text = text .. "\n\n" .. TITANBG_COLOR_WHITE .. TITANBG_FLAG_TRACKER; if (_active.stats.wsg.alliance.player ~= "" and _active.stats.wsg.alliance.player ~= nil) then local player = TitanBG_GetPlayerData(_active.stats.wsg.alliance.player .. "|Alliance"); if (player) then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. "(" .. TITANBG_COLOR_RED .. TITANBG_FLAG .. TITANBG_COLOR_YELLOW .. ") " .. TITANBG_COLOR_BLUE .. _active.stats.wsg.alliance.player .. "\t" .. TITANBG_COLOR_WHITE .. player.class; end end if (_active.stats.wsg.horde.player ~= "" and _active.stats.wsg.horde.player ~= nil) then local player = TitanBG_GetPlayerData(_active.stats.wsg.horde.player .. "|Horde"); if (player) then text = text .. "\n" .. TITANBG_COLOR_YELLOW .. "(" .. TITANBG_COLOR_BLUE .. TITANBG_FLAG .. TITANBG_COLOR_YELLOW .. ") " .. TITANBG_COLOR_RED .. _active.stats.wsg.horde.player .. "\t" .. TITANBG_COLOR_WHITE .. player.class; end end end -- Show hints. text = text .. "\n\n".. TITANBG_COLOR_RED .. TITANBG_SCOREFRAME_HINT; text = text .. "\n" .. TITANBG_COLOR_RED .. TITANBG_MINIMAP_HINT; end return text; end -- ####################### -- ## DISPLAY FUNCTIONS ## -- ####################### -- ## Prints a message to the user's console. function TitanPanelTitanBG_Print(s) if (s == nil) then s = "nil"; end if (s == true) then s = "true"; end if (s == false) then s = "false"; end DEFAULT_CHAT_FRAME:AddMessage("[TITANBG]: " .. s); end -- ## Prints a message to a popup frame. function TitanPanelTitanBG_MessagePopup(s, height) if (s == nil) then s = "nil"; end if (s == true) then s = "true"; end if (s == false) then s = "false"; end TitanPanelTitanBG_Message:SetHeight(height); TitanPanelTitanBG_Message_Text:SetText(s); TitanPanelTitanBG_Message:Show(); end -- ## Updates the on the screen display of the capture timers. function TitanPanelTitanBG_NT_UpdateCaptures(hide) local caps = 0; local display = 5; local shown = 1; local i = 1; -- Hide all of the frames first. if (hide) then for i = 1, 5 do getglobal("TitanPanelTitanBG_Display_Capture_" .. i):Hide(); end end if (sv_menu["AddonEnabled"] and (_player_zone == TITANBG_BG_AV or _player_zone == TITANBG_BG_AB) and GetBattlefieldWinner() == nil) then if (_active.captures ~= nil) then caps = table.getn(_active.captures); -- Number of captures. if (table.getn(_active.captures) > 5) then display = caps; end end -- If the player is printing the timers upside down. if (sv_menu["D_NT_TimersInvert"]) then local temp = i; i = display; display = temp; end while ((not sv_menu["D_NT_TimersInvert"] and i <= display) or (sv_menu["D_NT_TimersInvert"] and i >= display)) do local frame = "TitanPanelTitanBG_Display_Capture_" .. shown; -- If this slot is not active, turn it off. if (_active.captures[i] == nil or not sv_menu["D_OS_CaptureShow"]) then -- Blank out the points. getglobal(frame .. "_Icon"):SetTexCoord(TITANBG_ICON_CAP_BLANK[1], TITANBG_ICON_CAP_BLANK[2], TITANBG_ICON_CAP_BLANK[3], TITANBG_ICON_CAP_BLANK[4]); getglobal(frame .. "_Point"):SetText(""); getglobal(frame .. "_Time"):SetText(""); -- Hide the frame. getglobal(frame):Hide(); shown = shown + 1; -- Update this slot with a timer if this is a valid capture. else local eta = ""; -- If the capture was done while the player was not there, show unknown. if (_active.captures[i].cap == 0) then eta = TITANBG_CAPTURE_UNKNOWN; -- Otherwise, show the timer. else eta = SecondsToTime(_active.captures[i].cap - GetTime()); -- If there is a capture imminent, indicate. if (eta == "") then eta = TITANBG_CAPTURE_IMINENT; end end -- If not unknown, display timers. if (eta ~= TITANBG_CAPTURE_UNKNOWN) then local tOne, tTwo, tThree, tFour = WorldMap_GetPOITextureCoords(_active.captures[i].t); -- Update the points. getglobal(frame .. "_Icon"):SetTexCoord(tOne, tTwo, tThree, tFour); getglobal(frame .. "_Point"):SetText(_active.captures[i].name); getglobal(frame .. "_Time"):SetText(eta); -- Show the frame. getglobal(frame):Show(); shown = shown + 1; end end if (shown == 6) then break; end if (not sv_menu["D_NT_TimersInvert"]) then i = i + 1; else i = i - 1; end end end end -- ## Updates the on the screen display of the Warsong Gulch flag tracker. function TitanPanelTitanBG_NT_UpdateFlags() local i = 1; if (sv_menu["D_OS_WSG_Invert"]) then i = 2; end TitanPanelTitanBG_Display_Flag_1_ButtonText:SetText(""); TitanPanelTitanBG_Display_Flag_2_ButtonText:SetText(""); TitanPanelTitanBG_Display_Flag_1:Hide(); TitanPanelTitanBG_Display_Flag_2:Hide(); if (sv_menu["D_OS_WSG_Show"] and sv_menu["AddonEnabled"] and _player_zone == TITANBG_BG_WSG) then -- Collect alliance flag information. if (_active.stats.wsg.alliance.player ~= "" and _active.stats.wsg.alliance.player ~= nil) then local color = ""; local class = ""; local player = TitanBG_GetPlayerData(_active.stats.wsg.alliance.player .. "|Alliance"); if (player) then if (sv_menu["D_OS_WSG_AttachScore"]) then i = 1; end if (sv_menu["D_OS_WSG_ColorClass"]) then color = TITANBG_COLOR_CLASS[TITANBG_CLASS[player.class]].color; end if (sv_menu["D_OS_WSG_TextClass"]) then class = TITANBG_COLOR_WHITE .. " (" .. player.class .. ")"; end -- Set icon. if (sv_menu["D_OS_WSG_AttachScore"]) then getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Icon"):Hide(); else getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Icon"):SetTexture("Interface\\WorldStateFrame\\HordeFlag"); getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Icon"):Show(); end -- Set text. getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_ButtonText"):SetText(color .. _active.stats.wsg.alliance.player .. class); getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Button"):SetWidth(getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_ButtonText"):GetWidth()); -- Set on click script. if (sv_menu["D_OS_WSG_Click"]) then getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Button"):SetScript("OnClick", function() TargetByName(_active.stats.wsg.alliance.player, true); end); end getglobal("TitanPanelTitanBG_Display_Flag_" .. i):Show(); if (sv_menu["D_OS_WSG_Invert"]) then i = i - 1; else i = i + 1; end end end -- Collect horde flag information. if (_active.stats.wsg.horde.player ~= "" and _active.stats.wsg.horde.player ~= nil) then local color = ""; local class = ""; local player = TitanBG_GetPlayerData(_active.stats.wsg.horde.player .. "|Horde"); if (player) then if (sv_menu["D_OS_WSG_AttachScore"]) then i = 2; end if (sv_menu["D_OS_WSG_ColorClass"]) then color = TITANBG_COLOR_CLASS[TITANBG_CLASS[player.class]].color; end if (sv_menu["D_OS_WSG_TextClass"]) then class = TITANBG_COLOR_WHITE .. " (" ..player.class .. ")"; end -- Set icon. if (sv_menu["D_OS_WSG_AttachScore"]) then getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Icon"):Hide(); else getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Icon"):SetTexture("Interface\\WorldStateFrame\\AllianceFlag"); getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Icon"):Show(); end -- Set text. getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_ButtonText"):SetText(color .. _active.stats.wsg.horde.player .. class); getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Button"):SetWidth(getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_ButtonText"):GetWidth()); -- Set on click script. if (sv_menu["D_OS_WSG_Click"]) then getglobal("TitanPanelTitanBG_Display_Flag_" .. i .. "_Button"):SetScript("OnClick", function() TargetByName(_active.stats.wsg.horde.player, true); end); end getglobal("TitanPanelTitanBG_Display_Flag_" .. i):Show(); if (sv_menu["D_OS_WSG_Invert"]) then i = i - 1; else i = i + 1; end end end end end -- ############################# -- ## INITALISATION FUNCTIONS ## -- ############################# -- ## Performed when the addon is loaded. function TitanPanelTitanBGButton_OnLoad() this.registry = { id = TITAN_TITANBG_ID, menuText = TITAN_TITANBG_ID, tooltipTitle = TITANBG_TOOLTIP, buttonTextFunction = "TitanPanelTitanBGButton_SetButtonText", tooltipTextFunction = "TitanPanelTitanBGButton_SetTooltipText", icon = TITANBG_ARTWORK_PATH, iconWidth = 16, frequency = TITAN_TITANBG_FREQ; savedVariables = { ShowIcon = 1, } }; this:RegisterEvent("ADDON_LOADED"); this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("PLAYER_ENTERING_WORLD"); this:RegisterEvent("FRIENDLIST_UPDATE"); this:RegisterEvent("ZONE_CHANGED"); this:RegisterEvent("ZONE_CHANGED_NEW_AREA"); this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("UPDATE_BATTLEFIELD_STATUS"); this:RegisterEvent("ZONE_CHANGED_INDOORS"); this:RegisterEvent("BATTLEFIELDS_SHOW"); this:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE"); this:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE"); -- Register slash commands. SLASH_TITANBG1 = "/titanbg"; SLASH_TITANBG2 = "/tbg"; -- Register slash command handler. SlashCmdList["TITANBG"] = function(command) if (not command or command == "") then TitanBG_Menu_Toggle(); elseif (string.find(command, " ")) then local c = string.sub(command, 0, string.find(command, " ") - 1); local val = string.sub(command, string.find(command, " ") + 1, string.len(command)); if (string.lower(c) == "flag") then if ((string.lower(val) == "a" or string.lower(val) == "alliance") and _active.stats.wsg.alliance.player ~= "" and _active.stats.wsg.alliance.player ~= nil) then TargetByName(_active.stats.wsg.alliance.player, true); elseif ((string.lower(val) == "h" or string.lower(val) == "horde") and _active.stats.wsg.horde.player ~= "" and _active.stats.wsg.horde.player ~= nil) then TargetByName(_active.stats.wsg.horde.player, true); end end end end -- Store any existing captures if the player is in a battleground. if (TitanPanelTitanBG_IsBattleground(_player_zone)) then _active_init_stored = false; TitanPanelTitanBG_CheckMap(_player_zone, true); _active_init_stored = true; end -- Shows the status of each queue point returned by the server. If the slot is not taken up by a battleground, -- it will return the zone the user is currently in. -- !! DEBUG START -- DEFAULT_CHAT_FRAME:AddMessage("Printing queue status ... "); -- for i = 1, MAX_BATTLEFIELD_QUEUES do -- local _, name, _ = GetBattlefieldStatus(i); -- DEFAULT_CHAT_FRAME:AddMessage("BG = " .. name); -- end -- !! DEBUG END end -- ## Resets battleground status information to original values. function TitanPanelTitanBG_ResetBattlegroundInformation() -- Battleground information variables. _bgs = { queue = 0; -- The number of battegrounds that are in queue or active status. -- Table which links the blizzard battleground index to the correct information. blizzard = { [1] = nil, [2] = nil, [3] = nil, }; -- Allows looping of the battlegrounds numerically. index = { [1] = TITANBG_BG_AV, [2] = TITANBG_BG_WSG, [3] = TITANBG_BG_AB, }; -- Battleground information stored by name. names = { [TITANBG_BG_AV] = { index = 0, short = TITANBG_BG_AV_SHORT, name = TITANBG_BG_AV, status = TITANBG_BG_STATUS_NONE, instance = 0, expires = 0, open_instances = 0, open_age = 0, update = nil, sound = false; sound_timer = 0; }, [TITANBG_BG_WSG] = { index = 0, short = TITANBG_BG_WSG_SHORT, name = TITANBG_BG_WSG, status = TITANBG_BG_STATUS_NONE, instance = 0, expires = 0, open_instances = 0, open_age = 0, update = nil, sound = false; sound_timer = 0; }, [TITANBG_BG_AB] = { index = 0, short = TITANBG_BG_AB_SHORT, name = TITANBG_BG_AB, status = TITANBG_BG_STATUS_NONE, instance = 0, expires = 0, open_instances = 0, open_age = 0, update = nil, sound = false; sound_timer = 0; }, } }; end -- ## Resets information on the current active battleground. function TitanPanelTitanBG_ResetActiveInformation() _active = { stats = { bg = { name = "", index = "", instance = "", win = "", run = 0, total = 0, horde = 0, alliance = 0, }, player = { standing = 0, kills = 0, deaths = 0, killing_blows = 0, honor = 0, }, av = { gy_assulted = 0, gy_defended = 0, towers_assaulted = 0, towers_defended = 0, mines_captured = 0, leaders_killed = 0, secondary_obj = 0, }, wsg = { flag_captures = 0, flag_returns = 0, alliance = { msg = "", flag = 1, player = "", }, horde = { msg = "", flag = 1, player = "", }, players = { }; }, ab = { bases_assulted = 0, bases_defended = 0, bases_horde = 0; bases_alliance = 0; }, }, captures = { }, }; end -- ## Resets player information. function TitanPanelTitanBG_ResetPlayerInformation() _player_name = UnitName("player"); if (UnitFactionGroup("player") == TITANBG_ALLIANCE) then _player_faction = TITANBG_ALLIANCE; _player_enemy_faction = TITANBG_HORDE; else _player_faction = TITANBG_HORDE; _player_enemy_faction = TITANBG_ALLIANCE; end _player_realm = GetRealmName(); end -- ## Stores the original functions. function TitanPanelTitanBG_StoreFunctions() -- Hook battlemap showing and hiding function to TitanBG. Hook_WorldStateFrame_ToggleMinimap = WorldStateFrame_ToggleMinimap; Hook_RepopMe = RepopMe; Hook_DialogDeathAccept = StaticPopupDialogs["DEATH"].OnAccept; Hook_DialogDeathCancel = StaticPopupDialogs["DEATH"].OnCancel; Hook_DialogBattlefieldEntryAccept = StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnAccept; Hook_DialogDeathOnShow = StaticPopupDialogs["DEATH"].OnShow; Hook_AcceptBattlefieldPort = AcceptBattlefieldPort; Hook_PlaySound = PlaySound; Hook_StaticPopup_Show = StaticPopup_Show; Hook_MiniMapBattlefieldFrame = MiniMapBattlefieldFrame:GetScript("OnClick"); -- If the battlefield minimap hasn't been loaded, load it. if (not BattlefieldMinimap) then BattlefieldMinimap_LoadUI(); end if (BattlefieldMinimapCloseButton) then Hook_BattlefieldMinimapCloseButton = BattlefieldMinimapCloseButton:GetScript("OnClick"); end Hook_StaticPopup1Button2OnClick = StaticPopup1Button2:GetScript("OnClick"); -- Hook functions from other addons that may be overwritten. -- Titan Panel Hook_TitanPanel_AddButton = TitanPanel_AddButton; Hook_TitanPanel_RemoveButton = TitanPanel_RemoveButton; Hook_TitanPanelButton_OnClick = TitanPanelButton_OnClick; -- Titan Honor Plus Hook_TitanPanelHonorPlus_ToggleVar_AutoBGMap = TitanPanelHonorPlus_ToggleVar_AutoBGMap; Hook_TitanPanelHonorPlus_ToggleVar_AutoJoinBG = TitanPanelHonorPlus_ToggleVar_AutoJoinBG; Hook_TitanHonorPlus_CheckBGConfirm = TitanHonorPlus_CheckBGConfirm; Hook_TitanHonorPlus_StaticPopup_OnHide = TitanHonorPlus_StaticPopup_OnHide; Hook_TitanPanelHonorPlus_ToggleVar_AutoRelease = TitanPanelHonorPlus_ToggleVar_AutoRelease; end -- ## Overwrites the similar settings in other addons. function TitanPanelTitanBG_HookFunctions() TitanPanelTitanBG_ToggleOverwriteOtherSettings(); if (sv_menu["AddonEnabled"]) then -- Overwrite the Titan Panel show and hide functions for each addon, so that we know when our addon is enabled. TitanPanel_AddButton = function(id) if (id == TITAN_TITANBG_ID) then sv_menu["AddonEnabled"] = true; TitanPanelTitanBG_HookFunctions(); end return Hook_TitanPanel_AddButton(id); end TitanPanel_RemoveButton = function(id) if (id == TITAN_TITANBG_ID) then sv_menu["AddonEnabled"] = false; TitanPanelTitanBG_HookFunctions(); end return Hook_TitanPanel_RemoveButton(id); end -- Switch tooltip views if necessary. TitanPanelButton_OnClick = function(button, isChildButton) if (button == "RightButton" or (button == "LeftButton" and not _titan_titanbg_leftclick)) then return Hook_TitanPanelButton_OnClick(button, isChildButton); end local id = TitanUtils_Ternary(isChildButton, TitanUtils_GetParentButtonID(), TitanUtils_GetButtonID()); if (id == TITAN_TITANBG_ID) then if (not IsShiftKeyDown() and IsControlKeyDown()) then if (_display_queue_tt) then _display_queue_tt = false; else _display_queue_tt = true; end TitanPanelButton_SetTooltip(TITAN_TITANBG_ID); GameTooltip:Show(); end end _titan_titanbg_leftclick = false; end -- Hook blizzard functions. -- Do not play the battleground ready sound using this function. PlaySound = function(sound, titanbg) if (sound ~= "PVPTHROUGHQUEUE" or titanbg) then return Hook_PlaySound(sound); end end -- Allow modification of the ready queue popup. StaticPopup_Show = function(which, text_arg1, text_arg2, data) local dialog = nil; if (which ~= "CONFIRM_BATTLEFIELD_ENTRY" or (which == "CONFIRM_BATTLEFIELD_ENTRY" and not sv_menu["B_HideJoinPopup"])) then dialog = Hook_StaticPopup_Show(which, text_arg1, text_arg2, data); dialog.text_arg1 = text_arg1; dialog.text_arg2 = text_arg2; end if (which == "CONFIRM_BATTLEFIELD_ENTRY" and dialog) then local text = getglobal(dialog:GetName() .. "Text"); local pop = { }; -- dialog:SetScript("OnHide", function() -- while (i <= table.getn(_popups)) do -- if (_popups[i].dialog.text_arg1 == this.text_arg1) then -- table.remove(_popups, i); -- break; -- end -- end -- end); pop.dialog = dialog; pop.text = text; pop.which = which; pop.data = data; pop.text_arg1 = text_arg1; pop.text_arg2 = text_arg2; table.insert(_popups, pop); TitanPanelTitanBG_StoreBattlegroundInformation(); end return dialog; end -- Allow blizzard functions to release or ressurect players, without being interfered with by the addon. StaticPopupDialogs["DEATH"].OnAccept = function() _blizzard_releasesoul = true; Hook_DialogDeathAccept(); _blizzard_releasesoul = false; end StaticPopupDialogs["DEATH"].OnCancel = function(data, reason) _blizzard_releasesoul = true; Hook_DialogDeathCancel(data, reason); _blizzard_releasesoul = false; end -- Allow blizzard functions to join battlegrounds without interferance. StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnAccept = function(data) _blizzard_interactbg = true; Hook_DialogBattlefieldEntryAccept(data); _blizzard_interactbg = false; end -- Does not show the ressurect functions if it should be hidden. StaticPopupDialogs["DEATH"].OnShow = function() if (sv_menu["B_AutoRelease"] and TitanPanelTitanBG_IsBattleground(_player_zone)) then if ((sv_menu["B_ReleaseCheck"] and not HasSoulstone()) or not sv_menu["B_ReleaseCheck"]) then TitanPanelTitanBG_RepopMe(); end else Hook_DialogDeathOnShow(); end end -- When you shift click the battleground icon, shows or hides the battleground minimap for the duration -- of your stay in the zone. MiniMapBattlefieldFrame:SetScript("OnClick", function() if (IsShiftKeyDown()) then if ((sv_menu["B_AutoShowBGMinimap"] and BattlefieldMinimap:IsShown()) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and BattlefieldMinimap:IsShown())) then _blizzard_manualshowbg = "HIDE"; elseif ((not sv_menu["B_AutoShowBGMinimap"] and not BattlefieldMinimap:IsShown()) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and not BattlefieldMinimap:IsShown())) then _blizzard_manualshowbg = "SHOW"; else _blizzard_manualshowbg = nil; end end return Hook_MiniMapBattlefieldFrame(); end ); -- If the battlefield minimap hasn't been loaded, load it. if (not BattlefieldMinimap) then BattlefieldMinimap_LoadUI(); end if (BattlefieldMinimapCloseButton) then -- When you click the close button on the battleground minimap, closes the minimap for the duration of -- the player's stay in the zone. BattlefieldMinimapCloseButton:SetScript("OnClick", function() if ((sv_menu["B_AutoShowBGMinimap"] and BattlefieldMinimap:IsShown()) or (not TitanPanelTitanBG_IsBattleground(_player_zone) and attlefieldMinimap:IsShown())) then _blizzard_manualshowbg = "HIDE"; else _blizzard_manualshowbg = nil; end return Hook_BattlefieldMinimapCloseButton(); end ); end -- When you press the 'Hide' button, it pauses the auto join timer. StaticPopup1Button2:SetScript("OnClick", function() -- If the user want to pause the auto join timer. if (sv_menu["B_AutoJoinBG"] and _autojoin_paused == 0) then _autojoin_paused = _autojoin_time - GetTime(); end return Hook_StaticPopup1Button2OnClick(); end ); -- Run data collection. TitanPanelTitanBG_ZonesChanged(); else -- Unhook other addon functions. TitanPanelButton_OnClick = Hook_TitanPanelButton_OnClick; -- Unhook blizzard functions. PlaySound = Hook_PlaySound; StaticPopup_Show = Hook_StaticPopup_Show; StaticPopupDialogs["DEATH"].OnAccept = Hook_DialogDeathAccept; StaticPopupDialogs["DEATH"].OnCancel = Hook_DialogDeathCancel; StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnAccept = Hook_DialogBattlefieldEntryAccept; StaticPopupDialogs["DEATH"].OnShow = Hook_DialogDeathOnShow; MiniMapBattlefieldFrame:SetScript("OnClick", Hook_MiniMapBattlefieldFrame); -- If the battlefield minimap hasn't been loaded, load it. if (not BattlefieldMinimap) then BattlefieldMinimap_LoadUI(); end if (BattlefieldMinimapCloseButton) then BattlefieldMinimapCloseButton:SetScript("OnClick", Hook_BattlefieldMinimapCloseButton); end StaticPopup1Button2:SetScript("OnClick", Hook_StaticPopup1Button2OnClick); -- Reset variables. _autojoin_bg = ""; _autojoin_time = 0; _autojoin_paused = 0; _autoleave_time = 0; _autoleave_paused = 0; -- Update interface. TitanPanelTitanBG_NT_UpdateCaptures(true); TitanPanelTitanBG_NT_UpdateFlags(); TitanPanelTitanBG_ToggleMiniMapIcon(); TitanPanelTitanBG_ToggleLockCaptures(); BattlefieldFrame_UpdateStatus(); end end