255 lines
10 KiB
Lua
255 lines
10 KiB
Lua
---@class QuestieSlash
|
|
local QuestieSlash = QuestieLoader:CreateModule("QuestieSlash")
|
|
|
|
---@type QuestieOptions
|
|
local QuestieOptions = QuestieLoader:ImportModule("QuestieOptions")
|
|
---@type QuestieJourney
|
|
local QuestieJourney = QuestieLoader:ImportModule("QuestieJourney")
|
|
---@type QuestieQuest
|
|
local QuestieQuest = QuestieLoader:ImportModule("QuestieQuest")
|
|
---@type QuestieTracker
|
|
local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker")
|
|
---@type QuestieSearch
|
|
local QuestieSearch = QuestieLoader:ImportModule("QuestieSearch")
|
|
---@type QuestieMap
|
|
local QuestieMap = QuestieLoader:ImportModule("QuestieMap")
|
|
---@type QuestieLib
|
|
local QuestieLib = QuestieLoader:ImportModule("QuestieLib")
|
|
---@type QuestieDB
|
|
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
|
|
---@type l10n
|
|
local l10n = QuestieLoader:ImportModule("l10n")
|
|
---@type QuestieCombatQueue
|
|
local QuestieCombatQueue = QuestieLoader:ImportModule("QuestieCombatQueue")
|
|
|
|
|
|
function QuestieSlash.RegisterSlashCommands()
|
|
Questie:RegisterChatCommand("questieclassic", QuestieSlash.HandleCommands)
|
|
Questie:RegisterChatCommand("questie", QuestieSlash.HandleCommands)
|
|
end
|
|
|
|
function QuestieSlash.HandleCommands(input)
|
|
input = string.trim(input, " ");
|
|
|
|
local commands = {}
|
|
for c in string.gmatch(input, "([^%s]+)") do
|
|
table.insert(commands, c)
|
|
end
|
|
|
|
local mainCommand = commands[1]
|
|
local subCommand = commands[2]
|
|
|
|
-- /questie
|
|
if mainCommand == "" or not mainCommand then
|
|
QuestieCombatQueue:Queue(function()
|
|
QuestieOptions:OpenConfigWindow();
|
|
end)
|
|
|
|
if QuestieJourney:IsShown() then
|
|
QuestieJourney.ToggleJourneyWindow();
|
|
end
|
|
return ;
|
|
end
|
|
|
|
-- /questie help || /questie ?
|
|
if mainCommand == "help" or mainCommand == "?" then
|
|
print(Questie:Colorize(l10n("Questie Commands"), "yellow"));
|
|
print(Questie:Colorize("/questie - " .. l10n("Toggles the Config window"), "yellow"));
|
|
print(Questie:Colorize("/questie toggle - " .. l10n("Toggles showing questie on the map and minimap"), "yellow"));
|
|
print(Questie:Colorize("/questie tomap [<npcId>/<npcName>/reset] - " .. l10n("Adds manual notes to the map for a given NPC ID or name. If the name is ambiguous multipe notes might be added. Without a second command the target will be added to the map. The 'reset' command removes all notes"), "yellow"));
|
|
print(Questie:Colorize("/questie minimap - " .. l10n("Toggles the Minimap Button for Questie"), "yellow"));
|
|
print(Questie:Colorize("/questie journey - " .. l10n("Toggles the My Journey window"), "yellow"));
|
|
print(Questie:Colorize("/questie tracker [show/hide/reset] - " .. l10n("Toggles the Tracker. Add 'show', 'hide', 'reset' to explicit show/hide or reset the Tracker"), "yellow"));
|
|
print(Questie:Colorize("/questie flex - " .. l10n("Flex the amount of quests you have completed so far"), "yellow"));
|
|
print(Questie:Colorize("/questie doable [questID] - " .. l10n("Prints whether you are eligibile to do a quest"), "yellow"));
|
|
print(Questie:Colorize("/questie version - " .. l10n("Prints Questie and client version info"), "yellow"));
|
|
print(Questie:Colorize("/questie learn [toggle/stats/clear/export] - " .. l10n("Self-learning database: toggle on/off, view stats, clear data, or export"), "yellow"));
|
|
print(Questie:Colorize("/questie route [off/single/all/tsp] - " .. l10n("Toggle quest route optimization. off=disable, single=single quest, all=all tracked, tsp=TSP approximation"), "yellow"));
|
|
return;
|
|
end
|
|
|
|
-- /questie toggle
|
|
if mainCommand == "toggle" then
|
|
Questie.db.profile.enabled = (not Questie.db.profile.enabled)
|
|
QuestieQuest:ToggleNotes(Questie.db.profile.enabled);
|
|
|
|
-- Close config window if it's open to avoid desyncing the Checkbox
|
|
QuestieOptions:HideFrame();
|
|
return;
|
|
end
|
|
|
|
if mainCommand == "reload" then
|
|
QuestieQuest:SmoothReset()
|
|
return
|
|
end
|
|
|
|
-- /questie minimap
|
|
if mainCommand == "minimap" then
|
|
Questie.db.profile.minimap.hide = not Questie.db.profile.minimap.hide;
|
|
|
|
if Questie.db.profile.minimap.hide then
|
|
Questie.minimapConfigIcon:Hide("Questie");
|
|
else
|
|
Questie.minimapConfigIcon:Show("Questie");
|
|
end
|
|
return;
|
|
end
|
|
|
|
-- /questie journey (or /questie journal, because of a typo)
|
|
if mainCommand == "journey" or mainCommand == "journal" then
|
|
QuestieJourney.ToggleJourneyWindow();
|
|
QuestieOptions:HideFrame();
|
|
return;
|
|
end
|
|
|
|
if mainCommand == "tracker" then
|
|
if subCommand == "show" then
|
|
QuestieTracker:Enable()
|
|
elseif subCommand == "hide" then
|
|
QuestieTracker:Disable()
|
|
elseif subCommand == "reset" then
|
|
QuestieTracker:ResetLocation()
|
|
else
|
|
QuestieTracker:Toggle()
|
|
end
|
|
return
|
|
end
|
|
|
|
if mainCommand == "tomap" then
|
|
if not subCommand then
|
|
subCommand = UnitName("target")
|
|
end
|
|
|
|
if subCommand ~= nil then
|
|
if subCommand == "reset" then
|
|
QuestieMap:ResetManualFrames()
|
|
return
|
|
end
|
|
|
|
local conversionTry = tonumber(subCommand)
|
|
if conversionTry then -- We've got an ID
|
|
subCommand = conversionTry
|
|
local result = QuestieSearch:Search(subCommand, "npc", "int")
|
|
if result then
|
|
for npcId, _ in pairs(result) do
|
|
QuestieMap:ShowNPC(npcId)
|
|
end
|
|
end
|
|
return
|
|
elseif type(subCommand) == "string" then
|
|
local result = QuestieSearch:Search(subCommand, "npc")
|
|
if result then
|
|
for npcId, _ in pairs(result) do
|
|
QuestieMap:ShowNPC(npcId)
|
|
end
|
|
end
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
if mainCommand == "flex" then
|
|
local questCount = 0
|
|
for _, _ in pairs(Questie.db.char.complete) do
|
|
questCount = questCount + 1
|
|
end
|
|
if GetDailyQuestsCompleted then
|
|
questCount = questCount - GetDailyQuestsCompleted() -- We don't care about daily quests
|
|
end
|
|
SendChatMessage(l10n("has completed a total of %d quests", questCount) .. "!", "EMOTE")
|
|
return
|
|
end
|
|
|
|
if mainCommand == "version" then
|
|
local gameType = ""
|
|
if Questie.IsWotlk then
|
|
gameType = "Wrath"
|
|
elseif Questie.IsSoD then -- seasonal checks must be made before non-seasonal for that client, since IsEra resolves true in SoD
|
|
gameType = "SoD"
|
|
elseif Questie.IsEra then
|
|
gameType = "Era"
|
|
end
|
|
|
|
Questie:Print("Questie " .. QuestieLib:GetAddonVersionString() .. ", Client " .. GetBuildInfo() .. " " .. gameType .. ", Locale " .. GetLocale())
|
|
return
|
|
end
|
|
|
|
if mainCommand == "doable" or mainCommand == "eligible" or mainCommand == "eligibility" then
|
|
if not subCommand then
|
|
print(Questie:Colorize("[Questie] ", "yellow") .. "Usage: /questie " .. mainCommand .. " <questID>")
|
|
do return end
|
|
elseif QuestieDB.QueryQuestSingle(tonumber(subCommand), "name") == nil then
|
|
print(Questie:Colorize("[Questie] ", "yellow") .. "Invalid quest ID")
|
|
return
|
|
end
|
|
|
|
Questie:Print("[Eligibility] " .. tostring(QuestieDB.IsDoableVerbose(tonumber(subCommand), false, true, false)))
|
|
|
|
return
|
|
end
|
|
|
|
-- /questie learn [toggle/stats/clear/export]
|
|
if mainCommand == "learn" then
|
|
local QuestieLearner = QuestieLoader:ImportModule("QuestieLearner")
|
|
if not QuestieLearner then
|
|
Questie:Print("QuestieLearner module not loaded")
|
|
return
|
|
end
|
|
|
|
if subCommand == "toggle" or not subCommand then
|
|
local settings = QuestieLearner:GetSettings()
|
|
settings.enabled = not settings.enabled
|
|
Questie:Print("Learning " .. (settings.enabled and "|cff00ff00enabled|r" or "|cffff0000disabled|r"))
|
|
elseif subCommand == "stats" then
|
|
local npcCount, questCount, itemCount, objectCount = QuestieLearner:GetStats()
|
|
Questie:Print("Learned data: " .. npcCount .. " NPCs, " .. questCount .. " quests, " .. itemCount .. " items, " .. objectCount .. " objects")
|
|
elseif subCommand == "clear" then
|
|
QuestieLearner:ClearAllData()
|
|
elseif subCommand == "export" then
|
|
local exportText = QuestieLearner:ExportData()
|
|
if exportText and #exportText > 0 then
|
|
Questie:Print("Export data printed to chat. Copy from Lua errors or use /dump")
|
|
print(exportText)
|
|
else
|
|
Questie:Print("No learned data to export")
|
|
end
|
|
else
|
|
Questie:Print("Usage: /questie learn [toggle/stats/clear/export]")
|
|
end
|
|
return
|
|
end
|
|
|
|
-- /questie route [off/single/all/tsp]
|
|
if mainCommand == "route" then
|
|
local QuestieRouteOptimizer = QuestieLoader:ImportModule("QuestieRouteOptimizer")
|
|
if not QuestieRouteOptimizer or not QuestieRouteOptimizer.SetMode then
|
|
Questie:Print("QuestieRouteOptimizer module not loaded")
|
|
return
|
|
end
|
|
|
|
local ROUTE_MODE_OFF = 1
|
|
local ROUTE_MODE_SINGLE_QUEST = 2
|
|
local ROUTE_MODE_ALL_TRACKED = 3
|
|
local ROUTE_MODE_TSP_APPROXIMATION = 4
|
|
|
|
if subCommand == "off" or not subCommand then
|
|
QuestieRouteOptimizer:SetMode(ROUTE_MODE_OFF)
|
|
Questie:Print("Quest route " .. l10n("disabled"))
|
|
elseif subCommand == "single" then
|
|
QuestieRouteOptimizer:SetMode(ROUTE_MODE_SINGLE_QUEST)
|
|
Questie:Print("Quest route " .. l10n("set to single quest mode"))
|
|
elseif subCommand == "all" then
|
|
QuestieRouteOptimizer:SetMode(ROUTE_MODE_ALL_TRACKED)
|
|
Questie:Print("Quest route " .. l10n("set to all tracked quests mode"))
|
|
elseif subCommand == "tsp" then
|
|
QuestieRouteOptimizer:SetMode(ROUTE_MODE_TSP_APPROXIMATION)
|
|
Questie:Print("Quest route " .. l10n("set to TSP approximation mode"))
|
|
else
|
|
Questie:Print("Usage: /questie route [off/single/all/tsp]")
|
|
end
|
|
return
|
|
end
|
|
|
|
print(Questie:Colorize("[Questie] ", "yellow") .. l10n("Invalid command. For a list of options please type: ") .. Questie:Colorize("/questie help", "yellow"));
|
|
end
|