A vehicle seat component for HorizonRP. Extends the engine's BaseChair and blocks entry when the parent Vehicle is locked, not ready, on fire or wrecked, and prevents downed players from leaving on their own.
namespace HorizonRP;
/// <summary>
/// Un siège de véhicule. S'appuie sur BaseChair du moteur : E pour descendre, caméra et
/// animation assises fournies. On y ajoute la règle RP : un véhicule verrouillé
/// n'accepte personne, et l'on monte en maintenant E contre la portière (Vehicle).
/// </summary>
[Title( "Horizon RP – Siège de véhicule" )]
[Icon( "airline_seat_recline_normal" )]
public sealed class VehicleSeat : BaseChair
{
public Vehicle Vehicle => GetComponentInParent<Vehicle>();
/// <summary>0 = le conducteur, puis le passager avant, puis les rangées de derrière.</summary>
[Property, Sync( SyncFlags.FromHost )] public int Index { get; set; }
public bool IsDriver => Index == 0;
public override bool CanEnter( PlayerController player )
{
if ( !base.CanEnter( player ) )
return false;
var vehicle = Vehicle;
var rp = player.GetComponent<RoleplayPlayer>();
if ( vehicle is null || rp is null || !vehicle.Ready )
return false;
// Verrouillé, personne ne monte, propriétaire compris : il faut la clé (VehicleKeys). En feu
// ou en épave, personne non plus.
return !vehicle.Locked && vehicle.Usable;
}
/// <summary>Un inconscient installé par les secours (Ems/EmsActions.cs) ne descend pas seul : on le sort.</summary>
public override bool CanLeave( PlayerController player ) =>
player.GetComponent<RoleplayPlayer>() is not { Downed: true } && base.CanLeave( player );
public override IPressable.Tooltip? GetTooltip( IPressable.Event e )
{
var vehicle = Vehicle;
if ( vehicle is null )
return null;
if ( !vehicle.Usable )
return vehicle.UnusableTooltip;
return new IPressable.Tooltip( Vehicle.SeatLabel( this ), vehicle.Locked ? "lock" : "lock_open", vehicle.Locked ? "Verrouillé" : "Déverrouillé" );
}
}