Cyber/Assets/Scripts/Controls/PlayerController.cs

99 lines
4.0 KiB
C#
Raw Normal View History

using UnityEngine;
using Cyber.Entities.SyncBases;
2017-05-08 23:03:02 +02:00
using Cyber.Console;
2017-05-09 06:15:34 +02:00
using Cyber.Networking.Clientside;
using Cyber.Networking;
using Cyber.Networking.Messages;
using Cyber.Entities;
2017-05-08 23:03:02 +02:00
namespace Cyber.Controls {
/// <summary>
/// Controls the player character. Shouldn't exist on the server, and only one
/// should exist per client (the character that client is controlling).
/// </summary>
public class PlayerController : MonoBehaviour {
/// <summary>
/// The character this controller should control.
/// </summary>
public Character Character;
/// <summary>
/// The camera the player is seeing the world through.
/// </summary>
public Camera Camera;
private CursorHandler CursorHandler;
private Vector3 Rotation;
2017-05-12 01:03:27 +02:00
private GameObject LastLookedAt;
private void Start() {
CursorHandler = GameObject.Find("/Systems/CursorHandler").GetComponent<CursorHandler>();
}
2017-05-08 23:03:02 +02:00
private void Update() {
if (!Term.IsVisible()) {
// Don't do any "gameplay stuff" if the debug console is up
2017-05-08 23:03:02 +02:00
// Handle inputs
// Movement
2017-05-08 23:03:02 +02:00
Vector3 Move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
if (Move.sqrMagnitude != 0) {
Character.Move(Character.transform.TransformDirection(Move));
2017-05-08 23:03:02 +02:00
} else if (Character.Moving()) {
Character.Stop();
}
// Rotation
Rotation.y += Input.GetAxis("Mouse X") * CursorHandler.MouseSensitivityX;
Rotation.x = Mathf.Clamp(Rotation.x - Input.GetAxis("Mouse Y") * CursorHandler.MouseSensitivityY, -89, 89);
Character.SetRotation(Rotation);
// Interactions
2017-05-12 01:03:27 +02:00
GameObject LookedAtObject = GetLookedAtGameObject();
if (LookedAtObject != null) {
Interactable LookingAt = LookedAtObject.GetComponent<Interactable>();
if (LookingAt != null && (LookingAt.transform.position - Character.GetPosition()).magnitude < Character.InteractionDistance) {
if (Input.GetButtonDown("Activate")) {
InteractWith(LookingAt, InteractionType.Activate);
}
if (Input.GetButtonUp("Activate")) {
InteractWith(LookingAt, InteractionType.Deactivate);
}
if (LookedAtObject != LastLookedAt) {
InteractWith(LookingAt, InteractionType.Enter);
if (LastLookedAt != null) {
InteractWith(LastLookedAt.GetComponent<Interactable>(), InteractionType.Exit);
}
}
2017-05-12 01:03:27 +02:00
LastLookedAt = LookedAtObject;
}
2017-05-12 01:03:27 +02:00
} else if (LastLookedAt != null) {
InteractWith(LastLookedAt.GetComponent<Interactable>(), InteractionType.Exit);
LastLookedAt = null;
}
2017-05-08 23:03:02 +02:00
} else if (Character.Moving()) {
// The debug console is open, stop the player.
Character.Stop();
}
}
2017-05-12 01:03:27 +02:00
private void InteractWith(Interactable interactable, InteractionType type) {
interactable.Interact(Character, type);
if (interactable.GetInteractableSyncdata().PublicInteractions) {
Client.Send(PktType.Interact, new InteractionPkt(interactable.ID, type));
}
}
private GameObject GetLookedAtGameObject() {
RaycastHit Hit;
Physics.Raycast(Camera.transform.position, Camera.transform.forward, out Hit, Character.InteractionDistance);
if (Hit.collider != null) {
return Hit.collider.gameObject;
} else {
return null;
}
}
2017-05-08 23:03:02 +02:00
}
}