using System.Diagnostics.CodeAnalysis; using Content.Shared.Buckle.Components; using Content.Shared.Vehicle.Components; using Robust.Shared.Containers; namespace Content.Shared.Vehicle.Systems; public sealed partial class VehicleSystem { [SubscribeLocalEvent] private void OnVehicleStrapped(Entity ent, ref StrappedEvent args) { if (!_vehicleQuery.TryComp(ent, out var vehicle)) return; TrySetOperator((ent, vehicle), args.Buckle); } [SubscribeLocalEvent] private void OnVehicleUnstrapped(Entity ent, ref UnstrappedEvent args) { if (!_vehicleQuery.TryComp(ent, out var vehicle)) return; if (vehicle.Operator != args.Buckle) return; TryRemoveOperator((ent, vehicle)); } [SubscribeLocalEvent] private void OnContainerEntInserted(Entity ent, ref EntInsertedIntoContainerMessage args) { if (_timing.ApplyingState || args.Container.ID != ent.Comp.ContainerId) return; if (!_vehicleQuery.TryComp(ent, out var vehicle)) return; TrySetOperator((ent, vehicle), args.Entity); } [SubscribeLocalEvent] private void OnContainerEntRemoved(Entity ent, ref EntRemovedFromContainerMessage args) { if (_timing.ApplyingState || args.Container.ID != ent.Comp.ContainerId) return; if (!_vehicleQuery.TryComp(ent, out var vehicle)) return; if (vehicle.Operator != args.Entity) return; TryRemoveOperator((ent, vehicle)); } /// /// Attempts to get the container configured for a container vehicle's operator. /// public bool TryGetOperatorContainer( Entity vehicle, [NotNullWhen(true)] out BaseContainer? container) { container = null; return Resolve(vehicle, ref vehicle.Comp, false) && _container.TryGetContainer(vehicle, vehicle.Comp.ContainerId, out container); } /// /// Checks whether an entity can enter a container vehicle. /// /// /// An entity becoming the operator must be able to operate the vehicle. /// Additional occupants do not need to be eligible operators. /// public bool CanEnter(Entity vehicle, EntityUid toEnter) { if (!Resolve(vehicle, ref vehicle.Comp, false)) return false; return CanEnterContainer(vehicle, toEnter) && (HasOperator(vehicle) || CanOperate(vehicle, toEnter)); } /// /// Checks whether an entity can physically enter a container vehicle without checking operator eligibility. /// private bool CanEnterContainer(Entity vehicle, EntityUid toEnter) { if (!Resolve(vehicle, ref vehicle.Comp, false)) return false; if (!_actionBlocker.CanMove(toEnter)) return false; if (GetOperatorOrNull(vehicle) == toEnter) return false; return TryGetOperatorContainer(vehicle.Owner, out var container) && _container.CanInsert(toEnter, container); } /// /// Attempts to insert an entity into a container vehicle. /// public bool TryEnter(Entity vehicle, EntityUid toEnter) { if (!CanEnter(vehicle, toEnter)) return false; if (!TryGetOperatorContainer(vehicle.Owner, out var container)) return false; return _container.Insert(toEnter, container); } /// /// Attempts to remove the current operator from a container vehicle. /// public bool TryExit(Entity vehicle) { if (!TryGetOperator(vehicle, out var operatorEnt)) return false; if (!TryGetOperatorContainer(vehicle.Owner, out var container)) return false; return _container.Remove(operatorEnt.Value.Owner, container); } }