-- ================================================================================ -- -- EMA - ( Ebony's MultiBoxing Assistant ) -- -- Current Author: Jennifer Cally (Ebony) -- -- -- -- License: All Rights Reserved 2018-2019 Jennifer Cally -- -- -- -- Some Code Used from "Jamba" that is -- -- Released under the MIT License -- -- "Jamba" Copyright 2008-2015 Michael "Jafula" Miller -- -- -- -- ================================================================================ -- -- Create the addon using AceAddon-3.0 and embed some libraries. local EMA = LibStub( "AceAddon-3.0" ):NewAddon( "QuestWatcher", "Module-1.0", "AceConsole-3.0", "AceEvent-3.0", "AceHook-3.0", "AceTimer-3.0" ) -- Load libraries. local EMAUtilities = LibStub:GetLibrary( "EbonyUtilities-1.0" ) local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" ) EMA.SharedMedia = LibStub( "LibSharedMedia-3.0" ) local EMAQuestMapQuestOptionsDropDown = CreateFrame("Frame", "EMAQuestMapQuestOptionsDropDown", EMAQuestWatcherFrame, "UIDropDownMenuTemplate") -- Constants and Locale for this module. EMA.moduleName = "QuestWatcher" EMA.settingsDatabaseName = "QuestWatcherProfileDB" EMA.chatCommand = "ema-quest-watcher" local L = LibStub( "AceLocale-3.0" ):GetLocale( "Core" ) EMA.parentDisplayName = L["QUEST"] EMA.moduleDisplayName = L["TRACKER"] -- Icon EMA.moduleIcon = "Interface\\Addons\\EMA-Classic\\Media\\QuestTrackerIcon.tga" -- order EMA.moduleOrder = 20 -- Settings - the values to store and their defaults for the settings database. EMA.settings = { profile = { enableQuestWatcher = true, watcherFramePoint = "RIGHT", watcherFrameRelativePoint = "RIGHT", watcherFrameXOffset = 0, watcherFrameYOffset = 50, watcherFrameAlpha = 1.0, watcherFrameScale = 1.0, borderStyle = L["BLIZZARD_TOOLTIP"], backgroundStyle = L["BLIZZARD_DIALOG_BACKGROUND"], watchFontStyle = L["ARIAL_NARROW"], watchFontSize = 14, hideQuestWatcherInCombat = false, enableQuestWatcherOnMasterOnly = false, watchFrameBackgroundColourR = 0.0, watchFrameBackgroundColourG = 0.0, watchFrameBackgroundColourB = 0.0, watchFrameBackgroundColourA = 0.0, watchFrameBorderColourR = 0.0, watchFrameBorderColourG = 0.0, watchFrameBorderColourB = 0.0, watchFrameBorderColourA = 0.0, watcherListLines = 20, watcherFrameWidth = 340, unlockWatcherFrame = true, hideBlizzardWatchFrame = true, doNotHideCompletedObjectives = true, showCompletedObjectivesAsDone = true, hideQuestIfAllComplete = false, showFrame = true, --messageArea = EMAApi.DefaultMessageArea(), --sendProgressChatMessages = false, }, } -- Configuration. function EMA:GetConfiguration() local configuration = { name = EMA.moduleDisplayName, handler = EMA, type = "group", get = "EMAConfigurationGetSetting", set = "EMAConfigurationSetSetting", args = { config = { type = "input", name = L["OPEN_CONFIG"], desc = L["OPEN_CONFIG_HELP"], usage = "/ema-quest-watcher config", get = false, set = "", }, show = { type = "input", name = L["SHOW_QUEST_WATCHER"], desc = L["SHOW_QUEST_WATCHER_HELP"], usage = "/ema-quest-watcher show", get = false, set = "ShowFrameCommand", }, hide = { type = "input", name = L["HIDE_QUEST_WATCHER"] , desc = L["HIDE_QUEST_WATCHER_HELP"] , usage = "/ema-quest-watcher hide", get = false, set = "HideFrameCommand", }, push = { type = "input", name = L["PUSH_SETTINGS"], desc = L["PUSH_SETTINGS_INFO"], usage = "/ema-quest-watcher push", get = false, set = "EMASendSettings", }, }, } return configuration end ------------------------------------------------------------------------------------------------------------- -- Command this module sends. ------------------------------------------------------------------------------------------------------------- EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE = "JQWObjUpd" EMA.COMMAND_UPDATE_QUEST_WATCHER_LIST = "JQWLstUpd" EMA.COMMAND_QUEST_WATCH_REMOVE_QUEST = "JQWRmveQst" EMA.COMMAND_AUTO_QUEST_COMPLETE = "JQWAtQstCmplt" EMA.COMMAND_REMOVE_AUTO_QUEST_COMPLETE = "JQWRmvAtQstCmplt" EMA.COMMAND_AUTO_QUEST_OFFER = "JQWAqQstOfr" ------------------------------------------------------------------------------------------------------------- -- Messages module sends. ------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------- -- Addon initialization, enabling and disabling. ------------------------------------------------------------------------------------------------------------- function EMA:DebugMessage( ... ) --EMA:Print( ... ) end -- Initialise the module. function EMA:OnInitialize() EMA.currentAutoQuestPopups = {} EMA.countAutoQuestPopUpFrames = 0 EMA.questWatcherFrameCreated = false -- Create the settings control. EMA:SettingsCreate() -- Initialise the EMAModule part of this module. EMA:EMAModuleInitialize( EMA.settingsControlWatcher.widgetSettings.frame ) -- Populate the settings. EMA:SettingsRefresh() -- Create the quest watcher frame. EMA:CreateQuestWatcherFrame() EMA:SetQuestWatcherVisibility() -- Quest watcher. EMA.questWatchListOfQuests = {} EMA.questWatchCache = {} EMA.questWatchObjectivesList = {} end -- Called when the addon is enabled. function EMA:OnEnable() -- Register for the EMA master changed message. EMA:RegisterMessage( EMAApi.MESSAGE_TEAM_MASTER_CHANGED, "OnMasterChanged" ) --EMA:RegisterMessage( EMAApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" ) -- Quest events. -- Watcher events. EMA:RegisterEvent( "PLAYER_REGEN_ENABLED" ) EMA:RegisterEvent( "PLAYER_REGEN_DISABLED" ) EMA:RegisterEvent( "QUEST_WATCH_UPDATE" ) EMA:RegisterEvent( "QUEST_LOG_UPDATE") EMA:RegisterEvent( "UNIT_QUEST_LOG_CHANGED", "QUEST_WATCH_UPDATE" ) EMA:RegisterEvent( "QUEST_WATCH_LIST_CHANGED", "QUEST_WATCH_UPDATE" ) -- For in the field auto quests. And Bonus Quests. EMA:RegisterEvent("QUEST_ACCEPTED", "QUEST_WATCH_UPDATE") EMA:RegisterEvent("QUEST_REMOVED", "RemoveQuestsNotBeingWatched") EMA:RegisterEvent( "QUEST_AUTOCOMPLETE" ) EMA:RegisterEvent( "QUEST_COMPLETE" ) EMA:RegisterEvent( "QUEST_DETAIL" ) EMA:RegisterEvent( "PLAYER_ENTERING_WORLD" ) -- Quest post hooks. EMA:SecureHook( "SelectActiveQuest" ) EMA:SecureHook( "GetQuestReward" ) EMA:SecureHook( "AddQuestWatch" ) EMA:SecureHook( "RemoveQuestWatch" ) EMA:SecureHook( "AbandonQuest" ) EMA:SecureHook( "SetAbandonQuest" ) -- Update the quest watcher for watched quests. EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, false, "all" ) EMA:UpdateUnlockWatcherFrame() EMA:UpdateHideBlizzardWatchFrame() EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.3 ) if EMA.db.enableQuestWatcher == true then EMA:QuestWatcherQuestListScrollRefresh() end EMAQuestMapQuestOptionsDropDown.questID = 0 EMAQuestMapQuestOptionsDropDown.questText = nil UIDropDownMenu_Initialize(EMAQuestMapQuestOptionsDropDown, EMAQuestMapQuestOptionsDropDown_Initialize, "MENU") end -- Called when the addon is disabled. function EMA:OnDisable() -- AceHook-3.0 will tidy up the hooks for us. end ------------------------------------------------------------------------------------------------------------- -- Messages. ------------------------------------------------------------------------------------------------------------- function EMA:OnMasterChanged( message, characterName ) if EMA.db.enableQuestWatcher == false then return end EMA:SetQuestWatcherVisibility() end ------------------------------------------------------------------------------------------------------------- -- Settings Dialogs. ------------------------------------------------------------------------------------------------------------- function EMA:SettingsCreate() EMA.settingsControlWatcher = {} -- Create the settings panels. EMAHelperSettings:CreateSettings( EMA.settingsControlWatcher, EMA.moduleDisplayName, EMA.parentDisplayName, EMA.SettingsPushSettingsClick, EMA.moduleIcon, EMA.moduleOrder ) -- Create the quest controls. local bottomOfQuestWatcherOptions = EMA:SettingsCreateQuestWatcherControl( EMAHelperSettings:TopOfSettings() ) EMA.settingsControlWatcher.widgetSettings.content:SetHeight( -bottomOfQuestWatcherOptions ) end function EMA:SettingsCreateQuestWatcherControl( top ) -- Get positions and dimensions. local checkBoxHeight = EMAHelperSettings:GetCheckBoxHeight() local radioBoxHeight = EMAHelperSettings:GetRadioBoxHeight() local mediaHeight = EMAHelperSettings:GetMediaHeight() local labelHeight = EMAHelperSettings:GetLabelHeight() local sliderHeight = EMAHelperSettings:GetSliderHeight() local dropdownHeight = EMAHelperSettings:GetDropdownHeight() local labelContinueHeight = EMAHelperSettings:GetContinueLabelHeight() local left = EMAHelperSettings:LeftOfSettings() local headingHeight = EMAHelperSettings:HeadingHeight() local headingWidth = EMAHelperSettings:HeadingWidth( true ) local horizontalSpacing = EMAHelperSettings:GetHorizontalSpacing() local verticalSpacing = EMAHelperSettings:GetVerticalSpacing() local halfWidthSlider = (headingWidth - horizontalSpacing) / 2 local indent = horizontalSpacing * 10 local indentContinueLabel = horizontalSpacing * 18 local indentSpecial = indentContinueLabel + 9 local checkBoxThirdWidth = (headingWidth - indentContinueLabel) / 3 local column1Left = left local column2Left = left + halfWidthSlider local column1LeftIndent = left + indentContinueLabel local column2LeftIndent = column1LeftIndent + checkBoxThirdWidth + horizontalSpacing local column3LeftIndent = column2LeftIndent + checkBoxThirdWidth + horizontalSpacing local movingTop = top -- A blank to get layout to show right? EMAHelperSettings:CreateHeading( EMA.settingsControlWatcher, "", movingTop, false ) movingTop = movingTop - headingHeight -- Create a heading for quest completion. EMAHelperSettings:CreateHeading( EMA.settingsControlWatcher, L["QUEST_TRACKER_HEADER"], movingTop, true ) movingTop = movingTop - headingHeight -- Check box: Enable auto quest completion. EMA.settingsControlWatcher.checkBoxEnableQuestWatcher = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, column1Left, movingTop, L["ENABLE_TRACKER"], EMA.SettingsToggleEnableQuestWatcher, L["ENABLE_TRACKER_HELP"] ) --[[ movingTop = movingTop - checkBoxHeight EMA.settingsControlWatcher.checkBoxUnlockWatcherFrame = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["UNLOCK_TRACKER"], EMA.SettingsToggleUnlockWatcherFrame, L["UNLOCK_TRACKER_HELP"] ) ]] movingTop = movingTop - checkBoxHeight EMA.settingsControlWatcher.checkBoxHideBlizzardWatchFrame = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["HIDE_BLIZZ_OBJ_TRACKER"], EMA.SettingsToggleHideBlizzardWatchFrame, L["HIDE_BLIZZ_OBJ_TRACKER_HELP"] ) movingTop = movingTop - checkBoxHeight EMA.settingsControlWatcher.checkBoxEnableQuestWatcherMasterOnly = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, column1Left, movingTop, L["SHOW_JOT_ON_MASTER"], EMA.SettingsToggleEnableQuestWatcherMasterOnly, L["SHOW_JOT_ON_MASTER_HELP"] ) movingTop = movingTop - checkBoxHeight EMA.settingsControlWatcher.displayOptionsCheckBoxHideQuestWatcherInCombat = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, column1Left, movingTop, L["HIDE_JOT_IN_COMBAT"], EMA.SettingsToggleHideQuestWatcherInCombat, L["HIDE_JOT_IN_COMBAT_HELP"] ) movingTop = movingTop - checkBoxHeight EMA.settingsControlWatcher.checkBoxShowCompletedObjectivesAsDone = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["SHOW_COMPLETED_OBJ_DONE"], EMA.SettingsShowCompletedObjectivesAsDone, L["SHOW_COMPLETED_OBJ_DONE_HELP"] ) movingTop = movingTop - checkBoxHeight EMA.settingsControlWatcher.checkBoxHideQuestIfAllComplete = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["HIDE_OBJ_COMPLETED"], EMA.SettingsHideQuestIfAllComplete, L["HIDE_OBJ_COMPLETED_HELP"] ) movingTop = movingTop - checkBoxHeight --[[ EMA.settingsControlWatcher.checkBoxSendProgressChatMessages = EMAHelperSettings:CreateCheckBox( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["SEND_PROGRESS_MESSAGES"], EMA.SettingsToggleSendProgressChatMessages, L["SEND_PROGRESS_MESSAGES_HELP"] ) movingTop = movingTop - checkBoxHeight -- Message area. EMA.settingsControlWatcher.dropdownMessageArea = EMAHelperSettings:CreateDropdown( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["MESSAGE_AREA"] ) EMA.settingsControlWatcher.dropdownMessageArea:SetList( EMAApi.MessageAreaList() ) EMA.settingsControlWatcher.dropdownMessageArea:SetCallback( "OnValueChanged", EMA.SettingsSetMessageArea ) movingTop = movingTop - dropdownHeight ]] EMAHelperSettings:CreateHeading( EMA.settingsControlWatcher, L["APPEARANCE_LAYOUT_HEALDER"], movingTop, true ) movingTop = movingTop - headingHeight - verticalSpacing -- Information line 1. EMA.settingsControlWatcher.displayOptionsQuestWatcherInformation1 = EMAHelperSettings:CreateContinueLabel( EMA.settingsControlWatcher, headingWidth, left, movingTop, L["QUESTWACHERINFORMATIONONE"] ) movingTop = movingTop - labelContinueHeight EMA.settingsControlWatcher.displayOptionsQuestWatcherLinesSlider = EMAHelperSettings:CreateSlider( EMA.settingsControlWatcher, halfWidthSlider, left, movingTop, L["LINES_TO_DISPLAY"] ) EMA.settingsControlWatcher.displayOptionsQuestWatcherLinesSlider:SetSliderValues( 5, 50, 1 ) EMA.settingsControlWatcher.displayOptionsQuestWatcherLinesSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeWatchLines ) EMA.settingsControlWatcher.displayOptionsQuestWatcherFrameWidthSlider = EMAHelperSettings:CreateSlider( EMA.settingsControlWatcher, halfWidthSlider, column2Left, movingTop, L["TRACKER_WIDTH"] ) EMA.settingsControlWatcher.displayOptionsQuestWatcherFrameWidthSlider:SetSliderValues( 250, 600, 5 ) EMA.settingsControlWatcher.displayOptionsQuestWatcherFrameWidthSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeWatchFrameWidth ) movingTop = movingTop - sliderHeight - verticalSpacing EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBorder = EMAHelperSettings:CreateMediaBorder( EMA.settingsControlWatcher, halfWidthSlider, left, movingTop, L["BORDER_STYLE"] ) EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBorder:SetCallback( "OnValueChanged", EMA.SettingsChangeBorderStyle ) EMA.settingsControlWatcher.questWatchBorderColourPicker = EMAHelperSettings:CreateColourPicker( EMA.settingsControlWatcher, halfWidthSlider, column2Left + 15, movingTop - 15, L["BORDER COLOUR"] ) EMA.settingsControlWatcher.questWatchBorderColourPicker:SetHasAlpha( true ) EMA.settingsControlWatcher.questWatchBorderColourPicker:SetCallback( "OnValueConfirmed", EMA.SettingsQuestWatchBorderColourPickerChanged ) movingTop = movingTop - mediaHeight - verticalSpacing EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBackground = EMAHelperSettings:CreateMediaBackground( EMA.settingsControlWatcher, halfWidthSlider, column1Left, movingTop, L["BACKGROUND"] ) EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBackground:SetCallback( "OnValueChanged", EMA.SettingsChangeBackgroundStyle ) EMA.settingsControlWatcher.questWatchBackgroundColourPicker = EMAHelperSettings:CreateColourPicker( EMA.settingsControlWatcher, halfWidthSlider, column2Left + 15, movingTop - 15, L["BG_COLOUR"] ) EMA.settingsControlWatcher.questWatchBackgroundColourPicker:SetHasAlpha( true ) EMA.settingsControlWatcher.questWatchBackgroundColourPicker:SetCallback( "OnValueConfirmed", EMA.SettingsQuestWatchBackgroundColourPickerChanged ) movingTop = movingTop - mediaHeight - verticalSpacing EMA.settingsControlWatcher.questWatchMediaFont = EMAHelperSettings:CreateMediaFont( EMA.settingsControlWatcher, halfWidthSlider, left, movingTop, L["FONT"] ) EMA.settingsControlWatcher.questWatchMediaFont:SetCallback( "OnValueChanged", EMA.SettingsChangeFontStyle ) EMA.settingsControlWatcher.questWatchFontSize = EMAHelperSettings:CreateSlider( EMA.settingsControlWatcher, halfWidthSlider, column2Left, movingTop, L["FONT_SIZE"] ) EMA.settingsControlWatcher.questWatchFontSize:SetSliderValues( 8, 20 , 1 ) EMA.settingsControlWatcher.questWatchFontSize:SetCallback( "OnValueChanged", EMA.SettingsChangeFontSize ) movingTop = movingTop - mediaHeight - verticalSpacing EMA.settingsControlWatcher.displayOptionsQuestWatcherScaleSlider = EMAHelperSettings:CreateSlider( EMA.settingsControlWatcher, halfWidthSlider, column1Left, movingTop, L["SCALE"] ) EMA.settingsControlWatcher.displayOptionsQuestWatcherScaleSlider:SetSliderValues( 0.5, 2, 0.01 ) EMA.settingsControlWatcher.displayOptionsQuestWatcherScaleSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeScale ) --movingTop = movingTop - sliderHeight - verticalSpacing EMA.settingsControlWatcher.displayOptionsQuestWatcherTransparencySlider = EMAHelperSettings:CreateSlider( EMA.settingsControlWatcher, halfWidthSlider, column2Left, movingTop, L["TRANSPARENCY"] ) EMA.settingsControlWatcher.displayOptionsQuestWatcherTransparencySlider:SetSliderValues( 0, 1, 0.01 ) EMA.settingsControlWatcher.displayOptionsQuestWatcherTransparencySlider:SetCallback( "OnValueChanged", EMA.SettingsChangeTransparency ) movingTop = movingTop - sliderHeight - verticalSpacing return movingTop end --[[ function EMA:OnMessageAreasChanged( message ) EMA.settingsControlWatcher.dropdownMessageArea:SetList( EMAApi.MessageAreaList() ) end ]] ------------------------------------------------------------------------------------------------------------- -- Watcher frame. ------------------------------------------------------------------------------------------------------------- function EMA:CanDisplayQuestWatcher() -- Do not show is quest watcher disabled. if EMA.db.enableQuestWatcher == false then return false end -- Do not show if user has hidden frame. if EMA.db.showFrame == false then return false end -- Do not show if master only and not the master. if EMA.db.enableQuestWatcherOnMasterOnly == true then if EMAApi.IsCharacterTheMaster( EMA.characterName ) == false then return false end end -- Show if at least one line in the watch list. if EMA:CountLinesInQuestWatchList() > 0 then return true end -- Show if at least one auto quest popup. if EMA:HasAtLeastOneAutoQuestPopup() == true then return true end -- Nothing to show. return false end local function Title_OnMouseDown(frame) if IsAltKeyDown() then frame:GetParent():StartMoving() end end local function MoverSizer_OnMouseUp(mover) local frame = mover:GetParent() frame:StopMovingOrSizing() local point, relativeTo, relativePoint, xOffset, yOffset = frame:GetPoint() EMA.db.watcherFramePoint = point EMA.db.watcherFrameRelativePoint = relativePoint EMA.db.watcherFrameXOffset = xOffset EMA.db.watcherFrameYOffset = yOffset end function EMA:CreateQuestWatcherFrame() -- The frame. local frame = CreateFrame( "Frame", "EMAQuestWatcherWindowFrame", UIParent ) frame.obj = EMA frame:SetFrameStrata( "BACKGROUND" ) frame:SetClampedToScreen( true ) frame:EnableMouse( false ) frame:SetMovable( true ) frame:ClearAllPoints() frame:SetPoint( EMA.db.watcherFramePoint, UIParent, EMA.db.watcherFrameRelativePoint, EMA.db.watcherFrameXOffset, EMA.db.watcherFrameYOffset ) frame:SetBackdrop( { bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 10, edgeSize = 10, insets = { left = 3, right = 3, top = 3, bottom = 3 } } ) -- Create the title for the questWaster list frame. local titleButton = CreateFrame( "Button", "EMAQuestWatcherWindowFrameTitle", frame ) titleButton:SetPoint( "TOPLEFT", frame, "TOPLEFT", -5, -4 ) titleButton:SetWidth( EMA.db.watcherFrameWidth - 100 ) titleButton:SetHeight( 20 ) titleButton:SetScript("OnMouseDown", Title_OnMouseDown) titleButton:SetScript("OnMouseUp", MoverSizer_OnMouseUp) titleButton:SetScript("OnEnter", function(self) EMA:ShowTooltip(titleButton, "headerMouseOver", true) end) titleButton:SetScript("OnLeave", function(self) GameTooltip:Hide() end) titleButton.titleName = titleButton:CreateFontString( titleButton:GetName().."Text", "OVERLAY", "GameFontNormal" ) titleButton.titleName:SetJustifyH( "CENTER" ) titleButton.titleName:SetAllPoints( titleButton ) titleButton.titleName:SetTextColor( 1.00, 1.00, 1.00 ) titleButton.titleName:SetText( L["TRACKER_TITLE_NAME"] ) frame.titleName = titleButton.titleName -- Update button. local updateButton = CreateFrame( "Button", "EMAQuestWatcherWindowFrameButtonUpdate", frame, "UIPanelButtonGrayTemplate" ) updateButton:SetPoint( "TOPRIGHT", frame, "TOPRIGHT", -5, -4 ) updateButton:SetHeight( 20 ) updateButton:SetWidth( 100 ) updateButton:SetText( L["UPDATE"] ) updateButton:SetScript( "OnClick", EMA.EMAQuestWatchListUpdateButtonClicked ) updateButton:SetScript("OnEnter", function(self) EMA:ShowTooltip(updateButton, "update", true) end) updateButton:SetScript("OnLeave", function(self) GameTooltip:Hide() end) -- Add an area for the "in the field quest" notifications. frame.fieldNotificationsTop = -24 frame.fieldNotifications = CreateFrame( "Frame", "EMAQuestWatcherFieldQuestFrame", frame ) frame.fieldNotifications:SetFrameStrata( "BACKGROUND" ) frame.fieldNotifications:SetClampedToScreen( true ) frame.fieldNotifications:EnableMouse( false ) frame.fieldNotifications:ClearAllPoints() frame.fieldNotifications:SetPoint( "TOPLEFT", frame, "TOPLEFT", 0, frame.fieldNotificationsTop ) frame.fieldNotifications:Show() -- Set transparency of the the frame (and all its children). frame:SetAlpha( EMA.db.watcherFrameAlpha ) -- List. local topOfList = frame.fieldNotificationsTop local list = {} list.listFrameName = "EMAQuestWatcherQuestListFrame" list.parentFrame = frame list.listTop = topOfList list.listLeft = 2 list.listWidth = EMA.db.watcherFrameWidth list.rowHeight = 19 list.rowsToDisplay = EMA.db.watcherListLines list.columnsToDisplay = 2 list.columnInformation = {} list.columnInformation[1] = {} list.columnInformation[1].width = 80 list.columnInformation[1].alignment = "LEFT" list.columnInformation[2] = {} list.columnInformation[2].width = 20 list.columnInformation[2].alignment = "CENTER" list.scrollRefreshCallback = EMA.QuestWatcherQuestListScrollRefresh list.rowClickCallback = EMA.QuestWatcherQuestListRowClick list.rowRightClickCallback = EMA.QuestWatcherQuestListRowRightClick list.rowMouseOverCallBack_OnEnter = EMA.QuestWatcherQuestListRowOnEnter list.rowMouseOverCallBack_OnLeave = EMA.QuestWatcherQuestListRowOnLeave frame.questWatchList = list EMAHelperSettings:CreateScrollList( frame.questWatchList ) -- Change appearance from default. frame.questWatchList.listFrame:SetBackdropColor( 0.0, 0.0, 0.0, 0.0 ) frame.questWatchList.listFrame:SetBackdropBorderColor( 0.0, 0.0, 0.0, 0.0 ) -- Disable mouse on columns so click-through works. for iterateDisplayRows = 1, frame.questWatchList.rowsToDisplay do for iterateDisplayColumns = 1, frame.questWatchList.columnsToDisplay do if InCombatLockdown() == false then frame.questWatchList.rows[iterateDisplayRows].columns[iterateDisplayColumns]:EnableMouse( false ) end end end -- Position and size constants (once list height is known). frame.questWatchListBottom = topOfList - list.listHeight frame.questWatchListHeight = list.listHeight frame.questWatchHighlightRow = 1 frame.questWatchListOffset = 1 -- Set the global frame reference for this frame. EMAQuestWatcherFrame = frame EMAQuestWatcherFrame.autoQuestPopupsHeight = 0 EMA:SettingsUpdateBorderStyle() EMA:SettingsUpdateFontStyle() EMA.questWatcherFrameCreated = true end function EMA:ShowTooltip(frame, info, show) if show then GameTooltip:SetOwner(frame, "ANCHOR_TOP") GameTooltip:SetPoint("TOPLEFT", frame, "TOPRIGHT", 16, 0) GameTooltip:ClearLines() if info == "headerMouseOver" then GameTooltip:AddLine(L["HEADER_MOUSE_OVER_QUESTWATCHER"], 1, 0.82, 0, 1) elseif info == "update" then GameTooltip:AddLine(L["UPDATE_MOUSE_OVER_QUESTWATCHER"], 1, 0.82, 0, 1) end GameTooltip:Show() else GameTooltip:Hide() end end function EMA:SettingsUpdateBorderStyle() local borderStyle = EMA.SharedMedia:Fetch( "border", EMA.db.borderStyle ) local backgroundStyle = EMA.SharedMedia:Fetch( "background", EMA.db.backgroundStyle ) local frame = EMAQuestWatcherFrame frame:SetBackdrop( { bgFile = backgroundStyle, edgeFile = borderStyle, tile = true, tileSize = frame:GetWidth(), edgeSize = 10, insets = { left = 3, right = 3, top = 3, bottom = 3 } } ) frame:SetBackdropColor( EMA.db.watchFrameBackgroundColourR, EMA.db.watchFrameBackgroundColourG, EMA.db.watchFrameBackgroundColourB, EMA.db.watchFrameBackgroundColourA ) frame:SetBackdropBorderColor( EMA.db.watchFrameBorderColourR, EMA.db.watchFrameBorderColourG, EMA.db.watchFrameBorderColourB, EMA.db.watchFrameBorderColourA ) end function EMA:SettingsUpdateFontStyle() local textFont = EMA.SharedMedia:Fetch( "font", EMA.db.watchFontStyle ) local textSize = EMA.db.watchFontSize local frame = EMAQuestWatcherFrame frame.titleName:SetFont( textFont , textSize , "OUTLINE") end function EMA:UpdateQuestWatcherDimensions() if InCombatLockdown() == true then return end local frame = EMAQuestWatcherFrame frame:SetWidth( frame.questWatchList.listWidth + 4 ) frame:SetHeight( frame.questWatchListHeight + 40 ) -- Field notifications. frame.fieldNotifications:SetWidth( frame.questWatchList.listWidth + 4 ) frame.fieldNotifications:SetHeight( EMAQuestWatcherFrame.autoQuestPopupsHeight ) -- List. frame.questWatchList.listTop = frame.fieldNotificationsTop - EMAQuestWatcherFrame.autoQuestPopupsHeight frame.questWatchList.listFrame:SetPoint( "TOPLEFT", frame.questWatchList.parentFrame, "TOPLEFT", frame.questWatchList.listLeft, frame.questWatchList.listTop ) -- Scale. frame:SetScale( EMA.db.watcherFrameScale ) end function EMA:SetQuestWatcherVisibility() if InCombatLockdown() == true then return end if EMA:CanDisplayQuestWatcher() == true then EMA:UpdateQuestWatcherDimensions() EMAQuestWatcherFrame:ClearAllPoints() EMAQuestWatcherFrame:SetPoint( EMA.db.watcherFramePoint, UIParent, EMA.db.watcherFrameRelativePoint, EMA.db.watcherFrameXOffset, EMA.db.watcherFrameYOffset ) EMAQuestWatcherFrame:SetAlpha( EMA.db.watcherFrameAlpha ) EMAQuestWatcherFrame:Show() else EMAQuestWatcherFrame:Hide() end end ------------------------------------------------------------------------------------------------------------- -- Settings functionality. ------------------------------------------------------------------------------------------------------------- -- Settings received. function EMA:EMAOnSettingsReceived( characterName, settings ) if characterName ~= EMA.characterName then -- Update the settings. EMA.db.enableQuestWatcher = settings.enableQuestWatcher EMA.db.watcherFrameAlpha = settings.watcherFrameAlpha EMA.db.watcherFramePoint = settings.watcherFramePoint EMA.db.watcherFrameRelativePoint = settings.watcherFrameRelativePoint EMA.db.watcherFrameXOffset = settings.watcherFrameXOffset EMA.db.watcherFrameYOffset = settings.watcherFrameYOffset EMA.db.borderStyle = settings.borderStyle EMA.db.backgroundStyle = settings.backgroundStyle EMA.db.watchFontStyle = settings.watchFontStyle EMA.db.watchFontSize = settings.watchFontSize EMA.db.hideQuestWatcherInCombat = settings.hideQuestWatcherInCombat EMA.db.watcherFrameScale = settings.watcherFrameScale EMA.db.enableQuestWatcherOnMasterOnly = settings.enableQuestWatcherOnMasterOnly EMA.db.watchFrameBackgroundColourR = settings.watchFrameBackgroundColourR EMA.db.watchFrameBackgroundColourG = settings.watchFrameBackgroundColourG EMA.db.watchFrameBackgroundColourB = settings.watchFrameBackgroundColourB EMA.db.watchFrameBackgroundColourA = settings.watchFrameBackgroundColourA EMA.db.watchFrameBorderColourR = settings.watchFrameBorderColourR EMA.db.watchFrameBorderColourG = settings.watchFrameBorderColourG EMA.db.watchFrameBorderColourB = settings.watchFrameBorderColourB EMA.db.watchFrameBorderColourA = settings.watchFrameBorderColourA EMA.db.watcherListLines = settings.watcherListLines EMA.db.watcherFrameWidth = settings.watcherFrameWidth EMA.db.unlockWatcherFrame = settings.unlockWatcherFrame EMA.db.hideBlizzardWatchFrame = settings.hideBlizzardWatchFrame EMA.db.doNotHideCompletedObjectives = settings.doNotHideCompletedObjectives EMA.db.showCompletedObjectivesAsDone = settings.showCompletedObjectivesAsDone EMA.db.hideQuestIfAllComplete = settings.hideQuestIfAllComplete -- EMA.db.showFrame = settings.showFrame -- EMA.db.sendProgressChatMessages = settings.sendProgressChatMessages -- EMA.db.messageArea = settings.messageArea -- Refresh the settings. EMA:SettingsRefresh() EMA:UpdateUnlockWatcherFrame() EMA:UpdateHideBlizzardWatchFrame() EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.3 ) -- Tell the player. EMA:Print( L["SETTINGS_RECEIVED_FROM_A"] ( characterName ) ) end end ------------------------------------------------------------------------------------------------------------- -- Settings Populate. ------------------------------------------------------------------------------------------------------------- function EMA:BeforeEMAProfileChanged() end function EMA:OnEMAProfileChanged() EMA:SettingsRefresh() end function EMA:SettingsRefresh() -- Quest watcher options. EMA.settingsControlWatcher.checkBoxEnableQuestWatcher:SetValue( EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBorder:SetValue( EMA.db.borderStyle ) EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBackground:SetValue( EMA.db.backgroundStyle ) EMA.settingsControlWatcher.questWatchMediaFont:SetValue( EMA.db.watchFontStyle ) EMA.settingsControlWatcher.questWatchFontSize:SetValue( EMA.db.watchFontSize ) EMA.settingsControlWatcher.displayOptionsCheckBoxHideQuestWatcherInCombat:SetValue( EMA.db.hideQuestWatcherInCombat ) EMA.settingsControlWatcher.displayOptionsQuestWatcherTransparencySlider:SetValue( EMA.db.watcherFrameAlpha ) EMA.settingsControlWatcher.displayOptionsQuestWatcherScaleSlider:SetValue( EMA.db.watcherFrameScale ) EMA.settingsControlWatcher.checkBoxEnableQuestWatcherMasterOnly:SetValue( EMA.db.enableQuestWatcherOnMasterOnly ) EMA.settingsControlWatcher.questWatchBackgroundColourPicker:SetColor( EMA.db.watchFrameBackgroundColourR, EMA.db.watchFrameBackgroundColourG, EMA.db.watchFrameBackgroundColourB, EMA.db.watchFrameBackgroundColourA ) EMA.settingsControlWatcher.questWatchBorderColourPicker:SetColor( EMA.db.watchFrameBorderColourR, EMA.db.watchFrameBorderColourG, EMA.db.watchFrameBorderColourB, EMA.db.watchFrameBorderColourA ) EMA.settingsControlWatcher.displayOptionsQuestWatcherLinesSlider:SetValue( EMA.db.watcherListLines ) EMA.settingsControlWatcher.displayOptionsQuestWatcherFrameWidthSlider:SetValue( EMA.db.watcherFrameWidth ) -- EMA.settingsControlWatcher.checkBoxUnlockWatcherFrame:SetValue( EMA.db.unlockWatcherFrame ) EMA.settingsControlWatcher.checkBoxHideBlizzardWatchFrame:SetValue( EMA.db.hideBlizzardWatchFrame ) EMA.settingsControlWatcher.checkBoxShowCompletedObjectivesAsDone:SetValue( EMA.db.showCompletedObjectivesAsDone ) EMA.settingsControlWatcher.checkBoxHideQuestIfAllComplete:SetValue( EMA.db.hideQuestIfAllComplete ) -- EMA.settingsControlWatcher.dropdownMessageArea:SetValue( EMA.db.messageArea ) -- EMA.settingsControlWatcher.checkBoxSendProgressChatMessages:SetValue( EMA.db.sendProgressChatMessages ) -- Quest watcher state. EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBorder:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsQuestWatcherMediaBackground:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.questWatchMediaFont:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.questWatchFontSize:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsCheckBoxHideQuestWatcherInCombat:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsQuestWatcherTransparencySlider:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsQuestWatcherScaleSlider:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.checkBoxEnableQuestWatcherMasterOnly:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.questWatchBackgroundColourPicker:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.questWatchBorderColourPicker:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsQuestWatcherLinesSlider:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.displayOptionsQuestWatcherFrameWidthSlider:SetDisabled( not EMA.db.enableQuestWatcher ) -- EMA.settingsControlWatcher.checkBoxUnlockWatcherFrame:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.checkBoxHideBlizzardWatchFrame:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.checkBoxShowCompletedObjectivesAsDone:SetDisabled( not EMA.db.enableQuestWatcher ) EMA.settingsControlWatcher.checkBoxHideQuestIfAllComplete:SetDisabled( not EMA.db.enableQuestWatcher ) -- EMA.settingsControlWatcher.dropdownMessageArea:SetDisabled( not EMA.db.enableQuestWatcher ) -- EMA.settingsControlWatcher.checkBoxSendProgressChatMessages:SetDisabled( not EMA.db.enableQuestWatcher ) if EMA.questWatcherFrameCreated == true and InCombatLockdown() == false then EMA:SettingsUpdateBorderStyle() EMA:SettingsUpdateFontStyle() EMA:SetQuestWatcherVisibility() end end function EMA:SettingsPushSettingsClick( event ) EMA:EMASendSettings() end function EMA:SettingsToggleEnableQuestWatcher( event, checked ) EMA.db.enableQuestWatcher = checked EMA:SettingsRefresh() end function EMA:SettingsChangeBorderStyle( event, value ) EMA.db.borderStyle = value EMA:SettingsRefresh() end function EMA:SettingsChangeBackgroundStyle( event, value ) EMA.db.backgroundStyle = value EMA:SettingsRefresh() end function EMA:SettingsChangeFontStyle( event, value ) EMA.db.watchFontStyle = value EMA:SettingsRefresh() EMA:EMAQuestWatcherUpdate( false, "all" ) end function EMA:SettingsChangeFontSize( event, value ) EMA.db.watchFontSize = value EMA:SettingsRefresh() EMA:EMAQuestWatcherUpdate( false, "all" ) end function EMA:SettingsToggleHideQuestWatcherInCombat( event, checked ) EMA.db.hideQuestWatcherInCombat = checked EMA:SettingsRefresh() end function EMA:SettingsChangeTransparency( event, value ) EMA.db.watcherFrameAlpha = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeScale( event, value ) EMA.db.watcherFrameScale = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeWatchLines( event, value ) EMA.db.watcherListLines = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeWatchFrameWidth( event, value ) EMA.db.watcherFrameWidth = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsToggleEnableQuestWatcherMasterOnly( event, checked ) EMA.db.enableQuestWatcherOnMasterOnly = checked EMA:SettingsRefresh() end function EMA:SettingsQuestWatchBackgroundColourPickerChanged( event, r, g, b, a ) EMA.db.watchFrameBackgroundColourR = r EMA.db.watchFrameBackgroundColourG = g EMA.db.watchFrameBackgroundColourB = b EMA.db.watchFrameBackgroundColourA = a EMA:SettingsRefresh() end function EMA:SettingsQuestWatchBorderColourPickerChanged( event, r, g, b, a ) EMA.db.watchFrameBorderColourR = r EMA.db.watchFrameBorderColourG = g EMA.db.watchFrameBorderColourB = b EMA.db.watchFrameBorderColourA = a EMA:SettingsRefresh() end function EMA:SettingsToggleUnlockWatcherFrame( event, checked ) EMA.db.unlockWatcherFrame = checked EMA:UpdateUnlockWatcherFrame() EMA:SettingsRefresh() end --[[ function EMA:SettingsToggleSendProgressChatMessages( event, checked ) EMA.db.sendProgressChatMessages = checked EMA:SettingsRefresh() end ]] function EMA:SettingsToggleShowFrame( event, checked ) EMA.db.showFrame = checked EMA:SettingsRefresh() end function EMA:ShowFrameCommand( info, parameters ) EMA.db.showFrame = true EMA:SettingsRefresh() end function EMA:HideFrameCommand( info, parameters ) EMA.db.showFrame = false EMA:SettingsRefresh() end function EMA:SettingsSetMessageArea( event, messageAreaValue ) EMA.db.messageArea = messageAreaValue EMA:SettingsRefresh() end function EMA:SettingsToggleHideBlizzardWatchFrame( event, checked ) EMA.db.hideBlizzardWatchFrame = checked EMA:UpdateHideBlizzardWatchFrame() EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.3 ) EMA:SettingsRefresh() end function EMA:SettingsShowCompletedObjectivesAsDone( event, checked ) EMA.db.showCompletedObjectivesAsDone = checked EMA:SettingsRefresh() end function EMA:SettingsHideQuestIfAllComplete( event, checked ) EMA.db.hideQuestIfAllComplete = checked EMA:SettingsRefresh() end function EMA:SettingsDoNotHideCompletedObjectives( event, checked ) EMA.db.doNotHideCompletedObjectives = checked EMA:SettingsRefresh() end function EMA:UpdateUnlockWatcherFrame() if EMA.db.enableQuestWatcher == false then return end if EMA.db.unlockWatcherFrame == true then EMAQuestWatcherFrame:EnableMouse( true ) else EMAQuestWatcherFrame:EnableMouse( false ) end end function EMA:UpdateHideBlizzardWatchFrame() if EMA.db.enableQuestWatcher == false then return end if EMA.db.hideBlizzardWatchFrame == true then if QuestWatchFrame:IsVisible() then --QuestLogFrame:Hide() QuestWatchFrame:HookScript("OnShow", function(self) self:Hide() end) QuestWatchFrame:Hide() end else QuestWatchFrame:Show() end end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCHING HOOKS ------------------------------------------------------------------------------------------------------------- function EMA:SelectActiveQuest( questIndex ) EMA:DebugMessage("select active quest", questIndex) if EMA.db.enableQuestWatcher == false then return end EMA:SetActiveQuestForQuestWatcherCache( questIndex ) end function EMA:GetQuestReward( itemChoice ) if EMA.db.enableQuestWatcher == false then return end local questJustCompletedName = GetTitleText() EMA:DebugMessage( "GetQuestReward: ", questIndex, questJustCompletedName ) local questIndex = EMA:GetQuestLogIndexByName( questJustCompletedName ) local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex ) EMA:DebugMessage( "GetQuestReward after GetQuestLogTitle: ", questIndex, questJustCompletedName, questID ) EMA:RemoveQuestFromWatchList( questID ) end function EMA:AddQuestWatch( questIndex ) if EMA.db.enableQuestWatcher == false then return end EMA:UpdateHideBlizzardWatchFrame() EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.3 ) EMA:EMAQuestWatcherUpdate( true, "all" ) --EMA:EMAQuestWatcherScenarioUpdate( true ) end function EMA:RemoveQuestWatch( questIndex ) if EMA.db.enableQuestWatcher == false then return end EMA:DebugMessage( "RemoveQuestWatch", questIndex ) EMA:UpdateHideBlizzardWatchFrame() EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.3 ) local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex ) EMA:DebugMessage( "About to call RemoveQuestFromWatchList with value:", questID ) EMA:RemoveQuestFromWatchList( questID ) end function EMA:SetAbandonQuest() if EMA.db.enableQuestWatcher == false then return end local questName = GetAbandonQuestName() if questName ~= nil then local questIndex = EMA:GetQuestLogIndexByName( questName ) EMA:SetActiveQuestForQuestWatcherCache( questIndex ) end end function EMA:AbandonQuest() if EMA.db.enableQuestWatcher == false then return end -- Wait a bit for the correct information to come through from the server... EMA:ScheduleTimer( "AbandonQuestDelayed", 1 ) end function EMA:QUEST_WATCH_UPDATE( event, ... ) --EMA:Print("test4") if EMA.db.enableQuestWatcher == true then EMA:UpdateHideBlizzardWatchFrame() EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.3 ) -- Wait a bit for the correct information to come through from the server... EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, true, "all" ) end end function EMA:QUEST_LOG_UPDATE( event, ... ) --EMA:Print("QuestTestUpdates") if EMA.db.enableQuestWatcher == true then EMA:UpdateHideBlizzardWatchFrame() --EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 0.5 ) -- Wait a bit for the correct information to come through from the server... EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, true, "all" ) end end function EMA:SCENARIO_UPDATE( event, ... ) --EMA:Print("test2") if EMA.db.enableQuestWatcher == true then EMA:RemoveQuestsNotBeingWatched() EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, true, "scenario" ) end end function EMA:SCENARIO_CRITERIA_UPDATE( event, ... ) --EMA:Print("test3.5") if EMA.db.enableQuestWatcher == true then -- Wait a bit for the correct information to come through from the server... EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, true, "scenario" ) end end function EMA:PLAYER_ENTERING_WORLD( event, ... ) --EMA:Print("test4") if EMA.db.enableQuestWatcher == true then EMA:RemoveQuestsNotBeingWatched() EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, false, "all" ) end end function EMA:PLAYER_REGEN_ENABLED( event, ... ) if EMA.db.enableQuestWatcher == false then return end if EMA.db.hideQuestWatcherInCombat == true then EMA:SetQuestWatcherVisibility() end end function EMA:PLAYER_REGEN_DISABLED( event, ... ) if EMA.db.enableQuestWatcher == false then return end if EMA.db.hideQuestWatcherInCombat == true then EMAQuestWatcherFrame:Hide() end end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCHING ------------------------------------------------------------------------------------------------------------- function EMA:AbandonQuestDelayed() EMA:RemoveCurrentQuestFromWatcherCache() EMA:RemoveQuestsNotBeingWatched() end function EMA:EMAQuestWatchListUpdateButtonClicked() EMA:RemoveQuestsNotBeingWatched() EMA:EMASendCommandToTeam( EMA.COMMAND_UPDATE_QUEST_WATCHER_LIST ) end function EMA:DoQuestWatchListUpdate( characterName ) EMA:EMAQuestWatcherUpdate( false, "all" ) --EMA:EMAQuestWatcherScenarioUpdate( false ) end function EMA:GetQuestObjectiveCompletion( text ) if text == nil then return L["N/A"], L["N/A"] end local _, _, arg1, arg2 = string.find(text, "(.*):%s(.*)") if arg1 and arg2 then return arg2, arg1 else return L["N/A"], text end end --[[:GetQuestObjectiveCompletion( text ) if text == nil then return L["N/A"], L["N/A"] end local makeString = nil local dig1, dig2 = string.match( text, "(%d*)/(%d*)") if (dig1 and dig2) then local arg1, arg2 = string.match(text, "(.-%S)%s(.*)") EMA:Print("testm", arg1, "A", arg2) makeString = dig1..L["/"]..dig2 end if makeString ~= nil then local arg1, arg2 = string.match(text, "(.-%S)%s(.*)") local textFind = string.find(arg1, "(%d*)") EMA:Print("text", textFind) if textFind then return makeString, arg2 else return makeString, text end else return L["DONE"] , text end end ]] function EMA:QuestWatchGetObjectiveText( questIndex, objectiveIndex ) local objectiveFullText, objectiveType, objectiveFinished = GetQuestLogLeaderBoard( objectiveIndex, questIndex ) local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText ) return objectiveText end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCH CACHE ------------------------------------------------------------------------------------------------------------- function EMA:IsQuestObjectiveInCache( questID, objectiveIndex ) local key = questID..objectiveIndex if EMA.questWatchCache[key] == nil then return false end return true end function EMA:AddQuestObjectiveToCache( questID, objectiveIndex, amountCompleted, objectiveFinished ) local key = questID..objectiveIndex EMA.questWatchCache[key] = {} EMA.questWatchCache[key].questID = questID EMA.questWatchCache[key].amountCompleted = amountCompleted EMA.questWatchCache[key].objectiveFinished = objectiveFinished end function EMA:GetQuestCachedValues( questID, objectiveIndex ) local key = questID..objectiveIndex return EMA.questWatchCache[key].amountCompleted, EMA.questWatchCache[key].objectiveFinished end function EMA:UpdateQuestCachedValues( questID, objectiveIndex, amountCompleted, objectiveFinished ) local key = questID..objectiveIndex EMA.questWatchCache[key].amountCompleted = amountCompleted EMA.questWatchCache[key].objectiveFinished = objectiveFinished end function EMA:QuestCacheUpdate( questID, objectiveIndex, amountCompleted, objectiveFinished ) if EMA:IsQuestObjectiveInCache( questID, objectiveIndex ) == false then EMA:AddQuestObjectiveToCache( questID, objectiveIndex, amountCompleted, objectiveFinished ) return true end local cachedAmountCompleted, cachedObjectiveFinished = EMA:GetQuestCachedValues( questID, objectiveIndex ) if cachedAmountCompleted == amountCompleted and cachedObjectiveFinished == objectiveFinished then return false end EMA:UpdateQuestCachedValues( questID, objectiveIndex, amountCompleted, objectiveFinished ) return true end function EMA:SetActiveQuestForQuestWatcherCache( questIndex ) if EMA.db.enableQuestWatcher == false then return end if questIndex ~= nil then local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex ) EMA.currentQuestForQuestWatcherID = questID else EMA.currentQuestForQuestWatcherID = nil end end function EMA:RemoveQuestFromWatcherCache( questID ) EMA:DebugMessage( "RemoveQuestFromWatcherCache", questID ) for key, questInfo in pairs( EMA.questWatchCache ) do if questInfo.questID == questID then EMA.questWatchCache[key].questID = nil EMA.questWatchCache[key].amountCompleted = nil EMA.questWatchCache[key].objectiveFinished = nil EMA.questWatchCache[key] = nil EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_REMOVE_QUEST, questID ) end end end function EMA:RemoveCurrentQuestFromWatcherCache() if EMA.db.enableQuestWatcher == false then return end EMA:DebugMessage( "RemoveCurrentQuestFromWatcherCache", EMA.currentQuestForQuestWatcherID ) if EMA.currentQuestForQuestWatcherID == nil then return end EMA:RemoveQuestFromWatcherCache( EMA.currentQuestForQuestWatcherID ) end ------------------------------------------------------------------------------------------------------------- -- AUTO QUEST COMMUNICATION ------------------------------------------------------------------------------------------------------------- function EMA:IsCompletedAutoCompleteFieldQuest( questIndex, isComplete ) -- Send an isComplete true flag if the quest is completed and is an in the field autocomplete quest. if isComplete and isComplete > 0 then if GetQuestLogIsAutoComplete( questIndex ) then isComplete = true else isComplete = false end else isComplete = false end return isComplete end function EMA:QUEST_AUTOCOMPLETE( event, questID, ... ) -- In the field autocomplete quest event. if EMA.db.enableQuestWatcher == false then return end EMA:EMASendCommandToTeam( EMA.COMMAND_AUTO_QUEST_COMPLETE, questID ) end function EMA:DoAutoQuestFieldComplete( characterName, questID ) EMA:EMAAddAutoQuestPopUp( questID, "COMPLETE", characterName ) end function EMA:QUEST_COMPLETE() if EMA.db.enableQuestWatcher == false then return end EMA:EMASendCommandToTeam( EMA.COMMAND_REMOVE_AUTO_QUEST_COMPLETE, questID ) end function EMA:DoRemoveAutoQuestFieldComplete( characterName, questID ) EMA:EMARemoveAutoQuestPopUp( questID, characterName ) end function EMA:QUEST_DETAIL() if EMA.db.enableQuestWatcher == false then return end -- if QuestGetAutoAccept() and QuestIsFromAreaTrigger() then -- EMA:EMASendCommandToTeam( EMA.COMMAND_AUTO_QUEST_OFFER, GetQuestID() ) -- end end function EMA:DoAutoQuestFieldOffer( characterName, questID ) EMA:EMAAddAutoQuestPopUp( questID, "OFFER", characterName ) end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCH COMMUNICATION ------------------------------------------------------------------------------------------------------------- function EMA:EMAQuestWatcherQuestLogUpdate( useCache ) for i = 1, GetNumQuestLogEntries() do local questID, title, questLogIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isBounty, isStory, isOnMap, hasLocalPOI, isHidden = GetQuestWatchInfo(i) if questID ~= nil then --EMA:Print("EMAQuestData", questID, title, questLogIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isBounty, isStory, isOnMap, hasLocalPOI, isHidden) if numObjectives > 0 then for iterateObjectives = 1, numObjectives do --EMA:Print( "NumObjs:", numObjectives ) local objectiveFullText, objectiveType, objectiveFinished = GetQuestLogLeaderBoard( iterateObjectives, questLogIndex ) local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText, objectiveType ) if objectiveType == "progressbar" then local progress = GetQuestProgressBarPercent( questID ) objectiveText = "ProgressBar"..": "..objectiveText amountCompleted = tostring(progress)..L["%"] end if objectiveFullText ~= nil then --EMA:Print("test2", questID, title, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete ) if (EMA:QuestCacheUpdate( questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, title, iterateObjectives, objectiveText, amountCompleted, isComplete, isComplete ) end end end end end end end function EMA:EMAQuestWatcherUpdate( useCache, questType ) if EMA.db.enableQuestWatcher == false then return end if questType == "quest" or "all" then EMA:EMAQuestWatcherQuestLogUpdate( useCache ) end end -- Gathers messages from team. function EMA:DoQuestWatchObjectiveUpdate( characterName, questID, questName, objectiveIndex, objectiveText, amountCompleted, objectiveFinished, isComplete ) EMA:UpdateQuestWatchList( questID, questName, objectiveIndex, objectiveText, characterName, amountCompleted, objectiveFinished, isComplete ) end function EMA:UpdateQuestWatchList( questID, questName, objectiveIndex, objectiveText, characterName, amountCompleted, objectiveFinished, isComplete ) --local characterName = (( Ambiguate( name, "none" ) )) --EMA:Print( "UpdateQuestWatchList", questID, questName, objectiveIndex, objectiveText, characterName, amountCompleted, objectiveFinished, isComplete ) local questHeaderPosition = EMA:GetQuestHeaderInWatchList( questID, questName, characterName ) local objectiveHeaderPosition = EMA:GetObjectiveHeaderInWatchList( questID, questName, objectiveIndex, objectiveText, "", questHeaderPosition ) local characterPosition = EMA:GetCharacterInWatchList( questID, objectiveIndex, characterName, amountCompleted, objectiveHeaderPosition, objectiveFinished ) local totalAmountCompleted = EMA:GetTotalCharacterAmountFromWatchList( questID, objectiveIndex ) objectiveHeaderPosition = EMA:GetObjectiveHeaderInWatchList( questID, questName, objectiveIndex, objectiveText, totalAmountCompleted, questHeaderPosition ) -- isComplete piggybacks on the quest watch update, so we are always displaying a complete quest button (in case the QUEST_AUTOCOMPLETE event does not fire). if isComplete == true then EMA:DoAutoQuestFieldComplete( characterName, questID ) end if EMA.db.hideQuestIfAllComplete == true then EMA:CheckQuestForAllObjectivesCompleteAndHide( questID ) end EMA:QuestWatcherQuestListScrollRefresh() EMA:SetQuestWatcherVisibility() end ------------------------------------------------------------------------------------------------------------- function EMA:RemoveQuestFromWatchList( questID ) EMA:RemoveQuestFromWatcherCache( questID ) EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_REMOVE_QUEST, questID ) end function EMA:DoRemoveQuestFromWatchList( characterName, questID ) -- Remove character lines for this character. for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.character == characterName then EMA:RemoveQuestWatchInfo( questWatchInfo.key ) end end -- See if any character lines left, if none, then remove quest completely. local found = false for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.type == "CHARACTER_AMOUNT" then found = true end end if found == false then for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID then EMA:RemoveQuestWatchInfo( questWatchInfo.key ) end end else -- Still some character lines left, update the total amount of objectives to reflect lost team member. -- Find any remaining quest objective headers. for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.type == "OBJECTIVE_HEADER" then questWatchInfo.amount = EMA:GetTotalCharacterAmountFromWatchList( questID, questWatchInfo.objectiveIndex ) -- If all done auto-collapse when complete, collapse objective header. if (questWatchInfo.amount == L["DONE"]) and (EMA.db.doNotHideCompletedObjectives == true) then questWatchInfo.childrenAreHidden = true end end if questWatchInfo.questID == questID and questWatchInfo.type == "QUEST_HEADER" then EMA:UpdateTeamQuestCountRemoveCharacter( questWatchInfo, characterName ) if EMA.db.hideQuestIfAllComplete == true then EMA:CheckQuestForAllObjectivesCompleteAndHide( questID ) end end end end -- Remove any auto quest buttons. EMA:DoRemoveAutoQuestFieldComplete( characterName, questID ) EMA:QuestWatcherQuestListScrollRefresh() EMA:SetQuestWatcherVisibility() end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCH DISPLAY LIST LOGIC ------------------------------------------------------------------------------------------------------------- function EMA:GetTotalCharacterAmountFromWatchList( questID, objectiveIndex ) local amount = 0 local total = 0 local countCharacters = 0 local countDones = 0 local questType = nil local amountOverTotal = nil local ProgressQuest = nil for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local position = questWatchInfoContainer.position if questWatchInfo.questID == questID and questWatchInfo.type == "CHARACTER_AMOUNT" and questWatchInfo.objectiveIndex == objectiveIndex then countCharacters = countCharacters + 1 local amountCompletedText = questWatchInfo.amount if amountCompletedText == L["DONE"] then countDones = countDones + 1 end local arg1, arg2 = string.match(amountCompletedText, "(%d*)/(%d*)") if (arg1 ~= nil) and (arg2 ~= nil) then if strtrim( arg1 ) ~= "" and strtrim( arg2 ) ~= "" then amount = amount + tonumber( arg1 ) total = total + tonumber( arg2 ) end else local arg1 = string.match(amountCompletedText, "(%d*)") if (arg1 ~= nil) then if strtrim( arg1 ) ~= "" then amount = amount total = total + tonumber( arg1 ) ProgressQuest = true end end end end if questWatchInfo.questID == questID and questWatchInfo.type == "OBJECTIVE_HEADER" and string.find( questWatchInfo.information, "ProgressBar" ) then questType = "ProgressBar" end end if countCharacters == 0 then return L["DONE"] end if questType == "ProgressBar" and ProgressQuest == true then local totalChars = (100 * countCharacters) local maths = (total / totalChars) * 100 amountOverTotal = maths..L["%"] else if amount == total then amountOverTotal = L["DONE"] else amountOverTotal = string.format( "%s/%s", amount, total ) end end EMA:DebugMessage( "AMTOT:", amountOverTotal ) if amountOverTotal == "0/0" then --EMA:Print("test", countDones, countCharacters) if countDones == countCharacters then amountOverTotal = L["DONE"] else amountOverTotal = L["N/A"] end end return amountOverTotal end function EMA:RemoveQuestsNotBeingWatched() EMA:UpdateAllQuestsInWatchList() for checkQuestID, value in pairs( EMA.questWatchListOfQuests ) do local found = false for iterateWatchedQuests = 1, GetNumQuestWatches() do local questIndex = GetQuestIndexForWatch( iterateWatchedQuests ) if questIndex ~= nil then local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex ) if checkQuestID == questID then found = true end end end if found == false then EMA:RemoveQuestFromWatchList( checkQuestID ) end end end function EMA:UpdateAllQuestsInWatchList() table.wipe( EMA.questWatchListOfQuests ) for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do -- TODO- whats going on here? EMA.questWatchListOfQuests[questWatchInfoContainer.info.questID] = true end end function EMA:GetCharacterInWatchList( questID, objectiveIndex, characterName, amountCompleted, objectiveHeaderPosition, objectiveFinished ) local characterPosition = -1 local characterQuestWatchInfo if objectiveFinished then if EMA.db.showCompletedObjectivesAsDone == true then amountCompleted = L["DONE"] end end -- Try and find the character line. for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local position = questWatchInfoContainer.position if questWatchInfo.questID == questID and questWatchInfo.type == "CHARACTER_AMOUNT" and questWatchInfo.objectiveIndex == objectiveIndex and questWatchInfo.character == characterName then -- Character line found. Update information. questWatchInfo.amount = amountCompleted characterQuestWatchInfo = questWatchInfo characterPosition = position break end end -- Was not found, add character line. if characterPosition == -1 then -- Only if not completed or user wants to show completed. if ((objectiveFinished == nil) or (objectiveFinished == false)) or (EMA.db.doNotHideCompletedObjectives == true) then local questWatchInfo = EMA:CreateQuestWatchInfo( questID, "CHARACTER_AMOUNT", objectiveIndex, characterName, characterName, amountCompleted ) EMA:InsertQuestWatchInfoToListAfterPosition( questWatchInfo, objectiveHeaderPosition ) return objectiveHeaderPosition + 1 end return -1 else -- Character line was found. Remove it if objective finished? if (objectiveFinished) and (EMA.db.doNotHideCompletedObjectives == false) then EMA:RemoveQuestWatchInfo( characterQuestWatchInfo.key ) return -1 end end return -1 end function EMA:GetObjectiveHeaderInWatchList( questID, questName, objectiveIndex, objectiveText, totalAmountCompleted, questHeaderPosition ) --EMA:Print("testposition", questName, "oT", objectiveText, questHeaderPosition) if strtrim( objectiveText ) == "" then objectiveText = questName end for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local position = questWatchInfoContainer.position if questWatchInfo.questID == questID and questWatchInfo.type == "OBJECTIVE_HEADER" and questWatchInfo.objectiveIndex == objectiveIndex then questWatchInfo.information = objectiveText questWatchInfo.amount = totalAmountCompleted -- If all done auto-collapse when complete, collapse objective header. if (questWatchInfo.amount == L["DONE"]) and (EMA.db.doNotHideCompletedObjectives == true) then questWatchInfo.childrenAreHidden = true end return position end end local questWatchInfo = EMA:CreateQuestWatchInfo( questID, "OBJECTIVE_HEADER", objectiveIndex, "", objectiveText, totalAmountCompleted ) -- Hide the team list by default. questWatchInfo.childrenAreHidden = true EMA:InsertQuestWatchInfoToListAfterPosition( questWatchInfo, questHeaderPosition ) return questHeaderPosition + 1 end --TODO CLEAN UP function EMA:GetQuestItemFromQuestID(findQuestID) for iterateQuests=1,GetNumQuestLogEntries() do local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID = GetQuestLogTitle(iterateQuests) --if title ~= nil then if not isHeader then if findQuestID == questID then local questItemLink, questItemIcon, questItemCharges = GetQuestLogSpecialItemInfo( iterateQuests ) if questItemLink then --EMA:Print("Item", questItemLink, questItemIcon, questID) return questItemLink, questItemIcon else return nil, nil end end end end end function EMA:GetQuestHeaderInWatchList( questID, questName, characterName ) for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local position = questWatchInfoContainer.position if questWatchInfo.questID == questID and questWatchInfo.type == "QUEST_HEADER" then EMA:UpdateTeamQuestCountAddCharacter( questWatchInfo, characterName ) if EMA.db.hideQuestIfAllComplete == true then EMA:CheckQuestForAllObjectivesCompleteAndHide( questID ) end return position end end local questWatchInfo = EMA:CreateQuestWatchInfo( questID, "QUEST_HEADER", -1, "", questName, icon ) EMA:UpdateTeamQuestCountAddCharacter( questWatchInfo, characterName ) if EMA.db.hideQuestIfAllComplete == true then EMA:CheckQuestForAllObjectivesCompleteAndHide( questID ) end local newPositionAtEnd = EMA:GetQuestWatchMaximumOrder() + 1 EMA:AddQuestWatchInfoToListAtPosition( questWatchInfo, newPositionAtEnd ) return newPositionAtEnd end function EMA:UpdateTeamQuestCount( questWatchInfo, characterName ) local count = 0 for character, dummy in pairs( questWatchInfo.teamCharacters ) do count = count + 1 end questWatchInfo.questTeamCount = count end function EMA:UpdateTeamQuestCountAddCharacter( questWatchInfo, name ) questWatchInfo.teamCharacters[name] = true EMA:UpdateTeamQuestCount( questWatchInfo, name ) end function EMA:UpdateTeamQuestCountRemoveCharacter( questWatchInfo, characterName ) questWatchInfo.teamCharacters[characterName] = nil EMA:UpdateTeamQuestCount( questWatchInfo, characterName ) end function EMA:CheckQuestForAllObjectivesCompleteAndHide( questID ) if EMA.db.hideQuestIfAllComplete == false then return end -- If all objective headers for quest say "DONE" then hide quest if hideQuestIfAllComplete option set. local allDone = true for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.type == "OBJECTIVE_HEADER" then if questWatchInfo.amount ~= L["DONE"] then allDone = false end end end -- Set quest header hidden or not as appropriate. for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.type == "QUEST_HEADER" then questWatchInfo.childrenAreHidden = allDone end end end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCH INFO FUNCTIONS ------------------------------------------------------------------------------------------------------------- function EMA:CreateQuestWatchInfo( questID, type, objectiveIndex, character, information, amount ) local questWatchInfo = {} questWatchInfo.key = questID..type..objectiveIndex..character questWatchInfo.questID = questID questWatchInfo.type = type questWatchInfo.objectiveIndex = objectiveIndex questWatchInfo.character = character questWatchInfo.information = information questWatchInfo.amount = amount questWatchInfo.childrenAreHidden = false questWatchInfo.questTeamCount = 0 questWatchInfo.teamCharacters = {} return questWatchInfo end function EMA:AddQuestWatchInfoToListAtPosition( questWatchInfo, position ) EMA.questWatchObjectivesList[questWatchInfo.key] = {} EMA.questWatchObjectivesList[questWatchInfo.key].position = position EMA.questWatchObjectivesList[questWatchInfo.key].info = questWatchInfo end function EMA:InsertQuestWatchInfoToListAfterPosition( questWatchInfo, position ) for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local checkPosition = questWatchInfoContainer.position if checkPosition > position then questWatchInfoContainer.position = checkPosition + 1 end end EMA:AddQuestWatchInfoToListAtPosition( questWatchInfo, position + 1 ) end function EMA:RemoveQuestWatchInfo( key ) local removedPosition = EMA.questWatchObjectivesList[key].position for checkKey, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local checkPosition = questWatchInfoContainer.position if checkPosition > removedPosition then questWatchInfoContainer.position = checkPosition - 1 end end EMA.questWatchObjectivesList[key].info.key = nil EMA.questWatchObjectivesList[key].info.questID = nil EMA.questWatchObjectivesList[key].info.type = nil EMA.questWatchObjectivesList[key].info.objectiveIndex = nil EMA.questWatchObjectivesList[key].info.character = nil EMA.questWatchObjectivesList[key].info.information = nil EMA.questWatchObjectivesList[key].info.amount = nil EMA.questWatchObjectivesList[key].info.childrenAreHidden = nil EMA.questWatchObjectivesList[key].info.questTeamCount = nil table.wipe( EMA.questWatchObjectivesList[key].info.teamCharacters ) table.wipe( EMA.questWatchObjectivesList[key].info ) EMA.questWatchObjectivesList[key].info = nil EMA.questWatchObjectivesList[key].position = nil table.wipe( EMA.questWatchObjectivesList[key] ) EMA.questWatchObjectivesList[key] = nil end -- Get the largest order number from the quest watch list. function EMA:GetQuestWatchMaximumOrder() local largestPosition = 0 for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local position = questWatchInfoContainer.position if position > largestPosition then largestPosition = position end end return largestPosition end function EMA:GetQuestWatchInfoFromKey( key ) local questWatchInfo = EMA.questWatchObjectivesList[key].info return questWatchInfo.information, questWatchInfo.amount, questWatchInfo.type, questWatchInfo.questID, questWatchInfo.childrenAreHidden, key, questWatchInfo.objectiveIndex end -- Get the quest watch info at a specific position. function EMA:GetQuestWatchInfoAtOrderPosition( position ) local information = "" local amount = "" local type = "" local questID = "" local childrenAreHidden = "" local key = "" local questTeamCount = "" local objectiveIndex = "" for keyStored, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info local questWatchPosition = questWatchInfoContainer.position if questWatchPosition == position then information = questWatchInfo.information amount = questWatchInfo.amount type = questWatchInfo.type questID = questWatchInfo.questID childrenAreHidden = questWatchInfo.childrenAreHidden key = keyStored questTeamCount = questWatchInfo.questTeamCount objectiveIndex = questWatchInfo.objectiveIndex break end end return information, amount, type, questID, childrenAreHidden, key, questTeamCount, objectiveIndex end function EMA:ToggleChildrenAreHiddenQuestWatchInfoByKey( key ) local questWatchInfo = EMA.questWatchObjectivesList[key].info questWatchInfo.childrenAreHidden = not questWatchInfo.childrenAreHidden end function EMA:CountLinesInQuestWatchList() if EMA.questWatchObjectivesList == nil then return 1 end local count = 1 for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do count = count + 1 end return count end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCH DISPLAY LIST MECHANICS ------------------------------------------------------------------------------------------------------------- function EMA:QuestWatcherQuestListDrawLine( frame, iterateDisplayRows, type, information, amount, childrenAreHidden, key, questTeamCount, questID ) local toggleDisplay = "" local padding = "" local teamCount = "" local textFont = EMA.SharedMedia:Fetch( "font", EMA.db.watchFontStyle ) local textSize = EMA.db.watchFontSize if type == "CHARACTER_AMOUNT" then padding = " " end if type == "OBJECTIVE_HEADER" then padding = " " if childrenAreHidden == true then toggleDisplay = "+ " else toggleDisplay = "- " end end if type == "QUEST_HEADER" then if questTeamCount ~= 0 then teamCount = " ("..questTeamCount.."/"..EMAApi.GetTeamListMaximumOrderOnline()..") " end end frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetFont( textFont , textSize , "OUTLINE") frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetFont( textFont , textSize , "OUTLINE") --EMA:Print("test2343", type, information ) frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetText( padding..toggleDisplay..teamCount..information ) frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetText( amount ) if type == "QUEST_HEADER" then if matchData then frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetTextColor( 1.0, 0, 0, 1.0, 1.0 ) frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetTextColor( 1.0, 0, 0, 1.0, 1.0 ) else frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetTextColor( 1.0, 0.96, 0.41, 1.0 ) frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetTextColor( 1.0, 0.96, 0.41, 1.0 ) end end if InCombatLockdown() == false then frame.questWatchList.rows[iterateDisplayRows].columns[1]:EnableMouse( true ) frame.questWatchList.rows[iterateDisplayRows].columns[2]:EnableMouse( true ) end if type == "OBJECTIVE_HEADER" then frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetTextColor( NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1.0 ) frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetTextColor( NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1.0 ) frame.questWatchList.rows[iterateDisplayRows].key = key end end function EMA:QuestWatcherQuestListScrollRefresh() local frame = EMAQuestWatcherFrame FauxScrollFrame_Update( frame.questWatchList.listScrollFrame, EMA:GetQuestWatchMaximumOrder(), frame.questWatchList.rowsToDisplay, frame.questWatchList.rowHeight ) frame.questWatchListOffset = FauxScrollFrame_GetOffset( frame.questWatchList.listScrollFrame ) frame.dataRowOffset = 0 local atLeastOneRowShowing = false local afterTextEdit = false for iterateDisplayRows = 1, frame.questWatchList.rowsToDisplay do -- Reset. frame.questWatchList.rows[iterateDisplayRows].key = "" frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetText( "" ) frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetText( "" ) frame.questWatchList.rows[iterateDisplayRows].columns[1].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) frame.questWatchList.rows[iterateDisplayRows].columns[2].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) frame.questWatchList.rows[iterateDisplayRows].highlight:SetTexture( 0.0, 0.0, 0.0, 1.0 ) -- Get data. local dataRowNumber = iterateDisplayRows + frame.questWatchListOffset + frame.dataRowOffset local foundDataRow = false local finishedRows = false while (foundDataRow == false) and (finishedRows == false) do dataRowNumber = iterateDisplayRows + frame.questWatchListOffset + frame.dataRowOffset if dataRowNumber > EMA:GetQuestWatchMaximumOrder() then finishedRows = true else local information, amount, type, questID, childrenAreHidden, key, questTeamCount, objectiveIndex = EMA:GetQuestWatchInfoAtOrderPosition( dataRowNumber ) foundDataRow = true if type == "QUEST_HEADER" then -- In this case, children are hidden refers to itself as well. if childrenAreHidden == true then foundDataRow = false frame.dataRowOffset = frame.dataRowOffset + 1 end end if type == "OBJECTIVE_HEADER" then local hideMe = false for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.type == "QUEST_HEADER" then hideMe = questWatchInfo.childrenAreHidden break end end if hideMe == true then foundDataRow = false frame.dataRowOffset = frame.dataRowOffset + 1 end end -- If this is a character_amount type, find its parent objective header and see if its children are hidden. if type == "CHARACTER_AMOUNT" then local hideMe = false for key, questWatchInfoContainer in pairs( EMA.questWatchObjectivesList ) do local questWatchInfo = questWatchInfoContainer.info if questWatchInfo.questID == questID and questWatchInfo.type == "OBJECTIVE_HEADER" and questWatchInfo.objectiveIndex == objectiveIndex then hideMe = questWatchInfo.childrenAreHidden break end end if hideMe == true then foundDataRow = false frame.dataRowOffset = frame.dataRowOffset + 1 end end end -- Put information and amount into columns. local information, amount, type, questID, childrenAreHidden, key, questTeamCount, objectiveIndex = EMA:GetQuestWatchInfoAtOrderPosition( dataRowNumber ) EMA:QuestWatcherQuestListDrawLine( frame, iterateDisplayRows, type, information, amount, childrenAreHidden, key, questTeamCount, questID ) atLeastOneRowShowing = true end end -- Adjust the scroll frame based on hidden rows. if atLeastOneRowShowing == true then FauxScrollFrame_Update( frame.questWatchList.listScrollFrame, EMA:GetQuestWatchMaximumOrder() - frame.dataRowOffset, frame.questWatchList.rowsToDisplay, frame.questWatchList.rowHeight ) end EMA:DisplayAutoQuestPopUps() end function EMA:QuestWatcherQuestListRowClick( rowNumber, columnNumber ) local frame = EMAQuestWatcherFrame local key = frame.questWatchList.rows[rowNumber].key if key ~= nil and key ~= "" then local information, amount, type, questID, childrenAreHidden, keyStored = EMA:GetQuestWatchInfoFromKey( key ) EMA:DebugMessage( "GetQuestWatchInfoFromKey", information, amount, type, questID, childrenAreHidden, keyStored, key ) local questIndex = EMA:GetQuestLogIndexByName( information ) if type == "QUEST_HEADER" then if columnNumber == 1 then ShowUIPanel(QuestLogFrame) QuestLog_SetSelection( questIndex ) end end if type == "OBJECTIVE_HEADER" then if columnNumber == 1 then EMA:ToggleChildrenAreHiddenQuestWatchInfoByKey( key ) EMA:QuestWatcherQuestListScrollRefresh() end end end end function EMA.QuestWatcherQuestListRowRightClick( rowNumber, columnNumber ) --EMA:Print("testRightClick", rowNumber, columnNumber ) local frame = EMAQuestWatcherFrame local key = frame.questWatchList.rows[rowNumber].key if key ~= nil and key ~= "" then local information, amount, type, questID, childrenAreHidden, keyStored = EMA:GetQuestWatchInfoFromKey( key ) --EMA:Print("test", questID) if type == "QUEST_HEADER" and columnNumber == 1 then EMAQuestMapQuestOptionsDropDown.questID = questID EMAQuestMapQuestOptionsDropDown.questText = information ToggleDropDownMenu(1, nil, EMAQuestMapQuestOptionsDropDown, "cursor", 6, -6) end end end function EMA.QuestWatcherQuestListRowOnEnter( rowNumber, columnNumber ) end function EMA.QuestWatcherQuestListRowOnLeave() GameTooltip:Hide() end function EMAQuestMapQuestOptionsDropDown_Initialize(self) CloseDropDownMenus() local questID = EMAQuestMapQuestOptionsDropDown.questID local questText = EMAQuestMapQuestOptionsDropDown.questText if (questID ~= 0 ) then local questLogIndex = GetQuestLogIndexByID(questID) local infoTitle = UIDropDownMenu_CreateInfo() infoTitle.text = questText infoTitle.isTitle = 1 infoTitle.notCheckable = 1 UIDropDownMenu_AddButton(infoTitle) local info = UIDropDownMenu_CreateInfo() info.isNotRadio = true info.notCheckable = true info.text = OBJECTIVES_STOP_TRACKING info.func = function(_, questID) EMA:QuestMapQuestOptions_ToggleTrackQuest(questID, questText) end info.arg1 = self.questID info.checked = false UIDropDownMenu_AddButton(info) if ( GetQuestLogPushable(questLogIndex) and IsInGroup() ) then info.text = SHARE_QUEST info.func = function(_, questID) EMA:QuestMapQuestOptions_ShareQuest(questID) end info.arg1 = self.questID UIDropDownMenu_AddButton(info) end info.text = ABANDON_QUEST info.func = function(_, questID) EMA:QuestMapQuestOptions_AbandonQuest(questID, questText) end info.arg1 = self.questID info.disabled = nil UIDropDownMenu_AddButton(info) end end function EMA:QuestMapQuestOptions_ToggleTrackQuest(questID, questText) --EMA:Print("test", questID, questText) EMAApi.EMAApiUnTrackQuest( questID, questText ) end function EMA:QuestMapQuestOptions_ShareQuest( questID ) local questLogIndex = GetQuestLogIndexByID(questID) if questLogIndex then QuestLogPushQuest(questLogIndex) end end function EMA:QuestMapQuestOptions_AbandonQuest(questID, questText) EMAApi.EMAApiAbandonQuest(questID, questText) end function EMA:UpdateQuestItemButton( rowNumber, itemName ) if InCombatLockdown() == false then local frame = EMAQuestWatcherFrame frame.questWatchList.rows[rowNumber].columns[2]:SetAttribute("type1", "item") frame.questWatchList.rows[rowNumber].columns[2]:SetAttribute( "item", itemName ) end end ------------------------------------------------------------------------------------------------------------ -- QUEST WATCH AUTO QUEST DISPLAY - MOSTLY BORROWED FROM BLIZZARD CODE ------------------------------------------------------------------------------------------------------------- function EMA:HasAtLeastOneAutoQuestPopup() if #EMA.currentAutoQuestPopups == 0 then return false end return true end function EMA:EMAAddAutoQuestPopUp( questID, popUpType, characterName ) if EMA.currentAutoQuestPopups[questID] == nil then EMA.currentAutoQuestPopups[questID] = {} end EMA.currentAutoQuestPopups[questID][characterName] = popUpType end function EMA:EMARemoveAutoQuestPopUp( questID, characterName ) if EMA.currentAutoQuestPopups[questID] == nil then return end EMA.currentAutoQuestPopups[questID][characterName] = nil if #EMA.currentAutoQuestPopups[questID] == 0 then table.wipe( EMA.currentAutoQuestPopups[questID] ) EMA.currentAutoQuestPopups[questID] = nil end end function EMA:EMARemoveAllAutoQuestPopUps( questID ) if EMA.currentAutoQuestPopups[questID] == nil then return end table.wipe( EMA.currentAutoQuestPopups[questID] ) EMA.currentAutoQuestPopups[questID] = nil end function EMA:AutoQuestGetOrCreateFrame( parent, index ) if _G["EMAWatchFrameAutoQuestPopUp"..index] then return _G["EMAWatchFrameAutoQuestPopUp"..index] end local frame = CreateFrame( "SCROLLFRAME", "EMAWatchFrameAutoQuestPopUp"..index, parent ) frame.index = index frame:EnableMouse( true ) local QuestName = frame:CreateFontString( "EMAWatchFrameAutoQuestPopUpQuestName"..index, "OVERLAY", "GameFontNormal" ) QuestName:SetPoint( "TOP", frame, "TOP", 0, -12 ) QuestName:SetTextColor( 1.00, 1.00, 1.00 ) QuestName:SetText( "" ) frame.QuestName = QuestName local TopText = frame:CreateFontString( "EMAWatchFrameAutoQuestPopUpTopText"..index, "OVERLAY", "GameFontNormal" ) TopText:SetPoint( "TOP", frame, "TOP", 0, -24 ) TopText:SetTextColor( 1.00, 1.00, 1.00 ) TopText:SetText( "" ) frame.TopText = TopText local BottomText = frame:CreateFontString( "EMAWatchFrameAutoQuestPopUpBottomText"..index, "OVERLAY", "GameFontNormal" ) BottomText:SetPoint( "TOP", frame, "TOP", 0, -36 ) BottomText:SetTextColor( 1.00, 1.00, 1.00 ) BottomText:SetText( "BottomText" ) frame.BottomText = BottomText EMA.countAutoQuestPopUpFrames = EMA.countAutoQuestPopUpFrames + 1 return frame end function EMA:DisplayAutoQuestPopUps() local nextAnchor local countPopUps = 0 local iterateQuestPopups = 01 EMAQuestWatcherFrame.autoQuestPopupsHeight = 0 local parentFrame = EMAQuestWatcherFrame.fieldNotifications for questID, characterInfo in pairs( EMA.currentAutoQuestPopups ) do local characterName, characterPopUpType, popUpType local characterList = "" for characterName, characterPopUpType in pairs( characterInfo ) do --characterList = characterList..characterName.." " characterList = characterList..( Ambiguate( characterName, "none" ) ).." " -- TODO - hack, assuming all characters have the same sort of popup. popUpType = characterPopUpType end local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( GetQuestLogIndexByID( questID ) ) if isComplete and isComplete > 0 then isComplete = true else isComplete = false end -- If the current character does not have the quest, show the character names that do have it. local clickToViewText = QUEST_WATCH_POPUP_CLICK_TO_VIEW if not (title and title ~= "") then title = characterList clickToViewText = "" end local frame = EMA:AutoQuestGetOrCreateFrame( parentFrame, countPopUps + 1 ) frame:Show() frame:ClearAllPoints() frame:SetParent( parentFrame ) if isComplete == true and popUpType == "COMPLETE" then frame.TopText:SetText( QUEST_WATCH_POPUP_CLICK_TO_COMPLETE ) frame.BottomText:Hide() frame:SetHeight( 32 ) frame.type = "COMPLETED" frame:HookScript( "OnMouseUp", function() ShowQuestComplete( GetQuestLogIndexByID( questID ) ) EMA:EMARemoveAllAutoQuestPopUps( questID ) EMA:DisplayAutoQuestPopUps() EMA:SettingsUpdateBorderStyle() EMA:SettingsUpdateFontStyle() end ) elseif popUpType == "OFFER" then frame.TopText:SetText( QUEST_WATCH_POPUP_QUEST_DISCOVERED ) frame.BottomText:Show() frame.BottomText:SetText( clickToViewText ) frame:SetHeight( 48 ) frame.type = "OFFER" frame:HookScript( "OnMouseUp", function() EMA:EMARemoveAllAutoQuestPopUps( questID ) EMA:DisplayAutoQuestPopUps() EMA:SettingsUpdateBorderStyle() EMA:SettingsUpdateFontStyle() end ) end frame:ClearAllPoints() if nextAnchor ~= nil then if iterateQuestPopups == 1 then frame:SetPoint( "TOP", nextAnchor, "BOTTOM", 0, 0 ) -- -WATCHFRAME_TYPE_OFFSET else frame:SetPoint( "TOP", nextAnchor, "BOTTOM", 0, 0 ) end else frame:SetPoint( "TOP", parentFrame, "TOP", 0, 5 ) -- -WATCHFRAME_INITIAL_OFFSET end frame:SetPoint( "LEFT", parentFrame, "LEFT", -20, 0 ) frame.QuestName:SetText( title ) frame.questId = questID --frame:UpdateScrollChildRect() --frame:SetVerticalScroll( floor( -9 + 0.5 ) ) nextAnchor = frame countPopUps = countPopUps + 1 EMAQuestWatcherFrame.autoQuestPopupsHeight = EMAQuestWatcherFrame.autoQuestPopupsHeight + frame:GetHeight() end for iterateQuestPopups = countPopUps + 1, EMA.countAutoQuestPopUpFrames do _G["EMAWatchFrameAutoQuestPopUp"..iterateQuestPopups].questId = nil _G["EMAWatchFrameAutoQuestPopUp"..iterateQuestPopups]:Hide() end EMA:UpdateQuestWatcherDimensions() end ------------------------------------------------------------------------------------------------------------- -- QUEST WATCH HELPERS ------------------------------------------------------------------------------------------------------------- function EMA:GetQuestLogIndexByName( questName ) for iterateQuests = 1, GetNumQuestLogEntries() do local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests ) if not isHeader then if title == questName then return iterateQuests end end end return 0 end function EMA:GetQuestLogIndexByID( inQuestID ) for iterateQuests = 1, GetNumQuestLogEntries() do local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests ) if not isHeader then if questID == inQuestID then return iterateQuests end end end return 0 end ------------------------------------------------------------------------------------------------------------- -- COMMAND MANAGEMENT ------------------------------------------------------------------------------------------------------------- -- A EMA command has been recieved. function EMA:EMAOnCommandReceived( characterName, commandName, ... ) if commandName == EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE then EMA:DoQuestWatchObjectiveUpdate( characterName, ... ) end if commandName == EMA.COMMAND_UPDATE_QUEST_WATCHER_LIST then EMA:DoQuestWatchListUpdate( characterName, ... ) end if commandName == EMA.COMMAND_QUEST_WATCH_REMOVE_QUEST then EMA:DoRemoveQuestFromWatchList( characterName, ... ) end if commandName == EMA.COMMAND_AUTO_QUEST_COMPLETE then EMA:DoAutoQuestFieldComplete( characterName, ... ) end if commandName == EMA.COMMAND_REMOVE_AUTO_QUEST_COMPLETE then EMA:DoRemoveAutoQuestFieldComplete( characterName, ... ) end if commandName == EMA.COMMAND_AUTO_QUEST_OFFER then EMA:DoAutoQuestFieldOffer( characterName, ... ) end end