vanilla-wow-addons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 local MAJOR_VERSION = "1.0"
2 local MINOR_VERSION = tonumber(string.sub("$Revision: 2231 $", 12, -3))
3 if GloryLib and GloryLib.versions[MAJOR_VERSION] and GloryLib.versions[MAJOR_VERSION].minor >= MINOR_VERSION then
4 return
5 end
6  
7 local compost
8 if CompostLib then
9 compost = CompostLib:GetInstance('compost-1')
10 end
11  
12 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
13  
14 local PATTERN_GWSUII_SCORE, PATTERN_GWSUII_BASES
15 local BGObjectiveDescriptions, BGChatAnnouncements, BGPatternReplacements, BGAcronyms, BattlefieldZoneObjectiveTimes, BattlefieldZoneResourceData --hC
16  
17 local babbleCore = BabbleLib:GetInstance('Core 1.1')
18 local babbleZone = BabbleLib:GetInstance('Zone 1.1')
19  
20 local WARSONG_GULCH = babbleZone:GetLocalized("WARSONG_GULCH")
21 local ALTERAC_VALLEY = babbleZone:GetLocalized("ALTERAC_VALLEY")
22 local ARATHI_BASIN = babbleZone:GetLocalized("ARATHI_BASIN")
23  
24 local locale = GetLocale()
25 if locale ~= "deDE" then
26 locale = "enUS"
27 end
28  
29 if locale == "enUS" then
30 PATTERN_HORDE_FLAG_PICKED_UP = "The Horde [Ff]lag was picked up by ([^!]+)!"
31 PATTERN_HORDE_FLAG_DROPPED = "The Horde [Ff]lag was dropped by (%a+)!"
32 PATTERN_HORDE_FLAG_CAPTURED = "(%a+) captured the Horde [Ff]lag!"
33 PATTERN_ALLIANCE_FLAG_PICKED_UP = "The Alliance [Ff]lag was picked up by (%a+)!"
34 PATTERN_ALLIANCE_FLAG_DROPPED = "The Alliance [Ff]lag was dropped by (%a+)!"
35 PATTERN_ALLIANCE_FLAG_CAPTURED = "(%a+) captured the Alliance [Ff]lag!"
36  
37 FACTION_DEFILERS = "Defilers"
38 FACTION_FROSTWOLF_CLAN = "Frostwolf Clan"
39 FACTION_WARSONG_OUTRIDERS = "Warsong Outriders"
40  
41 FACTION_LEAGUE_OF_ARATHOR = "League of Arathor"
42 FACTION_STORMPIKE_GUARD = "Stormpike Guard"
43 FACTION_SILVERWING_SENTINELS = "Silverwing Sentinels"
44  
45 BGObjectiveDescriptions = {
46 ALLIANCE_CONTROLLED = "Alliance Controlled",
47 HORDE_CONTROLLED = "Horde Controlled",
48 IN_CONFLICT = "In Conflict",
49 UNCONTROLLED = "Uncontrolled",
50 DESTROYED = "Destroyed",
51 }
52  
53 BGChatAnnouncements = {
54 BGObjectiveClaimedAnnouncements = {
55 PATTERN_OBJECTIVE_CLAIMED_AB = "claims the ([%w ]+).* (%a+) will control",
56 },
57  
58 BGObjectiveAttackedAnnouncements = {
59 PATTERN_OBJECTIVE_ATTACKED_AB = "assaulted the ([%w ]+)",
60 PATTERN_OBJECTIVE_ATTACKED_AV0 = "The ([%w ]+) is under attack",
61 PATTERN_OBJECTIVE_ATTACKED_AV1 = "^([%w ]+) is under attack",
62 },
63  
64 BGObjectiveDefendedAnnouncements = {
65 PATTERN_OBJECTIVE_DEFENDED_AB = "defended the ([%w ]+)",
66 },
67  
68 BGObjectiveCapturedAnnouncements = {
69 PATTERN_OBJECTIVE_CAPTURED_AB = "The (%a+) has taken the ([%w ]+)",
70 PATTERN_OBJECTIVE_CAPTURED_AV0 = "The ([%w ]+) was taken by the (%a+)",
71 PATTERN_OBJECTIVE_CAPTURED_AV1 = "^([%w ]+) was taken by the (%a+)",
72 PATTERN_OBJECTIVE_CAPTURED_AV2 = "the ([%w ]+) is.*MINE", --and the Irondeep Mine is...MINE!
73 PATTERN_OBJECTIVE_CAPTURED_AV3 = "claims the ([%w ]+)", --Snivvle claims the Coldtooth Mine!
74 },
75  
76 BGObjectiveDestroyedAnnouncements = {
77 PATTERN_OBJECTIVE_DESTROYED_AV0 = "The ([%w ]+) was destroyed",
78 PATTERN_OBJECTIVE_DESTROYED_AV1 = "^([%w ]+) was destroyed",
79 },
80 }
81  
82 BGPatternReplacements = {
83 ["mine"] = "gold mine",
84 ["southern farm"] = "farm"
85 }
86  
87 BGAcronyms = {
88 [ALTERAC_VALLEY] = "AV",
89 [ARATHI_BASIN] = "AB",
90 [WARSONG_GULCH] = "WSG",
91 }
92  
93 PATTERN_GWSUII_SCORE = "(%d+/%d+)" --for lifting the score out of the first return value of GetWorldStateUIInfo(index)
94 PATTERN_GWSUII_BASES = "Bases: (%d+)" --for lifting the number of bases held in Arathi Basin
95 PATTERN_GWSUII_RESOURCES = "Resources: (%d+)" --for lifting the number of bases held in Arathi Basin
96 PATTERN_OBJECTIVE_HOLDER = "([%w ]+) Controlled"
97  
98 elseif locale == "deDE" then
99 PATTERN_HORDE_FLAG_PICKED_UP = "([^!]+) hat die [Ff]lagge der Horde aufgenommen!"
100 PATTERN_HORDE_FLAG_DROPPED = "(%a+) hat die [Ff]lagge der Horde fallen lassen!"
101 PATTERN_HORDE_FLAG_CAPTURED = "(%a+) hat die [Ff]lagge der Horde errungen!"
102 PATTERN_ALLIANCE_FLAG_PICKED_UP = "(%a+) hat die [Ff]lagge der Allianz aufgenommen!"
103 PATTERN_ALLIANCE_FLAG_DROPPED = "(%a+) hat die [Ff]lagge der Allianz fallen lassen!"
104 PATTERN_ALLIANCE_FLAG_CAPTURED = "(%a+) hat die [Ff]lagge der Allianz errungen!"
105  
106 FACTION_DEFILERS = "Die Entweihten"
107 FACTION_FROSTWOLF_CLAN = "Frostwolfklan"
108 FACTION_WARSONG_OUTRIDERS = "Warsongvorhut"
109  
110 FACTION_LEAGUE_OF_ARATHOR = "Liga von Arathor"
111 FACTION_STORMPIKE_GUARD = "Stormpike Garde"
112 FACTION_SILVERWING_SENTINELS = "Silverwing Schildwache"
113  
114 BGObjectiveDescriptions = {
115 ALLIANCE_CONTROLLED = "Kontrolliert von der Allianz",
116 HORDE_CONTROLLED = "Kontrolliert von der Horde",
117 IN_CONFLICT = "Umk\195\164mpft",
118 UNCONTROLLED = "Unkontrolliert",
119 DESTROYED = "Zerst\195\182rt",
120 }
121  
122 BGChatAnnouncements = {
123 BGObjectiveClaimedAnnouncements = {
124 PATTERN_OBJECTIVE_CLAIMED_AB0 = "hat das (.+) besetzt.* die (%a+) in",
125 PATTERN_OBJECTIVE_CLAIMED_AB1 = "hat den (.+) besetzt.* die (%a+) in",
126 PATTERN_OBJECTIVE_CLAIMED_AB2 = "hat die (.+) besetzt.* die (%a+) in",
127 PATTERN_OBJECTIVE_CLAIMED_AB3 = "hat (S\195\164gewerk) besetzt.* die (%a+) in",
128 PATTERN_OBJECTIVE_CLAIMED_AV0 = "hat den (.+) besetzt.+erlangt die (%a) die Kontrolle"
129 },
130  
131 BGObjectiveAttackedAnnouncements = {
132 PATTERN_OBJECTIVE_ATTACKED_AB0 = "das (.+) angegriffen",
133 PATTERN_OBJECTIVE_ATTACKED_AB1 = "den (.+) angegriffen",
134 PATTERN_OBJECTIVE_ATTACKED_AB2 = "die (.+) angegriffen",
135 PATTERN_OBJECTIVE_ATTACKED_AV0 = "Das (.+) wird angegriffen.*wird die (%a+) es",
136 PATTERN_OBJECTIVE_ATTACKED_AV1 = "Der (.+) wird angegriffen.*wird die (%a+) ihn",
137 PATTERN_OBJECTIVE_ATTACKED_AV2 = "Die (.+) wird angegriffen.*wird die (%a+) sie",
138 },
139  
140 BGObjectiveDefendedAnnouncements = {
141 PATTERN_OBJECTIVE_DEFENDED_AB0 = "das (.+) verteidigt",
142 PATTERN_OBJECTIVE_DEFENDED_AB1 = "den (.+) verteidigt",
143 PATTERN_OBJECTIVE_DEFENDED_AB2 = "die (.+) verteidigt",
144 },
145  
146 BGObjectiveCapturedAnnouncements = {
147 PATTERN_OBJECTIVE_CAPTURED_AB0 = "Die (%a+) hat das (.+) eingenommen",
148 PATTERN_OBJECTIVE_CAPTURED_AB1 = "Die (%a+) hat den (.+) eingenommen",
149 PATTERN_OBJECTIVE_CAPTURED_AB2 = "Die (%a+) hat die (.+) eingenommen",
150 PATTERN_OBJECTIVE_CAPTURED_AV0 = "Das (.+) wurde von der (%a+) erobert",
151 PATTERN_OBJECTIVE_CAPTURED_AV1 = "Der (.+) wurde von der (%a+) erobert",
152 PATTERN_OBJECTIVE_CAPTURED_AV2 = "geh\195\182rt jetzt die (.+)!",
153 },
154  
155 BGObjectiveDestroyedAnnouncements = {
156 PATTERN_OBJECTIVE_DESTROYED_AV0 = "Der (.+) wurde von der (%a+) zerst\195\182rt",
157 },
158 }
159  
160 BGPatternReplacements = {
161 ["Schmiede"] = "Schmied",
162 ["Mine"] = "Goldmine",
163 ["s\195\188dlichen Hof"] = "Hof",
164 }
165  
166 BGAcronyms = {
167 [ALTERAC_VALLEY] = "AV", -- CHECK
168 [ARATHI_BASIN] = "AB", -- CHECK
169 [WARSONG_GULCH] = "WSG", -- CHECK
170 }
171  
172 PATTERN_GWSUII_SCORE = "(%d+/%d+)" --for lifting the score out of the first return value of GetWorldStateUIInfo(index)
173 PATTERN_GWSUII_BASES = "Basen: (%d+)" --for lifting the number of bases held in Arathi Basin
174 PATTERN_GWSUII_RESOURCES = "Ressourcen: (%d+)" --for lifting the number of bases held in Arathi Basin -- CHECK
175 PATTERN_OBJECTIVE_HOLDER = "Kontrolliert von der ([%w ]+)"
176 end
177  
178 BattlefieldZoneObjectiveTimes = {
179 [ARATHI_BASIN] = 62.5,
180 [ALTERAC_VALLEY] = 302.5,
181 }
182  
183 BattlefieldZoneResourceData = {
184 [ARATHI_BASIN] = { [0]=0, 5/6, 10/9, 5/3, 10/3, 30, 2000 }
185 }
186 -------------IRIEL'S-STUB-CODE--------------
187 local stub = {};
188  
189 -- Instance replacement method, replace contents of old with that of new
190 function stub:ReplaceInstance(old, new)
191 for k,v in pairs(old) do old[k]=nil; end
192 for k,v in pairs(new) do old[k]=v; end
193 end
194  
195 -- Get a new copy of the stub
196 function stub:NewStub()
197 local newStub = {};
198 self:ReplaceInstance(newStub, self);
199 newStub.lastVersion = '';
200 newStub.versions = {};
201 return newStub;
202 end
203  
204 -- Get instance version
205 function stub:GetInstance(version)
206 if (not version) then version = self.lastVersion; end
207 local versionData = self.versions[version];
208 if (not versionData) then
209 message("Cannot find library instance with version '"
210 .. version .. "'");
211 return;
212 end
213 return versionData.instance;
214 end
215  
216 -- Register new instance
217 function stub:Register(newInstance)
218 local version,minor = newInstance:GetLibraryVersion();
219 self.lastVersion = version;
220 local versionData = self.versions[version];
221 if (not versionData) then
222 -- This one is new!
223 versionData = { instance = newInstance,
224 minor = minor,
225 old = {}
226 };
227 self.versions[version] = versionData;
228 newInstance:LibActivate(self);
229 return newInstance;
230 end
231 if (minor <= versionData.minor) then
232 -- This one is already obsolete
233 if (newInstance.LibDiscard) then
234 newInstance:LibDiscard();
235 end
236 return versionData.instance;
237 end
238 -- This is an update
239 local oldInstance = versionData.instance;
240 local oldList = versionData.old;
241 versionData.instance = newInstance;
242 versionData.minor = minor;
243 local skipCopy = newInstance:LibActivate(self, oldInstance, oldList);
244 table.insert(oldList, oldInstance);
245 if (not skipCopy) then
246 for i, old in ipairs(oldList) do
247 self:ReplaceInstance(old, newInstance);
248 end
249 end
250 return newInstance;
251 end
252  
253 -- Bind stub to global scope if it's not already there
254 if (not GloryLib) then
255 GloryLib = stub:NewStub();
256 end
257  
258 -- Nil stub for garbage collection
259 stub = nil;
260 -----------END-IRIEL'S-STUB-CODE------------
261  
262 local lib = {}
263 local events = {}
264  
265 local playerFaction = UnitFactionGroup("player")
266 local isHorde = playerFaction == "Horde"
267 local playerName = UnitName("player")
268  
269 function lib:GetLibraryVersion()
270 return MAJOR_VERSION, MINOR_VERSION
271 end
272  
273 function lib:LibActivate(stub, oldLib, oldList)
274 if oldLib then
275 for i = 1, 9 do
276 setglobal("SLASH_GLORY" .. i, nil)
277 end
278 end
279 SLASH_GLORY1 = "/glory"
280 SLASH_GLORY2 = "/glorylib"
281 local function print(msg)
282 DEFAULT_CHAT_FRAME:AddMessage(msg)
283 end
284 SlashCmdList["GLORY"] = function(msg)
285 msg = string.gsub(string.gsub(msg, "^%s*(.-)%s*$", "%1"), "%s+", " ")
286 local _, _, first, rest = string.find(msg, "^(.-) (.*)$")
287 if not first then
288 if msg ~= "" then
289 first = msg
290 end
291 end
292 if first then
293 first = string.lower(first)
294 end
295 if not first then
296 print("|cffffff7fGloryLib v" .. MAJOR_VERSION .. "." .. MINOR_VERSION .. ":|r")
297 print(" |cffffff7fhonor|r - general honor information.")
298 print(" |cffffff7fbg|r - battleground information.")
299 elseif first == "honor" then
300 print("|cffffff7fToday's HKs:|r - " .. self:GetTodayHKs())
301 print("|cffffff7fToday's Deaths:|r - " .. self:GetTodayDeaths())
302 print("|cffffff7fToday's HK Honor:|r - " .. self:GetTodayHKHonor())
303 print("|cffffff7fToday's Bonus Honor:|r - " .. self:GetTodayBonusHonor())
304 print("|cffffff7fToday's Honor:|r - " .. self:GetTodayHonor())
305 local s
306 if self:IsPermanentPvP() then
307 s = "Flagged"
308 elseif self:IsInBattlegrounds() then
309 s = "Battlegrounds"
310 else
311 local t = self:GetPvPCooldown()
312 if t == 0 then
313 s = "None"
314 else
315 local min = floor(t / 60)
316 local sec = floor(mod(t, 60))
317 s = format("%d:%02d", min, sec)
318 end
319 end
320 print("|cffffff7fPvP Cooldown:|r - " .. s)
321 print("|cffffff7fRank Limit:|r - " .. format("%s (%d)", self:GetRankLimitInfo()))
322 print("|cffffff7fRating Limit:|r - " .. self:GetRatingLimit())
323 elseif first == "bg" then
324 print("|cffffff7fBG Score:|r - " .. self:GetBattlegroundsWins() .. "-" .. self:GetBattlegroundsLosses())
325 print("|cffffff7fWSG Score:|r - " .. self:GetWarsongGulchWins() .. "-" .. self:GetWarsongGulchLosses())
326 print("|cffffff7fAB Score:|r - " .. self:GetArathiBasinWins() .. "-" .. self:GetArathiBasinLosses())
327 print("|cffffff7fAV Score:|r - " .. self:GetAlteracValleyWins() .. "-" .. self:GetAlteracValleyLosses())
328 if self:IsInBattlegrounds() then
329 print("|cffffff7fCurrent:|r - " .. self:GetActiveBattlegroundUniqueID())
330 print("|cffffff7fStanding:|r - " .. self:GetStanding())
331 print("|cffffff7fKilling Blows:|r - " .. self:GetKillingBlows())
332 print("|cffffff7fHonorable Kills:|r - " .. self:GetHonorableKills())
333 print("|cffffff7fDeaths:|r - " .. self:GetDeaths())
334 print("|cffffff7fBonus Honor:|r - " .. self:GetBonusHonor())
335 if self:IsInWarsongGulch() then
336 print("|cffffff7fFriendly FC:|r - " .. (self:GetFriendlyFlagCarrier() or NONE))
337 print("|cffffff7fHostile FC:|r - " .. (self:GetHostileFlagCarrier() or NONE))
338 else
339 print("|cffffff7fFriendly Bases:|r - " .. self:GetNumFriendlyBases())
340 print("|cffffff7fHostile Bases:|r - " .. self:GetNumHostileBases())
341 print("|cffffff7fFriendly Resources:|r - " .. self:GetNumFriendlyResources())
342 print("|cffffff7fHostile Resources:|r - " .. self:GetNumHostileResources())
343 end
344 print("|cffffff7fFriendly Players:|r - " .. self:GetNumFriendlyPlayers())
345 print("|cffffff7fHostile Players:|r - " .. self:GetNumHostilePlayers())
346 end
347 end
348 end
349  
350 if oldLib then
351 self.frame = oldLib.frame
352 self.frame:UnregisterAllEvents()
353 self.registry = oldLib.registry
354 else
355 self.frame = CreateFrame("Frame", "GloryLibFrame", UIParent)
356 self.registry = {}
357 end
358 self.frame:RegisterEvent("ADDON_LOADED")
359 self.frame:RegisterEvent("VARIABLES_LOADED")
360 self.frame:RegisterEvent("PLAYER_LOGOUT")
361 self.frame:RegisterEvent("CHAT_MSG_COMBAT_HONOR_GAIN")
362 self.frame:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
363 self.frame:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE")
364 self.frame:RegisterEvent("CHAT_MSG_MONSTER_YELL")
365 self.frame:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE")
366 self.frame:RegisterEvent("CHAT_MSG_COMBAT_FACTION_CHANGE")
367 self.frame:RegisterEvent("CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE")
368 self.frame:RegisterEvent("CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS")
369 self.frame:RegisterEvent("UPDATE_WORLD_STATES")
370 self.frame:RegisterEvent("PLAYER_ENTERING_WORLD")
371 self.frame:RegisterEvent("UNIT_PVP_UPDATE")
372 self.frame:RegisterEvent("PLAYER_DEAD")
373 self.frame:SetScript("OnEvent", function()
374 events[event](self)
375 end)
376 events.VARIABLES_LOADED(self)
377  
378 if not oldLib then
379 local old_TogglePVP = TogglePVP
380 function TogglePVP()
381 GloryLib:GetInstance(MAJOR_VERSION):_TogglePVP()
382  
383 old_TogglePVP()
384 end
385 end
386  
387 self.battlefieldObjectiveStatus = compost and compost:Acquire() or {}
388 self.pvpTime = 0
389 self.currentBonusHonor = 0
390 self.lastHostileTime = 0
391 self.aLastResources = 0
392 self.hLastResources = 0
393 self.aLastBases = 0
394 self.hLastBases = 0
395 self.aLastUpdate = 0
396 self.hLastUpdate = 0
397 self.aResourceTTV = 0
398 self.hResourceTTV = 0
399 end
400  
401 function lib:LibDeactivate(stub)
402 events = nil
403 if compost then
404 compost:Reclaim(self.battlefieldObjectiveStatus)
405 end
406 self.battlefieldObjectiveStatus = nil
407 end
408  
409 local function Trigger(self, event, a1, a2, a3, a4, a5, a6, a7, a8)
410 if self.registry[event] then
411 for func, arg in pairs(self.registry[event]) do
412 if type(func) == "function" then
413 func(arg, a1, a2, a3, a4, a5, a6, a7, a8)
414 else
415 func[arg](func, a1, a2, a3, a4, a5, a6, a7, a8)
416 end
417 end
418 end
419 end
420  
421 local function CheckNewWeek(self)
422 local _,_,lastWeekHonor,_ = GetPVPLastWeekStats()
423 if lastWeekHonor ~= self.data.lastWeek then
424 self.data.lastWeek = lastWeekHonor
425 Trigger(self, "NEW_WEEK")
426 end
427 end
428  
429 local function CheckNewDay(self)
430 local _,_,yesterdayHonor = GetPVPYesterdayStats()
431 local lifetimeHK,_,_ = GetPVPLifetimeStats()
432 if yesterdayHonor ~= self.data.yesterday and not (yesterdayHonor == 0 and lifetimeHK == 0) then
433 self.data.yesterday = yesterdayHonor
434 self.data.hks = {}
435 self.data.todayHK = 0
436 self.data.todayHKHonor = 0
437 self.data.todayBonusHonor = 0
438 self.data.todayDeaths = 0
439 Trigger(self, "NEW_DAY")
440 end
441 end
442  
443 local function IncreaseHKs(self, person)
444 self.data.todayHK = self.data.todayHK + 1
445 self.data.hks[person] = (self.data.hks[person] or 0) + 1
446 return self.data.hks[person]
447 end
448  
449 local function IncreaseHKHonor(self, amount)
450 self.data.todayHKHonor = self.data.todayHKHonor + amount
451 end
452  
453 local function IncreaseBonusHonor(self, amount)
454 self.data.todayBonusHonor = self.data.todayBonusHonor + amount
455 end
456  
457 local function IncreaseBattlegroundsWins(self)
458 if self:IsInAlteracValley() then
459 self.data.avWin = self.data.avWin + 1
460 Trigger(self, "BG_WIN_AV")
461 elseif self:IsInArathiBasin() then
462 self.data.abWin = self.data.abWin + 1
463 Trigger(self, "BG_WIN_AB")
464 else
465 self.data.wsgWin = self.data.wsgWin + 1
466 Trigger(self, "BG_WIN_WSG")
467 end
468 Trigger(self, "BG_WIN")
469 end
470  
471 local function IncreaseBattlegroundsLosses(self)
472 if self:IsInAlteracValley() then
473 self.data.avLoss = self.data.avLoss + 1
474 Trigger(self, "BG_LOSS_AV")
475 elseif self:IsInArathiBasin() then
476 self.data.abLoss = self.data.abLoss + 1
477 Trigger(self, "BG_LOSS_AB")
478 else
479 self.data.wsgLoss = self.data.wsgLoss + 1
480 Trigger(self, "BG_LOSS_WSG")
481 end
482 Trigger(self, "BG_LOSS")
483 end
484  
485 local function IncreaseDeaths(self)
486 self.data.todayDeaths = self.data.todayDeaths + 1
487 Trigger(self, "DEATH")
488 end
489  
490 local db
491  
492 local function VerifyData(self)
493 if not self.data then
494 if type(GloryLibDB) ~= "table" then
495 GloryLibDB = {}
496 end
497 db = GloryLibDB
498 if type(db[MAJOR_VERSION]) ~= "table" then
499 db[MAJOR_VERSION] = {}
500 end
501 self.data = db[MAJOR_VERSION]
502 elseif db ~= GloryLibDB then
503 local old = db
504 local new = GloryLibDB
505 if type(new) ~= "table" then
506 GloryLibDB = old
507 else
508 for k in pairs(old) do
509 if not new[k] then
510 new[k] = old[k]
511 elseif new[k].time == nil then
512 new[k] = old[k]
513 elseif old[k].time == nil then
514 -- keep new
515 elseif new[k].time < old[k].time then
516 new[k] = old[k]
517 end
518 end
519 db = new
520 self.data = db[MAJOR_VERSION]
521 end
522 end
523 if not self.data.hks then self.data.hks = {} end
524 if not self.data.todayDeaths then self.data.todayDeaths = 0 end
525 if not self.data.todayHK then self.data.todayHK = 0 end
526 if not self.data.todayHKHonor then self.data.todayHKHonor = 0 end
527 if not self.data.todayBonusHonor then self.data.todayBonusHonor = 0 end
528 if not self.data.wsgWin then self.data.wsgWin = 0 end
529 if not self.data.wsgLoss then self.data.wsgLoss = 0 end
530 if not self.data.abWin then self.data.abWin = 0 end
531 if not self.data.abLoss then self.data.abLoss = 0 end
532 if not self.data.avWin then self.data.avWin = 0 end
533 if not self.data.avLoss then self.data.avLoss = 0 end
534 if not self.data.yesterday then self.data.yesterday = 0 end
535 if not self.data.lastWeek then self.data.lastWeek = 0 end
536  
537 CheckNewDay(self)
538 CheckNewWeek(self)
539 events.UNIT_PVP_UPDATE(self)
540 end
541  
542 function events:ADDON_LOADED()
543 VerifyData(self)
544 end
545  
546 function events:VARIABLES_LOADED()
547 VerifyData(self)
548 end
549  
550 function events:PLAYER_LOGOUT()
551 self.data.time = time()
552 end
553  
554 function events:CHAT_MSG_COMBAT_HONOR_GAIN()
555 CheckNewDay(self)
556 local name, rank, honor = babbleCore:Deformat(arg1, COMBATLOG_HONORGAIN)
557 if name then
558 local kills = IncreaseHKs(self, name)
559 local factor = (5 - kills) / 4
560 if factor < 0 then
561 factor = 0
562 end
563 local realHonor = ceil(honor * factor)
564 IncreaseHKHonor(self, realHonor)
565 Trigger(self, "GAIN_HK", rank, name, realHonor, kills)
566 return
567 end
568  
569 local bonus = babbleCore:Deformat(arg1, COMBATLOG_HONORAWARD)
570 if bonus then
571 bonus = tonumber(bonus)
572 IncreaseBonusHonor(self, bonus)
573 Trigger(self, "GAIN_BONUS_HONOR", bonus)
574 end
575 end
576  
577 function events:CHAT_MSG_BG_SYSTEM_NEUTRAL()
578 if string.find(string.lower(arg1), string.lower(VICTORY_TEXT0)) then
579 if isHorde then
580 IncreaseBattlegroundsWins(self)
581 else
582 IncreaseBattlegroundsLosses(self)
583 end
584 elseif string.find(string.lower(arg1), string.lower(VICTORY_TEXT1)) then
585 if not isHorde then
586 IncreaseBattlegroundsWins(self)
587 else
588 IncreaseBattlegroundsLosses(self)
589 end
590 end
591 end
592  
593 function events:CHAT_MSG_BG_SYSTEM_HORDE()
594 if self:IsInWarsongGulch() then
595 local _, _, hordeFC = string.find(arg1, PATTERN_ALLIANCE_FLAG_PICKED_UP)
596 if hordeFC then
597 self.hordeFC = hordeFC
598 Trigger(self, "ALLIANCE_FLAG_PICKED_UP", self.hordeFC)
599 Trigger(self, "ALLIANCE_FLAGCARRIER_UPDATE", self.hordeFC)
600 if not isHorde then
601 Trigger(self, "FRIENDLY_FLAG_PICKED_UP", self.hordeFC)
602 Trigger(self, "FRIENDLY_FLAGCARRIER_UPDATE", self.hordeFC)
603 else
604 Trigger(self, "HOSTILE_FLAG_PICKED_UP", self.hordeFC)
605 Trigger(self, "HOSTILE_FLAGCARRIER_UPDATE", self.hordeFC)
606 end
607 return
608 end
609  
610 if string.find(arg1, PATTERN_ALLIANCE_FLAG_CAPTURED) then
611 local hordeFC = self.hordeFC
612 self.allianceFC = nil
613 self.hordeFC = nil
614 Trigger(self, "ALLIANCE_FLAG_CAPTURED", hordeFC)
615 if not isHorde then
616 Trigger(self, "FRIENDLY_FLAG_CAPTURED", hordeFC)
617 else
618 Trigger(self, "HOSTILE_FLAG_CAPTURED", hordeFC)
619 end
620 Trigger(self, "FRIENDLY_FLAGCARRIER_UPDATE", nil)
621 Trigger(self, "HOSTILE_FLAGCARRIER_UPDATE", nil)
622 return
623 end
624  
625 if string.find(arg1, PATTERN_HORDE_FLAG_DROPPED) then
626 local allianceFC = self.allianceFC
627 self.allianceFC = nil
628 Trigger(self, "HORDE_FLAG_DROPPED", allianceFC)
629 if isHorde then
630 Trigger(self, "FRIENDLY_FLAG_DROPPED", allianceFC)
631 Trigger(self, "HOSTILE_FLAGCARRIER_UPDATE", nil)
632 else
633 Trigger(self, "HOSTILE_FLAG_DROPPED", allianceFC)
634 Trigger(self, "FRIENDLY_FLAGCARRIER_UPDATE", nil)
635 end
636 return
637 end
638 elseif self:IsInArathiBasin() or self:IsInAlteracValley() then
639 events.BattlefieldObjectiveEventProcessing(self)
640 end
641 end
642  
643 function events:CHAT_MSG_BG_SYSTEM_ALLIANCE()
644 if self:IsInWarsongGulch() then
645 local _, _, allianceFC = string.find(arg1, PATTERN_HORDE_FLAG_PICKED_UP)
646 if allianceFC then
647 self.allianceFC = allianceFC
648 Trigger(self, "HORDE_FLAG_PICKED_UP", self.allianceFC)
649 if isHorde then
650 Trigger(self, "FRIENDLY_FLAG_PICKED_UP", self.allianceFC)
651 Trigger(self, "HOSTILE_FLAGCARRIER_UPDATE", self.allianceFC)
652 else
653 Trigger(self, "HOSTILE_FLAG_PICKED_UP", self.allianceFC)
654 Trigger(self, "FRIENDLY_FLAGCARRIER_UPDATE", self.allianceFC)
655 end
656 return
657 end
658  
659 if string.find(arg1, PATTERN_HORDE_FLAG_CAPTURED) then
660 Trigger(self, "HORDE_FLAG_CAPTURED", self.allianceFC)
661 if isHorde then
662 Trigger(self, "FRIENDLY_FLAG_CAPTURED", self.allianceFC)
663 else
664 Trigger(self, "HOSTILE_FLAG_CAPTURED", self.allianceFC)
665 end
666 self.allianceFC = nil
667 self.hordeFC = nil
668 Trigger(self, "FRIENDLY_FLAGCARRIER_UPDATE", nil)
669 Trigger(self, "HOSTILE_FLAGCARRIER_UPDATE", nil)
670 return
671 end
672  
673 if string.find(arg1, PATTERN_ALLIANCE_FLAG_DROPPED) then
674 Trigger(self, "ALLIANCE_FLAG_DROPPED", self.hordeFC)
675 if not isHorde then
676 Trigger(self, "FRIENDLY_FLAG_DROPPED", self.hordeFC)
677 Trigger(self, "HOSTILE_FLAGCARRIER_UPDATE", nil)
678 else
679 Trigger(self, "HOSTILE_FLAG_DROPPED", self.hordeFC)
680 Trigger(self, "FRIENDLY_FLAGCARRIER_UPDATE", nil)
681 end
682 self.hordeFC = nil
683 return
684 end
685 elseif self:IsInArathiBasin() or self:IsInAlteracValley() then
686 events.BattlefieldObjectiveEventProcessing(self)
687 end
688 end
689  
690 function events:CHAT_MSG_MONSTER_YELL()
691 if self:IsInAlteracValley() then
692 if string.find(string.lower(arg1), string.lower(VICTORY_TEXT0)) then
693 if isHorde then
694 IncreaseBattlegroundsWins(self)
695 else
696 IncreaseBattlegroundsLosses(self)
697 end
698 elseif string.find(string.lower(arg1), string.lower(VICTORY_TEXT1)) then
699 if not isHorde then
700 IncreaseBattlegroundsWins(self)
701 else
702 IncreaseBattlegroundsLosses(self)
703 end
704 else
705 events.BattlefieldObjectiveEventProcessing(self)
706 end
707 end
708 end
709  
710 function events:BattlefieldObjectiveEventProcessing()
711 local node, faction
712 for k, pattern in pairs(BGChatAnnouncements.BGObjectiveClaimedAnnouncements) do
713 _, _, node, faction = string.find(arg1, pattern)
714 if node then
715 if node == FACTION_ALLIANCE or node == FACTION_HORDE then
716 node, faction = faction, node
717 end
718 Trigger(self, "OBJECTIVE_CLAIMED", BGPatternReplacements[node] or node, faction)
719 events.OnObjectiveClaimed(self, BGPatternReplacements[node] or node, faction)
720 return
721 end
722 end
723 for k, pattern in pairs(BGChatAnnouncements.BGObjectiveCapturedAnnouncements) do
724 _, _, node, faction = string.find(arg1, pattern)
725 if node then
726 if node == FACTION_ALLIANCE or node == FACTION_HORDE then
727 node, faction = faction, node
728 end
729 Trigger(self, "OBJECTIVE_CAPTURED", BGPatternReplacements[node] or node, faction)
730 events.OnObjectiveCaptured(self, BGPatternReplacements[node] or node, faction)
731 return
732 end
733 end
734 for k, pattern in pairs(BGChatAnnouncements.BGObjectiveAttackedAnnouncements) do
735 _, _, node = string.find(arg1, pattern)
736 if node then
737 Trigger(self, "OBJECTIVE_ATTACKED", BGPatternReplacements[node] or node)
738 events.OnObjectiveAttacked(self, BGPatternReplacements[node] or node)
739 return
740 end
741 end
742 for k, pattern in pairs(BGChatAnnouncements.BGObjectiveDefendedAnnouncements) do
743 _, _, node = string.find(arg1, pattern)
744 if node then
745 Trigger(self, "OBJECTIVE_DEFENDED", BGPatternReplacements[node] or node)
746 events.OnObjectiveDefended(self, BGPatternReplacements[node] or node)
747 return
748 end
749 end
750 for k, pattern in pairs(BGChatAnnouncements.BGObjectiveDestroyedAnnouncements) do
751 _, _, node = string.find(arg1, pattern)
752 if node then
753 Trigger(self, "OBJECTIVE_DESTROYED", BGPatternReplacements[node] or node)
754 events.OnObjectiveDestroyed(self, BGPatternReplacements[node] or node)
755 return
756 end
757 end
758 end
759  
760 if not FACTION_STANDING_INCREASED then -- 1.10
761 function events:CHAT_MSG_COMBAT_FACTION_CHANGE()
762 local faction, rep = babbleCore:Deformat(arg1, FACTION_STANDING_INCREASED1)
763 if not faction then
764 faction, rep = babbleCore:Deformat(arg1, FACTION_STANDING_INCREASED2)
765 if not faction then
766 faction, rep = babbleCore:Deformat(arg1, FACTION_STANDING_INCREASED3)
767 if not faction then
768 faction, rep = babbleCore:Deformat(arg1, FACTION_STANDING_INCREASED4)
769 end
770 end
771 end
772 if faction and rep then
773 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
774 Trigger(self, "FACTION_GAIN", faction, rep)
775 end
776 end
777 end
778 else -- 1.11
779 function events:CHAT_MSG_COMBAT_FACTION_CHANGE()
780 local faction, rep = babbleCore:Deformat(arg1, FACTION_STANDING_INCREASED)
781 if faction and rep then
782 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
783 Trigger(self, "FACTION_GAIN", faction, rep)
784 end
785 end
786 end
787 end
788  
789 function events:CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS()
790 self.lastHostileTime = GetTime()
791 end
792 events.CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE = events.CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS
793  
794 function events:UNIT_PVP_UPDATE()
795 if not UnitIsPVP("player") and self.permaPvP then
796 self.permaPvP = false
797 Trigger(self, "UPDATE_PERMANENT_PVP", self.permaPvP)
798 end
799 if UnitIsPVP("player") or self:IsInBattlegrounds() then
800 self.pvpTime = GetTime()
801 Trigger(self, "UPDATE_PVP_COOLDOWN", self:GetPvPCooldown())
802 else
803 Trigger(self, "UPDATE_PVP_COOLDOWN", 0)
804 end
805 end
806  
807 function events:UPDATE_WORLD_STATES()
808 local resData = BattlefieldZoneResourceData[self:GetActiveBattlefieldZone()]
809 if resData and self:GetNumAllianceBases() and self:GetNumHordeBases() then
810 -- Common
811 local goalResources = resData[table.getn(resData)]
812 -- Alliance
813 _, _, resources = string.find(self:GetAllianceScoreString(), "(%d+)/")
814 bases = self:GetNumAllianceBases()
815 if resources and bases and (resources ~= self.aLastResources or bases ~= self.aLastBases) then
816 self.aResourceTTV = (goalResources - resources) / resData[bases]
817 self.aLastResources = resources
818 self.aLastBases = bases
819 self.aLastUpdate = GetTime()
820 end
821 -- Horde
822 _, _, resources = string.find(self:GetHordeScoreString(), "(%d+)/")
823 bases = self:GetNumHordeBases()
824 if resources and bases and (resources ~= self.hLastResources or bases ~= self.hLastBases) then
825 self.hResourceTTV = (goalResources - resources) / resData[bases]
826 self.hLastResources = resources
827 self.hLastBases = bases
828 self.hLastUpdate = GetTime()
829 end
830 end
831 end
832  
833 function events:PLAYER_ENTERING_WORLD()
834 playerFaction = UnitFactionGroup("player")
835 isHorde = playerFaction == "Horde"
836 events.UNIT_PVP_UPDATE(self)
837 SetMapToCurrentZone()
838 if self:IsInBattlegrounds() and GetNumMapLandmarks() > 0 then
839 events.InitializeBattlefieldObjectives(self)
840 else
841 events.ClearBattlefieldObjectives(self)
842 end
843 end
844  
845 function events:PLAYER_DEAD()
846 if GetTime() <= self.lastHostileTime + 15 then
847 IncreaseDeaths(self)
848 end
849 end
850  
851 function lib:IsInBattlegrounds(self)
852 local zone = GetRealZoneText()
853 return zone == WARSONG_GULCH or zone == ARATHI_BASIN or zone == ALTERAC_VALLEY
854 end
855  
856 function lib:IsInWarsongGulch()
857 return GetRealZoneText() == WARSONG_GULCH
858 end
859  
860 function lib:IsInArathiBasin()
861 return GetRealZoneText() == ARATHI_BASIN
862 end
863  
864 function lib:IsInAlteracValley()
865 return GetRealZoneText() == ALTERAC_VALLEY
866 end
867  
868 local function copyTable(to, from)
869 for k, v in pairs(from) do
870 to[k] = v
871 end
872 return to
873 end
874  
875 local first, done, start
876 local function GetCurrentOrNextBattlegroundWeekend(week)
877 local weekFactor = (week - 1) * 7
878 local now = date("*t")
879 local nowTime = time(now)
880 if not first then
881 first = {}
882 end
883 first = copyTable(first, now)
884 first.day = 1
885 --first.month = first.month - floor(week / 4)
886 first.sec = 0
887 first.min = 0
888 first.hour = 1
889 first = date("*t", time(first))
890 if not done then
891 done = {}
892 end
893 done = copyTable(done, first)
894 done.day = weekFactor + 10 - first.wday
895 done.hour = 23
896 done.min = 59
897 done.sec = 59
898 if done.day == weekFactor + 3 then
899 done.day = weekFactor + 10
900 end
901 while nowTime > time(done) do
902 first.month = first.month + 1
903 first = date("*t", time(first))
904 done = copyTable(done, first)
905 done.day = weekFactor + 10 - first.wday
906 if done.day == weekFactor + 3 then
907 done.day = weekFactor + 10
908 end
909 end
910 done = date("*t", time(done))
911 if not start then
912 start = {}
913 end
914 start = copyTable(start, done)
915 start.day = start.day - 3
916 start = date("*t", time(start))
917 local sMonth
918 local dMonth
919 if start.month == done.month then
920 sMonth = date("%B", time(start))
921 dMonth = sMonth
922 else
923 sMonth = date("%b", time(start))
924 dMonth = date("%b", time(done))
925 end
926 start.hour = 1
927 start.min = 0
928 start.sec = 0
929 return sMonth, start.day, dMonth, done.day, time(start) <= time(now) and time(now) <= time(done)
930 end
931  
932 function lib:GetCurrentOrNextArathiWeekend()
933 return GetCurrentOrNextBattlegroundWeekend(4)
934 end
935  
936 function lib:GetCurrentOrNextWarsongWeekend()
937 return GetCurrentOrNextBattlegroundWeekend(3)
938 end
939  
940 function lib:GetCurrentOrNextAlteracWeekend()
941 return GetCurrentOrNextBattlegroundWeekend(2)
942 end
943  
944 function lib:_TogglePVP()
945 self.permaPvP = not self.permaPvP
946 if not UnitIsPVP("player") then
947 self.permaPvP = true
948 end
949 Trigger(self, "UPDATE_PERMANENT_PVP", self.permaPvP)
950 self.pvpTime = GetTime()
951 end
952  
953 function lib:GetTodayHKs(person)
954 if person then
955 return self.data.hks[person] or 0
956 else
957 return self.data.todayHK
958 end
959 end
960  
961 function lib:GetTodayDeaths()
962 return self.data.todayDeaths
963 end
964  
965 function lib:GetTodayHKHonor()
966 return self.data.todayHKHonor
967 end
968  
969 function lib:GetTodayBonusHonor()
970 return self.data.todayBonusHonor
971 end
972  
973 function lib:GetTodayHonor()
974 return self.data.todayHKHonor + self.data.todayBonusHonor
975 end
976  
977 function lib:GetBattlegroundsWins()
978 return self.data.wsgWin + self.data.abWin + self.data.avWin
979 end
980  
981 function lib:GetWarsongGulchWins()
982 return self.data.wsgWin
983 end
984  
985 function lib:GetArathiBasinWins()
986 return self.data.abWin
987 end
988  
989 function lib:GetAlteracValleyWins()
990 return self.data.avWin
991 end
992  
993 function lib:GetBattlegroundsLosses()
994 return self.data.wsgLoss + self.data.abLoss + self.data.avLoss
995 end
996  
997 function lib:GetWarsongGulchLosses()
998 return self.data.wsgLoss
999 end
1000  
1001 function lib:GetArathiBasinLosses()
1002 return self.data.abLoss
1003 end
1004  
1005 function lib:GetAlteracValleyLosses()
1006 return self.data.avLoss
1007 end
1008  
1009 function lib:ResetBGScores()
1010 self.data.wsgWin = 0
1011 self.data.wsgLoss = 0
1012 self.data.abWin = 0
1013 self.data.abLoss = 0
1014 self.data.avWin = 0
1015 self.data.avLoss = 0
1016 Trigger(self, "BG_RESET_SCORES")
1017 end
1018  
1019 function lib:IsPermanentPvP()
1020 return self.permaPvP
1021 end
1022  
1023 function lib:GetPvPCooldown()
1024 if self:IsInBattlegrounds() or self.permaPvP then
1025 return 300
1026 end
1027 local t = self.pvpTime - GetTime() + 300
1028 if t < 0 or not UnitIsPVP("player") then
1029 return 0
1030 else
1031 return t
1032 end
1033 end
1034  
1035 function lib:GetRankLimitInfo()
1036 local level = UnitLevel("player")
1037 if level < 10 then
1038 return NONE, 0
1039 elseif level <= 32 then
1040 return GetPVPRankInfo(7)
1041 elseif level <= 37 then
1042 return GetPVPRankInfo(8)
1043 elseif level <= 40 then
1044 return GetPVPRankInfo(9)
1045 elseif level <= 43 then
1046 return GetPVPRankInfo(10)
1047 elseif level <= 45 then
1048 return GetPVPRankInfo(11)
1049 elseif level <= 47 then
1050 return GetPVPRankInfo(12)
1051 elseif level <= 50 then
1052 return GetPVPRankInfo(13)
1053 elseif level <= 52 then
1054 return GetPVPRankInfo(14)
1055 elseif level <= 54 then
1056 return GetPVPRankInfo(15)
1057 elseif level <= 56 then
1058 return GetPVPRankInfo(16)
1059 elseif level <= 58 then
1060 return GetPVPRankInfo(17)
1061 elseif level <= 60 then
1062 return GetPVPRankInfo(18)
1063 end
1064 end
1065  
1066 function lib:GetRatingLimit()
1067 local level = UnitLevel("player")
1068 if level < 10 then
1069 return 0
1070 elseif level <= 29 then
1071 return 6500
1072 elseif level <= 35 then
1073 return 7150 + (level - 30) * 975
1074 elseif level <= 39 then
1075 return 13325 + (level - 36) * 1300
1076 elseif level <= 43 then
1077 return 18850 + (level - 40) * 1625
1078 elseif level <= 52 then
1079 return 26000 + (level - 44) * 2275
1080 elseif level <= 59 then
1081 return 46800 + (level - 53) * 2600
1082 else
1083 return 65000
1084 end
1085 end
1086  
1087 function lib:GetStanding(name)
1088 name = name or playerName
1089 for i=1, GetNumBattlefieldScores() do
1090 if name == GetBattlefieldScore(i) then
1091 return i
1092 end
1093 end
1094 end
1095  
1096 function lib:GetKillingBlows(name)
1097 local unit, killingBlows
1098 name = name or playerName
1099 for i=1, GetNumBattlefieldScores() do
1100 unit, killingBlows = GetBattlefieldScore(i)
1101 if unit == name then
1102 return killingBlows
1103 end
1104 end
1105 end
1106  
1107 function lib:GetHonorableKills(name)
1108 name = name or playerName
1109 local unit, honorableKills
1110 for i=1, GetNumBattlefieldScores() do
1111 unit, _, honorableKills = GetBattlefieldScore(i)
1112 if unit == name then
1113 return honorableKills
1114 end
1115 end
1116 end
1117  
1118 function lib:GetDeaths(name)
1119 name = name or playerName
1120 local unit, deaths
1121 for i=1, GetNumBattlefieldScores() do
1122 unit, _, _, deaths = GetBattlefieldScore(i)
1123 if unit == name then
1124 return deaths
1125 end
1126 end
1127 end
1128  
1129 function lib:GetBonusHonor(name)
1130 name = name or playerName
1131 local unit, bonusHonor
1132 for i=1, GetNumBattlefieldScores() do
1133 unit, _, _, _, bonusHonor = GetBattlefieldScore(i)
1134 if unit == name then
1135 return bonusHonor
1136 end
1137 end
1138 end
1139  
1140 function lib:GetActiveBattlefieldZone()
1141 local status, mapName
1142 for i = 1, MAX_BATTLEFIELD_QUEUES do
1143 status, mapName = GetBattlefieldStatus(i)
1144 if status == "active" then
1145 return mapName
1146 end
1147 end
1148 end
1149  
1150 function lib:GetActiveBattlefieldUniqueID()
1151 local status, mapName, instanceID
1152 for i = 1, MAX_BATTLEFIELD_QUEUES do
1153 status, mapName, instanceID = GetBattlefieldStatus(i)
1154 if status == "active" then
1155 return mapName .. " " .. instanceID
1156 end
1157 end
1158 end
1159  
1160 local function queuedBattlefieldIndicesIter(_, position)
1161 position = position + 1
1162 while position <= MAX_BATTLEFIELD_QUEUES do
1163 local status, name = GetBattlefieldStatus(position)
1164 if status == "queued" then
1165 return position, name
1166 end
1167 position = position + 1
1168 end
1169 return nil
1170 end
1171 function lib:IterateQueuedBattlefieldZones()
1172 return queuedBattlefieldIndicesIter, nil, 0
1173 end
1174  
1175 local function GetHolder(self, node)
1176 local poi = self:NodeToPOI(node)
1177 if self:IsUncontrolled(node) then
1178 return BGObjectiveDescriptions.UNCONTROLLED
1179 end
1180 if poi and not self:IsDestroyed(poi) then
1181 _, description = GetMapLandmarkInfo(poi)
1182 if string.find(description, PATTERN_OBJECTIVE_HOLDER) then
1183 local _, _, faction = string.find(description, PATTERN_OBJECTIVE_HOLDER)
1184 return faction
1185 end
1186 end
1187 end
1188  
1189 function lib:IsBattlefieldObjective(node)
1190 local poi = self:NodeToPOI(node)
1191 if poi and (GetHolder(self, node) or self:IsInConflict(node) or self:IsDestroyed(node)) then
1192 return true
1193 end
1194 return false
1195 end
1196  
1197 function lib:IsInConflict(node)
1198 local poi = self:NodeToPOI(node)
1199 if poi then
1200 local _, description = GetMapLandmarkInfo(poi)
1201 if description == BGObjectiveDescriptions.IN_CONFLICT then
1202 return true
1203 end
1204 end
1205 return false
1206 end
1207  
1208 function lib:IsAllianceControlled(node)
1209 local poi = self:NodeToPOI(node)
1210 if poi then
1211 local _, description = GetMapLandmarkInfo(poi)
1212 if description == BGObjectiveDescriptions.ALLIANCE_CONTROLLED then
1213 return true
1214 end
1215 end
1216 return false
1217 end
1218  
1219 function lib:IsHordeControlled(node)
1220 local poi = self:NodeToPOI(node)
1221 if poi then
1222 local _, description = GetMapLandmarkInfo(poi)
1223 if description == BGObjectiveDescriptions.HORDE_CONTROLLED then
1224 return true
1225 end
1226 end
1227 return false
1228 end
1229  
1230 if isHorde then
1231 lib.IsFriendlyControlled = lib.IsHordeControlled
1232 lib.IsHostileControlled = lib.IsAllianceControlled
1233 else
1234 lib.IsFriendlyControlled = lib.IsAllianceControlled
1235 lib.IsHostileControlled = lib.IsHordeControlled
1236 end
1237  
1238 function lib:IsUncontrolled(node)
1239 local poi = self:NodeToPOI(node)
1240 if poi then
1241 local _, description = GetMapLandmarkInfo(poi)
1242 if description == BGObjectiveDescriptions.UNCONTROLLED then
1243 return true
1244 end
1245 end
1246 return
1247 end
1248  
1249 function lib:IsDestroyed(node)
1250 local poi = self:NodeToPOI(node)
1251 if poi then
1252 local _, description = GetMapLandmarkInfo(poi)
1253 if description == BGObjectiveDescriptions.DESTROYED then
1254 return true
1255 end
1256 end
1257 return
1258 end
1259  
1260 function lib:GetTimeAttacked(node)
1261 return self.battlefieldObjectiveStatus[node].timeAttacked
1262 end
1263  
1264 function lib:GetTimeToCapture(node)
1265 local t = BattlefieldZoneObjectiveTimes[self:GetActiveBattlefieldZone()] or 0
1266 return t - GetTime() + self.battlefieldObjectiveStatus[node].timeAttacked
1267 end
1268  
1269 function lib:GetName(node)
1270 return self.battlefieldObjectiveStatus[node].name
1271 end
1272  
1273 function lib:GetDefender(node)
1274 return self.battlefieldObjectiveStatus[node].defender
1275 end
1276  
1277 function lib:GetAttacker(node)
1278 return self.battlefieldObjectiveStatus[node].attacker
1279 end
1280  
1281 local function objectiveNodesIter(_, position)
1282 local k = next(self.battlefieldObjectiveStatus, position)
1283 while k ~= nil and type(k) ~= "number" do
1284 k = next(self.battlefieldObjectiveStatus, position)
1285 end
1286 return k
1287 end
1288  
1289 function lib:IterateObjectiveNodes()
1290 return objectiveNodesIter, nil, nil
1291 end
1292  
1293 local function sortedObjectiveNodesIter(t, position)
1294 position = position + 1
1295 if position <= table.getn(t) then
1296 return position, t[position]
1297 else
1298 if compost then
1299 compost:Reclaim(t)
1300 end
1301 return nil
1302 end
1303 end
1304 function lib:IterateSortedObjectiveNodes()
1305 local t = compost and compost:Acquire() or {}
1306 for poi in pairs(self.battlefieldObjectiveStatus) do
1307 if type(poi) == "number" then
1308 table.insert(t, poi)
1309 end
1310 end
1311 table.sort(t, function(a, b)
1312 return self.battlefieldObjectiveStatus[a].ypos and self.battlefieldObjectiveStatus[b].ypos and self.battlefieldObjectiveStatus[a].ypos < self.battlefieldObjectiveStatus[b].ypos
1313 end)
1314 if not next(t) then
1315 if compost then
1316 compost:Reclaim(t)
1317 end
1318 else
1319 return sortedObjectiveNodesIter, t, 0
1320 end
1321 end
1322  
1323 function events:ClearBattlefieldObjectives()
1324 for k in pairs(self.battlefieldObjectiveStatus) do
1325 if compost then
1326 compost:Reclaim(self.battlefieldObjectiveStatus[k])
1327 end
1328 self.battlefieldObjectiveStatus[k] = nil
1329 end
1330 end
1331  
1332 function events:InitializeBattlefieldObjectives()
1333 local n, node, y
1334 events.ClearBattlefieldObjectives(self)
1335 SetMapToCurrentZone()
1336 local numPOIS = GetNumMapLandmarks()
1337 for i=1, numPOIS do
1338 if self:IsBattlefieldObjective(i) then
1339 node, _, _, _, y = GetMapLandmarkInfo(i)
1340 self.battlefieldObjectiveStatus[i] = false and compost and compost:AcquireHash(
1341 'name', node,
1342 'ypos', y,
1343 'defender', GetHolder(self, i),
1344 'inConflict', self:IsInConflict(i),
1345 'isDestroyed', self:IsDestroyed(i)
1346 ) or {
1347 name = node,
1348 ypos = y,
1349 defender = GetHolder(self, i),
1350 inConflict = self:IsInConflict(i),
1351 isDestroyed = self:IsDestroyed(i),
1352 }
1353 self.battlefieldObjectiveStatus[node] = self.battlefieldObjectiveStatus[i]
1354 end
1355 end
1356 end
1357  
1358 function events:OnObjectiveClaimed(node, faction)
1359 local poi = self:NodeToPOI(node)
1360 if poi then
1361 if not next(self.battlefieldObjectiveStatus) then
1362 events.InitializeBattlefieldObjectives(self)
1363 end
1364 local n = self.battlefieldObjectiveStatus[poi]
1365 if n then
1366 n.attacker = faction
1367 n.inConflict = true
1368 n.timeAttacked = GetTime()
1369 end
1370 end
1371 end
1372  
1373 function events:OnObjectiveCaptured(node, faction)
1374 local poi = self:NodeToPOI(node)
1375 if poi then
1376 if not next(self.battlefieldObjectiveStatus) then
1377 events.InitializeBattlefieldObjectives(self)
1378 end
1379 local n = self.battlefieldObjectiveStatus[poi]
1380 if n then
1381 n.defender = GetHolder(self, node) or faction
1382 n.attacker = nil
1383 n.inConflict = nil
1384 n.timeAttacked = nil
1385 end
1386 end
1387 end
1388  
1389 function events:OnObjectiveAttacked(node)
1390 local poi = self:NodeToPOI(node)
1391 if poi then
1392 if not next(self.battlefieldObjectiveStatus) then
1393 events.InitializeBattlefieldObjectives(self)
1394 end
1395 local n = self.battlefieldObjectiveStatus[poi]
1396 if n then
1397 if n.defender == FACTION_ALLIANCE then
1398 n.attacker = FACTION_HORDE
1399 else
1400 n.attacker = FACTION_ALLIANCE
1401 end
1402 n.inConflict = true
1403 n.timeAttacked = GetTime()
1404 end
1405 end
1406 end
1407  
1408 function events:OnObjectiveDefended(node)
1409 local poi = self:NodeToPOI(node)
1410 if poi then
1411 if not next(self.battlefieldObjectiveStatus) then
1412 events.InitializeBattlefieldObjectives(self)
1413 end
1414 local n = self.battlefieldObjectiveStatus[poi]
1415 if n then
1416 n.attacker = nil
1417 n.inConflict = nil
1418 n.timeAttacked = nil
1419 end
1420 end
1421 end
1422  
1423 function events:OnObjectiveDestroyed(node)
1424 local poi = self:NodeToPOI(node)
1425 if poi then
1426 if not next(self.battlefieldObjectiveStatus) then
1427 events.InitializeBattlefieldObjectives(self)
1428 end
1429 local n = self.battlefieldObjectiveStatus[poi]
1430 if n then
1431 n.isDestroyed = true
1432 n.defender = nil
1433 n.attacker = nil
1434 n.inConflict = nil
1435 n.timeAttacked = nil
1436 end
1437 end
1438 end
1439  
1440 function lib:GetAllianceFlagCarrier()
1441 return self.allianceFC
1442 end
1443  
1444 function lib:GetHordeFlagCarrier()
1445 return self.hordeFC
1446 end
1447  
1448 function lib:TargetAllianceFlagCarrier()
1449 if self.allianceFC then
1450 TargetByName(self.allianceFC)
1451 end
1452 end
1453  
1454 function lib:TargetHordeFlagCarrier()
1455 if self.hordeFC then
1456 TargetByName(self.hordeFC)
1457 end
1458 end
1459  
1460 if isHorde then
1461 lib.GetFriendlyFlagCarrier = lib.GetHordeFlagCarrier
1462 lib.GetHostileFlagCarrier = lib.GetAllianceFlagCarrier
1463 lib.TargetFriendlyFlagCarrier = lib.TargetHordeFlagCarrier
1464 lib.TargetHostileFlagCarrier = lib.TargetAllianceFlagCarrier
1465 else
1466 lib.GetFriendlyFlagCarrier = lib.GetAllianceFlagCarrier
1467 lib.GetHostileFlagCarrier = lib.GetHordeFlagCarrier
1468 lib.TargetFriendlyFlagCarrier = lib.TargetAllianceFlagCarrier
1469 lib.TargetHostileFlagCarrier = lib.TargetHordeFlagCarrier
1470 end
1471  
1472 function lib:GetFlagCarrier(faction)
1473 if faction == FACTION_ALLIANCE or faction == "Alliance" or faction == 1 then
1474 return self.allianceFC
1475 else
1476 return self.hordeFC
1477 end
1478 end
1479  
1480 function lib:TargetFlagCarrier(faction)
1481 if faction == FACTION_ALLIANCE or faction == "Alliance" or faction == 1 then
1482 if self.allianceFC then
1483 TargetByName(self.allianceFC)
1484 end
1485 elseif self.hordeFC then
1486 TargetByName(self.hordeFC)
1487 end
1488 end
1489  
1490 function lib:GetNumAllianceBases()
1491 if GetWorldStateUIInfo(1) then
1492 local _, _, bases = string.find(GetWorldStateUIInfo(1), PATTERN_GWSUII_BASES)
1493 return tonumber(bases)
1494 end
1495 end
1496  
1497 function lib:GetNumHordeBases()
1498 if GetWorldStateUIInfo(2) then
1499 local _, _, bases = string.find(GetWorldStateUIInfo(2), PATTERN_GWSUII_BASES)
1500 return tonumber(bases)
1501 end
1502 end
1503  
1504 if isHorde then
1505 lib.GetNumFriendlyBases = lib.GetNumHordeBases
1506 lib.GetNumHostileBases = lib.GetNumAllianceBases
1507 else
1508 lib.GetNumFriendlyBases = lib.GetNumAllianceBases
1509 lib.GetNumHostileBases = lib.GetNumHordeBases
1510 end
1511  
1512 function lib:GetNumBases(team)
1513 if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then
1514 team = 1
1515 else
1516 team = 2
1517 end
1518 if GetWorldStateUIInfo(team) then
1519 local _, _, bases = string.find(GetWorldStateUIInfo(team), PATTERN_GWSUII_BASES)
1520 return tonumber(bases)
1521 end
1522 end
1523  
1524 function lib:GetNumAllianceResources()
1525 if GetWorldStateUIInfo(1) then
1526 local _, _, resources = string.find(GetWorldStateUIInfo(1), PATTERN_GWSUII_RESOURCES)
1527 return tonumber(resources)
1528 end
1529 end
1530  
1531 function lib:GetNumHordeResources()
1532 if GetWorldStateUIInfo(2) then
1533 local _, _, resources = string.find(GetWorldStateUIInfo(2), PATTERN_GWSUII_RESOURCES)
1534 return tonumber(resources)
1535 end
1536 end
1537  
1538 if isHorde then
1539 lib.GetNumFriendlyResources = lib.GetNumHordeResources
1540 lib.GetNumHostileResources = lib.GetNumAllianceResources
1541 else
1542 lib.GetNumFriendlyResources = lib.GetNumAllianceResources
1543 lib.GetNumHostileResources = lib.GetNumHordeResources
1544 end
1545  
1546 function lib:GetNumTeamResources(team)
1547 if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then
1548 return self:GetNumAllianceResources()
1549 else
1550 return self:GetNumHordeResources()
1551 end
1552 end
1553  
1554 function lib:GetAllianceTTV()
1555 return self.aResourceTTV - GetTime() + self.aLastUpdate
1556 end
1557  
1558 function lib:GetHordeTTV()
1559 return self.hResourceTTV - GetTime() + self.hLastUpdate
1560 end
1561  
1562 function lib:GetTeamTTV(team)
1563 if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then
1564 return self:GetAllianceTTV()
1565 else
1566 return self:GetHordeTTV()
1567 end
1568 end
1569  
1570 if isHorde then
1571 lib.GetFriendlyTTV = lib.GetHordeTTV
1572 lib.GetHostileTTV = lib.GetAllianceTTV
1573 else
1574 lib.GetFriendlyTTV = lib.GetAllianceTTV
1575 lib.GetHostileTTV = lib.GetHordeTTV
1576 end
1577  
1578 function lib:GetAllianceScoreString()
1579 if GetWorldStateUIInfo(1) then
1580 local _, _, scoreString = string.find(GetWorldStateUIInfo(1), PATTERN_GWSUII_SCORE)
1581 return scoreString
1582 end
1583 end
1584  
1585 function lib:GetHordeScoreString()
1586 if GetWorldStateUIInfo(2) then
1587 local _, _, scoreString = string.find(GetWorldStateUIInfo(2), PATTERN_GWSUII_SCORE)
1588 return scoreString
1589 end
1590 end
1591  
1592 if isHorde then
1593 lib.GetFriendlyScoreString = lib.GetHordeScoreString
1594 lib.GetHostileScoreString = lib.GetAllianceScoreString
1595 else
1596 lib.GetFriendlyScoreString = lib.GetAllianceScoreString
1597 lib.GetHostileScoreString = lib.GetHordeScoreString
1598 end
1599  
1600 function lib:GetTeamScoreString(team)
1601 if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then
1602 return self:GetAllianceScoreString()
1603 else
1604 return self:GetHordeScoreString()
1605 end
1606 end
1607  
1608 function lib:GetNumAlliancePlayers()
1609 local numPlayers = 0
1610 for i = 1, GetNumBattlefieldScores() do
1611 local _, _, _, _, _, faction = GetBattlefieldScore(i)
1612 if faction == 1 then
1613 numPlayers = numPlayers + 1
1614 end
1615 end
1616 return numPlayers
1617 end
1618  
1619 function lib:GetNumHordePlayers()
1620 local numPlayers = 0
1621 for i = 1, GetNumBattlefieldScores() do
1622 local _, _, _, _, _, faction = GetBattlefieldScore(i)
1623 if faction == 0 then
1624 numPlayers = numPlayers + 1
1625 end
1626 end
1627 return numPlayers
1628 end
1629  
1630 if isHorde then
1631 lib.GetNumFriendlyPlayers = lib.GetNumHordePlayers
1632 lib.GetNumHostilePlayers = lib.GetNumAlliancePlayers
1633 else
1634 lib.GetNumFriendlyPlayers = lib.GetNumAlliancePlayers
1635 lib.GetNumHostilePlayers = lib.GetNumHordePlayers
1636 end
1637  
1638 function lib:GetNumPlayers(team)
1639 if team == FACTION_ALLIANCE or team == "Alliance" or team == 1 then
1640 return self:GetNumAlliancePlayers()
1641 else
1642 return self:GetNumHordePlayers()
1643 end
1644 end
1645  
1646 function lib:NodeToPOI(node)
1647 local landmark, description
1648 if type(node) == "number" and node > 0 and node <= GetNumMapLandmarks() then
1649 return node
1650 elseif type(node) == "string" then
1651 for i = 1, GetNumMapLandmarks() do
1652 if string.lower(node) == string.lower(GetMapLandmarkInfo(i)) then
1653 return i
1654 end
1655 end
1656 end
1657 end
1658  
1659 function lib:GetBGAcronym(bgName)
1660 return BGAcronyms[bgName] or bgName
1661 end
1662  
1663 function lib:GetFactionColor(faction)
1664 if faction then
1665 if faction == "Alliance" or faction == FACTION_ALLIANCE or faction == 1 then
1666 faction = "ALLIANCE"
1667 elseif faction == "Horde" or faction == FACTION_HORDE or faction == 0 or faction == 2 then
1668 faction = "HORDE"
1669 end
1670 local cti = ChatTypeInfo["BG_SYSTEM_" .. faction]
1671 if cti then
1672 return cti.r, cti.g, cti.b
1673 end
1674 end
1675 return 0.7, 0.7, 0.7
1676 end
1677  
1678 function lib:GetFactionHexColor(faction)
1679 local r, g, b = self:GetFactionColor(faction)
1680 return string.format("%02X%02X%02X", 255*r, 255*g, 255*b)
1681 end
1682  
1683 function lib:Register(event, func, arg)
1684 if not self.registry[event] then
1685 self.registry[event] = compost and compost:Acquire() or {}
1686 end
1687 if arg == nil then
1688 arg = event
1689 end
1690 self.registry[event][func] = arg
1691 end
1692  
1693 function lib:Unregister(event, func)
1694 if self.registry[event][func] then
1695 self.registry[event][func] = nil
1696 end
1697 if not next(self.registry[event]) then
1698 if compost then
1699 compost:Reclaim(self.registry[event])
1700 end
1701 self.registry[event] = nil
1702 end
1703 end
1704  
1705 function lib:UnregisterAll(object)
1706 for event in pairs(self.registry) do
1707 self.registry[event][object] = nil
1708 for func, u in pairs(self.registry[event]) do
1709 if u == object then
1710 self.registry[event][func] = nil
1711 end
1712 end
1713 end
1714 end
1715  
1716 GloryLib:Register(lib)
1717 lib = nil