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;
|
||||||
using Content.Shared.Buckle.Components;
|
using Content.Shared.Buckle.Components;
|
||||||
using Content.Shared.Rotation;
|
using Content.Shared.Rotation;
|
||||||
using Content.Shared.Vehicle.Components;
|
|
||||||
using Robust.Client.GameObjects;
|
using Robust.Client.GameObjects;
|
||||||
|
|
||||||
namespace Content.Client.Buckle;
|
namespace Content.Client.Buckle;
|
||||||
@@ -26,9 +25,6 @@ internal sealed class BuckleSystem : SharedBuckleSystem
|
|||||||
if (!TryComp<SpriteComponent>(uid, out var ownerSprite))
|
if (!TryComp<SpriteComponent>(uid, out var ownerSprite))
|
||||||
return;
|
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.
|
// 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.
|
// Reset the draw depth when rotated in any other direction.
|
||||||
// TODO when ECSing, make this a visualizer
|
// 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 System.Numerics;
|
||||||
using Content.Shared.Alert;
|
using Content.Shared.Alert;
|
||||||
using Content.Shared.Vehicle;
|
|
||||||
using Content.Shared.Whitelist;
|
using Content.Shared.Whitelist;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
@@ -9,7 +8,7 @@ using Robust.Shared.Serialization;
|
|||||||
namespace Content.Shared.Buckle.Components;
|
namespace Content.Shared.Buckle.Components;
|
||||||
|
|
||||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
[Access(typeof(SharedBuckleSystem), typeof(SharedVehicleSystem))]
|
[Access(typeof(SharedBuckleSystem))]
|
||||||
public sealed partial class StrapComponent : Component
|
public sealed partial class StrapComponent : Component
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ using Content.Shared.Standing;
|
|||||||
using Content.Shared.Storage.Components;
|
using Content.Shared.Storage.Components;
|
||||||
using Content.Shared.Stunnable;
|
using Content.Shared.Stunnable;
|
||||||
using Content.Shared.Throwing;
|
using Content.Shared.Throwing;
|
||||||
using Content.Shared.Vehicle.Components;
|
|
||||||
using Content.Shared.Verbs;
|
using Content.Shared.Verbs;
|
||||||
using Robust.Shared.Physics.Components;
|
using Robust.Shared.Physics.Components;
|
||||||
using Robust.Shared.Physics.Events;
|
using Robust.Shared.Physics.Events;
|
||||||
@@ -124,16 +123,6 @@ public abstract partial class SharedBuckleSystem
|
|||||||
|
|
||||||
private void OnBuckleStandAttempt(EntityUid uid, BuckleComponent component, StandAttemptEvent args)
|
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)
|
if (component.Buckled)
|
||||||
args.Cancel();
|
args.Cancel();
|
||||||
}
|
}
|
||||||
@@ -149,8 +138,7 @@ public abstract partial class SharedBuckleSystem
|
|||||||
if (component.LifeStage > ComponentLifeStage.Running)
|
if (component.LifeStage > ComponentLifeStage.Running)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (component.Buckled &&
|
if (component.Buckled) // buckle shitcode
|
||||||
!HasComp<VehicleComponent>(component.BuckledTo)) // buckle+vehicle shitcode
|
|
||||||
args.Cancel();
|
args.Cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,10 +424,6 @@ public abstract partial class SharedBuckleSystem
|
|||||||
if (HasComp<SleepingComponent>(buckleUid) && buckleUid == userUid)
|
if (HasComp<SleepingComponent>(buckleUid) && buckleUid == userUid)
|
||||||
return false;
|
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 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)
|
if (_mobState.IsIncapacitated(buckleUid) && userUid == buckleUid)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ using Robust.Shared.Serialization;
|
|||||||
namespace Content.Shared.Foldable;
|
namespace Content.Shared.Foldable;
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Wiill prevent any insertions into containers while this item is unfolded.
|
/// Will prevent any insertions into containers while this item is unfolded.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
[NetworkedComponent]
|
[NetworkedComponent]
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ namespace Content.Shared.Traits.Assorted;
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set player speed to zero and standing state to down, simulating leg paralysis.
|
/// Set player speed to zero and standing state to down, simulating leg paralysis.
|
||||||
/// Used for Wheelchair bound trait.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))]
|
[RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))]
|
||||||
public sealed partial class LegsParalyzedComponent : Component
|
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-name = Accentless
|
||||||
trait-accentless-desc = You don't have the accent that your species would usually have
|
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-name = Frontal Lisp
|
||||||
trait-frontal-lisp-desc = You thpeak with a lithp
|
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
|
category: Fun
|
||||||
group: market
|
group: market
|
||||||
|
|
||||||
- type: cargoProduct
|
|
||||||
id: FunATV
|
|
||||||
icon:
|
|
||||||
sprite: Objects/Vehicles/atv.rsi
|
|
||||||
state: vehicle
|
|
||||||
product: CrateFunATV
|
|
||||||
cost: 1500
|
|
||||||
category: Fun
|
|
||||||
group: market
|
|
||||||
|
|
||||||
- type: cargoProduct
|
- type: cargoProduct
|
||||||
id: FunSadTromboneImplants
|
id: FunSadTromboneImplants
|
||||||
icon:
|
icon:
|
||||||
|
|||||||
@@ -181,17 +181,6 @@
|
|||||||
- id: DiceBag
|
- id: DiceBag
|
||||||
amount: 6
|
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
|
- type: entity
|
||||||
id: CrateFunSadTromboneImplants
|
id: CrateFunSadTromboneImplants
|
||||||
parent: CrateGenericSteel
|
parent: CrateGenericSteel
|
||||||
@@ -258,17 +247,6 @@
|
|||||||
- id: WeaponWaterPistol
|
- id: WeaponWaterPistol
|
||||||
amount: 4
|
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
|
- type: entity
|
||||||
id: CrateFunBoxing
|
id: CrateFunBoxing
|
||||||
parent: CrateGenericSteel
|
parent: CrateGenericSteel
|
||||||
@@ -320,7 +298,6 @@
|
|||||||
- id: MrDips
|
- id: MrDips
|
||||||
orGroup: Giftpool
|
orGroup: Giftpool
|
||||||
- id: RevolverCapGun
|
- id: RevolverCapGun
|
||||||
- id: VehicleUnicycleFolded
|
|
||||||
- id: ClothingShoesClownLarge
|
- id: ClothingShoesClownLarge
|
||||||
- id: ClothingHeadHatMagician
|
- id: ClothingHeadHatMagician
|
||||||
- id: BeachBall
|
- id: BeachBall
|
||||||
|
|||||||
@@ -1431,22 +1431,6 @@
|
|||||||
categories:
|
categories:
|
||||||
- UplinkMisc
|
- 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
|
- type: listing
|
||||||
id: UplinkBribe
|
id: UplinkBribe
|
||||||
name: uplink-bribe-name
|
name: uplink-bribe-name
|
||||||
|
|||||||
@@ -222,7 +222,6 @@
|
|||||||
- HolosignProjector
|
- HolosignProjector
|
||||||
- Plunger
|
- Plunger
|
||||||
- LightReplacer
|
- LightReplacer
|
||||||
- JanicartKeys
|
|
||||||
components:
|
components:
|
||||||
- LightReplacer
|
- LightReplacer
|
||||||
- type: ItemMapper
|
- 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
|
proto: robot
|
||||||
- type: ZombieImmune
|
- 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
|
- type: entity
|
||||||
parent: MobSiliconBase
|
parent: MobSiliconBase
|
||||||
id: MobHonkBot
|
id: MobHonkBot
|
||||||
@@ -350,12 +279,12 @@
|
|||||||
interactSuccessSound:
|
interactSuccessSound:
|
||||||
path: /Audio/Ambience/Objects/periodic_beep.ogg
|
path: /Audio/Ambience/Objects/periodic_beep.ogg
|
||||||
- type: ShowHealthBars
|
- type: ShowHealthBars
|
||||||
damageContainers:
|
damageContainers:
|
||||||
- Biological
|
- Biological
|
||||||
- type: ShowHealthIcons
|
- type: ShowHealthIcons
|
||||||
damageContainers:
|
damageContainers:
|
||||||
- Biological
|
- Biological
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
parent: MobSiliconBase
|
parent: MobSiliconBase
|
||||||
id: MobMimeBot
|
id: MobMimeBot
|
||||||
|
|||||||
@@ -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
|
- TrashBag
|
||||||
- PowerCellSmall
|
- PowerCellSmall
|
||||||
- PowerCellMedium
|
- PowerCellMedium
|
||||||
- VehicleWheelchairFolded
|
|
||||||
- RollerBedSpawnFolded
|
- RollerBedSpawnFolded
|
||||||
- CheapRollerBedSpawnFolded
|
- CheapRollerBedSpawnFolded
|
||||||
- EmergencyRollerBedSpawnFolded
|
- EmergencyRollerBedSpawnFolded
|
||||||
@@ -812,7 +811,6 @@
|
|||||||
- PillCanister
|
- PillCanister
|
||||||
- BodyBag
|
- BodyBag
|
||||||
- ChemistryEmptyBottle01
|
- ChemistryEmptyBottle01
|
||||||
- VehicleWheelchairFolded
|
|
||||||
- RollerBedSpawnFolded
|
- RollerBedSpawnFolded
|
||||||
- CheapRollerBedSpawnFolded
|
- CheapRollerBedSpawnFolded
|
||||||
- EmergencyRollerBedSpawnFolded
|
- EmergencyRollerBedSpawnFolded
|
||||||
|
|||||||
@@ -286,13 +286,6 @@
|
|||||||
sprite: Structures/Machines/fax_machine.rsi
|
sprite: Structures/Machines/fax_machine.rsi
|
||||||
state: icon
|
state: icon
|
||||||
|
|
||||||
- type: stealTargetGroup
|
|
||||||
id: VehicleSecway
|
|
||||||
name: secway
|
|
||||||
sprite:
|
|
||||||
sprite: Objects/Vehicles/secway.rsi
|
|
||||||
state: icon
|
|
||||||
|
|
||||||
- type: stealTargetGroup
|
- type: stealTargetGroup
|
||||||
id: ChemDispenser
|
id: ChemDispenser
|
||||||
name: chemical dispenser
|
name: chemical dispenser
|
||||||
|
|||||||
@@ -379,18 +379,6 @@
|
|||||||
- type: Objective
|
- type: Objective
|
||||||
difficulty: 2
|
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
|
- type: entity
|
||||||
noSpawn: true
|
noSpawn: true
|
||||||
parent: BaseThiefStealStructureObjective
|
parent: BaseThiefStealStructureObjective
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
CrateEngineeringAMEJar: 0.25
|
CrateEngineeringAMEJar: 0.25
|
||||||
CrateFoodPizzaLarge: 0.25
|
CrateFoodPizzaLarge: 0.25
|
||||||
CrateFoodSoftdrinks: 0.25
|
CrateFoodSoftdrinks: 0.25
|
||||||
CrateFunATV: 0.25
|
|
||||||
CrateFunInstrumentsVariety: 0.25
|
CrateFunInstrumentsVariety: 0.25
|
||||||
CrateSalvageEquipment: 0.25
|
CrateSalvageEquipment: 0.25
|
||||||
RandomArtifactSpawner: 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
|
sprite: Mobs/Silicon/Bots/honkbot.rsi
|
||||||
state: honkbot
|
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
|
- type: construction
|
||||||
name: jonkbot
|
name: jonkbot
|
||||||
id: jonkbot
|
id: jonkbot
|
||||||
|
|||||||
@@ -210,14 +210,6 @@
|
|||||||
materials:
|
materials:
|
||||||
Plastic: 400
|
Plastic: 400
|
||||||
|
|
||||||
- type: latheRecipe
|
|
||||||
id: VehicleWheelchairFolded
|
|
||||||
result: VehicleWheelchairFolded
|
|
||||||
completetime: 1
|
|
||||||
materials:
|
|
||||||
Steel: 500
|
|
||||||
Plastic: 300
|
|
||||||
|
|
||||||
- type: latheRecipe
|
- type: latheRecipe
|
||||||
id: RollerBedSpawnFolded
|
id: RollerBedSpawnFolded
|
||||||
result: RollerBedSpawnFolded
|
result: RollerBedSpawnFolded
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#Misc outfit startingGear definitions.
|
#Misc outfit startingGear definitions.
|
||||||
|
|
||||||
#Skeleton Biker
|
#Skeleton Biker - Just a skeleton now
|
||||||
- type: startingGear
|
- type: startingGear
|
||||||
id: SkeletonBiker
|
id: SkeletonBiker
|
||||||
equipment:
|
equipment:
|
||||||
@@ -13,8 +13,6 @@
|
|||||||
shoes: ClothingShoesBootsJack
|
shoes: ClothingShoesBootsJack
|
||||||
id: PassengerPDA
|
id: PassengerPDA
|
||||||
ears: ClothingHeadsetGrey
|
ears: ClothingHeadsetGrey
|
||||||
pocket1: VehicleSkeletonMotorcycle
|
|
||||||
pocket2: VehicleKeySkeletonMotorcycle
|
|
||||||
innerClothingSkirt: ClothingUniformJumpskirtColorBlack
|
innerClothingSkirt: ClothingUniformJumpskirtColorBlack
|
||||||
satchel: ClothingBackpackSatchelFilled
|
satchel: ClothingBackpackSatchelFilled
|
||||||
duffelbag: ClothingBackpackDuffelFilled
|
duffelbag: ClothingBackpackDuffelFilled
|
||||||
|
|||||||
@@ -54,18 +54,6 @@
|
|||||||
components:
|
components:
|
||||||
- type: Muted
|
- 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
|
- type: trait
|
||||||
id: FrontalLisp
|
id: FrontalLisp
|
||||||
name: trait-frontal-lisp-name
|
name: trait-frontal-lisp-name
|
||||||
|
|||||||
@@ -252,7 +252,7 @@
|
|||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: CannonBall
|
id: CannonBall
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: CannonRestrict
|
id: CannonRestrict
|
||||||
|
|
||||||
@@ -686,9 +686,6 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: IntercomElectronics
|
id: IntercomElectronics
|
||||||
|
|
||||||
- type: Tag
|
|
||||||
id: JanicartKeys
|
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: JawsOfLife
|
id: JawsOfLife
|
||||||
|
|
||||||
@@ -1148,9 +1145,6 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: UraniumGlassShard
|
id: UraniumGlassShard
|
||||||
|
|
||||||
- type: Tag
|
|
||||||
id: VehicleKey
|
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: VimPilot
|
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
|
## Additional Equipment
|
||||||
<Box>
|
<Box>
|
||||||
<GuideEntityEmbed Entity="VehicleJanicart"/>
|
|
||||||
<GuideEntityEmbed Entity="WetFloorSign"/>
|
<GuideEntityEmbed Entity="WetFloorSign"/>
|
||||||
<GuideEntityEmbed Entity="Holoprojector" Caption="holosign projector"/>
|
<GuideEntityEmbed Entity="Holoprojector" Caption="holosign projector"/>
|
||||||
<GuideEntityEmbed Entity="LightReplacer"/>
|
<GuideEntityEmbed Entity="LightReplacer"/>
|
||||||
|
|||||||
@@ -177,4 +177,34 @@ HandheldCrewMonitor: null
|
|||||||
SpyCrewMonitor: null
|
SpyCrewMonitor: null
|
||||||
SpyCrewMonitorEmpty: null
|
SpyCrewMonitorEmpty: null
|
||||||
SyndiCrewMonitor: null
|
SyndiCrewMonitor: null
|
||||||
SyndiCrewMonitorEmpty: 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