Remove vehicles (#24681)
* Remove wheelchairs Vehicle code is dogwater and wheelchairs just keeps exposing edgecases. If someone wants it brought it back they can do vehicle refactor. * Also this one * Remove vehicles * goodbye vehicles * Remove this check * sasd * Cronch * Add sprites back * jani
This commit is contained in:
@@ -2,7 +2,6 @@ using Content.Client.Rotation;
|
||||
using Content.Shared.Buckle;
|
||||
using Content.Shared.Buckle.Components;
|
||||
using Content.Shared.Rotation;
|
||||
using Content.Shared.Vehicle.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
|
||||
namespace Content.Client.Buckle;
|
||||
@@ -26,9 +25,6 @@ internal sealed class BuckleSystem : SharedBuckleSystem
|
||||
if (!TryComp<SpriteComponent>(uid, out var ownerSprite))
|
||||
return;
|
||||
|
||||
if (HasComp<VehicleComponent>(component.LastEntityBuckledTo))
|
||||
return;
|
||||
|
||||
// Adjust draw depth when the chair faces north so that the seat back is drawn over the player.
|
||||
// Reset the draw depth when rotated in any other direction.
|
||||
// TODO when ECSing, make this a visualizer
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
using Content.Shared.Vehicle;
|
||||
using Content.Shared.Vehicle.Components;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Client.Vehicle;
|
||||
|
||||
public sealed class VehicleSystem : SharedVehicleSystem
|
||||
{
|
||||
[Dependency] private EyeSystem _eye = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<RiderComponent, ComponentStartup>(OnRiderStartup);
|
||||
SubscribeLocalEvent<RiderComponent, ComponentShutdown>(OnRiderShutdown);
|
||||
SubscribeLocalEvent<RiderComponent, ComponentHandleState>(OnRiderHandleState);
|
||||
SubscribeLocalEvent<VehicleComponent, AppearanceChangeEvent>(OnVehicleAppearanceChange);
|
||||
}
|
||||
|
||||
private void OnRiderStartup(EntityUid uid, RiderComponent component, ComponentStartup args)
|
||||
{
|
||||
// Center the player's eye on the vehicle
|
||||
if (TryComp(uid, out EyeComponent? eyeComp))
|
||||
{
|
||||
_eye.SetTarget(uid, eyeComp.Target ?? component.Vehicle, eyeComp);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRiderShutdown(EntityUid uid, RiderComponent component, ComponentShutdown args)
|
||||
{
|
||||
// reset the riders eye centering.
|
||||
if (TryComp(uid, out EyeComponent? eyeComp))
|
||||
{
|
||||
_eye.SetTarget(uid, null, eyeComp);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRiderHandleState(EntityUid uid, RiderComponent component, ref ComponentHandleState args)
|
||||
{
|
||||
if (args.Current is not RiderComponentState state)
|
||||
return;
|
||||
|
||||
var entity = EnsureEntity<RiderComponent>(state.Entity, uid);
|
||||
|
||||
if (TryComp(uid, out EyeComponent? eyeComp) && eyeComp.Target == component.Vehicle)
|
||||
{
|
||||
_eye.SetTarget(uid, entity, eyeComp);
|
||||
}
|
||||
|
||||
component.Vehicle = entity;
|
||||
}
|
||||
|
||||
private void OnVehicleAppearanceChange(EntityUid uid, VehicleComponent component, ref AppearanceChangeEvent args)
|
||||
{
|
||||
if (args.Sprite == null)
|
||||
return;
|
||||
|
||||
if (component.HideRider
|
||||
&& Appearance.TryGetData<bool>(uid, VehicleVisuals.HideRider, out var hide, args.Component)
|
||||
&& TryComp<SpriteComponent>(component.LastRider, out var riderSprite))
|
||||
riderSprite.Visible = !hide;
|
||||
|
||||
// First check is for the sprite itself
|
||||
if (Appearance.TryGetData<int>(uid, VehicleVisuals.DrawDepth, out var drawDepth, args.Component))
|
||||
args.Sprite.DrawDepth = drawDepth;
|
||||
|
||||
// Set vehicle layer to animated or not (i.e. are the wheels turning or not)
|
||||
if (component.AutoAnimate
|
||||
&& Appearance.TryGetData<bool>(uid, VehicleVisuals.AutoAnimate, out var autoAnimate, args.Component))
|
||||
args.Sprite.LayerSetAutoAnimated(VehicleVisualLayers.AutoAnimate, autoAnimate);
|
||||
}
|
||||
}
|
||||
|
||||
public enum VehicleVisualLayers : byte
|
||||
{
|
||||
/// Layer for the vehicle's wheels
|
||||
AutoAnimate,
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
using Content.Shared.Vehicle;
|
||||
|
||||
namespace Content.Server.Vehicle;
|
||||
|
||||
public sealed class VehicleSystem : SharedVehicleSystem
|
||||
{
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
using System.Numerics;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Vehicle;
|
||||
using Content.Shared.Whitelist;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
@@ -9,7 +8,7 @@ using Robust.Shared.Serialization;
|
||||
namespace Content.Shared.Buckle.Components;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
[Access(typeof(SharedBuckleSystem), typeof(SharedVehicleSystem))]
|
||||
[Access(typeof(SharedBuckleSystem))]
|
||||
public sealed partial class StrapComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -16,7 +16,6 @@ using Content.Shared.Standing;
|
||||
using Content.Shared.Storage.Components;
|
||||
using Content.Shared.Stunnable;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Vehicle.Components;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Physics.Events;
|
||||
@@ -124,16 +123,6 @@ public abstract partial class SharedBuckleSystem
|
||||
|
||||
private void OnBuckleStandAttempt(EntityUid uid, BuckleComponent component, StandAttemptEvent args)
|
||||
{
|
||||
//Let entities stand back up while on vehicles so that they can be knocked down when slept/stunned
|
||||
//This prevents an exploit that allowed people to become partially invulnerable to stuns
|
||||
//while on vehicles
|
||||
|
||||
if (component.BuckledTo != null)
|
||||
{
|
||||
var buckle = component.BuckledTo;
|
||||
if (TryComp<VehicleComponent>(buckle, out _))
|
||||
return;
|
||||
}
|
||||
if (component.Buckled)
|
||||
args.Cancel();
|
||||
}
|
||||
@@ -149,8 +138,7 @@ public abstract partial class SharedBuckleSystem
|
||||
if (component.LifeStage > ComponentLifeStage.Running)
|
||||
return;
|
||||
|
||||
if (component.Buckled &&
|
||||
!HasComp<VehicleComponent>(component.BuckledTo)) // buckle+vehicle shitcode
|
||||
if (component.Buckled) // buckle shitcode
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
@@ -436,10 +424,6 @@ public abstract partial class SharedBuckleSystem
|
||||
if (HasComp<SleepingComponent>(buckleUid) && buckleUid == userUid)
|
||||
return false;
|
||||
|
||||
// If the strap is a vehicle and the rider is not the person unbuckling, return. Unless the rider is crit or dead.
|
||||
if (TryComp<VehicleComponent>(strapUid, out var vehicle) && vehicle.Rider != userUid && !_mobState.IsIncapacitated(buckleUid))
|
||||
return false;
|
||||
|
||||
// If the person is crit or dead in any kind of strap, return. This prevents people from unbuckling themselves while incapacitated.
|
||||
if (_mobState.IsIncapacitated(buckleUid) && userUid == buckleUid)
|
||||
return false;
|
||||
|
||||
@@ -4,10 +4,10 @@ using Robust.Shared.Serialization;
|
||||
namespace Content.Shared.Foldable;
|
||||
|
||||
/// <summary>
|
||||
/// Used to create "foldable structures" that you can pickup like an item when folded. Used for rollerbeds and wheelchairs.
|
||||
/// Used to create "foldable structures" that you can pickup like an item when folded.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Wiill prevent any insertions into containers while this item is unfolded.
|
||||
/// Will prevent any insertions into containers while this item is unfolded.
|
||||
/// </remarks>
|
||||
[RegisterComponent]
|
||||
[NetworkedComponent]
|
||||
|
||||
@@ -4,7 +4,6 @@ namespace Content.Shared.Traits.Assorted;
|
||||
|
||||
/// <summary>
|
||||
/// Set player speed to zero and standing state to down, simulating leg paralysis.
|
||||
/// Used for Wheelchair bound trait.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))]
|
||||
public sealed partial class LegsParalyzedComponent : Component
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Vehicle.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// Added to objects inside a vehicle to stop people besides the rider from
|
||||
/// removing them.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class InVehicleComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The vehicle this rider is currently riding.
|
||||
/// </summary>
|
||||
[ViewVariables] public VehicleComponent? Vehicle;
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Vehicle.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Added to people when they are riding in a vehicle
|
||||
/// used mostly to keep track of them for entityquery.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class RiderComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The vehicle this rider is currently riding.
|
||||
/// </summary>
|
||||
[ViewVariables] public EntityUid? Vehicle;
|
||||
|
||||
public override bool SendOnlyToOwner => true;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class RiderComponentState : ComponentState
|
||||
{
|
||||
public NetEntity? Entity;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
using System.Numerics;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
|
||||
namespace Content.Shared.Vehicle.Components;
|
||||
|
||||
/// <summary>
|
||||
/// This is particularly for vehicles that use
|
||||
/// buckle. Stuff like clown cars may need a different
|
||||
/// component at some point.
|
||||
/// All vehicles should have Physics, Strap, and SharedPlayerInputMover components.
|
||||
/// </summary>
|
||||
[AutoGenerateComponentState]
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
[Access(typeof(SharedVehicleSystem))]
|
||||
public sealed partial class VehicleComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The entity currently riding the vehicle.
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
[AutoNetworkedField]
|
||||
public EntityUid? Rider;
|
||||
|
||||
[ViewVariables]
|
||||
[AutoNetworkedField]
|
||||
public EntityUid? LastRider;
|
||||
|
||||
/// <summary>
|
||||
/// The base offset for the vehicle (when facing east)
|
||||
/// </summary>
|
||||
[ViewVariables]
|
||||
public Vector2 BaseBuckleOffset = Vector2.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// The sound that the horn makes
|
||||
/// </summary>
|
||||
[DataField("hornSound")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public SoundSpecifier? HornSound = new SoundPathSpecifier("/Audio/Effects/Vehicle/carhorn.ogg")
|
||||
{
|
||||
Params = AudioParams.Default.WithVolume(-3f)
|
||||
};
|
||||
|
||||
[ViewVariables]
|
||||
public EntityUid? HonkPlayingStream;
|
||||
|
||||
/// Use ambient sound component for the idle sound.
|
||||
|
||||
[DataField("hornAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||
public string? HornAction = "ActionVehicleHorn";
|
||||
|
||||
/// <summary>
|
||||
/// The action for the horn (if any)
|
||||
/// </summary>
|
||||
[DataField("hornActionEntity")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? HornActionEntity;
|
||||
|
||||
/// <summary>
|
||||
/// Whether the vehicle has a key currently inside it or not.
|
||||
/// </summary>
|
||||
[DataField("hasKey")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool HasKey;
|
||||
|
||||
/// <summary>
|
||||
/// Determines from which side the vehicle will be displayed on top of the player.
|
||||
/// </summary>
|
||||
|
||||
[DataField("southOver")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool SouthOver;
|
||||
|
||||
[DataField("northOver")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool NorthOver;
|
||||
|
||||
[DataField("westOver")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool WestOver;
|
||||
|
||||
[DataField("eastOver")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool EastOver;
|
||||
|
||||
/// <summary>
|
||||
/// What the y buckle offset should be in north / south
|
||||
/// </summary>
|
||||
[DataField("northOverride")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public float NorthOverride;
|
||||
|
||||
/// <summary>
|
||||
/// What the y buckle offset should be in north / south
|
||||
/// </summary>
|
||||
[DataField("southOverride")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public float SouthOverride;
|
||||
|
||||
[DataField("autoAnimate")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool AutoAnimate = true;
|
||||
|
||||
[DataField("useHand")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool UseHand = true;
|
||||
|
||||
[DataField("hideRider")]
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool HideRider;
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.Physics.Pull;
|
||||
using Content.Shared.Vehicle.Components;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Vehicle;
|
||||
|
||||
public abstract partial class SharedVehicleSystem
|
||||
{
|
||||
private void InitializeRider()
|
||||
{
|
||||
SubscribeLocalEvent<RiderComponent, ComponentGetState>(OnRiderGetState);
|
||||
SubscribeLocalEvent<RiderComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted);
|
||||
SubscribeLocalEvent<RiderComponent, PullAttemptEvent>(OnPullAttempt);
|
||||
}
|
||||
|
||||
private void OnRiderGetState(EntityUid uid, RiderComponent component, ref ComponentGetState args)
|
||||
{
|
||||
args.State = new RiderComponentState()
|
||||
{
|
||||
Entity = GetNetEntity(component.Vehicle),
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Kick the rider off the vehicle if they press q / drop the virtual item
|
||||
/// </summary>
|
||||
private void OnVirtualItemDeleted(EntityUid uid, RiderComponent component, VirtualItemDeletedEvent args)
|
||||
{
|
||||
if (args.BlockingEntity == component.Vehicle)
|
||||
{
|
||||
_buckle.TryUnbuckle(uid, uid, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPullAttempt(EntityUid uid, RiderComponent component, PullAttemptEvent args)
|
||||
{
|
||||
if (component.Vehicle != null)
|
||||
args.Cancelled = true;
|
||||
}
|
||||
}
|
||||
@@ -1,374 +0,0 @@
|
||||
using System.Numerics;
|
||||
using Content.Shared.Access.Components;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Audio;
|
||||
using Content.Shared.Buckle;
|
||||
using Content.Shared.Buckle.Components;
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.Inventory.VirtualItem;
|
||||
using Content.Shared.Item;
|
||||
using Content.Shared.Light.Components;
|
||||
using Content.Shared.Movement.Components;
|
||||
using Content.Shared.Movement.Systems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Tag;
|
||||
using Content.Shared.Vehicle.Components;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Vehicle;
|
||||
|
||||
/// <summary>
|
||||
/// Stores the VehicleVisuals and shared event
|
||||
/// Nothing for a system but these need to be put somewhere in
|
||||
/// Content.Shared
|
||||
/// </summary>
|
||||
public abstract partial class SharedVehicleSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly INetManager _netManager = default!;
|
||||
|
||||
[Dependency] protected readonly SharedAppearanceSystem Appearance = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
|
||||
[Dependency] private readonly MovementSpeedModifierSystem _modifier = default!;
|
||||
[Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
[Dependency] private readonly TagSystem _tagSystem = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly SharedVirtualItemSystem _virtualItemSystem = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
|
||||
[Dependency] private readonly SharedJointSystem _joints = default!;
|
||||
[Dependency] private readonly SharedBuckleSystem _buckle = default!;
|
||||
[Dependency] private readonly SharedMoverController _mover = default!;
|
||||
|
||||
private const string KeySlot = "key_slot";
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
InitializeRider();
|
||||
|
||||
SubscribeLocalEvent<VehicleComponent, ComponentStartup>(OnVehicleStartup);
|
||||
SubscribeLocalEvent<VehicleComponent, BuckleChangeEvent>(OnBuckleChange);
|
||||
SubscribeLocalEvent<VehicleComponent, HonkActionEvent>(OnHonkAction);
|
||||
SubscribeLocalEvent<VehicleComponent, EntInsertedIntoContainerMessage>(OnEntInserted);
|
||||
SubscribeLocalEvent<VehicleComponent, EntRemovedFromContainerMessage>(OnEntRemoved);
|
||||
SubscribeLocalEvent<VehicleComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovementSpeedModifiers);
|
||||
SubscribeLocalEvent<VehicleComponent, MoveEvent>(OnMoveEvent);
|
||||
SubscribeLocalEvent<VehicleComponent, GetAdditionalAccessEvent>(OnGetAdditionalAccess);
|
||||
|
||||
SubscribeLocalEvent<InVehicleComponent, GettingPickedUpAttemptEvent>(OnGettingPickedUpAttempt);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This just controls whether the wheels are turning.
|
||||
/// </summary>
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
var vehicleQuery = EntityQueryEnumerator<VehicleComponent, InputMoverComponent>();
|
||||
while (vehicleQuery.MoveNext(out var uid, out var vehicle, out var mover))
|
||||
{
|
||||
if (!vehicle.AutoAnimate)
|
||||
continue;
|
||||
|
||||
// Why is this updating appearance data every tick, instead of when it needs to be updated???
|
||||
|
||||
if (_mover.GetVelocityInput(mover).Sprinting == Vector2.Zero)
|
||||
{
|
||||
UpdateAutoAnimate(uid, false);
|
||||
continue;
|
||||
}
|
||||
|
||||
UpdateAutoAnimate(uid, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnVehicleStartup(EntityUid uid, VehicleComponent component, ComponentStartup args)
|
||||
{
|
||||
UpdateDrawDepth(uid, 2);
|
||||
|
||||
// This code should be purged anyway but with that being said this doesn't handle components being changed.
|
||||
if (TryComp<StrapComponent>(uid, out var strap))
|
||||
{
|
||||
component.BaseBuckleOffset = strap.BuckleOffsetClamped;
|
||||
strap.BuckleOffset = Vector2.Zero;
|
||||
}
|
||||
|
||||
_modifier.RefreshMovementSpeedModifiers(uid);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Give the user the rider component if they're buckling to the vehicle,
|
||||
/// otherwise remove it.
|
||||
/// </summary>
|
||||
private void OnBuckleChange(EntityUid uid, VehicleComponent component, ref BuckleChangeEvent args)
|
||||
{
|
||||
// Add Rider
|
||||
if (args.Buckling)
|
||||
{
|
||||
if (component.UseHand == true)
|
||||
{
|
||||
// Add a virtual item to rider's hand, unbuckle if we can't.
|
||||
if (!_virtualItemSystem.TrySpawnVirtualItemInHand(uid, args.BuckledEntity))
|
||||
{
|
||||
_buckle.TryUnbuckle(uid, uid, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Set up the rider and vehicle with each other
|
||||
EnsureComp<InputMoverComponent>(uid);
|
||||
var rider = EnsureComp<RiderComponent>(args.BuckledEntity);
|
||||
component.Rider = args.BuckledEntity;
|
||||
component.LastRider = component.Rider;
|
||||
Dirty(component);
|
||||
Appearance.SetData(uid, VehicleVisuals.HideRider, true);
|
||||
|
||||
_mover.SetRelay(args.BuckledEntity, uid);
|
||||
rider.Vehicle = uid;
|
||||
|
||||
// Update appearance stuff, add actions
|
||||
UpdateBuckleOffset(uid, Transform(uid), component);
|
||||
if (TryComp<InputMoverComponent>(uid, out var mover))
|
||||
UpdateDrawDepth(uid, GetDrawDepth(Transform(uid), component, mover.RelativeRotation.Degrees));
|
||||
|
||||
if (TryComp<ActionsComponent>(args.BuckledEntity, out var actions) && TryComp<UnpoweredFlashlightComponent>(uid, out var flashlight))
|
||||
{
|
||||
_actionsSystem.AddAction(args.BuckledEntity, ref flashlight.ToggleActionEntity, flashlight.ToggleAction, uid, actions);
|
||||
}
|
||||
|
||||
if (component.HornSound != null)
|
||||
{
|
||||
_actionsSystem.AddAction(args.BuckledEntity, ref component.HornActionEntity, component.HornAction, uid, actions);
|
||||
}
|
||||
|
||||
_joints.ClearJoints(args.BuckledEntity);
|
||||
|
||||
_tagSystem.AddTag(uid, "DoorBumpOpener");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove rider
|
||||
|
||||
// Clean up actions and virtual items
|
||||
_actionsSystem.RemoveProvidedActions(args.BuckledEntity, uid);
|
||||
|
||||
if (component.UseHand == true)
|
||||
_virtualItemSystem.DeleteInHandsMatching(args.BuckledEntity, uid);
|
||||
|
||||
|
||||
// Entity is no longer riding
|
||||
RemComp<RiderComponent>(args.BuckledEntity);
|
||||
RemComp<RelayInputMoverComponent>(args.BuckledEntity);
|
||||
_tagSystem.RemoveTag(uid, "DoorBumpOpener");
|
||||
|
||||
Appearance.SetData(uid, VehicleVisuals.HideRider, false);
|
||||
// Reset component
|
||||
component.Rider = null;
|
||||
Dirty(component);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This fires when the rider presses the honk action
|
||||
/// </summary>
|
||||
private void OnHonkAction(EntityUid uid, VehicleComponent vehicle, HonkActionEvent args)
|
||||
{
|
||||
if (args.Handled || vehicle.HornSound == null)
|
||||
return;
|
||||
|
||||
// TODO: Need audio refactor maybe, just some way to null it when the stream is over.
|
||||
// For now better to just not loop to keep the code much cleaner.
|
||||
vehicle.HonkPlayingStream = _audioSystem.PlayPredicted(vehicle.HornSound, uid, uid)?.Entity;
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handle adding keys to the ignition, give stuff the InVehicleComponent so it can't be picked
|
||||
/// up by people not in the vehicle.
|
||||
/// </summary>
|
||||
private void OnEntInserted(EntityUid uid, VehicleComponent component, EntInsertedIntoContainerMessage args)
|
||||
{
|
||||
if (args.Container.ID != KeySlot ||
|
||||
!_tagSystem.HasTag(args.Entity, "VehicleKey"))
|
||||
return;
|
||||
|
||||
// Enable vehicle
|
||||
var inVehicle = EnsureComp<InVehicleComponent>(args.Entity);
|
||||
inVehicle.Vehicle = component;
|
||||
|
||||
component.HasKey = true;
|
||||
|
||||
var msg = Loc.GetString("vehicle-use-key",
|
||||
("keys", args.Entity), ("vehicle", uid));
|
||||
if (_netManager.IsServer)
|
||||
_popupSystem.PopupEntity(msg, uid, args.OldParent, PopupType.Medium);
|
||||
|
||||
// Audiovisual feedback
|
||||
_ambientSound.SetAmbience(uid, true);
|
||||
_modifier.RefreshMovementSpeedModifiers(uid);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Turn off the engine when key is removed.
|
||||
/// </summary>
|
||||
private void OnEntRemoved(EntityUid uid, VehicleComponent component, EntRemovedFromContainerMessage args)
|
||||
{
|
||||
if (args.Container.ID != KeySlot || !RemComp<InVehicleComponent>(args.Entity))
|
||||
return;
|
||||
|
||||
// Disable vehicle
|
||||
component.HasKey = false;
|
||||
_ambientSound.SetAmbience(uid, false);
|
||||
_modifier.RefreshMovementSpeedModifiers(uid);
|
||||
}
|
||||
|
||||
private void OnRefreshMovementSpeedModifiers(EntityUid uid, VehicleComponent component, RefreshMovementSpeedModifiersEvent args)
|
||||
{
|
||||
if (!component.HasKey)
|
||||
{
|
||||
args.ModifySpeed(0f, 0f);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Shitcode, needs to use sprites instead of actual offsets.
|
||||
private void OnMoveEvent(EntityUid uid, VehicleComponent component, ref MoveEvent args)
|
||||
{
|
||||
if (args.NewRotation == args.OldRotation)
|
||||
return;
|
||||
|
||||
// This first check is just for safety
|
||||
if (component.AutoAnimate && !HasComp<InputMoverComponent>(uid))
|
||||
{
|
||||
UpdateAutoAnimate(uid, false);
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateBuckleOffset(uid, args.Component, component);
|
||||
if (TryComp<InputMoverComponent>(uid, out var mover))
|
||||
UpdateDrawDepth(uid, GetDrawDepth(args.Component, component, mover.RelativeRotation));
|
||||
}
|
||||
|
||||
private void OnGettingPickedUpAttempt(EntityUid uid, InVehicleComponent component, GettingPickedUpAttemptEvent args)
|
||||
{
|
||||
if (component.Vehicle == null || component.Vehicle.Rider != null && component.Vehicle.Rider != args.User)
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Depending on which direction the vehicle is facing,
|
||||
/// change its draw depth. Vehicles can choose between special drawdetph
|
||||
/// when facing north or south. East and west are easy.
|
||||
/// </summary>
|
||||
private int GetDrawDepth(TransformComponent xform, VehicleComponent component, Angle cameraAngle)
|
||||
{
|
||||
var itemDirection = cameraAngle.GetDir() switch
|
||||
{
|
||||
Direction.South => xform.LocalRotation.GetDir(),
|
||||
Direction.North => xform.LocalRotation.RotateDir(Direction.North),
|
||||
Direction.West => xform.LocalRotation.RotateDir(Direction.East),
|
||||
Direction.East => xform.LocalRotation.RotateDir(Direction.West),
|
||||
_ => Direction.South
|
||||
};
|
||||
|
||||
return itemDirection switch
|
||||
{
|
||||
Direction.North => component.NorthOver
|
||||
? (int) DrawDepth.DrawDepth.Doors
|
||||
: (int) DrawDepth.DrawDepth.WallMountedItems,
|
||||
Direction.South => component.SouthOver
|
||||
? (int) DrawDepth.DrawDepth.Doors
|
||||
: (int) DrawDepth.DrawDepth.WallMountedItems,
|
||||
Direction.West => component.WestOver
|
||||
? (int) DrawDepth.DrawDepth.Doors
|
||||
: (int) DrawDepth.DrawDepth.WallMountedItems,
|
||||
Direction.East => component.EastOver
|
||||
? (int) DrawDepth.DrawDepth.Doors
|
||||
: (int) DrawDepth.DrawDepth.WallMountedItems,
|
||||
_ => (int) DrawDepth.DrawDepth.WallMountedItems
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Change the buckle offset based on what direction the vehicle is facing and
|
||||
/// teleport any buckled entities to it. This is the most crucial part of making
|
||||
/// buckled vehicles work.
|
||||
/// </summary>
|
||||
private void UpdateBuckleOffset(EntityUid uid, TransformComponent xform, VehicleComponent component)
|
||||
{
|
||||
if (!TryComp<StrapComponent>(uid, out var strap))
|
||||
return;
|
||||
|
||||
// TODO: Strap should handle this but buckle E/C moment.
|
||||
var oldOffset = strap.BuckleOffset;
|
||||
|
||||
strap.BuckleOffset = xform.LocalRotation.Degrees switch
|
||||
{
|
||||
< 45f => new(0, component.SouthOverride),
|
||||
<= 135f => component.BaseBuckleOffset,
|
||||
< 225f => new(0, component.NorthOverride),
|
||||
<= 315f => new(component.BaseBuckleOffset.X * -1, component.BaseBuckleOffset.Y),
|
||||
_ => new(0, component.SouthOverride)
|
||||
};
|
||||
|
||||
if (!oldOffset.Equals(strap.BuckleOffset))
|
||||
Dirty(strap);
|
||||
|
||||
foreach (var buckledEntity in strap.BuckledEntities)
|
||||
{
|
||||
var buckleXform = Transform(buckledEntity);
|
||||
_transform.SetLocalPositionNoLerp(buckleXform, strap.BuckleOffsetClamped);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGetAdditionalAccess(EntityUid uid, VehicleComponent component, ref GetAdditionalAccessEvent args)
|
||||
{
|
||||
if (component.Rider == null)
|
||||
return;
|
||||
args.Entities.Add(component.Rider.Value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the draw depth for the sprite.
|
||||
/// </summary>
|
||||
private void UpdateDrawDepth(EntityUid uid, int drawDepth)
|
||||
{
|
||||
Appearance.SetData(uid, VehicleVisuals.DrawDepth, drawDepth);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set whether the vehicle's base layer is animating or not.
|
||||
/// </summary>
|
||||
private void UpdateAutoAnimate(EntityUid uid, bool autoAnimate)
|
||||
{
|
||||
Appearance.SetData(uid, VehicleVisuals.AutoAnimate, autoAnimate);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Stores the vehicle's draw depth mostly
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public enum VehicleVisuals : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// What layer the vehicle should draw on (assumed integer)
|
||||
/// </summary>
|
||||
DrawDepth,
|
||||
/// <summary>
|
||||
/// Whether the wheels should be turning
|
||||
/// </summary>
|
||||
AutoAnimate,
|
||||
HideRider
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when someone honks a vehicle horn
|
||||
/// </summary>
|
||||
public sealed partial class HonkActionEvent : InstantActionEvent
|
||||
{
|
||||
}
|
||||
@@ -27,9 +27,6 @@ trait-pirate-accent-desc = You can't stop speaking like a pirate!
|
||||
trait-accentless-name = Accentless
|
||||
trait-accentless-desc = You don't have the accent that your species would usually have
|
||||
|
||||
trait-wheelchair-bound-name = Wheelchair Bound
|
||||
trait-wheelchair-bound-desc = You cannot move without your wheelchair. Wheelchair included.
|
||||
|
||||
trait-frontal-lisp-name = Frontal Lisp
|
||||
trait-frontal-lisp-desc = You thpeak with a lithp
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
vehicle-use-key = You use {THE($keys)} to start {THE($vehicle)}.
|
||||
|
||||
vehicle-slot-component-slot-name-keys = Keys
|
||||
@@ -118,16 +118,6 @@
|
||||
category: Fun
|
||||
group: market
|
||||
|
||||
- type: cargoProduct
|
||||
id: FunATV
|
||||
icon:
|
||||
sprite: Objects/Vehicles/atv.rsi
|
||||
state: vehicle
|
||||
product: CrateFunATV
|
||||
cost: 1500
|
||||
category: Fun
|
||||
group: market
|
||||
|
||||
- type: cargoProduct
|
||||
id: FunSadTromboneImplants
|
||||
icon:
|
||||
|
||||
@@ -181,17 +181,6 @@
|
||||
- id: DiceBag
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
id: CrateFunATV
|
||||
parent: CrateLivestock
|
||||
name: ATV crate
|
||||
description: An Absolutely Taxable Vehicle to help cargo with hauling.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: VehicleATV
|
||||
- id: VehicleKeyATV
|
||||
|
||||
- type: entity
|
||||
id: CrateFunSadTromboneImplants
|
||||
parent: CrateGenericSteel
|
||||
@@ -258,17 +247,6 @@
|
||||
- id: WeaponWaterPistol
|
||||
amount: 4
|
||||
|
||||
- type: entity
|
||||
id: CrateFunSyndicateSegway
|
||||
parent: CrateLivestock
|
||||
name: Syndicate segway crate
|
||||
description: A crate containing a two-wheeler that will help you escape from the security officers. Or not.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: VehicleSyndicateSegway
|
||||
- id: VehicleKeySyndicateSegway
|
||||
|
||||
- type: entity
|
||||
id: CrateFunBoxing
|
||||
parent: CrateGenericSteel
|
||||
@@ -320,7 +298,6 @@
|
||||
- id: MrDips
|
||||
orGroup: Giftpool
|
||||
- id: RevolverCapGun
|
||||
- id: VehicleUnicycleFolded
|
||||
- id: ClothingShoesClownLarge
|
||||
- id: ClothingHeadHatMagician
|
||||
- id: BeachBall
|
||||
|
||||
@@ -1431,22 +1431,6 @@
|
||||
categories:
|
||||
- UplinkMisc
|
||||
|
||||
- type: listing
|
||||
id: UplinkSyndicateSegwayCrate
|
||||
name: uplink-syndicate-segway-crate-name
|
||||
description: uplink-syndicate-segway-crate-desc
|
||||
icon: { sprite: /Textures/Objects/Vehicles/syndicatesegway.rsi, state: icon }
|
||||
productEntity: CrateFunSyndicateSegway
|
||||
cost:
|
||||
Telecrystal: 5
|
||||
categories:
|
||||
- UplinkMisc
|
||||
conditions:
|
||||
- !type:BuyerWhitelistCondition
|
||||
blacklist:
|
||||
components:
|
||||
- SurplusBundle
|
||||
|
||||
- type: listing
|
||||
id: UplinkBribe
|
||||
name: uplink-bribe-name
|
||||
|
||||
@@ -222,7 +222,6 @@
|
||||
- HolosignProjector
|
||||
- Plunger
|
||||
- LightReplacer
|
||||
- JanicartKeys
|
||||
components:
|
||||
- LightReplacer
|
||||
- type: ItemMapper
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
- type: entity
|
||||
name: Secway Spawner
|
||||
id: SpawnVehicleSecway
|
||||
parent: MarkerBase
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: Objects/Vehicles/secway.rsi
|
||||
state: keys
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- VehicleSecway
|
||||
|
||||
- type: entity
|
||||
name: Janicart Spawner
|
||||
id: SpawnVehicleJanicart
|
||||
parent: MarkerBase
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: Objects/Vehicles/janicart.rsi
|
||||
state: keys
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- VehicleJanicart
|
||||
|
||||
- type: entity
|
||||
name: ATV Spawner
|
||||
id: SpawnVehicleATV
|
||||
parent: MarkerBase
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: Objects/Vehicles/atv.rsi
|
||||
state: keys
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- VehicleATV
|
||||
|
||||
- type: entity
|
||||
name: Motobike Spawner
|
||||
id: SpawnVehicleMotobike
|
||||
parent: MarkerBase
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: Objects/Vehicles/motorbike.rsi
|
||||
state: keys
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- VehicleSkeletonMotorcycle
|
||||
|
||||
- type: entity
|
||||
name: Wheelchair Spawner
|
||||
id: SpawnVehicleWheelchair
|
||||
parent: MarkerBase
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: Objects/Vehicles/wheelchair.rsi
|
||||
state: vehicle
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- VehicleWheelchair
|
||||
|
||||
- type: entity
|
||||
name: Wheelchair [Folded] Spawner
|
||||
id: SpawnVehicleWheelchairFolded
|
||||
parent: MarkerBase
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: green
|
||||
- sprite: Objects/Vehicles/wheelchair.rsi
|
||||
state: vehicle_folded
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- VehicleWheelchairFolded
|
||||
@@ -108,77 +108,6 @@
|
||||
proto: robot
|
||||
- type: ZombieImmune
|
||||
|
||||
- type: entity
|
||||
parent: [ MobSiliconBase, BaseVehicle]
|
||||
id: MobSiliconBaseVehicle # for vehicles
|
||||
abstract: true
|
||||
components:
|
||||
- type: NoSlip
|
||||
- type: GhostTakeoverAvailable
|
||||
- type: GhostRole
|
||||
makeSentient: true
|
||||
- type: UnpoweredFlashlight
|
||||
- type: PointLight
|
||||
enabled: false
|
||||
radius: 3.5
|
||||
softness: 2
|
||||
mask: /Textures/Effects/LightMasks/cone.png
|
||||
autoRot: true
|
||||
|
||||
- type: entity
|
||||
parent: MobSiliconBaseVehicle
|
||||
id: MobTaxiBot
|
||||
name: taxibot
|
||||
description: Give a ride?
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Mobs/Silicon/Bots/taxibot.rsi
|
||||
layers:
|
||||
- state: taxibot
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
- type: GhostRole
|
||||
name: ghost-role-information-taxibot-name
|
||||
description: ghost-role-information-taxibot-description
|
||||
- type: Strap
|
||||
buckleOffset: "0, 0"
|
||||
maxBuckleDistance: 1
|
||||
- type: Construction
|
||||
graph: TaxiBot
|
||||
node: bot
|
||||
|
||||
- type: entity
|
||||
parent: MobSiliconBaseVehicle
|
||||
id: MobSupplyBot
|
||||
name: supplybot
|
||||
description: Delivers cargo!
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Mobs/Silicon/Bots/supplybot.rsi
|
||||
layers:
|
||||
- state: supplybot
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
- type: GhostRole
|
||||
name: ghost-role-information-supplybot-name
|
||||
description: ghost-role-information-supplybot-description
|
||||
- type: Construction
|
||||
graph: SupplyBot
|
||||
node: bot
|
||||
- type: Storage
|
||||
maxItemSize: Huge
|
||||
grid:
|
||||
- 0,0,9,3
|
||||
- type: Access
|
||||
groups:
|
||||
- Cargo
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
type: StorageBoundUserInterface
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
parent: MobSiliconBase
|
||||
id: MobHonkBot
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
- type: entity
|
||||
id: ActionVehicleHorn
|
||||
name: Honk
|
||||
description: Honk!
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: InstantAction
|
||||
useDelay: 3.4
|
||||
icon: Objects/Fun/bikehorn.rsi/icon.png
|
||||
event: !type:HonkActionEvent
|
||||
@@ -1,462 +0,0 @@
|
||||
- type: entity
|
||||
id: BaseVehicle
|
||||
save: false
|
||||
abstract: true
|
||||
components:
|
||||
- type: AmbientSound
|
||||
sound: "/Audio/Effects/Vehicle/vehicleengineidle.ogg"
|
||||
range: 10
|
||||
volume: -10
|
||||
enabled: false
|
||||
- type: MovementSpeedModifier
|
||||
weightlessModifier: 0
|
||||
acceleration: 2
|
||||
friction: 2
|
||||
frictionNoInput: 6
|
||||
baseWalkSpeed: 4.5
|
||||
baseSprintSpeed: 6
|
||||
- type: Repairable
|
||||
fuelcost: 20
|
||||
doAfterDelay: 20
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: Metallic
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 600
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 300
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalGlassBreak
|
||||
- !type:ExplodeBehavior
|
||||
|
||||
- type: entity
|
||||
parent: BaseVehicle
|
||||
id: BaseVehicleRideable
|
||||
abstract: true
|
||||
name: Vehicle
|
||||
components:
|
||||
- type: Strap
|
||||
buckleOffset: "0.10, 0.36"
|
||||
maxBuckleDistance: 1
|
||||
- type: InputMover
|
||||
- type: InteractionOutline
|
||||
- type: Vehicle
|
||||
- type: Pullable
|
||||
- type: Physics
|
||||
bodyType: KinematicController
|
||||
- type: Clickable
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
fix1:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.4
|
||||
density: 360
|
||||
restitution: 0.0
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
- TableLayer
|
||||
- type: Appearance
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
key_slot: #this slot name is important
|
||||
name: vehicle-slot-component-slot-name-keys
|
||||
whitelist:
|
||||
requireAll: true
|
||||
tags:
|
||||
- VehicleKey
|
||||
insertSound:
|
||||
path: /Audio/Effects/Vehicle/vehiclestartup.ogg
|
||||
params:
|
||||
volume: -3
|
||||
- type: StaticPrice
|
||||
price: 750 # Grand Theft Auto.
|
||||
|
||||
- type: entity
|
||||
id: VehicleJanicart
|
||||
parent: BaseVehicleRideable
|
||||
name: janicart
|
||||
description: The janitor's trusty steed.
|
||||
components:
|
||||
- type: Vehicle
|
||||
southOver: true
|
||||
westOver: true
|
||||
eastOver: true
|
||||
northOverride: -0.15
|
||||
southOverride: 0.22
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/janicart.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
noRot: true
|
||||
- type: UnpoweredFlashlight
|
||||
- type: PointLight
|
||||
enabled: false
|
||||
radius: 3.5
|
||||
softness: 2
|
||||
mask: /Textures/Effects/LightMasks/cone.png
|
||||
autoRot: true
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 500
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 250
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalGlassBreak
|
||||
- !type:ExplodeBehavior
|
||||
- !type:SpawnEntitiesBehavior # in future should also emit a cloud of hot gas
|
||||
spawn:
|
||||
VehicleJanicartDestroyed:
|
||||
min: 1
|
||||
max: 1
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
key_slot:
|
||||
name: vehicle-slot-component-slot-name-keys
|
||||
whitelist:
|
||||
requireAll: true
|
||||
tags:
|
||||
- VehicleKey
|
||||
- JanicartKeys
|
||||
insertSound:
|
||||
path: /Audio/Effects/Vehicle/vehiclestartup.ogg
|
||||
params:
|
||||
volume: -3
|
||||
trashbag_slot:
|
||||
name: janitorial-trolley-slot-component-slot-name-trashbag
|
||||
whitelist:
|
||||
tags:
|
||||
- TrashBag
|
||||
- type: ItemMapper
|
||||
mapLayers:
|
||||
storage:
|
||||
whitelist:
|
||||
tags:
|
||||
- TrashBag
|
||||
sprite: Objects/Vehicles/janicart.rsi
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
id: VehicleJanicartDestroyed
|
||||
parent: MachineFrameDestroyed
|
||||
name: destroyed janicart
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/janicart.rsi
|
||||
state: destroyed
|
||||
|
||||
- type: entity
|
||||
id: VehicleSecway
|
||||
parent: BaseVehicleRideable
|
||||
name: secway
|
||||
description: The future of transportation. Popularized by St. James, the patron saint of security officers and internet forum moderators.
|
||||
components:
|
||||
- type: Vehicle
|
||||
northOver: true
|
||||
westOver: true
|
||||
eastOver: true
|
||||
northOverride: -0.1
|
||||
southOverride: 0.1
|
||||
hornSound:
|
||||
path: /Audio/Effects/Vehicle/policesiren.ogg
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/secway.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
noRot: true
|
||||
- type: Strap
|
||||
buckleOffset: "0.15, -0.05"
|
||||
maxBuckleDistance: 1
|
||||
- type: MovementSpeedModifier
|
||||
acceleration: 1
|
||||
friction: 1
|
||||
baseWalkSpeed: 4.5
|
||||
baseSprintSpeed: 6
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.8
|
||||
Slash: 0.6
|
||||
Piercing: 0.85
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
key_slot:
|
||||
name: vehicle-slot-component-slot-name-keys
|
||||
whitelist:
|
||||
requireAll: true
|
||||
tags:
|
||||
- VehicleKey
|
||||
- SecwayKeys
|
||||
insertSound:
|
||||
path: /Audio/Effects/Vehicle/vehiclestartup.ogg
|
||||
params:
|
||||
volume: -3
|
||||
- type: StealTarget
|
||||
stealGroup: VehicleSecway
|
||||
|
||||
- type: entity
|
||||
parent: BaseVehicleRideable
|
||||
id: VehicleATV
|
||||
name: ATV
|
||||
description: All-Tile Vehicle.
|
||||
components:
|
||||
- type: Vehicle
|
||||
southOver: true
|
||||
northOver: true
|
||||
northOverride: -0.1
|
||||
southOverride: 0.1
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/atv.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
noRot: true
|
||||
- type: RandomMetadata
|
||||
descriptionSegments: [ATVDescriptions]
|
||||
- type: MovementSpeedModifier
|
||||
acceleration: 1
|
||||
friction: 1
|
||||
baseWalkSpeed: 4.5
|
||||
baseSprintSpeed: 7
|
||||
- type: Strap
|
||||
buckleOffset: "0.1, -0.05"
|
||||
maxBuckleDistance: 1
|
||||
- type: UnpoweredFlashlight
|
||||
- type: PointLight
|
||||
enabled: false
|
||||
radius: 3.5
|
||||
softness: 2
|
||||
mask: /Textures/Effects/LightMasks/cone.png
|
||||
autoRot: true
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
key_slot:
|
||||
name: vehicle-slot-component-slot-name-keys
|
||||
whitelist:
|
||||
requireAll: true
|
||||
tags:
|
||||
- VehicleKey
|
||||
- ATVKeys
|
||||
insertSound:
|
||||
path: /Audio/Effects/Vehicle/vehiclestartup.ogg
|
||||
params:
|
||||
volume: -3
|
||||
|
||||
- type: entity
|
||||
id: VehicleSyndicateSegway
|
||||
parent: BaseVehicleRideable
|
||||
name: syndicate segway
|
||||
description: Be an enemy of the corporation, in style.
|
||||
components:
|
||||
- type: Vehicle
|
||||
southOver: true
|
||||
westOver: true
|
||||
eastOver: true
|
||||
northOverride: -0.1
|
||||
southOverride: 0.1
|
||||
hornSound:
|
||||
path: /Audio/Effects/Vehicle/policesiren.ogg
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/syndicatesegway.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
noRot: true
|
||||
- type: Strap
|
||||
buckleOffset: "0.15, -0.05"
|
||||
maxBuckleDistance: 1
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.8
|
||||
Slash: 0.6
|
||||
Piercing: 0.85
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
key_slot:
|
||||
name: vehicle-slot-component-slot-name-keys
|
||||
whitelist:
|
||||
requireAll: true
|
||||
tags:
|
||||
- VehicleKey
|
||||
- SyndicateSegwayKeys
|
||||
insertSound:
|
||||
path: /Audio/Effects/Vehicle/vehiclestartup.ogg
|
||||
params:
|
||||
volume: -3
|
||||
|
||||
- type: entity
|
||||
parent: BaseVehicleRideable
|
||||
id: VehicleSkeletonMotorcycle
|
||||
name: skeleton motorcycle
|
||||
description: Bad to the Bone.
|
||||
components:
|
||||
- type: Vehicle
|
||||
southOver: true
|
||||
northOver: true
|
||||
northOverride: -0.1
|
||||
southOverride: 0.1
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/motorbike.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate"]
|
||||
noRot: true
|
||||
- type: Strap
|
||||
buckleOffset: "0.1, -0.05"
|
||||
maxBuckleDistance: 1
|
||||
- type: MovementSpeedModifier
|
||||
acceleration: 2
|
||||
friction: 1.5
|
||||
baseWalkSpeed: 4.5
|
||||
baseSprintSpeed: 7
|
||||
- type: UnpoweredFlashlight
|
||||
- type: PointLight
|
||||
enabled: false
|
||||
radius: 3.5
|
||||
softness: 2
|
||||
mask: /Textures/Effects/LightMasks/cone.png
|
||||
autoRot: true
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
key_slot:
|
||||
name: vehicle-slot-component-slot-name-keys
|
||||
whitelist:
|
||||
requireAll: true
|
||||
tags:
|
||||
- VehicleKey
|
||||
- SkeletonMotorcycleKeys
|
||||
insertSound:
|
||||
path: /Audio/Effects/Vehicle/vehiclestartup.ogg
|
||||
params:
|
||||
volume: -3
|
||||
|
||||
- type: entity
|
||||
id: VehicleUnicycle
|
||||
parent: [BaseVehicleRideable, BaseFoldable, BaseItem]
|
||||
name: unicycle
|
||||
description: It only has one wheel!
|
||||
components:
|
||||
- type: Vehicle
|
||||
northOver: true
|
||||
southOver: true
|
||||
northOverride: -0.15
|
||||
southOverride: 0.15
|
||||
hasKey: true
|
||||
hornSound:
|
||||
path: /Audio/Effects/Vehicle/bicyclebell.ogg
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/unicycle.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate", "unfoldedLayer"]
|
||||
- state: vehicle_folded
|
||||
map: ["foldedLayer"]
|
||||
visible: false
|
||||
noRot: true
|
||||
- type: Strap
|
||||
buckleOffset: "0.1, -0.05"
|
||||
maxBuckleDistance: 1
|
||||
- type: MovementSpeedModifier
|
||||
acceleration: 1
|
||||
friction: 0.8
|
||||
baseWalkSpeed: 3.5
|
||||
baseSprintSpeed: 4.3
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 200
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 240
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalBreak
|
||||
|
||||
- type: entity
|
||||
parent: VehicleUnicycle
|
||||
id: VehicleUnicycleFolded
|
||||
suffix: folded
|
||||
components:
|
||||
- type: Foldable
|
||||
folded: true
|
||||
|
||||
- type: entity
|
||||
id: VehicleWheelchair
|
||||
parent: [BaseVehicleRideable, BaseFoldable, BaseItem]
|
||||
name: wheelchair
|
||||
description: A chair with big wheels. It looks like you can move in these on your own.
|
||||
components:
|
||||
- type: Vehicle
|
||||
northOver: true
|
||||
hasKey: true
|
||||
northOverride: 0
|
||||
southOverride: 0
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/wheelchair.rsi
|
||||
layers:
|
||||
- state: vehicle
|
||||
map: ["enum.VehicleVisualLayers.AutoAnimate", "unfoldedLayer"]
|
||||
- state: vehicle_folded
|
||||
map: ["foldedLayer"]
|
||||
visible: false
|
||||
noRot: true
|
||||
- type: MovementSpeedModifier
|
||||
baseWalkSpeed: 2
|
||||
baseSprintSpeed: 2
|
||||
- type: Strap
|
||||
buckleOffset: "0,0"
|
||||
maxBuckleDistance: 1
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
fix1:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.2
|
||||
density: 360
|
||||
restitution: 0.0
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
- TableLayer
|
||||
- type: StaticPrice
|
||||
price: 70
|
||||
|
||||
- type: entity
|
||||
parent: VehicleWheelchair
|
||||
id: VehicleWheelchairFolded
|
||||
suffix: folded
|
||||
components:
|
||||
- type: Foldable
|
||||
folded: true
|
||||
@@ -1,86 +0,0 @@
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
id: VehicleKeyJanicart
|
||||
name: janicart keys
|
||||
description: Interesting design.
|
||||
components:
|
||||
- type: Item
|
||||
size: Tiny
|
||||
- type: Tag
|
||||
tags:
|
||||
- VehicleKey
|
||||
- JanicartKeys
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/janicart.rsi
|
||||
state: keys
|
||||
|
||||
- type: entity
|
||||
parent: VehicleKeyJanicart
|
||||
id: VehicleKeySecway
|
||||
name: secway keys
|
||||
description: The keys to the future.
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- VehicleKey
|
||||
- SecwayKeys
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/secway.rsi
|
||||
state: keys
|
||||
|
||||
- type: entity
|
||||
parent: VehicleKeyJanicart
|
||||
id: VehicleKeyATV
|
||||
name: ATV keys
|
||||
description: Think this looks like just one key? ATV keys means "actually two vehicle keys."
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- VehicleKey
|
||||
- ATVKeys
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/atv.rsi
|
||||
state: keys
|
||||
|
||||
- type: entity
|
||||
parent: VehicleKeyATV
|
||||
id: VehicleKeySkeleton
|
||||
name: vehicle skeleton keys
|
||||
description: Unlock any vehicle.
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- VehicleKey
|
||||
- JanicartKeys
|
||||
- SecwayKeys
|
||||
- ATVKeys
|
||||
- SyndicateSegwayKeys
|
||||
- SkeletonMotorcycleKeys
|
||||
|
||||
- type: entity
|
||||
parent: VehicleKeyJanicart
|
||||
id: VehicleKeySyndicateSegway
|
||||
name: syndicate segway keys
|
||||
description: Patterned after the iconic EMAG design.
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- VehicleKey
|
||||
- SyndicateSegwayKeys
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/syndicatesegway.rsi
|
||||
state: keys
|
||||
|
||||
- type: entity
|
||||
parent: VehicleKeyATV
|
||||
id: VehicleKeySkeletonMotorcycle
|
||||
name: skeleton motorcycle keys
|
||||
description: A beautiful set of keys adorned with a skull.
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- VehicleKey
|
||||
- SkeletonMotorcycleKeys
|
||||
- type: Sprite
|
||||
sprite: Objects/Vehicles/motorbike.rsi
|
||||
state: keys
|
||||
@@ -134,7 +134,6 @@
|
||||
- TrashBag
|
||||
- PowerCellSmall
|
||||
- PowerCellMedium
|
||||
- VehicleWheelchairFolded
|
||||
- RollerBedSpawnFolded
|
||||
- CheapRollerBedSpawnFolded
|
||||
- EmergencyRollerBedSpawnFolded
|
||||
@@ -812,7 +811,6 @@
|
||||
- PillCanister
|
||||
- BodyBag
|
||||
- ChemistryEmptyBottle01
|
||||
- VehicleWheelchairFolded
|
||||
- RollerBedSpawnFolded
|
||||
- CheapRollerBedSpawnFolded
|
||||
- EmergencyRollerBedSpawnFolded
|
||||
|
||||
@@ -286,13 +286,6 @@
|
||||
sprite: Structures/Machines/fax_machine.rsi
|
||||
state: icon
|
||||
|
||||
- type: stealTargetGroup
|
||||
id: VehicleSecway
|
||||
name: secway
|
||||
sprite:
|
||||
sprite: Objects/Vehicles/secway.rsi
|
||||
state: icon
|
||||
|
||||
- type: stealTargetGroup
|
||||
id: ChemDispenser
|
||||
name: chemical dispenser
|
||||
|
||||
@@ -379,18 +379,6 @@
|
||||
- type: Objective
|
||||
difficulty: 2
|
||||
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
parent: BaseThiefStealStructureObjective
|
||||
id: VehicleSecwayStealObjective
|
||||
components:
|
||||
- type: NotJobRequirement
|
||||
job: SecurityOfficer
|
||||
- type: StealCondition
|
||||
stealGroup: VehicleSecway
|
||||
- type: Objective
|
||||
difficulty: 1
|
||||
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
parent: BaseThiefStealStructureObjective
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
CrateEngineeringAMEJar: 0.25
|
||||
CrateFoodPizzaLarge: 0.25
|
||||
CrateFoodSoftdrinks: 0.25
|
||||
CrateFunATV: 0.25
|
||||
CrateFunInstrumentsVariety: 0.25
|
||||
CrateSalvageEquipment: 0.25
|
||||
RandomArtifactSpawner: 0.25
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
- type: constructionGraph
|
||||
id: SupplyBot
|
||||
start: start
|
||||
graph:
|
||||
- node: start
|
||||
edges:
|
||||
- to: bot
|
||||
steps:
|
||||
- tag: ProximitySensor
|
||||
icon:
|
||||
sprite: Objects/Misc/proximity_sensor.rsi
|
||||
state: icon
|
||||
name: proximity sensor
|
||||
- tag: BorgHead
|
||||
icon:
|
||||
sprite: Objects/Specific/Robotics/cyborg_parts.rsi
|
||||
state: borg_head
|
||||
name: borg head
|
||||
doAfter: 1
|
||||
- material: Steel
|
||||
amount: 10
|
||||
- node: bot
|
||||
entity: MobSupplyBot
|
||||
@@ -1,29 +0,0 @@
|
||||
- type: constructionGraph
|
||||
id: TaxiBot
|
||||
start: start
|
||||
graph:
|
||||
- node: start
|
||||
edges:
|
||||
- to: bot
|
||||
steps:
|
||||
- tag: ProximitySensor
|
||||
icon:
|
||||
sprite: Objects/Misc/proximity_sensor.rsi
|
||||
state: icon
|
||||
name: proximity sensor
|
||||
- tag: BorgHead
|
||||
icon:
|
||||
sprite: Objects/Specific/Robotics/cyborg_parts.rsi
|
||||
state: borg_head
|
||||
name: borg head
|
||||
doAfter: 1
|
||||
- tag: BorgArm
|
||||
icon:
|
||||
sprite: Mobs/Silicon/drone.rsi
|
||||
state: l_hand
|
||||
name: borg arm
|
||||
doAfter: 2
|
||||
- material: Steel
|
||||
amount: 5
|
||||
- node: bot
|
||||
entity: MobTaxiBot
|
||||
@@ -24,32 +24,6 @@
|
||||
sprite: Mobs/Silicon/Bots/honkbot.rsi
|
||||
state: honkbot
|
||||
|
||||
- type: construction
|
||||
name: taxibot
|
||||
id: taxibot
|
||||
graph: TaxiBot
|
||||
startNode: start
|
||||
targetNode: bot
|
||||
category: construction-category-utilities
|
||||
objectType: Item
|
||||
description: This bot takes people to their destination.
|
||||
icon:
|
||||
sprite: Mobs/Silicon/Bots/taxibot.rsi
|
||||
state: taxibot
|
||||
|
||||
- type: construction
|
||||
name: supplybot
|
||||
id: supplybot
|
||||
graph: SupplyBot
|
||||
startNode: start
|
||||
targetNode: bot
|
||||
category: construction-category-utilities
|
||||
objectType: Item
|
||||
description: This bot can be loaded with cargo to make deliveries.
|
||||
icon:
|
||||
sprite: Mobs/Silicon/Bots/supplybot.rsi
|
||||
state: supplybot
|
||||
|
||||
- type: construction
|
||||
name: jonkbot
|
||||
id: jonkbot
|
||||
|
||||
@@ -210,14 +210,6 @@
|
||||
materials:
|
||||
Plastic: 400
|
||||
|
||||
- type: latheRecipe
|
||||
id: VehicleWheelchairFolded
|
||||
result: VehicleWheelchairFolded
|
||||
completetime: 1
|
||||
materials:
|
||||
Steel: 500
|
||||
Plastic: 300
|
||||
|
||||
- type: latheRecipe
|
||||
id: RollerBedSpawnFolded
|
||||
result: RollerBedSpawnFolded
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#Misc outfit startingGear definitions.
|
||||
|
||||
#Skeleton Biker
|
||||
#Skeleton Biker - Just a skeleton now
|
||||
- type: startingGear
|
||||
id: SkeletonBiker
|
||||
equipment:
|
||||
@@ -13,8 +13,6 @@
|
||||
shoes: ClothingShoesBootsJack
|
||||
id: PassengerPDA
|
||||
ears: ClothingHeadsetGrey
|
||||
pocket1: VehicleSkeletonMotorcycle
|
||||
pocket2: VehicleKeySkeletonMotorcycle
|
||||
innerClothingSkirt: ClothingUniformJumpskirtColorBlack
|
||||
satchel: ClothingBackpackSatchelFilled
|
||||
duffelbag: ClothingBackpackDuffelFilled
|
||||
|
||||
@@ -54,18 +54,6 @@
|
||||
components:
|
||||
- type: Muted
|
||||
|
||||
- type: trait
|
||||
id: WheelchairBound
|
||||
name: trait-wheelchair-bound-name
|
||||
description: trait-wheelchair-bound-desc
|
||||
blacklist:
|
||||
components:
|
||||
- BorgChassis
|
||||
components:
|
||||
- type: BuckleOnMapInit
|
||||
prototype: VehicleWheelchair
|
||||
- type: LegsParalyzed
|
||||
|
||||
- type: trait
|
||||
id: FrontalLisp
|
||||
name: trait-frontal-lisp-name
|
||||
|
||||
@@ -686,9 +686,6 @@
|
||||
- type: Tag
|
||||
id: IntercomElectronics
|
||||
|
||||
- type: Tag
|
||||
id: JanicartKeys
|
||||
|
||||
- type: Tag
|
||||
id: JawsOfLife
|
||||
|
||||
@@ -1148,9 +1145,6 @@
|
||||
- type: Tag
|
||||
id: UraniumGlassShard
|
||||
|
||||
- type: Tag
|
||||
id: VehicleKey
|
||||
|
||||
- type: Tag
|
||||
id: VimPilot
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ You keep things clean, it's a rough job sometimes, but someone's gotta do it. Th
|
||||
|
||||
## Additional Equipment
|
||||
<Box>
|
||||
<GuideEntityEmbed Entity="VehicleJanicart"/>
|
||||
<GuideEntityEmbed Entity="WetFloorSign"/>
|
||||
<GuideEntityEmbed Entity="Holoprojector" Caption="holosign projector"/>
|
||||
<GuideEntityEmbed Entity="LightReplacer"/>
|
||||
|
||||
@@ -178,3 +178,33 @@ SpyCrewMonitor: null
|
||||
SpyCrewMonitorEmpty: null
|
||||
SyndiCrewMonitor: null
|
||||
SyndiCrewMonitorEmpty: null
|
||||
|
||||
SpawnVehicleWheelchair: null
|
||||
SpawnVehicleWheelchairFolded: null
|
||||
VehicleWheelchair: null
|
||||
VehicleWheelchairFolded: null
|
||||
VehicleSecwayStealObjective: null
|
||||
VehicleKeyJanicart: null
|
||||
VehicleKeySecway: null
|
||||
VehicleKeyATV: null
|
||||
VehicleKeySkeleton: null
|
||||
VehicleKeySyndicateSegway: null
|
||||
VehicleKeySkeletonMotorcycle: null
|
||||
VehicleSecway: null
|
||||
VehicleATV: null
|
||||
VehicleSyndicateSegway: null
|
||||
VehicleSkeletonMotorcycle: null
|
||||
VehicleUnicycle: null
|
||||
VehicleUnicycleFolded: null
|
||||
ActionVehicleHorn: null
|
||||
CrateFunATV: null
|
||||
CrateFunSyndicateSegway: null
|
||||
MobTaxiBot: null
|
||||
MobSupplyBot: null
|
||||
SpawnVehicleMotobike: null
|
||||
SpawnVehicleATV: null
|
||||
SpawnVehicleSecway: null
|
||||
SpawnVehicleJanicart: null
|
||||
VehicleJanicart: null
|
||||
VehicleJanicartDestroyed: null
|
||||
|
||||
|
||||
Reference in New Issue
Block a user