SanAndreasUnity/Assets/Scripts/Behaviours/Ped/States/BaseVehicleState.cs

109 lines
2.6 KiB
C#
Raw Normal View History

2020-05-31 19:07:22 +02:00
using UnityEngine;
using SanAndreasUnity.Utilities;
using SanAndreasUnity.Behaviours.Vehicles;
namespace SanAndreasUnity.Behaviours.Peds.States
{
public class BaseVehicleState : BaseScriptState, IVehicleState
{
private Vehicle m_currentVehicle;
public Vehicle CurrentVehicle { get { return m_currentVehicle; } protected set { m_currentVehicle = value; } }
public Vehicle.Seat CurrentVehicleSeat { get; protected set; }
public Vehicle.SeatAlignment CurrentVehicleSeatAlignment { get { return this.CurrentVehicleSeat.Alignment; } }
2019-05-25 21:50:07 +02:00
public override void OnSwitchedStateByServer(byte[] data)
{
// extract vehicle and seat from data
var reader = new Mirror.NetworkReader(data);
GameObject vehicleGo = reader.ReadGameObject();
2019-05-25 23:38:12 +02:00
Vehicle.SeatAlignment seatAlignment = (Vehicle.SeatAlignment) reader.ReadSByte();
2019-05-25 21:50:07 +02:00
// assign params
this.CurrentVehicle = vehicleGo != null ? vehicleGo.GetComponent<Vehicle>() : null;
this.CurrentVehicleSeat = this.CurrentVehicle != null ? this.CurrentVehicle.GetSeat(seatAlignment) : null;
// switch state
m_ped.SwitchState(this.GetType());
}
2019-05-25 23:38:12 +02:00
public override byte[] GetAdditionalNetworkData()
{
var writer = new Mirror.NetworkWriter();
if (this.CurrentVehicle != null) {
writer.Write(this.CurrentVehicle.gameObject);
writer.Write((sbyte)this.CurrentVehicleSeatAlignment);
} else {
writer.Write((GameObject)null);
writer.Write((sbyte)Vehicle.SeatAlignment.None);
}
return writer.ToArray();
}
2019-04-29 01:15:24 +02:00
protected void Cleanup()
{
if (!m_ped.IsInVehicle)
{
m_ped.characterController.enabled = true;
m_ped.transform.SetParent(null, true);
m_model.IsInVehicle = false;
// enable network transform
if (m_ped.NetTransform != null)
m_ped.NetTransform.enabled = true;
2019-04-29 01:15:24 +02:00
}
2019-04-29 02:04:45 +02:00
2019-04-29 02:06:44 +02:00
if (this.CurrentVehicleSeat != null && this.CurrentVehicleSeat.OccupyingPed == m_ped)
2019-04-29 02:04:45 +02:00
this.CurrentVehicleSeat.OccupyingPed = null;
this.CurrentVehicle = null;
this.CurrentVehicleSeat = null;
2019-04-29 01:15:24 +02:00
}
2020-05-31 19:07:22 +02:00
protected override void UpdateHeading()
{
}
protected override void UpdateRotation()
{
}
protected override void UpdateMovement()
{
}
protected override void ConstrainRotation ()
{
}
public bool CanEnterVehicle (Vehicle vehicle, Vehicle.SeatAlignment seatAlignment)
{
if (m_ped.IsInVehicle)
return false;
if (m_ped.IsAiming || m_ped.WeaponHolder.IsFiring)
return false;
var seat = vehicle.GetSeat (seatAlignment);
if (null == seat)
return false;
// check if specified seat is taken
if (seat.IsTaken)
return false;
// everything is ok, we can enter vehicle
return true;
}
}
}