--[[ Name: Glory-2.0 Revision: $Rev: 11849 $ Author(s): ckknight (ckknight@gmail.com) Elkano (elkano@gmx.de) hyperactiveChipmunk (hyperactiveChipmunk@gmail.com) Website: http://ckknight.wowinterface.com/ Documentation: http://wiki.wowace.com/index.php/Glory-2.0 SVN: http://svn.wowace.com/root/trunk/GloryLib/Glory-2.0 Description: A library for PvP and Battlegrounds. Dependencies: AceLibrary, Babble-Zone-2.0, Deformat-2.0, AceEvent-2.0, AceConsole-2.0 (optional) Notes: To use this library, the per-character saved variable Glory2DB must be available. ]] local MAJOR_VERSION = "Glory-2.0" local MINOR_VERSION = "$Revision: 11849 $" if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end if not AceLibrary:HasInstance("Babble-Zone-2.0") then error(MAJOR_VERSION .. " requires Babble-Zone-2.0") end if not AceLibrary:HasInstance("Deformat-2.0") then error(MAJOR_VERSION .. " requires Deformat-2.0") end if not AceLibrary:HasInstance("AceEvent-2.0") then error(MAJOR_VERSION .. " requires AceEvent-2.0") end local table_setn do local version = GetBuildInfo() if string.find(version, "^2%.") then -- 2.0.0 table_setn = function() end else table_setn = table.setn end end local math_mod = math.fmod or math.mod local new, del do local list = setmetatable({}, {__mode="k"}) function new() local t = next(list) if t then list[t] = nil return t else return {} end end function del(t) setmetatable(t, nil) for k in pairs(t) do t[k] = nil end table_setn(t, 0) list[t] = true end end local PATTERN_HORDE_FLAG_PICKED_UP, PATTERN_HORDE_FLAG_DROPPED, PATTERN_HORDE_FLAG_CAPTURED, PATTERN_ALLIANCE_FLAG_PICKED_UP, PATTERN_ALLIANCE_FLAG_DROPPED, PATTERN_ALLIANCE_FLAG_CAPTURED, FACTION_DEFILERS, FACTION_FROSTWOLF_CLAN, FACTION_WARSONG_OUTRIDERS, FACTION_LEAGUE_OF_ARATHOR, FACTION_STORMPIKE_GUARD, FACTION_SILVERWING_SENTINELS local PATTERN_GWSUII_SCORE, PATTERN_GWSUII_BASES local BGObjectiveDescriptions, BGChatAnnouncements, BGPatternReplacements, BGAcronyms, BattlefieldZoneObjectiveTimes, BattlefieldZoneResourceData --hC local deformat = AceLibrary("Deformat-2.0") local Z = AceLibrary("Babble-Zone-2.0") local AceEvent = AceLibrary("AceEvent-2.0") local WARSONG_GULCH = Z["Warsong Gulch"] local ALTERAC_VALLEY = Z["Alterac Valley"] local ARATHI_BASIN = Z["Arathi Basin"] local locale = GetLocale() if locale ~= "deDE" then locale = "enUS" end if locale == "enUS" then PATTERN_HORDE_FLAG_PICKED_UP = "The Horde [Ff]lag was picked up by ([^!]+)!" PATTERN_HORDE_FLAG_DROPPED = "The Horde [Ff]lag was dropped by (%a+)!" PATTERN_HORDE_FLAG_CAPTURED = "(%a+) captured the Horde [Ff]lag!" PATTERN_ALLIANCE_FLAG_PICKED_UP = "The Alliance [Ff]lag was picked up by (%a+)!" PATTERN_ALLIANCE_FLAG_DROPPED = "The Alliance [Ff]lag was dropped by (%a+)!" PATTERN_ALLIANCE_FLAG_CAPTURED = "(%a+) captured the Alliance [Ff]lag!" FACTION_DEFILERS = "Defilers" FACTION_FROSTWOLF_CLAN = "Frostwolf Clan" FACTION_WARSONG_OUTRIDERS = "Warsong Outriders" FACTION_LEAGUE_OF_ARATHOR = "League of Arathor" FACTION_STORMPIKE_GUARD = "Stormpike Guard" FACTION_SILVERWING_SENTINELS = "Silverwing Sentinels" BGObjectiveDescriptions = { ALLIANCE_CONTROLLED = "Alliance Controlled", HORDE_CONTROLLED = "Horde Controlled", IN_CONFLICT = "In Conflict", UNCONTROLLED = "Uncontrolled", DESTROYED = "Destroyed", } BGChatAnnouncements = { BGObjectiveClaimedAnnouncements = { PATTERN_OBJECTIVE_CLAIMED_AB = "claims the ([%w ]+).* (%a+) will control", }, BGObjectiveAttackedAnnouncements = { PATTERN_OBJECTIVE_ATTACKED_AB = "assaulted the ([%w ]+)", PATTERN_OBJECTIVE_ATTACKED_AV0 = "The ([%w ]+) is under attack", PATTERN_OBJECTIVE_ATTACKED_AV1 = "^([%w ]+) is under attack", }, BGObjectiveDefendedAnnouncements = { PATTERN_OBJECTIVE_DEFENDED_AB = "defended the ([%w ]+)", }, BGObjectiveCapturedAnnouncements = { PATTERN_OBJECTIVE_CAPTURED_AB = "The (%a+) has taken the ([%w ]+)", PATTERN_OBJECTIVE_CAPTURED_AV0 = "The ([%w ]+) was taken by the (%a+)", PATTERN_OBJECTIVE_CAPTURED_AV1 = "^([%w ]+) was taken by the (%a+)", PATTERN_OBJECTIVE_CAPTURED_AV2 = "the ([%w ]+) is.*MINE", --and the Irondeep Mine is...MINE! PATTERN_OBJECTIVE_CAPTURED_AV3 = "claims the ([%w ]+)", --Snivvle claims the Coldtooth Mine! }, BGObjectiveDestroyedAnnouncements = { PATTERN_OBJECTIVE_DESTROYED_AV0 = "The ([%w ]+) was destroyed", PATTERN_OBJECTIVE_DESTROYED_AV1 = "^([%w ]+) was destroyed", }, } BGPatternReplacements = { ["mine"] = "gold mine", ["southern farm"] = "farm" } BGAcronyms = { [ALTERAC_VALLEY] = "AV", [ARATHI_BASIN] = "AB", [WARSONG_GULCH] = "WSG", } PATTERN_GWSUII_SCORE = "(%d+/%d+)" --for lifting the score out of the first return value of GetWorldStateUIInfo(index) PATTERN_GWSUII_BASES = "Bases: (%d+)" --for lifting the number of bases held in Arathi Basin PATTERN_GWSUII_RESOURCES = "Resources: (%d+)" --for lifting the number of bases held in Arathi Basin PATTERN_OBJECTIVE_HOLDER = "([%w ]+) Controlled" elseif locale == "deDE" then PATTERN_HORDE_FLAG_PICKED_UP = "([^!]+) hat die [Ff]lagge der Horde aufgenommen!" PATTERN_HORDE_FLAG_DROPPED = "(%a+) hat die [Ff]lagge der Horde fallen lassen!" PATTERN_HORDE_FLAG_CAPTURED = "(%a+) hat die [Ff]lagge der Horde errungen!" PATTERN_ALLIANCE_FLAG_PICKED_UP = "(%a+) hat die [Ff]lagge der Allianz aufgenommen!" PATTERN_ALLIANCE_FLAG_DROPPED = "(%a+) hat die [Ff]lagge der Allianz fallen lassen!" PATTERN_ALLIANCE_FLAG_CAPTURED = "(%a+) hat die [Ff]lagge der Allianz errungen!" FACTION_DEFILERS = "Die Entweihten" FACTION_FROSTWOLF_CLAN = "Frostwolfklan" FACTION_WARSONG_OUTRIDERS = "Warsongvorhut" FACTION_LEAGUE_OF_ARATHOR = "Liga von Arathor" FACTION_STORMPIKE_GUARD = "Stormpike Garde" FACTION_SILVERWING_SENTINELS = "Silverwing Schildwache" BGObjectiveDescriptions = { ALLIANCE_CONTROLLED = "Kontrolliert von der Allianz", HORDE_CONTROLLED = "Kontrolliert von der Horde", IN_CONFLICT = "Umk\195\164mpft", UNCONTROLLED = "Unkontrolliert", DESTROYED = "Zerst\195\182rt", } BGChatAnnouncements = { BGObjectiveClaimedAnnouncements = { PATTERN_OBJECTIVE_CLAIMED_AB0 = "hat das (.+) besetzt.* die (%a+) in", PATTERN_OBJECTIVE_CLAIMED_AB1 = "hat den (.+) besetzt.* die (%a+) in", PATTERN_OBJECTIVE_CLAIMED_AB2 = "hat die (.+) besetzt.* die (%a+) in", PATTERN_OBJECTIVE_CLAIMED_AB3 = "hat (S\195\164gewerk) besetzt.* die (%a+) in", PATTERN_OBJECTIVE_CLAIMED_AV0 = "hat den (.+) besetzt.* erlangt die (%a+) die Kontrolle" }, BGObjectiveAttackedAnnouncements = { PATTERN_OBJECTIVE_ATTACKED_AB0 = "das (.+) angegriffen", PATTERN_OBJECTIVE_ATTACKED_AB1 = "den (.+) angegriffen", PATTERN_OBJECTIVE_ATTACKED_AB2 = "die (.+) angegriffen", PATTERN_OBJECTIVE_ATTACKED_AV0 = "Das (.+) wird angegriffen.*wird die (%a+) es", PATTERN_OBJECTIVE_ATTACKED_AV1 = "Der (.+) wird angegriffen.*wird die (%a+) ihn", PATTERN_OBJECTIVE_ATTACKED_AV2 = "Die (.+) wird angegriffen.*wird die (%a+) sie", }, BGObjectiveDefendedAnnouncements = { PATTERN_OBJECTIVE_DEFENDED_AB0 = "das (.+) verteidigt", PATTERN_OBJECTIVE_DEFENDED_AB1 = "den (.+) verteidigt", PATTERN_OBJECTIVE_DEFENDED_AB2 = "die (.+) verteidigt", }, BGObjectiveCapturedAnnouncements = { PATTERN_OBJECTIVE_CAPTURED_AB0 = "Die (%a+) hat das (.+) eingenommen", PATTERN_OBJECTIVE_CAPTURED_AB1 = "Die (%a+) hat den (.+) eingenommen", PATTERN_OBJECTIVE_CAPTURED_AB2 = "Die (%a+) hat die (.+) eingenommen", PATTERN_OBJECTIVE_CAPTURED_AV0 = "Das (.+) wurde von der (%a+) erobert", PATTERN_OBJECTIVE_CAPTURED_AV1 = "Der (.+) wurde von der (%a+) erobert", PATTERN_OBJECTIVE_CAPTURED_AV2 = "geh\195\182rt jetzt die (.+)!", }, BGObjectiveDestroyedAnnouncements = { PATTERN_OBJECTIVE_DESTROYED_AV0 = "Der (.+) wurde von der (%a+) zerst\195\182rt", }, } BGPatternReplacements = { ["Schmiede"] = "Schmied", ["Mine"] = "Goldmine", ["s\195\188dlichen Hof"] = "Hof", } BGAcronyms = { [ALTERAC_VALLEY] = "AV", -- CHECK [ARATHI_BASIN] = "AB", -- CHECK [WARSONG_GULCH] = "WSG", -- CHECK } PATTERN_GWSUII_SCORE = "(%d+/%d+)" --for lifting the score out of the first return value of GetWorldStateUIInfo(index) PATTERN_GWSUII_BASES = "Basen: (%d+)" --for lifting the number of bases held in Arathi Basin PATTERN_GWSUII_RESOURCES = "Ressourcen: (%d+)" --for lifting the number of bases held in Arathi Basin -- CHECK PATTERN_OBJECTIVE_HOLDER = "Kontrolliert von der ([%w ]+)" end BattlefieldZoneObjectiveTimes = { [ARATHI_BASIN] = 62.5, [ALTERAC_VALLEY] = 302.5, } BattlefieldZoneResourceData = { [ARATHI_BASIN] = { [0]=0, 5/6, 10/9, 5/3, 10/3, 30, 2000 } } local Glory = {} local events = {} AceEvent:embed(events) local _,race = UnitRace("player") local isHorde = (race == "Orc" or race == "Troll" or race == "Tauren" or race == "Scourge") local playerName = UnitName("player") local playerRealm = GetRealmName() local enemyList = {} local function CheckNewWeek(self) local _,_,lastWeekHonor,_ = GetPVPLastWeekStats() if lastWeekHonor ~= self.data.lastWeek then self.data.lastWeek = lastWeekHonor events:TriggerEvent("Glory_NewWeek") end end local function CheckNewDay(self) local _,_,yesterdayHonor = GetPVPYesterdayStats() local lifetimeHK,_,_ = GetPVPLifetimeStats() if yesterdayHonor ~= self.data.yesterday and not (yesterdayHonor == 0 and lifetimeHK == 0) then self.data.yesterday = yesterdayHonor self.data.hks = {} self.data.todayHK = 0 self.data.todayHKHonor = 0 self.data.todayBonusHonor = 0 self.data.todayDeaths = 0 events:TriggerEvent("Glory_NewDay") end end local function IncreaseHKs(self, person) self.data.todayHK = self.data.todayHK + 1 self.data.hks[person] = (self.data.hks[person] or 0) + 1 return self.data.hks[person] end local function IncreaseHKHonor(self, amount) self.data.todayHKHonor = self.data.todayHKHonor + amount end local function IncreaseBonusHonor(self, amount) self.data.todayBonusHonor = self.data.todayBonusHonor + amount end local function IncreaseBattlegroundsWins(self) if self:IsInAlteracValley() then self.data.avWin = self.data.avWin + 1 events:TriggerEvent("Glory_BGWinAV") elseif self:IsInArathiBasin() then self.data.abWin = self.data.abWin + 1 events:TriggerEvent("Glory_BGWinAB") else self.data.wsgWin = self.data.wsgWin + 1 events:TriggerEvent("Glory_BGWinWSG") end events:TriggerEvent("Glory_BGWin") end local function IncreaseBattlegroundsLosses(self) if self:IsInAlteracValley() then self.data.avLoss = self.data.avLoss + 1 events:TriggerEvent("Glory_BGLossAV") elseif self:IsInArathiBasin() then self.data.abLoss = self.data.abLoss + 1 events:TriggerEvent("Glory_BGLossAB") else self.data.wsgLoss = self.data.wsgLoss + 1 events:TriggerEvent("Glory_BGLossWSG") end events:TriggerEvent("Glory_BGLoss") end local function IncreaseDeaths(self) self.data.todayDeaths = self.data.todayDeaths + 1 events:TriggerEvent("Glory_Death") end local db local function VerifyData(self) if not self.data then if type(Glory2DB) ~= "table" then Glory2DB = {} end db = Glory2DB if type(db[MAJOR_VERSION]) ~= "table" then db[MAJOR_VERSION] = {} end self.data = db[MAJOR_VERSION] elseif db ~= Glory2DB then local old = db local new = Glory2DB if type(new) ~= "table" then Glory2DB = old else for k in pairs(old) do if not new[k] then new[k] = old[k] elseif new[k].time == nil then new[k] = old[k] elseif old[k].time == nil then -- keep new elseif new[k].time < old[k].time then new[k] = old[k] end end db = new self.data = db[MAJOR_VERSION] end end if not self.data.hks then self.data.hks = {} end if not self.data.todayDeaths then self.data.todayDeaths = 0 end if not self.data.todayHK then self.data.todayHK = 0 end if not self.data.todayHKHonor then self.data.todayHKHonor = 0 end if not self.data.todayBonusHonor then self.data.todayBonusHonor = 0 end if not self.data.wsgWin then self.data.wsgWin = 0 end if not self.data.wsgLoss then self.data.wsgLoss = 0 end if not self.data.abWin then self.data.abWin = 0 end if not self.data.abLoss then self.data.abLoss = 0 end if not self.data.avWin then self.data.avWin = 0 end if not self.data.avLoss then self.data.avLoss = 0 end if not self.data.yesterday then self.data.yesterday = 0 end if not self.data.lastWeek then self.data.lastWeek = 0 end CheckNewDay(self) CheckNewWeek(self) events:UNIT_PVP_UPDATE() end function events:ADDON_LOADED() VerifyData(Glory) end function events:VARIABLES_LOADED() VerifyData(Glory) end function events:PLAYER_LOGOUT() Glory.data.time = time() end function events:CHAT_MSG_COMBAT_HONOR_GAIN(text) CheckNewDay(Glory) local name, rank, honor = deformat(text, COMBATLOG_HONORGAIN) if name then local realm = enemyList[name] or playerRealm if realm ~= playerRealm then name = name .. "-" .. realm end local kills = IncreaseHKs(Glory, name) local factor factor = (11 - kills) / 10 if factor < 0 then factor = 0 end local realHonor = ceil(honor * factor) IncreaseHKHonor(Glory, realHonor) events:TriggerEvent("Glory_GainHK", rank, name, realHonor, kills) return end local bonus = deformat(text, COMBATLOG_HONORAWARD) if bonus then bonus = tonumber(bonus) IncreaseBonusHonor(Glory, bonus) events:TriggerEvent("Glory_GainBonusHonor", bonus) end end function events:CHAT_MSG_BG_SYSTEM_NEUTRAL(text) if string.find(string.lower(text), string.lower(VICTORY_TEXT0)) then if isHorde then IncreaseBattlegroundsWins(Glory) else IncreaseBattlegroundsLosses(Glory) end elseif string.find(string.lower(text), string.lower(VICTORY_TEXT1)) then if not isHorde then IncreaseBattlegroundsWins(Glory) else IncreaseBattlegroundsLosses(Glory) end end end function events:CHAT_MSG_BG_SYSTEM_HORDE(text) if Glory:IsInWarsongGulch() then local _, _, hordeFC = string.find(text, PATTERN_ALLIANCE_FLAG_PICKED_UP) if hordeFC then Glory.hordeFC = hordeFC events:TriggerEvent("Glory_AllianceFlagPickedUp", Glory.hordeFC) events:TriggerEvent("Glory_AllianceFlagCarrierUpdate", Glory.hordeFC) if not isHorde then events:TriggerEvent("Glory_FriendlyFlagPickedUp", Glory.hordeFC) events:TriggerEvent("Glory_FriendlyFlagCarrierUpdate", Glory.hordeFC) else events:TriggerEvent("Glory_HostileFlagPickedUp", Glory.hordeFC) events:TriggerEvent("Glory_HostileFlagCarrierUpdate", Glory.hordeFC) end return end if string.find(text, PATTERN_ALLIANCE_FLAG_CAPTURED) then local hordeFC = Glory.hordeFC Glory.allianceFC = nil Glory.hordeFC = nil events:TriggerEvent("Glory_AllianceFlagCaptured", hordeFC) if not isHorde then events:TriggerEvent("Glory_FriendlyFlagCaptured", hordeFC) else events:TriggerEvent("Glory_HostileFlagCaptured", hordeFC) end events:TriggerEvent("Glory_FriendlyFlagCarrierUpdate", nil) events:TriggerEvent("Glory_HostileFlagCarrierUpdate", nil) events:TriggerEvent("Glory_AllianceFlagCarrierUpdate", nil) events:TriggerEvent("Glory_HordeFlagCarrierUpdate", nil) return end if string.find(text, PATTERN_HORDE_FLAG_DROPPED) then local allianceFC = Glory.allianceFC Glory.allianceFC = nil events:TriggerEvent("Glory_HordeFlagDropped", allianceFC) if isHorde then events:TriggerEvent("Glory_FriendlyFlagDropped", allianceFC) events:TriggerEvent("Glory_HostileFlagCarrierUpdate", nil) else events:TriggerEvent("Glory_HostileFlagDropped", allianceFC) events:TriggerEvent("Glory_FriendlyFlagCarrierUpdate", nil) end return end elseif Glory:IsInArathiBasin() or Glory:IsInAlteracValley() then events:BattlefieldObjectiveEventProcessing(text) end end function events:CHAT_MSG_BG_SYSTEM_ALLIANCE(text) if Glory:IsInWarsongGulch() then local _, _, allianceFC = string.find(text, PATTERN_HORDE_FLAG_PICKED_UP) if allianceFC then Glory.allianceFC = allianceFC events:TriggerEvent("Glory_HordeFlagPickedUp", Glory.allianceFC) if isHorde then events:TriggerEvent("Glory_FriendlyFlagPickedUp", Glory.allianceFC) events:TriggerEvent("Glory_HostileFlagCarrierUpdate", Glory.allianceFC) else events:TriggerEvent("Glory_HostileFlagPickedUp", Glory.allianceFC) events:TriggerEvent("Glory_FriendlyFlagCarrierUpdate", Glory.allianceFC) end return end if string.find(text, PATTERN_HORDE_FLAG_CAPTURED) then local alliance = Glory.allianceFC Glory.allianceFC = nil Glory.hordeFC = nil events:TriggerEvent("Glory_HordeFlagCaptured", allianceFC) if isHorde then events:TriggerEvent("Glory_FriendlyFlagCaptured", allianceFC) else events:TriggerEvent("Glory_HostileFlagCaptured", allianceFC) end events:TriggerEvent("Glory_FriendlyFlagCarrierUpdate", nil) events:TriggerEvent("Glory_HostileFlagCarrierUpdate", nil) events:TriggerEvent("Glory_AllianceFlagCarrierUpdate", nil) events:TriggerEvent("Glory_HordeFlagCarrierUpdate", nil) return end if string.find(text, PATTERN_ALLIANCE_FLAG_DROPPED) then local hordeFC = Glory.hordeFC Glory.hordeFC = nil events:TriggerEvent("Glory_AllianceFlagDropped", hordeFC) if not isHorde then events:TriggerEvent("Glory_FriendlyFlagDropped", hordeFC) events:TriggerEvent("Glory_HostileFlagCarrierUpdate", nil) else events:TriggerEvent("Glory_HostileFlagDropped", hordeFC) events:TriggerEvent("Glory_FriendlyFlagCarrierUpdate", nil) end return end elseif Glory:IsInArathiBasin() or Glory:IsInAlteracValley() then events:BattlefieldObjectiveEventProcessing(text) end end function events:CHAT_MSG_MONSTER_YELL(text) if Glory:IsInAlteracValley() then if string.find(string.lower(text), string.lower(VICTORY_TEXT0)) then if isHorde then IncreaseBattlegroundsWins(Glory) else IncreaseBattlegroundsLosses(Glory) end elseif string.find(string.lower(text), string.lower(VICTORY_TEXT1)) then if not isHorde then IncreaseBattlegroundsWins(Glory) else IncreaseBattlegroundsLosses(Glory) end else events:BattlefieldObjectiveEventProcessing(text) end end end function events:BattlefieldObjectiveEventProcessing(text) local node, faction for k, pattern in pairs(BGChatAnnouncements.BGObjectiveClaimedAnnouncements) do _, _, node, faction = string.find(text, pattern) if node then if node == FACTION_ALLIANCE or node == FACTION_HORDE then node, faction = faction, node end events:OnObjectiveClaimed(BGPatternReplacements[node] or node, faction) events:TriggerEvent("Glory_ObjectiveClaimed", BGPatternReplacements[node] or node, faction) return end end for k, pattern in pairs(BGChatAnnouncements.BGObjectiveCapturedAnnouncements) do _, _, node, faction = string.find(text, pattern) if node then if node == FACTION_ALLIANCE or node == FACTION_HORDE then node, faction = faction, node end events:OnObjectiveCaptured(BGPatternReplacements[node] or node, faction) events:TriggerEvent("Glory_ObjectiveCaptured", BGPatternReplacements[node] or node, faction) return end end for k, pattern in pairs(BGChatAnnouncements.BGObjectiveAttackedAnnouncements) do _, _, node = string.find(text, pattern) if node then events:OnObjectiveAttacked(BGPatternReplacements[node] or node) events:TriggerEvent("Glory_ObjectiveAttacked", BGPatternReplacements[node] or node) return end end for k, pattern in pairs(BGChatAnnouncements.BGObjectiveDefendedAnnouncements) do _, _, node = string.find(text, pattern) if node then events:OnObjectiveDefended(BGPatternReplacements[node] or node) events:TriggerEvent("Glory_ObjectiveDefended", BGPatternReplacements[node] or node) return end end for k, pattern in pairs(BGChatAnnouncements.BGObjectiveDestroyedAnnouncements) do _, _, node = string.find(text, pattern) if node then events:OnObjectiveDestroyed(BGPatternReplacements[node] or node) events:TriggerEvent("Glory_ObjectiveDestroyed", BGPatternReplacements[node] or node) return end end end function events:CHAT_MSG_COMBAT_FACTION_CHANGE(text) local faction, rep = deformat(text, FACTION_STANDING_INCREASED) if faction and rep then if faction == FACTION_DEFILERS or faction == FACTION_FROSTWOLF_CLAN or faction == FACTION_WARSONG_OUTRIDERS or faction == FACTION_LEAGUE_OF_ARATHOR or faction == FACTION_STORMPIKE_GUARD or faction == FACTION_SILVERWING_SENTINELS then events:TriggerEvent("Glory_FactionGain", faction, rep) end end end function events:CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS() Glory.lastHostileTime = GetTime() end events.CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE = events.CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS function events:UNIT_PVP_UPDATE() if not UnitIsPVP("player") and Glory.permaPvP then Glory.permaPvP = false events:TriggerEvent("Glory_UpdatePermanentPvP", Glory.permaPvP) end if UnitIsPVP("player") or Glory:IsInBattlegrounds() then Glory.pvpTime = GetTime() events:TriggerEvent("Glory_UpdatePvPCooldown", Glory:GetPvPCooldown()) else events:TriggerEvent("Glory_UpdatePvPCooldown", 0) end end function events:UPDATE_WORLD_STATES() local resData = BattlefieldZoneResourceData[Glory:GetActiveBattlefieldZone()] if resData and Glory:GetNumAllianceBases() and Glory:GetNumHordeBases() then -- Common local goalResources = resData[table.getn(resData)] -- Alliance _, _, resources = string.find(Glory:GetAllianceScoreString(), "(%d+)/") bases = Glory:GetNumAllianceBases() if resources and bases and (resources ~= Glory.aLastResources or bases ~= Glory.aLastBases) then Glory.aResourceTTV = (goalResources - resources) / resData[bases] Glory.aLastResources = resources Glory.aLastBases = bases Glory.aLastUpdate = GetTime() end -- Horde _, _, resources = string.find(Glory:GetHordeScoreString(), "(%d+)/") bases = Glory:GetNumHordeBases() if resources and bases and (resources ~= Glory.hLastResources or bases ~= Glory.hLastBases) then Glory.hResourceTTV = (goalResources - resources) / resData[bases] Glory.hLastResources = resources Glory.hLastBases = bases Glory.hLastUpdate = GetTime() end end end function events:PLAYER_ENTERING_WORLD() events:UNIT_PVP_UPDATE() SetMapToCurrentZone() if Glory:IsInBattlegrounds() and GetNumMapLandmarks() > 0 then events:InitializeBattlefieldObjectives() else events:ClearBattlefieldObjectives() end end function events:PLAYER_DEAD() if GetTime() <= Glory.lastHostileTime + 15 then IncreaseDeaths(Glory) end end function events:UPDATE_BATTLEFIELD_SCORE() for k,v in pairs(enemyList) do enemyList[k] = nil end for i = 1, GetNumBattlefieldScores() do local name, _, _, _, _, faction = GetBattlefieldScore(i) if faction == (isHorde and 1 or 0) then local _,_,realName, realm = string.find(name, "(.*)%-(.*)") if not realName then realName = name realm = playerRealm end enemyList[realName] = realm end end end function Glory:IsInBattlegrounds() -- local zone = GetRealZoneText() -- return zone == WARSONG_GULCH or zone == ARATHI_BASIN or zone == ALTERAC_VALLEY return (MiniMapBattlefieldFrame.status == "active") end function Glory:IsInWarsongGulch() return GetRealZoneText() == WARSONG_GULCH end function Glory:IsInArathiBasin() return GetRealZoneText() == ARATHI_BASIN end function Glory:IsInAlteracValley() return GetRealZoneText() == ALTERAC_VALLEY end local function copyTable(to, from) for k, v in pairs(from) do to[k] = v end return to end local tdate, start, done local firstbg = { [2006] = 2, } local function GetBattlegroundWeek(bgdate) Glory:assert(bgdate.year >= 2006, "Cannot calculate battleground weekends for dates before year 2006. A date in year %s was given.", bgdate.year) local bgweekday = math_mod(bgdate.wday + 4, 7) + 1 local bgweek = math.floor((bgdate.yday + 6 - bgweekday) / 7) + 1 if not firstbg[bgdate.year] then if not tdate then tdate = {} end tdate = copyTable(tdate, bgdate) tdate.day = 1 tdate.month = 1 tdate = date("*t", time(tdate)) local d = math_mod(tdate.wday + 4, 7) + 1 tdate.day = 31 tdate.month = 12 tdate.year = tdate.year - 1 tdate = date("*t", time(tdate)) local _, _, bg = GetBattlegroundWeek(tdate) if d == 1 then firstbg[bgdate.year] = math_mod(bg, 4) + 1 else firstbg[bgdate.year] = bg end end local bg = math_mod(bgweek -1 + firstbg[bgdate.year], 4) + 1 return bgweekday, bgweek, bg end local function GetCurrentOrNextBattlegroundWeekend(week) local now = date("*t") local bgweekday, bgweek, bg = GetBattlegroundWeek(now) local bginweeks if bg <= week then bginweeks = week - bg else bginweeks = week + 4 - bg end if not start then start = {} end start = copyTable(start, now) start.day = start.day + 4 - bgweekday + 7 * bginweeks start.hour = 0 start.min = 0 start.sec = 0 start = date("*t", time(start)) if not done then done = {} end done = copyTable(done, now) done.day = done.day + 7 - bgweekday + 7 * bginweeks done.hour = 23 done.min = 59 done.sec = 59 done = date("*t", time(done)) local sMonth local dMonth if start.month == done.month then sMonth = date("%B", time(start)) dMonth = sMonth else sMonth = date("%b", time(start)) dMonth = date("%b", time(done)) end return sMonth, start.day, dMonth, done.day, time(start) <= time(now) and time(now) <= time(done) end function Glory:GetCurrentOrNextArathiWeekend() return GetCurrentOrNextBattlegroundWeekend(4) end function Glory:GetCurrentOrNextWarsongWeekend() return GetCurrentOrNextBattlegroundWeekend(3) end function Glory:GetCurrentOrNextAlteracWeekend() return GetCurrentOrNextBattlegroundWeekend(2) end function Glory:_TogglePVP() self.permaPvP = not self.permaPvP if not UnitIsPVP("player") then self.permaPvP = true end events:TriggerEvent("Glory_UpdatePermanentPvP", self.permaPvP) self.pvpTime = GetTime() end function Glory:GetTodayHKs(person, realm) if person then self:argCheck(person, 2, "string") if realm and realm ~= playerRealm then self:argCheck(realm, 3, "string") person = person .. "-" .. realm end return self.data.hks[person] or 0 else return self.data.todayHK end end function Glory:GetTodayDeaths() return self.data.todayDeaths end function Glory:GetTodayHKHonor() return self.data.todayHKHonor end function Glory:GetTodayBonusHonor() return self.data.todayBonusHonor end function Glory:GetTodayHonor() return self.data.todayHKHonor + self.data.todayBonusHonor end function Glory:GetBattlegroundsWins() return self.data.wsgWin + self.data.abWin + self.data.avWin end function Glory:GetWarsongGulchWins() return self.data.wsgWin end function Glory:GetArathiBasinWins() return self.data.abWin end function Glory:GetAlteracValleyWins() return self.data.avWin end function Glory:GetBattlegroundsLosses() return self.data.wsgLoss + self.data.abLoss + self.data.avLoss end function Glory:GetWarsongGulchLosses() return self.data.wsgLoss end function Glory:GetArathiBasinLosses() return self.data.abLoss end function Glory:GetAlteracValleyLosses() return self.data.avLoss end function Glory:ResetBGScores() self.data.wsgWin = 0 self.data.wsgLoss = 0 self.data.abWin = 0 self.data.abLoss = 0 self.data.avWin = 0 self.data.avLoss = 0 events:TriggerEvent("Glory_BGResetScores") end function Glory:IsPermanentPvP() return self.permaPvP end function Glory:GetPvPCooldown() if self:IsInBattlegrounds() or self.permaPvP then return 300 end local t = self.pvpTime - GetTime() + 300 if t < 0 or not UnitIsPVP("player") then return 0 else return t end end function Glory:GetRankLimitInfo() local level = UnitLevel("player") if level < 10 then return NONE, 0 elseif level <= 32 then return GetPVPRankInfo(7) elseif level <= 37 then return GetPVPRankInfo(8) elseif level <= 40 then return GetPVPRankInfo(9) elseif level <= 43 then return GetPVPRankInfo(10) elseif level <= 45 then return GetPVPRankInfo(11) elseif level <= 47 then return GetPVPRankInfo(12) elseif level <= 50 then return GetPVPRankInfo(13) elseif level <= 52 then return GetPVPRankInfo(14) elseif level <= 54 then return GetPVPRankInfo(15) elseif level <= 56 then return GetPVPRankInfo(16) elseif level <= 58 then return GetPVPRankInfo(17) else return GetPVPRankInfo(18) end end function Glory:GetRatingLimit() local level = UnitLevel("player") if level < 10 then return 0 elseif level <= 29 then return 6500 elseif level <= 35 then return 7150 + (level - 30) * 975 elseif level <= 39 then return 13325 + (level - 36) * 1300 elseif level <= 43 then return 18850 + (level - 40) * 1625 elseif level <= 52 then return 26000 + (level - 44) * 2275 elseif level <= 59 then return 46800 + (level - 53) * 2600 else return 65000 end end function Glory:GetStanding(name) name = name or playerName self:argCheck(name, 2, "string") for i=1, GetNumBattlefieldScores() do if name == GetBattlefieldScore(i) then return i end end end function Glory:GetKillingBlows(name) name = name or playerName self:argCheck(name, 2, "string") for i=1, GetNumBattlefieldScores() do local unit, killingBlows = GetBattlefieldScore(i) if unit == name then return killingBlows end end end function Glory:GetHonorableKills(name) name = name or playerName self:argCheck(name, 2, "string") for i=1, GetNumBattlefieldScores() do local unit, _, honorableKills = GetBattlefieldScore(i) if unit == name then return honorableKills end end end function Glory:GetDeaths(name) name = name or playerName self:argCheck(name, 2, "string") for i=1, GetNumBattlefieldScores() do local unit, _, _, deaths = GetBattlefieldScore(i) if unit == name then return deaths end end end function Glory:GetBonusHonor(name) name = name or playerName self:argCheck(name, 2, "string") for i=1, GetNumBattlefieldScores() do local unit, _, _, _, bonusHonor = GetBattlefieldScore(i) if unit == name then return bonusHonor end end end function Glory:GetActiveBattlefieldZone() for i = 1, MAX_BATTLEFIELD_QUEUES do local status, mapName = GetBattlefieldStatus(i) if status == "active" then return mapName end end end function Glory:GetActiveBattlefieldUniqueID() for i = 1, MAX_BATTLEFIELD_QUEUES do local status, mapName, instanceID = GetBattlefieldStatus(i) if status == "active" then return mapName .. " " .. instanceID end end end local function queuedBattlefieldIndicesIter(_, position) position = position + 1 while position <= MAX_BATTLEFIELD_QUEUES do local status, name = GetBattlefieldStatus(position) if status == "queued" then return position, name end position = position + 1 end return nil end function Glory:IterateQueuedBattlefieldZones() return queuedBattlefieldIndicesIter, nil, 0 end local function GetHolder(self, node) local poi = self:NodeToPOI(node) if self:IsUncontrolled(node) then return BGObjectiveDescriptions.UNCONTROLLED end if poi and not self:IsDestroyed(poi) then _, description = GetMapLandmarkInfo(poi) if string.find(description, PATTERN_OBJECTIVE_HOLDER) then local _, _, faction = string.find(description, PATTERN_OBJECTIVE_HOLDER) return faction end end end function Glory:IsBattlefieldObjective(node) self:argCheck(node, 2, "string", "number") local poi = self:NodeToPOI(node) if poi and (GetHolder(self, node) or self:IsInConflict(node) or self:IsDestroyed(node)) then return true end return false end function Glory:IsInConflict(node) self:argCheck(node, 2, "string", "number") local poi = self:NodeToPOI(node) if poi then local _, description = GetMapLandmarkInfo(poi) if description == BGObjectiveDescriptions.IN_CONFLICT then return true end end return false end function Glory:IsAllianceControlled(node) self:argCheck(node, 2, "string", "number") local poi = self:NodeToPOI(node) if poi then local _, description = GetMapLandmarkInfo(poi) if description == BGObjectiveDescriptions.ALLIANCE_CONTROLLED then return true end end return false end function Glory:IsHordeControlled(node) self:argCheck(node, 2, "string", "number") local poi = self:NodeToPOI(node) if poi then local _, description = GetMapLandmarkInfo(poi) if description == BGObjectiveDescriptions.HORDE_CONTROLLED then return true end end return false end if isHorde then Glory.IsFriendlyControlled = Glory.IsHordeControlled Glory.IsHostileControlled = Glory.IsAllianceControlled else Glory.IsFriendlyControlled = Glory.IsAllianceControlled Glory.IsHostileControlled = Glory.IsHordeControlled end function Glory:IsUncontrolled(node) self:argCheck(node, 2, "string", "number") local poi = self:NodeToPOI(node) if poi then local _, description = GetMapLandmarkInfo(poi) if description == BGObjectiveDescriptions.UNCONTROLLED then return true end end return end function Glory:IsDestroyed(node) self:argCheck(node, 2, "string", "number") local poi = self:NodeToPOI(node) if poi then local _, description = GetMapLandmarkInfo(poi) if description == BGObjectiveDescriptions.DESTROYED then return true end end return end function Glory:GetTimeAttacked(node) self:argCheck(node, 2, "string", "number") return self.battlefieldObjectiveStatus[node].timeAttacked end function Glory:GetTimeToCapture(node) self:argCheck(node, 2, "string", "number") local t = BattlefieldZoneObjectiveTimes[self:GetActiveBattlefieldZone()] or 0 return self.battlefieldObjectiveStatus and self.battlefieldObjectiveStatus[node] and self.battlefieldObjectiveStatus[node].timeAttacked and t - GetTime() + self.battlefieldObjectiveStatus[node].timeAttacked end function Glory:GetName(node) self:argCheck(node, 2, "string", "number") return self.battlefieldObjectiveStatus[node].name end function Glory:GetDefender(node) self:argCheck(node, 2, "string", "number") return self.battlefieldObjectiveStatus[node].defender end function Glory:GetAttacker(node) self:argCheck(node, 2, "string", "number") return self.battlefieldObjectiveStatus[node].attacker end local function objectiveNodesIter(t, position) local k = next(t, position) while k ~= nil and type(k) ~= "number" do k = next(t, position) end return k end function Glory:IterateObjectiveNodes() return objectiveNodesIter, self.battlefieldObjectiveStatus, nil end local function sortedObjectiveNodesIter(t, position) position = position + 1 if position <= table.getn(t) then return position, t[position] else t = del(t) return nil end end local mySort function Glory:IterateSortedObjectiveNodes() local t = new() for poi in pairs(self.battlefieldObjectiveStatus) do if type(poi) == "number" then table.insert(t, poi) end end if not mySort then mySort = function(a, b) return self.battlefieldObjectiveStatus[a].ypos and self.battlefieldObjectiveStatus[b].ypos and self.battlefieldObjectiveStatus[a].ypos < self.battlefieldObjectiveStatus[b].ypos end end table.sort(t, mySort) return sortedObjectiveNodesIter, t, 0 end function events:ClearBattlefieldObjectives() for i = 1, table.getn(Glory.battlefieldObjectiveStatus) do local o = Glory.battlefieldObjectiveStatus[i] if Glory.battlefieldObjectiveStatus[o.node] == o then Glory.battlefieldObjectiveStatus[o.node] = nil end Glory.battlefieldObjectiveStatus[i] = del(o) end for k in pairs(Glory.battlefieldObjectiveStatus) do Glory.battlefieldObjectiveStatus[k] = del(Glory.battlefieldObjectiveStatus[k]) k = nil end end function events:InitializeBattlefieldObjectives() events:ClearBattlefieldObjectives() SetMapToCurrentZone() local numPOIS = GetNumMapLandmarks() for i=1, numPOIS do if Glory:IsBattlefieldObjective(i) then local node, _, _, _, y = GetMapLandmarkInfo(i) Glory.battlefieldObjectiveStatus[i] = { name = node, ypos = y, defender = GetHolder(Glory, i), inConflict = Glory:IsInConflict(i), isDestroyed = Glory:IsDestroyed(i), } Glory.battlefieldObjectiveStatus[node] = Glory.battlefieldObjectiveStatus[i] end end end function events:OnObjectiveClaimed(node, faction) local poi = Glory:NodeToPOI(node) if poi then if not next(Glory.battlefieldObjectiveStatus) then events:InitializeBattlefieldObjectives() end local n = Glory.battlefieldObjectiveStatus[poi] if n then n.attacker = faction n.inConflict = true n.timeAttacked = GetTime() end end end function events:OnObjectiveCaptured(node, faction) local poi = Glory:NodeToPOI(node) if poi then if not next(Glory.battlefieldObjectiveStatus) then events:InitializeBattlefieldObjectives() end local n = Glory.battlefieldObjectiveStatus[poi] if n then n.defender = GetHolder(Glory, node) or faction n.attacker = nil n.inConflict = nil n.timeAttacked = nil end end end function events:OnObjectiveAttacked(node) local poi = Glory:NodeToPOI(node) if poi then if not next(Glory.battlefieldObjectiveStatus) then events:InitializeBattlefieldObjectives() end local n = Glory.battlefieldObjectiveStatus[poi] if n then if n.defender == FACTION_ALLIANCE then n.attacker = FACTION_HORDE else n.attacker = FACTION_ALLIANCE end n.inConflict = true n.timeAttacked = GetTime() end end end function events:OnObjectiveDefended(node) local poi = Glory:NodeToPOI(node) if poi then if not next(Glory.battlefieldObjectiveStatus) then events:InitializeBattlefieldObjectives() end local n = Glory.battlefieldObjectiveStatus[poi] if n then n.attacker = nil n.inConflict = nil n.timeAttacked = nil end end end function events:OnObjectiveDestroyed(node) local poi = Glory:NodeToPOI(node) if poi then if not next(Glory.battlefieldObjectiveStatus) then events:InitializeBattlefieldObjectives() end local n = Glory.battlefieldObjectiveStatus[poi] if n then n.isDestroyed = true n.defender = nil n.attacker = nil n.inConflict = nil n.timeAttacked = nil end end end function Glory:GetAllianceFlagCarrier() return self.allianceFC end function Glory:GetHordeFlagCarrier() return self.hordeFC end function Glory:TargetAllianceFlagCarrier() if self.allianceFC then TargetByName(self.allianceFC) end end function Glory:TargetHordeFlagCarrier() if self.hordeFC then TargetByName(self.hordeFC) end end if isHorde then Glory.GetFriendlyFlagCarrier = Glory.GetHordeFlagCarrier Glory.GetHostileFlagCarrier = Glory.GetAllianceFlagCarrier Glory.TargetFriendlyFlagCarrier = Glory.TargetHordeFlagCarrier Glory.TargetHostileFlagCarrier = Glory.TargetAllianceFlagCarrier else Glory.GetFriendlyFlagCarrier = Glory.GetAllianceFlagCarrier Glory.GetHostileFlagCarrier = Glory.GetHordeFlagCarrier Glory.TargetFriendlyFlagCarrier = Glory.TargetAllianceFlagCarrier Glory.TargetHostileFlagCarrier = Glory.TargetHordeFlagCarrier end function Glory:GetFlagCarrier(faction) self:argCheck(faction, 2, "string", "number") if faction == FACTION_ALLIANCE or faction == "Alliance" or faction == 1 then return self.allianceFC else return self.hordeFC end end function Glory:TargetFlagCarrier(faction) self:argCheck(faction, 2, "string", "number") if faction == FACTION_ALLIANCE or faction == "Alliance" or faction == 1 then if self.allianceFC then TargetByName(self.allianceFC) end elseif self.hordeFC then TargetByName(self.hordeFC) end end function Glory:GetNumAllianceBases() local _, s = GetWorldStateUIInfo(1) if s then local _, _, bases = string.find(s, PATTERN_GWSUII_BASES) return tonumber(bases) end end function Glory:GetNumHordeBases() local _, s = GetWorldStateUIInfo(2) if s then local _, _, bases = string.find(s, PATTERN_GWSUII_BASES) return tonumber(bases) end end if isHorde then Glory.GetNumFriendlyBases = Glory.GetNumHordeBases Glory.GetNumHostileBases = Glory.GetNumAllianceBases else Glory.GetNumFriendlyBases = Glory.GetNumAllianceBases Glory.GetNumHostileBases = Glory.GetNumHordeBases end function Glory:GetNumBases(team) self:argCheck(team, 2, "string", "number") if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then return self:GetNumAllianceBases() else return self:GetNumHordeBases() end end function Glory:GetNumAllianceResources() local _, s = GetWorldStateUIInfo(1) if s then local _, _, resources = string.find(s, PATTERN_GWSUII_RESOURCES) return tonumber(resources) end end function Glory:GetNumHordeResources() local _, s = GetWorldStateUIInfo(2) if s then local _, _, resources = string.find(s, PATTERN_GWSUII_RESOURCES) return tonumber(resources) end end if isHorde then Glory.GetNumFriendlyResources = Glory.GetNumHordeResources Glory.GetNumHostileResources = Glory.GetNumAllianceResources else Glory.GetNumFriendlyResources = Glory.GetNumAllianceResources Glory.GetNumHostileResources = Glory.GetNumHordeResources end function Glory:GetNumTeamResources(team) self:argCheck(team, 2, "string", "number") if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then return self:GetNumAllianceResources() else return self:GetNumHordeResources() end end function Glory:GetAllianceTTV() return self.aResourceTTV - GetTime() + self.aLastUpdate end function Glory:GetHordeTTV() return self.hResourceTTV - GetTime() + self.hLastUpdate end function Glory:GetTeamTTV(team) self:argCheck(team, 2, "string", "number") if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then return self:GetAllianceTTV() else return self:GetHordeTTV() end end if isHorde then Glory.GetFriendlyTTV = Glory.GetHordeTTV Glory.GetHostileTTV = Glory.GetAllianceTTV else Glory.GetFriendlyTTV = Glory.GetAllianceTTV Glory.GetHostileTTV = Glory.GetHordeTTV end function Glory:GetAllianceScoreString() local _, s = GetWorldStateUIInfo(1) if s then local _, _, scoreString = string.find(s, PATTERN_GWSUII_SCORE) return scoreString end end function Glory:GetHordeScoreString() local _, s = GetWorldStateUIInfo(2) if s then local _, _, scoreString = string.find(s, PATTERN_GWSUII_SCORE) return scoreString end end if isHorde then Glory.GetFriendlyScoreString = Glory.GetHordeScoreString Glory.GetHostileScoreString = Glory.GetAllianceScoreString else Glory.GetFriendlyScoreString = Glory.GetAllianceScoreString Glory.GetHostileScoreString = Glory.GetHordeScoreString end function Glory:GetTeamScoreString(team) if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then return self:GetAllianceScoreString() else return self:GetHordeScoreString() end end function Glory:GetNumAlliancePlayers() local numPlayers = 0 for i = 1, GetNumBattlefieldScores() do local _, _, _, _, _, faction = GetBattlefieldScore(i) if faction == 1 then numPlayers = numPlayers + 1 end end return numPlayers end function Glory:GetNumHordePlayers() local numPlayers = 0 for i = 1, GetNumBattlefieldScores() do local _, _, _, _, _, faction = GetBattlefieldScore(i) if faction == 0 then numPlayers = numPlayers + 1 end end return numPlayers end if isHorde then Glory.GetNumFriendlyPlayers = Glory.GetNumHordePlayers Glory.GetNumHostilePlayers = Glory.GetNumAlliancePlayers else Glory.GetNumFriendlyPlayers = Glory.GetNumAlliancePlayers Glory.GetNumHostilePlayers = Glory.GetNumHordePlayers end function Glory:GetNumPlayers(team) self:argCheck(team, 2, "string", "number") if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then return self:GetNumAlliancePlayers() else return self:GetNumHordePlayers() end end function Glory:SafeNodeToPOI(node) if type(node) == "number" and node > 0 and node <= GetNumMapLandmarks() then return node elseif type(node) == "string" then for i = 1, GetNumMapLandmarks() do if string.lower(node) == string.lower(GetMapLandmarkInfo(i)) then return i end end elseif type(node) ~= "number" then self:error("Bad argument #2 to `NodeToPOI' (string or number expected, got %s)", tostring(type(node))) else self:error("Bad argument #2 to `NodeToPOI' (out of bounds: [1, %d] expected, got %d)", GetNumMapLandmarks(), node) end end function Glory:NodeToPOI(node) if type(node) == "number" then return node end if type(node) == "string" then for i = 1, GetNumMapLandmarks() do if string.lower(node) == string.lower(GetMapLandmarkInfo(i)) then return i end end end end function Glory:GetBGAcronym(bgName) self:argCheck(bgName, 2, "string") return BGAcronyms[bgName] or bgName end function Glory:GetFactionColor(faction) self:argCheck(faction, 2, "string", "number", "nil") if faction then if faction == "Alliance" or faction == FACTION_ALLIANCE or faction == 1 then faction = "ALLIANCE" elseif faction == "Horde" or faction == FACTION_HORDE or faction == 0 or faction == 2 then faction = "HORDE" end local cti = ChatTypeInfo["BG_SYSTEM_" .. faction] if cti then return cti.r, cti.g, cti.b end end return 0.7, 0.7, 0.7 end function Glory:GetFactionHexColor(faction) local r, g, b = self:GetFactionColor(faction) return string.format("%02X%02X%02X", 255*r, 255*g, 255*b) end local function activate(self, oldLib, oldDeactivate) Glory = self if oldLib then self.registry = oldLib.registry else self.registry = {} end events:CancelAllScheduledEvents() events:UnregisterAllEvents() events:RegisterEvent("ADDON_LOADED") events:RegisterEvent("VARIABLES_LOADED") events:RegisterEvent("PLAYER_LOGOUT") events:RegisterEvent("CHAT_MSG_COMBAT_HONOR_GAIN") events:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") events:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE") events:RegisterEvent("CHAT_MSG_MONSTER_YELL") events:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE") events:RegisterEvent("CHAT_MSG_COMBAT_FACTION_CHANGE") events:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE") events:RegisterEvent("CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS") events:RegisterEvent("UPDATE_WORLD_STATES") events:RegisterEvent("PLAYER_ENTERING_WORLD") events:RegisterEvent("UNIT_PVP_UPDATE") events:RegisterEvent("PLAYER_DEAD") events:RegisterEvent("UPDATE_BATTLEFIELD_SCORE") events:VARIABLES_LOADED() events:ScheduleRepeatingEvent(function() if self:IsInBattlegrounds() then RequestBattlefieldScoreData() end end, 15) if not oldLib then local old_TogglePVP = TogglePVP function TogglePVP() AceLibrary(MAJOR_VERSION):_TogglePVP() old_TogglePVP() end end self.battlefieldObjectiveStatus = new() self.pvpTime = 0 self.currentBonusHonor = 0 self.lastHostileTime = 0 self.aLastResources = 0 self.hLastResources = 0 self.aLastBases = 0 self.hLastBases = 0 self.aLastUpdate = 0 self.hLastUpdate = 0 self.aResourceTTV = 0 self.hResourceTTV = 0 SLASH_TARFLAG1 = "/tarflag" SLASH_TARFLAG2 = "/tflag" SlashCmdList.TARFLAG = function() self:TargetHostileFlagCarrier() end if oldDeactivate then oldDeactivate(oldLib) end end local function external(self, major, instance) if major == "AceConsole-2.0" then local print = print if DEFAULT_CHAT_FRAME then function print(key, value) DEFAULT_CHAT_FRAME:AddMessage("|cffffff7f" .. key .. ": [|r" .. value .. "|cffffff7f]|r") end end instance.RegisterChatCommand(self, { "/glory", "/glorylib" }, { name = MAJOR_VERSION .. "." .. string.gsub(MINOR_VERSION, ".-(%d+).*", "%1"), desc = "A library for PvP and Battlegrounds.", type = "group", args = { bg = { name = "Battlegrounds", desc = "Show battlegrounds information", type = "execute", func = function() print("BG Score", self:GetBattlegroundsWins() .. "-" .. self:GetBattlegroundsLosses()) print("WSG Score", self:GetWarsongGulchWins() .. "-" .. self:GetWarsongGulchLosses()) print("AB Score", self:GetArathiBasinWins() .. "-" .. self:GetArathiBasinLosses()) print("AV Score", self:GetAlteracValleyWins() .. "-" .. self:GetAlteracValleyLosses()) if self:IsInBattlegrounds() then print("Current", self:GetActiveBattlegroundUniqueID()) print("Standing", self:GetStanding()) print("Killing Blows", self:GetKillingBlows()) print("Honorable Kills", self:GetHonorableKills()) print("Deaths", self:GetDeaths()) print("Bonus Honor", self:GetBonusHonor()) if self:IsInWarsongGulch() then print("Friendly FC", (self:GetFriendlyFlagCarrier() or NONE)) print("Hostile FC", (self:GetHostileFlagCarrier() or NONE)) else print("Friendly Bases", self:GetNumFriendlyBases()) print("Hostile Bases", self:GetNumHostileBases()) print("Friendly Resources", self:GetNumFriendlyResources()) print("Hostile Resources", self:GetNumHostileResources()) end print("Friendly Players", self:GetNumFriendlyPlayers()) print("Hostile Players", self:GetNumHostilePlayers()) end end }, honor = { name = "Honor", desc = "Show honor information", type = "execute", func = function() print("Today's HKs", self:GetTodayHKs()) print("Today's Deaths", self:GetTodayDeaths()) print("Today's HK Honor", self:GetTodayHKHonor()) print("Today's Bonus Honor", self:GetTodayBonusHonor()) print("Today's Honor", self:GetTodayHonor()) local s if self:IsPermanentPvP() then s = "Flagged" elseif self:IsInBattlegrounds() then s = "Battlegrounds" else local t = self:GetPvPCooldown() if t == 0 then s = "None" else local min = floor(t / 60) local sec = floor(mod(t, 60)) s = format("%d:%02d", min, sec) end end print("PvP Cooldown", s) print("Rank Limit", string.format("%s (%d)", self:GetRankLimitInfo())) print("Rating Limit", self:GetRatingLimit()) end } } }, "GLORY") end end AceLibrary:Register(Glory, MAJOR_VERSION, MINOR_VERSION, activate, nil, external)