215 lines
5.4 KiB
C#
215 lines
5.4 KiB
C#
using Obvious.Soap;
|
|
using SoapCustomVariable;
|
|
using UnityEngine;
|
|
|
|
public class PlayerVehicleController : MonoBehaviour
|
|
{
|
|
public BoolVariable IsBoatInRange;
|
|
|
|
public BoolVariable IsBoatSpawnInRange;
|
|
|
|
public BoolVariable IsEquiped;
|
|
|
|
public BoolVariable IsFishingInVehicle;
|
|
|
|
public BoolVariable IsPlayerInVehicle;
|
|
|
|
public FSMVariable PlayerState;
|
|
|
|
public GameObjectVariable PlayerSpawn;
|
|
|
|
public Transform RayCheckTarget;
|
|
|
|
public float RayDistance = 2f;
|
|
|
|
public ScriptableEventBool OnVehicleEnter;
|
|
|
|
[SerializeField]
|
|
private PlayerIK _IK;
|
|
|
|
private BoatController _boatController;
|
|
|
|
private CapsuleCollider _capsuleCollider;
|
|
|
|
[SerializeField]
|
|
private HoldAction _ExitBoatAction;
|
|
|
|
[SerializeField]
|
|
private HoldAction _ChangeSetAction;
|
|
|
|
[SerializeField]
|
|
private LayerMask interactionMask;
|
|
|
|
[SerializeField]
|
|
private LayerMask boatInteractionMask;
|
|
|
|
private RaycastHit hit;
|
|
|
|
private void Awake()
|
|
{
|
|
_ExitBoatAction.OnComplete += ExitBoatActionOnOnComplete;
|
|
_ChangeSetAction.OnComplete += ChangeSetActionOnOnComplete;
|
|
}
|
|
|
|
private void ChangeSetActionOnOnComplete()
|
|
{
|
|
if (PlayerState.Value == State.vehicleFishing)
|
|
{
|
|
base.transform.parent = _boatController.transform;
|
|
base.transform.position = _boatController.SeatTarget.position;
|
|
base.transform.rotation = _boatController.SeatTarget.rotation;
|
|
PlayerState.Value = State.vehicle;
|
|
IsFishingInVehicle.Value = false;
|
|
}
|
|
else if (PlayerState.Value == State.vehicle)
|
|
{
|
|
base.transform.parent = _boatController.transform;
|
|
base.transform.position = _boatController.FishingTarget.position;
|
|
base.transform.rotation = _boatController.FishingTarget.rotation;
|
|
PlayerState.Value = State.vehicleFishing;
|
|
IsFishingInVehicle.Value = true;
|
|
}
|
|
_ChangeSetAction.ResetHold();
|
|
}
|
|
|
|
private void ExitBoatActionOnOnComplete()
|
|
{
|
|
_ExitBoatAction.ResetHold();
|
|
if (_boatController != null && (PlayerState.Value == State.idle || PlayerState.Value == State.move || PlayerState.Value == State.swiming))
|
|
{
|
|
EnterToVehicle();
|
|
}
|
|
else if (PlayerState.Value == State.vehicle || PlayerState.Value == State.vehicleFishing)
|
|
{
|
|
ExitFromVehicle();
|
|
}
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
PlayerState.OnValueChanged += PlayerStateOnOnValueChanged;
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
PlayerState.OnValueChanged -= PlayerStateOnOnValueChanged;
|
|
}
|
|
|
|
private void PlayerStateOnOnValueChanged(State newState)
|
|
{
|
|
State previousValue = PlayerState.PreviousValue;
|
|
if (previousValue == State.vehicle || previousValue == State.vehicleFishing)
|
|
{
|
|
_IK.SetBipedLeftHandIK(enabled: false, instant: true);
|
|
_IK.SetBipedRightHandIK(enabled: false, instant: true);
|
|
_IK.SetAimIK(enabled: false);
|
|
}
|
|
switch (newState)
|
|
{
|
|
case State.vehicle:
|
|
_IK.SetBipedLeftHandIK(enabled: true, _boatController.SteeringWheelLeftHand.transform, instant: true);
|
|
_IK.SetBipedRightHandIK(enabled: true, _boatController.SteeringWheelRightHand.transform, instant: true);
|
|
_IK.SetAimIK(enabled: false);
|
|
_boatController?.AutoSetInput(enable: true);
|
|
break;
|
|
case State.vehicleFishing:
|
|
_boatController?.AutoSetInput(enable: false);
|
|
_boatController?.InputSterring(0f);
|
|
_boatController?.InputThrottle(0f);
|
|
_boatController?.BowThrusters(0f);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (_boatController == null)
|
|
{
|
|
CheckForInteractionObject();
|
|
}
|
|
if ((bool)_boatController && Input.GetKey(KeyCode.E))
|
|
{
|
|
_ExitBoatAction.Hold();
|
|
}
|
|
State value = PlayerState.Value;
|
|
if ((value == State.vehicle || value == State.vehicleFishing) && (bool)_boatController && Input.GetKey(KeyCode.Q))
|
|
{
|
|
_ChangeSetAction.Hold();
|
|
}
|
|
}
|
|
|
|
private void EnterToVehicle()
|
|
{
|
|
PlayerState.Value = State.vehicle;
|
|
IsPlayerInVehicle.Value = true;
|
|
base.transform.parent = _boatController.transform;
|
|
base.transform.position = _boatController.SeatTarget.position;
|
|
base.transform.rotation = _boatController.SeatTarget.rotation;
|
|
OnVehicleEnter.Raise(param: true);
|
|
}
|
|
|
|
private void ExitFromVehicle()
|
|
{
|
|
PlayerState.Value = State.idle;
|
|
IsPlayerInVehicle.Value = false;
|
|
IsFishingInVehicle.Value = false;
|
|
base.transform.position = PlayerSpawn.Value.transform.position;
|
|
base.transform.rotation = PlayerSpawn.Value.transform.rotation;
|
|
base.transform.parent = null;
|
|
OnVehicleEnter.Raise(param: false);
|
|
}
|
|
|
|
public void Teleport(Vector3 position, Vector3 forwardDir)
|
|
{
|
|
_boatController.Teleport(position, forwardDir);
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
if (PlayerState.Value == State.vehicle)
|
|
{
|
|
IsBoatInRange.Value = false;
|
|
}
|
|
else
|
|
{
|
|
DetectAndAssignShipController();
|
|
}
|
|
}
|
|
|
|
private void CheckForInteractionObject()
|
|
{
|
|
if (PlayerState.Value == State.idle || PlayerState.Value == State.move)
|
|
{
|
|
bool flag = Physics.Raycast(RayCheckTarget.position, RayCheckTarget.forward, out hit, RayDistance, interactionMask);
|
|
IsBoatSpawnInRange.Value = flag;
|
|
if (flag && Input.GetKeyDown(KeyCode.E))
|
|
{
|
|
hit.transform.GetComponent<InteractionObject>().Interact();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void DetectAndAssignShipController()
|
|
{
|
|
bool value = false;
|
|
State value2 = PlayerState.Value;
|
|
if ((uint)value2 <= 1u || value2 == State.swiming)
|
|
{
|
|
if (Physics.Raycast(RayCheckTarget.position, RayCheckTarget.forward, out hit, RayDistance, boatInteractionMask))
|
|
{
|
|
BoatController componentInParent = hit.transform.GetComponentInParent<BoatController>();
|
|
if (componentInParent != null)
|
|
{
|
|
_boatController = componentInParent;
|
|
}
|
|
value = _boatController;
|
|
}
|
|
else
|
|
{
|
|
_boatController = null;
|
|
}
|
|
}
|
|
IsBoatInRange.Value = value;
|
|
}
|
|
}
|