using BriarQueen.Data.Identifiers; using BriarQueen.Framework.Coordinators.Events; using BriarQueen.Framework.Events.UI; using BriarQueen.Framework.Managers.Audio; using BriarQueen.Framework.Managers.Interaction.Data; using BriarQueen.Framework.Managers.IO; using BriarQueen.Framework.Managers.Levels; using BriarQueen.Framework.Managers.Player.Data; using BriarQueen.Framework.Managers.UI; using BriarQueen.Framework.Services.Tutorials; using Cysharp.Threading.Tasks; using UnityEngine; using VContainer; namespace BriarQueen.Game.Items.HoverZones { public class TransitionZone : MonoBehaviour, IInteractable { [Header("Level Setup")] [SerializeField] private LevelKey _levelToLoad; [SerializeField] private string _levelName; [SerializeField] private string _lockedTooltipText = string.Empty; [SerializeField] private string _lockedInteractText = string.Empty; [SerializeField] private bool _locked; [Header("UI Setup")] [SerializeField] private UICursorService.CursorStyle _cursorStyle = UICursorService.CursorStyle.Travel; [Header("Optional")] [SerializeField] private SFXKey _soundEffectOnClick; protected EventCoordinator EventCoordinator; protected LevelManager LevelManager; protected SaveManager SaveManager; protected AudioManager AudioManager; protected TutorialService TutorialService; public CanvasGroup CanvasGroup; public bool CanInteract() { return true; } protected void Awake() { if(CanvasGroup == null) CanvasGroup = GetComponent(); } protected void Start() { if (_locked && CheckUnlockStatus()) Unlock(); } public UICursorService.CursorStyle ApplicableCursorStyle => _cursorStyle; public virtual string InteractableName => _locked ? _lockedTooltipText : _levelName; public virtual async UniTask OnInteract(ItemDataSo item = null) { if (_locked) { var message = !string.IsNullOrEmpty(_lockedInteractText) ? _lockedInteractText : InteractEventIDs.Get(EnvironmentInteractKey.Locked); EventCoordinator.Publish(new DisplayInteractEvent(message)); return; } if (item != null) { EventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(ItemInteractKey.CantUseItem))); return; } var levelId = AssetKeyIdentifiers.Get(_levelToLoad); if (_soundEffectOnClick != SFXKey.None) { AudioManager.Play(AudioNameIdentifiers.Get(_soundEffectOnClick)); } var loaded = await LevelManager.LoadLevel(levelId); if (!loaded) { EventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(EnvironmentInteractKey.CantGoThere))); } TutorialService.DisplayTutorial(TutorialPopupID.ReturnToPreviousLevel); } public virtual UniTask EnterHover() { return UniTask.CompletedTask; } public virtual UniTask ExitHover() { return UniTask.CompletedTask; } public void Unlock() { _locked = false; } protected virtual bool CheckUnlockStatus() { return false; } [Inject] public void Construct(LevelManager levelManager, EventCoordinator eventCoordinator, SaveManager saveManager, AudioManager audioManager, TutorialService tutorialService) { LevelManager = levelManager; EventCoordinator = eventCoordinator; SaveManager = saveManager; AudioManager = audioManager; TutorialService = tutorialService; } } }