You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
8.6 KiB
303 lines
8.6 KiB
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 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 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")
|
|
end
|
|
|
|
|
|
function module:IgnoreChanged(callback, id, ignored)
|
|
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] = ignored and toggle_mob(id) or nil
|
|
end
|
|
end
|
|
function module:CustomChanged(callback, id, watched)
|
|
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] = watched and toggle_mob(id) or nil
|
|
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() return true end,
|
|
set = function(info, value)
|
|
core:SetCustom(info.arg, false)
|
|
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() return true end,
|
|
set = function(info, value)
|
|
core:SetIgnore(info.arg, false)
|
|
end,
|
|
args = {},
|
|
}
|
|
},
|
|
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)
|
|
for id, ignored in pairs(core.db.global.ignore) do
|
|
if ignored then
|
|
options.plugins.mobs.mobs.args.ignore.args.mobs.args["mob"..id] = toggle_mob(id)
|
|
end
|
|
end
|
|
end
|
|
|
|
function module:BuildCustomList(options)
|
|
wipe(options.plugins.mobs.mobs.args.custom.args.mobs.args)
|
|
for id, active in pairs(core.db.global.always) do
|
|
if active then
|
|
options.plugins.mobs.mobs.args.custom.args.mobs.args["mob"..id] = 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
|
|
|