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:
metalgearsloth
2024-02-01 11:33:10 +11:00
committed by GitHub
parent ff090878e7
commit d2f20d8955
36 changed files with 40 additions and 1587 deletions

View File

@@ -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

View File

@@ -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,
}

View File

@@ -1,7 +0,0 @@
using Content.Shared.Vehicle;
namespace Content.Server.Vehicle;
public sealed class VehicleSystem : SharedVehicleSystem
{
}

View File

@@ -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>

View File

@@ -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;

View File

@@ -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]

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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
{
}

View File

@@ -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

View File

@@ -1,3 +0,0 @@
vehicle-use-key = You use {THE($keys)} to start {THE($vehicle)}.
vehicle-slot-component-slot-name-keys = Keys

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -222,7 +222,6 @@
- HolosignProjector
- Plunger
- LightReplacer
- JanicartKeys
components:
- LightReplacer
- type: ItemMapper

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -134,7 +134,6 @@
- TrashBag
- PowerCellSmall
- PowerCellMedium
- VehicleWheelchairFolded
- RollerBedSpawnFolded
- CheapRollerBedSpawnFolded
- EmergencyRollerBedSpawnFolded
@@ -812,7 +811,6 @@
- PillCanister
- BodyBag
- ChemistryEmptyBottle01
- VehicleWheelchairFolded
- RollerBedSpawnFolded
- CheapRollerBedSpawnFolded
- EmergencyRollerBedSpawnFolded

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"/>

View File

@@ -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