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

471 lines
11 KiB
Lua

local WaterDroneAimType = CS.Beyond.Gameplay.WaterDroneAimType
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.WaterDroneAim
WaterDroneAimCtrl = HL.Class('WaterDroneAimCtrl', uiCtrl.UICtrl)
WaterDroneAimCtrl.m_curActiveAim = HL.Field(GameObject)
WaterDroneAimCtrl.m_waterDroneBar = HL.Field(HL.Table)
WaterDroneAimCtrl.m_controllerTriggerSettingHandlerId = HL.Field(HL.Number) << -1
WaterDroneAimCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.SYNC_WATER_DRONE_AIM] = '_SyncWaterDroneAim',
[MessageConst.HIDE_WATER_DRONE_AIM] = '_OnHideWaterDroneAim',
[MessageConst.SYNC_LIQUID_STATE] = '_SyncLiquidState',
[MessageConst.SYNC_REMAINING_LIQUID_CAPACITY] = '_SyncRemainingLiquidCapacity',
[MessageConst.SYNC_SPRAYING] = '_SyncSpraying',
[MessageConst.WATER_DRONE_AIM_HAS_LIQUID_STATE] = '_SyncHasLiquidState',
[MessageConst.WATER_DRONE_LIQUID_STATE_EMPTY] = '_SetLiquidStateEmpty',
[MessageConst.ON_CONFIRM_CHANGE_INPUT_DEVICE_TYPE] = '_OnChangeInputDeviceType',
[MessageConst.SYNC_WATER_DRONE_SHOOT_BUT_BANNED_HINT_LIQUID] = '_SyncWaterDroneShootButBannedHintLiquid',
}
WaterDroneAimCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.view.closeBtn.onClick:AddListener(function()
self:_OnCancel()
end)
self.view.switchLiquidBtn.onClick:AddListener(function()
self:_OnSwitchLiquidOpenBagBtn()
end)
if DeviceInfo.usingController then
self:BindInputPlayerAction("battle_attack_start", function()
end)
self:BindInputPlayerAction("battle_attack_end", function()
end)
end
self:BindNormalAttackInputEvent()
if not DeviceInfo.isPCorConsole then
self.view.sprayBtn.onPressStart:AddListener(function()
self:StartPressAttackBtn()
end)
self.view.sprayBtn.onPressEnd:AddListener(function()
self:ReleaseNormalAttackBtn()
end)
end
self.m_waterDroneBar = Utils.wrapLuaNode(CSUtils.CreateObject(self.view.config.WATER_DRONE_BAR, UIManager.worldObjectRoot))
self:_InitWaterDroneJoystickBinding()
end
WaterDroneAimCtrl.CanSwitchLiquid = HL.Method().Return(HL.Boolean) << function(self)
return not GameInstance.player.forbidSystem:IsForbidden(ForbidType.ForbidWaterDroneSwitchLiquidBtn)
end
WaterDroneAimCtrl.BindNormalAttackInputEvent = HL.Method() << function(self)
self:BindInputPlayerAction("water_drone_attack_start", function()
if UNITY_EDITOR and DeviceInfo.usingTouch then
return
end
if not InputManager.cursorVisible then
self:StartPressAttackBtn()
end
end)
self:BindInputPlayerAction("water_drone_attack_end", function()
if UNITY_EDITOR and DeviceInfo.usingTouch then
return
end
self:ReleaseNormalAttackBtn()
end)
end
WaterDroneAimCtrl.OnClose = HL.Override() << function(self)
if self.m_waterDroneBar then
GameObject.Destroy(self.m_waterDroneBar.gameObject)
end
self.m_waterDroneBar = nil
Notify(MessageConst.GENERAL_ABILITY_CHANGE_KEY_BINDING, {false, "WaterDrone"})
if DeviceInfo.usingController then
GameInstance.player.forbidSystem:SetForbid(ForbidType.ForbidMainHudTopBtns, "WaterDrone", false)
end
self:_ClearControllerTriggerSetting()
end
WaterDroneAimCtrl.OnShow = HL.Override() << function(self)
local customAbilityCom = GameUtil.mainCharacter.customAbilityCom
self:_SyncRemainingLiquidCapacity({customAbilityCom.isInfinityLiquid, tostring(customAbilityCom.showCapacityCount)})
if self:CanSwitchLiquid() then
self.view.switchLiquidBtn.gameObject:SetActive(true)
else
self.view.switchLiquidBtn.gameObject:SetActive(false)
end
if self.m_waterDroneBar then
self.m_waterDroneBar.gameObject:SetActive(true)
end
self:_ToggleShowHideBattleAction(false)
Notify(MessageConst.GENERAL_ABILITY_CHANGE_KEY_BINDING, {true, "WaterDrone"})
self:_ClearControllerTriggerSetting()
if DeviceInfo.usingController then
GameInstance.player.forbidSystem:SetForbid(ForbidType.ForbidMainHudTopBtns, "WaterDrone", true)
if self.m_hasLiquid then
self:_AddControllerTriggerSetting()
end
end
end
WaterDroneAimCtrl.OnHide = HL.Override() << function(self)
if self.m_waterDroneBar then
self.m_waterDroneBar.gameObject:GetComponent("UIAnimationWrapper"):PlayOutAnimation(function()
self.m_waterDroneBar.gameObject:SetActive(false)
end);
end
self:_ToggleShowHideBattleAction(true)
self:_ClearControllerTriggerSetting()
end
WaterDroneAimCtrl._ClearControllerTriggerSetting = HL.Method() << function(self)
if self.m_controllerTriggerSettingHandlerId > 0 then
GameInstance.audioManager.gamePad.scePad:EndTriggerEffect(self.m_controllerTriggerSettingHandlerId)
self.m_controllerTriggerSettingHandlerId = -1
end
end
WaterDroneAimCtrl._ToggleShowHideBattleAction = HL.Method(HL.Boolean) << function(self, active)
if active then
UIManager:ShowWithKey(PanelId.BattleAction, "WaterDroneAim")
else
UIManager:HideWithKey(PanelId.BattleAction, "WaterDroneAim")
end
end
WaterDroneAimCtrl.StartPressAttackBtn = HL.Method() << function(self)
self:_ExecuteCustomAbility()
end
WaterDroneAimCtrl.ReleaseNormalAttackBtn = HL.Method() << function(self)
GameInstance.playerController.mainCharacter.customAbilityCom:StopAbility();
end
WaterDroneAimCtrl._ExecuteCustomAbility = HL.Method() << function(self)
GameInstance.playerController.mainCharacter.customAbilityCom:UseAbility()
end
WaterDroneAimCtrl.OnShowWaterDroneAim = HL.StaticMethod() << function()
local waterDroneAimPanel = UIManager:AutoOpen(PANEL_ID)
end
WaterDroneAimCtrl._OnHideWaterDroneAim = HL.Method() << function(self)
self:Hide()
Notify(MessageConst.GENERAL_ABILITY_CHANGE_KEY_BINDING, {false, "WaterDrone"})
if DeviceInfo.usingController then
GameInstance.player.forbidSystem:SetForbid(ForbidType.ForbidMainHudTopBtns, "WaterDrone", false)
end
end
WaterDroneAimCtrl._SyncWaterDroneAim = HL.Method(HL.Any) << function(self, args)
local aimType = unpack(args)
local aimObject
if aimType == WaterDroneAimType.AimAndGood then
aimObject = self.view.aimAndGood.gameObject
elseif aimType == WaterDroneAimType.AimButBanned then
aimObject = self.view.aimButBanned.gameObject
elseif aimType == WaterDroneAimType.AimButNoUse then
aimObject = self.view.aimButNoUse.gameObject
elseif aimType == WaterDroneAimType.NoLiquid then
aimObject = self.view.noLiquid.gameObject
elseif aimType == WaterDroneAimType.OutOfRange then
aimObject = self.view.outOfRange.gameObject
elseif aimType == WaterDroneAimType.ShootAndGood then
aimObject = self.view.shootAndGood.gameObject
elseif aimType == WaterDroneAimType.ShootButBanned then
aimObject = self.view.shootButBanned.gameObject
elseif aimType == WaterDroneAimType.ShootButNoUse then
aimObject = self.view.shootButNoUse.gameObject
elseif aimType == WaterDroneAimType.CannotShoot then
aimObject = self.view.cannotShoot.gameObject
end
if aimObject == self.m_curActiveAim then
return
end
if self.m_curActiveAim then
self.m_curActiveAim:SetActive(false)
end
self.m_curActiveAim = aimObject
if self.m_curActiveAim then
self.m_curActiveAim:SetActive(true)
end
end
WaterDroneAimCtrl._SyncLiquidState = HL.Method(HL.Table) << function(self, args)
local isAvailable, stateName = unpack(args)
if isAvailable then
self.view.liquidAvailableState:SetState(stateName)
local found, liquidItemData = Tables.itemTable:TryGetValue(stateName)
if found then
local liquidItemName = liquidItemData.name
self.view.liquidTypeText.text = liquidItemName
end
else
end
end
WaterDroneAimCtrl._SyncRemainingLiquidCapacity = HL.Method(HL.Table) << function(self, args)
local isInfinity, count = unpack(args)
if isInfinity then
self.view.supplyTxt.text = Language.LUA_ITEM_INFINITE_COUNT
self.view.supplyTxt.color = Color.white
else
self.view.supplyTxt.text = count
if count == "0" then
self.view.supplyTxt.color = self.view.config.ZERO_COLOR
else
self.view.supplyTxt.color = Color.white
end
end
end
WaterDroneAimCtrl._SyncSpraying = HL.Method(HL.Table) << function(self, args)
local isSpraying = unpack(args)
self.view.sprayingText.gameObject:SetActive(isSpraying)
end
WaterDroneAimCtrl.m_hasLiquid = HL.Field(HL.Boolean) << false
WaterDroneAimCtrl._SyncHasLiquidState = HL.Method(HL.Table) << function(self, args)
local hasLiquid = unpack(args)
self.m_hasLiquid = hasLiquid
self:_ClearControllerTriggerSetting()
if hasLiquid then
self.view.liquidState:SetState("AvailableNode")
self:_AddControllerTriggerSetting()
else
end
end
WaterDroneAimCtrl._AddControllerTriggerSetting = HL.Method() << function(self)
if DeviceInfo.usingController and self.m_controllerTriggerSettingHandlerId == -1 then
self.m_controllerTriggerSettingHandlerId = GameInstance.audioManager.gamePad.scePad:SetTriggerEffect(self.view.psTriggerEffectCfg.commands[0])
end
end
WaterDroneAimCtrl._SetLiquidStateEmpty = HL.Method() << function(self)
self.view.liquidState:SetState("EmptyNode")
end
WaterDroneAimCtrl._SyncWaterDroneShootButBannedHintLiquid = HL.Method(HL.Table) << function(self, args)
local liquidId = unpack(args)
self.view.shootButBannedStateController:SetState(liquidId)
end
WaterDroneAimCtrl._OnChangeInputDeviceType = HL.Method(HL.Any) << function(self, args)
local customAbilityCom = GameUtil.mainCharacter.customAbilityCom
customAbilityCom:TryEndAbility_ByChangeInputDeviceType()
end
WaterDroneAimCtrl._OnCancel = HL.Method() << function(self)
if GameInstance.playerController.mainCharacter == nil then
return
end
GameInstance.playerController.mainCharacter.customAbilityCom:EndAbility()
end
WaterDroneAimCtrl._OnSwitchLiquidOpenBagBtn = HL.Method() << function(self)
if self:CanSwitchLiquid() then
Notify(MessageConst.SHOW_WATER_DRONE_BAG)
self:Hide()
end
end
WaterDroneAimCtrl._InitWaterDroneJoystickBinding = HL.Method() << function(self)
self.view.uiJoystick.onDrag:AddListener(function(eventData)
self:_OnDrag(eventData)
end)
end
WaterDroneAimCtrl._OnDrag = HL.Method(HL.Userdata) << function(self, eventData)
local delta = eventData.delta
local cameraInputScaleX = self.view.waterDroneJoystickCtrl.cameraInputScaleX
local cameraInputScaleY = self.view.waterDroneJoystickCtrl.cameraInputScaleY
delta.x = cameraInputScaleX * delta.x
delta.y = cameraInputScaleY * delta.y
Notify(MessageConst.ON_DRAG_WATER_DRONE_JOYSTICK, delta)
end
HL.Commit(WaterDroneAimCtrl)