---@class QuestieEventHandler local QuestieEventHandler = QuestieLoader:CreateModule("QuestieEventHandler") local _EventHandler = QuestieEventHandler.private ------------------------- --Import modules. ------------------------- ---@type QuestieQuest local QuestieQuest = QuestieLoader:ImportModule("QuestieQuest") ---@type QuestieJourney local QuestieJourney = QuestieLoader:ImportModule("QuestieJourney") ---@type QuestieComms local QuestieComms = QuestieLoader:ImportModule("QuestieComms") ---@type QuestieProfessions local QuestieProfessions = QuestieLoader:ImportModule("QuestieProfessions") ---@type QuestieTracker local QuestieTracker = QuestieLoader:ImportModule("QuestieTracker") ---@type TrackerBaseFrame local TrackerBaseFrame = QuestieLoader:ImportModule("TrackerBaseFrame") ---@type TrackerQuestFrame local TrackerQuestFrame = QuestieLoader:ImportModule("TrackerQuestFrame") ---@type TrackerUtils local TrackerUtils = QuestieLoader:ImportModule("TrackerUtils") ---@type QuestieReputation local QuestieReputation = QuestieLoader:ImportModule("QuestieReputation") ---@type QuestieNameplate local QuestieNameplate = QuestieLoader:ImportModule("QuestieNameplate") ---@type QuestieMap local QuestieMap = QuestieLoader:ImportModule("QuestieMap") ---@type QuestiePlayer local QuestiePlayer = QuestieLoader:ImportModule("QuestiePlayer") ---@type QuestieAuto local QuestieAuto = QuestieLoader:ImportModule("QuestieAuto") ---@type QuestieAnnounce local QuestieAnnounce = QuestieLoader:ImportModule("QuestieAnnounce") ---@type QuestieCombatQueue local QuestieCombatQueue = QuestieLoader:ImportModule("QuestieCombatQueue") ---@type QuestieInit local QuestieInit = QuestieLoader:ImportModule("QuestieInit") ---@type MinimapIcon local MinimapIcon = QuestieLoader:ImportModule("MinimapIcon") ---@type QuestgiverFrame local QuestgiverFrame = QuestieLoader:ImportModule("QuestgiverFrame") ---@type QuestieDebugOffer local QuestieDebugOffer = QuestieLoader:ImportModule("QuestieDebugOffer") ---@type AvailableQuests local AvailableQuests = QuestieLoader:ImportModule("AvailableQuests") --- COMPATIBILITY --- local C_Timer = QuestieCompat.C_Timer local UnitInParty = QuestieCompat.UnitInParty local questAcceptedMessage = string.gsub(ERR_QUEST_ACCEPTED_S, "(%%s)", "(.+)") local questCompletedMessage = string.gsub(ERR_QUEST_COMPLETE_S, "(%%s)", "(.+)") --* Calculated in _EventHandler:PlayerLogin() ---en/br/es/fr/gb/it/mx: "You are now %s with %s." (e.g. "You are now Honored with Stormwind."), all other languages are very alike local FACTION_STANDING_CHANGED_PATTERN function QuestieEventHandler:RegisterEarlyEvents() Questie:RegisterEvent("PLAYER_LOGIN", _EventHandler.PlayerLogin) end function QuestieEventHandler:RegisterLateEvents() Questie:RegisterEvent("PLAYER_LEVEL_UP", _EventHandler.PlayerLevelUp) Questie:RegisterEvent("PLAYER_REGEN_DISABLED", _EventHandler.PlayerRegenDisabled) Questie:RegisterEvent("PLAYER_REGEN_ENABLED", _EventHandler.PlayerRegenEnabled) -- Miscellaneous Events Questie:RegisterEvent("MAP_EXPLORATION_UPDATED", _EventHandler.MapExplorationUpdated) Questie:RegisterEvent("MODIFIER_STATE_CHANGED", function(...) _EventHandler.ModifierStateChanged(...) end) Questie:RegisterEvent("PLAYER_ALIVE", function(...) QuestieTracker:UpdateDurabilityFrame() QuestieTracker:UpdateVoiceOverFrame() end) -- Events to update a players professions and reputations Questie:RegisterBucketEvent("CHAT_MSG_SKILL", 2, _EventHandler.ChatMsgSkill) Questie:RegisterBucketEvent("CHAT_MSG_COMBAT_FACTION_CHANGE", 2, _EventHandler.ChatMsgCompatFactionChange) Questie:RegisterEvent("CHAT_MSG_SYSTEM", _EventHandler.ChatMsgSystem) -- Spell objectives Questie:RegisterEvent("NEW_RECIPE_LEARNED", function() -- Needed for some spells that don't necessarily appear in the spellbook, but are definitely spells Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] NEW_RECIPE_LEARNED") AvailableQuests.CalculateAndDrawAll() end) -- UI Quest Events Questie:RegisterEvent("UI_INFO_MESSAGE", _EventHandler.UiInfoMessage) Questie:RegisterEvent("QUEST_FINISHED", QuestieAuto.QUEST_FINISHED) Questie:RegisterEvent("QUEST_ACCEPTED", QuestieAuto.QUEST_ACCEPTED) Questie:RegisterEvent("QUEST_DETAIL", function(...) -- When the quest is presented! QuestieAuto.QUEST_DETAIL(...) if Questie.IsSoD then QuestieDebugOffer.QuestDialog(...) end; end) Questie:RegisterEvent("QUEST_PROGRESS", QuestieAuto.QUEST_PROGRESS) Questie:RegisterEvent("GOSSIP_SHOW", function(...) QuestieAuto.GOSSIP_SHOW(...) QuestgiverFrame.GossipMark(...) end) Questie:RegisterEvent("QUEST_GREETING", function(...) QuestieAuto.QUEST_GREETING(...) QuestgiverFrame.GreetingMark(...) end) Questie:RegisterEvent("QUEST_ACCEPT_CONFIRM", QuestieAuto.QUEST_ACCEPT_CONFIRM) -- If an escort quest is taken by people close by Questie:RegisterEvent("GOSSIP_CLOSED", QuestieAuto.GOSSIP_CLOSED) -- Called twice when the stopping to talk to an NPC Questie:RegisterEvent("QUEST_COMPLETE", function(...) -- When complete window shows QuestieAuto.QUEST_COMPLETE(...) if Questie.IsSoD then QuestieDebugOffer.QuestDialog(...) end; end) -- UI Achievement Events if Questie.IsWotlk or QuestieCompat.Is335 then -- Earned Achievement update Questie:RegisterEvent("ACHIEVEMENT_EARNED", function(index, achieveId, alreadyEarned) Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] ACHIEVEMENT_EARNED") QuestieTracker:UntrackAchieveId(achieveId) QuestieTracker:UpdateAchieveTrackerCache(achieveId) if (not AchievementFrame) then AchievementFrame_LoadUI() end AchievementFrameAchievements_ForceUpdate() QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end) -- Track/Untrack Achievement updates Questie:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED", function(index, achieveId, added) Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] TRACKED_ACHIEVEMENT_LIST_CHANGED") QuestieTracker:UpdateAchieveTrackerCache(achieveId) end) -- Timed based Achievement updates -- TODO: Fired when a timed event for an achievement begins or ends. The achievement does not have to be actively tracked for this to trigger. Questie:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE", function(self, achieveId) Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] TRACKED_ACHIEVEMENT_UPDATE") QuestieCombatQueue:Queue(function() if QuestieCompat.Is335 then QuestieTracker:UpdateAchieveTrackerCache(achieveId) end QuestieTracker:Update() end) end) --[[ TODO: This fires FAR too often. Until Blizzard figures out a way to allow us to trigger achievement updates this needs to remain disabled for now. Questie:RegisterEvent("CRITERIA_UPDATE", function() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] CRITERIA_UPDATE") QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end) --]] -- Money based Achievement updates Questie:RegisterEvent("CHAT_MSG_MONEY", function() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] CHAT_MSG_MONEY") QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end) -- Emote based Achievement updates Questie:RegisterEvent("CHAT_MSG_TEXT_EMOTE", function() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] CHAT_MSG_TEXT_EMOTE") QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end) -- Player equipment changed based Achievement updates Questie:RegisterEvent("PLAYER_EQUIPMENT_CHANGED", function() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] PLAYER_EQUIPMENT_CHANGED") QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end) end -- LOOT_OPENED: remove pins for looted quest object nodes, and (SoD) run the debug offer. -- AceEvent allows only one handler per event on the Questie object, so both run here. Questie:RegisterEvent("LOOT_OPENED", function(...) local ok, err = pcall(function() QuestieQuest:RemoveLootedObjectivePins() end) if not ok then Questie:Debug(Questie.DEBUG_ELEVATED, "[QuestieEventHandler] RemoveLootedObjectivePins error:", err) end if Questie.IsSoD and QuestieDebugOffer and QuestieDebugOffer.LootWindow then QuestieDebugOffer.LootWindow(...) end end) -- Questie Comms Events -- Party join event for QuestieComms, Use bucket to hinder this from spamming (Ex someone using a raid invite addon etc) Questie:RegisterBucketEvent("GROUP_ROSTER_UPDATE", 1, _EventHandler.GroupRosterUpdate) Questie:RegisterEvent("GROUP_JOINED", _EventHandler.GroupJoined) Questie:RegisterEvent("GROUP_LEFT", _EventHandler.GroupLeft) -- Nameplate / Target Frame Objective Events Questie:RegisterEvent("NAME_PLATE_UNIT_ADDED", QuestieNameplate.NameplateCreated) Questie:RegisterEvent("NAME_PLATE_UNIT_REMOVED", QuestieNameplate.NameplateDestroyed) Questie:RegisterEvent("PLAYER_TARGET_CHANGED", function(...) QuestieNameplate.DrawTargetFrame() --if Questie.IsSoD then QuestieDebugOffer.NPCTarget() end; end) -- quest announce Questie:RegisterEvent("CHAT_MSG_LOOT", function(_, text, notPlayerName, _, _, playerName) if QuestieCompat.Is335 then playerName = QuestieCompat.ChatMessageLoot(text) end QuestieTracker.QuestItemLooted(_, text) QuestieAnnounce.ItemLooted(_, text, notPlayerName, _, _, playerName) end) -- since icon updates are disabled in instances, we need to reset on P_E_W Questie:RegisterEvent("PLAYER_ENTERING_WORLD", function() if Questie.started then QuestieMap:InitializeQueue() local isInInstance, instanceType = IsInInstance() local skipInstance = isInInstance and (instanceType == "raid" or instanceType == "pvp" or instanceType == "arena") -- Only run map updates when not in a raid or battleground if not skipInstance then QuestieQuest:SmoothReset() end end end) end local _PlayerLoginFired = false function _EventHandler:PlayerLogin() if _PlayerLoginFired then return end _PlayerLoginFired = true -- Check config exists if not Questie.db or not QuestieConfig then -- Did you move Questie.db = LibStub("AceDB-3.0"):New("QuestieConfig",.......) out of Questie:OnInitialize() ? Questie:Fatal("Config DB from saved variables is not loaded and initialized. Please report this issue on Questie github or discord.") return end do -- All this information was researched here: https://www.townlong-yak.com/framexml/live/GlobalStrings.lua local locale = GetLocale() local FACTION_STANDING_CHANGED_LOCAL = FACTION_STANDING_CHANGED or "You are now %s with %s." local replaceCount -- Just init it with an impossible value local replaceString = ".+" --! Has to got from least likely to work to most, otherwise you will get false positives local replaceTypes = { ruRU = "%(%%%d$s%)", --ruRU "|3-6(%2$s) |3-6(%1$s)." ("Ваша репутация с %2$s теперь %1$s. zhTW = "%%s%(%%s%)", --zhTW "你在%2$s中的聲望達到了%1$s。"") deDE = "%%%d$s", --deDE "Die Fraktion '%2$s' ist Euch gegenüber jetzt '%1$s' eingestellt." or "Die Fraktion %2$s ist Euch gegenüber jetzt '%1$s' eingestellt." zhCNkoKR = "%%%d$s", --zhCN(zhTW?)/koKR "你在%2$s中的声望达到了%1$s。" / "%2$s에 대해 %1$s 평판이 되었습니다." enPlus = "%%s", -- European languages except (deDE) } if locale == "zhCN" or locale == "koKR" then --CN/KR "你在%2$s中的声望达到了%1$s。" / "%2$s에 대해 %1$s 평판이 되었습니다." FACTION_STANDING_CHANGED_PATTERN, replaceCount = string.gsub(FACTION_STANDING_CHANGED_LOCAL, replaceTypes.zhCNkoKR, replaceString) elseif locale == "deDE" then --DE "Die Fraktion '%2$s' ist Euch gegenüber jetzt '%1$s' eingestellt." or "Die Fraktion %2$s ist Euch gegenüber jetzt '%1$s' eingestellt." FACTION_STANDING_CHANGED_PATTERN, replaceCount = string.gsub(FACTION_STANDING_CHANGED_LOCAL, replaceTypes.deDE, replaceString) -- Germans are always special elseif locale == "zhTW" then --TW "你的聲望已達到%s(%s)。", should we remove the parentheses? FACTION_STANDING_CHANGED_PATTERN, replaceCount = string.gsub(FACTION_STANDING_CHANGED_LOCAL, replaceTypes.zhTW, replaceString) elseif locale == "ruRU" then --RU "|3-6(%2$s) |3-6(%1$s).", should we remove the parentheses? FACTION_STANDING_CHANGED_PATTERN, replaceCount = string.gsub(FACTION_STANDING_CHANGED_LOCAL, replaceTypes.ruRU, replaceString) else FACTION_STANDING_CHANGED_PATTERN, replaceCount = string.gsub(FACTION_STANDING_CHANGED_LOCAL, replaceTypes.enPlus, replaceString) end --? A fallback to try everything if the replaceCount is still -1 or 0 if replaceCount and replaceCount < 1 then for _, replaceType in pairs(replaceTypes) do FACTION_STANDING_CHANGED_PATTERN, replaceCount = string.gsub(FACTION_STANDING_CHANGED_LOCAL, replaceType, replaceString) if replaceCount > 0 then break end end end --? Nothing worked :( if replaceCount and replaceCount < 1 then --- Error: Default to match EVERYTHING, because it's better that it works FACTION_STANDING_CHANGED_PATTERN = ".+" Questie:Error("Something went wrong with the FACTION_STANDING_CHANGED_PATTERN!") Questie:Error("FACTION_STANDING_CHANGED is set to " .. tostring(FACTION_STANDING_CHANGED) .. ", please report this on GitHub!") end end -- Start real Questie init QuestieInit:Init() end --- Fires when a System Message (yellow text) is output to the main chat window ---@param message string The message value from the CHAT_MSG_SYSTEM event function _EventHandler:ChatMsgSystem(message) if not message then return end -- When a new quest is accepted or completed quest is turned in, update the LibDataBroker text with the appropriate message if string.find(message, questCompletedMessage) == 1 or string.find(message, questAcceptedMessage) == 1 then MinimapIcon:UpdateText(message) elseif string.find(message, FACTION_STANDING_CHANGED_PATTERN) then -- When you discover a new faction or increase standing eg. Neutral -> Friendly QuestieReputation:Update() end end --- Fires when a UI Info Message (yellow text) appears near the top of the screen ---@param errorType number The error type value from the UI_INFO_MESSAGE event ---@param message string The message value from the UI_INFO_MESSAGE event function _EventHandler:UiInfoMessage(errorType, message) local messages = { ["ERR_QUEST_OBJECTIVE_COMPLETE_S"] = true, ["ERR_QUEST_UNKNOWN_COMPLETE"] = true, ["ERR_QUEST_ADD_KILL_SII"] = true, ["ERR_QUEST_ADD_FOUND_SII"] = true, ["ERR_QUEST_ADD_ITEM_SII"] = true, ["ERR_QUEST_ADD_PLAYER_KILL_SII "] = true, ["ERR_QUEST_FAILED_S"] = true, } if messages[GetGameMessageInfo(errorType)] then MinimapIcon:UpdateText(message) end end --- Fires on MAP_EXPLORATION_UPDATED. function _EventHandler:MapExplorationUpdated() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] MAP_EXPLORATION_UPDATED") if Questie.db.profile.hideUnexploredMapIcons then QuestieMap.utils:MapExplorationUpdate() end -- Exploratory based Achievement updates if Questie.IsWotlk then QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end end --- Fires when the player levels up ---@param level number function _EventHandler:PlayerLevelUp(level) Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] PLAYER_LEVEL_UP", level) QuestiePlayer:SetPlayerLevel(level) -- deferred update (possible desync fix?) C_Timer.After(3, function() QuestiePlayer:SetPlayerLevel(level) AvailableQuests.CalculateAndDrawAll() end) QuestieJourney:PlayerLevelUp(level) end --- Fires when a modifier key changed function _EventHandler:ModifierStateChanged(key, down) if key == "LSHIFT" or key == "RSHIFT" then -- Unless the Shift Key is down, don't run this code. We've recieved reports that our tooltips -- are apperearing when using the Shift Modifier for other areas of the UI and other addons. -- Since we're hooking into Blizzards GameTooltip, it's possible that certain edge cases would -- cause our Tooltips to appear instead and since the mouse isn't over "our" frame, it's not -- getting reset properly and getting stuck to the Mouse Cursor. -- Questie Map Icons if MouseIsOver(WorldMapFrame) and WorldMapFrame:IsShown() or MouseIsOver(Minimap) then local GameTooltip = QuestieCompat.Tooltip if GameTooltip and GameTooltip:IsShown() and GameTooltip._Rebuild then GameTooltip:Hide() GameTooltip:ClearLines() GameTooltip:SetOwner(GameTooltip._owner, "ANCHOR_CURSOR") GameTooltip:_Rebuild() -- rebuild the tooltip GameTooltip:SetFrameStrata("TOOLTIP") GameTooltip:Show() end end -- Questie Tracker Sizer if QuestieTracker.started then if MouseIsOver(Questie_BaseFrame.sizer) then if down == 1 then if GameTooltip and GameTooltip:IsShown() and GameTooltip._SizerToolTip then GameTooltip:Hide() GameTooltip:ClearLines() GameTooltip:SetOwner(GameTooltip._owner, "ANCHOR_CURSOR") GameTooltip._SizerToolTip() GameTooltip:SetFrameStrata("TOOLTIP") GameTooltip:Show() end else if GameTooltip:IsShown() then GameTooltip:Hide() GameTooltip._SizerToolTip = nil end end end end end if QuestieTracker.started then -- AI_VoiceOver PlayButtons TrackerUtils:ShowVoiceOverPlayButtons() end if Questie.db.profile.trackerLocked then if QuestieTracker.started then -- This is a safety catch for race conditions to prevent the Tracker Sizer -- from becoming stuck to the mouse pointer when the player releases the -- CTRL key first before releasing the Left Mouse Button. if (key == "LCTRL" or key == "RCTRL") and down == 0 then if IsMouseButtonDown("LeftButton") then -- Tracker is being sized if TrackerBaseFrame.isSizing ~= false and TrackerBaseFrame.isMoving ~= true then TrackerBaseFrame.OnResizeStop(self, "LeftButton") return end -- Tracker is being moved if TrackerBaseFrame.isMoving ~= false and TrackerBaseFrame.isSizing ~= true then TrackerBaseFrame.OnDragStop(self, "LeftButton") return end end end QuestieCombatQueue:Queue(function() TrackerBaseFrame:Update() TrackerQuestFrame:Update() end) end end end --- Fires when some chat messages about skills are displayed function _EventHandler:ChatMsgSkill() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] CHAT_MSG_SKILL") -- This needs to be done to draw new quests that just came available local isProfUpdate, isNewProfession = QuestieProfessions:Update() if isProfUpdate or isNewProfession then AvailableQuests.CalculateAndDrawAll() end -- Skill based Achievement updates if Questie.IsWotlk or QuestieCompat.Is335 then QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end end --- Fires when some chat messages about reputations are displayed function _EventHandler:ChatMsgCompatFactionChange() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] CHAT_MSG_COMBAT_FACTION_CHANGE") local factionChanged, newFaction = QuestieReputation:Update(false) if factionChanged or newFaction then QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) AvailableQuests.CalculateAndDrawAll() end end function _EventHandler.GroupRosterUpdate() local currentMembers = GetNumGroupMembers() -- Only want to do logic when number increases, not decreases. if QuestiePlayer.numberOfGroupMembers < currentMembers then -- Tell comms to send information to members. --Questie:SendMessage("QC_ID_BROADCAST_FULL_QUESTLIST") QuestiePlayer.numberOfGroupMembers = currentMembers else -- We do however always want the local to be the current number to allow up and down. QuestiePlayer.numberOfGroupMembers = currentMembers end end function _EventHandler:GroupJoined() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] GROUP_JOINED") local checkTimer --We want this to be fairly quick. checkTimer = C_Timer.NewTicker(0.2, function() local partyPending = UnitInParty("player") local isInParty = UnitInParty("party1") local isInRaid = UnitInRaid("raid1") if partyPending then if (isInParty or isInRaid) then Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieEventHandler] Player joined party/raid, ask for questlogs") --Request other players log. Questie:SendMessage("QC_ID_REQUEST_FULL_QUESTLIST") checkTimer:Cancel() end else Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieEventHandler] Player no longer in a party or pending invite. Cancel timer") checkTimer:Cancel() end end) end function _EventHandler:GroupLeft() --Resets both QuestieComms.remoteQuestLog and QuestieComms.data QuestieComms:ResetAll() end local trackerHiddenByCombat, optionsHiddenByCombat, journeyHiddenByCombat = false, false, false function _EventHandler:PlayerRegenDisabled() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] PLAYER_REGEN_DISABLED") -- Let's make sure the frame exists - might be nil if player is in combat upon login if QuestieTracker then if Questie.db.profile.hideTrackerInCombat and Questie.db.char.isTrackerExpanded and (not trackerHiddenByCombat) then trackerHiddenByCombat = true QuestieTracker:Collapse() end if IsInInstance() and Questie.db.profile.hideTrackerInDungeons then QuestieTracker:Collapse() end end -- Let's make sure the frame exists - might be nil if player is in combat upon login if QuestieConfigFrame then if QuestieConfigFrame:IsShown() then optionsHiddenByCombat = true QuestieConfigFrame:Hide() end end -- Let's make sure the frame exists - might be nil if player is in combat upon login if QuestieJourney then if QuestieJourney:IsShown() then journeyHiddenByCombat = true QuestieJourney.ToggleJourneyWindow() end end end function _EventHandler:PlayerRegenEnabled() Questie:Debug(Questie.DEBUG_DEVELOP, "[EVENT] PLAYER_REGEN_ENABLED") if Questie.db.profile.hideTrackerInCombat and trackerHiddenByCombat then if (not Questie.db.profile.hideTrackerInDungeons) or (not IsInInstance()) then trackerHiddenByCombat = false QuestieTracker:Expand() end QuestieCombatQueue:Queue(function() QuestieTracker:Update() end) end if optionsHiddenByCombat then QuestieConfigFrame:Show() optionsHiddenByCombat = false end if journeyHiddenByCombat then QuestieJourney.ToggleJourneyWindow() journeyHiddenByCombat = false end end