using System; using System.Collections; using System.Collections.Generic; using BlueWater.Interfaces; using BlueWater.Tycoons; using BlueWater.Uis; using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.InputSystem; namespace BlueWater.Players.Tycoons { public class TycoonInput : MonoBehaviour { // variables #region variables // Components [SerializeField] private PlayerInput _playerInput; private List _playerInteractions = new(); private IPlayerInteraction _closestInteraction; private IPlayerInteraction _previousInteraction; // Events public event Action OnMoveInputReceived; #endregion #region Unity events private void Awake() { InitializeComponents(); } private void Start() { StartCoroutine(nameof(Initialize)); } private void Update() { _closestInteraction = GetClosestInteraction(); if (_closestInteraction != null) { _closestInteraction.ShowInteractionUi(); if (_previousInteraction != null && _closestInteraction != _previousInteraction) { _previousInteraction.HideInteractionUi(); } _previousInteraction = _closestInteraction; } else { _previousInteraction?.CancelInteraction(); _previousInteraction?.HideInteractionUi(); _previousInteraction = null; } } #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] private void InitializeComponents() { _playerInput = GetComponent(); } private IEnumerator Initialize() { PlayerInputKeyManager.Instance.SetCurrentPlayerInput(_playerInput); yield return new WaitUntil(() => _playerInput.IsInitialized()); PlayerInputKeyManager.Instance.DisableAllActionMaps(); PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.Tycoon); EventManager.InvokeInitializedPlayerInput(); } #endregion // Player input methods #region Player input methods // Tycoon public void OnMove(InputAction.CallbackContext context) { var movementInput = context.ReadValue(); OnMoveInputReceived?.Invoke(movementInput); } public void OnInteraction(InputAction.CallbackContext context) { if (context.performed) { _closestInteraction?.Interaction(); } else if (context.canceled) { _closestInteraction?.CancelInteraction(); } } public void OnDevelopKey01(InputAction.CallbackContext context) { if (context.performed) { EventManager.InvokeCreateServerCrew(); EventManager.InvokeCreateCleanerCrew(); EventManager.InvokeCreateBartenderCrew(); } } public void OnManual(InputAction.CallbackContext context) { if (context.performed) { TycoonUiManager.Instance.ManualBook.Open(); } } // TycoonUi public void OnCancel(InputAction.CallbackContext context) { if (context.performed) { PopupUiController.CloseLastPopup(); } } public void OnCancelManual(InputAction.CallbackContext context) { if (context.performed) { TycoonUiManager.Instance.ManualBook.Close(); } } // Bar public void OnPour(InputAction.CallbackContext context) { var bar = FindAnyObjectByType(); if (!bar) return; if (context.performed) { bar.ActiveIsPouring(); } else if (context.canceled) { bar.InActiveIsPouring(); } } #endregion #region Methods public void RegisterPlayerInteraction(IPlayerInteraction playerInteraction) { Utils.RegisterList(_playerInteractions, playerInteraction); } public void UnregisterPlayerInteraction(IPlayerInteraction playerInteraction) { Utils.UnregisterList(_playerInteractions, playerInteraction); } private IPlayerInteraction GetClosestInteraction() { IPlayerInteraction closestInteraction = null; var closestDistance = float.MaxValue; foreach (var interaction in _playerInteractions) { if (!interaction.CanInteraction()) continue; var distance = Vector3.Distance(transform.position, interaction.CenterTransform.position); if (distance > interaction.InteractionRadius || distance >= closestDistance) continue; closestDistance = distance; closestInteraction = interaction; } return closestInteraction; } #endregion } }