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

122 lines
3.7 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.FacPowerPoleAutoConnectHint
FacPowerPoleAutoConnectHintCtrl = HL.Class('FacPowerPoleAutoConnectHintCtrl', uiCtrl.UICtrl)
FacPowerPoleAutoConnectHintCtrl.m_trackerPool = HL.Field(HL.Table)
FacPowerPoleAutoConnectHintCtrl.m_inBuildingMode = HL.Field(HL.Boolean) << false
FacPowerPoleAutoConnectHintCtrl.s_messages = HL.StaticField(HL.Table) << {
}
FacPowerPoleAutoConnectHintCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_trackerPool = {}
self.view.tracker.gameObject:SetActive(false)
end
FacPowerPoleAutoConnectHintCtrl.OnEnterBuildingMode = HL.StaticMethod(HL.Opt(HL.Any)) << function()
local ctrl = FacPowerPoleAutoConnectHintCtrl.AutoOpen(PANEL_ID, nil, false)
ctrl.m_inBuildingMode = true
end
FacPowerPoleAutoConnectHintCtrl.OnExitBuildingMode = HL.StaticMethod() << function()
local ctrl = FacPowerPoleAutoConnectHintCtrl.AutoOpen(PANEL_ID, nil, false)
ctrl.m_inBuildingMode = false
ctrl:ClearAllHints()
end
FacPowerPoleAutoConnectHintCtrl.OnBuild = HL.StaticMethod(HL.Table) << function(args)
local ctrl = FacPowerPoleAutoConnectHintCtrl.AutoOpen(PANEL_ID, nil, false)
ctrl:OnBuildModeUpdated(args.buildingTypeId, args.position)
end
FacPowerPoleAutoConnectHintCtrl.OnMove = HL.StaticMethod(HL.Table) << function(args)
local ctrl = FacPowerPoleAutoConnectHintCtrl.AutoOpen(PANEL_ID, nil, false)
ctrl:OnMoveModeUpdated(args.buildingTypeId, args.position, args.nodeId)
end
FacPowerPoleAutoConnectHintCtrl._UpdateTrackers = HL.Method() << function(self)
local buildingMode = GameInstance.remoteFactoryManager.interact.currentBuildingMode
if not buildingMode then
return
end
local infos = buildingMode.autoConnectCandidateList
if not infos then
return
end
for i = 0, infos.Count - 1 do
local info = infos[i]
local screenPos, isInside = UIUtils.objectPosToUI(info.Item3, self.uiCamera)
local uiPos, uiAngle, isOutBound = UIUtils.mapScreenPosToEllipseEdge(screenPos, self.view.config.ELLIPSE_X_RADIUS, self.view.config.ELLIPSE_Y_RADIUS)
local trackKey = i + 1
if not self.m_trackerPool[trackKey] then
self.m_trackerPool[trackKey] = self:_CreateNewTracker()
end
local item = self.m_trackerPool[trackKey]
item.obj:SetActive(true)
item.tracker:UpdatePosition(uiPos, uiAngle, isOutBound)
item.tracker:UpdateDistance(info.Item4)
item.tracker:UpdateNodeType(info.Item1.nodeType)
item.tracker:UpdateStatus(info.Item5)
end
for i = infos.Count + 1, #self.m_trackerPool do
self.m_trackerPool[i].obj:SetActive(false)
end
end
FacPowerPoleAutoConnectHintCtrl.OnBuildModeUpdated = HL.Method(HL.String, Vector3) << function(self, buildingTypeId, position)
if not self.m_inBuildingMode then
return
end
self:_UpdateTrackers()
end
FacPowerPoleAutoConnectHintCtrl.OnMoveModeUpdated = HL.Method(HL.String, Vector3, HL.Any) << function(self, buildingTypeId, position, nodeId)
if not self.m_inBuildingMode then
return
end
self:_UpdateTrackers()
end
FacPowerPoleAutoConnectHintCtrl.ClearAllHints = HL.Method() << function(self)
for i, v in ipairs(self.m_trackerPool) do
v.obj:SetActive(false)
end
end
FacPowerPoleAutoConnectHintCtrl._CreateNewTracker = HL.Method().Return(HL.Table) << function(self)
local obj = CSUtils.CreateObject(self.view.tracker.gameObject, self.view.main.transform)
obj:SetActive(true)
local item = {}
item.obj = obj
item.tracker = obj:GetComponent(typeof(CS.Beyond.UI.UIPowerPoleAutoConnectTracker))
return item
end
HL.Commit(FacPowerPoleAutoConnectHintCtrl)