using System; using UnityEngine; using UnityEngine.InputSystem; namespace TTTSC.Player.Character.Controller { public class PlayerInputReceiver : MonoBehaviour { private float _lookX, _lookY; bool _sprintIsHeld, _crouchIsHeld, _jumpIsHeld; float _sprintStageValue, _crouchStageValue, _jumpStageValue; public event Action MoveInputEvent, LookInputEvent; public event Action SprintInputEvent, CrouchInputEvent, JumpInputEvent; #region SpectatorControls public event Action SpectatorSpeedUpInputEvent, SpectatorSlowDownEvent, FlyUpInputEvent, FlyDownInputEvent; bool _spectatorSpeedUpIsHeld, _spectatorSlowDownIsHeld, _flyUpIsHeld, _flyDownIsHeld; float _spectatorSpeedUpStageValue, _spectatorSlowDownStageValue, _flyUpStageValue, _flyDownStageValue; #endregion public PlayerInputSender playerInputEvents; private void OnEnable() { playerInputEvents = new PlayerInputSender(); playerInputEvents.Enable(); // #region GlobalControls playerInputEvents.GlobalControls.LookX.performed += LookXInputReceiver; playerInputEvents.GlobalControls.LookY.performed += LookYInputReceiver; playerInputEvents.GlobalControls.Move.performed += WalkInputReceiver; #endregion // #region AliveControls playerInputEvents.AliveControls.Sprint.performed += SprintInputReceiver; playerInputEvents.AliveControls.Jump.performed += JumpInputReceiver; playerInputEvents.AliveControls.Crouch.performed += CrouchInputReceiver; #endregion // #region SpectatorControls playerInputEvents.SpectatorControls.SpeedUp.performed += SpectatorSpeedUp; playerInputEvents.SpectatorControls.SpeedDown.performed += SpectatorSlowDown; playerInputEvents.SpectatorControls.FlyUp.performed += SpectatorFlyUp; playerInputEvents.SpectatorControls.FlyDown.performed += SpectatorFlyDown; #endregion } private void OnDisable() { playerInputEvents.Disable(); // #region GlobalControls playerInputEvents.GlobalControls.LookX.performed -= LookXInputReceiver; playerInputEvents.GlobalControls.LookY.performed -= LookYInputReceiver; playerInputEvents.GlobalControls.Move.performed -= WalkInputReceiver; #endregion // #region AliveControls playerInputEvents.AliveControls.Sprint.performed -= SprintInputReceiver; playerInputEvents.AliveControls.Jump.performed -= JumpInputReceiver; playerInputEvents.AliveControls.Crouch.performed -= CrouchInputReceiver; #endregion // #region SpectatorControls playerInputEvents.SpectatorControls.SpeedUp.performed -= SpectatorSpeedUp; playerInputEvents.SpectatorControls.SpeedDown.performed -= SpectatorSlowDown; playerInputEvents.SpectatorControls.FlyUp.performed -= SpectatorFlyUp; playerInputEvents.SpectatorControls.FlyDown.performed -= SpectatorFlyDown; #endregion } #region FloatBool function bool FloatBool(float a, string calculationOperator, float b) { bool result = false; switch (calculationOperator) { case "==": if (a == b) { result = true; } else { result = false; } break; case "!=": if (a != b) { result = true; } else { result = false; } break; case ">=": if (a >= b) { result = true; } else { result = false; } break; case "<=": if (a <= b) { result = true; } else { result = false; } break; case ">": if (a > b) { result = true; } else { result = false; } break; case "<": if (a < b) { result = true; } else { result = false; } break; } return result; } #endregion private void FixedUpdate() { #region AliveControls playerInputEvents.AliveControls.Sprint.started += ctx => _sprintStageValue = 1; playerInputEvents.AliveControls.Sprint.performed += ctx => _sprintStageValue = 2; playerInputEvents.AliveControls.Sprint.canceled += ctx => _sprintStageValue = 0; SprintInputEvent?.Invoke(_sprintIsHeld, _sprintStageValue); playerInputEvents.AliveControls.Crouch.started += ctx => _crouchStageValue = 1; playerInputEvents.AliveControls.Crouch.performed += ctx => _crouchStageValue = 2; playerInputEvents.AliveControls.Crouch.canceled += ctx => _crouchStageValue = 0; CrouchInputEvent?.Invoke(_crouchIsHeld, _crouchStageValue); playerInputEvents.AliveControls.Jump.started += ctx => _jumpStageValue = 1; playerInputEvents.AliveControls.Jump.performed += ctx => _jumpStageValue = 2; playerInputEvents.AliveControls.Jump.canceled += ctx => _jumpStageValue = 0; JumpInputEvent?.Invoke(_jumpIsHeld, _jumpStageValue); #endregion // #region SpectatorControls playerInputEvents.SpectatorControls.SpeedUp.started += ctx => _spectatorSpeedUpStageValue = 1; playerInputEvents.SpectatorControls.SpeedUp.performed += ctx => _spectatorSpeedUpStageValue = 2; playerInputEvents.SpectatorControls.SpeedUp.canceled += ctx => _spectatorSpeedUpStageValue = 0; SpectatorSpeedUpInputEvent?.Invoke(_spectatorSpeedUpIsHeld, _spectatorSpeedUpStageValue); playerInputEvents.SpectatorControls.SpeedDown.started += ctx => _spectatorSlowDownStageValue = 1; playerInputEvents.SpectatorControls.SpeedDown.performed += ctx => _spectatorSlowDownStageValue = 2; playerInputEvents.SpectatorControls.SpeedDown.canceled += ctx => _spectatorSlowDownStageValue = 0; SpectatorSlowDownEvent?.Invoke(_spectatorSlowDownIsHeld, _spectatorSlowDownStageValue); playerInputEvents.SpectatorControls.FlyUp.started += ctx => _flyUpStageValue = 1; playerInputEvents.SpectatorControls.FlyUp.performed += ctx => _flyUpStageValue = 2; playerInputEvents.SpectatorControls.FlyUp.canceled += ctx => _flyUpStageValue = 0; FlyUpInputEvent?.Invoke(_flyUpIsHeld, _flyUpStageValue); playerInputEvents.SpectatorControls.FlyDown.started += ctx => _flyDownStageValue = 1; playerInputEvents.SpectatorControls.FlyDown.performed += ctx => _flyDownStageValue = 2; playerInputEvents.SpectatorControls.FlyDown.canceled += ctx => _flyDownStageValue = 0; FlyDownInputEvent?.Invoke(_flyDownIsHeld, _flyDownStageValue); #endregion } #region GlobalControls private void LookXInputReceiver(InputAction.CallbackContext ctx) { var value = ctx.ReadValue(); _lookX = value; Look(FloatBool(value, "!=", 0)); } private void LookYInputReceiver(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _lookY = value; Look(FloatBool(value, "!=", 0)); } private void Look(bool performing) { var look = new Vector2(_lookX, _lookY); LookInputEvent?.Invoke(look, performing); } private void WalkInputReceiver(InputAction.CallbackContext ctx) { var value = ctx.ReadValue(); bool performing = !(value == new Vector2(0, 0)); MoveInputEvent?.Invoke(value, performing); } #endregion #region AliveControls private void SprintInputReceiver(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _sprintIsHeld = FloatBool(value, "==", 1); } private void CrouchInputReceiver(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _crouchIsHeld = FloatBool(value, "==", 1); } private void JumpInputReceiver(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _jumpIsHeld = FloatBool(value, "==", 1); } #endregion #region SpectatorControls private void SpectatorSpeedUp(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _spectatorSpeedUpIsHeld = FloatBool(value, "==", 1); } private void SpectatorSlowDown(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _spectatorSlowDownIsHeld = FloatBool(value, "==", 1); } private void SpectatorFlyUp(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _flyUpIsHeld = FloatBool(value, "==", 1); } private void SpectatorFlyDown(InputAction.CallbackContext ctx) { float value = ctx.ReadValue(); _flyDownIsHeld = FloatBool(value, "==", 1); } #endregion } }