farmbuyer@2: local addon = select(2,...) farmbuyer@67: if addon.NOLOAD then return end farmbuyer@2: farmbuyer@42: --[==[ farmbuyer@2: Here's the control flow: farmbuyer@42: (1) This file or another addon calls farmbuyer@42: addon:register_boss_mod("Foo",register[,unregister]) farmbuyer@2: (2) When OL decides it's time to register with a boss mod, it calls farmbuyer@2: register (addon, addon_do_boss) farmbuyer@2: which should do whatever's needed. This may happen more than once, if OL farmbuyer@42: is turned on/off, etc. It should return a true value if successful. farmbuyer@2: (2b) If a boss mod is already in place, farmbuyer@2: unregister (addon) farmbuyer@2: will be called first, if such a function was given at the start. farmbuyer@2: (3) When the boss mod triggers a callback, this code should call farmbuyer@2: addon_do_boss (.....) farmbuyer@2: with the crapton of data passed as in the DBM-related code below. farmbuyer@2: farmbuyer@2: NOTA BENE: farmbuyer@2: - 'register' will not be called multiple times in a row for the same boss mod. farmbuyer@2: - The callback for (3) must check if OL is appropriately active. farmbuyer@2: farmbuyer@2: ------ Constants farmbuyer@6: ------ Globals farmbuyer@2: ------ Deadly Boss Mods farmbuyer@42: ]==] farmbuyer@2: farmbuyer@2: ------ Constants farmbuyer@2: farmbuyer@6: ------ Globals farmbuyer@2: local flib = LibStub("LibFarmbuyer") farmbuyer@2: local pprint, tabledump = addon.pprint, flib.tabledump farmbuyer@2: farmbuyer@2: -- Lua farmbuyer@6: local pairs, ipairs, tinsert, tremove = pairs, ipairs, table.insert, table.remove farmbuyer@6: local tonumber = tonumber farmbuyer@2: farmbuyer@2: -- WoW farmbuyer@56: --local GetRaidRosterInfo = GetRaidRosterInfo farmbuyer@2: farmbuyer@2: -- OL farmbuyer@2: local addon_do_boss farmbuyer@2: farmbuyer@2: farmbuyer@2: ------ Deadly Boss Mods farmbuyer@2: do farmbuyer@42: local DBM farmbuyer@56: local location, maxsize farmbuyer@42: local real_loadmod farmbuyer@42: -- When zoning into a raid instance not seen this session, make sure farmbuyer@42: -- we don't report a previous raid instance as current location. DBM farmbuyer@42: -- has no callback event for this, so we do a small hook instead. farmbuyer@42: local function resetting_loadmod (...) farmbuyer@42: addon.latest_instance = nil farmbuyer@42: return real_loadmod(...) farmbuyer@42: end farmbuyer@42: farmbuyer@2: local function DBMBossCallback (self, reason, mod, ...) farmbuyer@2: if (not self.rebroadcast) and (not self.enabled) then return end farmbuyer@2: farmbuyer@106: -- Behavior based on the first arg to DBM:NewMod. Old style is just farmbuyer@106: -- a boss name, which is set as mod.id and *should* also be set as farmbuyer@106: -- combatinfo.name. New style is the "encounter ID", fed through the farmbuyer@106: -- EJ_GetEncounterInfo API to get the name, and then stripped down farmbuyer@106: -- to the first comma (if any). farmbuyer@2: local name farmbuyer@2: if mod.combatInfo and mod.combatInfo.name then farmbuyer@2: name = mod.combatInfo.name farmbuyer@2: elseif mod.id then farmbuyer@2: name = mod.id farmbuyer@2: else farmbuyer@2: name = "Unknown Boss" farmbuyer@2: end farmbuyer@2: farmbuyer@56: local it farmbuyer@56: if location then farmbuyer@56: it = location farmbuyer@56: else farmbuyer@56: it, maxsize = self.instance_tag() farmbuyer@56: end farmbuyer@42: self.latest_instance = it farmbuyer@2: location = nil farmbuyer@2: farmbuyer@2: local duration = 0 farmbuyer@2: if mod.combatInfo and mod.combatInfo.pull then farmbuyer@2: duration = math.floor (GetTime() - mod.combatInfo.pull) farmbuyer@2: end farmbuyer@2: farmbuyer@56: return addon_do_boss (self, reason, name, it, maxsize, duration) farmbuyer@2: end farmbuyer@2: farmbuyer@2: local function callback(...) DBMBossCallback(addon,...) end farmbuyer@2: farmbuyer@2: local function _registerDBM (self, OL_boss_worker) farmbuyer@42: DBM = _G.DBM farmbuyer@42: if DBM then farmbuyer@2: local rev = tonumber(DBM.Revision) or 0 farmbuyer@2: if rev < 1503 then farmbuyer@2: self.status_text = "|cffff1010Deadly Boss Mods must be version 1.26 or newer to work with Ouro Loot.|r" farmbuyer@2: return farmbuyer@2: end farmbuyer@2: addon_do_boss = OL_boss_worker farmbuyer@42: local r = DBM:RegisterCallback("kill", callback) farmbuyer@42: DBM:RegisterCallback("wipe", callback) farmbuyer@56: DBM:RegisterCallback("pull", function() farmbuyer@56: location, maxsize = self.instance_tag() farmbuyer@56: end) farmbuyer@42: real_loadmod = DBM.LoadMod farmbuyer@42: DBM.LoadMod = resetting_loadmod farmbuyer@2: return r > 0 farmbuyer@2: else farmbuyer@2: self.status_text = "|cffff1010Ouro Loot cannot find Deadly Boss Mods, loot will not be grouped by boss.|r" farmbuyer@2: end farmbuyer@2: end farmbuyer@2: farmbuyer@42: local function _unregisterDBM (self) farmbuyer@42: self.latest_instance = nil farmbuyer@42: DBM.LoadMod = real_loadmod farmbuyer@42: end farmbuyer@42: farmbuyer@42: addon:register_boss_mod ("DBM", _registerDBM, _unregisterDBM) farmbuyer@2: end -- DBM tie-ins farmbuyer@2: farmbuyer@2: farmbuyer@2: -- DXE, BigWigs, etc, need to be researched for this too farmbuyer@2: farmbuyer@2: -- vim:noet