Mercurial > wow > ouroloot
comparison core.lua @ 10:67b8537e8432
More work on ML/EQDKP generator and its spawned subprojects.
author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
---|---|
date | Tue, 28 Jun 2011 07:36:26 +0000 |
parents | 30ba1f35e164 |
children | 952c3ac0e783 |
comparison
equal
deleted
inserted
replaced
9:4fba9c6b5d3d | 10:67b8537e8432 |
---|---|
156 local g_wafer_thin = nil -- for prompting for additional rebroadcasters | 156 local g_wafer_thin = nil -- for prompting for additional rebroadcasters |
157 local g_today = nil -- "today" entry in g_loot | 157 local g_today = nil -- "today" entry in g_loot |
158 local opts = nil | 158 local opts = nil |
159 | 159 |
160 local pairs, ipairs, tinsert, tremove, tonumber = pairs, ipairs, table.insert, table.remove, tonumber | 160 local pairs, ipairs, tinsert, tremove, tonumber = pairs, ipairs, table.insert, table.remove, tonumber |
161 | |
162 local pprint, tabledump = addon.pprint, flib.tabledump | 161 local pprint, tabledump = addon.pprint, flib.tabledump |
163 | 162 local GetNumRaidMembers = GetNumRaidMembers |
164 -- En masse forward decls of symbols defined inside local blocks | 163 -- En masse forward decls of symbols defined inside local blocks |
165 local _register_bossmod | 164 local _register_bossmod |
166 local makedate, create_new_cache, _init | 165 local makedate, create_new_cache, _init |
167 | 166 |
168 -- Hypertext support, inspired by DBM broadcast pizza timers | 167 -- Hypertext support, inspired by DBM broadcast pizza timers |
249 foo:test("blah") -- returns true | 248 foo:test("blah") -- returns true |
250 ]] | 249 ]] |
251 do | 250 do |
252 local caches = {} | 251 local caches = {} |
253 local cleanup_group = AnimTimerFrame:CreateAnimationGroup() | 252 local cleanup_group = AnimTimerFrame:CreateAnimationGroup() |
253 local time = _G.time | |
254 cleanup_group:SetLooping("REPEAT") | 254 cleanup_group:SetLooping("REPEAT") |
255 cleanup_group:SetScript("OnLoop", function(cg) | 255 cleanup_group:SetScript("OnLoop", function(cg) |
256 addon.dprint('cache',"OnLoop firing") | 256 addon.dprint('cache',"OnLoop firing") |
257 local now = GetTime() | 257 local now = time() |
258 local alldone = true | 258 local alldone = true |
259 -- this is ass-ugly | 259 -- this is ass-ugly |
260 for _,c in ipairs(caches) do | 260 for _,c in ipairs(caches) do |
261 while (#c > 0) and (now - c[1].t > c.ttl) do | 261 while (#c > 0) and (now - c[1].t > c.ttl) do |
262 addon.dprint('cache', c.name, "cache removing",c[1].t, c[1].m) | 262 addon.dprint('cache', c.name, "cache removing",c[1].t, c[1].m) |
273 end | 273 end |
274 addon.dprint('cache',"OnLoop done") | 274 addon.dprint('cache',"OnLoop done") |
275 end) | 275 end) |
276 | 276 |
277 local function _add (cache, x) | 277 local function _add (cache, x) |
278 tinsert(cache, {t=GetTime(),m=x}) | 278 tinsert(cache, {t=time(),m=x}) |
279 if not cleanup_group:IsPlaying() then | 279 if not cleanup_group:IsPlaying() then |
280 addon.dprint('cache', cache.name, "STARTING animation group") | 280 addon.dprint('cache', cache.name, "STARTING animation group") |
281 cache.cleanup:SetDuration(2) -- hmmm | 281 cache.cleanup:SetDuration(2) -- hmmm |
282 cleanup_group:Play() | 282 cleanup_group:Play() |
283 end | 283 end |
353 _init(self) | 353 _init(self) |
354 self.OnInitialize = nil | 354 self.OnInitialize = nil |
355 end | 355 end |
356 | 356 |
357 function addon:OnEnable() | 357 function addon:OnEnable() |
358 self:RegisterEvent "PLAYER_LOGOUT" | 358 self:RegisterEvent("PLAYER_LOGOUT") |
359 self:RegisterEvent "RAID_ROSTER_UPDATE" | 359 self:RegisterEvent("RAID_ROSTER_UPDATE") |
360 | 360 |
361 -- Cribbed from Talented. I like the way jerry thinks: the first argument | 361 -- Cribbed from Talented. I like the way jerry thinks: the first argument |
362 -- can be a format spec for the remainder of the arguments. (The new | 362 -- can be a format spec for the remainder of the arguments. (The new |
363 -- AceConsole:Printf isn't used because we can't specify a prefix without | 363 -- AceConsole:Printf isn't used because we can't specify a prefix without |
364 -- jumping through ridonkulous hoops.) The part about overriding :Print | 364 -- jumping through ridonkulous hoops.) The part about overriding :Print |
399 OuroLootSV_hist = nil | 399 OuroLootSV_hist = nil |
400 ReloadUI() | 400 ReloadUI() |
401 end | 401 end |
402 function addon:PLAYER_LOGOUT() | 402 function addon:PLAYER_LOGOUT() |
403 if (#g_loot > 0) or g_loot.saved | 403 if (#g_loot > 0) or g_loot.saved |
404 -- someday make this smarter | |
404 or (g_loot.forum and g_loot.forum ~= "") | 405 or (g_loot.forum and g_loot.forum ~= "") |
405 or (g_loot.attend and g_loot.attend ~= "") | 406 or (g_loot.attend and g_loot.attend ~= "") |
406 then | 407 then |
407 g_loot.autoshard = self.sharder | 408 g_loot.autoshard = self.sharder |
408 g_loot.threshold = self.threshold | 409 g_loot.threshold = self.threshold |
421 end | 422 end |
422 end end | 423 end end |
423 OuroLootSV_hist = self.history_all | 424 OuroLootSV_hist = self.history_all |
424 end | 425 end |
425 | 426 |
426 function addon:RAID_ROSTER_UPDATE (event) | 427 do |
427 if GetNumRaidMembers() > 0 then | 428 local IsInInstance, UnitName, UnitIsConnected, UnitClass, UnitRace, UnitSex, |
429 UnitLevel, UnitInRaid, UnitIsVisible, GetGuildInfo = | |
430 IsInInstance, UnitName, UnitIsConnected, UnitClass, UnitRace, UnitSex, | |
431 UnitLevel, UnitInRaid, UnitIsVisible, GetGuildInfo | |
432 local time, difftime = time, difftime | |
433 local R_ACTIVE, R_OFFLINE, R_LEFT = 1, 2, 3 | |
434 | |
435 local lastevent, now = 0, 0 | |
436 local timer_handle | |
437 | |
438 function addon:CheckRoster (leaving_p, now_a) | |
439 if not g_loot.raiders then return end -- bad transition | |
440 | |
441 now = now_a or time() | |
442 | |
443 if leaving_p then | |
444 for name,r in pairs(g_loot.raiders) do | |
445 r.leave = r.leave or now | |
446 end | |
447 return | |
448 end | |
449 | |
450 for name,r in pairs(g_loot.raiders) do | |
451 if r.online ~= R_LEFT and not UnitInRaid(name) then | |
452 r.online = R_LEFT | |
453 r.leave = now | |
454 end | |
455 end | |
456 | |
457 local redo = false | |
458 for i = 1, GetNumRaidMembers() do | |
459 local unit = 'raid'..i | |
460 local name = UnitName(unit) | |
461 -- No, that's not my typo, it really is "uknownbeing" in Blizzard's code. | |
462 if name and name ~= UNKNOWN and name ~= UNKNOWNOBJECT and name ~= UKNOWNBEING then | |
463 if not g_loot.raiders[name] then | |
464 g_loot.raiders[name] = { needinfo=true } | |
465 end | |
466 local r = g_loot.raiders[name] | |
467 if r.needinfo and UnitIsVisible(unit) then | |
468 r.needinfo = nil | |
469 r.class = select(2,UnitClass(unit)) | |
470 r.race = select(2,UnitRace(unit)) | |
471 r.sex = UnitSex(unit) | |
472 r.level = UnitLevel(unit) | |
473 r.guild = GetGuildInfo(unit) | |
474 end | |
475 local connected = UnitIsConnected(unit) | |
476 if connected and r.online ~= R_ACTIVE then | |
477 r.join = r.join or now | |
478 r.online = R_ACTIVE | |
479 elseif (not connected) and r.online ~= R_OFFLINE then | |
480 r.leave = now | |
481 r.online = R_OFFLINE | |
482 end | |
483 redo = redo or r.needinfo | |
484 end | |
485 end | |
486 if redo then | |
487 timer_handle = self:ScheduleRepeatingTimer("RAID_ROSTER_UPDATE", 60) | |
488 elseif timer_handle then | |
489 self:CancelTimer(timer_handle) | |
490 timer_handle = nil | |
491 end | |
492 end | |
493 | |
494 function addon:RAID_ROSTER_UPDATE (event) | |
495 if GetNumRaidMembers() == 0 then | |
496 -- Because of PLAYER_ENTERING_WORLD, this code also executes on load | |
497 -- screens while soloing and in regular groups. Take care. | |
498 if self.enabled then | |
499 self.popped = nil | |
500 self:UnregisterEvent("CHAT_MSG_LOOT") | |
501 self:CheckRoster(--[[leaving raid]]true) | |
502 end | |
503 return | |
504 end | |
505 | |
428 local inside,whatkind = IsInInstance() | 506 local inside,whatkind = IsInInstance() |
429 if inside and (whatkind == "pvp" or whatkind == "arena") then | 507 if inside and (whatkind == "pvp" or whatkind == "arena") then |
430 return self.dprint('flow', "got RRU event but in pvp zone, bailing") | 508 return self.dprint('flow', "got RRU event but in pvp zone, bailing") |
431 end | 509 end |
510 | |
511 local docheck = self.enabled | |
432 if event == "Activate" then | 512 if event == "Activate" then |
433 -- dispatched manually from Activate | 513 -- dispatched manually from Activate |
434 self:RegisterEvent "CHAT_MSG_LOOT" | 514 self:RegisterEvent("CHAT_MSG_LOOT") |
435 _register_bossmod(self) | 515 _register_bossmod(self) |
516 docheck = true | |
436 elseif event == "RAID_ROSTER_UPDATE" then | 517 elseif event == "RAID_ROSTER_UPDATE" then |
518 -- hot code path, be careful | |
519 | |
437 -- event registration from onload, joined a raid, maybe show popup | 520 -- event registration from onload, joined a raid, maybe show popup |
438 if opts.popup_on_join and not self.popped then | 521 if (not self.popped) and opts.popup_on_join then |
439 self.popped = StaticPopup_Show "OUROL_REMIND" | 522 self.popped = StaticPopup_Show "OUROL_REMIND" |
440 self.popped.data = self | 523 self.popped.data = self |
441 end | 524 return |
442 end | 525 end |
443 else | 526 end |
444 self:UnregisterEvent "CHAT_MSG_LOOT" | 527 if docheck and not InCombatLockdown() then |
445 self.popped = nil | 528 now = time() |
529 if difftime(now,lastevent) > 45 then | |
530 lastevent = now | |
531 self:CheckRoster(false,now) | |
532 end | |
533 end | |
446 end | 534 end |
447 end | 535 end |
448 | 536 |
449 -- helper for CHAT_MSG_LOOT handler | 537 -- helper for CHAT_MSG_LOOT handler |
450 do | 538 do |
643 end | 731 end |
644 | 732 |
645 | 733 |
646 ------ On/off | 734 ------ On/off |
647 function addon:Activate (opt_threshold, opt_bcast_only) | 735 function addon:Activate (opt_threshold, opt_bcast_only) |
648 self:RegisterEvent "RAID_ROSTER_UPDATE" | 736 self:RegisterEvent("RAID_ROSTER_UPDATE") |
737 self:RegisterEvent("PLAYER_ENTERING_WORLD","RAID_ROSTER_UPDATE") | |
649 self.popped = true | 738 self.popped = true |
650 if GetNumRaidMembers() > 0 then | 739 if GetNumRaidMembers() > 0 then |
651 self:RAID_ROSTER_UPDATE("Activate") | 740 self:RAID_ROSTER_UPDATE("Activate") |
652 elseif self.debug.notraid then | 741 elseif self.debug.notraid then |
653 self:RegisterEvent "CHAT_MSG_LOOT" | 742 self:RegisterEvent("CHAT_MSG_LOOT") |
654 _register_bossmod(self) | 743 _register_bossmod(self) |
655 elseif g_restore_p then | 744 elseif g_restore_p then |
656 g_restore_p = nil | 745 g_restore_p = nil |
657 if #g_loot == 0 then return end -- only saved texts, not worth verbage | 746 if #g_loot == 0 then return end -- only saved texts, not worth verbage |
658 self:Print("Ouro Raid Loot restored previous data, but not in a raid", | 747 self:Print("Ouro Raid Loot restored previous data, but not in a raid", |
675 -- Note: running '/loot off' will also avoid the popup reminder when | 764 -- Note: running '/loot off' will also avoid the popup reminder when |
676 -- joining a raid, but will not change the saved option setting. | 765 -- joining a raid, but will not change the saved option setting. |
677 function addon:Deactivate() | 766 function addon:Deactivate() |
678 self.enabled = false | 767 self.enabled = false |
679 self.rebroadcast = false | 768 self.rebroadcast = false |
680 self:UnregisterEvent "RAID_ROSTER_UPDATE" | 769 self:UnregisterEvent("RAID_ROSTER_UPDATE") |
681 self:UnregisterEvent "CHAT_MSG_LOOT" | 770 self:UnregisterEvent("PLAYER_ENTERING_WORLD") |
771 self:UnregisterEvent("CHAT_MSG_LOOT") | |
682 self:Print("Ouro Raid Loot deactivated.") | 772 self:Print("Ouro Raid Loot deactivated.") |
683 end | 773 end |
684 | 774 |
685 function addon:Clear(verbose_p) | 775 function addon:Clear(verbose_p) |
686 local repopup, st | 776 local repopup, st |
817 self.dprint('flow', "restoring", #g_loot, "entries") | 907 self.dprint('flow', "restoring", #g_loot, "entries") |
818 self:ScheduleTimer("Activate", 8, g_loot.threshold) | 908 self:ScheduleTimer("Activate", 8, g_loot.threshold) |
819 -- FIXME printed could be too large if entries were deleted, how much do we care? | 909 -- FIXME printed could be too large if entries were deleted, how much do we care? |
820 self.sharder = g_loot.autoshard | 910 self.sharder = g_loot.autoshard |
821 else | 911 else |
822 g_loot = { printed = {} } | 912 g_loot = { printed = {}, raiders = {} } |
823 g_loot.saved = g_saved_tmp; g_saved_tmp = nil -- potentially restore across a clear | 913 g_loot.saved = g_saved_tmp; g_saved_tmp = nil -- potentially restore across a clear |
824 end | 914 end |
825 | 915 |
826 self.threshold = g_loot.threshold or self.threshold -- in the case of restoring but not tracking | 916 self.threshold = g_loot.threshold or self.threshold -- in the case of restoring but not tracking |
827 self:gui_init(g_loot) | 917 self:gui_init(g_loot) |
1091 setmetatable(e,loot_entry_mt) | 1181 setmetatable(e,loot_entry_mt) |
1092 | 1182 |
1093 if not done_todays_date then do_todays_date() end | 1183 if not done_todays_date then do_todays_date() end |
1094 | 1184 |
1095 local h, m = GetGameTime() | 1185 local h, m = GetGameTime() |
1096 local localuptime = math.floor(GetTime()) | 1186 --local localuptime = math.floor(GetTime()) |
1187 local time_t = time() | |
1097 e.hour = h | 1188 e.hour = h |
1098 e.minute = m | 1189 e.minute = m |
1099 e.stamp = localuptime | 1190 e.stamp = time_t --localuptime |
1100 local index = #g_loot + 1 | 1191 local index = #g_loot + 1 |
1101 g_loot[index] = e | 1192 g_loot[index] = e |
1102 return index | 1193 return index |
1103 end | 1194 end |
1104 end | 1195 end |
1124 local n = #(g_loot.saved) + 1 | 1215 local n = #(g_loot.saved) + 1 |
1125 local save = { | 1216 local save = { |
1126 name = name, | 1217 name = name, |
1127 date = makedate(), | 1218 date = makedate(), |
1128 count = #g_loot, | 1219 count = #g_loot, |
1129 forum = g_loot.forum, | |
1130 attend = g_loot.attend, | |
1131 } | 1220 } |
1221 for text in self:registered_textgen_iter() do | |
1222 save[text] = g_loot[text] | |
1223 end | |
1132 self:Print("Saving current loot texts to #%d '%s'", n, name) | 1224 self:Print("Saving current loot texts to #%d '%s'", n, name) |
1133 g_loot.saved[n] = save | 1225 g_loot.saved[n] = save |
1134 return self:save_list() | 1226 return self:save_list() |
1135 end | 1227 end |
1136 | 1228 |
1142 local save = s[num] | 1234 local save = s[num] |
1143 self:Print("Overwriting current loot data with saved text #%d '%s'", num, save.name) | 1235 self:Print("Overwriting current loot data with saved text #%d '%s'", num, save.name) |
1144 self:Clear(--[[verbose_p=]]false) | 1236 self:Clear(--[[verbose_p=]]false) |
1145 -- Clear will already have displayed the window, and re-selected the first | 1237 -- Clear will already have displayed the window, and re-selected the first |
1146 -- tab. Set these up for when the text tabs are clicked. | 1238 -- tab. Set these up for when the text tabs are clicked. |
1147 g_loot.forum = save.forum | 1239 for text in self:registered_textgen_iter() do |
1148 g_loot.attend = save.attend | 1240 g_loot[text] = save[text] |
1241 end | |
1149 end | 1242 end |
1150 | 1243 |
1151 function addon:save_delete(num) | 1244 function addon:save_delete(num) |
1152 local s = self:check_saved_table(); if not s then return end; | 1245 local s = self:check_saved_table(); if not s then return end; |
1153 if (not num) or (num > #s) then | 1246 if (not num) or (num > #s) then |