Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/PlayerVehicleController.cs
2026-03-04 09:37:33 +08:00

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;
}
}