upstream - merge remote "stable"

This commit is contained in:
Dmitry
2025-10-13 20:59:28 +07:00
417 changed files with 6933 additions and 4381 deletions

View File

@@ -37,8 +37,7 @@ public sealed class TypingIndicatorVisualizerSystem : VisualizerSystem<TypingInd
if (!layerExists)
layer = SpriteSystem.LayerMapReserve((uid, args.Sprite), TypingIndicatorLayers.Base);
SpriteSystem.LayerSetRsi((uid, args.Sprite), layer, proto.SpritePath);
SpriteSystem.LayerSetRsiState((uid, args.Sprite), layer, proto.TypingState);
SpriteSystem.LayerSetRsi((uid, args.Sprite), layer, proto.SpritePath, proto.TypingState);
args.Sprite.LayerSetShader(layer, proto.Shader);
SpriteSystem.LayerSetOffset((uid, args.Sprite), layer, proto.Offset);

View File

@@ -51,22 +51,22 @@ public sealed partial class DocumentParsingManager
_sawmill = Logger.GetSawmill("Guidebook");
}
public bool TryAddMarkup(Control control, ProtoId<GuideEntryPrototype> entryId, bool log = true)
public bool TryAddMarkup(Control control, ProtoId<GuideEntryPrototype> entryId)
{
if (!_prototype.Resolve(entryId, out var entry))
return false;
using var file = _resourceManager.ContentFileReadText(entry.Text);
return TryAddMarkup(control, file.ReadToEnd(), log);
return TryAddMarkup(control, file.ReadToEnd());
}
public bool TryAddMarkup(Control control, GuideEntry entry, bool log = true)
public bool TryAddMarkup(Control control, GuideEntry entry)
{
using var file = _resourceManager.ContentFileReadText(entry.Text);
return TryAddMarkup(control, file.ReadToEnd(), log);
return TryAddMarkup(control, file.ReadToEnd());
}
public bool TryAddMarkup(Control control, string text, bool log = true)
public bool TryAddMarkup(Control control, string text)
{
try
{

View File

@@ -1,7 +1,7 @@
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Shared.Body.Systems;
using Content.Shared.Body.Components;
using Robust.Server.GameObjects;
using Robust.Shared;

View File

@@ -0,0 +1,13 @@
using System.Collections.Generic;
using Robust.Shared.GameObjects;
namespace Content.IntegrationTests.Tests.Helpers;
/// <summary>
/// Component that is used by <see cref="TestListenerSystem{TEvent}"/> to store any information about received events.
/// </summary>
[RegisterComponent]
public sealed partial class TestListenerComponent : Component
{
public Dictionary<Type, List<object>> Events = new();
}

View File

@@ -0,0 +1,45 @@
#nullable enable
using System.Collections.Generic;
using System.Linq;
using Robust.Shared.GameObjects;
using Robust.Shared.Utility;
namespace Content.IntegrationTests.Tests.Helpers;
/// <summary>
/// Generic system that listens for and records any received events of a given type.
/// </summary>
public abstract class TestListenerSystem<TEvent> : EntitySystem where TEvent : notnull
{
public override void Initialize()
{
// TODO
// supporting broadcast events requires cleanup on test finish, which will probably require changes to the
// test pair/pool manager and would conflict with #36797
SubscribeLocalEvent<TestListenerComponent, TEvent>(OnDirectedEvent);
}
protected virtual void OnDirectedEvent(Entity<TestListenerComponent> ent, ref TEvent args)
{
ent.Comp.Events.GetOrNew(args.GetType()).Add(args);
}
public int Count(EntityUid uid, Func<TEvent, bool>? predicate = null)
{
return GetEvents(uid, predicate).Count();
}
public void Clear(EntityUid uid)
{
CompOrNull<TestListenerComponent>(uid)?.Events.Remove(typeof(TEvent));
}
public IEnumerable<TEvent> GetEvents(EntityUid uid, Func<TEvent, bool>? predicate = null)
{
var events = CompOrNull<TestListenerComponent>(uid)?.Events.GetValueOrDefault(typeof(TEvent));
if (events == null)
return [];
return events.Cast<TEvent>().Where(e => predicate?.Invoke(e) ?? true);
}
}

View File

@@ -5,6 +5,7 @@ using System.Linq;
using System.Numerics;
using System.Reflection;
using Content.Client.Construction;
using Content.IntegrationTests.Tests.Helpers;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Construction.Components;
using Content.Server.Gravity;
@@ -22,6 +23,8 @@ using Robust.Shared.Input;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Maths;
using Robust.Shared.Reflection;
using Robust.UnitTesting;
using ItemToggleComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleComponent;
namespace Content.IntegrationTests.Tests.Interaction;
@@ -29,6 +32,8 @@ namespace Content.IntegrationTests.Tests.Interaction;
// This partial class defines various methods that are useful for performing & validating interactions
public abstract partial class InteractionTest
{
private Dictionary<Type, EntitySystem> _listenerCache = new();
/// <summary>
/// Begin constructing an entity.
/// </summary>
@@ -758,6 +763,139 @@ public abstract partial class InteractionTest
#endregion
#region EventListener
/// <summary>
/// Asserts that running the given action causes an event to be fired directed at the specified entity (defaults to <see cref="Target"/>).
/// </summary>
/// <remarks>
/// This currently only checks server-side events.
/// </remarks>
/// <param name="uid">The entity at which the events are supposed to be directed</param>
/// <param name="count">How many new events are expected</param>
/// <param name="clear">Whether to clear all previously recorded events before invoking the delegate</param>
protected async Task AssertFiresEvent<TEvent>(Func<Task> act, EntityUid? uid = null, int count = 1, bool clear = true)
where TEvent : notnull
{
var sys = GetListenerSystem<TEvent>();
uid ??= STarget;
if (uid == null)
{
Assert.Fail("No target specified");
return;
}
if (clear)
sys.Clear(uid.Value);
else
count += sys.Count(uid.Value);
await Server.WaitPost(() => SEntMan.EnsureComponent<TestListenerComponent>(uid.Value));
await act();
AssertEvent<TEvent>(uid, count: count);
}
/// <summary>
/// This is a variant of <see cref="AssertFiresEvent{TEvent}"/> that passes the delegate to <see cref="RobustIntegrationTest.ServerIntegrationInstance.WaitPost"/>.
/// </summary>
/// <remarks>
/// This currently only checks for server-side events.
/// </remarks>
/// <param name="uid">The entity at which the events are supposed to be directed</param>
/// <param name="count">How many new events are expected</param>
/// <param name="clear">Whether to clear all previously recorded events before invoking the delegate</param>
protected async Task AssertPostFiresEvent<TEvent>(Action act, EntityUid? uid = null, int count = 1, bool clear = true)
where TEvent : notnull
{
await AssertFiresEvent<TEvent>(async () => await Server.WaitPost(act), uid, count, clear);
}
/// <summary>
/// This is a variant of <see cref="AssertFiresEvent{TEvent}"/> that passes the delegate to <see cref="RobustIntegrationTest.ServerIntegrationInstance.WaitAssertion"/>.
/// </summary>
/// <remarks>
/// This currently only checks for server-side events.
/// </remarks>
/// <param name="uid">The entity at which the events are supposed to be directed</param>
/// <param name="count">How many new events are expected</param>
/// <param name="clear">Whether to clear all previously recorded events before invoking the delegate</param>
protected async Task AssertAssertionFiresEvent<TEvent>(Action act,
EntityUid? uid = null,
int count = 1,
bool clear = true)
where TEvent : notnull
{
await AssertFiresEvent<TEvent>(async () => await Server.WaitAssertion(act), uid, count, clear);
}
/// <summary>
/// Asserts that the specified event has been fired some number of times at the given entity (defaults to <see cref="Target"/>).
/// For this to work, this requires that the entity has been given a <see cref="TestListenerComponent"/>
/// </summary>
/// <remarks>
/// This currently only checks server-side events.
/// </remarks>
/// <param name="uid">The entity at which the events were directed</param>
/// <param name="count">How many new events are expected</param>
/// <param name="predicate">A predicate that can be used to filter the recorded events</param>
protected void AssertEvent<TEvent>(EntityUid? uid = null, int count = 1, Func<TEvent,bool>? predicate = null)
where TEvent : notnull
{
Assert.That(GetEvents(uid, predicate).Count, Is.EqualTo(count));
}
/// <summary>
/// Gets all the events of the specified type that have been fired at the given entity (defaults to <see cref="Target"/>).
/// For this to work, this requires that the entity has been given a <see cref="TestListenerComponent"/>
/// </summary>
/// <remarks>
/// This currently only gets for server-side events.
/// </remarks>
/// <param name="uid">The entity at which the events were directed</param>
/// <param name="predicate">A predicate that can be used to filter the returned events</param>
protected IEnumerable<TEvent> GetEvents<TEvent>(EntityUid? uid = null, Func<TEvent, bool>? predicate = null)
where TEvent : notnull
{
uid ??= STarget;
if (uid == null)
{
Assert.Fail("No target specified");
return [];
}
Assert.That(SEntMan.HasComponent<TestListenerComponent>(uid), $"Entity must have {nameof(TestListenerComponent)}");
return GetListenerSystem<TEvent>().GetEvents(uid.Value, predicate);
}
protected TestListenerSystem<TEvent> GetListenerSystem<TEvent>()
where TEvent : notnull
{
if (_listenerCache.TryGetValue(typeof(TEvent), out var listener))
return (TestListenerSystem<TEvent>) listener;
var type = Server.Resolve<IReflectionManager>().GetAllChildren<TestListenerSystem<TEvent>>().Single();
if (!SEntMan.EntitySysManager.TryGetEntitySystem(type, out var systemObj))
{
// There has to be a listener system that is manually defined. Event subscriptions are locked once
// finalized, so we can't really easily create new subscriptions on the fly.
// TODO find a better solution
throw new InvalidOperationException($"Event {typeof(TEvent).Name} has no associated listener system!");
}
var system = (TestListenerSystem<TEvent>)systemObj;
_listenerCache[typeof(TEvent)] = system;
return system;
}
/// <summary>
/// Clears all recorded events of the given type.
/// </summary>
protected void ClearEvents<TEvent>(EntityUid uid) where TEvent : notnull
=> GetListenerSystem<TEvent>().Clear(uid);
#endregion
#region Entity lookups
/// <summary>

View File

@@ -1,10 +1,8 @@
#nullable enable
using System.Collections.Generic;
using Content.IntegrationTests.Tests.Interaction;
using Content.IntegrationTests.Tests.Helpers;
using Content.Shared.Movement.Components;
using Content.Shared.Slippery;
using Content.Shared.Stunnable;
using Robust.Shared.GameObjects;
using Robust.Shared.Input;
using Robust.Shared.Maths;
@@ -12,44 +10,32 @@ namespace Content.IntegrationTests.Tests.Movement;
public sealed class SlippingTest : MovementTest
{
public sealed class SlipTestSystem : EntitySystem
{
public HashSet<EntityUid> Slipped = new();
public override void Initialize()
{
SubscribeLocalEvent<SlipperyComponent, SlipEvent>(OnSlip);
}
private void OnSlip(EntityUid uid, SlipperyComponent component, ref SlipEvent args)
{
Slipped.Add(args.Slipped);
}
}
public sealed class SlipTestSystem : TestListenerSystem<SlipEvent>;
[Test]
public async Task BananaSlipTest()
{
var sys = SEntMan.System<SlipTestSystem>();
await SpawnTarget("TrashBananaPeel");
var modifier = Comp<MovementSpeedModifierComponent>(Player).SprintSpeedModifier;
Assert.That(modifier, Is.EqualTo(1), "Player is not moving at full speed.");
// Player is to the left of the banana peel and has not slipped.
// Player is to the left of the banana peel.
Assert.That(Delta(), Is.GreaterThan(0.5f));
Assert.That(sys.Slipped, Does.Not.Contain(SEntMan.GetEntity(Player)));
// Walking over the banana slowly does not trigger a slip.
await SetKey(EngineKeyFunctions.Walk, BoundKeyState.Down);
await Move(DirectionFlag.East, 1f);
await AssertFiresEvent<SlipEvent>(async () => await Move(DirectionFlag.East, 1f), count: 0);
Assert.That(Delta(), Is.LessThan(0.5f));
Assert.That(sys.Slipped, Does.Not.Contain(SEntMan.GetEntity(Player)));
AssertComp<KnockedDownComponent>(false, Player);
// Moving at normal speeds does trigger a slip.
await SetKey(EngineKeyFunctions.Walk, BoundKeyState.Up);
await Move(DirectionFlag.West, 1f);
Assert.That(sys.Slipped, Does.Contain(SEntMan.GetEntity(Player)));
await AssertFiresEvent<SlipEvent>(async () => await Move(DirectionFlag.West, 1f));
// And the person that slipped was the player
AssertEvent<SlipEvent>(predicate: @event => @event.Slipped == SPlayer);
AssertComp<KnockedDownComponent>(true, Player);
}
}

View File

@@ -25,8 +25,6 @@ namespace Content.Server.Atmos.EntitySystems
/// </summary>
public float[] GasSpecificHeats => _gasSpecificHeats;
public string?[] GasReagents = new string[Atmospherics.TotalNumberOfGases];
private void InitializeGases()
{
_gasReactions = _protoMan.EnumeratePrototypes<GasReactionPrototype>().ToArray();
@@ -37,7 +35,6 @@ namespace Content.Server.Atmos.EntitySystems
for (var i = 0; i < GasPrototypes.Length; i++)
{
_gasSpecificHeats[i] = GasPrototypes[i].SpecificHeat / HeatScale;
GasReagents[i] = GasPrototypes[i].Reagent;
}
}

View File

@@ -112,7 +112,9 @@ public sealed class SpaceHeaterSystem : EntitySystem
if (!TryComp<GasThermoMachineComponent>(uid, out var thermoMachine))
return;
thermoMachine.TargetTemperature = float.Clamp(thermoMachine.TargetTemperature + args.Temperature, thermoMachine.MinTemperature, thermoMachine.MaxTemperature);
thermoMachine.TargetTemperature = float.Clamp(thermoMachine.TargetTemperature + args.Temperature,
spaceHeater.MinTemperature,
spaceHeater.MaxTemperature);
UpdateAppearance(uid);
DirtyUI(uid, spaceHeater);

View File

@@ -1,9 +0,0 @@
using Content.Server.Body.Systems;
namespace Content.Server.Body.Components
{
[RegisterComponent, Access(typeof(BrainSystem))]
public sealed partial class BrainComponent : Component
{
}
}

View File

@@ -3,6 +3,7 @@ using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Server.Chat.Systems;
using Content.Server.EntityEffects;
using Content.Shared.Body.Systems;
using Content.Shared.Alert;
using Content.Shared.Atmos;
using Content.Shared.Body.Components;

View File

@@ -19,7 +19,7 @@ public sealed partial class ReactionMixerSystem : EntitySystem
{
base.Initialize();
SubscribeLocalEvent<ReactionMixerComponent, AfterInteractEvent>(OnAfterInteract);
SubscribeLocalEvent<ReactionMixerComponent, AfterInteractEvent>(OnAfterInteract, before: [typeof(IngestionSystem)]);
SubscribeLocalEvent<ReactionMixerComponent, ShakeEvent>(OnShake);
SubscribeLocalEvent<ReactionMixerComponent, ReactionMixDoAfterEvent>(OnDoAfter);
}
@@ -29,12 +29,13 @@ public sealed partial class ReactionMixerSystem : EntitySystem
if (!args.Target.HasValue || !args.CanReach || !entity.Comp.MixOnInteract)
return;
if (!MixAttempt(entity, args.Target.Value, out var solution))
if (!MixAttempt(entity, args.Target.Value, out _))
return;
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, entity.Comp.TimeToMix, new ReactionMixDoAfterEvent(), entity, args.Target.Value, entity);
_doAfterSystem.TryStartDoAfter(doAfterArgs);
args.Handled = true;
}
private void OnDoAfter(Entity<ReactionMixerComponent> entity, ref ReactionMixDoAfterEvent args)

View File

@@ -4,7 +4,6 @@ using Content.Server.GameTicking.Presets;
using Content.Shared.Administration;
using Linguini.Shared.Util;
using Robust.Shared.Console;
using Robust.Shared.Prototypes;
namespace Content.Server.GameTicking.Commands
{
@@ -12,7 +11,6 @@ namespace Content.Server.GameTicking.Commands
public sealed class SetGamePresetCommand : IConsoleCommand
{
[Dependency] private readonly IEntityManager _entity = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public string Command => "setgamepreset";
public string Description => Loc.GetString("set-game-preset-command-description", ("command", Command));

View File

@@ -1,11 +0,0 @@
namespace Content.Server.Ghost.Components
{
[RegisterComponent]
public sealed partial class GhostOnMoveComponent : Component
{
[DataField("canReturn")] public bool CanReturn { get; set; } = true;
[DataField("mustBeDead")]
public bool MustBeDead = false;
}
}

View File

@@ -9,7 +9,6 @@ using Content.Shared.Holopad;
using Content.Shared.IdentityManagement;
using Content.Shared.Labels.Components;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Systems;
using Content.Shared.Power;
using Content.Shared.Silicons.StationAi;
using Content.Shared.Speech;
@@ -40,7 +39,6 @@ public sealed class HolopadSystem : SharedHolopadSystem
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly PvsOverrideSystem _pvs = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
private float _updateTimer = 1.0f;
private const float UpdateTime = 1.0f;

View File

@@ -1,9 +1,11 @@
using Content.Shared.Hands;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.IdentityManagement;
using Content.Shared.Item;
using Content.Shared.Lube;
using Content.Shared.NameModifier.EntitySystems;
using Content.Shared.Popups;
using Content.Shared.Throwing;
using Robust.Shared.Containers;
using Robust.Shared.Random;
namespace Content.Server.Lube;
@@ -21,7 +23,7 @@ public sealed class LubedSystem : EntitySystem
base.Initialize();
SubscribeLocalEvent<LubedComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<LubedComponent, ContainerGettingInsertedAttemptEvent>(OnHandPickUp);
SubscribeLocalEvent<LubedComponent, BeforeGettingEquippedHandEvent>(OnHandPickUp);
SubscribeLocalEvent<LubedComponent, RefreshNameModifiersEvent>(OnRefreshNameModifiers);
}
@@ -30,21 +32,38 @@ public sealed class LubedSystem : EntitySystem
_nameMod.RefreshNameModifiers(uid);
}
private void OnHandPickUp(EntityUid uid, LubedComponent component, ContainerGettingInsertedAttemptEvent args)
/// <remarks>
/// Note to whoever makes this predicted—there is a mispredict here that
/// would be nice to keep! If this is in shared, the client will predict
/// this and not run the pickup animation in <see cref="SharedHandsSystem"/>
/// which would (probably) make this effect look less funny. You will
/// probably want to either tweak <see cref="BeforeGettingEquippedHandEvent"/>
/// to be able to cancel but still run the animation or something—we do want
/// the event to run before the animation for stuff like
/// <see cref="MultiHandedItemSystem.OnBeforeEquipped"/>.
/// </remarks>
private void OnHandPickUp(Entity<LubedComponent> ent, ref BeforeGettingEquippedHandEvent args)
{
if (component.SlipsLeft <= 0)
if (args.Cancelled)
return;
if (ent.Comp.SlipsLeft <= 0)
{
RemComp<LubedComponent>(uid);
_nameMod.RefreshNameModifiers(uid);
RemComp<LubedComponent>(ent);
_nameMod.RefreshNameModifiers(ent.Owner);
return;
}
component.SlipsLeft--;
args.Cancel();
var user = args.Container.Owner;
_transform.SetCoordinates(uid, Transform(user).Coordinates);
_transform.AttachToGridOrMap(uid);
_throwing.TryThrow(uid, _random.NextVector2(), baseThrowSpeed: component.SlipStrength);
_popup.PopupEntity(Loc.GetString("lube-slip", ("target", Identity.Entity(uid, EntityManager))), user, user, PopupType.MediumCaution);
ent.Comp.SlipsLeft--;
args.Cancelled = true;
_transform.SetCoordinates(ent, Transform(args.User).Coordinates);
_transform.AttachToGridOrMap(ent);
_throwing.TryThrow(ent, _random.NextVector2(), ent.Comp.SlipStrength);
_popup.PopupEntity(Loc.GetString("lube-slip", ("target", Identity.Entity(ent, EntityManager))),
args.User,
args.User,
PopupType.MediumCaution);
}
private void OnRefreshNameModifiers(Entity<LubedComponent> entity, ref RefreshNameModifiersEvent args)

View File

@@ -9,4 +9,5 @@ public abstract partial class NPCComponent : SharedNPCComponent
/// </summary>
[DataField("blackboard", customTypeSerializer: typeof(NPCBlackboardSerializer))]
public NPCBlackboard Blackboard = new();
// TODO FULL GAME SAVE Serialize this
}

View File

@@ -24,6 +24,7 @@ public sealed partial class HTNComponent : NPCComponent
/// </summary>
[ViewVariables]
public HTNPlan? Plan;
// TODO FULL GAME SAVE serialize this?
/// <summary>
/// How long to wait after having planned to try planning again.

View File

@@ -33,6 +33,7 @@ public sealed class HTNSystem : EntitySystem
base.Initialize();
SubscribeLocalEvent<HTNComponent, MobStateChangedEvent>(_npc.OnMobStateChange);
SubscribeLocalEvent<HTNComponent, MapInitEvent>(_npc.OnNPCMapInit);
SubscribeLocalEvent<HTNComponent, ComponentStartup>(_npc.OnNPCStartup);
SubscribeLocalEvent<HTNComponent, PlayerAttachedEvent>(_npc.OnPlayerNPCAttach);
SubscribeLocalEvent<HTNComponent, PlayerDetachedEvent>(_npc.OnPlayerNPCDetach);
SubscribeLocalEvent<HTNComponent, ComponentShutdown>(OnHTNShutdown);

View File

@@ -0,0 +1,28 @@
using Content.Shared.StatusEffectNew;
using Robust.Shared.Prototypes;
namespace Content.Server.NPC.HTN.Preconditions;
/// <summary>
/// Returns true if entity have specified status effect
/// </summary>
public sealed partial class HasStatusEffectPrecondition : HTNPrecondition
{
private StatusEffectsSystem _statusEffects = default!;
[DataField(required: true)]
public EntProtoId StatusEffect;
public override void Initialize(IEntitySystemManager sysManager)
{
base.Initialize(sysManager);
_statusEffects = sysManager.GetEntitySystem<StatusEffectsSystem>();
}
public override bool IsMet(NPCBlackboard blackboard)
{
var owner = blackboard.GetValue<EntityUid>(NPCBlackboard.Owner);
return _statusEffects.HasStatusEffect(owner, StatusEffect);
}
}

View File

@@ -63,9 +63,13 @@ namespace Content.Server.NPC.Systems
WakeNPC(uid, component);
}
public void OnNPCMapInit(EntityUid uid, HTNComponent component, MapInitEvent args)
public void OnNPCStartup(EntityUid uid, HTNComponent component, ComponentStartup args)
{
component.Blackboard.SetValue(NPCBlackboard.Owner, uid);
}
public void OnNPCMapInit(EntityUid uid, HTNComponent component, MapInitEvent args)
{
WakeNPC(uid, component);
}

View File

@@ -27,7 +27,6 @@ internal sealed class StunOnCollideSystem : EntitySystem
if (ent.Comp.Refresh)
{
_stunSystem.TryUpdateStunDuration(target, ent.Comp.StunAmount);
_movementMod.TryUpdateMovementSpeedModDuration(
target,
MovementModStatusSystem.TaserSlowdown,

View File

@@ -1,6 +1,5 @@
using Content.Server.Administration.Logs;
using Content.Server.DeviceNetwork.Systems;
using Content.Shared.ActionBlocker;
using Content.Shared.Database;
using Content.Shared.DeviceNetwork;
using Content.Shared.DeviceNetwork.Events;
@@ -17,7 +16,6 @@ namespace Content.Server.SurveillanceCamera;
public sealed class SurveillanceCameraSystem : SharedSurveillanceCameraSystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
[Dependency] private readonly ViewSubscriberSystem _viewSubscriberSystem = default!;
[Dependency] private readonly DeviceNetworkSystem _deviceNetworkSystem = default!;
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;

View File

@@ -167,15 +167,21 @@ namespace Content.Shared.ActionBlocker
return !ev.Cancelled;
}
public bool CanPickup(EntityUid user, EntityUid item)
/// <summary>
/// Whether a user can pickup the given item.
/// </summary>
/// <param name="user">The mob trying to pick up the item.</param>
/// <param name="item">The item being picked up.</param>
/// <param name="showPopup">Whether or not to show a popup to the player telling them why the attempt failed.</param>
public bool CanPickup(EntityUid user, EntityUid item, bool showPopup = false)
{
var userEv = new PickupAttemptEvent(user, item);
var userEv = new PickupAttemptEvent(user, item, showPopup);
RaiseLocalEvent(user, userEv);
if (userEv.Cancelled)
return false;
var itemEv = new GettingPickedUpAttemptEvent(user, item);
var itemEv = new GettingPickedUpAttemptEvent(user, item, showPopup);
RaiseLocalEvent(item, itemEv);
return !itemEv.Cancelled;

View File

@@ -1,4 +1,5 @@
using Content.Shared.Damage;
using Content.Shared.Clothing.Components;
using Content.Shared.Damage;
using Content.Shared.Examine;
using Content.Shared.Inventory;
using Content.Shared.Silicons.Borgs;
@@ -32,6 +33,9 @@ public abstract class SharedArmorSystem : EntitySystem
/// <param name="args">The event, contains the running count of armor percentage as a coefficient</param>
private void OnCoefficientQuery(Entity<ArmorComponent> ent, ref InventoryRelayedEvent<CoefficientQueryEvent> args)
{
if (TryComp<MaskComponent>(ent, out var mask) && mask.IsToggled)
return;
foreach (var armorCoefficient in ent.Comp.Modifiers.Coefficients)
{
args.Args.DamageModifiers.Coefficients[armorCoefficient.Key] = args.Args.DamageModifiers.Coefficients.TryGetValue(armorCoefficient.Key, out var coefficient) ? coefficient * armorCoefficient.Value : armorCoefficient.Value;
@@ -40,12 +44,18 @@ public abstract class SharedArmorSystem : EntitySystem
private void OnDamageModify(EntityUid uid, ArmorComponent component, InventoryRelayedEvent<DamageModifyEvent> args)
{
if (TryComp<MaskComponent>(uid, out var mask) && mask.IsToggled)
return;
args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
}
private void OnBorgDamageModify(EntityUid uid, ArmorComponent component,
ref BorgModuleRelayedEvent<DamageModifyEvent> args)
{
if (TryComp<MaskComponent>(uid, out var mask) && mask.IsToggled)
return;
args.Args.Damage = DamageSpecifier.ApplyModifierSet(args.Args.Damage, component.Modifiers);
}

View File

@@ -13,6 +13,8 @@ namespace Content.Shared.Atmos.EntitySystems
private EntityQuery<InternalsComponent> _internalsQuery;
public string?[] GasReagents = new string[Atmospherics.TotalNumberOfGases];
protected readonly GasPrototype[] GasPrototypes = new GasPrototype[Atmospherics.TotalNumberOfGases];
public override void Initialize()
@@ -26,6 +28,7 @@ namespace Content.Shared.Atmos.EntitySystems
for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
{
GasPrototypes[i] = _prototypeManager.Index<GasPrototype>(i.ToString());
GasReagents[i] = GasPrototypes[i].Reagent;
}
}

View File

@@ -59,6 +59,8 @@ public sealed partial class SleepingSystem : EntitySystem
SubscribeLocalEvent<SleepingComponent, EntityZombifiedEvent>(OnZombified);
SubscribeLocalEvent<SleepingComponent, MobStateChangedEvent>(OnMobStateChanged);
SubscribeLocalEvent<SleepingComponent, ComponentInit>(OnCompInit);
SubscribeLocalEvent<SleepingComponent, ComponentRemove>(OnComponentRemoved);
SubscribeLocalEvent<SleepingComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<SleepingComponent, SpeakAttemptEvent>(OnSpeakAttempt);
SubscribeLocalEvent<SleepingComponent, CanSeeAttemptEvent>(OnSeeAttempt);
SubscribeLocalEvent<SleepingComponent, PointAttemptEvent>(OnPointAttempt);
@@ -69,7 +71,6 @@ public sealed partial class SleepingSystem : EntitySystem
SubscribeLocalEvent<SleepingComponent, InteractHandEvent>(OnInteractHand);
SubscribeLocalEvent<SleepingComponent, StunEndAttemptEvent>(OnStunEndAttempt);
SubscribeLocalEvent<SleepingComponent, StandUpAttemptEvent>(OnStandUpAttempt);
SubscribeLocalEvent<SleepingComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<ForcedSleepingStatusEffectComponent, StatusEffectAppliedEvent>(OnStatusEffectApplied);
SubscribeLocalEvent<SleepingComponent, UnbuckleAttemptEvent>(OnUnbuckleAttempt);
@@ -102,6 +103,12 @@ public sealed partial class SleepingSystem : EntitySystem
TrySleeping((ent, ent.Comp));
}
private void OnRejuvenate(Entity<SleepingComponent> ent, ref RejuvenateEvent args)
{
// WAKE UP!!!
RemComp<SleepingComponent>(ent);
}
/// <summary>
/// when sleeping component is added or removed, we do some stuff with other components.
/// </summary>
@@ -143,6 +150,16 @@ public sealed partial class SleepingSystem : EntitySystem
_actionsSystem.AddAction(ent, ref ent.Comp.WakeAction, WakeActionId, ent);
}
private void OnComponentRemoved(Entity<SleepingComponent> ent, ref ComponentRemove args)
{
_actionsSystem.RemoveAction(ent.Owner, ent.Comp.WakeAction);
var ev = new SleepStateChangedEvent(false);
RaiseLocalEvent(ent, ref ev);
_blindableSystem.UpdateIsBlind(ent.Owner);
}
private void OnSpeakAttempt(Entity<SleepingComponent> ent, ref SpeakAttemptEvent args)
{
// TODO reduce duplication of this behavior with MobStateSystem somehow
@@ -187,11 +204,6 @@ public sealed partial class SleepingSystem : EntitySystem
args.Cancelled = true;
}
private void OnRejuvenate(Entity<SleepingComponent> ent, ref RejuvenateEvent args)
{
TryWaking((ent.Owner, ent.Comp), true);
}
private void OnExamined(Entity<SleepingComponent> ent, ref ExaminedEvent args)
{
if (args.IsInDetailsRange)
@@ -275,17 +287,6 @@ public sealed partial class SleepingSystem : EntitySystem
TrySleeping(args.Target);
}
private void Wake(Entity<SleepingComponent> ent)
{
RemComp<SleepingComponent>(ent);
_actionsSystem.RemoveAction(ent.Owner, ent.Comp.WakeAction);
var ev = new SleepStateChangedEvent(false);
RaiseLocalEvent(ent, ref ev);
_blindableSystem.UpdateIsBlind(ent.Owner);
}
/// <summary>
/// Try sleeping. Only mobs can sleep.
/// </summary>
@@ -345,8 +346,7 @@ public sealed partial class SleepingSystem : EntitySystem
_popupSystem.PopupClient(Loc.GetString("wake-other-success", ("target", Identity.Entity(ent, EntityManager))), ent, user);
}
Wake((ent, ent.Comp));
return true;
return RemComp<SleepingComponent>(ent);
}
/// <summary>

View File

@@ -0,0 +1,6 @@
using Content.Shared.Body.Systems;
namespace Content.Shared.Body.Components;
[RegisterComponent, Access(typeof(BrainSystem))]
public sealed partial class BrainComponent : Component;

View File

@@ -1,12 +1,13 @@
using Content.Server.Body.Systems;
using Content.Shared.Body.Systems;
using Content.Shared.Alert;
using Content.Shared.Atmos;
using Content.Shared.Chemistry.Components;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Server.Body.Components;
namespace Content.Shared.Body.Components;
[RegisterComponent, Access(typeof(LungSystem))]
[RegisterComponent, NetworkedComponent, Access(typeof(LungSystem))]
public sealed partial class LungComponent : Component
{
[DataField]

View File

@@ -1,12 +1,12 @@
using Content.Server.Body.Components;
using Content.Server.Ghost.Components;
using Content.Shared.Body.Components;
using Content.Shared.Body.Events;
using Content.Shared.Ghost;
using Content.Shared.Mind;
using Content.Shared.Mind.Components;
using Content.Shared.Mobs.Components;
using Content.Shared.Pointing;
namespace Content.Server.Body.Systems;
namespace Content.Shared.Body.Systems;
public sealed class BrainSystem : EntitySystem
{
@@ -43,4 +43,3 @@ public sealed class BrainSystem : EntitySystem
args.Cancel();
}
}

View File

@@ -1,19 +1,18 @@
using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.EntitySystems;
using Content.Shared.Body.Components;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Chemistry.Components;
using Content.Shared.Clothing;
using Content.Shared.Inventory.Events;
using BreathToolComponent = Content.Shared.Atmos.Components.BreathToolComponent;
using InternalsComponent = Content.Shared.Body.Components.InternalsComponent;
namespace Content.Server.Body.Systems;
namespace Content.Shared.Body.Systems;
public sealed class LungSystem : EntitySystem
{
[Dependency] private readonly AtmosphereSystem _atmos = default!;
[Dependency] private readonly InternalsSystem _internals = default!;
[Dependency] private readonly SharedAtmosphereSystem _atmos = default!;
[Dependency] private readonly SharedInternalsSystem _internals = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
public static string LungSolutionName = "Lung";

View File

@@ -573,7 +573,7 @@ namespace Content.Shared.Containers.ItemSlots
item = slot.Item;
// This handles user logic
if (user != null && item != null && !_actionBlockerSystem.CanPickup(user.Value, item.Value))
if (user != null && item != null && !_actionBlockerSystem.CanPickup(user.Value, item.Value, showPopup: true))
return false;
Eject(uid, slot, item!.Value, user, excludeUserAudio);

View File

@@ -3,6 +3,7 @@ using Content.Shared.Inventory;
using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Tools.Components;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Clothing.Components;
namespace Content.Shared.Eye.Blinding.Systems
{
@@ -29,6 +30,9 @@ namespace Content.Shared.Eye.Blinding.Systems
private void OnGetProtection(EntityUid uid, EyeProtectionComponent component, GetEyeProtectionEvent args)
{
if (TryComp<MaskComponent>(uid, out var mask) && mask.IsToggled)
return;
args.Protection += component.ProtectionTime;
}

View File

@@ -22,6 +22,7 @@ using Robust.Shared.Timing;
using System.Linq;
using Content.Shared.Movement.Systems;
using Content.Shared.Random.Helpers;
using Content.Shared.Clothing.Components;
namespace Content.Shared.Flash;
@@ -258,6 +259,9 @@ public abstract class SharedFlashSystem : EntitySystem
private void OnFlashImmunityFlashAttempt(Entity<FlashImmunityComponent> ent, ref FlashAttemptEvent args)
{
if (TryComp<MaskComponent>(ent, out var mask) && mask.IsToggled)
return;
if (ent.Comp.Enabled)
args.Cancelled = true;
}

View File

@@ -0,0 +1,13 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Ghost;
[RegisterComponent, NetworkedComponent]
public sealed partial class GhostOnMoveComponent : Component
{
[DataField]
public bool CanReturn = true;
[DataField]
public bool MustBeDead;
}

View File

@@ -181,7 +181,7 @@ public abstract partial class SharedHandsSystem : EntitySystem
if (!CanDropHeld(uid, handName, checkActionBlocker))
return false;
if (!CanPickupToHand(uid, entity.Value, handsComp.ActiveHandId, checkActionBlocker, handsComp))
if (!CanPickupToHand(uid, entity.Value, handsComp.ActiveHandId, checkActionBlocker: checkActionBlocker, handsComp: handsComp))
return false;
DoDrop(uid, handName, false, log: false);

View File

@@ -1,4 +1,3 @@
using System.Diagnostics;
using Content.Shared.Database;
using Content.Shared.Hands.Components;
using Content.Shared.Item;
@@ -84,7 +83,10 @@ public abstract partial class SharedHandsSystem
if (!Resolve(entity, ref item, false))
return false;
if (!CanPickupToHand(uid, entity, handId, checkActionBlocker, handsComp, item))
if (!CanPickupToHand(uid, entity, handId, checkActionBlocker: checkActionBlocker, showPopup: true, handsComp: handsComp, item: item))
return false;
if (!BeforeDoPickup((uid, handsComp), entity))
return false;
if (animate)
@@ -151,7 +153,11 @@ public abstract partial class SharedHandsSystem
return false;
}
public bool CanPickupAnyHand(EntityUid uid, EntityUid entity, bool checkActionBlocker = true, HandsComponent? handsComp = null, ItemComponent? item = null)
/// <summary>
/// Checks whether a given item will fit into the user's first free hand.
/// Unless otherwise specified, this will also check the general CanPickup action blocker.
/// </summary>
public bool CanPickupAnyHand(EntityUid uid, EntityUid entity, bool checkActionBlocker = true, bool showPopup = false, HandsComponent? handsComp = null, ItemComponent? item = null)
{
if (!Resolve(uid, ref handsComp, false))
return false;
@@ -159,13 +165,14 @@ public abstract partial class SharedHandsSystem
if (!TryGetEmptyHand((uid, handsComp), out var hand))
return false;
return CanPickupToHand(uid, entity, hand, checkActionBlocker, handsComp, item);
return CanPickupToHand(uid, entity, hand, checkActionBlocker, showPopup, handsComp, item);
}
/// <summary>
/// Checks whether a given item will fit into a specific user's hand. Unless otherwise specified, this will also check the general CanPickup action blocker.
/// Checks whether a given item will fit into a specific user's hand.
/// Unless otherwise specified, this will also check the general CanPickup action blocker.
/// </summary>
public bool CanPickupToHand(EntityUid uid, EntityUid entity, string handId, bool checkActionBlocker = true, HandsComponent? handsComp = null, ItemComponent? item = null)
public bool CanPickupToHand(EntityUid uid, EntityUid entity, string handId, bool checkActionBlocker = true, bool showPopup = false, HandsComponent? handsComp = null, ItemComponent? item = null)
{
if (!Resolve(uid, ref handsComp, false))
return false;
@@ -176,13 +183,17 @@ public abstract partial class SharedHandsSystem
if (handContainer.ContainedEntities.FirstOrNull() != null)
return false;
// Huh, seems kinda weird that this system passes item comp around
// everywhere but it's never actually used besides being resolved.
// I wouldn't be surprised if there's some API simplifications that
// could be made with respect to that.
if (!Resolve(entity, ref item, false))
return false;
if (TryComp(entity, out PhysicsComponent? physics) && physics.BodyType == BodyType.Static)
return false;
if (checkActionBlocker && !_actionBlocker.CanPickup(uid, entity))
if (checkActionBlocker && !_actionBlocker.CanPickup(uid, entity, showPopup))
return false;
if (!CheckWhitelists((uid, handsComp), handId, entity))
@@ -232,6 +243,28 @@ public abstract partial class SharedHandsSystem
}
}
/// <summary>
/// Small helper function meant as a last step before <see cref="DoPickup"/>
/// is called. Used to run a cancelable before pickup event that can have
/// side effects, unlike the side effect free <see cref="GettingPickedUpAttemptEvent"/>.
/// </summary>
private bool BeforeDoPickup(Entity<HandsComponent?> user, EntityUid item)
{
if (!Resolve(user, ref user.Comp))
return false;
var userEv = new BeforeEquippingHandEvent(item);
RaiseLocalEvent(user, ref userEv);
if (userEv.Cancelled)
return false;
var itemEv = new BeforeGettingEquippedHandEvent(user);
RaiseLocalEvent(item, ref itemEv);
return !itemEv.Cancelled;
}
/// <summary>
/// Puts an entity into the player's hand, assumes that the insertion is allowed. In general, you should not be calling this function directly.
/// </summary>

View File

@@ -1,5 +1,6 @@
using System.Numerics;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using JetBrains.Annotations;
using Robust.Shared.Map;
using Robust.Shared.Serialization;
@@ -156,6 +157,32 @@ namespace Content.Shared.Hands
}
}
/// <summary>
/// Raised against an item being picked up before it is actually inserted
/// into the pick-up-ers hand container. This can be handled with side
/// effects, and may be canceled preventing the pickup in a way that
/// <see cref="SharedHandsSystem.CanPickupToHand"/> and similar don't see.
/// </summary>
/// <param name="User">The user picking up the item.</param>
/// <param name="Cancelled">
/// If true, the item will not be equipped into the user's hand.
/// </param>
[ByRefEvent]
public record struct BeforeGettingEquippedHandEvent(EntityUid User, bool Cancelled = false);
/// <summary>
/// Raised against a mob picking up and item before it is actually inserted
/// into the pick-up-ers hand container. This can be handled with side
/// effects, and may be canceled preventing the pickup in a way that
/// <see cref="SharedHandsSystem.CanPickupToHand"/> and similar don't see.
/// </summary>
/// <param name="Item">The item being picked up.</param>
/// <param name="Cancelled">
/// If true, the item will not be equipped into the user's hand.
/// </param>
[ByRefEvent]
public record struct BeforeEquippingHandEvent(EntityUid Item, bool Cancelled = false);
/// <summary>
/// Raised when putting an entity into a hand slot
/// </summary>

View File

@@ -100,6 +100,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
{
SkinColorationStrategyInput.Unary => skinColoration.FromUnary(speciesPrototype.DefaultHumanSkinTone),
SkinColorationStrategyInput.Color => skinColoration.ClosestSkinColor(speciesPrototype.DefaultSkinTone),
_ => skinColoration.ClosestSkinColor(speciesPrototype.DefaultSkinTone),
};
return new(
@@ -109,11 +110,11 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
Color.Black,
Color.Black,
skinColor,
new ()
new()
);
}
private static IReadOnlyList<Color> RealisticEyeColors = new List<Color>
private static IReadOnlyList<Color> _realisticEyeColors = new List<Color>
{
Color.Brown,
Color.Gray,
@@ -145,7 +146,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
// TODO: Add random markings
var newEyeColor = random.Pick(RealisticEyeColors);
var newEyeColor = random.Pick(_realisticEyeColors);
var protoMan = IoCManager.Resolve<IPrototypeManager>();
var skinType = protoMan.Index<SpeciesPrototype>(species).SkinColoration;
@@ -155,9 +156,10 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
{
SkinColorationStrategyInput.Unary => strategy.FromUnary(random.NextFloat(0f, 100f)),
SkinColorationStrategyInput.Color => strategy.ClosestSkinColor(new Color(random.NextFloat(1), random.NextFloat(1), random.NextFloat(1), 1)),
_ => strategy.ClosestSkinColor(new Color(random.NextFloat(1), random.NextFloat(1), random.NextFloat(1), 1)),
};
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ());
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new());
float RandomizeColor(float channel)
{

View File

@@ -37,12 +37,17 @@ public sealed class MultiHandedItemSystem : EntitySystem
private void OnAttemptPickup(Entity<MultiHandedItemComponent> ent, ref GettingPickedUpAttemptEvent args)
{
if (_hands.CountFreeHands(args.User) >= ent.Comp.HandsNeeded)
if (args.Cancelled || _hands.CountFreeHands(args.User) >= ent.Comp.HandsNeeded)
return;
args.Cancel();
_popup.PopupPredictedCursor(Loc.GetString("multi-handed-item-pick-up-fail",
("number", ent.Comp.HandsNeeded - 1), ("item", ent.Owner)), args.User);
if (args.ShowPopup)
_popup.PopupPredictedCursor(
Loc.GetString("multi-handed-item-pick-up-fail",
("number", ent.Comp.HandsNeeded - 1),
("item", ent.Owner)),
args.User);
}
private void OnVirtualItemDeleted(Entity<MultiHandedItemComponent> ent, ref VirtualItemDeletedEvent args)

View File

@@ -1,30 +1,47 @@
namespace Content.Shared.Item;
/// <summary>
/// Raised on a *mob* when it tries to pickup something
/// Raised on a *mob* when it tries to pickup something.
/// IMPORTANT: Attempt event subscriptions should not be doing any state changes like throwing items, opening UIs, playing sounds etc!
/// </summary>
public sealed class PickupAttemptEvent : BasePickupAttemptEvent
{
public PickupAttemptEvent(EntityUid user, EntityUid item) : base(user, item) { }
public PickupAttemptEvent(EntityUid user, EntityUid item, bool showPopup) : base(user, item, showPopup) { }
}
/// <summary>
/// Raised directed at entity being picked up when someone tries to pick it up
/// Raised directed at entity being picked up when someone tries to pick it up.
/// IMPORTANT: Attempt event subscriptions should not be doing any state changes like throwing items, opening UIs, playing sounds etc!
/// </summary>
public sealed class GettingPickedUpAttemptEvent : BasePickupAttemptEvent
{
public GettingPickedUpAttemptEvent(EntityUid user, EntityUid item) : base(user, item) { }
public GettingPickedUpAttemptEvent(EntityUid user, EntityUid item, bool showPopup) : base(user, item, showPopup) { }
}
[Virtual]
public class BasePickupAttemptEvent : CancellableEntityEventArgs
{
/// <summary>
/// The mob that is picking up the item.
/// </summary>
public readonly EntityUid User;
/// <summary>
/// The item being picked up.
/// </summary>
public readonly EntityUid Item;
public BasePickupAttemptEvent(EntityUid user, EntityUid item)
/// <summary>
/// Whether or not to show a popup message to the player telling them why the attempt was cancelled.
/// This should be true when this event is raised during interactions, and false when it is raised
/// for disabling verbs or similar that do not do the actual pickup.
/// </summary>
public bool ShowPopup;
public BasePickupAttemptEvent(EntityUid user, EntityUid item, bool showPopup)
{
User = user;
Item = item;
ShowPopup = showPopup;
}
}

View File

@@ -51,7 +51,6 @@ public sealed partial class ParcelWrappingSystem : EntitySystem
wrapper.Owner != target &&
// Wrapper should never be empty, but may as well make sure.
!_charges.IsEmpty(wrapper.Owner) &&
_whitelist.IsWhitelistPass(wrapper.Comp.Whitelist, target) &&
_whitelist.IsBlacklistFail(wrapper.Comp.Blacklist, target);
_whitelist.CheckBoth(target, wrapper.Comp.Blacklist, wrapper.Comp.Whitelist);
}
}

View File

@@ -212,6 +212,7 @@ namespace Content.Shared.Preferences
return new()
{
Species = species,
Appearance = HumanoidCharacterAppearance.DefaultWithSpecies(species),
};
}

View File

@@ -1,15 +1,19 @@
using Content.Shared.Inventory;
using Robust.Shared.GameStates;
namespace Content.Shared.Storage.Components;
/// <summary>
/// Applies an ongoing pickup area around the attached entity.
/// </summary>
[RegisterComponent, AutoGenerateComponentPause]
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState]
[AutoGenerateComponentPause]
public sealed partial class MagnetPickupComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField("nextScan")]
[AutoPausedField]
[AutoNetworkedField]
public TimeSpan NextScan = TimeSpan.Zero;
/// <summary>

View File

@@ -47,6 +47,7 @@ public sealed class MagnetPickupSystem : EntitySystem
continue;
comp.NextScan += ScanDelay;
Dirty(uid, comp);
if (!_inventory.TryGetContainingSlot((uid, xform, meta), out var slotDef))
continue;

View File

@@ -379,7 +379,7 @@ public abstract class SharedStrippableSystem : EntitySystem
return false;
}
if (!_handsSystem.CanPickupToHand(target, activeItem.Value, handName, checkActionBlocker: false, target.Comp))
if (!_handsSystem.CanPickupToHand(target, activeItem.Value, handName, checkActionBlocker: false, handsComp: target.Comp))
{
_popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-put-message", ("owner", Identity.Entity(target, EntityManager))));
return false;

View File

@@ -2,7 +2,6 @@
using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Eye.Blinding.Systems;
using Content.Shared.IdentityManagement;
using Robust.Shared.Network;
namespace Content.Shared.Traits.Assorted;
@@ -38,18 +37,23 @@ public sealed class PermanentBlindnessSystem : EntitySystem
{
_blinding.SetMinDamage((blindness.Owner, blindable), 0);
}
// Heal all eye damage when the component is removed.
// Otherwise you would still be blind, but not *permanently* blind, meaning you have to heal the eye damage with oculine.
// This is needed for changelings that transform from a blind player to a non-blind one.
_blinding.AdjustEyeDamage((blindness.Owner, blindable), -blindable.EyeDamage);
}
private void OnMapInit(Entity<PermanentBlindnessComponent> blindness, ref MapInitEvent args)
{
if(!TryComp<BlindableComponent>(blindness.Owner, out var blindable))
if (!TryComp<BlindableComponent>(blindness.Owner, out var blindable))
return;
if (blindness.Comp.Blindness != 0)
_blinding.SetMinDamage((blindness.Owner, blindable), blindness.Comp.Blindness);
else
{
var maxMagnitudeInt = (int) BlurryVisionComponent.MaxMagnitude;
var maxMagnitudeInt = (int)BlurryVisionComponent.MaxMagnitude;
_blinding.SetMinDamage((blindness.Owner, blindable), maxMagnitudeInt);
}
}

View File

@@ -75,6 +75,7 @@ public sealed partial class TimerTriggerComponent : Component
/// <summary>
/// The entity that activated this trigger.
/// TODO: use WeakEntityReference once the engine PR is merged!
/// </summary>
[DataField, AutoNetworkedField]
public EntityUid? User;

View File

@@ -168,7 +168,8 @@ public sealed partial class TriggerSystem
if (timer.NextTrigger <= curTime)
{
Trigger(uid, timer.User, timer.KeyOut);
var user = TerminatingOrDeleted(timer.User) ? null : timer.User;
Trigger(uid, user, timer.KeyOut);
// Remove after triggering to prevent it from starting the timer again
RemComp<ActiveTimerTriggerComponent>(uid);
if (TryComp<AppearanceComponent>(uid, out var appearance))

View File

@@ -107,6 +107,7 @@ public sealed partial class TriggerSystem : EntitySystem
ent.Comp.NextTrigger = curTime + ent.Comp.Delay;
var delay = ent.Comp.InitialBeepDelay ?? ent.Comp.BeepInterval;
ent.Comp.NextBeep = curTime + delay;
ent.Comp.User = user;
Dirty(ent);
var ev = new ActiveTimerTriggerEvent(user);

View File

@@ -17,7 +17,7 @@ public sealed partial class PendingZombieComponent : Component
{
DamageDict = new ()
{
{ "Poison", 0.4 },
{ "Poison", 0.3 },
}
};
@@ -34,7 +34,7 @@ public sealed partial class PendingZombieComponent : Component
/// The amount of time left before the infected begins to take damage.
/// </summary>
[DataField("gracePeriod"), ViewVariables(VVAccess.ReadWrite)]
public TimeSpan GracePeriod = TimeSpan.Zero;
public TimeSpan GracePeriod = TimeSpan.FromMinutes(2);
/// <summary>
/// The minimum amount of time initial infected have before they start taking infection damage.

View File

@@ -1447,5 +1447,19 @@ Entries:
id: 175
time: '2025-09-25T21:43:53.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40246
- author: Kowlin
changes:
- message: Adjusted meatspike admin log severities.
type: Tweak
id: 176
time: '2025-10-03T11:31:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40604
- author: Kowlin
changes:
- message: Stun prods are now high severity when crafted.
type: Tweak
id: 177
time: '2025-10-05T07:40:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40709
Name: Admin
Order: 2

View File

@@ -1,413 +1,15 @@
Entries:
- author: EmoGarbage404
- author: CoconutThunder
changes:
- message: You can now patch holes in the floors of the evac shuttle and ATS.
- message: Fixed lubed items being thrown when looking at the pickup verb.
type: Fix
id: 8501
time: '2025-05-17T01:54:27.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36989
- author: Lanedon
changes:
- message: Multiple head gear now hides the hair !
- message: Fixed multihanded items showing a popup when looking at the pickup verb.
type: Fix
id: 8502
time: '2025-05-17T05:05:43.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36818
- author: ArtisticRoomba
changes:
- message: Metal foam grenades have been added to station engineer lockers.
type: Add
- message: Metal foam grenades have been tweaked to cover more area over a longer
period of time.
type: Tweak
- message: Metal foam grenades now have a 5 second timer.
type: Tweak
- message: Aluminum foam walls now take one hit to destroy.
type: Tweak
id: 8503
time: '2025-05-17T05:21:24.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37476
- author: EmoGarbage404
changes:
- message: Fixed tetherguns not having a beam when dragging.
- message: Fixed a bug with lubed handcuffs.
type: Fix
id: 8504
time: '2025-05-17T05:22:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37510
- author: aada
changes:
- message: Id cards now have the same max length as character names.
type: Fix
id: 8505
time: '2025-05-17T05:27:39.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35407
- author: ArtisticRoomba
changes:
- message: Radiation collector power output has been buffed. Remember engineers,
the third level on the PA is safe for long term use!
type: Tweak
id: 8506
time: '2025-05-17T07:45:44.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37475
- author: Ilya246
changes:
- message: Shuttles can now deal (weak) collision damage.
type: Add
id: 8507
time: '2025-05-17T17:11:08.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37422
- author: VlaDOS1408
changes:
- message: Fax UI Menu has been reworked and now behaves better on resizing
type: Tweak
id: 8508
time: '2025-05-17T17:20:11.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/33825
- author: YotaXP
changes:
- message: Favorites selected in the construction menu will now persist between
rounds.
type: Tweak
id: 8509
time: '2025-05-17T17:37:19.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35867
- author: perryprog
changes:
- message: You can now link cutter machines to material silos.
type: Tweak
id: 8510
time: '2025-05-18T01:51:58.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37554
- author: Spangs04
changes:
- message: Resprited Telecomms
type: Tweak
id: 8511
time: '2025-05-18T02:10:56.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35811
- author: EmoGarbage404
changes:
- message: Added the salvage job board! This board allows salvagers to access and
complete a variety of jobs in order to rank up, earn spesos, and unlock new
cargo orders. Work hard and you too may become a Supreme Salvager.
type: Add
id: 8512
time: '2025-05-18T04:02:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37549
- author: EmoGarbage404
changes:
- message: Lathes can no longer connect to research servers on separate grids
type: Tweak
id: 8513
time: '2025-05-18T04:04:28.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36821
- author: 0leshe
changes:
- message: Changed max and minimum amount of jigger transfer amount
type: Tweak
id: 8514
time: '2025-05-18T04:14:23.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35962
- author: ArtisticRoomba
changes:
- message: Air grenades have been added! These can fill up a spaced room of ~30
tiles with fresh air. They can be found in Atmospheric Technician's lockers.
Use them wisely!
type: Add
id: 8515
time: '2025-05-18T04:32:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37531
- author: EmoGarbage404
changes:
- message: Various salvage equipment can now be unlocked through the job board and
purchased through cargo.
type: Add
- message: Space debris and the mining asteroid no longer generate salvage equipment
type: Tweak
id: 8516
time: '2025-05-18T06:40:59.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37561
- author: mrjajkes
changes:
- message: Add Blatantly Nuclear as a Nuke Song.
type: Add
id: 8517
time: '2025-05-18T07:30:20.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35927
- author: metalgearsloth
changes:
- message: Shuttles now are treated as rooved for daylight.
type: Tweak
id: 8518
time: '2025-05-18T07:47:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36112
- author: ScarKy0
changes:
- message: Deliveries can now very rarely spawn as bomb-type! They grant A LOT of
spesos... at a price.
type: Add
id: 8519
time: '2025-05-18T08:57:23.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37069
- author: ScarKy0
changes:
- message: Aloxadone has been tweaked. The recipe has been altered to be simplier
to make and the healing values have been increased.
type: Tweak
id: 8523
time: '2025-05-18T09:16:14.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37239
- author: Simyon
changes:
- message: The Syndicate and Wizard Communications Console now no longer show who
the message was sent by.
type: Tweak
id: 8524
time: '2025-05-18T09:18:18.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37567
- author: SuperGDPWYL
changes:
- message: A Lone Operative detonating the nuke on-station will now end the round.
type: Add
- message: The endscreen will now properly show how successful Lone Operatives were.
type: Fix
id: 8525
time: '2025-05-18T11:34:33.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36498
- author: metalgearsloth
changes:
- message: Fixes being able to grab items through walls.
type: Fix
id: 8526
time: '2025-05-18T14:38:32.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37570
- author: qwerltaz
changes:
- message: Water vapor is now dangerous to slime life-forms.
type: Add
id: 8527
time: '2025-05-18T22:55:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/32751
- author: slarticodefast
changes:
- message: Added a new keybind for swapping hands in the other direction (if you
got more than two). Defaults to Shift+X. Useful for cycling through borg modules.
type: Add
id: 8528
time: '2025-05-19T01:17:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37588
- author: keronshb
changes:
- message: Force Wall timers changed so it despawns faster than it can be cast.
type: Tweak
- message: Force Wall users can now interact while inside of the wall, but also
can be attacked while inside of the wall.
type: Tweak
id: 8529
time: '2025-05-19T01:30:46.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37525
- author: Samuka
changes:
- message: Holy water now evaporates.
type: Fix
id: 8530
time: '2025-05-19T16:14:40.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37611
- author: aada
changes:
- message: Pepper makes you cough.
type: Add
id: 8531
time: '2025-05-19T18:23:38.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36358
- author: Entvari
changes:
- message: Hyper Capacity Powercells are now available as Tier 3 Industrial Research.
type: Add
- message: The Tier 3 Industrial Research 'Portable Fission' has been renamed to
Optimized Microgalvanism to better reflect this.
type: Tweak
id: 8532
time: '2025-05-19T22:35:08.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37619
- author: RedBookcase
changes:
- message: The Salvage section of the guidebook has been updated.
type: Fix
id: 8533
time: '2025-05-19T22:39:23.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37593
- author: SpeltIncorrectyl
changes:
- message: Kammerer now has a tighter spread to compensate for its lower rate of
fire.
type: Tweak
id: 8534
time: '2025-05-19T22:45:18.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37616
- author: Pronana
changes:
- message: Galoshes now slow on puddles again
type: Fix
id: 8535
time: '2025-05-20T02:47:03.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37628
- author: slarticodefast
changes:
- message: Added a reduced motion version of the seeing rainbows overlay.
type: Add
id: 8536
time: '2025-05-20T12:36:08.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37584
- author: B-Kirill
changes:
- message: Added new fun meteors variations (Cosmic cow, Honksteroid, Space potato)
that drop unique loot upon destruction. Urist McMeteor now shatters into meat
when explodes.
type: Add
id: 8537
time: '2025-05-20T13:04:27.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37327
- author: Kittygyat
changes:
- message: Added a new, faster way for slimepeople to access their own special inventory,
with LMB.
type: Add
id: 8538
time: '2025-05-20T16:55:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37592
- author: FrostWinters
changes:
- message: Histamines no longer cause radiation.
type: Tweak
- message: Epinephrine treats Histamines above OD threshold.
type: Tweak
id: 8544
time: '2025-05-21T01:12:54.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37460
- author: Minty642
changes:
- message: Added fungal soil, maintenance version of hydroponics.
type: Add
id: 8545
time: '2025-05-21T04:59:51.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36245
- author: metalgearsloth
changes:
- message: Picking up items with area pickups (e.g. trash bags) no longer lags the
game.
type: Fix
id: 8546
time: '2025-05-21T06:16:27.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37638
- author: Errant
changes:
- message: High-energy shuttle impacts now deal much less damage.
type: Tweak
id: 8547
time: '2025-05-21T10:37:36.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37578
- author: metalgearsloth
changes:
- message: Shuttle impact force is now proportional to direction of impact.
type: Tweak
id: 8548
time: '2025-05-21T13:32:46.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37667
- author: muburu
changes:
- message: Singularity beacons and powersinks now require two free hands to hold.
type: Tweak
id: 8549
time: '2025-05-21T17:11:34.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37683
- author: ElectroJr
changes:
- message: Microwaving the nuke disk will now slightly randomize the nuke countdown
timer.
type: Add
id: 8550
time: '2025-05-21T18:06:58.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36114
- author: AsnDen
changes:
- message: Cyborgs now can scream. 9 new screaming sound were added.
type: Tweak
id: 8551
time: '2025-05-21T19:49:56.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/32329
- author: ScarKy0
changes:
- message: The "Help another traitor" objective now requires you help them complete
all of their objectives.
type: Tweak
- message: The "Help another traitor" objective now updates it's progress according
to the progress of who you're supposed to help, allowing for partial completion.
type: Tweak
id: 8552
time: '2025-05-21T20:45:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37679
- author: PJB3005
changes:
- message: Significantly reduced video memory usage of the parallax system.
type: Tweak
id: 8553
time: '2025-05-22T01:22:08.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37180
- author: ArtisticRoomba
changes:
- message: Tesla coils can now hold a max capacity of 5 MJ, and receive 5 MJ of
energy when struck by lightning.
type: Tweak
- message: Tesla coils can now only output a maximum of 350 kW to the grid. This
was done to make power flow smoother (it was triggering epilepsy in extreme
circumstances).
type: Tweak
id: 8554
time: '2025-05-22T01:39:49.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37626
- author: Wolfkey-SomeoneElseTookMyUsername
changes:
- message: You can now construct disposal signalers, which trigger a signal every
time an item passes through them.
type: Add
id: 8555
time: '2025-05-22T02:18:57.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37535
- author: ScarKy0
changes:
- message: The "Escape alive and unrestrained" objective now counts as partially
complete if you show up handcuffed. Being dead still has it count as a total
fail!
type: Tweak
id: 8556
time: '2025-05-22T03:25:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37680
- author: EmoGarbage404
changes:
- message: Added cargo orders for gold and silver ingots.
type: Add
- message: Reduced prices of cardboard and paper material crate.
type: Tweak
id: 8557
time: '2025-05-22T08:42:20.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37713
- author: ArtisticRoomba
changes:
- message: The volume of large gas canisters have been increased to 1500L to encourage
their usage in resolving pressure problems in spaced rooms. The gas that starts
inside of the tanks and the price of them has increased to compensate.
type: Tweak
id: 8558
time: '2025-05-22T18:12:25.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37564
- author: Hitlinemoss
changes:
- message: Liquid soap is now slippery.
type: Fix
id: 8559
time: '2025-05-23T21:57:06.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37747
id: 8561
time: '2025-05-25T05:10:58.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/38705
- author: CoconutThunder
changes:
- message: The Chief Medical Officer should now appear with the correct precedence
@@ -3963,3 +3565,382 @@
id: 9011
time: '2025-09-27T17:01:14.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39914
- author: SignalSender
changes:
- message: reworked salv instrument spawns to include more instruments
type: Tweak
id: 9012
time: '2025-09-27T20:51:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40572
- author: SurrealShibe
changes:
- message: Vulpkanin now audibly gasp.
type: Fix
id: 9014
time: '2025-09-28T03:25:39.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40579
- author: keronshb
changes:
- message: Tasers can now be used by Pacifists.
type: Tweak
id: 9015
time: '2025-09-28T03:43:02.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40588
- author: beck-thompson
changes:
- message: Labelers can no longer add markup tags to items
type: Fix
id: 9016
time: '2025-09-28T18:33:27.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40600
- author: SirWarock
changes:
- message: Fixed Shotgun Ammo Count not properly updating when reloading!
type: Fix
id: 9017
time: '2025-09-29T10:28:45.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40568
- author: BoskiYourk, spanky_spanky
changes:
- message: Microwaves can now be picked up when unwrenched, and optionally, used
as a weapon.
type: Tweak
id: 9018
time: '2025-09-30T21:55:10.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40618
- author: leahcat
changes:
- message: moved desoxyephedrine from ambrosia plants to glasstle.
type: Tweak
id: 9019
time: '2025-10-01T04:05:41.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40638
- author: SignalSender
changes:
- message: Musicians now have a Stage Name
type: Tweak
id: 9020
time: '2025-10-01T11:46:34.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40640
- author: Velcroboy
changes:
- message: Shutters, blast doors, and lights can now be linked using the "Link Defaults"
button.
type: Tweak
id: 9021
time: '2025-10-01T20:22:50.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37690
- author: YoungThugSS14
changes:
- message: The Prisoner Eva Suit now has the same stats as an emergency eva suit.
type: Tweak
id: 9022
time: '2025-10-01T20:23:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36696
- author: K-Dynamic
changes:
- message: Puddles now spill over at 50u instead of 20u.
type: Add
id: 9023
time: '2025-10-01T20:28:13.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/38044
- author: Mixelz
changes:
- message: Circuit Totes, a new type of box to compactly carry conspicous chunks
of Circuits!
type: Add
- message: Head Lockers now compact all circuit boards & stamps into boxes for convenience.
type: Tweak
- message: The Surplus Circuit Crate is now a Tote!
type: Tweak
id: 9024
time: '2025-10-01T23:22:33.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39868
- author: sudobeans
changes:
- message: utility knife, which can be made in the autolathe.
type: Add
id: 9025
time: '2025-10-02T09:02:36.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39567
- author: kosticia
changes:
- message: Anomalies with inconsistent particles no longer shuffle right before
collision with particle.
type: Fix
id: 9026
time: '2025-10-02T20:11:25.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40624
- author: archee1
changes:
- message: Material doors now have destruction sounds and will drop a portion of
their construction materials when destroyed.
type: Add
- message: Material doors now have reduced health, resistances, construction time,
and construction costs
type: Tweak
id: 9027
time: '2025-10-02T22:47:11.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36597
- author: PJB3005
changes:
- message: You can stuff the nuke disk in plushies now.
type: Tweak
id: 9028
time: '2025-10-03T09:53:41.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40674
- author: Crude Oil
changes:
- message: Returned PDA lights to original brightness
type: Fix
id: 9029
time: '2025-10-03T20:33:25.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40687
- author: NoreUhh
changes:
- message: The Syndicate Cyborg Martyr Module can now be used multiple times.
type: Tweak
id: 9030
time: '2025-10-03T23:35:01.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40224
- author: K-Dynamic
changes:
- message: Adds smart equip function to pocket 1, pocket 2, and suit storage slots.
Default binds are Shift+F and Shift+G for first and second pocket, Shift+H for
suit storage.
type: Add
id: 9031
time: '2025-10-04T01:44:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37975
- author: AwareFoxy
changes:
- message: Added Pride-O-Mat to marathon!
type: Add
id: 9032
time: '2025-10-04T16:50:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40696
- author: Moomoobeef
changes:
- message: Evac directional signs now glow in the dark!
type: Tweak
id: 9033
time: '2025-10-04T20:27:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/38545
- author: NoreUhh
changes:
- message: The Ian suit makes you bark now. Woof!
type: Tweak
id: 9034
time: '2025-10-05T08:06:06.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40694
- author: Princess-Cheeseballs
changes:
- message: Incendiary rounds now deal a mix of pierce damage and heat damage instead
of primarily heat damage.
type: Tweak
id: 9035
time: '2025-10-05T08:38:36.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39204
- author: Centronias
changes:
- message: Stirring is once again prioritized over drinking. No longer will your
bartender be very tempted to taste test your drink as they stir it.
type: Fix
id: 9036
time: '2025-10-05T22:12:24.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40704
- author: jessicamaybe
changes:
- message: Skeletons are now playable instruments!
type: Add
id: 9037
time: '2025-10-07T00:59:20.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40009
- author: Huaqas, Davyei
changes:
- message: 3 new Holy Books have been added to the Chaplain's loadout.
type: Add
id: 9038
time: '2025-10-07T07:39:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39181
- author: Huaqas
changes:
- message: The Tanakh and Satanic bibles have been removed.
type: Remove
id: 9039
time: '2025-10-07T09:14:49.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39698
- author: jessicamaybe
changes:
- message: Gorillas can now pull objects.
type: Tweak
id: 9040
time: '2025-10-07T09:31:46.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40700
- author: SurrealShibe
changes:
- message: Added the nutri-batard to mime survival boxes in place of the nutri-brick.
type: Add
id: 9041
time: '2025-10-07T10:18:50.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40601
- author: Lordbrandon12
changes:
- message: Fixed issue allowing space heater temperature to be set above the allowed
limit.
type: Fix
id: 9042
time: '2025-10-07T12:53:59.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40453
- author: IProduceWidgets
changes:
- message: Vox that take excessive amounts of fire damage will now burn into fried
chicken.
type: Tweak
id: 9043
time: '2025-10-07T14:12:25.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40115
- author: BoskiYourk, spanky_spanky
changes:
- message: The Head of Security now has an energy magnum, a self-charging multi-mode
laser revolver, in their locker instead of the energy shotgun.
type: Add
- message: The Warden now has the energy shotgun in their locker round-start.
type: Tweak
id: 9044
time: '2025-10-07T16:05:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40615
- author: FungiFellow
changes:
- message: Cancer Mice now have unique ghost role entries.
type: Tweak
id: 9045
time: '2025-10-07T16:33:42.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40102
- author: FungiFellow
changes:
- message: Biosuits can now fit Gastanks in Suit Storage, the Security Biosuit can
fit both Gastanks and Weapons
type: Add
- message: Security Biosuits Cost has been increased 800->1600
type: Tweak
id: 9046
time: '2025-10-07T18:22:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39888
- author: Hitlinemoss
changes:
- message: MRE wrappers are no longer twice as nutritious as the actual food within.
type: Fix
id: 9047
time: '2025-10-07T19:36:32.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40761
- author: TrixxedHeart
changes:
- message: 'Added new markings for Vox: 3 new beak types, 2 beak markings, 1 overlay
6 head, and 3 chest markings.'
type: Add
- message: Fixed sprite layering issue where a Vox's back leg would appear on top
of their front leg in side sprites.
type: Fix
id: 9048
time: '2025-10-07T23:14:11.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40569
- author: Hitlinemoss
changes:
- message: Bartenders with a significant amount of playtime can now select a golden
shaker in the loadout menu.
type: Add
id: 9049
time: '2025-10-07T23:37:43.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40762
- author: SlamBamActionman
changes:
- message: The Energy Shotgun no longer has a self-recharge or wide fire mode, but
charges faster in rechargers.
type: Tweak
id: 9050
time: '2025-10-08T02:51:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40757
- author: archee1
changes:
- message: Space Cobras no longer attack Space Adders automatically.
type: Fix
id: 9051
time: '2025-10-08T11:30:29.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37424
- author: aada
changes:
- message: Buckets are now destructible.
type: Tweak
id: 9052
time: '2025-10-08T13:58:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40772
- author: UpAndLeaves
changes:
- message: Zombie infections now take approximately three minutes longer to bring
a fully healed person to critical condition.
type: Tweak
id: 9053
time: '2025-10-08T14:11:01.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37445
- author: YoungThugSS14
changes:
- message: The temperature gun bolts now count as energy projectiles for the sake
of reflection.
type: Tweak
- message: The temperature gun's cold projectile can no longer pass through windows.
type: Fix
- message: The temperature gun now has color-appropriate muzzle flashes.
type: Fix
id: 9054
time: '2025-10-08T15:10:19.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37581
- author: K-Dynamic
changes:
- message: Energy shotgun lethal projectiles can now hit holo mobs.
type: Fix
id: 9055
time: '2025-10-08T15:23:02.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/37920
- author: Hitlinemoss
changes:
- message: Folders and clipboards are now available in the Trinkets loadout tab.
type: Add
id: 9056
time: '2025-10-08T15:49:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39920
- author: SlamBamActionman
changes:
- message: Disablers, temperature guns and tasers can now hit holo mobs.
type: Fix
id: 9057
time: '2025-10-08T21:59:39.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40782
- author: Centronias
changes:
- message: You can now attach paper labels to wrapped parcels.
type: Add
id: 9058
time: '2025-10-08T22:27:58.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40783
- author: ToastEnjoyer
changes:
- message: On fland, the wardens enforcer has been removed.
type: Remove
id: 9059
time: '2025-10-08T23:45:56.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40786
- author: Princess-Cheeseballs
changes:
- message: Dying while asleep shouldn't permanently blind you anymore.
type: Fix
id: 9061
time: '2025-10-09T13:46:20.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40366
- author: kontakt
changes:
- message: Bulldog magazines are now only accessible through emagged fabricators.
type: Tweak
id: 9062
time: '2025-10-09T14:00:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40790

View File

@@ -731,4 +731,37 @@
id: 88
time: '2025-09-25T21:36:16.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40546
- author: Absotively
changes:
- message: Updated Elkridge's burn chambers for safer delta pressure handling
type: Tweak
id: 89
time: '2025-09-30T03:45:17.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40590
- author: ToastEnjoyer
changes:
- message: On Marathon, added various improvements to engineering, parts of maints,
and some service improvements.
type: Tweak
- message: On Marathon, the security front has been fixed so that power is there
roundstart.
type: Fix
id: 90
time: '2025-10-07T02:21:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40725
- author: Vortebo
changes:
- message: On Relic, some small changes to address unintended gameplay issues and
further increase historical accuracy.
type: Tweak
id: 91
time: '2025-10-08T16:59:59.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40537
- author: ToastEnjoyer
changes:
- message: On box, the wardens enforcer has been removed from their office.
type: Remove
id: 92
time: '2025-10-08T20:41:46.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40785
Order: 1

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
discord-round-notifications-new = A new round is starting!
discord-round-notifications-started = Round #{$id} on map "{$map}" started.
discord-round-notifications-end = Round #{$id} has ended. It lasted for {$hours} hours, {$minutes} minutes, and {$seconds} seconds.
discord-round-notifications-end-ping = <@&{$roleId}>, the server will reboot shortly!
discord-round-notifications-end-ping = <@&{$roleId}>, a new round will start soon!
discord-round-notifications-unknown-map = Unknown

View File

@@ -32,6 +32,9 @@ ghost-role-information-silicon-rules = You are a [color={role-type-silicon-color
ghost-role-information-mouse-name = Mouse
ghost-role-information-mouse-description = A hungry and mischievous mouse.
ghost-role-information-cancer-mouse-name = Cancer Mouse
ghost-role-information-cancer-mouse-description = An irradiated mouse, spread your affliction and seek food.
ghost-role-information-mothroach-name = Mothroach
ghost-role-information-mothroach-description = A cute but mischievous mothroach.

View File

@@ -1,14 +1,62 @@
marking-TattooVoxNightlingHead-tattoo_nightling_head = Vox Head Tattoo (Nightling)
marking-TattooVoxNightlingHead = Vox Head Tattoo (Nightling)
marking-TattooVoxArrowHead-tattoo_arrow_head = Vox Head Tattoo (Arrow)
marking-TattooVoxArrowHead = Vox Head Tattoo (Arrow)
marking-VoxTattooEyeliner-eyeliner = Eyeliner
marking-VoxTattooEyeliner = Eyeliner
marking-VoxVisage-visage = Visage (Full)
marking-VoxVisage = Visage (Full)
marking-VoxVisageL-visage_l = Visage (Left)
marking-VoxVisageL = Visage (Left)
marking-VoxVisageR-visage_r = Visage (Right)
marking-VoxVisageR = Visage (Right)
marking-VoxCheek-cheekblush = Cheeks
marking-VoxCheek = Cheeks
marking-VoxBeak-beak = Beak (Pointed)
marking-VoxBeak = Beak (Pointed)
marking-VoxBeakSquareCere-beak_squarecere = Beak (Square Cere)
marking-VoxBeakSquareCere = Beak (Square Cere)
marking-VoxBeakHooked-beak_hooked = Beak (Hooked)
marking-VoxBeakHooked = Beak (Hooked)
marking-VoxBeakShaved-beak_shaved = Beak (Shaved)
marking-VoxBeakShaved = Beak (Shaved)
marking-VoxBeakCoverTip-beakcover_tip = Beak Tip
marking-VoxBeakCoverTip = Beak Tip
marking-VoxBeakCoverStripe-beakcover_stripe = Beak Stripe
marking-VoxBeakCoverStripe = Beak Stripe
marking-TattooVoxHeartLeftArm-heart_l_arm = Vox Left Arm Tattoo (Heart)
marking-TattooVoxHeartLeftArm = Vox Left Arm Tattoo (Heart)
marking-TattooVoxHeartRightArm-heart_r_arm = Vox Right Arm Tattoo (Heart)
marking-TattooVoxHeartRightArm = Vox Right Arm Tattoo (Heart)
marking-TattooVoxHiveChest-hive_s = Vox Chest Tattoo (hive)
marking-TattooVoxHiveChest = Vox Chest Tattoo (hive)
marking-TattooVoxHiveChest-hive_s = Vox Chest Tattoo (Hive)
marking-TattooVoxHiveChest = Vox Chest Tattoo (Hive)
marking-TattooVoxNightlingChest-nightling_s = Vox Chest Tattoo (nightling)
marking-TattooVoxNightlingChest = Vox Chest Tattoo (nightling)
marking-TattooVoxNightlingChest-nightling_s = Vox Chest Tattoo (Nightling)
marking-TattooVoxNightlingChest = Vox Chest Tattoo (Nightling)
marking-TattooVoxNightbelt-nightbelt = Vox Stomach Tattoo (Nightling)
marking-TattooVoxNightbelt = Vox Stomach Tattoo (Nightling)
marking-TattooVoxChestV-night_v = Vox Chest Tattoo (V Shape)
marking-TattooVoxChestV = Vox Chest Tattoo (V Shape)
marking-TattooVoxUnderbelly-underbelly = Underbelly
marking-TattooVoxUnderbelly = Underbelly
marking-VoxScarEyeRight-vox_scar_eye_right = Right Eye Scar
marking-VoxScarEyeRight = Eye Scar (Right)

View File

@@ -11,7 +11,7 @@ steal-target-groups-captain-id-card = captain ID card
steal-target-groups-jetpack-captain-filled = captain's jetpack
steal-target-groups-weapon-antique-laser = antique laser pistol
steal-target-groups-nuke-disk = nuclear authentication disk
steal-target-groups-weapon-energy-shot-gun = energy shotgun
steal-target-groups-weapon-energy-magnum = energy magnum
# Thief Collection
steal-target-groups-figurines = figurine

View File

@@ -43,6 +43,7 @@ loadout-group-passenger-neck = Passenger neck
loadout-group-bartender-head = Bartender head
loadout-group-bartender-jumpsuit = Bartender jumpsuit
loadout-group-bartender-outerclothing = Bartender outer clothing
loadout-group-bartender-shaker = Bartender shaker
loadout-group-chef-head = Chef head
loadout-group-chef-mask = Chef mask

View File

@@ -91,7 +91,7 @@ uplink-pistol-magazine-name = Pistol Magazine (.35 auto)
uplink-pistol-magazine-desc = Pistol magazine with 10 cartridges. Compatible with the Viper.
uplink-pistol-magazine-c20r-name = SMG magazine (.35 auto)
uplink-pistol-magazine-c20r-desc = Rifle magazine with 30 cartridges. Compatible with C-20r.
uplink-pistol-magazine-c20r-desc = SMG magazine with 30 cartridges. Compatible with C-20r.
uplink-magazine-bulldog-pellet-name = Drum magazine (.50 pellet)
uplink-magazine-bulldog-pellet-desc = Shotgun magazine with 8 shells filled with buckshot. Compatible with the Bulldog.

View File

@@ -66,7 +66,10 @@ entities:
- type: OccluderTree
- type: SpreaderGrid
- type: Shuttle
dampingModifier: 0.25
- type: DeviceNetwork
configurators: []
deviceLists: []
transmitFrequencyId: ArrivalsShuttleTimer
- type: GridPathfinding
- type: Gravity
gravityShakeSound: !type:SoundPathSpecifier

View File

@@ -1,11 +1,11 @@
meta:
format: 7
category: Grid
engineVersion: 264.0.0
engineVersion: 267.1.0
forkId: ""
forkVersion: ""
time: 08/06/2025 14:30:26
entityCount: 176
time: 09/27/2025 19:19:05
entityCount: 180
maps: []
grids:
- 1
@@ -93,34 +93,12 @@ entities:
uniqueMixes:
- volume: 2500
immutable: True
moles:
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
moles: {}
- volume: 2500
temperature: 293.15
moles:
- 21.824879
- 82.10312
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
Oxygen: 21.824879
Nitrogen: 82.10312
chunkSize: 4
- type: GasTileOverlay
- type: RadiationGridResistance
@@ -155,6 +133,21 @@ entities:
- type: Transform
pos: 6.5,1.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: AtmosDeviceFanDirectional
entities:
- uid: 177
components:
- type: Transform
pos: 8.5,-4.5
parent: 1
- uid: 178
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 8.5,1.5
parent: 1
- proto: CableApcExtension
entities:
- uid: 111
@@ -464,6 +457,9 @@ entities:
entities:
- uid: 9
components:
- type: MetaData
desc: Used to pilot the prison shuttle.
name: prison shuttle console
- type: Transform
rot: -1.5707963267948966 rad
pos: 13.5,-1.5
@@ -726,13 +722,6 @@ entities:
rot: -1.5707963267948966 rad
pos: 12.5,0.5
parent: 1
- proto: PrefilledSyringe
entities:
- uid: 6
components:
- type: Transform
pos: 13.5,-0.5
parent: 1
- proto: RadioHandheld
entities:
- uid: 94
@@ -747,41 +736,57 @@ entities:
- type: Transform
pos: 5.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 53
components:
- type: Transform
pos: 9.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 54
components:
- type: Transform
pos: 12.5,1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 55
components:
- type: Transform
pos: 12.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 56
components:
- type: Transform
pos: 14.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 57
components:
- type: Transform
pos: 14.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 58
components:
- type: Transform
pos: 14.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 89
components:
- type: Transform
pos: 5.5,1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- proto: SMESBasic
entities:
- uid: 100
@@ -806,6 +811,13 @@ entities:
- type: Transform
pos: 3.5,0.5
parent: 1
- proto: Syringe
entities:
- uid: 6
components:
- type: Transform
pos: 13.5,-0.5
parent: 1
- proto: Table
entities:
- uid: 76
@@ -1027,12 +1039,16 @@ entities:
rot: 1.5707963267948966 rad
pos: 9.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 74
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- proto: WindoorSecureSecurityLocked
entities:
- uid: 11
@@ -1040,16 +1056,37 @@ entities:
- type: Transform
pos: 1.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 75
components:
- type: Transform
pos: 1.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 90
components:
- type: Transform
pos: 1.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 179
components:
- type: Transform
pos: 8.5,1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 180
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 8.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- proto: WindowDirectional
entities:
- uid: 36
@@ -1057,89 +1094,121 @@ entities:
- type: Transform
pos: 5.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 50
components:
- type: Transform
pos: 3.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 61
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 62
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 63
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 64
components:
- type: Transform
pos: 12.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 65
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 12.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 66
components:
- type: Transform
pos: 9.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 67
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 68
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 69
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 70
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 4.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 71
components:
- type: Transform
pos: 2.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 87
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 5.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 170
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 4.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 171
components:
- type: Transform
pos: 4.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
...

View File

@@ -1,11 +1,11 @@
meta:
format: 7
category: Grid
engineVersion: 264.0.0
engineVersion: 267.1.0
forkId: ""
forkVersion: ""
time: 07/25/2025 18:00:45
entityCount: 176
time: 09/27/2025 19:18:41
entityCount: 180
maps: []
grids:
- 1
@@ -66,7 +66,7 @@ entities:
0,-1:
0: 61166
1,-1:
0: 65262
0: 65278
1,0:
0: 14
2,0:
@@ -83,18 +83,8 @@ entities:
- volume: 2500
temperature: 293.15
moles:
- 21.824879
- 82.10312
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
Oxygen: 21.824879
Nitrogen: 82.10312
chunkSize: 4
- type: GasTileOverlay
- type: RadiationGridResistance
@@ -114,31 +104,20 @@ entities:
parent: 1
- type: Physics
bodyType: Static
- proto: AirlockFreezerLocked
- proto: AirlockEngineeringLocked
entities:
- uid: 10
components:
- type: Transform
pos: 4.5,-0.5
parent: 1
- type: AccessReader
access:
- - Atmospherics
- - Captain
- - CentralCommand
- - Chemistry
- - ChiefEngineer
- - ChiefMedicalOfficer
- - Command
- - Cryogenics
- - Engineering
- - Medical
- type: Door
secondsUntilStateChange: -613.913
state: Opening
- type: DeviceLinkSource
lastSignals:
DoorStatus: True
- proto: AirlockMedicalLocked
entities:
- uid: 85
components:
- type: Transform
pos: 4.5,-2.5
parent: 1
- proto: AirlockShuttle
entities:
- uid: 59
@@ -160,6 +139,21 @@ entities:
rot: 1.5707963267948966 rad
pos: 4.5,0.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: AtmosDeviceFanDirectional
entities:
- uid: 91
components:
- type: Transform
pos: 8.5,-4.5
parent: 1
- uid: 177
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 8.5,1.5
parent: 1
- proto: CableApcExtension
entities:
- uid: 110
@@ -325,7 +319,7 @@ entities:
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 5.5,-2.5
pos: 5.5,-3.5
parent: 1
- uid: 52
components:
@@ -630,11 +624,6 @@ entities:
- type: Transform
pos: 4.5,-3.5
parent: 1
- uid: 85
components:
- type: Transform
pos: 4.5,-2.5
parent: 1
- proto: LockerWallMedicalFilled
entities:
- uid: 8
@@ -643,6 +632,8 @@ entities:
rot: 3.141592653589793 rad
pos: 2.5,-4.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: MedkitBruteFilled
entities:
- uid: 6
@@ -753,13 +744,6 @@ entities:
rot: -1.5707963267948966 rad
pos: 12.5,0.5
parent: 1
- proto: PrefilledSyringe
entities:
- uid: 175
components:
- type: Transform
pos: 13.5,-0.5
parent: 1
- proto: Rack
entities:
- uid: 88
@@ -788,16 +772,15 @@ entities:
- type: Transform
pos: 4.5,-1.5
parent: 1
- uid: 91
components:
- type: Transform
pos: 4.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 92
components:
- type: Transform
pos: 4.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- proto: ShuttleWindow
entities:
- uid: 32
@@ -805,41 +788,57 @@ entities:
- type: Transform
pos: 5.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 53
components:
- type: Transform
pos: 9.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 54
components:
- type: Transform
pos: 12.5,1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 55
components:
- type: Transform
pos: 12.5,-4.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 56
components:
- type: Transform
pos: 14.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 57
components:
- type: Transform
pos: 14.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 58
components:
- type: Transform
pos: 14.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 89
components:
- type: Transform
pos: 5.5,1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- proto: SMESBasic
entities:
- uid: 100
@@ -876,6 +875,13 @@ entities:
- type: Transform
pos: 3.5,0.5
parent: 1
- proto: Syringe
entities:
- uid: 175
components:
- type: Transform
pos: 13.5,-0.5
parent: 1
- proto: Table
entities:
- uid: 76
@@ -1079,12 +1085,16 @@ entities:
rot: 1.5707963267948966 rad
pos: 9.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 74
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- proto: WindowDirectional
entities:
- uid: 36
@@ -1092,68 +1102,116 @@ entities:
- type: Transform
pos: 5.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 61
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 62
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 63
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 13.5,-2.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 64
components:
- type: Transform
pos: 12.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 65
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 12.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 66
components:
- type: Transform
pos: 9.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 67
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,-3.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 68
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 69
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 9.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 70
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 7.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 87
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 5.5,0.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 178
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 3.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 179
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 2.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
- uid: 180
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 1.5,-1.5
parent: 1
- type: DeltaPressure
gridUid: 1
...

View File

@@ -7011,7 +7011,7 @@ entities:
- uid: 955
components:
- type: Transform
pos: 5.5,-4.5
pos: 7.5,-4.5
parent: 2
- type: WarpPoint
location: Automated Trade Station

View File

@@ -1,11 +1,11 @@
meta:
format: 7
category: Map
engineVersion: 266.0.0
engineVersion: 267.2.0
forkId: ""
forkVersion: ""
time: 09/06/2025 03:51:25
entityCount: 28793
time: 10/08/2025 20:15:18
entityCount: 28790
maps:
- 780
grids:
@@ -10936,8 +10936,8 @@ entities:
id: docking46345
localAnchorB: -0.5,-1
localAnchorA: -66.5,22
damping: 42.40102
stiffness: 380.5907
damping: 42.401035
stiffness: 380.59082
- type: OccluderTree
- type: Shuttle
dampingModifier: 0.25
@@ -23112,18 +23112,6 @@ entities:
- type: Transform
pos: 7.3923097,47.786827
parent: 8364
- proto: BoxShotgunSlug
entities:
- uid: 7852
components:
- type: Transform
pos: -7.2934785,34.60984
parent: 8364
- uid: 9144
components:
- type: Transform
pos: -7.289858,34.610893
parent: 8364
- proto: BoxSterileMask
entities:
- uid: 5467
@@ -182974,15 +182962,6 @@ entities:
- type: Physics
canCollide: False
- type: InsideEntityStorage
- proto: WeaponShotgunEnforcer
entities:
- uid: 9086
components:
- type: Transform
pos: -7.4221897,34.38881
parent: 8364
- type: BallisticAmmoProvider
proto: ShellShotgunSlug
- proto: WeaponShotgunKammerer
entities:
- uid: 26308

View File

@@ -1,11 +1,11 @@
meta:
format: 7
category: Map
engineVersion: 267.1.0
engineVersion: 267.2.0
forkId: ""
forkVersion: ""
time: 09/24/2025 21:56:25
entityCount: 36083
time: 10/08/2025 23:22:51
entityCount: 36080
maps:
- 1
grids:
@@ -30897,11 +30897,6 @@ entities:
- type: Transform
pos: 16.61324,11.471256
parent: 13329
- uid: 10642
components:
- type: Transform
pos: 31.342075,13.304442
parent: 13329
- uid: 18486
components:
- type: Transform
@@ -31282,11 +31277,6 @@ entities:
- type: Transform
pos: 16.446573,11.429589
parent: 13329
- uid: 9340
components:
- type: Transform
pos: 31.685825,13.288817
parent: 13329
- proto: BoxLightMixed
entities:
- uid: 1644
@@ -227061,13 +227051,6 @@ entities:
- type: Transform
pos: 19.469765,12.608503
parent: 13329
- proto: WeaponShotgunEnforcer
entities:
- uid: 9339
components:
- type: Transform
pos: 31.498325,13.851317
parent: 13329
- proto: WeaponShotgunHandmade
entities:
- uid: 5418

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -54,7 +54,7 @@
sprite: Clothing/Head/Hoods/Bio/security.rsi
state: icon
product: CrateSecurityBiosuit
cost: 800
cost: 1600
category: cargoproduct-category-name-security
group: market

View File

@@ -183,6 +183,7 @@
- id: DrinkWaterBottleFull
- type: Tag
tags:
- BoxCardboard
- BoxHug
- type: entity
@@ -212,7 +213,7 @@
- id: EmergencyOxygenTankFilled
- id: EmergencyMedipen
- id: Flare
- id: FoodSnackNutribrick
- id: FoodBreadNutriBatard
- id: DrinkWaterBottleFull
- type: entity
@@ -226,7 +227,7 @@
- id: EmergencyNitrogenTankFilled
- id: EmergencyMedipen
- id: Flare
- id: FoodSnackNutribrick
- id: FoodBreadNutriBatard
- id: DrinkWaterBottleFull
- type: Sprite
layers:
@@ -246,7 +247,7 @@
- id: EmergencyOxygenTankFilled
- id: EmergencyMedipen
- id: Flare
- id: FoodSnackNutribrick
- id: FoodBreadCottonNutriBatard
- id: DrinkWaterBottleFull
- type: entity

View File

@@ -408,7 +408,7 @@
- type: Storage
grid:
- 0,0,5,3
whitelist:
whitelist: # TODO cardboard boxes shouldn't have whitelisting
tags:
- Candle
- type: StorageFill

View File

@@ -102,7 +102,7 @@
layers:
- state: box_medical # Corvax-Resprite
- state: bodybags
- type: Storage
- type: Storage # TODO cardboard boxes shouldn't have whitelisting
whitelist:
tags:
- BodyBag

View File

@@ -315,7 +315,7 @@
id: LockerFillHeadOfSecurityNoHardsuit
table: !type:AllSelector
children:
- id: WeaponEnergyShotgun
- id: WeaponEnergyMagnum
- id: BookSpaceLaw
- id: BoxEncryptionKeySecurity
- id: CigarGoldCase
@@ -331,7 +331,6 @@
- id: RubberStampHos
- id: BoxHoSCircuitboards
- id: WeaponDisabler
- id: WeaponTaser
- id: WantedListCartridge
- id: DrinkHosFlask
# Corvax-Start

View File

@@ -28,7 +28,6 @@
children:
- id: FlashlightSeclite
- id: WeaponDisabler
- id: WeaponTaser
- id: ClothingBeltSecurityFilled
- id: Flash
- id: ClothingEyesGlassesSecurity
@@ -49,6 +48,7 @@
amount: 2
- id: NetworkConfigurator
- id: Binoculars
- id: WeaponEnergyShotgun
- type: entityTable
id: FillLockerWardenHarduit
@@ -75,7 +75,6 @@
- id: FlashlightSeclite
prob: 0.8
- id: WeaponDisabler
- id: WeaponTaser
- id: ClothingUniformJumpsuitSecGrey
prob: 0.3
- id: ClothingHeadHelmetBasic
@@ -111,7 +110,6 @@
table: !type:AllSelector
children:
- id: ClothingEyesGlassesSecurity
- id: WeaponTaser
- id: WeaponDisabler
- id: TrackingImplanter
amount: 2

View File

@@ -1,529 +1,4 @@
# Belts that need/have visualizers
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltUtility
name: utility belt
description: Can hold various things.
components:
- type: Sprite
sprite: Clothing/Belt/utility.rsi
- type: Clothing
sprite: Clothing/Belt/utility.rsi
- type: Storage
maxItemSize: Normal
# Don't add more than absolutely needed to this whitelist!
# Utility belts shouldn't just be free extra storage.
# This is only intended for basic engineering equipment.
whitelist:
tags:
- Powerdrill
- Wirecutter
- Crowbar
- Screwdriver
- Flashlight
- Wrench
- GeigerCounter
- Flare
- CableCoil
- CigPack
- Radio
- HolofanProjector
- Multitool
- AppraisalTool
- JawsOfLife
- GPS
- WeldingMask
- RemoteSignaller
- UtilityKnife
components:
- StationMap
- SprayPainter
- SprayPainterAmmo
- NetworkConfigurator
- RCD
- RCDAmmo
- Welder
- PowerCell
- Geiger
- TrayScanner
- GasAnalyzer
- HandLabeler
- type: ItemMapper
mapLayers:
drill:
whitelist:
tags:
- Powerdrill
cutters_red:
whitelist:
tags:
- Wirecutter
crowbar:
whitelist:
tags:
- Crowbar
crowbar_red:
whitelist:
tags:
- CrowbarRed
jaws:
whitelist:
tags:
- JawsOfLife
screwdriver_nuke:
whitelist:
tags:
- Screwdriver
wrench:
whitelist:
tags:
- Wrench
multitool:
whitelist:
tags:
- Multitool
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: Tag
tags:
- UtilityBelt
- WhitelistChameleon
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltChiefEngineer
name: chief engineer's toolbelt
description: Holds tools, looks snazzy.
components:
- type: Sprite
sprite: Clothing/Belt/ce.rsi
- type: Clothing
sprite: Clothing/Belt/ce.rsi
- type: Storage
grid:
- 0,0,9,1
# TODO: Fill this out more.
whitelist:
tags:
- Wirecutter
- Crowbar
- Screwdriver
- Flashlight
- Wrench
- GeigerCounter
- Flare
- CableCoil
- Powerdrill
- JawsOfLife
- CigPack
- Radio
- HolofanProjector
- Multitool
- AppraisalTool
- UtilityKnife
components:
- StationMap
- SprayPainter
- SprayPainterAmmo
- NetworkConfigurator
- RCD
- RCDAmmo
- Welder
- Flash
- Handcuff
- PowerCell
- Geiger
- TrayScanner
- GasAnalyzer
- type: ItemMapper
mapLayers:
drill:
whitelist:
tags:
- Powerdrill
cutters_red:
whitelist:
tags:
- Wirecutter
crowbar:
whitelist:
tags:
- Crowbar
crowbar_red:
whitelist:
tags:
- CrowbarRed
jaws:
whitelist:
tags:
- JawsOfLife
screwdriver_nuke:
whitelist:
tags:
- Screwdriver
multitool:
whitelist:
tags:
- Multitool
wrench:
whitelist:
tags:
- Wrench
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: StealTarget
stealGroup: ChiefEngineerToolBelt
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltAssault
name: assault belt
description: A tactical assault belt.
components:
- type: Sprite
sprite: Clothing/Belt/assault.rsi
- type: Clothing
sprite: Clothing/Belt/assault.rsi
- type: Storage
whitelist:
tags:
- CigPack
- Taser
components:
- Stunbaton
- FlashOnTrigger
- SmokeOnTrigger
- Flash
- Handcuff
- BallisticAmmoProvider
- Ammo
- type: ItemMapper
mapLayers:
flashbang:
whitelist:
components:
- FlashOnTrigger
stunbaton:
whitelist:
components:
- Stunbaton
tear_gas_grenade:
whitelist:
components:
- SmokeOnTrigger
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltJanitor
name: janibelt
description: A belt used to hold most janitorial supplies.
components:
- type: Sprite
sprite: Clothing/Belt/janitor.rsi
- type: Clothing
sprite: Clothing/Belt/janitor.rsi
- type: Storage
whitelist:
tags:
- Wrench
- Bottle
- Spray
- Soap
- Flashlight
- CigPack
- TrashBag
- WetFloorSign
- HolosignProjector
- Plunger
- GoldenPlunger
- WireBrush
components:
- LightReplacer
- SmokeOnTrigger
maxItemSize: Large
- type: ItemMapper
mapLayers:
bottle:
whitelist:
tags:
- Bottle
bottle_spray:
whitelist:
tags:
- Spray
wrench:
whitelist:
tags:
- Wrench
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltMedical
name: medical belt
description: Can hold various medical equipment.
components:
- type: Sprite
sprite: Clothing/Belt/medical.rsi
- type: Clothing
sprite: Clothing/Belt/medical.rsi
- type: Storage
whitelist:
tags:
- Wrench
- Bottle
- Spray
- Brutepack
- Bloodpack
- Gauze
- Ointment
- CigPack
- PillCanister
- Radio
- DiscreteHealthAnalyzer
- SurgeryTool
- Dropper
components:
- Hypospray
- Injector
- Pill
- HandLabeler
- type: ItemMapper
mapLayers:
bottle:
whitelist:
tags:
- Bottle
hypo:
whitelist:
components:
- Hypospray
pill:
whitelist:
components:
- Pill
tags:
- PillCanister
bottle_spray:
whitelist:
tags:
- Spray
# spray_med:
# whitelist:
# tags:
# - SprayMedical
# wrench_medical:
# whitelist:
# tags:
# - WrenchMedical
wrench:
whitelist:
tags:
- Wrench
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: entity
parent: ClothingBeltMedical
id: ClothingBeltMedicalEMT
name: EMT belt
description: Perfect for holding various equipment for medical emergencies.
components:
- type: Sprite
sprite: Clothing/Belt/emt.rsi
- type: Clothing
sprite: Clothing/Belt/emt.rsi
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltPlant
name: botanical belt
description: A belt used to hold most hydroponics supplies. Suprisingly, not green.
components:
- type: Sprite
sprite: Clothing/Belt/plant.rsi
- type: Clothing
sprite: Clothing/Belt/plant.rsi
- type: Storage
whitelist:
tags:
# - PlantAnalyzer
- PlantSampleTaker
- BotanyShovel
- BotanyHoe
- BotanyHatchet
- PlantSampleTaker
- PlantBGone
- Bottle
- Syringe
- CigPack
- Dropper
components:
- Seed
- Smokable
- HandLabeler
- type: ItemMapper
mapLayers:
hatchet:
whitelist:
tags:
- BotanyHatchet
# hydro:
# whitelist:
# tags:
# - PlantAnalyzer # Dunno what to put here, should be aight.
hoe:
whitelist:
tags:
- BotanyHoe
secateurs: # We don't have secateurs and this looks similar enough.
whitelist:
tags:
- BotanyShovel
plantbgone:
whitelist:
tags:
- PlantBGone
bottle:
whitelist:
tags:
- Bottle
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltChef
name: chef belt
description: A belt used to hold kitchen knives and condiments for quick access.
components:
- type: Sprite
sprite: Clothing/Belt/chef.rsi
- type: Clothing
sprite: Clothing/Belt/chef.rsi
- type: Storage
whitelist:
tags:
- KitchenKnife
- Cleaver
- RollingPin
- Coldsauce
- Enzyme
- Hotsauce
- Ketchup
- BBQsauce
- SaltShaker
- PepperShaker
- CigPack
- Packet
- Skewer
- MonkeyCube
- Mayo
components:
- Mousetrap
- Smokable
- Utensil
- type: ItemMapper
mapLayers:
kitchenknife:
whitelist:
tags:
- KitchenKnife
cleaver:
whitelist:
tags:
- Cleaver
rollingpin:
whitelist:
tags:
- RollingPin
coldsauce:
whitelist:
tags:
- Coldsauce
enzyme:
whitelist:
tags:
- Enzyme
hotsauce:
whitelist:
tags:
- Hotsauce
ketchup:
whitelist:
tags:
- Ketchup
bbqsauce:
whitelist:
tags:
- BBQsauce
saltshaker:
whitelist:
tags:
- SaltShaker
peppershaker:
whitelist:
tags:
- PepperShaker
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
- type: entity
parent: [ClothingBeltStorageBase, ContentsExplosionResistanceBase, BaseSecurityContraband]
id: ClothingBeltSecurity
name: security belt
description: Can hold security gear like handcuffs and flashes.
components:
- type: Sprite
sprite: Clothing/Belt/security.rsi
- type: Clothing
sprite: Clothing/Belt/security.rsi
- type: ExplosionResistance
damageCoefficient: 0.9
- type: Storage
whitelist:
tags:
- CigPack
- Taser
- SecBeltEquip
- Radio
- Sidearm
- MagazinePistol
- MagazineMagnum
- CombatKnife
- Truncheon
- HandGrenade
components:
- Stunbaton
- FlashOnTrigger
- SmokeOnTrigger
- Flash
- Handcuff
- BallisticAmmoProvider
- CartridgeAmmo
- DoorRemote
- Whistle
- BalloonPopper
- type: ItemMapper
mapLayers:
flashbang:
whitelist:
components:
- FlashOnTrigger
stunbaton:
whitelist:
components:
- Stunbaton
tear_gas_grenade:
whitelist:
components:
- SmokeOnTrigger
sprite: Clothing/Belt/belt_overlay.rsi
- type: Appearance
## Belts that need/have visualizers
- type: entity
parent: [ClothingBeltBase, ClothingSlotBase, BaseCommandContraband]
@@ -557,7 +32,36 @@
- CaptainSabre
- type: Appearance
# Belts without visualizers
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltQuiver
name: quiver
description: Can hold up to 15 arrows, and fits snug around your waist.
components:
- type: Sprite
sprite: Clothing/Belt/quiver.rsi
layers:
- state: icon
- map: [ "enum.StorageContainerVisualLayers.Fill" ]
visible: false
- type: Clothing
- type: Storage
grid:
- 0,0,7,3
maxItemSize: Small
whitelist:
tags:
- Arrow
- Plunger
- type: Appearance
- type: StorageContainerVisuals
maxFillLevels: 3
fillBaseName: fill-
- type: Construction
graph: Quiver
node: Quiver
## Belts without visualizers
- type: entity
parent: [ClothingBeltAmmoProviderBase, BaseSecurityBartenderContraband]
@@ -578,19 +82,24 @@
capacity: 14
- type: entity
parent: ClothingBeltBase
id: ClothingBeltChampion
name: championship belt
description: Proves to the world that you are the strongest!
parent: [ ClothingBeltStorageBase, BaseMagicalContraband ]
id: ClothingBeltWand
name: wand belt
description: A belt designed to hold various rods of power. A veritable fanny pack of exotic magic.
components:
- type: Sprite
sprite: Clothing/Belt/champion.rsi
sprite: Clothing/Belt/wand.rsi
- type: Clothing
sprite: Clothing/Belt/champion.rsi
quickEquip: true
- type: Tag
tags:
- Kangaroo
sprite: Clothing/Belt/wand.rsi
- type: Storage
grid:
- 0,0,15,1
whitelist:
tags:
- WizardWand
- WhitelistChameleon
## Holsters
- type: entity
parent: ClothingBeltStorageBase
@@ -616,20 +125,22 @@
sprite: Clothing/Belt/syndieholster.rsi
- type: Clothing
sprite: Clothing/Belt/syndieholster.rsi
- type: Item
size: Ginormous
- type: Storage
maxItemSize: Huge
grid:
- 0,0,3,3
whitelist:
components:
- Gun
- BallisticAmmoProvider
- CartridgeAmmo
- Gun
- BallisticAmmoProvider
- CartridgeAmmo
- type: StaticPrice
price: 500
## Webbing
# Weirdly the only webbing with a storage whitelist and item mapper.
# Might be worth making less common (armory only?) and removing the whitelist to eliminate the inconsistency.
- type: entity
parent: ClothingBeltSecurity
id: ClothingBeltSecurityWebbing
@@ -688,50 +199,3 @@
sprite: Clothing/Belt/militarywebbingmed.rsi
- type: Clothing
sprite: Clothing/Belt/militarywebbingmed.rsi
- type: Item
size: Huge
- type: ExplosionResistance
damageCoefficient: 0.1
- type: entity
parent: ClothingBeltBase
id: ClothingBeltSuspendersRed
name: red suspenders
description: For holding your pants up.
components:
- type: Tag
tags:
- MimeBelt
- type: Sprite
sprite: Clothing/Belt/suspenders_red.rsi
state: icon
- type: Clothing
sprite: Clothing/Belt/suspenders_red.rsi
quickEquip: true
- type: entity
parent: ClothingBeltSuspendersRed
id: ClothingBeltSuspendersBlack
name: black suspenders
components:
- type: Sprite
sprite: Clothing/Belt/suspenders_black.rsi
- type: Clothing
sprite: Clothing/Belt/suspenders_black.rsi
- type: entity
parent: [ ClothingBeltStorageBase, BaseMagicalContraband ]
id: ClothingBeltWand
name: wand belt
description: A belt designed to hold various rods of power. A veritable fanny pack of exotic magic.
components:
- type: Sprite
sprite: Clothing/Belt/wand.rsi
- type: Clothing
sprite: Clothing/Belt/wand.rsi
- type: Storage
grid:
- 0,0,15,1
whitelist:
tags:
- WizardWand

View File

@@ -0,0 +1,422 @@
# Belts meant to be used by a specific job to hold their tools
- type: entity
abstract: true
parent: ClothingBeltStorageBase
id: BaseClothingBeltEngineering
components:
- type: Storage
# Don't add more than absolutely needed to this whitelist!
# Utility belts shouldn't just be free extra storage.
# This is only intended for basic engineering equipment.
whitelist:
tags:
- Powerdrill
- Wirecutter
- Crowbar
- Screwdriver
- Flashlight
- Wrench
- GeigerCounter
- Flare
- CableCoil
- CigPack
- Radio
- HolofanProjector
- Multitool
- AppraisalTool
- JawsOfLife
- GPS
- WeldingMask
- RemoteSignaller
- UtilityKnife
components:
- StationMap
- SprayPainter
- SprayPainterAmmo
- NetworkConfigurator
- RCD
- RCDAmmo
- Welder
- PowerCell
- Geiger
- TrayScanner
- GasAnalyzer
- HandLabeler
- type: ItemMapper
sprite: &BeltOverlay Clothing/Belt/belt_overlay.rsi
mapLayers:
drill:
whitelist:
tags:
- Powerdrill
cutters_red:
whitelist:
tags:
- Wirecutter
crowbar:
whitelist:
tags:
- Crowbar
crowbar_red:
whitelist:
tags:
- CrowbarRed
jaws:
whitelist:
tags:
- JawsOfLife
screwdriver_nuke:
whitelist:
tags:
- Screwdriver
wrench:
whitelist:
tags:
- Wrench
multitool:
whitelist:
tags:
- Multitool
- type: Appearance
- type: entity
parent: BaseClothingBeltEngineering
id: ClothingBeltUtility
name: utility belt
description: Can hold various things.
components:
- type: Sprite
sprite: Clothing/Belt/utility.rsi
- type: Clothing
sprite: Clothing/Belt/utility.rsi
- type: Tag
tags:
- UtilityBelt
- WhitelistChameleon
- type: entity
parent: BaseClothingBeltEngineering
id: ClothingBeltChiefEngineer
name: chief engineer's toolbelt
description: Holds tools, looks snazzy.
components:
- type: Sprite
sprite: Clothing/Belt/ce.rsi
- type: Clothing
sprite: Clothing/Belt/ce.rsi
- type: Storage
grid:
- 0,0,9,1
- type: StealTarget
stealGroup: ChiefEngineerToolBelt
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltJanitor
name: janibelt
description: A belt used to hold most janitorial supplies.
components:
- type: Sprite
sprite: Clothing/Belt/janitor.rsi
- type: Clothing
sprite: Clothing/Belt/janitor.rsi
- type: Storage
maxItemSize: Large
whitelist:
tags:
- Wrench
- Bottle
- Spray
- Soap
- Flashlight
- CigPack
- TrashBag
- WetFloorSign
- HolosignProjector
- Plunger
- GoldenPlunger
- WireBrush
components:
- LightReplacer
- SmokeOnTrigger
- type: ItemMapper
sprite: *BeltOverlay
mapLayers:
bottle:
whitelist:
tags:
- Bottle
bottle_spray:
whitelist:
tags:
- Spray
wrench:
whitelist:
tags:
- Wrench
- type: Appearance
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltMedical
name: medical belt
description: Can hold various medical equipment.
components:
- type: Sprite
sprite: Clothing/Belt/medical.rsi
- type: Clothing
sprite: Clothing/Belt/medical.rsi
- type: Storage
whitelist:
tags:
- Wrench
- Bottle
- Spray
- Brutepack
- Bloodpack
- Gauze
- Ointment
- CigPack
- PillCanister
- Radio
- DiscreteHealthAnalyzer
- SurgeryTool
- Dropper
components:
- Hypospray
- Injector
- Pill
- HandLabeler
- type: ItemMapper
sprite: *BeltOverlay
mapLayers:
bottle:
whitelist:
tags:
- Bottle
hypo:
whitelist:
components:
- Hypospray
pill:
whitelist:
components:
- Pill
tags:
- PillCanister
bottle_spray:
whitelist:
tags:
- Spray
# spray_med:
# whitelist:
# tags:
# - SprayMedical
# wrench_medical:
# whitelist:
# tags:
# - WrenchMedical
wrench:
whitelist:
tags:
- Wrench
- type: Appearance
- type: entity
parent: ClothingBeltMedical
id: ClothingBeltMedicalEMT
name: EMT belt
description: Perfect for holding various equipment for medical emergencies.
components:
- type: Sprite
sprite: Clothing/Belt/emt.rsi
- type: Clothing
sprite: Clothing/Belt/emt.rsi
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltPlant
name: botanical belt
description: A belt used to hold most hydroponics supplies. Suprisingly, not green.
components:
- type: Sprite
sprite: Clothing/Belt/plant.rsi
- type: Clothing
sprite: Clothing/Belt/plant.rsi
- type: Storage
whitelist:
tags:
# - PlantAnalyzer
- PlantSampleTaker
- BotanyShovel
- BotanyHoe
- BotanyHatchet
- PlantSampleTaker
- PlantBGone
- Bottle
- Syringe
- CigPack
- Dropper
components:
- Seed
- Smokable
- HandLabeler
- type: ItemMapper
sprite: *BeltOverlay
mapLayers:
hatchet:
whitelist:
tags:
- BotanyHatchet
# hydro:
# whitelist:
# tags:
# - PlantAnalyzer # Dunno what to put here, should be aight.
hoe:
whitelist:
tags:
- BotanyHoe
secateurs: # We don't have secateurs and this looks similar enough.
whitelist:
tags:
- BotanyShovel
plantbgone:
whitelist:
tags:
- PlantBGone
bottle:
whitelist:
tags:
- Bottle
- type: Appearance
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltChef
name: chef belt
description: A belt used to hold kitchen knives and condiments for quick access.
components:
- type: Sprite
sprite: Clothing/Belt/chef.rsi
- type: Clothing
sprite: Clothing/Belt/chef.rsi
- type: Storage
whitelist:
tags:
- KitchenKnife
- Cleaver
- RollingPin
- Coldsauce
- Enzyme
- Hotsauce
- Ketchup
- BBQsauce
- SaltShaker
- PepperShaker
- CigPack
- Packet
- Skewer
- MonkeyCube
- Mayo
components:
- Mousetrap
- Smokable
- Utensil
- type: ItemMapper
sprite: *BeltOverlay
mapLayers:
kitchenknife:
whitelist:
tags:
- KitchenKnife
cleaver:
whitelist:
tags:
- Cleaver
rollingpin:
whitelist:
tags:
- RollingPin
coldsauce:
whitelist:
tags:
- Coldsauce
enzyme:
whitelist:
tags:
- Enzyme
hotsauce:
whitelist:
tags:
- Hotsauce
ketchup:
whitelist:
tags:
- Ketchup
bbqsauce:
whitelist:
tags:
- BBQsauce
saltshaker:
whitelist:
tags:
- SaltShaker
peppershaker:
whitelist:
tags:
- PepperShaker
- type: Appearance
- type: entity
parent: [ClothingBeltStorageBase, ContentsExplosionResistanceBase, BaseSecurityContraband]
id: ClothingBeltSecurity
name: security belt
description: Can hold security gear like handcuffs and flashes.
components:
- type: Sprite
sprite: Clothing/Belt/security.rsi
- type: Clothing
sprite: Clothing/Belt/security.rsi
- type: ExplosionResistance
damageCoefficient: 0.9
- type: Storage
whitelist:
tags:
- CigPack
- Taser
- SecBeltEquip
- Radio
- Sidearm
- MagazinePistol
- MagazineMagnum
- CombatKnife
- Truncheon
- HandGrenade
components:
- Stunbaton
- FlashOnTrigger
- SmokeOnTrigger
- Flash
- Handcuff
- BallisticAmmoProvider
- CartridgeAmmo
- DoorRemote
- Whistle
- BalloonPopper
- type: ItemMapper
sprite: *BeltOverlay
mapLayers:
flashbang:
whitelist:
components:
- FlashOnTrigger
stunbaton:
whitelist:
components:
- Stunbaton
tear_gas_grenade:
whitelist:
components:
- SmokeOnTrigger
- type: Appearance

View File

@@ -1,28 +0,0 @@
- type: entity
parent: ClothingBeltStorageBase
id: ClothingBeltQuiver
name: quiver
description: Can hold up to 15 arrows, and fits snug around your waist.
components:
- type: Sprite
sprite: Clothing/Belt/quiver.rsi
layers:
- state: icon
- map: [ "enum.StorageContainerVisualLayers.Fill" ]
visible: false
- type: Clothing
- type: Storage
grid:
- 0,0,7,3
maxItemSize: Small
whitelist:
tags:
- Arrow
- Plunger
- type: Appearance
- type: StorageContainerVisuals
maxFillLevels: 3
fillBaseName: fill-
- type: Construction
graph: Quiver
node: Quiver

View File

@@ -0,0 +1,44 @@
# For cosmetic belts parenting off ClothingBeltBase
- type: entity
parent: ClothingBeltBase
id: ClothingBeltChampion
name: championship belt
description: Proves to the world that you are the strongest!
components:
- type: Sprite
sprite: Clothing/Belt/champion.rsi
- type: Clothing
sprite: Clothing/Belt/champion.rsi
quickEquip: true
- type: Tag
tags:
- Kangaroo # Kangaroo wearable. Dare to challenge the champ?
- WhitelistChameleon
- type: entity
parent: ClothingBeltBase
id: ClothingBeltSuspendersRed
name: red suspenders
description: For holding your pants up.
components:
- type: Sprite
sprite: Clothing/Belt/suspenders_red.rsi
state: icon
- type: Clothing
sprite: Clothing/Belt/suspenders_red.rsi
quickEquip: true
- type: Tag
tags:
- MimeBelt
- WhitelistChameleon
- type: entity
parent: ClothingBeltSuspendersRed
id: ClothingBeltSuspendersBlack
name: black suspenders
components:
- type: Sprite
sprite: Clothing/Belt/suspenders_black.rsi
- type: Clothing
sprite: Clothing/Belt/suspenders_black.rsi

View File

@@ -1,5 +1,5 @@
- type: entity
parent: ClothingOuterBaseLarge
parent: [ClothingOuterBaseLarge, AllowSuitStorageClothingGasTanks]
id: ClothingOuterBioGeneral
name: bio suit
suffix: Generic
@@ -64,7 +64,7 @@
sprite: Clothing/OuterClothing/Bio/scientist.rsi
- type: entity
parent: [ClothingOuterBioGeneral, BaseSecurityContraband]
parent: [ClothingOuterBaseLarge, AllowSuitStorageClothing, BaseSecurityContraband]
id: ClothingOuterBioSecurity
name: bio suit
suffix: Security
@@ -82,7 +82,11 @@
Piercing: 0.8
- type: ZombificationResistance
zombificationResistanceCoefficient: 0.4
- type: GroupExamine
- type: ClothingSpeedModifier
walkModifier: 0.95
sprintModifier: 0.95
- type: entity
parent: ClothingOuterBioGeneral
id: ClothingOuterBioVirology

View File

@@ -288,6 +288,8 @@
tags:
- CorgiWearable
- WhitelistChameleon
- type: AddAccentClothing
accent: BarkAccent
- type: entity
parent: ClothingOuterBase

View File

@@ -119,10 +119,6 @@
weight: 0.1
children:
- id: DawInstrumentMachineCircuitboard
- !type:GroupSelector
weight: 0.05
children:
- id: SuperSynthesizerInstrument
- type: entityTable
id: SalvageInstrumentTable
@@ -140,8 +136,6 @@
tableId: WoodwindInstrumentTable
- !type:NestedSelector
tableId: SpecialInstrumentTable
- id: SuperSynthesizerInstrument
weight: 0.3
- type: entity
id: RandomInstruments

View File

@@ -13,6 +13,52 @@
!type:SimpleColoring
color: "#937e3d"
- type: marking
# The cere is the base of the top part of the beak, the cere on this beak, is a square.
id: VoxBeakSquareCere
bodyPart: Snout
markingCategory: Snout
forcedColoring: true
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_parts.rsi
state: beak_squarecere
coloring:
default:
type:
!type:SimpleColoring
color: "#937e3d"
- type: marking
id: VoxBeakShaved
bodyPart: Snout
markingCategory: Snout
forcedColoring: true
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_parts.rsi
state: beak_shaved
coloring:
default:
type:
!type:SimpleColoring
color: "#937e3d"
- type: marking
id: VoxBeakHooked
bodyPart: Snout
markingCategory: Snout
forcedColoring: true
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_parts.rsi
state: beak_hooked
coloring:
default:
type:
!type:SimpleColoring
color: "#937e3d"
- type: marking
id: VoxLArmScales
bodyPart: LArm

View File

@@ -54,6 +54,50 @@
- sprite: Mobs/Customization/vox_tattoos.rsi
state: nightling_s
- type: marking
id: TattooVoxNightbelt
bodyPart: Chest
markingCategory: Chest
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: nightbelt
- type: marking
id: TattooVoxChestV
bodyPart: Chest
markingCategory: Chest
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: chest_v_1
- sprite: Mobs/Customization/vox_tattoos.rsi
state: chest_v_2
- type: marking
id: TattooVoxUnderbelly
bodyPart: Chest
markingCategory: Chest
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: underbelly
- type: marking
id: TattooVoxTailRing
# TODO // Looks off on some tails (i.e docked/amputated), if conditionals for markings ever get implemented this needs to be updated to account for those.
@@ -130,4 +174,126 @@
forcedColoring: true
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: eyeshadow_large
state: eyeshadow_large
- type: marking
id: VoxTattooEyeliner
bodyPart: Eyes
markingCategory: Overlay
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: eyeliner
- type: marking
id: VoxBeakCoverStripe
bodyPart: Snout
markingCategory: SnoutCover
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: beakcover_stripe
- type: marking
id: VoxBeakCoverTip
bodyPart: Snout
markingCategory: SnoutCover
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: beakcover_tip
- type: marking
id: TattooVoxArrowHead
bodyPart: Head
markingCategory: Head
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: tattoo_arrow_head
- type: marking
id: TattooVoxNightlingHead
bodyPart: Head
markingCategory: Head
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: tattoo_nightling_head
- type: marking
id: VoxVisage
bodyPart: Head
markingCategory: Head
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: visage
- type: marking
id: VoxVisageL
bodyPart: Head
markingCategory: Head
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: visage_l
- type: marking
id: VoxVisageR
bodyPart: Head
markingCategory: Head
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: visage_r
- type: marking
id: VoxCheek
bodyPart: Head
markingCategory: Head
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: cheekblush

View File

@@ -1215,6 +1215,8 @@
true
NavSmash: !type:Bool
true
- type: Puller
needsHands: false
- type: Prying
pryPowered: true
force: true
@@ -1978,6 +1980,12 @@
parent: MobMouse
id: MobMouseCancer
components:
- type: GhostRole
name: ghost-role-information-cancer-mouse-name
description: ghost-role-information-cancer-mouse-description
rules: ghost-role-information-freeagent-rules
mindRoles:
- MindRoleGhostRoleFreeAgent
- type: Sprite
color: LightGreen
- type: PointLight

View File

@@ -393,6 +393,7 @@
- type: NpcFactionMember
factions:
- Xeno
- SimpleHostile
- type: MeleeWeapon
angle: 0
animation: WeaponArcBite

View File

@@ -76,7 +76,7 @@
components:
- type: Spectral
- type: Tag
tags:
tags: # BAD: Intentional removal of inherited tag
- AllowGhostShownByEvent
- type: entity

View File

@@ -109,6 +109,24 @@
32:
sprite: Mobs/Species/Human/displacement.rsi
state: jumpsuit-female
- type: Instrument
program: 13 # Xylophone. Woodblock is 115 (another good option)
- type: ActivatableUI
blockSpectators: true # otherwise they can play client-side music
inHandsOnly: false
singleUser: true
requiresComplex: true
verbOnly: true
verbText: verb-instrument-openui
key: enum.InstrumentUiKey.Key
- type: UserInterface
interfaces:
enum.InstrumentUiKey.Key:
type: InstrumentBoundUserInterface
enum.HumanoidMarkingModifierKey.Key:
type: HumanoidMarkingModifierBoundUserInterface
enum.StrippingUiKey.Key:
type: StrippableBoundUserInterface
- type: entity
parent: BaseSpeciesDummy

View File

@@ -30,6 +30,44 @@
- type: Damageable
damageContainer: Biological
damageModifierSet: Vox
- type: Destructible
thresholds:
- trigger:
!type:DamageTypeTrigger
damageType: Blunt
damage: 400
behaviors:
- !type:GibBehavior { }
- trigger:
!type:DamageTypeTrigger
damageType: Heat
damage: 1500
behaviors:
- !type:SpawnEntitiesBehavior
spawnInContainer: true
spawn:
FoodMeatChickenFriedVox:
min: 3
max: 5
- !type:BurnBodyBehavior { }
- !type:PlaySoundBehavior
sound:
collection: MeatLaserImpact
- trigger:
!type:DamageTypeTrigger
damageType: Radiation
damage: 15
behaviors:
- !type:PopupBehavior
popup: mouth-taste-metal
popupType: LargeCaution
targetOnly: true
- trigger:
!type:DamageTypeTrigger
damageType: Radiation
damage: 40
behaviors:
- !type:VomitBehavior
- type: PassiveDamage
# Augment normal health regen to be able to tank some Poison damage
# This allows Vox to take their mask off temporarily to eat something without needing a trip to medbay afterwards.

View File

@@ -91,7 +91,7 @@
# map: ["enum.OpenableVisuals.Layer"]
## Bases for visuals
# TODO standardize state names for fill levels and openable visuals
# New drinks should mirror these state names to reduce clutter when creating new prototypes
# Basic visualizer for an openable entity. Requires DrinkBaseOpenable
- type: entity
@@ -103,13 +103,14 @@
visuals:
enum.OpenableVisuals.Opened:
enum.OpenableVisuals.Layer:
True: {state: "icon_open"}
False: {state: "icon"}
True: {state: "icon_open"} # lid off
False: {state: "icon"} # lid on
- type: Sprite
layers:
- state: icon
map: ["enum.OpenableVisuals.Layer"]
- type: ExaminableSolution
solution: *sol
examinableWhileClosed: false # If you can't see the fill levels on the sprite, we can assume it's opaque
heldOnly: true # If it's opaque, you probably can't see through the open lid from a distance
@@ -121,11 +122,12 @@
- type: Appearance
- type: Sprite
layers:
- state: icon_empty
- state: icon
- state: fill-1
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: SolutionContainerVisuals
solutionName: *sol
maxFillLevels: 5
fillBaseName: fill-
inHandsMaxFillLevels: 3
@@ -139,7 +141,7 @@
components:
- type: Sprite
layers:
- state: icon_empty
- state: icon
map: [ "enum.SolutionContainerLayers.Base" ]
- state: fill-1
map: [ "enum.SolutionContainerLayers.Fill" ]
@@ -169,8 +171,8 @@
visuals:
enum.OpenableVisuals.Opened:
enum.OpenableVisuals.Layer:
True: {state: "icon_open"}
False: {state: "icon_empty"}
True: {state: "icon_open"} # lid off
False: {state: "icon_empty"} # lid on
- type: Sprite
layers:
- state: icon_empty

View File

@@ -117,6 +117,34 @@
materialComposition:
Plastic: 25
# Strong plastic
- type: entity
abstract: true
parent: DrinkBaseMaterialPlastic
id: DrinkBaseMaterialStrongPlastic
components:
- type: Destructible
thresholds:
- trigger: # Overkill threshold
!type:DamageTrigger
damage: 200
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- trigger:
!type:DamageTrigger
damage: 20 # can take a few more hits than basic plastic
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalCrunch # TODO a plastic break collection
- !type:SpillBehavior { }
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: PhysicalComposition
materialComposition:
Plastic: 100
# Fragile cardboard
- type: entity
abstract: true

View File

@@ -106,7 +106,7 @@
- type: Sprite
sprite: Objects/Consumable/Drinks/alco-bottle.rsi
layers:
- state: icon_blue # todo add "icon_empty" state
- state: icon_empty
map: ["enum.OpenableVisuals.Layer"]
- state: fill-6
map: ["enum.SolutionContainerLayers.Fill"]
@@ -260,7 +260,7 @@
- type: Sprite
sprite: Objects/Consumable/Drinks/alco-bottle.rsi
layers:
- state: icon_green # todo icon_empty
- state: icon_empty
map: ["enum.OpenableVisuals.Layer"]
- state: fill-6
map: ["enum.SolutionContainerLayers.Fill"]

View File

@@ -9,7 +9,7 @@
solutions:
drink:
maxVol: 30
grindable:
grindable: &grindable
reagents: # 5u -> 1/2 steel sheet (10u)
- ReagentId: Aluminium # Fun fact: soda can makeup is approx. 75% aluminium and 25% tin/iron.
Quantity: 4
@@ -51,12 +51,7 @@
reagents:
- ReagentId: Cola
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Tag
tags:
- Cola
@@ -76,12 +71,7 @@
solutions:
drink:
maxVol: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Tag
tags:
- Cola
@@ -101,12 +91,7 @@
reagents:
- ReagentId: IcedTea
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/ice_tea_can.rsi
- type: Item
@@ -125,12 +110,7 @@
reagents:
- ReagentId: LemonLime
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/lemon-lime.rsi
- type: Item
@@ -149,12 +129,7 @@
reagents:
- ReagentId: LemonLimeCranberry
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/lemon-lime-cranberry.rsi
- type: Item
@@ -206,12 +181,7 @@
reagents:
- ReagentId: GrapeSoda
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/purple_can.rsi
- type: Item
@@ -230,12 +200,7 @@
reagents:
- ReagentId: RootBeer
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/rootbeer.rsi
- type: Item
@@ -258,12 +223,7 @@
reagents:
- ReagentId: SodaWater
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/sodawater.rsi
- type: Item
@@ -282,12 +242,7 @@
reagents:
- ReagentId: SpaceMountainWind
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/space_mountain_wind.rsi
- type: Item
@@ -306,12 +261,7 @@
reagents:
- ReagentId: SpaceUp
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/space-up.rsi
- type: Item
@@ -330,12 +280,7 @@
reagents:
- ReagentId: SolDry
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/sol_dry.rsi
- type: Item
@@ -354,12 +299,7 @@
reagents:
- ReagentId: Starkist
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/starkist.rsi
- type: Item
@@ -378,12 +318,7 @@
reagents:
- ReagentId: TonicWater
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/tonic.rsi
- type: Item
@@ -402,12 +337,7 @@
reagents:
- ReagentId: FourteenLoko
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/fourteen_loko.rsi
- type: Item
@@ -426,12 +356,7 @@
reagents:
- ReagentId: ChangelingSting
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/changelingsting.rsi
- type: Item
@@ -450,12 +375,7 @@
reagents:
- ReagentId: DrGibb
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/dr_gibb.rsi
- type: Item
@@ -478,12 +398,7 @@
Quantity: 20
- ReagentId: Ice
Quantity: 5
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/robustnukie.rsi
- type: Item
@@ -502,12 +417,7 @@
reagents:
- ReagentId: EnergyDrink
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/energy_drink.rsi
- type: Item
@@ -526,12 +436,7 @@
reagents:
- ReagentId: ShamblersJuice
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/shamblersjuice.rsi
- type: Item
@@ -550,12 +455,7 @@
reagents:
- ReagentId: PwrGame
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/pwrgame.rsi
- type: Item
@@ -574,12 +474,7 @@
reagents:
- ReagentId: Beer
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/beer_can.rsi
- type: Item
@@ -602,12 +497,7 @@
reagents:
- ReagentId: Wine
Quantity: 30
grindable:
reagents:
- ReagentId: Aluminium
Quantity: 4
- ReagentId: Iron
Quantity: 1
grindable: *grindable
- type: Sprite
sprite: Objects/Consumable/Drinks/wine_can.rsi
- type: Item

View File

@@ -22,22 +22,16 @@
# A mug is a type of cup.[2]
- type: entity
abstract: true
parent: [ DrinkBaseMaterialPorcelain, DrinkBaseCup ] # todo Should use DrinkVisualsFill, but inheritors have no in-hand and state names are wrong
parent: [ DrinkBaseMaterialPorcelain, DrinkBaseCup, DrinkVisualsFill ]
id: DrinkBaseMug
name: mug
description: A mug.
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/mug.rsi
layers:
- state: icon-0
- state: icon-3
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: Appearance
- type: SolutionContainerVisuals
maxFillLevels: 3
fillBaseName: icon-
inHandsFillBaseName: null
## Misc Cups
@@ -53,18 +47,13 @@
price: 125
- type: entity
parent: DrinkBaseMug
parent: DrinkBaseMug # a teacup is basically a mug
id: DrinkTeacupEmpty
name: teacup
description: A plain white porcelain teacup.
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/teacup.rsi
layers:
- state: icon-0
- state: icon-4
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: SolutionContainerVisuals
maxFillLevels: 4
@@ -76,20 +65,11 @@
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/glass_coupe_shape.rsi
layers:
- state: icon # todo add "icon_empty" state to match DrinkVisualsFillOverlay
map: [ "enum.SolutionContainerLayers.Base" ]
- state: fill1
map: [ "enum.SolutionContainerLayers.Fill" ]
visible: false
- state: icon-front
map: [ "enum.SolutionContainerLayers.Overlay" ]
- type: SolutionContainerVisuals
fillBaseName: fill # todo rename to "fill-" to match DrinkVisualsFillOverlay
inHandsMaxFillLevels: 1
- type: entity
parent: [DrinkBaseMaterialCardboard, DrinkBaseCup] # TODO should use DrinkVisualsFill but state names are wrong and no inhand
parent: [DrinkBaseMaterialCardboard, DrinkBaseCup, DrinkBaseEmptyTrash, DrinkVisualsFill]
id: DrinkWaterCup
name: water cup
description: A paper water cup.
@@ -102,22 +82,14 @@
size: Tiny
- type: Sprite
sprite: Objects/Consumable/Drinks/water_cup.rsi
layers:
- state: icon-0
- state: icon-1
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: SolutionContainerVisuals
maxFillLevels: 1
fillBaseName: icon-
inHandsFillBaseName: null
- type: Tag
tags:
- Trash
- DrinkCup
- WhitelistChameleon
- type: Appearance
- type: TrashOnSolutionEmpty
solution: drink
- type: Clothing
slots:
- HEAD
@@ -240,16 +212,13 @@
- ReagentId: HotCocoa
Quantity: 20
- type: Icon
sprite: Objects/Consumable/Drinks/hot_coco.rsi
state: icon-vend
sprite: Objects/Consumable/Drinks/mug.rsi
state: icon-vend-brown
- type: Sprite
sprite: Objects/Consumable/Drinks/hot_coco.rsi
layers:
- state: icon-0
- map: ["enum.SolutionContainerLayers.Fill"]
state: icon-4
- type: SolutionContainerVisuals
maxFillLevels: 4
- state: icon
- state: fill-3
map: ["enum.SolutionContainerLayers.Fill"]
- type: TrashOnSolutionEmpty
solution: drink
@@ -267,16 +236,13 @@
- ReagentId: Coffee
Quantity: 20
- type: Icon
sprite: Objects/Consumable/Drinks/hot_coffee.rsi
state: icon-vend
sprite: Objects/Consumable/Drinks/mug.rsi
state: icon-vend-brown
- type: Sprite
sprite: Objects/Consumable/Drinks/hot_coffee.rsi
layers:
- state: icon-0
- map: ["enum.SolutionContainerLayers.Fill"]
state: icon-4
- type: SolutionContainerVisuals
maxFillLevels: 4
- state: icon
- state: fill-3
map: ["enum.SolutionContainerLayers.Fill"]
- type: TrashOnSolutionEmpty
solution: drink
@@ -293,16 +259,17 @@
reagents:
- ReagentId: CafeLatte
Quantity: 20
- type: Icon
sprite: Objects/Consumable/Drinks/cafe_latte.rsi
state: icon-vend
- type: Sprite
sprite: Objects/Consumable/Drinks/cafe_latte.rsi
layers:
- state: icon_empty
- state: fill-1
map: ["enum.SolutionContainerLayers.Fill"]
- type: Appearance
- state: icon
- state: fill-1
map: ["enum.SolutionContainerLayers.Fill"]
- type: SolutionContainerVisuals
maxFillLevels: 1
fillBaseName: fill-
changeColor: false
- type: TrashOnSolutionEmpty
solution: drink

View File

@@ -8,9 +8,9 @@
collection: packetOpenSounds
- type: Sprite
layers:
- state: icon
- state: icon_empty
map: ["enum.OpenableVisuals.Layer"]
- state: fill6
- state: fill-6
map: [ "enum.SolutionContainerLayers.Fill" ] # already has liquid, so no visible: false
- state: icon-front
map: [ "enum.SolutionContainerLayers.Overlay" ]
@@ -20,13 +20,6 @@
maxVol: 30
- type: SolutionContainerVisuals
maxFillLevels: 6
fillBaseName: fill # TODO rename to "fill-"
- type: GenericVisualizer
visuals:
enum.OpenableVisuals.Opened:
enum.OpenableVisuals.Layer:
True: {state: "icon_open"}
False: {state: "icon"}
- type: TrashOnSolutionEmpty
solution: drink
@@ -97,8 +90,6 @@
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/jar_what.rsi
- type: ExaminableSolution
solution: drink
- type: FitsInDispenser
solution: drink
- type: Tag

View File

@@ -4,35 +4,23 @@
# Transformable container - normal glass
- type: entity
parent: [DrinkBaseMaterialGlass, DrinkBaseCup] # todo parent to DrinkVisualsFillOverlay after in-hands are added
parent: [DrinkBaseMaterialGlass, DrinkBaseCup, DrinkVisualsFillOverlay]
id: DrinkGlass
name: metamorphic glass
description: A metamorphic glass that automagically turns into a glass appropriate for the drink within. There's a sanded off patent number on the bottom.
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/glass_clear.rsi
layers:
- state: icon # TODO add "icon_empty" state to match "DrinkVisualsFillOverlay"
map: [ "enum.SolutionContainerLayers.Base" ]
- state: fill1
map: [ "enum.SolutionContainerLayers.Fill" ]
visible: false
- state: icon-front
map: [ "enum.SolutionContainerLayers.Overlay" ]
- type: Appearance
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
- type: SolutionContainerVisuals
maxFillLevels: 9
fillBaseName: fill # todo rename to "fill-", add in-hands, then add parent "DrinkVisualsFillOverlay"
metamorphic: true
metamorphicDefaultSprite:
sprite: Objects/Consumable/Drinks/glass_clear.rsi
state: icon
inHandsMaxFillLevels: 3
inHandsFillBaseName: -fill-
- type: Tag
tags:
- DrinkCup # Do these tags
@@ -47,14 +35,6 @@
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/jar.rsi
layers:
- state: icon
map: [ "enum.SolutionContainerLayers.Base" ]
- state: fill1
map: [ "enum.SolutionContainerLayers.Fill" ]
visible: false
- state: icon-front
map: [ "enum.SolutionContainerLayers.Overlay" ]
- type: SolutionContainerManager
solutions:
drink:

View File

@@ -12,17 +12,8 @@
size: Tiny
- type: Sprite
sprite: Objects/Consumable/Drinks/shotglass.rsi
layers:
- state: icon # TODO add "icon_empty" state to match "DrinkVisualsFillOverlay"
map: [ "enum.SolutionContainerLayers.Base" ]
- state: fill1
map: [ "enum.SolutionContainerLayers.Fill" ]
visible: false
- state: icon-front
map: [ "enum.SolutionContainerLayers.Overlay" ]
- type: SolutionContainerVisuals
maxFillLevels: 2
fillBaseName: fill # TODO rename to "fill-" to match "DrinkVisualsFillOverlay"
inHandsMaxFillLevels: 1
- type: FitsInDispenser
solution: drink
@@ -146,6 +137,21 @@
reactionTypes:
- Shake
- type: entity
parent: DrinkShaker
id: DrinkShakerGold
name: golden shaker
description: A gold-plated shaker given as a token of appreciation for years of service. It doesn't make the drinks taste any different.
components:
- type: Sprite
sprite: Objects/Consumable/Drinks/shaker_gold.rsi
- type: Item
sprite: Objects/Consumable/Drinks/shaker_gold.rsi
- type: PhysicalComposition
materialComposition:
Gold: 10 # Gold plated, not solid gold
Steel: 40
- type: entity
parent: [DrinkBaseMaterialMetal, DrinkBase]
id: DrinkJigger
@@ -184,11 +190,6 @@
maxVol: 60
- type: Sprite
sprite: Objects/Consumable/Drinks/pitcher.rsi
layers:
- state: icon # TODO add "icon_empty" state to match "DrinkVisualsFill"
- state: fill-1
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: SolutionContainerVisuals
maxFillLevels: 6
inHandsMaxFillLevels: 2

View File

@@ -731,7 +731,7 @@
name: crostini
parent: FoodBreadSliceBase
id: FoodBreadBaguetteSlice
description: Bon ap-petite!
description: Bon ap-pétite!
components:
- type: Sprite
state: crostini
@@ -753,7 +753,7 @@
parent: FoodBreadBaguetteSlice
id: FoodBreadBaguetteCottonSlice
name: cotton crostini
description: Bon az-zetite!
description: Bon az-zétite!
components:
- type: Sprite
state: crostini-cotton
@@ -1001,3 +1001,57 @@
damage:
groups:
Brute: 1
- type: entity
parent: FoodBreadBase
id: FoodBreadNutriBatard
name: nutri-bâtard
description: bon 'pétite!
components:
- type: Sprite
sprite: Objects/Consumable/Food/Baked/bread.rsi
state: batard
- type: Item
size: Small
storedOffset: -1,0
heldPrefix: batard
- type: Tag
tags:
- ReptilianFood
- type: FlavorProfile
flavors:
- nutribrick
- peppery
- salty
- bread
- type: entity
parent: FoodBreadNutriBatard
id: FoodBreadCottonNutriBatard
name: cotton nutri-bâtard
description: bon 'pétite!
components:
- type: Edible
requiresSpecialDigestion: true
- type: Sprite
sprite: Objects/Consumable/Food/Baked/bread.rsi
state: batard-cotton
- type: FlavorProfile
flavors:
- peppery
- salty
- bread
- type: Tag
tags:
- ClothMade
- type: Item
size: Small
storedOffset: -1,0
heldPrefix: batard-cotton
- type: SolutionContainerManager
solutions:
food:
maxVol: 26
reagents:
- ReagentId: Fiber
Quantity: 20

View File

@@ -533,6 +533,7 @@
tags:
- Trash
- HappyHonk
- BoxCardboard
- type: StorageFill
contents:
- id: ToyMouse
@@ -704,7 +705,8 @@
- type: Tag
tags:
- Trash
- CluwneHappyHonk
- CluwneHappyHonk # BAD: Intentional removal of parent tag
- BoxCardboard
- type: Sprite
sprite: Objects/Storage/Happyhonk/cluwne.rsi
state: box
@@ -882,7 +884,7 @@
grid:
- 0,0,1,1
maxItemSize: Normal
whitelist:
whitelist: # TODO BoxCardboard shouldn't have whitelisted storage
tags:
- ClothMade
- type: Item

View File

@@ -1242,6 +1242,23 @@
- state: plain-cooked-inhand-right
color: "#F7E3A3"
- type: entity
parent: FoodMeatChickenFried
id: FoodMeatChickenFriedVox
name: mystery fried chicken
description: “Eleven secret herbs and… oh no. Thats not chicken."
components:
- type: SolutionContainerManager
solutions:
food:
reagents:
- ReagentId: Nutriment
Quantity: 2
- ReagentId: Protein
Quantity: 5
- ReagentId: Ammonia
Quantity: 3
- type: entity
parent: FoodMeatBase
id: FoodMeatDuckCooked

Some files were not shown because too many files have changed in this diff Show More