Files
Endfield-Data/LuaScripts/UI/Panels/Map/MapCtrl.lua
2025-12-02 20:37:18 +07:00

2793 lines
82 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local MapSpaceshipNode = require_ex('UI/Widgets/MapSpaceshipNode')
local MapMarkDetailCommon = require_ex('UI/Widgets/MapMarkDetailCommon')
local MapPanelNodeType = MapConst.MapPanelNodeType
local PANEL_ID = PanelId.Map
local PHASE_ID = PhaseId.Map
local STANDARD_SCREEN_WIDTH = CS.Beyond.UI.UIConst.STANDARD_HORIZONTAL_RESOLUTION
local STANDARD_SCREEN_HEIGHT = CS.Beyond.UI.UIConst.STANDARD_VERTICAL_RESOLUTION
MapCtrl = HL.Class('MapCtrl', uiCtrl.UICtrl)
local COLLECTIONS_CONFIG = {
["chest"] = {
viewName = "chest",
mergeId = "item_cate_chest",
hoverTextId = "ui_mappanel_collection_trchest",
},
["coin"] = {
viewName = "coin",
mergeId = "int_collection_coin",
hoverTextId = "ui_mappanel_collection_coin",
},
["piece"] = {
viewName = "piece",
mergeId = "int_collection_piece",
hoverTextId = "ui_mappanel_collection_puzzle",
},
["blackbox"] = {
viewName = "blackbox",
mergeId = "int_blackbox_entry",
hoverTextId = "ui_mappanel_collection_blackbox",
},
["equipFormula"] = {
viewName = "equipFormula",
mergeId = "int_trchest_equip",
hoverTextId = "ui_mappanel_collection_equip_formula",
},
}
local BUILDING_INFOS_CONFIG = {
["bandwidth"] = {
viewName = "bandwidth",
getter = function(sceneInfo)
return sceneInfo.bandwidth.current, sceneInfo.bandwidth.max
end,
hoverTextId = "ui_mappanel_collection_bandwidth",
},
["travelPole"] = {
viewName = "travelPole",
getter = function(sceneInfo)
return sceneInfo.bandwidth.travelPoleCurrent, sceneInfo.bandwidth.travelPoleMax
end,
hoverTextId = "ui_mappanel_collection_pole",
},
["battleBuilding"] = {
viewName = "battleBuilding",
getter = function(sceneInfo)
return sceneInfo.bandwidth.battleCurrent, sceneInfo.bandwidth.battleMax
end,
hoverTextId = "ui_mappanel_collection_battle",
}
}
local INITIAL_SELECT_OPTION_INDEX = 1
MapCtrl.s_initialSelectMarkInstId = HL.StaticField(HL.String) << ""
MapCtrl.m_initialLevelId = HL.Field(HL.String) << ""
MapCtrl.m_currLevelId = HL.Field(HL.String) << ""
MapCtrl.m_currMapId = HL.Field(HL.String) << ""
MapCtrl.m_ignoreOpenFocus = HL.Field(HL.Boolean) << false
MapCtrl.m_selectMarkRectTransform = HL.Field(Unity.RectTransform)
MapCtrl.m_isMarkDetailShowing = HL.Field(HL.Boolean) << false
MapCtrl.m_zoomTick = HL.Field(HL.Number) << -1
MapCtrl.m_zoomVisibleLayer = HL.Field(HL.Number) << -1
MapCtrl.m_controllerRect = HL.Field(Unity.RectTransform)
MapCtrl.m_controllerSizeTick = HL.Field(HL.Number) << -1
MapCtrl.m_selectOptionCells = HL.Field(HL.Forward('UIListCache'))
MapCtrl.m_selectNodeShowTimer = HL.Field(HL.Number) << -1
MapCtrl.m_optionCloseCDTimer = HL.Field(HL.Number) << -1
MapCtrl.m_optionCloseCD = HL.Field(HL.Boolean) << false
MapCtrl.m_selectNodeTick = HL.Field(HL.Number) << -1
MapCtrl.m_doingSelectNodeHide = HL.Field(HL.Boolean) << false
MapCtrl.m_waitShowInitDetail = HL.Field(HL.Boolean) << false
MapCtrl.m_selectOptionMarkIdList = HL.Field(HL.Table)
MapCtrl.m_selectOptionMarkList = HL.Field(HL.Table)
MapCtrl.m_currHighlightOption = HL.Field(HL.Number) << -1
MapCtrl.m_buildingInfo = HL.Field(HL.Table)
MapCtrl.m_collectionInfo = HL.Field(HL.Table)
MapCtrl.m_multiDeletePanelShow = HL.Field(HL.Boolean) << false
MapCtrl.m_selectMarkInstId = HL.Field(HL.String) << ""
MapCtrl.m_tierCheckTick = HL.Field(HL.Number) << -1
MapCtrl.m_currTierContainerId = HL.Field(HL.Number) << -1
MapCtrl.m_currTierIdList = HL.Field(HL.Table)
MapCtrl.m_currTierIndex = HL.Field(HL.Number) << -1
MapCtrl.m_tierSwitcherCells = HL.Field(HL.Forward('UIListCache'))
MapCtrl.m_tierSwitchersShowing = HL.Field(HL.Boolean) << false
MapCtrl.m_controllerHoverMark = HL.Field(HL.Boolean) << false
MapCtrl.m_controllerTierBindingGroup = HL.Field(HL.Number) << -1
MapCtrl.m_needPlayMistsAnimation = HL.Field(HL.Boolean) << false
MapCtrl.m_initZoomScalePercentage = HL.Field(HL.Number) << 1
MapCtrl.m_nodeOnInitFocused = HL.Field(HL.Boolean) << false
MapCtrl.m_trySwitchTierOnFocusMark = HL.Field(HL.Any)
MapCtrl.m_waitAutoSwitchTier = HL.Field(HL.Boolean) << false
MapCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_LEVEL_MAP_MARK_CLICKED] = '_OnLevelMapMarkClicked',
[MessageConst.ON_TRACKING_MAP_MARK] = '_OnTrackingMapMarkChanged',
[MessageConst.ON_TELEPORT_FINISH] = '_OnTeleportFinish',
[MessageConst.START_CAMERA_RENDER_IN_LOADING] = '_OnTeleportFinish',
[MessageConst.ON_MAP_FILTER_STATE_CHANGED] = '_RefreshFilterBtnState',
[MessageConst.ON_SYSTEM_UNLOCK_CHANGED] = '_OnSystemUnlock',
[MessageConst.FORCE_SET_OPENED_MAP_LEVEL] = '_ForceSetMapStateToTargetLevel',
[MessageConst.ON_MAP_MARK_RUNTIME_DATA_CHANGED] = '_OnDataChanged',
[MessageConst.ON_LEVEL_MAP_SWITCH_BTN_CLICKED] = '_OnLevelSwitchBtnClicked',
[MessageConst.ON_SCREEN_SIZE_CHANGED] = '_OnScreenSizeChanged',
[MessageConst.SHOW_CUSTOM_MARK_MULTI_DELETE] = '_OnShowMarkMultiDelete',
[MessageConst.HIDE_CUSTOM_MARK_MULTI_DELETE] = '_OnHideMarkMultiDelete',
[MessageConst.TOGGLE_CUSTOM_MARK_MULTI_DELETE_STATE] = '_OnToggleCustomMarkMultiDeleteState',
[MessageConst.ON_CUSTOM_MARK_MULTI_DELETE_SELECT_STATE_CHANGED] = '_OnCustomMarkMultiDeleteSelectStateChanged',
}
MapCtrl.OnCreate = HL.Override(HL.Any) << function(self, args)
args = args or {}
self.view.blockMask.gameObject:SetActive(false)
self.view.controllerFocusAnim.gameObject:SetActive(DeviceInfo.usingController)
self.m_controllerRect = self.view.levelMapController.view.rectTransform
self:_ParseCustomArgs(args.customArgs)
self:_RefreshMapRectMask()
if self.m_onMapPanelOpen ~= nil then
self.m_onMapPanelOpen()
end
self:_InitCloseButton()
self:_InitFilterButton()
self:_InitBuildingAndCollectionHoverButton()
local markInstId, levelId = args.instId, args.levelId
if not string.isEmpty(MapCtrl.s_initialSelectMarkInstId) then
markInstId = MapCtrl.s_initialSelectMarkInstId
MapCtrl.s_initialSelectMarkInstId = ""
end
local needShowDetail = not string.isEmpty(markInstId)
if needShowDetail then
levelId = GameInstance.player.mapManager:GetMarkInstRuntimeDataLevelId(markInstId)
end
self.m_waitShowInitDetail = needShowDetail
self.m_initialLevelId = not string.isEmpty(levelId) and levelId or GameWorld.worldInfo.curLevelId
if BEYOND_DEBUG_COMMAND then
if not DataManager.uiLevelMapConfig.levelConfigInfos:ContainsKey(self.m_initialLevelId) then
self:_InitDebugMode()
self:_InitTierSwitcherNode()
self:_RefreshTitle(levelId)
self:_HideNotExpectedNodes()
self.view.zoomNode.gameObject:SetActive(false)
return
end
end
self:_InitLevelMapController()
self:_CheckAndRefreshNeedPlayMistUnlockedAnimationState()
self:_InitBigRectHelper()
self:_InitZoomNode()
self:_InitRegionMapButton()
self:_InitCustomMark()
self:_InitSelectOptionList()
self:_InitWalletBar()
self:_RefreshLevelMapContent()
self:_TryPlayMapMaskAnimation()
self:_InitMapRemindTip()
self:_InitTierSwitcherNode()
self:_SetDetectorState(markInstId, true, DataManager.uiLevelMapConfig.detectorZoomSliderPercent)
if needShowDetail and not self.m_forceDoNotShowDetail then
self:_ShowMarkDetail(markInstId, true, false, true)
end
self:_InitPlayerIcon()
self.m_waitShowInitDetail = false
if args.needTransit == nil then
args.needTransit = false
end
self.view.transitBlack.gameObject:SetActive(args.needTransit)
self:_InitMapController()
if BEYOND_DEBUG_COMMAND then
self:_InitDebugTeleport()
end
self:_TryPlayMistUnlockedAnimation()
end
MapCtrl.OnClose = HL.Override() << function(self)
if self.m_onMapPanelClose then
self.m_onMapPanelClose()
end
self.m_selectNodeShowTimer = self:_ClearTimer(self.m_selectNodeShowTimer)
self.m_selectNodeTick = LuaUpdate:Remove(self.m_selectNodeTick)
self.m_zoomTick = LuaUpdate:Remove(self.m_zoomTick)
self.m_tierCheckTick = LuaUpdate:Remove(self.m_tierCheckTick)
self.m_controllerSizeTick = LuaUpdate:Remove(self.m_controllerSizeTick)
self:_StopCheckSwitchTierOnFocus()
self:_StopPlayerIconLimit()
self:_ResetFilterState()
MapMarkDetailCommon.s_forbidAllBtn = false
MapSpaceshipNode.ClearStaticFromData()
GameInstance.player.mapManager.forceShowFacMarkInRegionList:Clear()
MapCtrl.s_initialSelectMarkInstId = ""
end
MapCtrl.m_onMapPanelOpen = HL.Field(HL.Function)
MapCtrl.m_onMapPanelClose = HL.Field(HL.Function)
MapCtrl.m_expectedPanelNodes = HL.Field(HL.Table)
MapCtrl.m_expectedStaticElementTypes = HL.Field(HL.Table)
MapCtrl.m_expectedMarks = HL.Field(HL.Table)
MapCtrl.m_topOrderMarks = HL.Field(HL.Table)
MapCtrl.m_noGeneralTracking = HL.Field(HL.Boolean) << false
MapCtrl.m_noMissionTracking = HL.Field(HL.Boolean) << false
MapCtrl.m_noCustomMark = HL.Field(HL.Boolean) << false
MapCtrl.m_forceDoNotShowDetail = HL.Field(HL.Boolean) << false
MapCtrl._ParseCustomArgs = HL.Method(HL.Any) << function(self, customArgs)
if customArgs == nil then
local stateArgs = MapConst.GAMEPLAY_STATE_CUSTOM_GETTER()
customArgs = stateArgs and stateArgs or {}
end
if customArgs.onMapPanelOpen then
self.m_onMapPanelOpen = customArgs.onMapPanelOpen
end
if customArgs.onMapPanelClose then
self.m_onMapPanelClose = customArgs.onMapPanelClose
end
self.m_expectedPanelNodes = customArgs.expectedPanelNodes or {}
self.m_expectedStaticElementTypes = customArgs.expectedStaticElementTypes or {}
self.m_expectedMarks = customArgs.expectedMarks or {}
self.m_topOrderMarks = customArgs.topOrderMarks or {}
self.m_noGeneralTracking = customArgs.noGeneralTracking == true
self.m_noMissionTracking = customArgs.noMissionTracking == true
self.m_noCustomMark = customArgs.noCustomMark == true
self.m_forceDoNotShowDetail = customArgs.forceDoNotShowDetail == true
self.m_ignoreOpenFocus = customArgs.ignoreOpenFocus == true
if customArgs.forbidDetailBtn then
MapMarkDetailCommon.s_forbidAllBtn = true
end
end
MapCtrl._HideNotExpectedNodes = HL.Method(HL.Opt(HL.Table)) << function(self, overrideExpectedPanelNodes)
local typesToViewNodes = {
[MapPanelNodeType.Remind] = self.view.transactionReminderNode,
[MapPanelNodeType.Tracking] = self.view.mapTrackingInfo,
[MapPanelNodeType.Zoom] = self.view.zoomNode,
[MapPanelNodeType.DomainSwitch] = self.view.regionMapBtn,
[MapPanelNodeType.LevelInfo] = self.view.infoNode,
[MapPanelNodeType.Filter] = self.view.filterBtn,
[MapPanelNodeType.TierSwitch] = self.view.tierSwitcherNode,
[MapPanelNodeType.SpaceshipJump] = self.view.mapSpaceshipNode,
[MapPanelNodeType.WalletBar] = self.view.walletBarPlaceholder,
}
local expectedPanelNodes
if overrideExpectedPanelNodes ~= nil then
expectedPanelNodes = overrideExpectedPanelNodes
else
expectedPanelNodes = self.m_expectedPanelNodes
end
if next(expectedPanelNodes) == nil then
expectedPanelNodes = MapConst.LEVEL_EXPECTED_PANEL_NODES_GETTER[self.m_currLevelId]
end
local allVisible = false
if expectedPanelNodes == nil or not next(expectedPanelNodes) then
allVisible = true
end
for type, node in pairs(typesToViewNodes) do
node.gameObject:SetActive(allVisible or expectedPanelNodes[type] == true)
end
end
MapCtrl.OnSelectMark = HL.StaticMethod(HL.Any) << function(arg)
local markInstId = arg
if type(arg) == "table" then
markInstId = unpack(arg)
end
if string.isEmpty(markInstId) then
MapCtrl.s_initialSelectMarkInstId = ""
return
end
local isOpen, mapCtrl = UIManager:IsOpen(PANEL_ID)
if isOpen then
mapCtrl:ResetMapStateToTargetLevel({ instId = markInstId })
else
MapCtrl.s_initialSelectMarkInstId = markInstId
end
end
MapCtrl._OnTeleportFinish = HL.Method() << function(self)
MapSpaceshipNode.ClearStaticFromData()
Notify(MessageConst.RECOVER_PHASE_LEVEL)
end
MapCtrl._OnLevelSwitchBtnClicked = HL.Method(HL.Any) << function(self, args)
local targetLevelId = args
if type(args) == "table" then
targetLevelId = unpack(args)
end
local currConfigSuccess, currLevelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(self.m_currLevelId)
if not currConfigSuccess then
return
end
local targetConfigSuccess, targetLevelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(targetLevelId)
if not targetConfigSuccess then
return
end
GameInstance.player.mapManager:RemoveSelectCustomMark()
if currLevelConfig.isSingleLevel or targetLevelConfig.isSingleLevel then
self:ResetMapStateToTargetLevel({ levelId = targetLevelId })
else
self.view.levelMapController:SwitchToTargetLevel(targetLevelId)
end
end
MapCtrl._OnDataChanged = HL.Method(HL.Table) << function(self, args)
local instId, isAdd = unpack(args)
if not isAdd then
self:_HideSelectIcon(instId, true)
if self.m_isMarkDetailShowing and self.m_selectMarkInstId == instId then
Notify(MessageConst.HIDE_LEVEL_MAP_MARK_DETAIL, true)
end
end
local mapController = self.view.levelMapController
mapController:_ResetLoaderMarksVisibleStateByFilter()
mapController:RefreshLoaderMarksVisibleStateByLayer(mapController.m_currentLayer)
end
MapCtrl._OnScreenSizeChanged = HL.Method() << function(self)
self:_RefreshMapRectMask()
end
MapCtrl._RefreshTitle = HL.Method(HL.String) << function(self, levelId)
local levelBasicSuccess, levelBasicInfo = DataManager.levelBasicInfoTable:TryGetValue(levelId)
if not levelBasicSuccess then
return
end
local success, levelDesc = Tables.levelDescTable:TryGetValue(levelId)
if not success then
return
end
self.view.titleNode.levelTitleTxt.text = levelDesc.showName
self.view.titleNode.domainTitleTxt.gameObject:SetActive(false)
local configSuccess, levelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(levelId)
if not configSuccess then
return
end
local domainId = levelBasicInfo.domainName
local domainSuccess, domainData = Tables.domainDataTable:TryGetValue(domainId)
if domainSuccess and not levelConfig.isSingleLevel then
self.view.titleNode.domainTitleTxt.text = domainData.domainName
self.view.titleNode.domainTitleTxt.gameObject:SetActive(true)
end
end
MapCtrl._RefreshMapRectMask = HL.Method() << function(self)
local isStandardScreenRatio = Screen.width * STANDARD_SCREEN_HEIGHT == STANDARD_SCREEN_WIDTH * Screen.height
self.view.mapRectMask.enabled = not isStandardScreenRatio
end
MapCtrl._InitLevelMapController = HL.Method() << function(self)
self.view.levelMapController:InitLevelMapController(MapConst.LEVEL_MAP_CONTROLLER_MODE.LEVEL_SWITCH, {
onLevelSwitch = function(targetInfo)
self:_OnLevelSwitch(targetInfo)
end,
onLevelSwitchStart = function(targetInfo)
self:_OnLevelSwitchStart(targetInfo)
end,
onLevelSwitchFinish = function()
self:_OnLevelSwitchFinish()
end,
onTrackingMarkClicked = function(instId, trackingMark, relatedMark)
self:_OnTrackingMarkClicked(instId, trackingMark, relatedMark)
end,
onMarkHover = function(instId, isHover)
self:_OnControllerMarkHover(instId, isHover)
end,
gridsMaskFollowTarget = self.view.mapMask,
initialLevelId = self.m_initialLevelId,
visibleRect = self.view.markVisibleRect,
expectedMarks = self.m_expectedMarks,
expectedStaticElements = self.m_expectedStaticElementTypes,
topOrderMarks = self.m_topOrderMarks,
noGeneralTracking = self.m_noGeneralTracking,
noMissionTracking = self.m_noMissionTracking,
})
self.m_controllerSizeTick = LuaUpdate:Add("LateTick", function()
self.m_controllerRect.sizeDelta = self.view.levelMapController.view.levelMapLoader.view.viewRect.sizeDelta
end)
end
MapCtrl._OnLevelSwitch = HL.Method(HL.Table) << function(self, switchTargetInfo)
self:_SetMapRectByTargetLevelInfo(switchTargetInfo)
end
MapCtrl._OnLevelSwitchStart = HL.Method(HL.Table) << function(self, switchTargetInfo)
self.view.fullScreenMask.gameObject:SetActive(true)
self.view.bigRectHelper:ClearAllTween()
self.view.bigRectHelper.enabled = false
self.view.touchPanel.enabled = false
self.m_controllerRect:SetParent(self.view.mapMask)
self:_SetMapRectByTargetLevelInfo(switchTargetInfo)
self:_StopPlayerIconLimit()
self:_PlayAndSetMainNodeVisibleState(false)
if self.m_isMarkDetailShowing then
Notify(MessageConst.HIDE_LEVEL_MAP_MARK_DETAIL, true)
end
self:_ToggleControllerMoveAndZoom(false)
end
MapCtrl._OnLevelSwitchFinish = HL.Method() << function(self)
self.view.fullScreenMask.gameObject:SetActive(false)
self.view.touchPanel.enabled = true
self.m_controllerRect:SetParent(self.view.mapRect)
self:_RefreshLevelMapContent()
self:_ResetBigRectHelper()
self:_ResetZoomSliderValue(false)
self:_RefreshPlayerIconNeedLimit()
self:_PlayAndSetMainNodeVisibleState(true)
self:_ToggleControllerMoveAndZoom(true)
self:_CheckAndRefreshNeedPlayMistUnlockedAnimationState()
self:_TryPlayMistUnlockedAnimation()
end
MapCtrl._SetMapRectByTargetLevelInfo = HL.Method(HL.Table) << function(self, targetInfo)
self.view.mapRect.pivot = Vector2(0.5, 1.0)
local resetPos = self:_GetTargetRelativeCenterPosition(self.view.mapRect, {
scale = targetInfo.scale,
width = targetInfo.size.x,
height = targetInfo.size.y,
})
self.view.mapRect.sizeDelta = targetInfo.size
self.view.mapRect.localScale = Vector3.one * targetInfo.scale
self.view.mapRect.anchoredPosition = resetPos + targetInfo.initialOffset
end
MapCtrl._RefreshLevelMapContent = HL.Method() << function(self)
local currLevelId = self.view.levelMapController:GetControllerCurrentLevelId()
self:_RefreshTitle(currLevelId)
self:_RefreshBuildingInfos(currLevelId)
self:_RefreshCollectionsInfo(currLevelId)
self:_RefreshTrackingInfo(currLevelId)
self:_RefreshSpaceshipNode(currLevelId)
self:_RefreshSpaceshipLevelNode(currLevelId)
self.m_currLevelId = currLevelId
self:_InitMapRemindTip()
local success, levelConfig = DataManager.levelConfigTable:TryGetData(self.m_currLevelId)
if success then
self.m_currMapId = levelConfig.mapIdStr
end
UIManager:Close(PanelId.MapCustomMarkDetail)
CS.Beyond.Gameplay.Conditions.OnUILevelMapEnterLevel.Trigger(currLevelId)
self:_HideNotExpectedNodes()
end
MapCtrl._GetTargetRelativeCenterPosition = HL.Method(Unity.RectTransform, HL.Table).Return(Vector2) << function(self, rectTransform, targetInfo)
local parentRectTransform = rectTransform.parent:GetComponent("RectTransform")
if parentRectTransform == nil then
return
end
local anchorOffset = Vector2(
parentRectTransform.rect.width * (0.5 - rectTransform.anchorMin.x),
parentRectTransform.rect.height * (0.5 - rectTransform.anchorMin.y)
)
local pivotOffset = Vector2(
targetInfo.scale * targetInfo.width * (rectTransform.pivot.x - 0.5),
targetInfo.scale * targetInfo.height * (rectTransform.pivot.y - 0.5)
);
return anchorOffset + pivotOffset
end
MapCtrl._OnLevelMapMarkClicked = HL.Method(HL.String) << function(self, markInstId)
local nearbyDistance = DeviceInfo.usingController and
self.view.config.CONTROLLER_NEARBY_MARK_DISTANCE or
self.view.config.NEARBY_MARK_DISTANCE
local nearbyMarkList = self.view.levelMapController:GetControllerNearbyMarkList(
markInstId,
nearbyDistance,
self.view.zoomNode.zoomSlider.value,
self.m_multiDeletePanelShow and GEnums.MarkType.CustomMark
)
if #nearbyMarkList <= 1 then
self:_ShowMarkDetail(markInstId, true, true)
else
self:_RefreshSelectOptionList(markInstId, nearbyMarkList)
end
local isInCustomMarkDeleteMode = UIManager:IsOpen(PanelId.MapCustomMarkDelete)
if not isInCustomMarkDeleteMode then
self:_ToggleControllerMoveAndZoom(false)
end
end
MapCtrl._ShowSelectIcon = HL.Method(HL.String) << function(self, markInstId)
self.m_selectMarkRectTransform = self.view.levelMapController:GetControllerMarkRectTransform(markInstId)
self:_ToggleSelectIconSyncTick(true)
self.view.selectIconAnim:ClearTween(true)
UIUtils.PlayAnimationAndToggleActive(self.view.selectIconAnim, true)
end
MapCtrl._HideSelectIcon = HL.Method(HL.String, HL.Opt(HL.Boolean, HL.Boolean)) << function(self, markInstId, force, onlyHideNode)
if onlyHideNode then
UIUtils.PlayAnimationAndToggleActive(self.view.selectIconAnim, false)
return
end
if markInstId ~= self.m_selectMarkInstId then
return
end
local rectTransform = self.view.levelMapController:GetControllerMarkRectTransform(markInstId)
UIUtils.PlayAnimationAndToggleActive(self.view.selectIconAnim, false)
if self.m_multiDeletePanelShow and rectTransform and not force then
return
end
self:_ToggleSelectIconSyncTick(false)
end
MapCtrl._ToggleSelectIconSyncTick = HL.Method(HL.Boolean) << function(self, active)
if self.m_selectNodeTick > 0 then
self.m_selectNodeTick = LuaUpdate:Remove(self.m_selectNodeTick)
end
if active then
self.m_selectNodeTick = LuaUpdate:Add("LateTick", function(deltaTime)
self:_SyncSelectIconPosition()
end)
end
end
MapCtrl._SyncSelectIconPosition = HL.Method() << function(self)
if IsNull(self.m_selectMarkRectTransform) then
return
end
self.view.selectIconNode.position = self.m_selectMarkRectTransform.position
end
MapCtrl._ShowMarkDetail = HL.Method(HL.String, HL.Opt(HL.Boolean, HL.Boolean, HL.Boolean)) << function(self, markInstId, needFocus, needFocusTween, isInit)
if self.m_selectMarkInstId == markInstId and not self.m_multiDeletePanelShow then
return
end
local mark = self.view.levelMapController:GetControllerMarkByInstId(markInstId)
local markRectTransform = self.view.levelMapController:GetControllerMarkRectTransform(markInstId)
if not mark or not markRectTransform then
return
end
if not GameInstance.player.mapManager:IsTrackingRelatedMark(markInstId) then
mark:ToggleForceShowMark(true)
end
needFocusTween = needFocusTween == true
if self.m_multiDeletePanelShow then
local trackingMark
if markInstId == GameInstance.player.mapManager.trackingMarkInstId then
trackingMark = self.view.levelMapController.view.levelMapLoader:GetGeneralTrackingMark()
end
local args = {
mark = mark,
instId = markInstId,
trackMark = trackingMark
}
Notify(MessageConst.ON_CUSTOM_MARK_MULTI_DELETE_SELECT, args)
else
self.view.levelMapController:SetSingleMarkToTopOrder(markInstId)
self:_ToggleControllerMoveAndZoom(false)
Notify(MessageConst.SHOW_LEVEL_MAP_MARK_DETAIL, {
markInstId = markInstId,
onClosedCallback = function()
self.view.levelMapController:ResetSingleMarkToOriginalOrder(markInstId)
self:_HideSelectIcon(markInstId)
self:_SetDetectorState(markInstId, false)
self.m_selectMarkInstId = ""
self.m_isMarkDetailShowing = false
mark:ToggleForceShowMark(false)
self:_ToggleControllerMoveAndZoom(true)
end
})
self.m_isMarkDetailShowing = true
end
if self.m_selectNodeShowTimer > 0 then
self.m_selectNodeShowTimer = self:_ClearTimer(self.m_selectNodeShowTimer)
end
if not string.isEmpty(self.m_selectMarkInstId) then
self:_HideSelectIcon(self.m_selectMarkInstId, true, true)
end
if not self.m_multiDeletePanelShow then
if needFocus then
self.m_selectNodeShowTimer = self:_StartTimer(self.view.config.SELECT_ICON_SHOW_DELAY, function()
self:_ShowSelectIcon(markInstId)
self.m_selectNodeShowTimer = self:_ClearTimer(self.m_selectNodeShowTimer)
end)
if isInit then
self:_BigRectFocusNodeOnInit(markRectTransform, needFocusTween, function()
self.view.focusArrowNode.position = markRectTransform.position
self:_StopCheckSwitchTierOnFocus()
end)
else
self.view.bigRectHelper:FocusNode(markRectTransform, needFocusTween, function()
self.view.focusArrowNode.position = markRectTransform.position
self:_StopCheckSwitchTierOnFocus()
end)
end
if needFocusTween then
self:_StartCheckSwitchTierOnFocus(markInstId)
else
self:_TrySwitchTierOnFocus(mark)
end
else
self:_SyncSelectIconPosition()
self:_ShowSelectIcon(markInstId)
self:_TrySwitchTierOnFocus(mark)
end
else
self:_SyncSelectIconPosition()
end
self.m_selectMarkInstId = markInstId
end
MapCtrl._SetDetectorState = HL.Method(HL.Any, HL.Boolean, HL.Opt(HL.Number)) << function(self, instId, focus, percent)
if not instId then
return
end
local isDetector = false
local runtimeSuccess, markRuntimeData = GameInstance.player.mapManager:GetMarkInstRuntimeData(instId)
if not runtimeSuccess then
return
end
local templateSuccess, templateData = Tables.mapMarkTempTable:TryGetValue(markRuntimeData.templateId)
if not templateSuccess then
return
end
local markType = templateData.markType
if markType == GEnums.MarkType.TreasureChest or markType == GEnums.MarkType.Coin then
isDetector = true
end
local mark = self.view.levelMapController:GetControllerMarkByInstId(instId)
if not mark then
return
end
local loader = self.view.levelMapController.view.levelMapLoader
if isDetector then
loader.view.detectorNode.gameObject:SetActive(focus)
mark:RefreshDetectorNodeState(focus)
if focus then
loader.view.detectorNode.anchoredPosition = GameInstance.player.mapManager.characterRectPosition
self:_HideSelectIcon(instId)
if percent then
local zoomSlider = self.view.zoomNode.zoomSlider
local zoomValue = zoomSlider.maxValue - zoomSlider.minValue
zoomSlider.value = zoomSlider.minValue + zoomValue * percent
self:_RefreshZoomVisibleLayer(zoomValue, true)
end
local markRectTransform = self.view.levelMapController:GetControllerMarkRectTransform(instId)
self:_BigRectFocusNodeOnInit(markRectTransform, true, function()
self.view.focusArrowNode.position = markRectTransform.position
end)
end
return
end
loader.view.detectorNode.gameObject:SetActive(false)
mark:RefreshDetectorNodeState(false)
end
MapCtrl._OnShowMarkMultiDelete = HL.Method(HL.Table) << function(self, args)
self.m_multiDeletePanelShow = true
local loader = self.view.levelMapController.view.levelMapLoader
local trackingMarkId = GameInstance.player.mapManager.trackingMarkInstId
local showTracking = false
local runtimeSuccess, markRuntimeData = GameInstance.player.mapManager:GetMarkInstRuntimeData(trackingMarkId)
if runtimeSuccess then
local templateSuccess, templateData = Tables.mapMarkTempTable:TryGetValue(markRuntimeData.templateId)
if templateSuccess then
local markType = templateData.markType
if markType == GEnums.MarkType.CustomMark then
showTracking = true
end
loader:ToggleLoaderGeneralTrackingVisibleState(showTracking)
end
end
loader:ToggleLoaderMissionTrackingVisibleState(false)
loader:ToggleLoaderSwitchMaskVisibleState(false)
loader:ToggleLoaderSwitchMaskVisibleState(false)
loader:ToggleLoaderLineRootVisibleState(false)
self.view.closeBtn.gameObject:SetActive(false)
self:_HideNotExpectedNodes(MapConst.DELETE_MODE_MAP_EXPECTED_NODES)
end
MapCtrl._OnHideMarkMultiDelete = HL.Method() << function(self)
self.m_multiDeletePanelShow = false
local loader = self.view.levelMapController.view.levelMapLoader
loader:ToggleLoaderGeneralTrackingVisibleState(not self.m_noGeneralTracking)
loader:ToggleLoaderMissionTrackingVisibleState(not self.m_noMissionTracking)
loader:ToggleLoaderSwitchMaskVisibleState(true)
loader:ToggleLoaderLineRootVisibleState(true)
self.m_selectMarkInstId = ""
self.view.closeBtn.gameObject:SetActive(true)
self:_HideNotExpectedNodes()
end
MapCtrl._OnToggleCustomMarkMultiDeleteState = HL.Method(HL.Table) << function(self, args)
if DeviceInfo.usingController then
self:_OnControllerCustomMarkMultiDeleteStateChange(args.isShow)
end
end
MapCtrl._OnCustomMarkMultiDeleteSelectStateChanged = HL.Method(HL.Table) << function(self, args)
if DeviceInfo.usingController then
local bindingText = args.isSelect and Language.LUA_MAP_CUSTOM_MARK_MULTI_SELECT_CANCEL or Language.LUA_MAP_CUSTOM_MARK_MULTI_SELECT
InputManagerInst:SetBindingText(self.view.bigRectHelper.clickBindingId, bindingText)
end
end
MapCtrl._InitCustomMark = HL.Method() << function(self)
if self.m_noCustomMark then
return
end
self.view.touchPanel.onClick:AddListener(function(eventData)
if BEYOND_DEBUG_COMMAND then
if self.view.debugToggle.isOn then
return
end
end
if self.m_optionCloseCD or not eventData then
return
end
local curNum = GameInstance.player.mapManager:GetQuickSearchCustomMarkCountByLevel(self.m_currLevelId)
local maxNum = Tables.GlobalConst.maxSceneCustomMapMarkNumber
if curNum + 1 > maxNum then
Notify(MessageConst.SHOW_TOAST, Language.LUA_MAP_CUSTOM_MARK_MAX_NUM_TOAST)
return
end
if self.m_multiDeletePanelShow then
return
end
local rectPos = UIUtils.screenPointToUI(
eventData.position,
self.uiCamera,
self.view.levelMapController.view.levelMapLoader.view.rectTransform
)
local tempPos = Vector2.zero
local success, levelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(self.m_currLevelId)
if not success then
return
end
if levelConfig.needInverseXZ then
tempPos.x = -rectPos.y
tempPos.y = rectPos.x
else
tempPos = rectPos
end
local worldPos = self.view.levelMapController.view.levelMapLoader:GetWorldPositionByRectPosition(tempPos)
success, levelConfig = DataManager.levelConfigTable:TryGetData(self.m_currLevelId)
if not success then
return
end
if not string.isEmpty(self.m_selectMarkInstId) then
return
end
AudioAdapter.PostEvent("Au_UI_Button_MapIcon")
local mapId = levelConfig.mapIdStr
local markInstId = GameInstance.player.mapManager:AddSelectCustomMark(mapId, self.m_currLevelId, worldPos, self.m_currTierIdList[self.m_currTierIndex])
if not markInstId then
self:Notify(MessageConst.SHOW_TOAST, Language.LUA_CUSTOM_MARK_OUT_EDGE_TOAST)
return
end
self:_ShowMarkDetail(markInstId)
self:_ToggleControllerMoveAndZoom(false)
end)
end
MapCtrl._InitMapRemindTip = HL.Method() << function(self)
local remandInfo = MapUtils.getMapRemindTipInfo(self.m_currLevelId)
self.view.mapRemindBtnRedDot:InitRedDot("MapRemind", { levelId = self.m_currLevelId })
self.view.mapRemindBtn.onClick:RemoveAllListeners()
self.view.mapRemindBtn.onClick:AddListener(function()
self.view.mapRemindBtn.gameObject:SetActiveIfNecessary(false)
self.view.mapTrackingInfo.gameObject:SetActiveIfNecessary(false)
self.view.mapTransactionReminderPopUp.gameObject:SetActiveIfNecessary(true)
if DeviceInfo.usingController then
self:_ToggleControllerMoveAndZoom(false)
Notify(MessageConst.SHOW_AS_CONTROLLER_SMALL_MENU, {
panelId = PANEL_ID,
isGroup = true,
id = self.view.mapTransactionReminderPopUp.view.inputGroup.groupId,
hintPlaceholder = self.view.controllerHintPlaceholder,
rectTransform = self.view.mapTransactionReminderPopUp.view.rectTransform,
noHighlight = true,
})
end
self.view.mapTransactionReminderPopUp:InitMapRemind(self.m_currLevelId, remandInfo, function()
if DeviceInfo.usingController then
self:_ToggleControllerMoveAndZoom(true)
Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.mapTransactionReminderPopUp.view.inputGroup.groupId)
end
self.view.mapTransactionReminderPopUp.view.wrapper:PlayOutAnimation(function()
self.view.mapRemindBtn.gameObject:SetActiveIfNecessary(true)
self.view.mapTrackingInfo.gameObject:SetActiveIfNecessary(true)
self.view.mapTransactionReminderPopUp.gameObject:SetActiveIfNecessary(false)
end)
end)
end)
end
MapCtrl._InitSelectOptionList = HL.Method() << function(self)
self.m_selectOptionCells = UIUtils.genCellCache(self.view.selectOptionNode.selectOptionCell)
self.view.selectOptionNode.button.onClick:AddListener(function()
if self.m_optionCloseCDTimer > 0 then
self.m_optionCloseCDTimer = self:_ClearTimer(self.m_optionCloseCDTimer)
end
self.m_optionCloseCD = true
self.m_optionCloseCDTimer = self:_StartTimer(0.1, function()
self.m_optionCloseCD = false
end)
self:_RefreshSelectOptionListShownState(false)
self:_ToggleControllerMoveAndZoom(true)
end)
self.view.selectOptionNode.gameObject:SetActive(false)
end
MapCtrl._RefreshSelectOptionList = HL.Method(HL.String, HL.Table) << function(self, markInstId, nearbyMarkList)
local markRectTransform = self.view.levelMapController:GetControllerMarkRectTransform(markInstId)
if markRectTransform == nil then
return
end
self.m_selectOptionMarkIdList = nearbyMarkList
self.m_selectOptionMarkList = {}
self.m_selectOptionCells:Refresh(#nearbyMarkList, function(cell, index)
local nearbyInstId = nearbyMarkList[index]
local runtimeSuccess, markRuntimeData = GameInstance.player.mapManager:GetMarkInstRuntimeData(nearbyInstId)
if not runtimeSuccess then
return
end
local templateId = markRuntimeData.templateId
local templateSuccess, templateData = Tables.mapMarkTempTable:TryGetValue(templateId)
if not templateSuccess then
return
end
local icon = markRuntimeData.isActive and templateData.activeIcon or templateData.inActiveIcon
cell.icon:LoadSprite(UIConst.UI_SPRITE_MAP_MARK_ICON_SMALL, icon)
if markRuntimeData.missionInfo ~= nil and markRuntimeData.isMissionTracking then
cell.icon.color = GameInstance.player.mission:GetMissionColor(markRuntimeData.missionInfo.missionId)
else
cell.icon.color = Color.white
end
if templateData.markType == GEnums.MarkType.CustomMark then
cell.name.text = markRuntimeData.note
elseif templateData.markType == GEnums.MarkType.SnapshotActivity then
cell.name.text = MapUtils.getActivitySnapShotMarkTitle(markRuntimeData)
else
cell.name.text = templateData.name
end
cell.button.onClick:RemoveAllListeners()
cell.button.onClick:AddListener(function()
self:_OnSelectOptionClick(index)
end)
cell.button.onHoverChange:RemoveAllListeners()
cell.button.onHoverChange:AddListener(function(isHover)
if index == self.m_currHighlightOption then
return
end
if isHover then
local lastCell = self.m_selectOptionCells:GetItem(self.m_currHighlightOption)
self:_RefreshSelectOptionHighlightState(lastCell, self.m_currHighlightOption, false)
self:_RefreshSelectOptionHighlightState(cell, index, true)
self.m_currHighlightOption = index
end
end)
self.m_selectOptionMarkList[index] = self.view.levelMapController:GetControllerMarkByInstId(nearbyInstId)
if index == INITIAL_SELECT_OPTION_INDEX then
self:_RefreshSelectOptionHighlightState(cell, index, true)
self.m_currHighlightOption = index
self.view.selectOptionNode.selectOptionList:AutoScrollToRectTransform(cell.rectTransform)
else
self:_RefreshSelectOptionHighlightState(cell, index, false)
end
cell.gameObject.name = "SelectOption_" .. nearbyInstId
end)
self.view.bigSelectIcon.position = markRectTransform.position
self:_RefreshSelectOptionListShownState(true)
end
MapCtrl._OnSelectOptionClick = HL.Method(HL.Number) << function(self, index)
local instId = self.m_selectOptionMarkIdList[index]
self:_ShowMarkDetail(instId, true, true)
self:_RefreshSelectOptionListShownState(false)
end
MapCtrl._RefreshSelectOptionListShownState = HL.Method(HL.Boolean) << function(self, isShown)
self.view.bigSelectIcon.gameObject:SetActive(isShown)
self.view.selectOptionNode.gameObject:SetActive(isShown)
self:_PlayAndSetMainNodeVisibleState(not isShown)
if not isShown and self.m_selectOptionMarkList ~= nil then
for _, mark in pairs(self.m_selectOptionMarkList) do
mark:ToggleMarkHighlightState(false)
end
end
if DeviceInfo.usingController then
if isShown then
Notify(MessageConst.SHOW_AS_CONTROLLER_SMALL_MENU, {
panelId = PANEL_ID,
isGroup = true,
id = self.view.selectOptionNode.inputGroup.groupId,
hintPlaceholder = self.view.controllerHintPlaceholder,
rectTransform = self.view.selectOptionNode.selectOptionList.transform,
noHighlight = true,
})
else
Notify(MessageConst.CLOSE_CONTROLLER_SMALL_MENU, self.view.selectOptionNode.inputGroup.groupId)
end
end
end
MapCtrl._RefreshSelectOptionHighlightState = HL.Method(HL.Any, HL.Number, HL.Boolean) << function(self, cell, index, isHighlight)
local animName = isHighlight and "select_item_selected" or "select_item_normal"
cell.contentAnimation:PlayWithTween(animName)
local mark = self.m_selectOptionMarkList[index]
if mark ~= nil then
mark:ToggleMarkHighlightState(isHighlight)
self.view.bigSelectIcon.position = mark.rectTransform.position
end
if DeviceInfo.usingController then
cell.keyHint.gameObject:SetActive(isHighlight)
end
end
MapCtrl._InitBigRectHelper = HL.Method() << function(self)
self.view.bigRectHelper:SetZoomRangeMax(self.view.levelMapController:GetControllerCurrentMaxScale())
self.view.bigRectHelper:OverrideZoomRangeMin(self.view.levelMapController:GetControllerCurrentMinScale())
self.view.bigRectHelper:Init()
self.view.touchPanel.onZoom:AddListener(function(zoomVal)
self:_RefreshZoomValue()
end)
self.view.bigRectHelper.onControllerFocusEnterSelectable:AddListener(function()
self.m_controllerHoverMark = true
self.view.controllerFocusAnim:PlayWithTween("map_focus_hit")
self:_RefreshControllerClickBindingState()
self:_RefreshControllerClickHoverText()
end)
self.view.bigRectHelper.onControllerFocusExitSelectable:AddListener(function()
self.m_controllerHoverMark = false
self.view.controllerFocusAnim:PlayWithTween("map_focus_default")
self:_RefreshControllerClickBindingState()
self:_RefreshControllerClickHoverText()
end)
self.view.bigRectHelper.onControllerZoom:AddListener(function(zoomVal)
AudioAdapter.PostEvent("Au_UI_Slider_Common")
self:_RefreshZoomValue()
end)
end
MapCtrl._ResetBigRectHelper = HL.Method() << function(self)
self.view.bigRectHelper.enabled = true
self.view.bigRectHelper:SetZoomRangeMax(self.view.levelMapController:GetControllerCurrentMaxScale())
self.view.bigRectHelper:OverrideZoomRangeMin(self.view.levelMapController:GetControllerCurrentMinScale())
self.view.bigRectHelper:Init()
end
MapCtrl._BigRectFocusNodeOnInit = HL.Method(RectTransform, HL.Boolean, HL.Opt(HL.Function)) << function(self, focusNode, needTween, callback)
if self.m_ignoreOpenFocus then
return
end
if self.m_nodeOnInitFocused then
return
end
self.view.bigRectHelper:FocusNode(focusNode, needTween, function()
if callback ~= nil then
callback()
end
end)
self.m_nodeOnInitFocused = true
end
MapCtrl._InitZoomNode = HL.Method() << function(self)
local zoomNode = self.view.zoomNode
zoomNode.zoomSlider.onValueChanged:AddListener(function(value)
self:_OnZoomValueChanged(value)
end)
zoomNode.addButton.onPressStart:AddListener(function()
self:_StartTickChangZoomValue(true)
end)
zoomNode.reduceButton.onPressStart:AddListener(function()
self:_StartTickChangZoomValue(false)
end)
zoomNode.addButton.onPressEnd:AddListener(function()
self:_StopTickChangZoomValue()
end)
zoomNode.reduceButton.onPressEnd:AddListener(function()
self:_StopTickChangZoomValue()
end)
self:_ResetZoomSliderValue(false)
if not self.m_ignoreOpenFocus then
local initZoomScaleRatio = 0
if self.m_needPlayMistsAnimation then
initZoomScaleRatio = 0
elseif self.m_waitShowInitDetail then
initZoomScaleRatio = 1
else
if self.m_initialLevelId == GameWorld.worldInfo.curLevelId then
local playerNode = self.view.levelMapController.view.levelMapLoader.view.element.player
if playerNode.gameObject.activeSelf then
if GameWorld.mapRegionManager:GetCurrentCharInTierContainerId() > 0 and not GameInstance.player.guide.isInGuide then
initZoomScaleRatio = DataManager.uiLevelMapConfig.tierZoomSliderPercent
self.m_waitAutoSwitchTier = true
end
end
end
end
local zoomSlider = zoomNode.zoomSlider
zoomSlider.value = zoomSlider.minValue + initZoomScaleRatio * (zoomSlider.maxValue - zoomSlider.minValue)
end
end
MapCtrl._ResetZoomSliderValue = HL.Method(HL.Boolean) << function(self, useMaxValue)
local zoomSlider = self.view.zoomNode.zoomSlider
zoomSlider.minValue = self.view.levelMapController:GetControllerCurrentMinScale()
zoomSlider.maxValue = self.view.levelMapController:GetControllerCurrentMaxScale()
local initValue = useMaxValue and zoomSlider.maxValue or zoomSlider.minValue
if zoomSlider.value == initValue then
self:_OnZoomValueChanged(initValue)
else
zoomSlider.value = initValue
end
self:_RefreshZoomVisibleLayer(initValue, true)
end
MapCtrl._RefreshZoomValue = HL.Method() << function(self)
local current = self.view.bigRectHelper:GetCurrentZoomValue()
self.view.zoomNode.zoomSlider:SetValueWithoutNotify(current)
self:_RefreshZoomButtonInteractableState()
self:_RefreshZoomVisibleLayer(current)
end
MapCtrl._ChangeZoomValue = HL.Method(HL.Boolean, HL.Number) << function(self, isAdd, deltaPercent)
local zoomSlider = self.view.zoomNode.zoomSlider
local current = zoomSlider.value
local min, max = zoomSlider.minValue, zoomSlider.maxValue
local changeValue = (max - min) * deltaPercent / 100.0
local targetValue = isAdd and current + changeValue or current - changeValue
targetValue = lume.clamp(targetValue, min, max)
if targetValue == current then
return
end
zoomSlider.value = targetValue
end
MapCtrl._StartTickChangZoomValue = HL.Method(HL.Boolean) << function(self, isAdd)
if self.m_zoomTick > 0 then
self.m_zoomTick = LuaUpdate:Remove(self.m_zoomTick)
end
self.m_zoomTick = LuaUpdate:Add("Tick", function(deltaTime)
self:_ChangeZoomValue(isAdd, self.view.config.PRESS_DELTA)
end)
end
MapCtrl._StopTickChangZoomValue = HL.Method() << function(self)
if self.m_zoomTick > 0 then
self.m_zoomTick = LuaUpdate:Remove(self.m_zoomTick)
end
end
MapCtrl._OnZoomValueChanged = HL.Method(HL.Number) << function(self, value)
self.view.bigRectHelper:ResetPivotPositionToScreenCenter()
local isPlayAnimationIn = self:IsPlayingAnimationIn()
self.view.bigRectHelper:SyncZoomValue(value, not self.m_waitShowInitDetail and not isPlayAnimationIn)
self:_RefreshZoomButtonInteractableState()
self:_RefreshZoomVisibleLayer(value)
end
MapCtrl._RefreshZoomButtonInteractableState = HL.Method() << function(self)
local zoomNode = self.view.zoomNode
local zoomSlider = zoomNode.zoomSlider
local value = zoomSlider.value
local min, max = zoomSlider.minValue, zoomSlider.maxValue
if value <= min then
if zoomNode.reduceButton.interactable then
zoomNode.reduceButton.interactable = false
self:_StopTickChangZoomValue()
end
else
if not zoomNode.reduceButton.interactable then
zoomNode.reduceButton.interactable = true
end
end
if value >= max then
if zoomNode.addButton.interactable then
zoomNode.addButton.interactable = false
self:_StopTickChangZoomValue()
end
else
if not zoomNode.addButton.interactable then
zoomNode.addButton.interactable = true
end
end
end
MapCtrl._RefreshZoomVisibleLayer = HL.Method(HL.Number, HL.Opt(HL.Boolean)) << function(self, scaleValue, forceRefresh)
local layer = DataManager.uiLevelMapConfig:GetVisibleLayerByScale(scaleValue)
if layer == self.m_zoomVisibleLayer and not forceRefresh then
return
end
self.view.levelMapController:RefreshLoaderMarksVisibleStateByLayer(layer)
self.m_zoomVisibleLayer = layer
end
MapCtrl._InitBuildingAndCollectionHoverButton = HL.Method() << function(self)
for _, buildingInfo in pairs(BUILDING_INFOS_CONFIG) do
local viewNode = self.view.infoNode[buildingInfo.viewName]
if viewNode ~= nil then
viewNode.button.onHoverChange:AddListener(function(isHover)
if isHover then
Notify(MessageConst.SHOW_COMMON_HOVER_TIP, {
mainText = Language[buildingInfo.hoverTextId],
delay = self.view.config.BOTTOM_TIP_HOVER_DELAY,
})
else
Notify(MessageConst.HIDE_COMMON_HOVER_TIP)
end
end)
viewNode.button.onClick:AddListener(function()
self:_OnInfoPopupBtnClick()
end)
end
end
for _, collectionInfo in pairs(COLLECTIONS_CONFIG) do
local viewNode = self.view.infoNode[collectionInfo.viewName]
if viewNode ~= nil then
viewNode.button.onHoverChange:RemoveAllListeners()
viewNode.button.onHoverChange:AddListener(function(isHover)
if isHover then
Notify(MessageConst.SHOW_COMMON_HOVER_TIP, {
mainText = Language[collectionInfo.hoverTextId],
delay = self.view.config.BOTTOM_TIP_HOVER_DELAY,
})
else
Notify(MessageConst.HIDE_COMMON_HOVER_TIP)
end
end)
viewNode.button.onClick:RemoveAllListeners()
viewNode.button.onClick:AddListener(function()
self:_OnInfoPopupBtnClick()
end)
end
end
self.view.infoNode.infoPopupBtn.onClick:AddListener(function()
self:_OnInfoPopupBtnClick()
end)
end
MapCtrl._OnInfoPopupBtnClick = HL.Method() << function(self)
UIManager:Open(PanelId.MapInfoPopup, { self.m_buildingInfo, self.m_collectionInfo })
end
MapCtrl._RefreshBuildingInfos = HL.Method(HL.String) << function(self, levelId)
self.m_buildingInfo = {}
local sceneInfo = GameInstance.remoteFactoryManager.system.core:GetSceneInfoByName(levelId)
for buildingCfgId, buildingInfo in pairs(BUILDING_INFOS_CONFIG) do
local viewNode = self.view.infoNode[buildingInfo.viewName]
if viewNode ~= nil then
local curr, total = 0, 0
if sceneInfo ~= nil then
curr, total = buildingInfo.getter(sceneInfo)
end
local viewNodeData = {}
viewNodeData.total = total
viewNodeData.curr = curr
self.m_buildingInfo[buildingCfgId] = viewNodeData
MapUtils.updateMapInfoViewNode(viewNode, viewNodeData, true)
end
end
end
MapCtrl._RefreshCollectionsInfo = HL.Method(HL.String) << function(self, levelId)
self.m_collectionInfo = {}
local collectionManager = GameInstance.player.collectionManager
for collectionCfgId, collectionInfo in pairs(COLLECTIONS_CONFIG) do
local viewNode = self.view.infoNode[collectionInfo.viewName]
if viewNode ~= nil then
local total, curr = collectionManager:GetMergeItemCnt(collectionInfo.mergeId, levelId)
local viewNodeData = {}
viewNodeData.total = total
viewNodeData.curr = curr
self.m_collectionInfo[collectionCfgId] = viewNodeData
MapUtils.updateMapInfoViewNode(viewNode, viewNodeData, false)
end
end
end
MapCtrl._InitRegionMapButton = HL.Method() << function(self)
self.view.regionMapBtn.onClick:AddListener(function()
MapUtils.switchFromLevelMapToRegionMap(self.m_currLevelId)
end)
end
MapCtrl._RefreshTrackingInfo = HL.Method(HL.String) << function(self, levelId)
self.view.mapTrackingInfo:InitMapTrackingInfo({ levelId = levelId })
end
MapCtrl._OnTrackingMapMarkChanged = HL.Method(HL.Any) << function(self)
if not self.m_isMarkDetailShowing then
return
end
Notify(MessageConst.HIDE_LEVEL_MAP_MARK_DETAIL)
end
MapCtrl._OnTrackingMarkClicked = HL.Method(HL.String, HL.Any, HL.Any) << function(self, instId, trackingMark, relatedMark)
if trackingMark.view.levelMapLimitInRect.isLimitedInRect then
local levelId = GameInstance.player.mapManager:GetMarkInstRuntimeDataLevelId(instId)
if levelId == self.m_currLevelId and relatedMark ~= nil then
self.view.bigRectHelper:FocusNode(relatedMark.rectTransform, true, function()
self:_ShowMarkDetail(instId)
self:_StopCheckSwitchTierOnFocus()
end)
self:_StartCheckSwitchTierOnFocus(instId)
else
self:ResetMapStateToTargetLevel({ instId = instId, levelId = levelId })
end
else
self:_OnLevelMapMarkClicked(instId)
end
end
MapCtrl._InitPlayerIcon = HL.Method() << function(self)
local playerNode = self.view.levelMapController.view.levelMapLoader.view.element.player
if self.m_initialLevelId == GameWorld.worldInfo.curLevelId then
self:_StartPlayerIconLimit()
if playerNode.gameObject.activeSelf then
self:_BigRectFocusNodeOnInit(playerNode.rectTransform, false)
end
end
playerNode.playerBtn.onClick:AddListener(function()
if playerNode.levelMapLimitInRect.isLimitedInRect then
self.view.bigRectHelper:FocusNode(playerNode.rectTransform, true)
end
end)
end
MapCtrl._RefreshPlayerIconNeedLimit = HL.Method() << function(self)
if self.m_currLevelId == GameWorld.worldInfo.curLevelId then
self:_StartPlayerIconLimit()
else
self:_StopPlayerIconLimit()
end
end
MapCtrl._StartPlayerIconLimit = HL.Method() << function(self)
local playerNode = self.view.levelMapController.view.levelMapLoader.view.element.player
playerNode.levelMapLimitInRect:StartLimitMarkInRect()
end
MapCtrl._StopPlayerIconLimit = HL.Method() << function(self)
local playerNode = self.view.levelMapController.view.levelMapLoader.view.element.player
playerNode.levelMapLimitInRect:StopLimitMarkInRect()
end
MapCtrl._RefreshSpaceshipNode = HL.Method(HL.String) << function(self, levelId)
self.view.mapSpaceshipNode:InitMapSpaceshipNode({ levelId = levelId })
end
MapCtrl._RefreshSpaceshipLevelNode = HL.Method(HL.String) << function(self, levelId)
local inSpaceship = levelId == Tables.spaceshipConst.baseSceneName or GameInstance.player.spaceship.isViewingFriend
self.view.lvDotNode.gameObject:SetActive(inSpaceship)
if inSpaceship then
local _, roomInfo = GameInstance.player.spaceship:TryGetRoom(Tables.spaceshipConst.controlCenterRoomId)
local roomTypeData = Tables.spaceshipRoomTypeTable[roomInfo.roomType]
self.view.lvDotNode:InitLvDotNode(roomInfo.lv, roomInfo.maxLv, UIUtils.getColorByString(roomTypeData.color))
end
end
MapCtrl._InitCloseButton = HL.Method() << function(self)
self.view.closeBtn.onClick:AddListener(function()
self:_CloseMap()
end)
self:BindInputPlayerAction("map_close", function()
self:_CloseMap()
end)
end
MapCtrl._CloseMap = HL.Method() << function(self)
Notify(MessageConst.ON_CLICK_MAP_CLOSE_BTN)
end
MapCtrl._InitFilterButton = HL.Method() << function(self)
self.view.filterBtn.button.onClick:AddListener(function()
self:_ToggleControllerMoveAndZoom(false)
Notify(MessageConst.SHOW_LEVEL_MAP_FILTER, {
onCloseCallback = function()
self:_ToggleControllerMoveAndZoom(true)
end
})
end)
self:_RefreshFilterBtnState()
end
MapCtrl._RefreshFilterBtnState = HL.Method() << function(self)
local isFilterValid = GameInstance.player.mapManager:IsFilterValid()
self.view.filterBtn.existNode.gameObject:SetActive(isFilterValid)
self.view.filterBtn.normalNode.gameObject:SetActive(not isFilterValid)
end
MapCtrl._ResetFilterState = HL.Method() << function(self)
local useServerFilterState = GameInstance.player.mapManager.useServerFilterState
if not useServerFilterState then
GameInstance.player.mapManager:ResetFilterState()
end
end
MapCtrl._InitWalletBar = HL.Method() << function(self)
self.view.walletBarPlaceholder:InitWalletBarPlaceholder(UIConst.REGION_MAP_STAMINA_IDS)
self:_RefreshWalletNodeVisibleState()
end
MapCtrl._OnSystemUnlock = HL.Method(HL.Table) << function(self, args)
local systemIndex = unpack(args)
if systemIndex == GEnums.UnlockSystemType.Dungeon:GetHashCode() then
self:_RefreshWalletNodeVisibleState()
end
end
MapCtrl._RefreshWalletNodeVisibleState = HL.Method() << function(self)
self.view.walletBarPlaceholder.gameObject:SetActive(Utils.isSystemUnlocked(GEnums.UnlockSystemType.Dungeon))
end
MapCtrl._InitTierSwitcherNode = HL.Method() << function(self)
self.m_currTierIdList = {}
self.m_trySwitchTierOnFocusMark = nil
self.view.tierFocusNode.gameObject:SetActive(not DeviceInfo.usingController)
self:_RefreshTierFocusNode()
self.m_tierSwitcherCells = UIUtils.genCellCache(self.view.tierSwitcherNode.tierSwitcherCell)
self:_RefreshTierSwitcherNode(false, true)
self.m_tierCheckTick = LuaUpdate:Add("LateTick", function(deltaTime)
self:_CheckNeedShowTierSwitcherList()
if self.m_trySwitchTierOnFocusMark ~= nil then
if self:_TrySwitchTierOnFocus(self.m_trySwitchTierOnFocusMark) then
self:_StopCheckSwitchTierOnFocus()
end
end
end)
end
MapCtrl._CheckNeedShowTierSwitcherList = HL.Method() << function(self)
local screenPos
if DeviceInfo.usingController then
screenPos = Unity.RectTransformUtility.WorldToScreenPoint(self.uiCamera, self.view.focusArrowNode.position)
else
screenPos = Vector2(Screen.width / 2, Screen.height / 2)
end
local rectPos = UIUtils.screenPointToUI(
screenPos,
self.uiCamera,
self.view.levelMapController.view.levelMapLoader.view.rectTransform
)
local worldPos = self.view.levelMapController.view.levelMapLoader:GetWorldPositionByRectPosition(rectPos)
local isDirty = false
local success, regionId = GameWorld.mapRegionManager:CheckPosIsInTierContainerMap(self.m_currMapId, Vector2(worldPos.x, worldPos.z))
if success and GameWorld.mapRegionManager:GetRegionLevelId(regionId) ~= self.m_currLevelId then
success = false
end
if success and not GameWorld.mapRegionManager:CheckRegionHideInMist(regionId) then
if self.m_currTierContainerId ~= regionId then
self.m_currTierContainerId = regionId
isDirty = true
end
else
if self.m_currTierContainerId ~= MapConst.BASE_TIER_CONTAINER_ID then
self.m_currTierContainerId = MapConst.BASE_TIER_CONTAINER_ID
isDirty = true
end
end
if isDirty then
self:_RefreshTierInfo()
end
end
MapCtrl._RefreshTierInfo = HL.Method() << function(self)
if self.m_currTierContainerId == MapConst.BASE_TIER_CONTAINER_ID then
self.m_currTierIdList = {}
self:_RefreshTierSwitcherNode(false)
return
end
local currTierIdSortList = {}
local tierIdList = GameWorld.mapRegionManager:GetTierListInContainer(self.m_currTierContainerId)
if tierIdList ~= nil then
for index = 0, tierIdList.Count - 1 do
local tierId = tierIdList[index]
local tierIndex = GameWorld.mapRegionManager:GetTierIndex(tierId)
if tierIndex == 0 or not GameWorld.mapRegionManager:CheckRegionHideInMist(tierId) then
table.insert(currTierIdSortList, {
sortIndex = tierIndex,
tierId = tierId,
})
end
end
end
if #currTierIdSortList <= 1 then
self:_RefreshTierSwitcherNode(false)
return
end
table.sort(currTierIdSortList, Utils.genSortFunction({ "sortIndex" }, false))
local currTierIdList = {}
for index, tierSortData in ipairs(currTierIdSortList) do
currTierIdList[index] = tierSortData.tierId
end
self.m_currTierIdList = currTierIdList
local forceRefresh = self.m_trySwitchTierOnFocusMark ~= nil
self:_RefreshTierSwitcherNode(true, forceRefresh)
end
MapCtrl._RefreshTierSwitcherNode = HL.Method(HL.Boolean, HL.Opt(HL.Boolean)) << function(self, needShow, forceRefresh)
local isShownStateDirty = self.m_tierSwitchersShowing ~= needShow
local isPlayAnimationIn = self:IsPlayingAnimationIn()
self.m_tierSwitchersShowing = needShow
if forceRefresh or isPlayAnimationIn or not isShownStateDirty then
self:_OnRefreshTierSwitcherNode(needShow)
else
self.view.tierSwitcherNode.nodeAnim:ClearTween(false)
self.view.tierSwitcherNode.nodeAnim:PlayWithTween("map_tierswitcher_out", function()
self:_OnRefreshTierSwitcherNode(self.m_tierSwitchersShowing)
self.view.tierSwitcherNode.nodeAnim:PlayWithTween("map_tierswitcher_in")
end)
end
if isShownStateDirty then
local audioKey = needShow and "Au_UI_Toast_LayeredMap_Open" or "Au_UI_Toast_LayeredMap_Close"
AudioAdapter.PostEvent(audioKey)
end
self:_RefreshTierFocusNode()
end
MapCtrl._OnRefreshTierSwitcherNode = HL.Method(HL.Boolean) << function(self, needShow)
self:_RefreshTierSwitcherCells()
InputManagerInst:ToggleGroup(self.m_controllerTierBindingGroup, needShow)
self.view.tierSwitcherNode.topNode.gameObject:SetActive(needShow)
self.view.tierSwitcherNode.bottomNode.gameObject:SetActive(needShow)
end
MapCtrl._RefreshTierSwitcherCells = HL.Method() << function(self)
if self.m_tierSwitchersShowing then
local _, levelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(self.m_currLevelId)
self.m_currTierIndex = 0
local currTierId = GameWorld.mapRegionManager:GetCurrentCharInTierId()
local currContainerId = GameWorld.mapRegionManager:GetCurrentCharInTierContainerId()
local currTierInContainer = currContainerId == self.m_currTierContainerId
for _, tierId in pairs(self.m_currTierIdList) do
if tierId == currTierId then
currTierInContainer = true
break
end
end
self.view.levelMapController:SetLoaderTierStateWithNeedShowMarkTier(true)
local firstSelectIndex = 0
self.m_tierSwitcherCells:Refresh(#self.m_currTierIdList, function(cell, index)
local tierId = self.m_currTierIdList[index]
local tierIndex = GameWorld.mapRegionManager:GetTierIndex(tierId)
local isBase = tierIndex == MapConst.BASE_TIER_INDEX
cell.baseStateController:SetState(isBase and "Base" or "Tier")
local isSelected
local isCurrTier
if currTierId > 0 then
isCurrTier = currTierId == tierId
else
isCurrTier = isBase
end
if currTierId > 0 and self.m_waitAutoSwitchTier then
if self.m_waitAutoSwitchTier then
isSelected = isCurrTier
else
isSelected = isBase
end
else
isSelected = isBase
end
cell.selectAnim.gameObject:SetActive(isSelected)
cell.currentStateController:SetState((isCurrTier and currTierInContainer) and "Current" or "Other")
cell.activeStateController:SetState("Active")
cell.selectBtn.onClick:RemoveAllListeners()
cell.selectBtn.onClick:AddListener(function()
self:_OnSelectTier(index)
end)
cell.selectBtn.onHoverChange:RemoveAllListeners()
cell.selectBtn.onHoverChange:AddListener(function(isHover)
if index == self.m_currTierIndex then
return
end
cell.tierNameTxt.gameObject:SetActive(isHover)
end)
cell.selectBtn.interactable = not isSelected
local nameSuccess, nameTextId = levelConfig.tierNames:TryGetValue(tierId)
cell.tierNameTxt.gameObject:SetActive(false)
if isBase then
cell.tierNameTxt.text = Tables.levelDescTable[self.m_currLevelId].showName
else
if nameSuccess then
cell.tierNameTxt.text = Language[nameTextId]
end
end
if isSelected then
firstSelectIndex = index
end
end)
self:_OnSelectTier(firstSelectIndex)
self.m_waitAutoSwitchTier = false
else
self.view.levelMapController:SetLoaderTierStateWithNeedShowMarkTier(false)
self.m_tierSwitcherCells:Refresh(1, function(cell, index)
cell.baseStateController:SetState("Base")
cell.activeStateController:SetState("Inactive")
cell.currentStateController:SetState("Other")
cell.selectAnim.gameObject:SetActive(false)
cell.selectBtn.onHoverChange:RemoveAllListeners()
cell.selectBtn.interactable = false
cell.tierNameTxt.gameObject:SetActive(false)
end)
self.view.levelMapController:SetLoaderTierStateWithTierId(MapConst.BASE_TIER_ID)
end
end
MapCtrl._RefreshTierFocusNode = HL.Method() << function(self)
if DeviceInfo.usingController then
return
end
self.view.tierFocusNode.focusImg.color = self.m_tierSwitchersShowing and Color.white or self.view.config.TIER_FOCUS_NORMAL_COLOR
end
MapCtrl._SelectTierByTierId = HL.Method(HL.Number).Return(HL.Boolean) << function(self, targetTierId)
if not next(self.m_currTierIdList) then
return false
end
for index, tierId in ipairs(self.m_currTierIdList) do
if targetTierId == tierId then
self:_OnSelectTier(index)
return true
end
end
local targetTierIndex = GameWorld.mapRegionManager:GetTierIndex(targetTierId)
if targetTierIndex == MapConst.BASE_TIER_INDEX then
for index, tierId in ipairs(self.m_currTierIdList) do
local tierIndex = GameWorld.mapRegionManager:GetTierIndex(tierId)
if tierIndex == targetTierIndex then
self:_OnSelectTier(index)
return true
end
end
end
return false
end
MapCtrl._OnSelectTier = HL.Method(HL.Number) << function(self, index)
if self.m_currTierIndex > 0 then
local lastCell = self.m_tierSwitcherCells:GetItem(self.m_currTierIndex)
if lastCell ~= nil then
UIUtils.PlayAnimationAndToggleActive(lastCell.selectAnim, false)
lastCell.selectBtn.interactable = true
lastCell.tierNameTxt.gameObject:SetActive(false)
end
end
local currCell = self.m_tierSwitcherCells:GetItem(index)
if currCell ~= nil then
UIUtils.PlayAnimationAndToggleActive(currCell.selectAnim, true)
currCell.selectBtn.interactable = false
currCell.tierNameTxt.gameObject:SetActive(true)
end
self.m_currTierIndex = index
self:_SwitchToTargetTier(self.m_currTierIdList[index])
end
MapCtrl._SwitchToTargetTier = HL.Method(HL.Number) << function(self, tierId)
self.view.levelMapController:SetLoaderTierStateWithTierId(tierId)
end
MapCtrl._StartCheckSwitchTierOnFocus = HL.Method(HL.String) << function(self, markInstId)
self:_StopCheckSwitchTierOnFocus()
self.m_trySwitchTierOnFocusMark = self.view.levelMapController:GetControllerMarkByInstId(markInstId)
end
MapCtrl._StopCheckSwitchTierOnFocus = HL.Method() << function(self)
self.m_trySwitchTierOnFocusMark = nil
end
MapCtrl._TrySwitchTierOnFocus = HL.Method(HL.Any).Return(HL.Boolean) << function(self, mark)
if mark == nil then
return false
end
local _, targetTierId = mark:GetMarkTierState()
return self:_SelectTierByTierId(targetTierId)
end
MapCtrl._CheckAndRefreshNeedPlayMistUnlockedAnimationState = HL.Method() << function(self)
self:_RefreshNeedPlayMistUnlockedAnimationState(self.view.levelMapController:NeedPlayMistsUnlockedAnimation())
end
MapCtrl._RefreshNeedPlayMistUnlockedAnimationState = HL.Method(HL.Boolean) << function(self, needPlay)
self.m_needPlayMistsAnimation = needPlay
self.view.blockMask.gameObject:SetActive(needPlay)
InputManagerInst:ToggleGroup(self.view.mainInputGroup.groupId, not needPlay)
end
MapCtrl._TryPlayMistUnlockedAnimation = HL.Method() << function(self)
if not self.m_needPlayMistsAnimation then
return
end
self.view.levelMapController:TryPlayMistUnlockedAnimation(function()
self:_RefreshNeedPlayMistUnlockedAnimationState(false)
end)
AudioAdapter.PostEvent("Au_UI_Toast_MapMistDissipate")
end
MapCtrl._TryPlayMapMaskAnimation = HL.Method() << function(self)
if self.m_waitShowInitDetail then
return
end
self.view.mapMaskAnimWrapper:PlayWithTween("map_masklevelmapcontroller_in")
end
MapCtrl._PlayRightZoomNodeAnimation = HL.Method(HL.Boolean) << function(self, isIn)
local animName = isIn and "map_mainui_rightzoom_in" or "map_mainui_rightzoom_out"
self.view.rightAnim:PlayWithTween(animName)
end
MapCtrl._PlayRightSpaceshipNodeAnimation = HL.Method(HL.Boolean) << function(self, isIn)
local animName = isIn and "map_mainui_rightssnode_in" or "map_mainui_rightssnode_out"
self.view.rightAnim:PlayWithTween(animName)
end
MapCtrl._PlayTopNodeAnimation = HL.Method(HL.Boolean) << function(self, isIn)
local animName = isIn and "map_mainui_topnode_in" or "map_mainui_topnode_out"
self.view.topAnim:ClearTween()
self.view.topAnim:PlayWithTween(animName, function()
self.view.topAnim.gameObject:SetActive(isIn)
end)
end
MapCtrl._PlayLeftNodeAnimation = HL.Method(HL.Boolean) << function(self, isIn)
local animName = isIn and "map_trackinginfo_in" or "map_trackinginfo_out"
self.view.leftAnim:PlayWithTween(animName)
end
MapCtrl._PlayRightNodeAnimation = HL.Method(HL.Boolean) << function(self, isIn)
local animName = isIn and "map_mainui_rightssnode_in" or "map_mainui_rightssnode_out"
self.view.topAnim:PlayWithTween(animName)
end
MapCtrl._PlayMapResetAnimation = HL.Method(HL.Boolean, HL.Opt(HL.Function)) << function(self, isIn, callback)
local animName = isIn and "map_mask_switch_in" or "map_mask_switch_out"
self.view.mapMaskAnimWrapper:PlayWithTween(animName, callback)
end
MapCtrl._PlayTrackingNodeAnimation = HL.Method(HL.Boolean, HL.Opt(HL.Function)) << function(self, isIn, callback)
local animName = isIn and "map_trackinginfo_in" or "map_trackinginfo_out"
self.view.leftAnim:PlayWithTween(animName, callback)
end
MapCtrl._PlayFilterBtnAnimation = HL.Method(HL.Boolean, HL.Opt(HL.Function)) << function(self, isIn, callback)
local animName = isIn and "map_mainui_filterbtn_in" or "map_mainui_filterbtn_out"
self.view.leftAnim:PlayWithTween(animName, callback)
end
MapCtrl._PlayAndSetMainNodeVisibleState = HL.Method(HL.Boolean, HL.Opt(HL.Function)) << function(self, isIn, onComplete)
UIUtils.PlayAnimationAndToggleActive(self.view.topAnim, isIn, function()
if onComplete ~= nil then
onComplete()
end
end)
UIUtils.PlayAnimationAndToggleActive(self.view.bottomAnim, isIn)
UIUtils.PlayAnimationAndToggleActive(self.view.leftAnim, isIn)
UIUtils.PlayAnimationAndToggleActive(self.view.rightAnim, isIn)
if isIn then
self.view.walletBarPlaceholder.gameObject:SetActive(true)
else
self.view.walletBarPlaceholder.gameObject:SetActive(false)
end
end
MapCtrl._ForceSetMapStateToTargetLevel = HL.Method(HL.Table) << function(self, args)
if self.m_isMarkDetailShowing then
Notify(MessageConst.HIDE_LEVEL_MAP_MARK_DETAIL)
end
local levelId = unpack(args)
if self.m_currLevelId ~= levelId then
self.view.levelMapController:ResetSwitchModeToTargetLevelState(levelId)
self:_ResetBigRectHelper()
self:_RefreshLevelMapContent()
end
self:_ResetZoomSliderValue(false)
end
MapCtrl.ResetMapStateToTargetLevel = HL.Method(HL.Table) << function(self, args)
local instId, levelId = args.instId, args.levelId
local needShowDetail = not string.isEmpty(instId)
if needShowDetail then
levelId = GameInstance.player.mapManager:GetMarkInstRuntimeDataLevelId(instId)
end
self.m_waitShowInitDetail = needShowDetail
if self.m_isMarkDetailShowing then
Notify(MessageConst.HIDE_LEVEL_MAP_MARK_DETAIL)
end
self.view.bigRectHelper.enabled = false
self.view.touchPanel.enabled = false
self.view.fullScreenMask.gameObject:SetActive(true)
self:_PlayAndSetMainNodeVisibleState(false)
self:_ToggleControllerMoveAndZoom(false)
self:_PlayMapResetAnimation(false, function()
self.view.fullScreenMask.gameObject:SetActive(false)
self.view.levelMapController:ResetSwitchModeToTargetLevelState(levelId)
self:_ResetBigRectHelper()
self.view.touchPanel.enabled = true
self:_RefreshLevelMapContent()
self:_ResetZoomSliderValue(needShowDetail)
if needShowDetail then
self:_ShowMarkDetail(instId, true)
self.m_waitShowInitDetail = false
self:_StartCheckSwitchTierOnFocus(instId)
end
self:_PlayMapResetAnimation(true)
self:_PlayAndSetMainNodeVisibleState(true, function()
self:_StopCheckSwitchTierOnFocus()
end)
self:_ToggleControllerMoveAndZoom(not needShowDetail)
if args.onComplete then
args.onComplete()
end
local configSuccess, levelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(levelId)
if configSuccess then
local audioKey = levelConfig.isSingleLevel and "Au_UI_Menu_MapPanel_Open" or "Au_UI_Menu_MapPanel_Close"
AudioAdapter.PostEvent(audioKey)
end
end)
end
MapCtrl._InitMapController = HL.Method() << function(self)
local optionGroup = self.view.selectOptionNode.inputGroup
self:BindInputPlayerAction("map_select_option_before", function()
self:_OnControllerSelectOption(false)
end, optionGroup.groupId)
self:BindInputPlayerAction("map_select_option_next", function()
self:_OnControllerSelectOption(true)
end, optionGroup.groupId)
self:BindInputPlayerAction("map_select_option_click", function()
AudioAdapter.PostEvent("Au_UI_Button_Common")
self:_OnSelectOptionClick(self.m_currHighlightOption)
end, optionGroup.groupId)
local openInfoBinding = self:BindInputPlayerAction("map_open_collection_info", function()
self:_OnInfoPopupBtnClick()
end)
self.view.infoNode.keyHint:SetBindingId(openInfoBinding)
self:BindInputPlayerAction("map_reset_to_player", function()
self:_ControllerResetToPlayer()
end)
self.view.controllerFocusAnim:PlayWithTween("map_focus_default")
self.m_controllerTierBindingGroup = InputManagerInst:CreateGroup(self.view.mainInputGroup.groupId)
local tierPrevBindingId = self:BindInputPlayerAction("map_switch_tier_prev", function()
self:_OnControllerSelectTier(false)
end, self.m_controllerTierBindingGroup)
local tierNextBindingId = self:BindInputPlayerAction("map_switch_tier_next", function()
self:_OnControllerSelectTier(true)
end, self.m_controllerTierBindingGroup)
self.view.tierSwitcherNode.prevKeyHint:SetBindingId(tierPrevBindingId)
self.view.tierSwitcherNode.nextKeyHint:SetBindingId(tierNextBindingId)
self.view.mapTrackingInfo.view.listNaviGroup.onIsFocusedChange:AddListener(function(isFocused)
self:_ToggleControllerMoveAndZoom(not isFocused)
end)
self:_RefreshControllerClickHoverText()
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
end
MapCtrl._ControllerResetToPlayer = HL.Method() << function(self)
local playerNode = self.view.levelMapController.view.levelMapLoader.view.element.player
UIUtils.PlayAnimationAndToggleActive(self.view.controllerFocusAnim, false, function()
if playerNode.gameObject.activeSelf then
self.view.bigRectHelper:FocusNode(playerNode.rectTransform, true, function()
UIUtils.PlayAnimationAndToggleActive(self.view.controllerFocusAnim, true)
self.view.focusArrowNode.position = playerNode.rectTransform.position
end)
else
self:ResetMapStateToTargetLevel({
levelId = GameWorld.worldInfo.curLevelId,
onComplete = function()
UIUtils.PlayAnimationAndToggleActive(self.view.controllerFocusAnim, true)
self.view.bigRectHelper:FocusNode(playerNode.rectTransform, false)
self.view.focusArrowNode.position = playerNode.rectTransform.position
end
})
end
end)
end
MapCtrl._OnControllerSelectOption = HL.Method(HL.Boolean) << function(self, next)
local nextIndex = next and self.m_currHighlightOption + 1 or self.m_currHighlightOption - 1
nextIndex = lume.clamp(nextIndex, 1, self.m_selectOptionCells:GetCount())
if nextIndex == self.m_currHighlightOption then
return
end
local lastCell = self.m_selectOptionCells:GetItem(self.m_currHighlightOption)
local cell = self.m_selectOptionCells:GetItem(nextIndex)
self:_RefreshSelectOptionHighlightState(lastCell, self.m_currHighlightOption, false)
self:_RefreshSelectOptionHighlightState(cell, nextIndex, true)
self.m_currHighlightOption = nextIndex
self.view.selectOptionNode.selectOptionList:AutoScrollToRectTransform(cell.rectTransform)
AudioAdapter.PostEvent("Au_UI_Hover_ControllerSelect")
end
MapCtrl._ToggleControllerMoveAndZoom = HL.Method(HL.Boolean) << function(self, enabled)
if not DeviceInfo.usingController then
return
end
self.view.controllerFocusAnim.gameObject:SetActive(enabled)
self.view.bigRectHelper.controllerMoveEnabled = enabled
self.view.bigRectHelper.controllerZoomEnabled = enabled
self:_RefreshControllerClickBindingState()
end
MapCtrl._RefreshControllerClickBindingState = HL.Method() << function(self)
InputManagerInst:ToggleBinding(self.view.bigRectHelper.clickBindingId, self.view.bigRectHelper.controllerMoveEnabled)
end
MapCtrl._OnControllerSelectTier = HL.Method(HL.Boolean) << function(self, next)
local index = next and self.m_currTierIndex + 1 or self.m_currTierIndex - 1
index = lume.clamp(index, 1, #self.m_currTierIdList)
self:_OnSelectTier(index)
AudioAdapter.PostEvent("Au_UI_Toggle_MapLayerSelect")
end
MapCtrl._OnControllerCustomMarkMultiDeleteStateChange = HL.Method(HL.Boolean) << function(self, isShow)
self:_RefreshControllerClickBindingState()
local bindingText = isShow and Language.LUA_MAP_CUSTOM_MARK_MULTI_SELECT_CANCEL or Language.LUA_MAP_CUSTOM_MARK_ADD
InputManagerInst:SetBindingText(self.view.bigRectHelper.clickBindingId, bindingText)
local _, multiController = UIManager:IsOpen(PanelId.MapCustomMarkDelete)
if isShow then
InputManagerInst:ChangeParent(false, self.view.bigRectHelper.clickBindingId, multiController.view.inputGroup.groupId)
else
InputManagerInst:ChangeParent(false, self.view.bigRectHelper.clickBindingId, self.view.inputGroup.groupId)
end
end
MapCtrl._RefreshControllerClickHoverText = HL.Method() << function(self)
if self.m_multiDeletePanelShow then
return
end
local bindingText = (not self.m_controllerHoverMark and not self.m_noCustomMark) and Language.LUA_MAP_CUSTOM_MARK_ADD or ""
InputManagerInst:SetBindingText(self.view.bigRectHelper.clickBindingId, bindingText)
end
MapCtrl._OnControllerMarkHover = HL.Method(HL.String, HL.Boolean) << function(self, markInstId, isHover)
if self.m_multiDeletePanelShow then
local isOpen, multiController = UIManager:IsOpen(PanelId.MapCustomMarkDelete)
if isOpen then
local isSelected = multiController:IsCustomMarkSelectedToDelete(markInstId)
local bindingText = Language.LUA_MAP_CUSTOM_MARK_MULTI_SELECT
if isHover and isSelected then
bindingText = Language.LUA_MAP_CUSTOM_MARK_MULTI_SELECT_CANCEL
end
InputManagerInst:SetBindingText(self.view.bigRectHelper.clickBindingId, bindingText)
end
end
end
if BEYOND_DEBUG_COMMAND then
MapCtrl.m_isDebugMode = HL.Field(HL.Boolean) << false
MapCtrl._InitDebugMode = HL.Method() << function(self)
self.view.levelMapController:InitLevelMapController(MapConst.LEVEL_MAP_CONTROLLER_MODE.DEBUG)
self.view.infoNode.gameObject:SetActive(false)
self.view.filterBtn.gameObject:SetActive(false)
self.view.zoomNode.gameObject:SetActive(false)
self.view.bigRectHelper:SetZoomRangeMax(2)
self.view.bigRectHelper:OverrideZoomRangeMin(0.25)
self.view.bigRectHelper:SyncZoomValue(0.25, false)
self.view.bigRectHelper:Init()
self.view.bigRectHelper.enabled = false
local playerNode = self.view.levelMapController.view.levelMapLoader.view.player
self.view.bigRectHelper:FocusNode(playerNode.rectTransform, false)
self.m_currLevelId = self.m_initialLevelId
self:_InitDebugTeleport()
end
MapCtrl._InitDebugTeleport = HL.Method() << function(self)
self.view.touchPanel.onClick:AddListener(function(eventData)
if not self.view.debugToggle.isOn then
return
end
self:_DebugTeleport(eventData.position)
end)
self.view.touchPanel.onRightClick:AddListener(function(eventData)
if not InputManagerInst:GetKey(CS.Beyond.Input.KeyboardKeyCode.LeftAlt) then
return
end
self:_DebugTeleport(eventData.position)
end)
self.view.debugToggle.gameObject:SetActive(true)
end
MapCtrl._DebugTeleport = HL.Method(HL.Any) << function(self, position)
local rectPos = UIUtils.screenPointToUI(
position,
self.uiCamera,
self.view.levelMapController.view.levelMapLoader.view.rectTransform
)
local worldPos = self.view.levelMapController.view.levelMapLoader:GetWorldPositionByRectPosition(rectPos)
local extraHeight = 189
if self.m_currLevelId == MapConst.LEVEL_MAP_ID_GETTER.MAP01_LV007 then
extraHeight = 299
elseif self.m_currLevelId == MapConst.LEVEL_MAP_ID_GETTER.BASE01_LV001 then
extraHeight = 6
elseif self.m_currLevelId == MapConst.LEVEL_MAP_ID_GETTER.MAP02_LV001 then
extraHeight = 510
elseif self.m_currLevelId == MapConst.LEVEL_MAP_ID_GETTER.MAP02_LV002 then
extraHeight = 510
end
worldPos.y = worldPos.y + extraHeight
local configSuccess, levelConfig = DataManager.uiLevelMapConfig.levelConfigInfos:TryGetValue(self.m_currLevelId)
if configSuccess then
if levelConfig.needInverseXZ then
local temp = worldPos.x
worldPos.x = -worldPos.z
worldPos.z = temp
end
else
local characterPos = GameInstance.playerController.mainCharacter.rootCom.transform.position
worldPos.y = characterPos.y + 50
end
Utils.teleportToPosition(self.m_currLevelId, worldPos)
end
end
HL.Commit(MapCtrl)