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().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(); if (componentInParent != null) { _boatController = componentInParent; } value = _boatController; } else { _boatController = null; } } IsBoatInRange.Value = value; } }