Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using Sirenix.OdinInspector;
- using UltimateRpg.Audio;
- using UltimateRpg.Core.Interfaces;
- using UltimateRpg.Managers;
- using UltimateRpg.SaveSystem;
- using UnityEditor;
- using UnityEngine;
- namespace UltimateRpg.Interactables
- {
- public class Checkpoint : MonoBehaviour, ISavable
- {
- private static readonly int Active = Animator.StringToHash("Active");
- [SerializeField, ReadOnly] private string savedId;
- [SerializeField, HideInInspector] private int lastKnownInstanceId;
- [SerializeField] private string checkpointDisplayName;
- private Player.Player _player;
- private Checkpoint[] _allCheckpoints;
- private Animator _animator;
- private bool _canActivate = true;
- private AudioSource _audioSource;
- public string SavedId => savedId;
- #if UNITY_EDITOR
- private void OnValidate()
- {
- int currentInstanceId = GetInstanceID();
- if (string.IsNullOrEmpty(savedId) || (lastKnownInstanceId != currentInstanceId && lastKnownInstanceId != 0))
- {
- savedId = Guid.NewGuid().ToString();
- EditorUtility.SetDirty(this);
- }
- lastKnownInstanceId = currentInstanceId;
- }
- #endif
- private void Awake()
- {
- _player = GameManager.Instance.Player;
- _animator = GetComponentInChildren<Animator>();
- _allCheckpoints = FindObjectsByType<Checkpoint>(FindObjectsSortMode.None);
- _audioSource = GetComponentInChildren<AudioSource>();
- }
- private void Activate(bool activate)
- {
- _animator.SetBool(Active, activate);
- if(isActiveAndEnabled)
- FusionAudioManager.Instance.PlayAudio(EnvironmentAudioId.Checkpoint, _audioSource);
- else
- FusionAudioManager.Instance.StopAudio(EnvironmentAudioId.Checkpoint, _audioSource);
- }
- private void OnTriggerEnter2D(Collider2D other)
- {
- if (!other.CompareTag("Player"))
- return;
- if(!_canActivate)
- return;
- foreach (Checkpoint checkpoint in _allCheckpoints)
- checkpoint.Activate(false);
- GameManager.Instance.SetLastCheckpoint(transform.position);
- SaveManager.Instance.GameData.savedCheckpoint = transform.position;
- Activate(true);
- _canActivate = false;
- }
- public void SaveData(ref GameData gameData)
- {
- gameData.activatedCheckpoints[savedId] = !_canActivate;
- }
- public void LoadData(GameData gameData)
- {
- if (gameData.activatedCheckpoints.TryGetValue(savedId, out bool wasActivated))
- _canActivate = !wasActivated;
- bool isCurrentCheckpoint = gameData.savedCheckpoint == (Vector2)transform.position;
- Activate(isCurrentCheckpoint);
- if (isCurrentCheckpoint)
- _player.TeleportPlayer(transform.position);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment