mirror of
https://github.com/GTA-ASM/SanAndreasUnity
synced 2024-11-24 04:53:05 +00:00
112 lines
2.9 KiB
C#
112 lines
2.9 KiB
C#
using UnityEngine;
|
|
using SanAndreasUnity.Utilities;
|
|
using SanAndreasUnity.Behaviours.Vehicles;
|
|
using SanAndreasUnity.Behaviours.World;
|
|
using SanAndreasUnity.Importing.Animation;
|
|
|
|
namespace SanAndreasUnity.Behaviours.Peds.States
|
|
{
|
|
|
|
public class VehicleEnteringState : BaseVehicleState
|
|
{
|
|
PedModel PlayerModel { get { return m_ped.PlayerModel; } }
|
|
|
|
|
|
|
|
public override void OnBecameActive() {
|
|
|
|
}
|
|
|
|
public bool TryEnterVehicle(Vehicle vehicle, Vehicle.SeatAlignment seatAlignment, bool immediate = false)
|
|
{
|
|
if (!this.CanEnterVehicle (vehicle, seatAlignment))
|
|
return false;
|
|
|
|
|
|
Vehicle.Seat seat = vehicle.GetSeat (seatAlignment);
|
|
|
|
// switch state here
|
|
m_ped.SwitchState<VehicleEnteringState>();
|
|
|
|
this.CurrentVehicle = vehicle;
|
|
this.CurrentVehicleSeat = seat;
|
|
seat.OccupyingPed = m_ped;
|
|
|
|
m_ped.characterController.enabled = false;
|
|
|
|
|
|
if (m_ped.IsControlledByLocalPlayer)
|
|
{
|
|
if (m_ped.Camera != null) {
|
|
// m_ped.Camera.transform.SetParent (seat.Parent, true);
|
|
}
|
|
|
|
/*
|
|
SendToServer(_lastPassengerState = new PlayerPassengerState {
|
|
Vechicle = vehicle,
|
|
SeatAlignment = (int) seatAlignment
|
|
}, DeliveryMethod.ReliableOrdered, 1);
|
|
*/
|
|
}
|
|
|
|
m_ped.transform.SetParent(seat.Parent);
|
|
m_ped.transform.localPosition = Vector3.zero;
|
|
m_ped.transform.localRotation = Quaternion.identity;
|
|
|
|
if (m_ped.IsControlledByLocalPlayer && seat.IsDriver)
|
|
{
|
|
vehicle.StartControlling();
|
|
}
|
|
|
|
m_ped.PlayerModel.IsInVehicle = true;
|
|
|
|
|
|
if (!vehicle.IsNightToggled && WorldController.IsNight)
|
|
vehicle.IsNightToggled = true;
|
|
else if (vehicle.IsNightToggled && !WorldController.IsNight)
|
|
vehicle.IsNightToggled = false;
|
|
|
|
Debug.Log ("IsNightToggled? " + vehicle.IsNightToggled);
|
|
|
|
|
|
StartCoroutine (EnterVehicleAnimation (seat, immediate));
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
private System.Collections.IEnumerator EnterVehicleAnimation(Vehicle.Seat seat, bool immediate)
|
|
{
|
|
var animIndex = seat.IsLeftHand ? AnimIndex.GetInLeft : AnimIndex.GetInRight;
|
|
|
|
PlayerModel.VehicleParentOffset = Vector3.Scale(PlayerModel.GetAnim(AnimGroup.Car, animIndex).RootEnd, new Vector3(-1, -1, -1));
|
|
|
|
if (!immediate)
|
|
{
|
|
var animState = PlayerModel.PlayAnim(AnimGroup.Car, animIndex, PlayMode.StopAll);
|
|
animState.wrapMode = WrapMode.Once;
|
|
|
|
// TODO: also check if this state is still active state
|
|
while (animState.enabled)
|
|
{
|
|
yield return new WaitForEndOfFrame();
|
|
}
|
|
}
|
|
|
|
// TODO: check if this state is still active, and if vehicle is alive
|
|
|
|
|
|
// player now completely entered the vehicle
|
|
|
|
// call method from CarSittingState - he will switch state
|
|
m_ped.GetStateOrLogError<VehicleSittingState> ().EnterVehicle(this.CurrentVehicle, seat);
|
|
|
|
// this variable is not needed - it can be obtained based on current state
|
|
// IsInVehicleSeat = true;
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|