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;
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
+++ /dev/null
-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,
-}
+++ /dev/null
-using Content.Shared.Vehicle;
-
-namespace Content.Server.Vehicle;
-
-public sealed class VehicleSystem : SharedVehicleSystem
-{
-}
using System.Numerics;
using Content.Shared.Alert;
-using Content.Shared.Vehicle;
using Content.Shared.Whitelist;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
namespace Content.Shared.Buckle.Components;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
-[Access(typeof(SharedBuckleSystem), typeof(SharedVehicleSystem))]
+[Access(typeof(SharedBuckleSystem))]
public sealed partial class StrapComponent : Component
{
/// <summary>
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;
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();
}
if (component.LifeStage > ComponentLifeStage.Running)
return;
- if (component.Buckled &&
- !HasComp<VehicleComponent>(component.BuckledTo)) // buckle+vehicle shitcode
+ if (component.Buckled) // buckle shitcode
args.Cancel();
}
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;
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]
/// <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
+++ /dev/null
-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;
- }
-}
+++ /dev/null
-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;
-}
+++ /dev/null
-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;
-}
+++ /dev/null
-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;
- }
-}
+++ /dev/null
-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
-{
-}
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
+++ /dev/null
-vehicle-use-key = You use {THE($keys)} to start {THE($vehicle)}.
-
-vehicle-slot-component-slot-name-keys = Keys
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:
- 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
- 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
- id: MrDips
orGroup: Giftpool
- id: RevolverCapGun
- - id: VehicleUnicycleFolded
- id: ClothingShoesClownLarge
- id: ClothingHeadHatMagician
- id: BeachBall
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
- HolosignProjector
- Plunger
- LightReplacer
- - JanicartKeys
components:
- LightReplacer
- type: ItemMapper
+++ /dev/null
-- 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
\ No newline at end of file
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
interactSuccessSound:
path: /Audio/Ambience/Objects/periodic_beep.ogg
- type: ShowHealthBars
- damageContainers:
+ damageContainers:
- Biological
- type: ShowHealthIcons
- damageContainers:
+ damageContainers:
- Biological
-
+
- type: entity
parent: MobSiliconBase
id: MobMimeBot
+++ /dev/null
-- 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
+++ /dev/null
-- 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
+++ /dev/null
-- 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
- TrashBag
- PowerCellSmall
- PowerCellMedium
- - VehicleWheelchairFolded
- RollerBedSpawnFolded
- CheapRollerBedSpawnFolded
- EmergencyRollerBedSpawnFolded
- PillCanister
- BodyBag
- ChemistryEmptyBottle01
- - VehicleWheelchairFolded
- RollerBedSpawnFolded
- CheapRollerBedSpawnFolded
- EmergencyRollerBedSpawnFolded
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
- 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
CrateEngineeringAMEJar: 0.25
CrateFoodPizzaLarge: 0.25
CrateFoodSoftdrinks: 0.25
- CrateFunATV: 0.25
CrateFunInstrumentsVariety: 0.25
CrateSalvageEquipment: 0.25
RandomArtifactSpawner: 0.25
+++ /dev/null
-- 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
+++ /dev/null
-- 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
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
materials:
Plastic: 400
-- type: latheRecipe
- id: VehicleWheelchairFolded
- result: VehicleWheelchairFolded
- completetime: 1
- materials:
- Steel: 500
- Plastic: 300
-
- type: latheRecipe
id: RollerBedSpawnFolded
result: RollerBedSpawnFolded
#Misc outfit startingGear definitions.
-#Skeleton Biker
+#Skeleton Biker - Just a skeleton now
- type: startingGear
id: SkeletonBiker
equipment:
shoes: ClothingShoesBootsJack
id: PassengerPDA
ears: ClothingHeadsetGrey
- pocket1: VehicleSkeletonMotorcycle
- pocket2: VehicleKeySkeletonMotorcycle
innerClothingSkirt: ClothingUniformJumpskirtColorBlack
satchel: ClothingBackpackSatchelFilled
duffelbag: ClothingBackpackDuffelFilled
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
- type: Tag
id: CannonBall
-
+
- type: Tag
id: CannonRestrict
- type: Tag
id: IntercomElectronics
-- type: Tag
- id: JanicartKeys
-
- type: Tag
id: JawsOfLife
- type: Tag
id: UraniumGlassShard
-- type: Tag
- id: VehicleKey
-
- type: Tag
id: VimPilot
## Additional Equipment
<Box>
-<GuideEntityEmbed Entity="VehicleJanicart"/>
<GuideEntityEmbed Entity="WetFloorSign"/>
<GuideEntityEmbed Entity="Holoprojector" Caption="holosign projector"/>
<GuideEntityEmbed Entity="LightReplacer"/>
SpyCrewMonitor: null
SpyCrewMonitorEmpty: null
SyndiCrewMonitor: null
-SyndiCrewMonitorEmpty: null
\ No newline at end of file
+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
+