local myname, ns = ... local core = LibStub("AceAddon-3.0"):GetAddon("SilverDragon") local module = core:NewModule("Mobs", "AceConsole-3.0") local Debug = core.Debug local function toggle_mob(id) return { arg = id, name = core:GetMobLabel(id), desc = "ID: " .. id, type = "toggle", -- width = "double", descStyle = "inline", order = id, } end local mob_names = {} local function input_to_mobid(value) if not value then return end value = value:trim() if value == "target" or value == "mouseover" then return core:UnitID(value) end if value:match("^%d+$") then return tonumber(value) end return mob_names[value] or core:IdForMob(value) end ns.input_to_mobid = input_to_mobid local function mob_input(name, desc, order, setter) return { type = "input", name = name, desc = desc, get = function() return "" end, set = function(info, value) setter(info, input_to_mobid(value)) end, validate = function(info, value) if input_to_mobid(value) then return true end end, order = order, } end function module:OnEnable() local config = core:GetModule("Config", true) if not config then return end core.RegisterCallback(self, "OptionsRequested") core.RegisterCallback(self, "IgnoreChanged") core.RegisterCallback(self, "CustomChanged") core.RegisterCallback(self, "Seen") end function module:Seen(callback, id, zone, x, y, dead, source) local name = core:NameForMob(id) if name then mob_names[name] = id end local config = core:GetModule("Config", true) if config and config.options.plugins.mobs then local args = config.options.plugins.mobs.mobs.args.ignore.args.mobs.args args["mob"..id] = args["mob"..id] or toggle_mob(id) end end function module:IgnoreChanged(callback, id, ignored) if not ignored then return end local config = core:GetModule("Config", true) if config and config.options.plugins.mobs then config.options.plugins.mobs.mobs.args.ignore.args.mobs.args["mob"..id] = toggle_mob(id) end end function module:CustomChanged(callback, id, watched) if not watched then return end local config = core:GetModule("Config", true) if config and config.options.plugins.mobs then config.options.plugins.mobs.mobs.args.custom.args.mobs.args["mob"..id] = toggle_mob(id) end end function module:OptionsRequested(callback, options) options.plugins.mobs = { mobs = { type = "group", name = "Mobs", childGroups = "tab", order = 15, args = { custom = { type = "group", name = "Custom", order = 1, args = { add = mob_input(ADD, "Add a mob by entering its id, name, 'target', or 'mouseover'.", 1, function(info, id) core:SetCustom(id, true) end), mobs = { type = "group", name = REMOVE, inline = true, get = function(info) return core.db.global.always[info.arg] end, set = function(info, value) core:SetCustom(info.arg, not core.db.global.always[info.arg]) end, args = {}, }, }, }, ignore = { type = "group", name = "Ignore", desc = "Mobs you just want to ignore, already", args = { add = mob_input(ADD, "Add a mob by entering its id, name, 'target', or 'mouseover'.", 1, function(info, id) core:SetIgnore(id, true) end), mobs = { type = "group", name = REMOVE, inline = true, get = function(info) return core.db.global.ignore[info.arg] end, set = function(info, value) core:SetIgnore(info.arg, not core.db.global.ignore[info.arg]) end, args = { desc = core:GetModule("Config").desc("This will fill in as rare mobs are seen in the current session.", 0), }, } }, order = 2, }, }, }, } self:BuildIgnoreList(options) self:BuildCustomList(options) self:BuildMobList(options) core.UnregisterCallback(self, "OptionsRequested") end function module:BuildIgnoreList(options) -- wipe(options.plugins.mobs.mobs.args.ignore.args.mobs.args) local args = options.plugins.mobs.mobs.args.ignore.args.mobs.args for id, ignored in pairs(core.db.global.ignore) do if ignored then args["mob"..id] = args["mob"..id] or toggle_mob(id) end end for name, id in pairs(mob_names) do args["mob"..id] = args["mob"..id] or toggle_mob(id) end end function module:BuildCustomList(options) -- wipe(options.plugins.mobs.mobs.args.custom.args.mobs.args) local args = options.plugins.mobs.mobs.args.custom.args.mobs.args for id, active in pairs(core.db.global.always) do if active then args["mob"..id] = args["mob"..id] or toggle_mob(id) end end end function module:BuildMobList(options) ns:LoadAllAchievementMobs() for source, data in pairs(core.datasources) do local group = { type = "group", name = source, get = function(info) return not core.db.global.ignore[info.arg] end, set = function(info, value) core:SetIgnore(info.arg, not value) end, args = { enabled = { type = "toggle", name = ENABLE, desc = "If you disable this, SilverDragon will just not know about these mobs. They'll still be announced when you mouse over them, like any unknown rare.", arg = source, get = function(info) return core.db.global.datasources[info.arg] end, set = function(info, value) core.db.global.datasources[info.arg] = value core:BuildLookupTables() end, disabled = false, }, ignore = { type = "toggle", name = IGNORE, desc = "Ignore every mob provided by this module. This will make them all not be announced, regardless of any other settings.", arg = source, get = function(info) return core.db.global.ignore_datasource[info.arg] end, set = function(info, value) core.db.global.ignore_datasource[info.arg] = value core:BuildLookupTables() end, disabled = function(info) return not core.db.global.datasources[info.arg] end, }, zones = { type = "group", name = ZONE, inline = false, childGroups = "tree", args = {}, }, }, } local mob_toggle_disabled = function(info) return not core.db.global.datasources[info[#info - 3]] end for id, mob in pairs(data) do if ns.mobs_to_achievement[id] then local achievement = ns.mobs_to_achievement[id] if not group.args.achievements then group.args.achievements = { type = "group", name = ACHIEVEMENTS, inline = false, childGroups = "tree", args = {}, } end if not group.args.achievements.args["achievement"..achievement] then group.args.achievements.args["achievement"..achievement] = { type = "group", inline = false, name = select(2, GetAchievementInfo(achievement)) or "achievement:"..achievement, desc = "ID: " .. achievement, args = { all = { type = "execute", name = ALL, desc = "Select every mob in the list", func = function(info) if not ns.achievements[achievement] then return end for mobid, criteria in pairs(ns.achievements[achievement]) do core:SetIgnore(mobid, false, true) end self:BuildIgnoreList(info.options) end, width = "half", order = 1, }, none = { type = "execute", name = NONE, desc = "Deselect every mob in the list", func = function(info) if not ns.achievements[achievement] then return end for mobid, criteria in pairs(ns.achievements[achievement]) do core:SetIgnore(mobid, true, true) end self:BuildIgnoreList(info.options) end, width = "half", order = 2, }, }, } end local toggle = toggle_mob(id) toggle.disabled = mob_toggle_disabled group.args.achievements.args["achievement"..achievement].args["mob"..id] = toggle end if not mob.hidden and mob.locations then for zone in pairs(mob.locations) do if not group.args.zones.args["map"..zone] then group.args.zones.args["map"..zone] = { type = "group", inline = false, name = core.zone_names[zone] or ("map"..zone), desc = "ID: " .. zone, args = { all = { type = "execute", name = ALL, desc = "Select every mob in the list", func = function(info) if not ns.mobsByZone[zone] then return end for mobid, locations in pairs(ns.mobsByZone[zone]) do core:SetIgnore(mobid, false, true) end self:BuildIgnoreList(info.options) end, width = "half", order = 1, }, none = { type = "execute", name = NONE, desc = "Deselect every mob in the list", func = function(info) if not ns.mobsByZone[zone] then return end for mobid, locations in pairs(ns.mobsByZone[zone]) do core:SetIgnore(mobid, true, true) end self:BuildIgnoreList(info.options) end, width = "half", order = 2, }, }, } end local toggle = toggle_mob(id) toggle.disabled = mob_toggle_disabled group.args.zones.args["map"..zone].args["mob"..id] = toggle end end end options.plugins.mobs.mobs.args[source] = group end end