using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using BITKit; using BITKit.Entities; using KinematicCharacterController; using BITKit.StateMachine; using Unity.Mathematics; namespace BITFALL.Entites { public partial class EntityKinematicMovement : EntityPlayerComponent, IHealthCallback, IEntityMovement { [Header(Constant.Header.Settings)] public float moveSpeed = 2.5f; [Header(Constant.Header.Components)] public KinematicCharacterMotor motor; [Header(Constant.Header.Reference)] [SerializeReference, SubclassSelector] public References _velocity; [SerializeReference, SubclassSelector] public References _speed; [SerializeReference, SubclassSelector] public References _vertical; [SerializeReference, SubclassSelector] public References _horizontal; [SerializeReference, SubclassSelector] public References _MoveHorizontal; [SerializeReference, SubclassSelector] public References _MoveVertical; [SerializeReference, SubclassSelector] public References _sqrMagnitude; [SerializeReference, SubclassSelector] public References _direction; [SerializeReference, SubclassSelector] public References _rootVelocity; [SerializeReference, SubclassSelector] public References _jump; [SerializeReference, SubclassSelector] public References _isGrounded; [SerializeReference, SubclassSelector] public References _isRunning; [SerializeReference, SubclassSelector] public References _isSprint; [SerializeReference, SubclassSelector] public References _isSliding; [SerializeReference, SubclassSelector] public References _isProneing; [SerializeReference, SubclassSelector] public References _isCrouched; [SerializeReference, SubclassSelector] public References _cameraPosition; [SerializeReference, SubclassSelector] public References _setLookAt; [SerializeReference, SubclassSelector] public References _cameraRotation; [SerializeReference, SubclassSelector] public References _lookRotation; [SerializeReference, SubclassSelector] public References _cancel; [SerializeReference, SubclassSelector] public References _ads; [SerializeReference, SubclassSelector] public References _angularVelocity; [Header(Constant.Header.State)] public ExpectState runState; public ExpectState sprintState; public ExpectState crouchState; public ExpectState groundState; public ExpectState jumpState; public ExpectState vaultState; [Header(Constant.Header.Gameobjects)] public Transform cameraRoot; public List ignoreColliders = new(); [Header(Constant.Header.InternalVariables)] public Vector3 moveInput; public Vector3 lookInput; public Vector3 matchTargetPosition; public float currentGravity; IStateMachine stateMachine => this as IStateMachine; public float _moveSpeed => (runState.being, sprintState.being, crouchState.being) switch { (_, _, true) => 1, (true, false, _) => moveSpeed * 2f, (_, true, false) => moveSpeed * 3f, _ => moveSpeed, }; public override void Initialize(IEntity entity) { base.Initialize(entity); entity.Set(this); } public override void OnAwake() { lookInput = MathV.TransientRotationAxis(transform.eulerAngles); } public override void OnStart() { foreach (var state in characterStates) { StateDictonary.Add(state.GetType(), state); } KinematicCharacterSystem.EnsureCreation(); motor.CharacterController = this; KinematicCharacterSystem.CharacterMotors.Add(motor); entity.AddListener(CancelMovement); } public override void OnPlayerInitialized() { if (isLocalPlayer) stateMachine.TransitionState(characterStates[0]); } public override void OnFixedUpdate(float deltaTime) { if (isSpawned) { /* client.SendRT(nameof(EntityProxyMovement.RpcSyncMovement) , entity.Id, (Net.Vector3)motor.Velocity, (Net.Vector3)motor.TransientPosition); */ // FGame.ClientAllRpc( // nameof(IEntityMovement.SyncMovement), // entity.Id, // (float3)motor.Velocity, // (float3)motor.TransientPosition, // (quaternion)motor.TransientRotation, // motor.GroundingStatus.FoundAnyGround // ); } } public override void OnUpdate(float deltaTime) { if (isLocalPlayer) { var offset = new Vector3(0, 1.2f * (crouchState.being ? 0.64f : 1), 0.2f); var lerp = Vector3.Lerp( cameraRoot.localPosition, offset, 5 * deltaTime ); cameraRoot.localPosition = lerp; } } public override void OnLateUpdate(float deltaTime) { if (isLocalPlayer) { var rotation = Quaternion.Euler(lookInput); cameraRoot.rotation = rotation; entity.Set(_cameraRotation, rotation); } } public override void OnDestroyComponent() { KinematicCharacterSystem.CharacterMotors.Remove(motor); } void IHealthCallback.OnSetAlive(bool alive) { } void IHealthCallback.OnSetHP(int hp) { } void CancelMovement(IMovementCancelAction action) { stateMachine?.CurrentState?.OnCancelMovement(action); } public Vector3 Velocity { get; set; } public Vector3 GroundVelocity { get; set; } public bool IsGrounded { get; set; } void IEntityMovement.SyncMovement(Vector3 velocity, Vector3 position, Quaternion rotation, bool isGrounded) { } public void Movement(Vector3 relativeVector) { throw new NotImplementedException(); } public void Movement(InputAction.CallbackContext context) { throw new NotImplementedException(); } public IDictionary StateDictionary { get; set; } } }