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.

310 lines
8.6 KiB

4 years ago
-- ----------------------------------------------------------------------------
-- Localized Lua globals.
-- ----------------------------------------------------------------------------
-- Functions
local pairs = _G.pairs
-- Libraries
local table = _G.table
-- ----------------------------------------------------------------------------
-- AddOn namespace.
-- ----------------------------------------------------------------------------
local AddOnFolderName, private = ...
local Data = private.Data
local Enum = private.Enum
local LibStub = _G.LibStub
local AceConfigRegistry = LibStub("AceConfigRegistry-3.0")
local NPCScan = LibStub("AceAddon-3.0"):GetAddon(AddOnFolderName)
local L = LibStub("AceLocale-3.0"):GetLocale(AddOnFolderName)
-- ----------------------------------------------------------------------------
-- Variables.
-- ----------------------------------------------------------------------------
local profile
-- ----------------------------------------------------------------------------
-- Ignored continent options.
-- ----------------------------------------------------------------------------
local AlphabeticalContinentMaps = {}
local ContinentAndMapOptions = {}
local ContinentIDs = {}
local function UpdateContinentAndMapOptions()
table.wipe(ContinentAndMapOptions)
if #ContinentIDs == 0 then
for index = 1, #Enum.ContinentMapID do
ContinentIDs[#ContinentIDs + 1] = index
end
table.sort(
ContinentIDs,
function(a, b)
return Data.Continents[a].name < Data.Continents[b].name
end
)
end
if #AlphabeticalContinentMaps == 0 then
for mapID, mapData in pairs(Data.Maps) do
local continentID = mapData.continentID
AlphabeticalContinentMaps[continentID] = AlphabeticalContinentMaps[continentID] or {}
AlphabeticalContinentMaps[continentID][#AlphabeticalContinentMaps[continentID] + 1] = mapID
end
for index = 1, #AlphabeticalContinentMaps do
table.sort(AlphabeticalContinentMaps[index], private.SortByMapNameThenByID)
end
end
for continentIndex = 1, #ContinentIDs do
local continentID = ContinentIDs[continentIndex]
local continentStatus = profile.detection.continentIDs[continentID]
local continent = Data.Continents[continentID]
local continentOptionsTable = {
order = continentIndex,
name = ("%s%s|r"):format(private.DetectionGroupStatusColors[continentStatus], continent.name),
descStyle = "inline",
type = "group",
childGroups = "tab",
args = {
status = {
order = 1,
name = _G.STATUS,
type = "select",
values = private.DetectionGroupStatusLabels,
get = function()
return profile.detection.continentIDs[continentID]
end,
set = function(_, value)
profile.detection.continentIDs[continentID] = value
if value ~= Enum.DetectionGroupStatus.UserDefined then
for mapID in pairs(continent.Maps) do
profile.blacklist.mapIDs[mapID] = nil
end
end
UpdateContinentAndMapOptions()
private.UpdateRareNPCOptions()
private.UpdateTameableRareNPCOptions()
if continentID == Data.Scanner.continentID then
NPCScan:UpdateScanList()
end
end
},
}
}
for mapIDIndex = 1, #AlphabeticalContinentMaps[continentID] do
local mapID = AlphabeticalContinentMaps[continentID][mapIDIndex]
local mapOptions = {
order = mapIDIndex,
name = private.GetMapOptionName(mapID),
desc = ("%s %s"):format(_G.ID, mapID),
type = "toggle",
width = "full",
descStyle = "inline",
disabled = function()
return profile.detection.continentIDs[continentID] ~= Enum.DetectionGroupStatus.UserDefined
end,
get = function()
return not profile.blacklist.mapIDs[mapID]
end,
set = function()
profile.blacklist.mapIDs[mapID] = not profile.blacklist.mapIDs[mapID] and true or nil
UpdateContinentAndMapOptions()
private.UpdateRareNPCOptions()
private.UpdateTameableRareNPCOptions()
AceConfigRegistry:NotifyChange(AddOnFolderName)
if mapID == Data.Scanner.mapID then
NPCScan:UpdateScanList()
end
end
}
if Data.Maps[mapID].isDungeon then
local dungeonOptionsTable = continentOptionsTable.args.dungeonMapIDs
if not dungeonOptionsTable then
dungeonOptionsTable = {
order = 3,
name = _G.DUNGEONS,
type = "group",
args = {}
}
continentOptionsTable.args.dungeonMapIDs = dungeonOptionsTable
end
dungeonOptionsTable.args["mapID" .. mapID] = mapOptions
else
local zoneOptionsTable = continentOptionsTable.args.zoneMapIDs
if not zoneOptionsTable then
zoneOptionsTable = {
order = 2,
name = _G.ZONE,
type = "group",
args = {}
}
continentOptionsTable.args.zoneMapIDs = zoneOptionsTable
end
continentOptionsTable.args.zoneMapIDs.args["mapID" .. mapID] = mapOptions
end
end
ContinentAndMapOptions["continentID" .. continentID] = continentOptionsTable
end
AceConfigRegistry:NotifyChange(AddOnFolderName)
end
-- ----------------------------------------------------------------------------
-- Initialization.
-- ----------------------------------------------------------------------------
local DetectionOptions
local function GetDetectionOptions()
profile = private.db.profile
DetectionOptions =
DetectionOptions or
{
name = L["Detection"],
order = 2,
type = "group",
childGroups = "tab",
args = {
general = {
order = 1,
name = _G.GENERAL_LABEL,
type = "group",
args = {
interval = {
order = 1,
name = L["Interval"],
desc = L["The number of minutes before an NPC will be detected again."],
type = "range",
width = "full",
min = 0.5,
max = 60,
get = function()
return profile.detection.intervalSeconds / 60
end,
set = function(_, value)
profile.detection.intervalSeconds = value * 60
end
},
ignore = {
order = 2,
name = _G.IGNORE,
type = "group",
guiInline = true,
args = {
completedAchievementCriteria = {
order = 1,
type = "toggle",
name = L["Completed Achievement Criteria"],
descStyle = "inline",
width = "full",
get = function()
return profile.detection.ignoreCompletedAchievementCriteria
end,
set = function(_, value)
profile.detection.ignoreCompletedAchievementCriteria = value
NPCScan:UpdateScanList()
end
},
completedQuestObjectives = {
order = 2,
type = "toggle",
name = L["Completed Quest Objectives"],
descStyle = "inline",
width = "full",
get = function()
return profile.detection.ignoreCompletedQuestObjectives
end,
set = function(_, value)
profile.detection.ignoreCompletedQuestObjectives = value
NPCScan:UpdateScanList()
end
},
deadNPCs = {
order = 3,
type = "toggle",
name = L["Dead NPCs"],
descStyle = "inline",
width = "full",
get = function()
return profile.detection.ignoreDeadNPCs
end,
set = function(_, value)
profile.detection.ignoreDeadNPCs = value
NPCScan:UpdateScanList()
end
},
miniMap = {
order = 4,
type = "toggle",
name = _G.MINIMAP_LABEL,
descStyle = "inline",
width = "full",
get = function()
return profile.detection.ignoreMiniMap
end,
set = function(_, value)
profile.detection.ignoreMiniMap = value
NPCScan:UpdateScanList()
end
},
worldMap = {
order = 5,
type = "toggle",
name = _G.WORLD_MAP,
descStyle = "inline",
width = "full",
get = function()
return profile.detection.ignoreWorldMap
end,
set = function(_, value)
profile.detection.ignoreWorldMap = value
NPCScan:UpdateScanList()
end
}
}
}
}
},
continentsAndMaps = {
order = 2,
name = _G.WORLD_MAP, -- Actually says "Map" - at least, in English.
type = "group",
childGroups = "tree",
args = ContinentAndMapOptions
}
}
}
UpdateContinentAndMapOptions()
return DetectionOptions
end
private.GetDetectionOptions = GetDetectionOptions