-- TODO: Hide ignored quests on compass -- TODO: Fix gamepad support -- TODO: Use localisation files ZO_CreateStringId("SI_AO_IGNORED_QUEST_CATEGORY", "Ignored") ZO_CreateStringId("SI_AO_IGNORE_QUEST_TOOLTIP", "Ignore") ZO_CreateStringId("SI_AO_UNIGNORE_QUEST_TOOLTIP", "Unignore") AO_IGNORED_QUESTS = {} AO_ORIG_QUEST_CATEGORY_NAMES = {} AO_ORIG_QUEST_CATEGORY_TYPES = {} QUEST_CAT_AO_IGNORED = 4 -- -- GetQuestListData -- __GetQuestListData = QUEST_JOURNAL_MANAGER.GetQuestListData QUEST_JOURNAL_MANAGER.GetQuestListData = function(QUEST_JOURNAL_MANAGER) local ignoredCategory = GetString(SI_AO_IGNORED_QUEST_CATEGORY) local quests, _, _ = __GetQuestListData(QUEST_JOURNAL_MANAGER) local categories = {} local seenCategories = {} for i, quest in ipairs(quests) do if AO_IsQuestIgnored(quest) then quests[i].categoryName = ignoredCategory quests[i].categoryType = QUEST_CAT_AO_IGNORED elseif quest.categoryName == ignoredCategory then quests[i].categoryName = AO_ORIG_QUEST_CATEGORY_NAMES[quest.name] quests[i].categoryType = AO_ORIG_QUEST_CATEGORY_TYPES[quest.name] end if not seenCategories[quest.categoryName] then table.insert(categories, { name = quest.categoryName, type = quest.categoryType}) seenCategories[quest.categoryName] = true end end table.sort(categories, AO_SortQuestCategories) table.sort(quests, AO_SortQuestEntries) return quests, categories, seenCategories end -- -- AddOn Functions -- function AO_ToggleIgnoreQuest(questIndex) local quests, categories, seenCategories = QUEST_JOURNAL_MANAGER:GetQuestListData() local quest = AO_GetQuestByIndex(questIndex) if AO_IsQuestIgnored(quest) then AO_IGNORED_QUESTS[quest.name] = nil WORLD_MAP_QUEST_BREADCRUMBS:OnQuestAdded(questIndex) PlaySound(SOUNDS.QUEST_SHARE_ACCEPTED) if FOCUSED_QUEST_TRACKER:GetNumTracked() == 0 then FOCUSED_QUEST_TRACKER:ForceAssist(questIndex) end else AO_IGNORED_QUESTS[quest.name] = true AO_ORIG_QUEST_CATEGORY_NAMES[quest.name] = quest.categoryName AO_ORIG_QUEST_CATEGORY_TYPES[quest.name] = quest.categoryType WORLD_MAP_QUEST_BREADCRUMBS:OnQuestRemoved(false, questIndex) PlaySound(SOUNDS.QUEST_SHARE_DECLINED) local lastTracked = FOCUSED_QUEST_TRACKER:GetLastTracked() if lastTracked.trackType == TRACK_TYPE_QUEST and lastTracked.arg1 == questIndex then local IGNORE_SCENE_RESTRICTION = true FOCUSED_QUEST_TRACKER:AssistNext(IGNORE_SCENE_RESTRICTION) lastTracked = FOCUSED_QUEST_TRACKER:GetLastTracked() if lastTracked.trackType == TRACK_TYPE_QUEST and lastTracked.arg1 == questIndex then FOCUSED_QUEST_TRACKER:ClearTracker() end end end SYSTEMS:GetObject("questJournal"):OnQuestsUpdated() end function AO_GetQuestByIndex(questIndex) local quests, _, _ = QUEST_JOURNAL_MANAGER:GetQuestListData() for _, quest in ipairs(quests) do if quest.questIndex == questIndex then return quest end end end function AO_IsQuestIgnored(quest) if not quest then return nil end return AO_IGNORED_QUESTS[quest.name] end function AO_SortQuestCategories(entry1, entry2) if entry1.type == entry2.type then return entry1.name < entry2.name else return entry1.type < entry2.type end end function AO_SortQuestEntries(entry1, entry2) if entry1.categoryType == entry2.categoryType then if entry1.categoryType == QUEST_CAT_AO_IGNORED then if AO_ORIG_QUEST_CATEGORY_TYPES[entry1.name] == AO_ORIG_QUEST_CATEGORY_TYPES[entry2.name] then if AO_ORIG_QUEST_CATEGORY_NAMES[entry1.name] == AO_ORIG_QUEST_CATEGORY_NAMES[entry2.name] then return entry1.name < entry2.name end return AO_ORIG_QUEST_CATEGORY_NAMES[entry1.name] < AO_ORIG_QUEST_CATEGORY_NAMES[entry2.name] end return AO_ORIG_QUEST_CATEGORY_TYPES[entry1.name] < AO_ORIG_QUEST_CATEGORY_TYPES[entry2.name] elseif entry1.categoryName == entry2.categoryName then return entry1.name < entry2.name end return entry1.categoryName < entry2.categoryName end return entry1.categoryType < entry2.categoryType end -- -- ZO_QuestJournalNavigationEntry_OnMouseUp -- __ZO_QuestJournalNavigationEntry_OnMouseUp = ZO_QuestJournalNavigationEntry_OnMouseUp function ZO_QuestJournalNavigationEntry_OnMouseUp(label, button, upInside) __ZO_QuestJournalNavigationEntry_OnMouseUp(label, button, upInside) if(button == MOUSE_BUTTON_INDEX_RIGHT and upInside) then local quest = label.node.data local questIndex = quest.questIndex if questIndex then local ignoreString = GetString(SI_AO_IGNORE_QUEST_TOOLTIP) local unignoreString = GetString(SI_AO_UNIGNORE_QUEST_TOOLTIP) AddMenuItem(AO_IsQuestIgnored(quest) and unignoreString or ignoreString, function() AO_ToggleIgnoreQuest(questIndex) end) ShowMenu(label) end return end end --- --- FOCUSED_QUEST_TRACKER.BeginTracking --- __FOCUSED_QUEST_TRACKER_BeginTracking = FOCUSED_QUEST_TRACKER.BeginTracking FOCUSED_QUEST_TRACKER.BeginTracking = function(self, trackType, arg1, arg2) if trackType == TRACK_TYPE_QUEST then local questIndex = arg1 if AO_IsQuestIgnored(AO_GetQuestByIndex(questIndex)) then return end end return __FOCUSED_QUEST_TRACKER_BeginTracking(self, trackType, arg1, arg2) end --- --- WORLD_MAP_QUEST_BREADCRUMBS.RefreshQuest --- __WORLD_MAP_QUEST_BREADCRUMBS_RefreshQuest = WORLD_MAP_QUEST_BREADCRUMBS.RefreshQuest WORLD_MAP_QUEST_BREADCRUMBS.RefreshQuest = function(self, questIndex) __WORLD_MAP_QUEST_BREADCRUMBS_RefreshQuest(self, questIndex) if AO_IsQuestIgnored(AO_GetQuestByIndex(questIndex)) then WORLD_MAP_QUEST_BREADCRUMBS:OnQuestRemoved(false, questIndex) end end