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

332 lines
8.9 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.RegionMap3D
RegionMap3DCtrl = HL.Class('RegionMap3DCtrl', uiCtrl.UICtrl)
RegionMap3DCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.SWITCH_DOMAIN_MAP] = '_OnSwitchDomainMap',
[MessageConst.ON_CLICK_REGIONMAP_LOCK] = '_OnClickRegionMapLevelBtn',
}
RegionMap3DCtrl.m_domainId = HL.Field(HL.String) << ""
RegionMap3DCtrl.m_loadedRegionMapSetting = HL.Field(HL.Table)
RegionMap3DCtrl.m_levelDataList = HL.Field(HL.Table)
RegionMap3DCtrl.m_loadedRegionMapTransform = HL.Field(HL.Table)
RegionMap3DCtrl.m_initNaviThread = HL.Field(HL.Thread)
RegionMap3DCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
local args = arg
self.m_loadedRegionMapSetting = {}
self.m_loadedRegionMapTransform = {}
self.m_domainId = args.domainId
self:_RefreshAll()
self:_InitRegionMap3DController()
end
RegionMap3DCtrl.OnClose = HL.Override() << function(self)
if self.m_controllerNaviThread ~= nil then
self:_ClearCoroutine(self.m_controllerNaviThread)
end
if self.m_controllerNaviWaitTimer > 0 then
self:_ClearTimer(self.m_controllerNaviWaitTimer)
end
end
RegionMap3DCtrl._OnSwitchDomainMap = HL.Method(HL.Table) << function(self, args)
self.m_domainId = args.domainId
self:_RefreshAll()
end
RegionMap3DCtrl._OnClickRegionMapLevelBtn = HL.Method() << function(self)
if DeviceInfo.usingController and not string.isEmpty(self.m_controllerNaviLevelId) then
self.view.regionMap3DPanel:OnLevelHoverChanged(self.m_controllerNaviLevelId, false)
end
end
RegionMap3DCtrl._RefreshAll = HL.Method() << function(self)
local regionMapSetting = self:_GetDomainRegionMapSetting(self.m_domainId)
if not regionMapSetting then
return
end
for domainId, loadedRegionMapSetting in pairs(self.m_loadedRegionMapSetting) do
loadedRegionMapSetting.gameObject:SetActive(domainId == self.m_domainId)
end
local regionTransform = self.m_loadedRegionMapTransform[self.m_domainId]
regionMapSetting:SetLoadedRegionTransform(regionTransform)
self.m_levelDataList = {}
self.view.regionMap3DPanel:InitPanel(regionMapSetting)
regionMapSetting:InitData(CS.Beyond.UI.RegionMapShowType.Map)
for levelId, cfg in cs_pairs(regionMapSetting.cfg) do
if cfg.isLoaded then
local sceneBasicInfo = Utils.wrapLuaNode(cfg.ui)
if sceneBasicInfo then
local sceneBasicInfoArgs = {
levelId = levelId,
onClick = function(clickLevelId)
if DeviceInfo.usingController then
return
end
self.view.regionMap3DPanel:OnClickLevelBtn(clickLevelId, "")
end,
onHoverChanged = function(hoverLevelId, isHover)
if DeviceInfo.usingController then
return
end
self.view.regionMap3DPanel:OnLevelHoverChanged(hoverLevelId, isHover)
end,
}
sceneBasicInfo:InitSceneBasicInfo(sceneBasicInfoArgs)
self.m_levelDataList[levelId] = sceneBasicInfo
end
end
end
if DeviceInfo.usingController then
self:_DelayInitNaviTarget()
end
end
RegionMap3DCtrl._GetDomainRegionMapSetting = HL.Method(HL.String).Return(CS.Beyond.UI.RegionMapSetting) << function(self, domainId)
local regionMapSetting = self.m_loadedRegionMapSetting[domainId]
if regionMapSetting then
return regionMapSetting
end
local _, domainData = Tables.domainDataTable:TryGetValue(domainId)
if domainData == nil then
return nil
end
local domainPrefab = self:LoadGameObject(string.format(MapConst.UI_DOMAIN_MAP_PATH, domainData.domainMap))
local domainGo = CSUtils.CreateObject(domainPrefab, self.view.domainRoot[string.lower(domainData.domainMap)])
local _, regionMapSetting = domainGo:TryGetComponent(typeof(CS.Beyond.UI.RegionMapSetting))
self.m_loadedRegionMapSetting[domainId] = regionMapSetting
local domainTransform = domainGo:GetComponent("Transform")
self.m_loadedRegionMapTransform[domainId] = domainTransform
return regionMapSetting
end
RegionMap3DCtrl.m_controllerNaviThread = HL.Field(HL.Thread)
RegionMap3DCtrl.m_controllerNaviWaitTimer = HL.Field(HL.Number) << -1
RegionMap3DCtrl.m_controllerNaviLevelId = HL.Field(HL.String) << ""
RegionMap3DCtrl.m_controllerNaviRect = HL.Field(RectTransform)
RegionMap3DCtrl._InitRegionMap3DController = HL.Method() << function(self)
if not DeviceInfo.usingController then
return
end
local _, regionMapCtrl = UIManager:IsOpen(PanelId.RegionMap)
self:BindInputPlayerAction("map_region_confirm", function()
self:_OnConfirmNaviTargetLevel()
end, regionMapCtrl.view.inputGroup.groupId)
self.m_controllerNaviThread = self:_StartCoroutine(function()
while true do
self:_TickNavigateLevelRect()
coroutine.step()
end
end)
end
RegionMap3DCtrl._OnConfirmNaviTargetLevel = HL.Method() << function(self)
if string.isEmpty(self.m_controllerNaviLevelId) then
return
end
self.view.regionMap3DPanel:OnClickLevelBtn(self.m_controllerNaviLevelId, "")
AudioAdapter.PostEvent("Au_UI_Button_SceenBasicInfo")
end
RegionMap3DCtrl._DelayInitNaviTarget = HL.Method() << function(self)
if self.m_initNaviThread ~= nil then
self.m_initNaviThread = self:_ClearCoroutine(self.m_initNaviThread)
end
self.m_initNaviThread = self:_StartCoroutine(function()
coroutine.step()
self:_InitNaviTarget()
self.m_initNaviThread = self:_ClearCoroutine(self.m_initNaviThread)
end)
end
RegionMap3DCtrl._InitNaviTarget = HL.Method() << function(self)
local success, initialLevelId = DataManager.uiLevelMapConfig.controllerInitialSelectLevel:TryGetValue(self.m_domainId)
local currDomainId = Utils.getCurDomainId()
if currDomainId == self.m_domainId then
initialLevelId = GameWorld.worldInfo.curLevelId
end
local firstLevelId, findInitialLevel
for levelId, _ in pairs(self.m_levelDataList) do
if GameInstance.player.mapManager:IsLevelUnlocked(levelId) then
if string.isEmpty(firstLevelId) then
firstLevelId = levelId
end
if success and levelId == initialLevelId then
findInitialLevel = true
break
end
end
end
if not findInitialLevel then
initialLevelId = firstLevelId
end
self:_SetNaviTarget(initialLevelId, true)
end
RegionMap3DCtrl._TickNavigateLevelRect = HL.Method() << function(self)
local hitLevelId, hitDistance
local stickValue = InputManagerInst:GetGamepadStickValue(true)
if stickValue == Vector2.zero then
return
end
if self.m_controllerNaviWaitTimer > 0 then
return
end
if string.isEmpty(self.m_controllerNaviLevelId) then
return
end
local currPosition = self.m_controllerNaviRect.anchoredPosition
for levelId, basicInfo in pairs(self.m_levelDataList) do
if levelId ~= self.m_controllerNaviLevelId then
local rectTransform = basicInfo.rectTransform
if CS.Beyond.Gameplay.UILevelMapUtils.IsRayHitRect(currPosition, stickValue, rectTransform) then
if string.isEmpty(hitLevelId) then
hitLevelId = levelId
hitDistance = Vector2.Dot(stickValue.normalized, rectTransform.anchoredPosition - currPosition)
else
local distance = Vector2.Dot(stickValue.normalized, rectTransform.anchoredPosition - currPosition)
if distance < hitDistance then
hitLevelId = levelId
hitDistance = distance
end
end
end
end
end
if not string.isEmpty(hitLevelId) then
self:_SetNaviTarget(hitLevelId)
AudioAdapter.PostEvent("Au_UI_Toggle_MapRegionSelect")
end
end
RegionMap3DCtrl._SetNaviTarget = HL.Method(HL.String, HL.Opt(HL.Boolean)) << function(self, levelId, noWait)
if not string.isEmpty(self.m_controllerNaviLevelId) then
self.view.regionMap3DPanel:OnLevelHoverChanged(self.m_controllerNaviLevelId, false)
end
self.m_controllerNaviLevelId = levelId
local basicInfo = self.m_levelDataList[levelId]
self.m_controllerNaviRect = basicInfo.rectTransform
self.view.regionMap3DPanel:OnLevelHoverChanged(levelId, true)
if not noWait then
self.m_controllerNaviWaitTimer = self:_StartTimer(MapConst.MAP_3D_NAVI_THREAD_WAIT_TIME, function()
self.m_controllerNaviWaitTimer = self:_ClearTimer(self.m_controllerNaviWaitTimer)
end)
end
end
HL.Commit(RegionMap3DCtrl)