local UIWidgetBase = require_ex('Common/Core/UIWidgetBase') local ControllerMode = MapConst.LEVEL_MAP_CONTROLLER_MODE LevelMapController = HL.Class('LevelMapController', UIWidgetBase) local EXTRA_VIEW_VALUE = 1 local LEVEL_UPDATE_THREAD_INTERVAL = 0.5 local LEVEL_SWITCH_LOADER_UPDATE_THREAD_INTERVAL = 0.015 local FOLLOW_CHARACTER_LOADER_UPDATE_THREAD_INTERVAL = 0.25 local INVOKE_LEVEL_SWITCH_FINISH_DELAY = 0.2 local NEED_UPDATE_LOADER_CHARACTER_SQR_MAGNITUDE = 0.002 LevelMapController.m_mode = HL.Field(HL.Number) << -1 LevelMapController.m_levelMapConfig = HL.Field(CS.Beyond.Gameplay.UILevelMapConfig) LevelMapController.m_currentLevelId = HL.Field(HL.String) << "" LevelMapController.m_currentIsSingleLevel = HL.Field(HL.Boolean) << false LevelMapController.m_fixedMarkInstId = HL.Field(HL.String) << "" LevelMapController.m_customRefreshMark = HL.Field(HL.Function) LevelMapController.m_onLevelSwitch = HL.Field(HL.Function) LevelMapController.m_onLevelSwitchStart = HL.Field(HL.Function) LevelMapController.m_onLevelSwitchFinish = HL.Field(HL.Function) LevelMapController.m_onTrackingMarkClicked = HL.Field(HL.Function) LevelMapController.m_switchTweenList = HL.Field(HL.Table) LevelMapController.m_delayInvokeTimer = HL.Field(HL.Number) << -1 LevelMapController.m_currentMaxScale = HL.Field(HL.Number) << -1 LevelMapController.m_currentMinScale = HL.Field(HL.Number) << -1 LevelMapController.m_visibleMarks = HL.Field(HL.Table) LevelMapController.m_filteredMarks = HL.Field(HL.Table) LevelMapController.m_layeredMarks = HL.Field(HL.Table) LevelMapController.m_currentLayer = HL.Field(HL.Number) << -1 LevelMapController.m_currFollowModeTrackingMarkId = HL.Field(HL.String) << "" LevelMapController.m_markVisibleRect = HL.Field(RectTransform) LevelMapController.m_expectedMarks = HL.Field(HL.Table) LevelMapController.m_topOrderMarks = HL.Field(HL.Table) LevelMapController.m_noGeneralTracking = HL.Field(HL.Boolean) << true LevelMapController.m_noMissionTracking = HL.Field(HL.Boolean) << true LevelMapController.m_currTopOrderMarkLastOrder = HL.Field(HL.Number) << -1 LevelMapController.m_waitPlayUnlockedAnimMistList = HL.Field(HL.Table) LevelMapController.m_waitPlayUnlockedAnimMistQueue = HL.Field(HL.Forward("Queue")) LevelMapController.m_isPlayingUnlockedAnimation = HL.Field(HL.Boolean) << false LevelMapController.m_lastPosChanged = HL.Field(HL.Boolean) << false LevelMapController.m_currTrackingMarkData = HL.Field(HL.Table) LevelMapController.m_lastTrackingMarkId = HL.Field(HL.String) << "" LevelMapController.m_trackingMissionMarkIdList = HL.Field(HL.Table) LevelMapController._OnFirstTimeInit = HL.Override() << function(self) if self.m_mode == ControllerMode.LEVEL_SWITCH then self:RegisterMessage(MessageConst.ON_MAP_FILTER_STATE_CHANGED, function(args) self:_RefreshLoaderMarksVisibleStateByFilter() end) elseif self.m_mode == ControllerMode.FOLLOW_CHARACTER then self:RegisterMessage(MessageConst.ON_MIST_MAP_UNLOCK, function(args) self:_OnMistStateChangeInFollowMode(args) end) self:RegisterMessage(MessageConst.ON_TELEPORT_FINISH, function(args) self:_OnTeleportFinish() end) self:RegisterMessage(MessageConst.ON_ENTER_TIER_REGION, function(args) local tierId = unpack(args) self:_OnCurrTierRegionStateChangeInFollowMode(tierId, true) end) self:RegisterMessage(MessageConst.ON_LEAVE_TIER_REGION, function(args) local tierId = unpack(args) self:_OnCurrTierRegionStateChangeInFollowMode(tierId, false) end) self:RegisterMessage(MessageConst.ON_ENTER_TIER_CONTAINER_REGION, function(args) self:SetLoaderTierStateWithNeedShowMarkTier(true) end) self:RegisterMessage(MessageConst.ON_LEAVE_TIER_CONTAINER_REGION, function(args) self:SetLoaderTierStateWithNeedShowMarkTier(false) end) end self:RegisterMessage(MessageConst.ON_TRACKING_MAP_MARK, function(args) self:_OnTrackingStateChanged() end) self:RegisterMessage(MessageConst.ON_TRACK_MARK_CHANGE, function(args) self:_OnTrackingStateChanged() end) self:RegisterMessage(MessageConst.ON_MAP_TRACKING_MISSION_DATA_CHANGED, function(args) self:_RefreshMissionTrackingMarks() end) self:RegisterMessage(MessageConst.ON_MAP_MARK_RUNTIME_DATA_MODIFY, function(args) local instId = unpack(args) self:_RefreshGeneralTrackingMarkOnMarkDataModify(instId) end) end LevelMapController._OnDestroy = HL.Override() << function(self) if self.m_mode == ControllerMode.FOLLOW_CHARACTER then GameInstance.player.mapManager.characterFollowerInstance = nil elseif self.m_mode == ControllerMode.LEVEL_SWITCH then if self.m_switchTweenList ~= nil then for _, tween in pairs(self.m_switchTweenList) do if tween ~= nil then tween:Kill(false) end end self.m_switchTweenList = nil end end end LevelMapController.InitLevelMapController = HL.Method(HL.Number, HL.Opt(HL.Table)) << function(self, mode, customInfo) self.m_levelMapConfig = DataManager.uiLevelMapConfig customInfo = customInfo or {} local initialLevelId = string.isEmpty(customInfo.initialLevelId) and GameWorld.worldInfo.curLevelId or customInfo.initialLevelId local loaderCustomInfo = {} if mode == ControllerMode.FIXED then if not string.isEmpty(customInfo.fixedMarkInstId) then initialLevelId = GameInstance.player.mapManager:GetMarkInstRuntimeDataLevelId(customInfo.fixedMarkInstId) self.m_fixedMarkInstId = customInfo.fixedMarkInstId end loaderCustomInfo = { needUpdate = false, } elseif mode == ControllerMode.LEVEL_SWITCH then loaderCustomInfo = { extraView = EXTRA_VIEW_VALUE, needOptimizePerformance = false, hideOtherLevels = true, needUpdate = false, needShowOtherLevelTracking = false, needInteractableMark = true, onMarkInstDataChangedCallback = function() self:_ResetLoaderMarksVisibleStateByFilter() self:_RefreshLoaderMarksVisibleStateByLayer(self.m_currentLayer) end, onMarkHover = function(markInstId, isHover) customInfo.onMarkHover(markInstId, isHover) end, onGridsLoadedStateChange = function() self:_RefreshAnimationMistsInSwitchMode() end } elseif mode == ControllerMode.FOLLOW_CHARACTER then loaderCustomInfo = { needOptimizePerformance = true, needShowOtherLevelTracking = true, needListenMarkStateChange = true, } end loaderCustomInfo.expectedStaticElements = customInfo.expectedStaticElements loaderCustomInfo.gridsMaskFollowTarget = customInfo.gridsMaskFollowTarget if not self.m_levelMapConfig.levelConfigInfos:ContainsKey(initialLevelId) then if BEYOND_DEBUG_COMMAND and mode == ControllerMode.DEBUG then self.view.levelMapLoader:InitLevelMapLoader(initialLevelId, { isDebugMode = true }) end return end self.view.levelMapLoader:InitLevelMapLoader(initialLevelId, loaderCustomInfo) self:_SetCurrentLevelId(initialLevelId) self.m_customRefreshMark = customInfo.customRefreshMark or function()end self.m_onLevelSwitch = customInfo.onLevelSwitch or function()end self.m_onLevelSwitchStart = customInfo.onLevelSwitchStart or function()end self.m_onLevelSwitchFinish = customInfo.onLevelSwitchFinish or function()end self.m_onTrackingMarkClicked = customInfo.onTrackingMarkClicked or function()end self.m_markVisibleRect = customInfo.visibleRect self.m_expectedMarks = customInfo.expectedMarks or {} self.m_topOrderMarks = customInfo.topOrderMarks or {} self.m_noGeneralTracking = customInfo.noGeneralTracking == true self.m_noMissionTracking = customInfo.noMissionTracking == true self.m_visibleMarks = {} self.m_mode = mode if mode == ControllerMode.FIXED then self:_InitControllerFixedMode() elseif mode == ControllerMode.LEVEL_SWITCH then self:_InitControllerSwitchMode() elseif mode == ControllerMode.FOLLOW_CHARACTER then self:_InitControllerFollowMode() end self:_FirstTimeInit() end LevelMapController._SetCurrentLevelId = HL.Method(HL.String) << function(self, levelId) self.m_currentLevelId = levelId local configSuccess, levelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(levelId) if configSuccess then self.m_currentIsSingleLevel = levelConfig.isSingleLevel end end LevelMapController._InitControllerFixedMode = HL.Method() << function(self) if not string.isEmpty(self.m_fixedMarkInstId) then self.view.levelMapLoader:SetLoaderWithMarkPosition(self.m_fixedMarkInstId) end self.view.levelMapLoader:UpdateAndRefreshAll() self.view.levelMapLoader:RefreshCharacterPosition() self.view.levelMapLoader:SetLoaderPlayerVisibleState(false) self:_CustomRefreshFixedModeMarks() end LevelMapController._CustomRefreshFixedModeMarks = HL.Method() << function(self) local loadedMarkViewDataMap = self.view.levelMapLoader:GetLoadedMarkViewDataMap() if loadedMarkViewDataMap == nil or next(loadedMarkViewDataMap) == nil then return end for _, markViewData in pairs(loadedMarkViewDataMap) do if self.m_customRefreshMark ~= nil then self.m_customRefreshMark(markViewData) end end end LevelMapController._InitControllerSwitchMode = HL.Method() << function(self) self.view.markTopOrder:SetAsLastSibling() self.view.levelMapLoader:SetLoaderDataUpdateInterval(LEVEL_SWITCH_LOADER_UPDATE_THREAD_INTERVAL) self:_RefreshLoaderStateByLevel(self.m_currentLevelId, false) self:_RefreshMissionTrackingMarks() self.view.levelMapLoader:ToggleLoaderGeneralTrackingVisibleState(not self.m_noGeneralTracking) self.view.levelMapLoader:ToggleLoaderMissionTrackingVisibleState(not self.m_noMissionTracking) self.view.levelMapLoader:RefreshCharacterPosition() self.view.levelMapLoader:SetNeedOptimizePerformance(false) end LevelMapController._RefreshLoaderStateByLevel = HL.Method(HL.String, HL.Boolean) << function(self, levelId, moveNeedTween) local success, configInfo = self.m_levelMapConfig.levelConfigInfos:TryGetValue(levelId) if not success then return end local gridRectLength = self.m_levelMapConfig.gridRectLength local tweenDuration = self.view.config.SWITCH_TWEEN_DURATION local tweenEase = self.view.config.SWITCH_TWEEN_CURVE local tweenData = moveNeedTween and { duration = tweenDuration, ease = tweenEase, } or nil self.m_switchTweenList = {} self.view.levelMapLoader:SetLoaderLevel(levelId) self.view.levelMapLoader:RefreshLevelSwitchMaskState(levelId) local inCurrentLevel = GameWorld.worldInfo.curLevelId == levelId if moveNeedTween then self.view.levelMapLoader:SetLoaderElementsShownState(false) end local minScale = configInfo.minScale local offset = Vector2( configInfo.horizontalInitOffsetGridsValue * gridRectLength * minScale, configInfo.verticalInitOffsetGridsValue * gridRectLength * minScale ) local loaderPosTween = self.view.levelMapLoader:SetLoaderWithLevelCenterPosition(levelId, offset, tweenData) local loaderSizeTween = self.view.levelMapLoader:SetLoaderViewSizeByGridsCount( configInfo.horizontalViewGridsCount, configInfo.verticalViewGridsCount, tweenData ) local loaderMoveSize = Vector2( configInfo.horizontalMoveGridsValue * gridRectLength, configInfo.verticalMoveGridsValue * gridRectLength ) local initialOffset = Vector2( configInfo.horizontalAllInitOffsetGridsValue * gridRectLength, configInfo.verticalAllInitOffsetGridsValue * gridRectLength ) local targetInfo = { size = loaderMoveSize, scale = minScale, initialOffset = initialOffset, } self:_SetCurrentLevelId(levelId) self.m_currentMaxScale = configInfo.maxScale self.m_currentMinScale = configInfo.minScale local onMoveFinish = function() self:_RefreshGeneralTrackingMarkInSwitchMode() self:_RefreshMissionTrackingMarks() self.view.levelMapLoader:SetLoaderPlayerVisibleState(inCurrentLevel) end if moveNeedTween then table.insert(self.m_switchTweenList, loaderPosTween) table.insert(self.m_switchTweenList, loaderSizeTween) self.m_onLevelSwitchStart(targetInfo) local scaleTween = self.view.rectTransform:DOScale(configInfo.minScale, tweenDuration):SetEase(tweenEase) local posTween = self.view.rectTransform:DOAnchorPos(initialOffset, tweenDuration):SetEase(tweenEase) table.insert(self.m_switchTweenList, scaleTween) table.insert(self.m_switchTweenList, posTween) for index, tween in ipairs(self.m_switchTweenList) do tween:OnComplete(function() self.m_switchTweenList[index] = nil if not next(self.m_switchTweenList) then self:_ResetLoaderMarksVisibleStateByFilter() self.m_delayInvokeTimer = self:_StartTimer(INVOKE_LEVEL_SWITCH_FINISH_DELAY, function() self.m_onLevelSwitchFinish() self:_ClearTimer(self.m_delayInvokeTimer) self.view.levelMapLoader:RefreshElementsHiddenStateInOtherLevel() self.view.levelMapLoader:SetLoaderElementsShownState(true) onMoveFinish() end) end end) end else self.view.levelMapLoader:UpdateAndRefreshAll() self.view.levelMapLoader:RefreshElementsHiddenStateInOtherLevel() self:_ResetLoaderMarksVisibleStateByFilter() self.m_onLevelSwitch(targetInfo) self.view.rectTransform.anchoredPosition = Vector2.zero onMoveFinish() end end LevelMapController._ResetLoaderMarksVisibleStateByFilter = HL.Method() << function(self) self:_UpdateLoaderMarksVisibleData() self:_RefreshLoaderMarksVisibleStateByFilter() end LevelMapController._UpdateLoaderMarksVisibleData = HL.Method() << function(self) local loadedMarkViewDataMap = self.view.levelMapLoader:GetLoadedMarkViewDataMap() if loadedMarkViewDataMap == nil or next(loadedMarkViewDataMap) == nil then return end self.m_visibleMarks = {} for _, markViewData in pairs(loadedMarkViewDataMap) do self.m_visibleMarks[markViewData.instId] = markViewData end self:_SetMarksToTopOrder() end LevelMapController._RefreshLoaderMarksVisibleStateByFilter = HL.Method() << function(self) self.m_filteredMarks = {} for instId, markViewData in pairs(self.m_visibleMarks) do local filterType = markViewData.filterType self.m_filteredMarks[instId] = not GameInstance.player.mapManager:HasFilterFlag(filterType) self:_RefreshLoaderMarkVisibleState(instId) end self:_RefreshLoaderLineVisibleState() end LevelMapController._RefreshLoaderMarksVisibleStateByLayer = HL.Method(HL.Number) << function(self, layer) self.m_layeredMarks = {} for instId, markViewData in pairs(self.m_visibleMarks) do local visible = markViewData.visibleLayer <= layer self.m_layeredMarks[instId] = visible self:_RefreshLoaderMarkVisibleState(instId) end self.m_currentLayer = layer self:_RefreshLoaderLineVisibleState() end LevelMapController._RefreshLoaderMarkVisibleState = HL.Method(HL.String) << function(self, markInstId) local markViewData = self.m_visibleMarks[markInstId] if markViewData == nil then return end local isVisible = true if not self.m_currentIsSingleLevel then isVisible = self:_GetIsMarkRealVisible(markInstId) end markViewData.markObj:ToggleMarkHiddenState("PanelControl", not isVisible) end LevelMapController._RefreshLoaderLineVisibleState = HL.Method() << function(self) self.view.levelMapLoader:SetLoaderLineVisibleState(true) local invisibleLineList = {} if next(self.m_expectedMarks) then for combinedTemplateId, lineType in pairs(MapConst.COMBINED_TEMPLATE_ID_TO_LINE_TYPE) do local isVisible = self.m_expectedMarks[combinedTemplateId] if not isVisible then invisibleLineList[lineType] = true end end end for lineType, fieldName in pairs(MapConst.LINE_TYPE_TO_VISIBLE_LAYER_FIELD_NAME) do local isVisible = self.m_currentLayer >= self.m_levelMapConfig[fieldName] if not isVisible then invisibleLineList[lineType] = true end end for filterType, lineType in pairs(MapConst.FILTER_TYPE_TO_LINE_TYPE) do if GameInstance.player.mapManager:HasFilterFlag(filterType) then invisibleLineList[lineType] = true end end for lineType, _ in pairs(invisibleLineList) do self.view.levelMapLoader:SetLoaderLineVisibleStateByType(lineType, false) end end LevelMapController._SetTrackingMissionMarksOnClickedCallbackInSwitchMode = HL.Method() << function(self) local trackingMissionMarks = self.view.levelMapLoader:GetMissionTrackingMarks() if trackingMissionMarks == nil then return end for instId, trackingMark in pairs(trackingMissionMarks) do trackingMark:OverrideMarkOnClickCallback(function() local relatedMark = self.view.levelMapLoader:GetLoadedMarkByInstId(instId) self.m_onTrackingMarkClicked(instId, trackingMark, relatedMark) end) end end LevelMapController._GetIsMarkRealVisible = HL.Method(HL.String).Return(HL.Boolean) << function(self, markInstId) local markViewData = self.m_visibleMarks[markInstId] if markViewData == nil then return false end if next(self.m_expectedMarks) and not self.m_expectedMarks[markViewData.runtimeData.templateId] then if markViewData.runtimeData.isPowerRelated then if not self.m_expectedMarks[MapConst.POWER_RELATED_COMBINED_TEMPLATE_ID] then return false end elseif markViewData.runtimeData.isTravelRelated then if not self.m_expectedMarks[MapConst.TRAVEL_RELATED_COMBINED_TEMPLATE_ID] then return false end else return false end end if self.m_filteredMarks ~= nil and not self.m_filteredMarks[markInstId] then return false end if self.m_layeredMarks ~= nil and not self.m_layeredMarks[markInstId] then return false end return true end LevelMapController._SetMarksToTopOrder = HL.Method() << function(self) if not next(self.m_topOrderMarks) then return end local loadedMarkViewDataMap = self.view.levelMapLoader:GetLoadedMarkViewDataMap() if loadedMarkViewDataMap == nil or next(loadedMarkViewDataMap) == nil then return end for _, markViewData in pairs(loadedMarkViewDataMap) do if self.m_topOrderMarks[markViewData.runtimeData.templateId] then markViewData.mark.rectTransform:SetParent(self.view.markTopOrder) end end end LevelMapController._RefreshAnimationMistsInSwitchMode = HL.Method() << function(self) local showList = {} self.m_waitPlayUnlockedAnimMistList = {} local mistMapSystem = GameInstance.player.mistMapSystem for loaderData in cs_pairs(self.view.levelMapLoader.view.loader.hitGrids) do if loaderData.needLoadMists then for mistId, _ in pairs(loaderData.mists) do if not showList[mistId] and mistMapSystem:IsMistWaitingPlayUnlockedAnimation(mistId) then if showList[mistId] == nil then showList[mistId] = true table.insert(self.m_waitPlayUnlockedAnimMistList, mistId) end end end end end self.view.levelMapLoader:RefreshAnimationMistState(showList) if next(showList) then self.view.levelMapLoader:ToggleAnimationMistNodeVisibleState(true) end end LevelMapController.SetSingleMarkToTopOrder = HL.Method(HL.String) << function(self, markInstId) local markViewData = self.view.levelMapLoader:GetLoadedMarkViewDataByInstId(markInstId) if markViewData == nil then return end local markRectTransform = markViewData.mark.rectTransform self.m_currTopOrderMarkLastOrder = markRectTransform:GetSiblingIndex() markRectTransform:SetParent(self.view.markTopOrder) end LevelMapController.ResetSingleMarkToOriginalOrder = HL.Method(HL.String) << function(self, markInstId) local markViewData = self.view.levelMapLoader:GetLoadedMarkViewDataByInstId(markInstId) if markViewData == nil then return end local markRectTransform = markViewData.mark.rectTransform markRectTransform:SetParent(self.view.levelMapLoader:GetMarkOrderRoot(markViewData.sortOrder)) markRectTransform:SetSiblingIndex(self.m_currTopOrderMarkLastOrder) end LevelMapController._InitControllerFollowMode = HL.Method() << function(self) self.view.levelMapLoader:SetLoaderDataUpdateInterval(FOLLOW_CHARACTER_LOADER_UPDATE_THREAD_INTERVAL) self:_RefreshMissionTrackingMarks() self:_InitTierStateInFollowMode() self.view.levelMapLoader:SetNeedOptimizePerformance(false) GameInstance.player.mapManager.characterFollowerInstance = self.view.characterFollower self.view.levelMapLoader:SetNeedOptimizePerformance(true) self:_RefreshGeneralTrackingMarkInFollowMode() end LevelMapController._OnTeleportFinish = HL.Method() << function(self) self.view.levelMapLoader:SetNeedOptimizePerformance(false) GameInstance.player.mapManager:ForceUpdateAndRefreshCharacterFollowerState(false) self.view.levelMapLoader:SetNeedOptimizePerformance(true) end LevelMapController._InitTierStateInFollowMode = HL.Method() << function(self) local needShowTier = GameWorld.mapRegionManager:GetCurrentCharInTierContainerId() > 0 self:SetLoaderTierStateWithNeedShowMarkTier(needShowTier) self:SetLoaderTierStateWithTierId(GameWorld.mapRegionManager:GetCurrentCharInTierId()) end LevelMapController._OnMistStateChangeInFollowMode = HL.Method(HL.Table) << function(self, args) if self.m_waitPlayUnlockedAnimMistQueue == nil then self.m_waitPlayUnlockedAnimMistQueue = require_ex("Common/Utils/DataStructure/Queue")() end self.m_waitPlayUnlockedAnimMistQueue:Push(unpack(args)) self:_PlayMistUnlockedAnimationWithQueueInFollowMode() end LevelMapController._PlayMistUnlockedAnimationWithQueueInFollowMode = HL.Method() << function(self) if self.m_waitPlayUnlockedAnimMistQueue:Empty() or self.m_isPlayingUnlockedAnimation then return end self.m_isPlayingUnlockedAnimation = true local unlockMistId = self.m_waitPlayUnlockedAnimMistQueue:Pop() local levelMapLoader = self.view.levelMapLoader levelMapLoader:ToggleAnimationMistNodeVisibleState(false) levelMapLoader:ToggleForbidMistRefreshAfterGridChange(true) levelMapLoader:RefreshAnimationMistState({ [unlockMistId] = true }, function() levelMapLoader:RefreshMistState(function() levelMapLoader:ToggleAnimationMistNodeVisibleState(true) levelMapLoader:PlayMistsUnlockedAnimation(function() levelMapLoader:ToggleForbidMistRefreshAfterGridChange(false) levelMapLoader:ToggleAnimationMistNodeVisibleState(false) self.m_isPlayingUnlockedAnimation = false self:_PlayMistUnlockedAnimationWithQueueInFollowMode() end) levelMapLoader:RefreshMarkStateAfterMistUnlocked() AudioAdapter.PostEvent("Au_UI_Toast_SmallMapMistDissipate") end) end) end LevelMapController._OnCurrTierRegionStateChangeInFollowMode = HL.Method(HL.Number, HL.Boolean) << function(self, tierId, isIn) local tierIndex = GameWorld.mapRegionManager:GetTierIndex(tierId) if tierIndex == MapConst.BASE_TIER_INDEX then return end self:SetLoaderTierStateWithTierId(isIn and tierId or MapConst.BASE_TIER_ID) end LevelMapController._OnTrackingStateChanged = HL.Method() << function(self) if self.m_mode == ControllerMode.LEVEL_SWITCH then self:_RefreshGeneralTrackingMarkInSwitchMode() elseif self.m_mode == ControllerMode.FOLLOW_CHARACTER then self:_RefreshGeneralTrackingMarkInFollowMode() end end LevelMapController._RefreshGeneralTrackingMarkOnMarkDataModify = HL.Method(HL.String) << function(self, markInstId) if markInstId ~= GameInstance.player.mapManager.trackingMarkInstId then return end self:_OnTrackingStateChanged() end LevelMapController._RefreshGeneralTrackingMarkInSwitchMode = HL.Method() << function(self) local mapManager = GameInstance.player.mapManager local trackingMarkInstId if not string.isEmpty(mapManager.trackingMarkInstId) and mapManager:GetMarkInstRuntimeDataLevelId(mapManager.trackingMarkInstId) ~= self.m_currentLevelId then trackingMarkInstId = "" else trackingMarkInstId = mapManager.trackingMarkInstId end self:_RefreshGeneralRelatedMarkVisibleState(self.m_lastTrackingMarkId, trackingMarkInstId) self.view.levelMapLoader:SetGeneralTrackingMarkState(trackingMarkInstId) local trackingMark = self.view.levelMapLoader:GetGeneralTrackingMark() if not string.isEmpty(trackingMarkInstId) then trackingMark:OverrideMarkOnClickCallback(function() local relatedMark = self.view.levelMapLoader:GetLoadedMarkByInstId(trackingMarkInstId) self.m_onTrackingMarkClicked(trackingMarkInstId, trackingMark, relatedMark) end) end self.m_lastTrackingMarkId = trackingMarkInstId end LevelMapController._RefreshGeneralRelatedMarkVisibleState = HL.Method(HL.String, HL.String) << function(self, lastId, currId) local lastMark = self.view.levelMapLoader:GetLoadedMarkByInstId(lastId) local currMark = self.view.levelMapLoader:GetLoadedMarkByInstId(currId) if lastMark ~= nil then lastMark:ToggleMarkHiddenState("TrackingRelated", lastId == currId) end if currMark ~= nil then currMark:ToggleMarkHiddenState("TrackingRelated", true) end end LevelMapController._RefreshGeneralTrackingMarkInFollowMode = HL.Method() << function(self) local trackingMarkInstId = GameInstance.player.mapManager.trackingMarkInstId self:_RefreshGeneralRelatedMarkVisibleState(self.m_lastTrackingMarkId, trackingMarkInstId) self.view.levelMapLoader:SetGeneralTrackingMarkState(trackingMarkInstId) self.m_lastTrackingMarkId = trackingMarkInstId self.m_currFollowModeTrackingMarkId = trackingMarkInstId end LevelMapController._RefreshMissionTrackingMarks = HL.Method() << function(self) self.m_trackingMissionMarkIdList = {} for _,markId in cs_pairs(GameInstance.player.mapManager.trackingMissionMarkList) do table.insert(self.m_trackingMissionMarkIdList, markId) end self.view.levelMapLoader:SetMissionTrackingMarkState(self.m_trackingMissionMarkIdList) self:_RefreshMissionRelatedMarksVisibleState() if self.m_mode == ControllerMode.LEVEL_SWITCH then self:_SetTrackingMissionMarksOnClickedCallbackInSwitchMode() end end LevelMapController._RefreshMissionRelatedMarksVisibleState = HL.Method() << function(self) if self.m_trackingMissionMarkIdList == nil then return end for _, id in pairs(self.m_trackingMissionMarkIdList) do local mark = self.view.levelMapLoader:GetLoadedMarkByInstId(id) if mark ~= nil then mark:ToggleMarkHiddenState("MissionTrackingRelated", true) end end end LevelMapController.GetControllerCurrentMaxScale = HL.Method().Return(HL.Number) << function(self) return self.m_currentMaxScale end LevelMapController.GetControllerCurrentMinScale = HL.Method().Return(HL.Number) << function(self) return self.m_currentMinScale end LevelMapController.GetControllerCurrentLevelId = HL.Method().Return(HL.String) << function(self) return self.m_currentLevelId end LevelMapController.GetControllerMarkRectTransform = HL.Method(HL.String).Return(Unity.RectTransform) << function(self, markInstId) local mapManager = GameInstance.player.mapManager local trackingMarkInstId = mapManager.trackingMarkInstId if markInstId == trackingMarkInstId then local mark = self.view.levelMapLoader:GetGeneralTrackingMark() return mark.rectTransform end local trackingMissionMarks = self.view.levelMapLoader:GetMissionTrackingMarks() for instId, trackingMissionMark in pairs(trackingMissionMarks) do if instId == markInstId then return trackingMissionMark.rectTransform end end return self.view.levelMapLoader:GetMarkRectTransformByInstId(markInstId) end LevelMapController.GetControllerNearbyMarkList = HL.Method(HL.String, HL.Number, HL.Number, HL.Opt(GEnums.MarkType)).Return(HL.Table) << function(self, targetInstId, length, scale, markTypeFilter) length = length / scale / 2.0 local targetViewData = self.m_visibleMarks[targetInstId] if targetViewData == nil then return {} end local targetMark = targetViewData.mark local targetPos = targetMark.rectTransform.anchoredPosition local tempResult = {} for instId, markViewData in pairs(self.m_visibleMarks) do if instId ~= targetInstId and self:_GetIsMarkRealVisible(instId) then local isValidMark = self.view.levelMapLoader:GetLoadedMarkByInstId(instId) ~= nil if isValidMark then local mark = markViewData.mark local pos = mark.rectTransform.anchoredPosition if math.abs(pos.x - targetPos.x) <= length and math.abs(pos.y - targetPos.y) <= length then local validNearby = true local markSuccess, runtimeData = GameInstance.player.mapManager:GetMarkInstRuntimeData(markViewData.instId) if markSuccess then local templateSuccess, templateData = Tables.mapMarkTempTable:TryGetValue(runtimeData.templateId) if templateSuccess then if markTypeFilter and templateData.markType ~= markTypeFilter then validNearby = false end if markViewData.instId == GameInstance.player.mapManager:GetNowSelectCustomMarkInsId() then validNearby = false end if instId == GameInstance.player.mapManager.trackingMarkInstId then local trackingMark = self.view.levelMapLoader:GetGeneralTrackingMark() if trackingMark.view.levelMapLimitInRect ~= nil and trackingMark.view.levelMapLimitInRect.isLimitedInRect then validNearby = false end end if self.m_trackingMissionMarkIdList ~= nil then for _, missionInstId in ipairs(self.m_trackingMissionMarkIdList) do if instId == missionInstId then local trackingMarks = self.view.levelMapLoader:GetMissionTrackingMarks() local trackingMark = trackingMarks[instId] if trackingMark ~= nil and trackingMark.view.levelMapLimitInRect ~= nil and trackingMark.view.levelMapLimitInRect.isLimitedInRect then validNearby = false end end end end if validNearby then table.insert(tempResult, markViewData) end end end end end end end table.sort(tempResult, Utils.genSortFunction({ "sortId" }, false)) local result = {} if targetInstId ~= GameInstance.player.mapManager:GetNowSelectCustomMarkInsId() then table.insert(result, targetInstId) end for _, markViewData in ipairs(tempResult) do table.insert(result, markViewData.instId) end return result end LevelMapController.GetControllerMarkByInstId = HL.Method(HL.String).Return(HL.Any) << function(self, instId) return self.view.levelMapLoader:GetLoadedMarkByInstId(instId) end LevelMapController.NeedPlayMistsUnlockedAnimation = HL.Method().Return(HL.Boolean) << function(self) return next(self.m_waitPlayUnlockedAnimMistList) ~= nil end LevelMapController.TryPlayMistUnlockedAnimation = HL.Method(HL.Function) << function(self, onComplete) self.view.levelMapLoader:PlayMistsUnlockedAnimation(onComplete) GameInstance.player.mistMapSystem:AddMistUnlockedAnimationPlayed(self.m_waitPlayUnlockedAnimMistList) self.m_waitPlayUnlockedAnimMistList = {} end LevelMapController.RefreshLoaderMarksVisibleStateByLayer = HL.Method(HL.Number) << function(self, layer) self:_RefreshLoaderMarksVisibleStateByLayer(layer) end LevelMapController.ResetSwitchModeToTargetLevelState = HL.Method(HL.String) << function(self, levelId) local targetSuccess, targetLevelConfig = DataManager.levelConfigTable:TryGetData(levelId) if not targetSuccess then return end local currSuccess, currLevelConfig = DataManager.levelConfigTable:TryGetData(self.m_currentLevelId) if not currSuccess then return end if targetLevelConfig.mapIdStr ~= currLevelConfig.mapIdStr then self.view.levelMapLoader:ResetToTargetMapAndLevel(levelId) end self:_RefreshLoaderStateByLevel(levelId, false) end LevelMapController.SetLoaderTierStateWithTierId = HL.Method(HL.Number) << function(self, tierId) self.view.levelMapLoader:SetLoaderTierId(tierId) end LevelMapController.SetLoaderTierStateWithNeedShowMarkTier = HL.Method(HL.Boolean) << function(self, needShow) self.view.levelMapLoader:ToggleLoaderNeedShowMarkTier(needShow) end LevelMapController.SwitchToTargetLevel = HL.Method(HL.String) << function(self, levelId) self:_RefreshLoaderStateByLevel(levelId, true) end HL.Commit(LevelMapController) return LevelMapController