2020-08-02 02:52:38 +02:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.InputSystem;
|
2020-08-08 01:14:23 +02:00
|
|
|
|
using NeonTea.Quakeball.Interface;
|
2020-08-07 20:20:13 +02:00
|
|
|
|
using NeonTea.Quakeball.Networking;
|
|
|
|
|
using NeonTea.Quakeball.Networking.Packets;
|
2020-08-02 02:52:38 +02:00
|
|
|
|
|
2020-08-07 20:23:21 +02:00
|
|
|
|
namespace NeonTea.Quakeball.Players {
|
2020-08-02 02:52:38 +02:00
|
|
|
|
/// <summary>A controller class for a local player. Handles input and updates the relevant components.</summary>
|
|
|
|
|
[RequireComponent(typeof(Player))]
|
|
|
|
|
public class LocalPlayer : MonoBehaviour {
|
2020-08-08 15:06:14 +02:00
|
|
|
|
public int DisableInput;
|
2020-08-09 21:18:26 +02:00
|
|
|
|
public float SyncInterval = 1;
|
|
|
|
|
public float MovementUpdateInterval = 1f;
|
2020-08-02 02:52:38 +02:00
|
|
|
|
|
2020-08-08 05:40:01 +02:00
|
|
|
|
public Player Player { private set; get; }
|
2020-08-06 21:58:31 +02:00
|
|
|
|
public InputAction LookAction { private set; get; }
|
2020-08-02 02:52:38 +02:00
|
|
|
|
private InputAction MoveAction;
|
|
|
|
|
private InputAction CrouchAction;
|
2020-08-02 03:45:54 +02:00
|
|
|
|
private InputAction JumpAction;
|
2020-08-08 04:26:17 +02:00
|
|
|
|
private InputAction ShootAction;
|
2020-08-14 19:48:27 +02:00
|
|
|
|
private InputAction SwitchUpAction;
|
2020-08-02 02:52:38 +02:00
|
|
|
|
|
2020-08-06 19:58:10 +02:00
|
|
|
|
private float PreviousPlayerUpdate = -1;
|
2020-08-07 23:59:51 +02:00
|
|
|
|
private float PreviousPlayerFullSync = -1;
|
2020-08-06 19:58:10 +02:00
|
|
|
|
private bool WantsToJump = false;
|
|
|
|
|
|
2020-08-02 02:52:38 +02:00
|
|
|
|
private void Awake() {
|
|
|
|
|
Player = GetComponent<Player>();
|
|
|
|
|
|
2020-08-02 03:45:54 +02:00
|
|
|
|
CrouchAction = new InputAction("crouch", binding: "<Gamepad>/buttonEast");
|
|
|
|
|
CrouchAction.AddBinding("<Keyboard>/leftShift");
|
2020-08-02 02:52:38 +02:00
|
|
|
|
|
2020-08-02 03:45:54 +02:00
|
|
|
|
JumpAction = new InputAction("crouch", binding: "<Gamepad>/buttonSouth");
|
|
|
|
|
JumpAction.AddBinding("<Keyboard>/space");
|
2020-08-06 19:58:10 +02:00
|
|
|
|
JumpAction.performed += _ => {
|
|
|
|
|
WantsToJump = true;
|
|
|
|
|
};
|
2020-08-02 03:45:54 +02:00
|
|
|
|
|
2020-08-02 02:52:38 +02:00
|
|
|
|
LookAction = new InputAction("look", binding: "<Gamepad>/leftStick");
|
|
|
|
|
LookAction.AddBinding("<Mouse>/delta");
|
|
|
|
|
|
|
|
|
|
MoveAction = new InputAction("move", binding: "<Gamepad>/rightStick");
|
|
|
|
|
MoveAction.AddCompositeBinding("Dpad")
|
|
|
|
|
.With("Up", "<Keyboard>/w")
|
|
|
|
|
.With("Down", "<Keyboard>/s")
|
|
|
|
|
.With("Left", "<Keyboard>/a")
|
|
|
|
|
.With("Right", "<Keyboard>/d");
|
2020-08-08 01:14:23 +02:00
|
|
|
|
|
2020-08-08 04:26:17 +02:00
|
|
|
|
ShootAction = new InputAction("Shoot", binding: "<Mouse>/leftButton");
|
|
|
|
|
ShootAction.performed += _ => {
|
2020-08-08 05:20:23 +02:00
|
|
|
|
if (Networking.Net.Singleton.Instance != null) {
|
|
|
|
|
ShootData shootData = new ShootData(Player.Pitch, Player.Yaw, Player.CreateSyncPacket());
|
|
|
|
|
Networking.Net.Singleton.Instance.LocalPlayerAction(PlayerAction.Shoot, shootData);
|
|
|
|
|
}
|
2020-08-08 04:26:17 +02:00
|
|
|
|
Player.Shoot();
|
2020-08-14 19:48:27 +02:00
|
|
|
|
};/*
|
|
|
|
|
ShootAction = new InputAction("Shoot", binding: "<Mouse>/leftButton");
|
|
|
|
|
ShootAction.performed += _ => {
|
|
|
|
|
if (Networking.Net.Singleton.Instance != null) {
|
|
|
|
|
ShootData shootData = new ShootData(Player.Pitch, Player.Yaw, Player.CreateSyncPacket());
|
|
|
|
|
Networking.Net.Singleton.Instance.LocalPlayerAction(PlayerAction.Shoot, shootData);
|
|
|
|
|
}
|
|
|
|
|
Player.Shoot();
|
|
|
|
|
};*/
|
2020-08-08 04:26:17 +02:00
|
|
|
|
|
2020-08-08 01:14:23 +02:00
|
|
|
|
Terminal.Singleton.RegisterCommand("tp", args => {
|
|
|
|
|
if (args.Length != 3) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
transform.position = new Vector3(float.Parse(args[0]), float.Parse(args[1]), float.Parse(args[2]));
|
|
|
|
|
return true;
|
|
|
|
|
}, "tp x y z - Teleports the local player to the specified coordinates.");
|
2020-08-02 02:52:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Update() {
|
2020-08-10 01:31:20 +02:00
|
|
|
|
if (DisableInput > 0 || !Application.isFocused) {
|
2020-08-06 23:42:39 +02:00
|
|
|
|
CrouchAction.Disable();
|
|
|
|
|
JumpAction.Disable();
|
|
|
|
|
LookAction.Disable();
|
|
|
|
|
MoveAction.Disable();
|
2020-08-08 04:26:17 +02:00
|
|
|
|
ShootAction.Disable();
|
2020-08-06 23:42:39 +02:00
|
|
|
|
Cursor.lockState = CursorLockMode.None;
|
|
|
|
|
Cursor.visible = true;
|
|
|
|
|
} else {
|
|
|
|
|
CrouchAction.Enable();
|
|
|
|
|
JumpAction.Enable();
|
|
|
|
|
LookAction.Enable();
|
|
|
|
|
MoveAction.Enable();
|
2020-08-08 04:26:17 +02:00
|
|
|
|
ShootAction.Enable();
|
2020-08-06 23:42:39 +02:00
|
|
|
|
Cursor.visible = false;
|
|
|
|
|
Cursor.lockState = CursorLockMode.Locked;
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-02 02:52:38 +02:00
|
|
|
|
OptionsData Opts = Options.Get();
|
|
|
|
|
|
2020-08-02 03:45:54 +02:00
|
|
|
|
Vector2 LookInput = LookAction.ReadValue<Vector2>() * Opts.LookSensitivity;
|
|
|
|
|
Player.Pitch = Mathf.Clamp(Player.Pitch - LookInput.y * (Opts.InvertVerticalLook ? -1 : 1), -90, 90);
|
|
|
|
|
Player.Yaw += LookInput.x;
|
2020-08-06 19:58:10 +02:00
|
|
|
|
|
2020-08-09 21:18:26 +02:00
|
|
|
|
if (Time.time - PreviousPlayerUpdate >= MovementUpdateInterval) {
|
2020-08-07 22:25:56 +02:00
|
|
|
|
PreviousPlayerUpdate = Time.time;
|
2020-08-08 15:22:46 +02:00
|
|
|
|
if (Player.IsDead) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2020-08-07 22:25:56 +02:00
|
|
|
|
|
2020-08-06 19:58:10 +02:00
|
|
|
|
Vector2 MovementInput = MoveAction.ReadValue<Vector2>();
|
|
|
|
|
Vector3 Move = new Vector3(MovementInput.x, 0, MovementInput.y);
|
|
|
|
|
Move = Quaternion.Euler(0, Player.Yaw, 0) * Move;
|
|
|
|
|
Player.MoveDirection = Move;
|
|
|
|
|
Player.CurrentMoveStyle = CrouchAction.ReadValue<float>() > 0 ? (byte)1 : (byte)0;
|
2020-08-07 20:20:13 +02:00
|
|
|
|
if (Networking.Net.Singleton.Instance != null) {
|
2020-08-07 21:07:58 +02:00
|
|
|
|
Networking.Net.Singleton.Instance.UpdateLocalPlayer();
|
2020-08-07 05:24:46 +02:00
|
|
|
|
}
|
2020-08-07 22:25:56 +02:00
|
|
|
|
|
2020-08-08 01:16:51 +02:00
|
|
|
|
if (WantsToJump) {
|
|
|
|
|
bool Jumped = Player.Jump();
|
|
|
|
|
if (Jumped && Networking.Net.Singleton.Instance != null) {
|
2020-08-08 03:23:26 +02:00
|
|
|
|
Networking.Net.Singleton.Instance.LocalPlayerAction(PlayerAction.Jump);
|
2020-08-08 01:16:51 +02:00
|
|
|
|
}
|
2020-08-07 22:25:56 +02:00
|
|
|
|
}
|
|
|
|
|
WantsToJump = false;
|
2020-08-06 19:58:10 +02:00
|
|
|
|
}
|
2020-08-07 23:59:51 +02:00
|
|
|
|
|
2020-08-09 21:18:26 +02:00
|
|
|
|
if (Time.time - PreviousPlayerFullSync >= SyncInterval) {
|
2020-08-08 00:44:07 +02:00
|
|
|
|
PreviousPlayerFullSync = Time.time;
|
2020-08-08 00:15:33 +02:00
|
|
|
|
if (Networking.Net.Singleton.Instance != null) {
|
|
|
|
|
Networking.Net.Singleton.Instance.SendPlayerSync();
|
|
|
|
|
}
|
2020-08-07 23:59:51 +02:00
|
|
|
|
}
|
2020-08-02 02:52:38 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|