using System; using Cinemachine.Utility; using Core; using Sirenix.OdinInspector; using Systems; using UnityEngine; using Application = Core.Application; namespace Components { public class PlayerHolder : BaseMonoBehaviour { public static event Action OnLoopOffsetReach; [SerializeField] private Rigidbody playerRigidbody; private Transform _playerTransform; private float _loopCheck; private float _tileOffset; [ShowInInspector] public bool IsMoving => !playerRigidbody.velocity.AlmostZero(); protected override void ReleaseReferences() { ForceObject.OnPlayerHit -= OnObjectHit; _playerTransform = null; playerRigidbody = null; } public void BindSettings() { _playerTransform = transform; _tileOffset = Application.GetSystem().TileOffset; _loopCheck = _tileOffset; ForceObject.OnPlayerHit += OnObjectHit; } public void AddForce(Vector3 inForce) { gameObject.SetActive(true); playerRigidbody.velocity = inForce; } private void OnObjectHit(ForceData inForce) => playerRigidbody.AddForce(inForce.direction * inForce.force, inForce.forceMode); public void ResetPlayer() { transform.localPosition = Vector3.zero; gameObject.SetActive(false); } public void PlayerTick() { if (!IsMoving) return; // TODO: // Add minimal movement code here. if (_playerTransform.position.z < _loopCheck) return; _loopCheck += _tileOffset; Debug.Log("Reset pont reached!"); OnLoopOffsetReach?.Invoke(); } } }