diff --git a/Content.Client/GameObjects/Components/Body/Surgery/SurgeryWindow.cs b/Content.Client/GameObjects/Components/Body/Surgery/SurgeryWindow.cs
index d380569b46..656aeda4a7 100644
--- a/Content.Client/GameObjects/Components/Body/Surgery/SurgeryWindow.cs
+++ b/Content.Client/GameObjects/Components/Body/Surgery/SurgeryWindow.cs
@@ -19,7 +19,7 @@ namespace Content.Client.GameObjects.Components.Body.Surgery
public SurgeryWindow()
{
- Title = Loc.GetString("Select surgery target...");
+ Title = Loc.GetString("Surgery");
RectClipContent = true;
var vSplitContainer = new VBoxContainer
diff --git a/Content.Client/GameObjects/Components/Buckle/BuckleComponent.cs b/Content.Client/GameObjects/Components/Buckle/BuckleComponent.cs
index 491be6c91d..a3020c85bc 100644
--- a/Content.Client/GameObjects/Components/Buckle/BuckleComponent.cs
+++ b/Content.Client/GameObjects/Components/Buckle/BuckleComponent.cs
@@ -1,4 +1,4 @@
-using Content.Shared.GameObjects.Components.Buckle;
+using Content.Shared.GameObjects.Components.Buckle;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
@@ -27,6 +27,8 @@ namespace Content.Client.GameObjects.Components.Buckle
}
_buckled = buckle.Buckled;
+ LastEntityBuckledTo = buckle.LastEntityBuckledTo;
+ DontCollide = buckle.DontCollide;
if (!Owner.TryGetComponent(out SpriteComponent ownerSprite))
{
diff --git a/Content.Client/GameObjects/Components/ClickableComponent.cs b/Content.Client/GameObjects/Components/ClickableComponent.cs
index 63d4622648..d55c58affe 100644
--- a/Content.Client/GameObjects/Components/ClickableComponent.cs
+++ b/Content.Client/GameObjects/Components/ClickableComponent.cs
@@ -46,7 +46,7 @@ namespace Content.Client.GameObjects.Components
var localPos = Owner.Transform.InvWorldMatrix.Transform(worldPos);
- var worldRotation = Owner.Transform.WorldRotation;
+ var worldRotation = new Angle(Owner.Transform.WorldRotation - sprite.Rotation);
if (sprite.Directional)
{
localPos = new Angle(worldRotation).RotateVec(localPos);
diff --git a/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs b/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs
index 3896718c1a..85d6119014 100644
--- a/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs
+++ b/Content.Client/GameObjects/Components/Instruments/InstrumentComponent.cs
@@ -52,6 +52,8 @@ namespace Content.Client.GameObjects.Components.Instruments
private bool _allowProgramChange;
+ private bool _respectMidiLimits;
+
///
/// A queue of MidiEvents to be sent to the server.
///
@@ -239,6 +241,7 @@ namespace Content.Client.GameObjects.Components.Instruments
serializer.DataField(ref _instrumentBank, "bank", (byte) 0);
serializer.DataField(ref _allowPercussion, "allowPercussion", false);
serializer.DataField(ref _allowProgramChange, "allowProgramChange", false);
+ serializer.DataField(ref _respectMidiLimits, "respectMidiLimits", true);
}
public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession? session = null)
@@ -429,7 +432,9 @@ namespace Content.Client.GameObjects.Components.Instruments
if (_midiEventBuffer.Count == 0) return;
- var max = Math.Min(_instrumentSystem.MaxMidiEventsPerBatch, _instrumentSystem.MaxMidiEventsPerSecond - _sentWithinASec);
+ var max = _respectMidiLimits ?
+ Math.Min(_instrumentSystem.MaxMidiEventsPerBatch, _instrumentSystem.MaxMidiEventsPerSecond - _sentWithinASec)
+ : _midiEventBuffer.Count;
if (max <= 0)
{
diff --git a/Content.Client/GameObjects/Components/Items/HandsComponent.cs b/Content.Client/GameObjects/Components/Items/HandsComponent.cs
index 654f7e6c0c..21f112d031 100644
--- a/Content.Client/GameObjects/Components/Items/HandsComponent.cs
+++ b/Content.Client/GameObjects/Components/Items/HandsComponent.cs
@@ -55,7 +55,7 @@ namespace Content.Client.GameObjects.Components.Items
return Hands.FirstOrDefault(hand => hand.Name == name);
}
- private bool TryHand(string name, [MaybeNullWhen(false)] out Hand hand)
+ private bool TryHand(string name, [NotNullWhen(true)] out Hand? hand)
{
return (hand = GetHand(name)) != null;
}
diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs
index 9df1ab57ce..676c7f33ca 100644
--- a/Content.Client/IgnoredComponents.cs
+++ b/Content.Client/IgnoredComponents.cs
@@ -1,4 +1,4 @@
-namespace Content.Client
+namespace Content.Client
{
public static class IgnoredComponents
{
@@ -225,7 +225,10 @@
"MachineFrame",
"MachineBoard",
"ChemicalAmmo",
- "BiologicalSurgeryData"
+ "BiologicalSurgeryData",
+ "CargoTelepad",
+ "TraitorDeathMatchRedemption",
+ "GlassBeaker"
};
}
}
diff --git a/Content.Client/UserInterface/Cargo/CargoConsoleMenu.cs b/Content.Client/UserInterface/Cargo/CargoConsoleMenu.cs
index b955ec5493..697c73a689 100644
--- a/Content.Client/UserInterface/Cargo/CargoConsoleMenu.cs
+++ b/Content.Client/UserInterface/Cargo/CargoConsoleMenu.cs
@@ -109,7 +109,8 @@ namespace Content.Client.UserInterface.Cargo
var buttons = new HBoxContainer();
CallShuttleButton = new Button()
{
- Text = Loc.GetString("Call Shuttle"),
+ //Text = Loc.GetString("Call Shuttle"),
+ Text = Loc.GetString("Activate Telepad"), //Shuttle code pending
TextAlign = Label.AlignMode.Center,
SizeFlagsHorizontal = SizeFlags.FillExpand
};
diff --git a/Content.Client/UserInterface/HumanoidProfileEditor.cs b/Content.Client/UserInterface/HumanoidProfileEditor.cs
index baacc607a9..3ab41fa719 100644
--- a/Content.Client/UserInterface/HumanoidProfileEditor.cs
+++ b/Content.Client/UserInterface/HumanoidProfileEditor.cs
@@ -43,8 +43,11 @@ namespace Content.Client.UserInterface
private readonly Button _sexClassifiedButton;
private readonly HairStylePicker _hairPicker;
private readonly FacialHairStylePicker _facialHairPicker;
+
private readonly List _jobPriorities;
private readonly OptionButton _preferenceUnavailableButton;
+ private readonly Dictionary _jobCategories;
+
private readonly List _antagPreferences;
private readonly IEntity _previewDummy;
@@ -313,31 +316,79 @@ namespace Content.Client.UserInterface
};
_jobPriorities = new List();
+ _jobCategories = new Dictionary();
+
+ var firstCategory = true;
foreach (var job in prototypeManager.EnumeratePrototypes().OrderBy(j => j.Name))
{
- var selector = new JobPrioritySelector(job);
- jobList.AddChild(selector);
- _jobPriorities.Add(selector);
-
- selector.PriorityChanged += priority =>
+ foreach (var department in job.Departments)
{
- Profile = Profile.WithJobPriority(job.ID, priority);
- IsDirty = true;
-
- if (priority == JobPriority.High)
+ if (!_jobCategories.TryGetValue(department, out var category))
{
- // Lower any other high priorities to medium.
+ category = new VBoxContainer
+ {
+ Name = department,
+ ToolTip = Loc.GetString("Jobs in the {0} department", department)
+ };
+
+ if (firstCategory)
+ {
+ firstCategory = false;
+ }
+ else
+ {
+ category.AddChild(new Control
+ {
+ CustomMinimumSize = new Vector2(0, 23),
+ });
+ }
+
+ category.AddChild(new PanelContainer
+ {
+ PanelOverride = new StyleBoxFlat {BackgroundColor = Color.FromHex("#464966")},
+ Children =
+ {
+ new Label
+ {
+ Text = Loc.GetString("{0} jobs", department)
+ }
+ }
+ });
+
+ _jobCategories[department] = category;
+ jobList.AddChild(category);
+ }
+
+ var selector = new JobPrioritySelector(job);
+ category.AddChild(selector);
+ _jobPriorities.Add(selector);
+
+ selector.PriorityChanged += priority =>
+ {
+ Profile = Profile.WithJobPriority(job.ID, priority);
+ IsDirty = true;
+
foreach (var jobSelector in _jobPriorities)
{
- if (jobSelector != selector && jobSelector.Priority == JobPriority.High)
+ // Sync other selectors with the same job in case of multiple department jobs
+ if (jobSelector.Job == selector.Job)
{
- jobSelector.Priority = JobPriority.Medium;
- Profile = Profile.WithJobPriority(jobSelector.Job.ID, JobPriority.Medium);
+ jobSelector.Priority = priority;
+ }
+
+ // Lower any other high priorities to medium.
+ if (priority == JobPriority.High)
+ {
+ if (jobSelector.Job != selector.Job && jobSelector.Priority == JobPriority.High)
+ {
+ jobSelector.Priority = JobPriority.Medium;
+ Profile = Profile.WithJobPriority(jobSelector.Job.ID, JobPriority.Medium);
+ }
}
}
- }
- };
+ };
+ }
}
}
@@ -452,7 +503,7 @@ namespace Content.Client.UserInterface
SizeFlagsHorizontal = SizeFlags.FillExpand,
};
hbox.AddChild(vBox);
-
+
#region Preview
_previewDummy = entityManager.SpawnEntity("HumanMob_Dummy", MapCoordinates.Nullspace);
@@ -495,7 +546,7 @@ namespace Content.Client.UserInterface
box.AddChild(_previewSpriteSide);
#endregion
-
+
#endregion
if (preferencesManager.ServerDataLoaded)
diff --git a/Content.Client/UserInterface/LateJoinGui.cs b/Content.Client/UserInterface/LateJoinGui.cs
index 13eed2a6ab..c1449ceb11 100644
--- a/Content.Client/UserInterface/LateJoinGui.cs
+++ b/Content.Client/UserInterface/LateJoinGui.cs
@@ -4,6 +4,8 @@ using System.Linq;
using Content.Client.Interfaces;
using Content.Shared.Roles;
using Robust.Client.Console;
+using Robust.Client.Graphics.Drawing;
+using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.Utility;
@@ -27,6 +29,7 @@ namespace Content.Client.UserInterface
public event Action SelectedId;
private readonly Dictionary _jobButtons = new();
+ private readonly Dictionary _jobCategories = new();
public LateJoinGui()
{
@@ -37,65 +40,108 @@ namespace Content.Client.UserInterface
var jobList = new VBoxContainer();
var vBox = new VBoxContainer
{
- Children =
+ Children =
+ {
+ new ScrollContainer
{
- new ScrollContainer
+ SizeFlagsVertical = SizeFlags.FillExpand,
+ Children =
{
- SizeFlagsVertical = SizeFlags.FillExpand,
- Children =
- {
- jobList
- }
+ jobList
}
}
- };
+ }
+ };
+
Contents.AddChild(vBox);
+ var firstCategory = true;
+
foreach (var job in _prototypeManager.EnumeratePrototypes().OrderBy(j => j.Name))
{
- var jobButton = new JobButton
+ foreach (var department in job.Departments)
{
- JobId = job.ID
- };
+ if (!_jobCategories.TryGetValue(department, out var category))
+ {
+ category = new VBoxContainer
+ {
+ Name = department,
+ ToolTip = Loc.GetString("Jobs in the {0} department", department)
+ };
- var jobSelector = new HBoxContainer
- {
- SizeFlagsHorizontal = SizeFlags.FillExpand
- };
+ if (firstCategory)
+ {
+ firstCategory = false;
+ }
+ else
+ {
+ category.AddChild(new Control
+ {
+ CustomMinimumSize = new Vector2(0, 23),
+ });
+ }
- var icon = new TextureRect
- {
- TextureScale = (2, 2),
- Stretch = TextureRect.StretchMode.KeepCentered
- };
+ category.AddChild(new PanelContainer
+ {
+ PanelOverride = new StyleBoxFlat {BackgroundColor = Color.FromHex("#464966")},
+ Children =
+ {
+ new Label
+ {
+ Text = Loc.GetString("{0} jobs", department)
+ }
+ }
+ });
- if (job.Icon != null)
- {
- var specifier = new SpriteSpecifier.Rsi(new ResourcePath("/Textures/Interface/Misc/job_icons.rsi"), job.Icon);
- icon.Texture = specifier.Frame0();
+ _jobCategories[department] = category;
+ jobList.AddChild(category);
+ }
+
+ var jobButton = new JobButton
+ {
+ JobId = job.ID
+ };
+
+ var jobSelector = new HBoxContainer
+ {
+ SizeFlagsHorizontal = SizeFlags.FillExpand
+ };
+
+ var icon = new TextureRect
+ {
+ TextureScale = (2, 2),
+ Stretch = TextureRect.StretchMode.KeepCentered
+ };
+
+ if (job.Icon != null)
+ {
+ var specifier = new SpriteSpecifier.Rsi(new ResourcePath("/Textures/Interface/Misc/job_icons.rsi"), job.Icon);
+ icon.Texture = specifier.Frame0();
+ }
+
+ jobSelector.AddChild(icon);
+
+ var jobLabel = new Label
+ {
+ Text = job.Name
+ };
+
+ jobSelector.AddChild(jobLabel);
+ jobButton.AddChild(jobSelector);
+ category.AddChild(jobButton);
+
+ jobButton.OnPressed += _ =>
+ {
+ SelectedId?.Invoke(jobButton.JobId);
+ };
+
+ if (!_gameTicker.JobsAvailable.Contains(job.ID))
+ {
+ jobButton.Disabled = true;
+ }
+
+ _jobButtons[job.ID] = jobButton;
}
- jobSelector.AddChild(icon);
-
- var jobLabel = new Label
- {
- Text = job.Name
- };
-
- jobSelector.AddChild(jobLabel);
-
- jobButton.AddChild(jobSelector);
- jobList.AddChild(jobButton);
- jobButton.OnPressed += args =>
- {
- SelectedId?.Invoke(jobButton.JobId);
- };
-
- if (!_gameTicker.JobsAvailable.Contains(job.ID))
- {
- jobButton.Disabled = true;
- }
-
- _jobButtons[job.ID] = jobButton;
}
SelectedId += jobId =>
@@ -108,11 +154,6 @@ namespace Content.Client.UserInterface
_gameTicker.LobbyJobsAvailableUpdated += JobsAvailableUpdated;
}
- public string ReturnId()
- {
- return SelectedId.ToString();
- }
-
private void JobsAvailableUpdated(IReadOnlyList jobs)
{
foreach (var (id, button) in _jobButtons)
@@ -129,6 +170,7 @@ namespace Content.Client.UserInterface
{
_gameTicker.LobbyJobsAvailableUpdated -= JobsAvailableUpdated;
_jobButtons.Clear();
+ _jobCategories.Clear();
}
}
}
diff --git a/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs b/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs
index 394dd11e7c..2bf519db3f 100644
--- a/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs
+++ b/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs
@@ -7,6 +7,8 @@ using Content.Shared.GameObjects.Components.Body;
using Content.Shared.GameObjects.Components.Body.Part;
using Content.Shared.GameObjects.Components.Buckle;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
using Content.Shared.Utility;
using NUnit.Framework;
using Robust.Shared.Interfaces.GameObjects;
diff --git a/Content.IntegrationTests/Tests/Damageable/DamageTest.cs b/Content.IntegrationTests/Tests/Damage/DamageTest.cs
similarity index 77%
rename from Content.IntegrationTests/Tests/Damageable/DamageTest.cs
rename to Content.IntegrationTests/Tests/Damage/DamageTest.cs
index 3cc065aac4..caeea3865a 100644
--- a/Content.IntegrationTests/Tests/Damageable/DamageTest.cs
+++ b/Content.IntegrationTests/Tests/Damage/DamageTest.cs
@@ -147,5 +147,53 @@ namespace Content.IntegrationTests.Tests.Damageable
}
});
}
+
+ [Test]
+ public async Task TotalDamageTest()
+ {
+ var server = StartServerDummyTicker(new ServerContentIntegrationOption
+ {
+ ExtraPrototypes = Prototypes
+ });
+
+ await server.WaitIdleAsync();
+
+ var sEntityManager = server.ResolveDependency();
+ var sMapManager = server.ResolveDependency();
+
+ IEntity sDamageableEntity;
+ IDamageableComponent sDamageableComponent = null;
+
+ await server.WaitPost(() =>
+ {
+ var mapId = sMapManager.NextMapId();
+ var coordinates = new MapCoordinates(0, 0, mapId);
+ sMapManager.CreateMap(mapId);
+
+ sDamageableEntity = sEntityManager.SpawnEntity(DamageableEntityId, coordinates);
+ sDamageableComponent = sDamageableEntity.GetComponent();
+ });
+
+ await server.WaitAssertion(() =>
+ {
+ var damageType = DamageClass.Brute;
+ var damage = 10;
+
+ Assert.True(sDamageableComponent.ChangeDamage(DamageClass.Brute, damage, true));
+ Assert.That(sDamageableComponent.TotalDamage, Is.EqualTo(10));
+
+ var totalTypeDamage = 0;
+
+ foreach (var type in damageType.ToTypes())
+ {
+ Assert.True(sDamageableComponent.TryGetDamage(type, out var typeDamage));
+ Assert.That(typeDamage, Is.LessThanOrEqualTo(damage));
+
+ totalTypeDamage += typeDamage;
+ }
+
+ Assert.That(totalTypeDamage, Is.EqualTo(damage));
+ });
+ }
}
}
diff --git a/Content.IntegrationTests/Tests/Job/JobPriorityTest.cs b/Content.IntegrationTests/Tests/Job/JobPriorityTest.cs
new file mode 100644
index 0000000000..03e12ae964
--- /dev/null
+++ b/Content.IntegrationTests/Tests/Job/JobPriorityTest.cs
@@ -0,0 +1,31 @@
+using System;
+using Content.Server.Database;
+using Content.Shared.Preferences;
+using NUnit.Framework;
+
+namespace Content.IntegrationTests.Tests.Job
+{
+ [TestFixture]
+ [TestOf(typeof(JobPriority))]
+ [TestOf(typeof(DbJobPriority))]
+ public class JobPriorityTest
+ {
+ [Test]
+ public void JobPriorityEnumParityTest()
+ {
+ var priorities = Enum.GetValues();
+ var dbPriorities = Enum.GetValues();
+
+ Assert.That(priorities.Length, Is.EqualTo(dbPriorities.Length));
+
+ for (var i = 0; i < priorities.Length; i++)
+ {
+ var priority = priorities[i];
+ var dbPriority = dbPriorities[i];
+
+ Assert.That((int) priority, Is.EqualTo((int) dbPriority));
+ Assert.That(priority.ToString(), Is.EqualTo(dbPriority.ToString()));
+ }
+ }
+ }
+}
diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs
index 39f80bec76..2b2ac59a14 100644
--- a/Content.Server.Database/Model.cs
+++ b/Content.Server.Database/Model.cs
@@ -119,7 +119,7 @@ namespace Content.Server.Database
public enum DbJobPriority
{
- // These enum values HAVE to match the ones in JobPriority in Shared.
+ // These enum values HAVE to match the ones in JobPriority in Content.Shared
Never = 0,
Low = 1,
Medium = 2,
diff --git a/Content.Server/AI/Utility/Considerations/ActionBlocker/CanMoveCon.cs b/Content.Server/AI/Utility/Considerations/ActionBlocker/CanMoveCon.cs
index c45230589b..b53c0d0190 100644
--- a/Content.Server/AI/Utility/Considerations/ActionBlocker/CanMoveCon.cs
+++ b/Content.Server/AI/Utility/Considerations/ActionBlocker/CanMoveCon.cs
@@ -1,6 +1,7 @@
using Content.Server.AI.WorldState;
using Content.Server.AI.WorldState.States;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
namespace Content.Server.AI.Utility.Considerations.ActionBlocker
{
diff --git a/Content.Server/Actions/ScreamAction.cs b/Content.Server/Actions/ScreamAction.cs
index e89d2452e7..58a8acc480 100644
--- a/Content.Server/Actions/ScreamAction.cs
+++ b/Content.Server/Actions/ScreamAction.cs
@@ -5,6 +5,7 @@ using Content.Shared.Actions;
using Content.Shared.Audio;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Preferences;
using Content.Shared.Utility;
using JetBrains.Annotations;
diff --git a/Content.Server/Atmos/AtmosHelpers.cs b/Content.Server/Atmos/AtmosHelpers.cs
index f0bdeab213..2761bf3457 100644
--- a/Content.Server/Atmos/AtmosHelpers.cs
+++ b/Content.Server/Atmos/AtmosHelpers.cs
@@ -13,7 +13,7 @@ namespace Content.Server.Atmos
{
public static class AtmosHelpers
{
- public static TileAtmosphere GetTileAtmosphere(this EntityCoordinates coordinates, IEntityManager? entityManager = null)
+ public static TileAtmosphere? GetTileAtmosphere(this EntityCoordinates coordinates, IEntityManager? entityManager = null)
{
entityManager ??= IoCManager.Resolve();
@@ -24,19 +24,19 @@ namespace Content.Server.Atmos
public static GasMixture? GetTileAir(this EntityCoordinates coordinates, IEntityManager? entityManager = null)
{
- return coordinates.GetTileAtmosphere(entityManager).Air;
+ return coordinates.GetTileAtmosphere(entityManager)?.Air;
}
- public static bool TryGetTileAtmosphere(this EntityCoordinates coordinates, [MaybeNullWhen(false)] out TileAtmosphere atmosphere)
+ public static bool TryGetTileAtmosphere(this EntityCoordinates coordinates, [NotNullWhen(true)] out TileAtmosphere? atmosphere)
{
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
- return !Equals(atmosphere = coordinates.GetTileAtmosphere()!, default);
+ return !Equals(atmosphere = coordinates.GetTileAtmosphere(), default);
}
- public static bool TryGetTileAir(this EntityCoordinates coordinates, [MaybeNullWhen(false)] out GasMixture air, IEntityManager? entityManager = null)
+ public static bool TryGetTileAir(this EntityCoordinates coordinates, [NotNullWhen(true)] out GasMixture? air, IEntityManager? entityManager = null)
{
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
- return !Equals(air = coordinates.GetTileAir(entityManager)!, default);
+ return !Equals(air = coordinates.GetTileAir(entityManager), default);
}
public static bool IsTileAirProbablySafe(this EntityCoordinates coordinates)
@@ -56,7 +56,7 @@ namespace Content.Server.Atmos
return true;
}
- public static TileAtmosphere GetTileAtmosphere(this Vector2i indices, GridId gridId)
+ public static TileAtmosphere? GetTileAtmosphere(this Vector2i indices, GridId gridId)
{
var gridAtmos = EntitySystem.Get().GetGridAtmosphere(gridId);
@@ -69,28 +69,25 @@ namespace Content.Server.Atmos
}
public static bool TryGetTileAtmosphere(this Vector2i indices, GridId gridId,
- [MaybeNullWhen(false)] out TileAtmosphere atmosphere)
+ [NotNullWhen(true)] out TileAtmosphere? atmosphere)
{
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
- return !Equals(atmosphere = indices.GetTileAtmosphere(gridId)!, default);
+ return !Equals(atmosphere = indices.GetTileAtmosphere(gridId), default);
}
- public static bool TryGetTileAir(this Vector2i indices, GridId gridId, [MaybeNullWhen(false)] out GasMixture air)
+ public static bool TryGetTileAir(this Vector2i indices, GridId gridId, [NotNullWhen(true)] out GasMixture? air)
{
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
- return !Equals(air = indices.GetTileAir(gridId)!, default);
+ return !Equals(air = indices.GetTileAir(gridId), default);
}
public static bool InvalidateTileAir(this ITransformComponent transform, AtmosphereSystem? atmosSystem = null)
{
- return InvalidateTileAir(transform.Coordinates, atmosSystem);
+ return InvalidateTileAir(transform.Coordinates);
}
- public static bool InvalidateTileAir(this EntityCoordinates coordinates, AtmosphereSystem? atmosSystem = null, IEntityManager? entityManager = null)
+ public static bool InvalidateTileAir(this EntityCoordinates coordinates)
{
- atmosSystem ??= EntitySystem.Get();
- entityManager ??= IoCManager.Resolve();
-
if (!coordinates.TryGetTileAtmosphere(out var tileAtmos))
{
return false;
diff --git a/Content.Server/Atmos/IGridAtmosphereComponent.cs b/Content.Server/Atmos/IGridAtmosphereComponent.cs
index c84dd507e9..016551464c 100644
--- a/Content.Server/Atmos/IGridAtmosphereComponent.cs
+++ b/Content.Server/Atmos/IGridAtmosphereComponent.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+#nullable enable
+using System.Collections.Generic;
using Content.Server.GameObjects.Components.Atmos;
using Content.Server.GameObjects.Components.Atmos.Piping;
using Content.Server.GameObjects.Components.NodeContainer.NodeGroups;
@@ -120,7 +121,7 @@ namespace Content.Server.Atmos
///
///
///
- TileAtmosphere GetTile(Vector2i indices, bool createSpace = true);
+ TileAtmosphere? GetTile(Vector2i indices, bool createSpace = true);
///
/// Returns a tile.
@@ -128,7 +129,7 @@ namespace Content.Server.Atmos
///
///
///
- TileAtmosphere GetTile(EntityCoordinates coordinates, bool createSpace = true);
+ TileAtmosphere? GetTile(EntityCoordinates coordinates, bool createSpace = true);
///
/// Returns if the tile in question is air-blocked.
diff --git a/Content.Server/Chat/ChatManager.cs b/Content.Server/Chat/ChatManager.cs
index afeb0c11b2..7e291f5cef 100644
--- a/Content.Server/Chat/ChatManager.cs
+++ b/Content.Server/Chat/ChatManager.cs
@@ -11,6 +11,7 @@ using Content.Server.Interfaces.Chat;
using Content.Shared.Chat;
using Content.Shared.GameObjects.Components.Inventory;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Robust.Server.Interfaces.GameObjects;
using Robust.Server.Interfaces.Player;
diff --git a/Content.Server/Commands/GameTicking/GoLobbyCommand.cs b/Content.Server/Commands/GameTicking/GoLobbyCommand.cs
new file mode 100644
index 0000000000..35d2691f00
--- /dev/null
+++ b/Content.Server/Commands/GameTicking/GoLobbyCommand.cs
@@ -0,0 +1,50 @@
+#nullable enable
+using System;
+using Content.Server.Administration;
+using Content.Server.Interfaces.GameTicking;
+using Content.Shared;
+using Content.Shared.Administration;
+using Robust.Server.Interfaces.Console;
+using Robust.Server.Interfaces.Player;
+using Robust.Shared.Interfaces.Configuration;
+using Robust.Shared.IoC;
+using Robust.Shared.Localization;
+
+namespace Content.Server.Commands.GameTicking
+{
+ [AdminCommand(AdminFlags.Server)]
+ public class GoLobbyCommand : IClientCommand
+ {
+ public string Command => "golobby";
+ public string Description => "Enables the lobby and restarts the round.";
+ public string Help => $"Usage: {Command} / {Command} ";
+ public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args)
+ {
+ Type? preset = null;
+ var presetName = string.Join(" ", args);
+
+ var ticker = IoCManager.Resolve();
+
+ if (args.Length > 0)
+ {
+ if (!ticker.TryGetPreset(presetName, out preset))
+ {
+ shell.SendText(player, $"No preset found with name {presetName}");
+ return;
+ }
+ }
+
+ var config = IoCManager.Resolve();
+ config.SetCVar(CCVars.GameLobbyEnabled, true);
+
+ ticker.RestartRound();
+
+ if (preset != null)
+ {
+ ticker.SetStartPreset(preset);
+ }
+
+ shell.SendText(player, $"Enabling the lobby and restarting the round.{(preset == null ? "" : $"\nPreset set to {presetName}")}");
+ }
+ }
+}
diff --git a/Content.Server/GameObjects/Components/Access/IdCardConsoleComponent.cs b/Content.Server/GameObjects/Components/Access/IdCardConsoleComponent.cs
index 3457142e88..c611bd2957 100644
--- a/Content.Server/GameObjects/Components/Access/IdCardConsoleComponent.cs
+++ b/Content.Server/GameObjects/Components/Access/IdCardConsoleComponent.cs
@@ -11,6 +11,7 @@ using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Server.GameObjects.Components.Container;
using Robust.Server.GameObjects.Components.UserInterface;
using Robust.Server.Interfaces.GameObjects;
diff --git a/Content.Server/GameObjects/Components/ActionBlocking/CuffableComponent.cs b/Content.Server/GameObjects/Components/ActionBlocking/CuffableComponent.cs
index b9613c4391..e82dada792 100644
--- a/Content.Server/GameObjects/Components/ActionBlocking/CuffableComponent.cs
+++ b/Content.Server/GameObjects/Components/ActionBlocking/CuffableComponent.cs
@@ -10,6 +10,7 @@ using Content.Shared.Alert;
using Content.Shared.GameObjects.Components.ActionBlocking;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/Components/ActionBlocking/HandcuffComponent.cs b/Content.Server/GameObjects/Components/ActionBlocking/HandcuffComponent.cs
index 8fb013e5ea..18f4892d11 100644
--- a/Content.Server/GameObjects/Components/ActionBlocking/HandcuffComponent.cs
+++ b/Content.Server/GameObjects/Components/ActionBlocking/HandcuffComponent.cs
@@ -5,6 +5,7 @@ using Content.Server.GameObjects.Components.Mobs;
using Content.Server.GameObjects.EntitySystems.DoAfter;
using Content.Shared.GameObjects.Components.ActionBlocking;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs
index 2fec6e340c..3e9cfb6f25 100644
--- a/Content.Server/GameObjects/Components/AnchorableComponent.cs
+++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs
@@ -42,7 +42,7 @@ namespace Content.Server.GameObjects.Components
/// The tool being used, can be null if forcing it
/// Whether or not to check if the tool is valid
/// true if it is valid, false otherwise
- private async Task Valid(IEntity user, IEntity? utilizing, [MaybeNullWhen(false)] bool force = false)
+ private async Task Valid(IEntity user, IEntity? utilizing, [NotNullWhen(true)] bool force = false)
{
if (!Owner.HasComponent())
{
diff --git a/Content.Server/GameObjects/Components/Arcade/BlockGameArcadeComponent.cs b/Content.Server/GameObjects/Components/Arcade/BlockGameArcadeComponent.cs
index c3e6c0bf36..8045d71ffb 100644
--- a/Content.Server/GameObjects/Components/Arcade/BlockGameArcadeComponent.cs
+++ b/Content.Server/GameObjects/Components/Arcade/BlockGameArcadeComponent.cs
@@ -8,6 +8,7 @@ using Content.Server.Utility;
using Content.Shared.Arcade;
using Content.Shared.GameObjects;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects.Components.UserInterface;
using Robust.Server.Interfaces.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Arcade/SpaceVillainArcadeComponent.cs b/Content.Server/GameObjects/Components/Arcade/SpaceVillainArcadeComponent.cs
index 285ad7c4c3..99c46516e8 100644
--- a/Content.Server/GameObjects/Components/Arcade/SpaceVillainArcadeComponent.cs
+++ b/Content.Server/GameObjects/Components/Arcade/SpaceVillainArcadeComponent.cs
@@ -6,6 +6,7 @@ using Content.Server.Utility;
using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.Components.Arcade;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects.Components.UserInterface;
using Robust.Server.GameObjects.EntitySystems;
diff --git a/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs b/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs
index 17c40e111b..c3b6f7bbb1 100644
--- a/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs
+++ b/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs
@@ -12,6 +12,7 @@ using Content.Shared.GameObjects.Components.Atmos;
using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs b/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs
index 4f3c527292..a63a27d274 100644
--- a/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs
+++ b/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs
@@ -130,7 +130,7 @@ namespace Content.Server.GameObjects.Components.Atmos
// Already get the pressure before Dirty(), because we can't get the EntitySystem in that thread or smth
var pressure = 0f;
var gam = EntitySystem.Get().GetGridAtmosphere(Owner.Transform.GridID);
- var tile = gam?.GetTile(Owner.Transform.Coordinates).Air;
+ var tile = gam?.GetTile(Owner.Transform.Coordinates)?.Air;
if (tile != null)
{
pressure = tile.Pressure;
@@ -190,7 +190,7 @@ namespace Content.Server.GameObjects.Components.Atmos
var atmosSystem = EntitySystem.Get();
var gam = atmosSystem.GetGridAtmosphere(pos.GetGridId(Owner.EntityManager));
- var tile = gam?.GetTile(pos).Air;
+ var tile = gam.GetTile(pos)?.Air;
if (tile == null)
{
error = "No Atmosphere!";
diff --git a/Content.Server/GameObjects/Components/Atmos/GasCanisterComponent.cs b/Content.Server/GameObjects/Components/Atmos/GasCanisterComponent.cs
index 3ad88356e0..348ba46956 100644
--- a/Content.Server/GameObjects/Components/Atmos/GasCanisterComponent.cs
+++ b/Content.Server/GameObjects/Components/Atmos/GasCanisterComponent.cs
@@ -17,6 +17,7 @@ using Content.Shared.GameObjects.EntitySystems;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Atmos;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Server.GameObjects;
using Robust.Server.GameObjects.Components.UserInterface;
using Robust.Server.Interfaces.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Atmos/GasTankComponent.cs b/Content.Server/GameObjects/Components/Atmos/GasTankComponent.cs
index 5dd0bcb40d..0956c66645 100644
--- a/Content.Server/GameObjects/Components/Atmos/GasTankComponent.cs
+++ b/Content.Server/GameObjects/Components/Atmos/GasTankComponent.cs
@@ -11,6 +11,7 @@ using Content.Shared.Audio;
using Content.Shared.GameObjects.Components.Atmos.GasTank;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces.GameObjects.Components;
using JetBrains.Annotations;
diff --git a/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs b/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs
index 0c03c2f292..12ee989ebd 100644
--- a/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs
+++ b/Content.Server/GameObjects/Components/Atmos/GridAtmosphereComponent.cs
@@ -2,7 +2,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.CompilerServices;
using Content.Server.Atmos;
@@ -10,7 +9,6 @@ using Content.Server.GameObjects.Components.Atmos.Piping;
using Content.Server.GameObjects.Components.NodeContainer.NodeGroups;
using Content.Server.GameObjects.EntitySystems;
using Content.Server.GameObjects.EntitySystems.Atmos;
-using Content.Shared;
using Content.Shared.Atmos;
using Content.Shared.Maps;
using Robust.Server.GameObjects.EntitySystems.TileLookup;
@@ -19,7 +17,6 @@ using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.ComponentDependencies;
using Robust.Shared.GameObjects.Components.Map;
using Robust.Shared.GameObjects.Systems;
-using Robust.Shared.Interfaces.Configuration;
using Robust.Shared.Interfaces.Map;
using Robust.Shared.Log;
using Robust.Shared.Map;
diff --git a/Content.Server/GameObjects/Components/Body/Surgery/Messages/SurgeryWindowCloseMessage.cs b/Content.Server/GameObjects/Components/Body/Surgery/Messages/SurgeryWindowCloseMessage.cs
new file mode 100644
index 0000000000..e149aa40d4
--- /dev/null
+++ b/Content.Server/GameObjects/Components/Body/Surgery/Messages/SurgeryWindowCloseMessage.cs
@@ -0,0 +1,12 @@
+namespace Content.Server.GameObjects.Components.Body.Surgery.Messages
+{
+ public class SurgeryWindowCloseMessage
+ {
+ public SurgeryWindowCloseMessage(SurgeryToolComponent tool)
+ {
+ Tool = tool;
+ }
+
+ public SurgeryToolComponent Tool { get; }
+ }
+}
diff --git a/Content.Server/GameObjects/Components/Body/Surgery/Messages/SurgeryWindowOpenMessage.cs b/Content.Server/GameObjects/Components/Body/Surgery/Messages/SurgeryWindowOpenMessage.cs
new file mode 100644
index 0000000000..5b79acb0a6
--- /dev/null
+++ b/Content.Server/GameObjects/Components/Body/Surgery/Messages/SurgeryWindowOpenMessage.cs
@@ -0,0 +1,14 @@
+using Robust.Shared.GameObjects;
+
+namespace Content.Server.GameObjects.Components.Body.Surgery.Messages
+{
+ public class SurgeryWindowOpenMessage : ComponentMessage
+ {
+ public SurgeryWindowOpenMessage(SurgeryToolComponent tool)
+ {
+ Tool = tool;
+ }
+
+ public SurgeryToolComponent Tool { get; }
+ }
+}
diff --git a/Content.Server/GameObjects/Components/Body/Surgery/SurgeryToolComponent.cs b/Content.Server/GameObjects/Components/Body/Surgery/SurgeryToolComponent.cs
index 7173bde58f..ac1aaa3ad7 100644
--- a/Content.Server/GameObjects/Components/Body/Surgery/SurgeryToolComponent.cs
+++ b/Content.Server/GameObjects/Components/Body/Surgery/SurgeryToolComponent.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
+using Content.Server.GameObjects.Components.Body.Surgery.Messages;
using Content.Server.Utility;
using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Body;
@@ -37,18 +38,18 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
private float _baseOperateTime;
- private IBody? _bodyCache;
-
private ISurgeon.MechanismRequestCallback? _callbackCache;
private int _idHash;
- private IEntity? _performerCache;
-
private SurgeryType _surgeryType;
[ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(SurgeryUIKey.Key);
+ public IBody? BodyCache { get; private set; }
+
+ public IEntity? PerformerCache { get; private set; }
+
async Task IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs)
{
if (eventArgs.Target == null)
@@ -62,11 +63,6 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
}
CloseAllSurgeryUIs();
- _optionsCache.Clear();
-
- _performerCache = null;
- _bodyCache = null;
- _callbackCache = null;
// Attempt surgery on a body by sending a list of operable parts for the client to choose from
if (eventArgs.Target.TryGetComponent(out IBody? body))
@@ -88,8 +84,8 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
{
OpenSurgeryUI(actor.playerSession);
UpdateSurgeryUIBodyPartRequest(actor.playerSession, toSend);
- _performerCache = eventArgs.User; // Also, cache the data.
- _bodyCache = body;
+ PerformerCache = eventArgs.User; // Also, cache the data.
+ BodyCache = body;
}
else // If surgery cannot be performed, show message saying so.
{
@@ -99,7 +95,7 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
else if (eventArgs.Target.TryGetComponent(out var part))
{
// Attempt surgery on a DroppedBodyPart - there's only one possible target so no need for selection UI
- _performerCache = eventArgs.User;
+ PerformerCache = eventArgs.User;
// If surgery can be performed...
if (!part.SurgeryCheck(_surgeryType))
@@ -132,10 +128,10 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
toSend.Add(mechanism.Name, _idHash++);
}
- if (_optionsCache.Count > 0 && _performerCache != null)
+ if (_optionsCache.Count > 0 && PerformerCache != null)
{
- OpenSurgeryUI(_performerCache.GetComponent().playerSession);
- UpdateSurgeryUIMechanismRequest(_performerCache.GetComponent().playerSession,
+ OpenSurgeryUI(PerformerCache.GetComponent().playerSession);
+ UpdateSurgeryUIMechanismRequest(PerformerCache.GetComponent().playerSession,
toSend);
_callbackCache = callback;
}
@@ -146,6 +142,14 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
}
}
+ public override void ExposeData(ObjectSerializer serializer)
+ {
+ base.ExposeData(serializer);
+
+ serializer.DataField(ref _surgeryType, "surgeryType", SurgeryType.Incision);
+ serializer.DataField(ref _baseOperateTime, "baseOperateTime", 5);
+ }
+
public override void Initialize()
{
base.Initialize();
@@ -156,10 +160,14 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
}
}
- // TODO BODY add checks to close UI if user walks too far away from tool or target.
private void OpenSurgeryUI(IPlayerSession session)
{
UserInterface?.Open(session);
+
+ var message = new SurgeryWindowOpenMessage(this);
+
+ SendMessage(message);
+ Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, message);
}
private void UpdateSurgeryUIBodyPartRequest(IPlayerSession session, Dictionary options)
@@ -172,14 +180,25 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
UserInterface?.SendMessage(new RequestMechanismSurgeryUIMessage(options), session);
}
+ private void ClearUIData()
+ {
+ _optionsCache.Clear();
+
+ PerformerCache = null;
+ BodyCache = null;
+ _callbackCache = null;
+ }
+
private void CloseSurgeryUI(IPlayerSession session)
{
UserInterface?.Close(session);
+ ClearUIData();
}
- private void CloseAllSurgeryUIs()
+ public void CloseAllSurgeryUIs()
{
UserInterface?.CloseAll();
+ ClearUIData();
}
private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage message)
@@ -201,8 +220,8 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
///
private void HandleReceiveBodyPart(int key)
{
- if (_performerCache == null ||
- !_performerCache.TryGetComponent(out IActorComponent? actor))
+ if (PerformerCache == null ||
+ !PerformerCache.TryGetComponent(out IActorComponent? actor))
{
return;
}
@@ -210,7 +229,7 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
CloseSurgeryUI(actor.playerSession);
// TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc
if (!_optionsCache.TryGetValue(key, out var targetObject) ||
- _bodyCache == null)
+ BodyCache == null)
{
NotUsefulAnymorePopup();
return;
@@ -219,7 +238,7 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
var target = (IBodyPart) targetObject!;
// TODO BODY Reconsider
- if (!target.AttemptSurgery(_surgeryType, _bodyCache, this, _performerCache))
+ if (!target.AttemptSurgery(_surgeryType, BodyCache, this, PerformerCache))
{
NotUsefulAnymorePopup();
}
@@ -233,8 +252,8 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
{
// TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc
if (!_optionsCache.TryGetValue(key, out var targetObject) ||
- _performerCache == null ||
- !_performerCache.TryGetComponent(out IActorComponent? actor))
+ PerformerCache == null ||
+ !PerformerCache.TryGetComponent(out IActorComponent? actor))
{
NotUsefulAnymorePopup();
return;
@@ -243,27 +262,19 @@ namespace Content.Server.GameObjects.Components.Body.Surgery
var target = targetObject as MechanismComponent;
CloseSurgeryUI(actor.playerSession);
- _callbackCache?.Invoke(target, _bodyCache, this, _performerCache);
+ _callbackCache?.Invoke(target, BodyCache, this, PerformerCache);
}
private void NotUsefulPopup()
{
- _bodyCache?.Owner.PopupMessage(_performerCache,
+ BodyCache?.Owner.PopupMessage(PerformerCache,
Loc.GetString("You see no useful way to use {0:theName}.", Owner));
}
private void NotUsefulAnymorePopup()
{
- _bodyCache?.Owner.PopupMessage(_performerCache,
+ BodyCache?.Owner.PopupMessage(PerformerCache,
Loc.GetString("You see no useful way to use {0:theName} anymore.", Owner));
}
-
- public override void ExposeData(ObjectSerializer serializer)
- {
- base.ExposeData(serializer);
-
- serializer.DataField(ref _surgeryType, "surgeryType", SurgeryType.Incision);
- serializer.DataField(ref _baseOperateTime, "baseOperateTime", 5);
- }
}
}
diff --git a/Content.Server/GameObjects/Components/Botany/LogComponent.cs b/Content.Server/GameObjects/Components/Botany/LogComponent.cs
index 3bebc0a902..753d887fa5 100644
--- a/Content.Server/GameObjects/Components/Botany/LogComponent.cs
+++ b/Content.Server/GameObjects/Components/Botany/LogComponent.cs
@@ -1,5 +1,6 @@
using System.Threading.Tasks;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs b/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs
index e1a520a351..6d481b80ed 100644
--- a/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs
+++ b/Content.Server/GameObjects/Components/Botany/PlantHolderComponent.cs
@@ -13,6 +13,7 @@ using Content.Shared.Audio;
using Content.Shared.Chemistry;
using Content.Shared.GameObjects.Components.Botany;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs b/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs
index 5fef60e9de..f6f4c640f5 100644
--- a/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs
+++ b/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs
@@ -9,9 +9,9 @@ using Content.Server.GameObjects.Components.Strap;
using Content.Server.GameObjects.EntitySystems;
using Content.Shared.Alert;
using Content.Shared.GameObjects.Components.Buckle;
-using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.Components.Strap;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
@@ -49,7 +49,6 @@ namespace Content.Server.GameObjects.Components.Buckle
///
[ViewVariables]
private float _range;
-
///
/// The amount of time that must pass for this entity to
/// be able to unbuckle after recently buckling.
@@ -70,6 +69,7 @@ namespace Content.Server.GameObjects.Components.Buckle
private StrapComponent? _buckledTo;
+
///
/// The strap that this component is buckled to.
///
@@ -156,7 +156,7 @@ namespace Content.Server.GameObjects.Components.Buckle
}
}
- private bool CanBuckle(IEntity? user, IEntity to, [MaybeNullWhen(false)] out StrapComponent strap)
+ private bool CanBuckle(IEntity? user, IEntity to, [NotNullWhen(true)] out StrapComponent? strap)
{
strap = null;
@@ -266,6 +266,8 @@ namespace Content.Server.GameObjects.Components.Buckle
AppearanceComponent?.SetData(BuckleVisuals.Buckled, true);
BuckledTo = strap;
+ LastEntityBuckledTo = BuckledTo.Owner.Uid;
+ DontCollide = true;
ReAttach(strap);
UpdateBuckleStatus();
@@ -419,7 +421,8 @@ namespace Content.Server.GameObjects.Components.Buckle
drawDepth = BuckledTo.SpriteComponent.DrawDepth - 1;
}
- return new BuckleComponentState(Buckled, drawDepth);
+
+ return new BuckleComponentState(Buckled, drawDepth, LastEntityBuckledTo, DontCollide);
}
bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs)
@@ -427,6 +430,24 @@ namespace Content.Server.GameObjects.Components.Buckle
return TryUnbuckle(eventArgs.User);
}
+
+ public void Update()
+ {
+ if (!DontCollide || Body == null)
+ return;
+
+ Body.WakeBody();
+
+ if (!IsOnStrapEntityThisFrame && DontCollide)
+ {
+ DontCollide = false;
+ TryUnbuckle(Owner);
+ Dirty();
+ }
+
+ IsOnStrapEntityThisFrame = false;
+ }
+
///
/// Allows the unbuckling of the owning entity through a verb if
/// anyone right clicks them.
diff --git a/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs b/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs
index 35c9577c7a..b48ebd83bb 100644
--- a/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs
+++ b/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs
@@ -1,4 +1,4 @@
-#nullable enable
+#nullable enable
using Content.Server.Cargo;
using Content.Server.GameObjects.Components.Power.ApcNetComponents;
using Content.Server.GameObjects.EntitySystems;
@@ -10,10 +10,15 @@ using Robust.Server.GameObjects.Components.UserInterface;
using Robust.Server.Interfaces.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems;
+using Robust.Shared.Interfaces.GameObjects;
+using Robust.Shared.Interfaces.Map;
using Robust.Shared.IoC;
using Robust.Shared.Log;
+using Robust.Shared.Maths;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
+using System.Collections.Generic;
+using System.Linq;
namespace Content.Server.GameObjects.Components.Cargo
{
@@ -22,6 +27,7 @@ namespace Content.Server.GameObjects.Components.Cargo
public class CargoConsoleComponent : SharedCargoConsoleComponent, IActivate
{
[Dependency] private readonly ICargoOrderDataManager _cargoOrderDataManager = default!;
+ [Dependency] private readonly IMapManager _mapManager = default!;
[ViewVariables]
public int Points = 1000;
@@ -113,59 +119,88 @@ namespace Content.Server.GameObjects.Components.Cargo
switch (message)
{
case CargoConsoleAddOrderMessage msg:
- {
- if (msg.Amount <= 0 || _bankAccount == null)
{
- break;
- }
-
- _cargoOrderDataManager.AddOrder(orders.Database.Id, msg.Requester, msg.Reason, msg.ProductId, msg.Amount, _bankAccount.Id);
- break;
- }
- case CargoConsoleRemoveOrderMessage msg:
- {
- _cargoOrderDataManager.RemoveOrder(orders.Database.Id, msg.OrderNumber);
- break;
- }
- case CargoConsoleApproveOrderMessage msg:
- {
- if (_requestOnly ||
- !orders.Database.TryGetOrder(msg.OrderNumber, out var order) ||
- _bankAccount == null)
- {
- break;
- }
-
- PrototypeManager.TryIndex(order.ProductId, out CargoProductPrototype product);
- if (product == null!)
- break;
- var capacity = _cargoOrderDataManager.GetCapacity(orders.Database.Id);
- if (capacity.CurrentCapacity == capacity.MaxCapacity)
- break;
- if (!_cargoConsoleSystem.ChangeBalance(_bankAccount.Id, (-product.PointCost) * order.Amount))
- break;
- _cargoOrderDataManager.ApproveOrder(orders.Database.Id, msg.OrderNumber);
- UpdateUIState();
- break;
- }
- case CargoConsoleShuttleMessage _:
- {
- var approvedOrders = _cargoOrderDataManager.RemoveAndGetApprovedFrom(orders.Database);
- orders.Database.ClearOrderCapacity();
- // TODO replace with shuttle code
-
- // TEMPORARY loop for spawning stuff on top of console
- foreach (var order in approvedOrders)
- {
- if (!PrototypeManager.TryIndex(order.ProductId, out CargoProductPrototype product))
- continue;
- for (var i = 0; i < order.Amount; i++)
+ if (msg.Amount <= 0 || _bankAccount == null)
{
- Owner.EntityManager.SpawnEntity(product.Product, Owner.Transform.Coordinates);
+ break;
}
+
+ _cargoOrderDataManager.AddOrder(orders.Database.Id, msg.Requester, msg.Reason, msg.ProductId, msg.Amount, _bankAccount.Id);
+ break;
+ }
+ case CargoConsoleRemoveOrderMessage msg:
+ {
+ _cargoOrderDataManager.RemoveOrder(orders.Database.Id, msg.OrderNumber);
+ break;
+ }
+ case CargoConsoleApproveOrderMessage msg:
+ {
+ if (_requestOnly ||
+ !orders.Database.TryGetOrder(msg.OrderNumber, out var order) ||
+ _bankAccount == null)
+ {
+ break;
+ }
+
+ PrototypeManager.TryIndex(order.ProductId, out CargoProductPrototype product);
+ if (product == null!)
+ break;
+ var capacity = _cargoOrderDataManager.GetCapacity(orders.Database.Id);
+ if (capacity.CurrentCapacity == capacity.MaxCapacity)
+ break;
+ if (!_cargoConsoleSystem.ChangeBalance(_bankAccount.Id, (-product.PointCost) * order.Amount))
+ break;
+ _cargoOrderDataManager.ApproveOrder(orders.Database.Id, msg.OrderNumber);
+ UpdateUIState();
+ break;
+ }
+ case CargoConsoleShuttleMessage _:
+ {
+ //var approvedOrders = _cargoOrderDataManager.RemoveAndGetApprovedFrom(orders.Database);
+ //orders.Database.ClearOrderCapacity();
+
+ // TODO replace with shuttle code
+ // TEMPORARY loop for spawning stuff on telepad (looks for a telepad adjacent to the console)
+ IEntity? cargoTelepad = null;
+ var indices = Owner.Transform.Coordinates.ToVector2i(Owner.EntityManager, _mapManager);
+ var offsets = new Vector2i[] { new Vector2i(0, 1), new Vector2i(1, 1), new Vector2i(1, 0), new Vector2i(1, -1),
+ new Vector2i(0, -1), new Vector2i(-1, -1), new Vector2i(-1, 0), new Vector2i(-1, 1), };
+ var adjacentEntities = new List>(); //Probably better than IEnumerable.concat
+ foreach (var offset in offsets)
+ {
+ adjacentEntities.Add((indices+offset).GetEntitiesInTileFast(Owner.Transform.GridID));
+ }
+
+ foreach (var enumerator in adjacentEntities)
+ {
+ foreach (IEntity entity in enumerator)
+ {
+ if (entity.HasComponent() && entity.TryGetComponent(out var powerReceiver) && powerReceiver.Powered)
+ {
+ cargoTelepad = entity;
+ break;
+ }
+ }
+ }
+ if (cargoTelepad != null)
+ {
+ if (cargoTelepad.TryGetComponent(out var telepadComponent))
+ {
+ var approvedOrders = _cargoOrderDataManager.RemoveAndGetApprovedFrom(orders.Database);
+ orders.Database.ClearOrderCapacity();
+ foreach (var order in approvedOrders)
+ {
+ if (!PrototypeManager.TryIndex(order.ProductId, out CargoProductPrototype product))
+ continue;
+ for (var i = 0; i < order.Amount; i++)
+ {
+ telepadComponent.QueueTeleport(product);
+ }
+ }
+ }
+ }
+ break;
}
- break;
- }
}
}
diff --git a/Content.Server/GameObjects/Components/Cargo/CargoTelepadComponent.cs b/Content.Server/GameObjects/Components/Cargo/CargoTelepadComponent.cs
new file mode 100644
index 0000000000..a85c8386a3
--- /dev/null
+++ b/Content.Server/GameObjects/Components/Cargo/CargoTelepadComponent.cs
@@ -0,0 +1,101 @@
+#nullable enable
+using Content.Server.GameObjects.Components.Power.ApcNetComponents;
+using Content.Shared.Interfaces.GameObjects.Components;
+using Content.Shared.Prototypes.Cargo;
+using Robust.Server.GameObjects;
+using Robust.Server.GameObjects.EntitySystems;
+using Robust.Shared.Audio;
+using Robust.Shared.GameObjects;
+using Robust.Shared.GameObjects.Components.Timers;
+using Robust.Shared.GameObjects.Systems;
+using System.Collections.Generic;
+
+namespace Content.Server.GameObjects.Components.Cargo
+{
+
+ //This entire class is a PLACEHOLDER for the cargo shuttle.
+
+ [RegisterComponent]
+ public class CargoTelepadComponent : Component
+ {
+ public override string Name => "CargoTelepad";
+
+ private const float TeleportDuration = 0.5f;
+ private const float TeleportDelay = 15f;
+ private List _teleportQueue = new List();
+ private CargoTelepadState _currentState = CargoTelepadState.Unpowered;
+
+
+ public override void OnAdd()
+ {
+ base.OnAdd();
+
+ var receiver = Owner.EnsureComponent();
+ receiver.OnPowerStateChanged += PowerUpdate;
+ }
+
+ public override void OnRemove()
+ {
+ if (Owner.TryGetComponent(out PowerReceiverComponent? receiver))
+ {
+ receiver.OnPowerStateChanged -= PowerUpdate;
+ }
+ base.OnRemove();
+ }
+
+ public void QueueTeleport(CargoProductPrototype product)
+ {
+ _teleportQueue.Add(product);
+ TeleportLoop();
+ }
+
+ private void PowerUpdate(object? sender, PowerStateEventArgs args)
+ {
+ if (args.Powered && _currentState == CargoTelepadState.Unpowered) {
+ _currentState = CargoTelepadState.Idle;
+ if(Owner.TryGetComponent(out var spriteComponent))
+ spriteComponent.LayerSetState(0, "pad-idle");
+ TeleportLoop();
+ }
+ else if (!args.Powered)
+ {
+ _currentState = CargoTelepadState.Unpowered;
+ if (Owner.TryGetComponent(out var spriteComponent))
+ spriteComponent.LayerSetState(0, "pad-offline");
+ }
+ }
+ private void TeleportLoop()
+ {
+ if (_currentState == CargoTelepadState.Idle && _teleportQueue.Count > 0)
+ {
+ _currentState = CargoTelepadState.Charging;
+ if (Owner.TryGetComponent(out var spriteComponent))
+ spriteComponent.LayerSetState(0, "pad-idle");
+ Owner.SpawnTimer((int) (TeleportDelay * 1000), () =>
+ {
+ if (!Deleted && !Owner.Deleted && _currentState == CargoTelepadState.Charging && _teleportQueue.Count > 0)
+ {
+ _currentState = CargoTelepadState.Teleporting;
+ if (Owner.TryGetComponent(out var spriteComponent))
+ spriteComponent.LayerSetState(0, "pad-beam");
+ Owner.SpawnTimer((int) (TeleportDuration * 1000), () =>
+ {
+ if (!Deleted && !Owner.Deleted && _currentState == CargoTelepadState.Teleporting && _teleportQueue.Count > 0)
+ {
+ EntitySystem.Get().PlayFromEntity("/Audio/machines/phasein.ogg", Owner, AudioParams.Default.WithVolume(-8f));
+ Owner.EntityManager.SpawnEntity(_teleportQueue[0].Product, Owner.Transform.Coordinates);
+ _teleportQueue.RemoveAt(0);
+ if (Owner.TryGetComponent(out var spriteComponent))
+ spriteComponent.LayerSetState(0, "pad-idle");
+ _currentState = CargoTelepadState.Idle;
+ TeleportLoop();
+ }
+ });
+ }
+ });
+ }
+ }
+
+ private enum CargoTelepadState { Unpowered, Idle, Charging, Teleporting };
+ }
+}
diff --git a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs
index 8a80d98b7a..293b4fa0da 100644
--- a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs
+++ b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs
@@ -12,6 +12,7 @@ using Content.Server.Utility;
using Content.Shared.Chemistry;
using Content.Shared.GameObjects.Components.Chemistry.ChemMaster;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs
index 8546b0bb41..e27612606c 100644
--- a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs
+++ b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs
@@ -11,6 +11,7 @@ using Content.Server.Utility;
using Content.Shared.Chemistry;
using Content.Shared.GameObjects.Components.Chemistry.ReagentDispenser;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.GameObjects.Verbs;
diff --git a/Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs b/Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs
index afc7899304..d2d72ac1fd 100644
--- a/Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs
+++ b/Content.Server/GameObjects/Components/Chemistry/SolutionContainerComponent.cs
@@ -6,6 +6,7 @@ using Content.Server.GameObjects.EntitySystems;
using Content.Shared.Chemistry;
using Content.Shared.GameObjects.Components.Chemistry;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Utility;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Command/CommunicationsConsoleComponent.cs b/Content.Server/GameObjects/Components/Command/CommunicationsConsoleComponent.cs
index c32d7d9f91..2e3f6f6f48 100644
--- a/Content.Server/GameObjects/Components/Command/CommunicationsConsoleComponent.cs
+++ b/Content.Server/GameObjects/Components/Command/CommunicationsConsoleComponent.cs
@@ -1,4 +1,4 @@
-#nullable enable
+#nullable enable
using Content.Server.GameObjects.Components.Power.ApcNetComponents;
using Content.Server.GameObjects.EntitySystems;
using Content.Server.Utility;
@@ -77,11 +77,12 @@ namespace Content.Server.GameObjects.Components.Command
{
if (!eventArgs.User.TryGetComponent(out IActorComponent? actor))
return;
-
+/*
if (!Powered)
{
return;
}
+*/
OpenUserInterface(actor.playerSession);
}
}
diff --git a/Content.Server/GameObjects/Components/Construction/ConstructionComponent.Verbs.cs b/Content.Server/GameObjects/Components/Construction/ConstructionComponent.Verbs.cs
index 61e517f101..04a1d0c739 100644
--- a/Content.Server/GameObjects/Components/Construction/ConstructionComponent.Verbs.cs
+++ b/Content.Server/GameObjects/Components/Construction/ConstructionComponent.Verbs.cs
@@ -1,4 +1,5 @@
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs
index 2d50e5c052..d6441ae935 100644
--- a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs
+++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs
@@ -1,4 +1,4 @@
-#nullable enable
+#nullable enable
using System.Threading.Tasks;
using Content.Server.GameObjects.Components.Interactable;
using Content.Server.GameObjects.Components.Items.Storage;
@@ -28,6 +28,8 @@ namespace Content.Server.GameObjects.Components.Conveyor
{
public override string Name => "Conveyor";
+ [ViewVariables] private bool Powered => !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered;
+
///
/// The angle to move entities by in relation to the owner's rotation.
///
@@ -41,7 +43,6 @@ namespace Content.Server.GameObjects.Components.Conveyor
private float _speed;
private ConveyorState _state;
-
///
/// The current state of this conveyor
///
@@ -52,13 +53,45 @@ namespace Content.Server.GameObjects.Components.Conveyor
set
{
_state = value;
+ UpdateAppearance();
+ }
+ }
- if (!Owner.TryGetComponent(out AppearanceComponent? appearance))
+ public override void OnAdd()
+ {
+ base.OnAdd();
+ if (Owner.TryGetComponent(out PowerReceiverComponent? receiver))
+ {
+ receiver.OnPowerStateChanged += OnPowerChanged;
+ }
+ }
+
+ public override void OnRemove()
+ {
+ base.OnRemove();
+ if (Owner.TryGetComponent(out PowerReceiverComponent? receiver))
+ {
+ receiver.OnPowerStateChanged -= OnPowerChanged;
+ }
+ }
+
+ private void OnPowerChanged(object? sender, PowerStateEventArgs e)
+ {
+ UpdateAppearance();
+ }
+
+ private void UpdateAppearance()
+ {
+ if (Owner.TryGetComponent(out var appearance))
+ {
+ if (Powered)
{
- return;
+ appearance.SetData(ConveyorVisuals.State, _state);
+ }
+ else
+ {
+ appearance.SetData(ConveyorVisuals.State, ConveyorState.Off);
}
-
- appearance.SetData(ConveyorVisuals.State, value);
}
}
diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalMailingUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalMailingUnitComponent.cs
index f358fc1d5d..83069957b0 100644
--- a/Content.Server/GameObjects/Components/Disposal/DisposalMailingUnitComponent.cs
+++ b/Content.Server/GameObjects/Components/Disposal/DisposalMailingUnitComponent.cs
@@ -17,6 +17,7 @@ using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.Components.Body;
using Content.Shared.GameObjects.Components.Disposal;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs
index 6e62479d38..5a72ff74e4 100644
--- a/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs
+++ b/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs
@@ -6,6 +6,7 @@ using Content.Server.GameObjects.Components.Mobs;
using Content.Server.Interfaces.GameObjects.Components.Items;
using Content.Server.Utility;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs
index e3bc82e674..41d90e1664 100644
--- a/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs
+++ b/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs
@@ -21,6 +21,7 @@ using Robust.Shared.Localization;
using Robust.Shared.Maths;
using Robust.Shared.ViewVariables;
using System;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalTaggerComponent;
namespace Content.Server.GameObjects.Components.Disposal
diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs
index 31a1ac6a86..f366eebe37 100644
--- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs
+++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs
@@ -20,6 +20,7 @@ using Content.Shared.GameObjects.Components.Disposal;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.Components.Mobs.State;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs b/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs
index c6528086de..62b2a5ec6c 100644
--- a/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs
+++ b/Content.Server/GameObjects/Components/Fluids/SpillableComponent.cs
@@ -1,6 +1,7 @@
using Content.Server.GameObjects.Components.Chemistry;
using Content.Shared.Chemistry;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs
index 5d0c4ef416..71f09c780e 100644
--- a/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs
+++ b/Content.Server/GameObjects/Components/Fluids/SprayComponent.cs
@@ -7,6 +7,7 @@ using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.Components.Fluids;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs
index 35b22f0c59..9d1aa7cef9 100644
--- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs
+++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs
@@ -9,6 +9,7 @@ using Content.Server.Interfaces.GameObjects.Components.Items;
using Content.Shared.GameObjects.Components.Body.Part;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Physics.Pull;
using Robust.Server.GameObjects;
using Robust.Server.GameObjects.Components.Container;
@@ -105,10 +106,9 @@ namespace Content.Server.GameObjects.Components.GUI
return GetHand(handName)?.Entity?.GetComponent();
}
- public bool TryGetItem(string handName, [MaybeNullWhen(false)] out ItemComponent item)
+ public bool TryGetItem(string handName, [NotNullWhen(true)] out ItemComponent? item)
{
- item = GetItem(handName);
- return item != null;
+ return (item = GetItem(handName)) != null;
}
public ItemComponent? GetActiveHand => ActiveHand == null
@@ -240,7 +240,7 @@ namespace Content.Server.GameObjects.Components.GUI
return true;
}
- public bool TryHand(IEntity entity, [MaybeNullWhen(false)] out string handName)
+ public bool TryHand(IEntity entity, [NotNullWhen(true)] out string? handName)
{
handName = null;
diff --git a/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs b/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs
index 33152537ec..2ef74a187e 100644
--- a/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs
+++ b/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs
@@ -7,6 +7,8 @@ using Content.Server.GameObjects.EntitySystems.Click;
using Content.Server.Interfaces.GameObjects;
using Content.Shared.GameObjects.Components.Inventory;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
using Content.Shared.Interfaces;
using Robust.Server.GameObjects.Components.Container;
using Robust.Shared.Containers;
diff --git a/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs b/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs
index ff755d3cdd..6abb62df94 100644
--- a/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs
+++ b/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs
@@ -7,6 +7,7 @@ using Content.Server.GameObjects.EntitySystems.DoAfter;
using Content.Server.Utility;
using Content.Shared.GameObjects.Components.GUI;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs b/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs
index 40269775d1..233874b533 100644
--- a/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs
+++ b/Content.Server/GameObjects/Components/Instruments/InstrumentComponent.cs
@@ -7,6 +7,7 @@ using Content.Server.Utility;
using Content.Shared;
using Content.Shared.GameObjects.Components.Instruments;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
@@ -78,8 +79,8 @@ namespace Content.Server.GameObjects.Components.Instruments
private byte _instrumentBank;
private bool _allowPercussion;
private bool _allowProgramChange;
+ private bool _respectMidiLimits;
- [ViewVariables(VVAccess.ReadWrite)]
public override byte InstrumentProgram { get => _instrumentProgram;
set
{
@@ -88,7 +89,6 @@ namespace Content.Server.GameObjects.Components.Instruments
}
}
- [ViewVariables(VVAccess.ReadWrite)]
public override byte InstrumentBank { get => _instrumentBank;
set
{
@@ -97,7 +97,6 @@ namespace Content.Server.GameObjects.Components.Instruments
}
}
- [ViewVariables(VVAccess.ReadWrite)]
public override bool AllowPercussion { get => _allowPercussion;
set
{
@@ -106,7 +105,6 @@ namespace Content.Server.GameObjects.Components.Instruments
}
}
- [ViewVariables(VVAccess.ReadWrite)]
public override bool AllowProgramChange { get => _allowProgramChange;
set
{
@@ -115,6 +113,14 @@ namespace Content.Server.GameObjects.Components.Instruments
}
}
+ public override bool RespectMidiLimits { get => _respectMidiLimits;
+ set
+ {
+ _respectMidiLimits = value;
+ Dirty();
+ }
+ }
+
///
/// Whether the instrument is an item which can be held or not.
///
@@ -181,11 +187,12 @@ namespace Content.Server.GameObjects.Components.Instruments
serializer.DataField(ref _instrumentBank, "bank", (byte) 0);
serializer.DataField(ref _allowPercussion, "allowPercussion", false);
serializer.DataField(ref _allowProgramChange, "allowProgramChange", false);
+ serializer.DataField(ref _respectMidiLimits, "respectMidiLimits", true);
}
public override ComponentState GetComponentState()
{
- return new InstrumentState(Playing, InstrumentProgram, InstrumentBank, AllowPercussion, AllowProgramChange, _lastSequencerTick);
+ return new InstrumentState(Playing, InstrumentProgram, InstrumentBank, AllowPercussion, AllowProgramChange, RespectMidiLimits, _lastSequencerTick);
}
public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession? session = null)
@@ -217,14 +224,17 @@ namespace Content.Server.GameObjects.Components.Instruments
_laggedBatches++;
- if (_laggedBatches == (int) (maxMidiLaggedBatches * (1 / 3d) + 1))
+ if (_respectMidiLimits)
{
- Owner.PopupMessage(InstrumentPlayer.AttachedEntity,
- Loc.GetString("Your fingers are beginning to a cramp a little!"));
- } else if (_laggedBatches == (int) (maxMidiLaggedBatches * (2 / 3d) + 1))
- {
- Owner.PopupMessage(InstrumentPlayer.AttachedEntity,
- Loc.GetString("Your fingers are seriously cramping up!"));
+ if (_laggedBatches == (int) (maxMidiLaggedBatches * (1 / 3d) + 1))
+ {
+ Owner.PopupMessage(InstrumentPlayer.AttachedEntity,
+ Loc.GetString("Your fingers are beginning to a cramp a little!"));
+ } else if (_laggedBatches == (int) (maxMidiLaggedBatches * (2 / 3d) + 1))
+ {
+ Owner.PopupMessage(InstrumentPlayer.AttachedEntity,
+ Loc.GetString("Your fingers are seriously cramping up!"));
+ }
}
if (_laggedBatches > maxMidiLaggedBatches)
@@ -250,7 +260,7 @@ namespace Content.Server.GameObjects.Components.Instruments
send = false;
}
- if (send)
+ if (send || !_respectMidiLimits)
{
SendNetworkMessage(midiEventMsg);
}
@@ -367,7 +377,7 @@ namespace Content.Server.GameObjects.Components.Instruments
if ((_batchesDropped >= maxMidiBatchDropped
|| _laggedBatches >= maxMidiLaggedBatches)
- && InstrumentPlayer != null)
+ && InstrumentPlayer != null && _respectMidiLimits)
{
var mob = InstrumentPlayer.AttachedEntity;
diff --git a/Content.Server/GameObjects/Components/Interactable/ExpendableLightComponent.cs b/Content.Server/GameObjects/Components/Interactable/ExpendableLightComponent.cs
index 2958f649ff..7529820fb4 100644
--- a/Content.Server/GameObjects/Components/Interactable/ExpendableLightComponent.cs
+++ b/Content.Server/GameObjects/Components/Interactable/ExpendableLightComponent.cs
@@ -4,6 +4,7 @@ using Content.Server.GameObjects.Components.Items.Storage;
using Content.Server.GameObjects.Components.Sound;
using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs
index 958ec9768f..430d0e785d 100644
--- a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs
+++ b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs
@@ -11,6 +11,7 @@ using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels;
using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs
index 7bc3c0739a..19e16ae678 100644
--- a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs
+++ b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs
@@ -5,6 +5,7 @@ using Content.Server.GameObjects.EntitySystems.DoAfter;
using Content.Shared.Audio;
using Content.Shared.GameObjects.Components.Interactable;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Server.GameObjects.EntitySystems;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Systems;
diff --git a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs
index 79f360cb07..632bfd4402 100644
--- a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs
+++ b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs
@@ -9,6 +9,7 @@ using Content.Shared.GameObjects.Components.Body;
using Content.Shared.GameObjects.Components.Interactable;
using Content.Shared.GameObjects.Components.Storage;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs
index b55870af4b..67c32b1c84 100644
--- a/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs
+++ b/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs
@@ -5,6 +5,7 @@ using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.Components.Storage;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs
index 1f7228d25a..5e4f9076fa 100644
--- a/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs
+++ b/Content.Server/GameObjects/Components/Items/Storage/SecureEntityStorageComponent.cs
@@ -1,6 +1,7 @@
using Content.Server.GameObjects.Components.Access;
using Content.Shared.GameObjects.Components.Storage;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/MachineLinking/SignalSwitchComponent.cs b/Content.Server/GameObjects/Components/MachineLinking/SignalSwitchComponent.cs
index a73bc74e89..9643aa242d 100644
--- a/Content.Server/GameObjects/Components/MachineLinking/SignalSwitchComponent.cs
+++ b/Content.Server/GameObjects/Components/MachineLinking/SignalSwitchComponent.cs
@@ -1,4 +1,5 @@
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Medical/HealingComponent.cs b/Content.Server/GameObjects/Components/Medical/HealingComponent.cs
index f717e831de..cb4684238a 100644
--- a/Content.Server/GameObjects/Components/Medical/HealingComponent.cs
+++ b/Content.Server/GameObjects/Components/Medical/HealingComponent.cs
@@ -4,6 +4,7 @@ using Content.Server.GameObjects.Components.Stack;
using Content.Shared.Damage;
using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs
index 5b5fff76f2..8013453635 100644
--- a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs
+++ b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs
@@ -13,6 +13,7 @@ using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.Components.Medical;
using Content.Shared.GameObjects.Components.Mobs.State;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs b/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs
index f745d6b720..bb459bf544 100644
--- a/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs
+++ b/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs
@@ -14,6 +14,7 @@ using Content.Shared.GameObjects.Components.Body.Mechanism;
using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.Components.Mobs.State;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.Chemistry;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Mobs/ServerActionsComponent.cs b/Content.Server/GameObjects/Components/Mobs/ServerActionsComponent.cs
index e5e80544b5..ffaebf02f8 100644
--- a/Content.Server/GameObjects/Components/Mobs/ServerActionsComponent.cs
+++ b/Content.Server/GameObjects/Components/Mobs/ServerActionsComponent.cs
@@ -3,6 +3,7 @@ using System;
using Content.Shared.Actions;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Server.Interfaces.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs
index 3c8d91150b..e4731b2f7f 100644
--- a/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs
+++ b/Content.Server/GameObjects/Components/Morgue/BodyBagEntityStorageComponent.cs
@@ -20,6 +20,7 @@ using Robust.Shared.Localization;
using Robust.Shared.Utility;
using Robust.Shared.ViewVariables;
using System.Threading.Tasks;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
namespace Content.Server.GameObjects.Components.Morgue
{
diff --git a/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs b/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs
index 7b9b6a311b..0ba0ddd75d 100644
--- a/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs
+++ b/Content.Server/GameObjects/Components/Morgue/CrematoriumEntityStorageComponent.cs
@@ -2,6 +2,7 @@
using Content.Server.GameObjects.Components.Items.Storage;
using Content.Shared.GameObjects.Components.Morgue;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs b/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs
index efdb161935..97f9d4e21d 100644
--- a/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs
+++ b/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs
@@ -6,6 +6,7 @@ using Content.Shared.GameObjects.Components.Body;
using Content.Shared.GameObjects.Components.Body.Part;
using Content.Shared.GameObjects.Components.Movement;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Movement/NoSlipComponent.cs b/Content.Server/GameObjects/Components/Movement/NoSlipComponent.cs
index c541377f4b..0e40b39bed 100644
--- a/Content.Server/GameObjects/Components/Movement/NoSlipComponent.cs
+++ b/Content.Server/GameObjects/Components/Movement/NoSlipComponent.cs
@@ -1,4 +1,5 @@
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
using Robust.Shared.GameObjects;
namespace Content.Server.GameObjects.Components.Movement
diff --git a/Content.Server/GameObjects/Components/PA/ParticleAcceleratorControlBoxComponent.cs b/Content.Server/GameObjects/Components/PA/ParticleAcceleratorControlBoxComponent.cs
index 4525a42a25..542878fc98 100644
--- a/Content.Server/GameObjects/Components/PA/ParticleAcceleratorControlBoxComponent.cs
+++ b/Content.Server/GameObjects/Components/PA/ParticleAcceleratorControlBoxComponent.cs
@@ -10,6 +10,7 @@ using Content.Server.GameObjects.Components.VendingMachines;
using Content.Server.Utility;
using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
using Robust.Server.GameObjects.Components.UserInterface;
diff --git a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs
index 0a83101a6a..c5ed36ede8 100644
--- a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs
+++ b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs
@@ -14,6 +14,7 @@ using Content.Server.Interfaces.PDA;
using Content.Server.Utility;
using Content.Shared.GameObjects.Components.PDA;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs b/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs
index 8e5f590e24..eb6bf1e9fc 100644
--- a/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs
+++ b/Content.Server/GameObjects/Components/Power/AME/AMEControllerComponent.cs
@@ -11,6 +11,7 @@ using Content.Server.Interfaces.GameObjects.Components.Items;
using Content.Server.Utility;
using Content.Shared.GameObjects.Components.Power.AME;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs
index 986b404aea..9cc926434d 100644
--- a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs
+++ b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs
@@ -6,6 +6,7 @@ using Content.Server.GameObjects.Components.Items.Storage;
using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels;
using Content.Shared.GameObjects.Components.Power;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Power/PowerCellSlotComponent.cs b/Content.Server/GameObjects/Components/Power/PowerCellSlotComponent.cs
index c898b29497..79366c366c 100644
--- a/Content.Server/GameObjects/Components/Power/PowerCellSlotComponent.cs
+++ b/Content.Server/GameObjects/Components/Power/PowerCellSlotComponent.cs
@@ -4,6 +4,7 @@ using Content.Server.GameObjects.Components.GUI;
using Content.Server.GameObjects.Components.Items.Storage;
using Content.Shared.Audio;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Robust.Server.GameObjects.Components.Container;
using Robust.Server.GameObjects.EntitySystems;
diff --git a/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs b/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs
index 909b9239b8..64485491b5 100644
--- a/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs
+++ b/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+#nullable enable
+using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Content.Server.GameObjects.Components.Conveyor;
using Content.Server.GameObjects.Components.Items.Storage;
@@ -40,12 +41,12 @@ namespace Content.Server.GameObjects.Components.Recycling
private int _efficiency; // TODO
private bool Powered =>
- !Owner.TryGetComponent(out PowerReceiverComponent receiver) ||
+ !Owner.TryGetComponent(out PowerReceiverComponent? receiver) ||
receiver.Powered;
private void Bloodstain()
{
- if (Owner.TryGetComponent(out AppearanceComponent appearance))
+ if (Owner.TryGetComponent(out AppearanceComponent? appearance))
{
appearance.SetData(RecyclerVisuals.Bloody, true);
}
@@ -53,7 +54,7 @@ namespace Content.Server.GameObjects.Components.Recycling
private void Clean()
{
- if (Owner.TryGetComponent(out AppearanceComponent appearance))
+ if (Owner.TryGetComponent(out AppearanceComponent? appearance))
{
appearance.SetData(RecyclerVisuals.Bloody, false);
}
@@ -64,7 +65,7 @@ namespace Content.Server.GameObjects.Components.Recycling
return entity.HasComponent() && !_safe && Powered;
}
- private bool CanRecycle(IEntity entity, [MaybeNullWhen(false)] out ConstructionPrototype prototype)
+ private bool CanRecycle(IEntity entity, [NotNullWhen(true)] out ConstructionPrototype? prototype)
{
prototype = null;
@@ -100,7 +101,7 @@ namespace Content.Server.GameObjects.Components.Recycling
private bool CanRun()
{
- if (Owner.TryGetComponent(out PowerReceiverComponent receiver) &&
+ if (Owner.TryGetComponent(out PowerReceiverComponent? receiver) &&
!receiver.Powered)
{
return false;
@@ -121,7 +122,7 @@ namespace Content.Server.GameObjects.Components.Recycling
return false;
}
- if (!entity.TryGetComponent(out IPhysicsComponent physics) ||
+ if (!entity.TryGetComponent(out IPhysicsComponent? physics) ||
physics.Anchored)
{
return false;
@@ -165,7 +166,7 @@ namespace Content.Server.GameObjects.Components.Recycling
continue;
}
- if (entity.TryGetComponent(out IPhysicsComponent physics))
+ if (entity.TryGetComponent(out IPhysicsComponent? physics))
{
var controller = physics.EnsureController();
controller.Move(direction, frameTime, entity.Transform.WorldPosition - Owner.Transform.WorldPosition);
diff --git a/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs b/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs
index 3d890b8883..ff95843d07 100644
--- a/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs
+++ b/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs
@@ -1,5 +1,6 @@
#nullable enable
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Rotatable/RotatableComponent.cs b/Content.Server/GameObjects/Components/Rotatable/RotatableComponent.cs
index 403b7d73fd..18613346ad 100644
--- a/Content.Server/GameObjects/Components/Rotatable/RotatableComponent.cs
+++ b/Content.Server/GameObjects/Components/Rotatable/RotatableComponent.cs
@@ -1,4 +1,5 @@
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Robust.Shared.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Strap/StrapComponent.cs b/Content.Server/GameObjects/Components/Strap/StrapComponent.cs
index a6ad9585b5..253a299ca7 100644
--- a/Content.Server/GameObjects/Components/Strap/StrapComponent.cs
+++ b/Content.Server/GameObjects/Components/Strap/StrapComponent.cs
@@ -5,6 +5,7 @@ using Content.Server.GameObjects.Components.Buckle;
using Content.Shared.Alert;
using Content.Shared.GameObjects.Components.Strap;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs
index 03de47d17d..53291488ab 100644
--- a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs
@@ -8,6 +8,7 @@ using Content.Server.GameObjects.Components.Power;
using Content.Server.Interfaces.GameObjects.Components.Items;
using Content.Shared.Audio;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs
index 9c0b83af28..267cffbcf9 100644
--- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs
@@ -6,6 +6,7 @@ using Content.Server.GameObjects.Components.Items.Storage;
using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels;
using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs
index 94565b01be..ebd5c16eb8 100644
--- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs
@@ -4,6 +4,7 @@ using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition;
using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs
index d45af23d24..0037bd7343 100644
--- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs
@@ -4,6 +4,7 @@ using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition;
using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs
index 418c1bf93f..639ceae889 100644
--- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs
@@ -9,6 +9,7 @@ using Content.Shared.Damage;
using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects;
diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs
index 9d77992065..1f2b7acba8 100644
--- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs
@@ -8,6 +8,7 @@ using Content.Shared.GameObjects;
using Content.Shared.GameObjects.Components.Weapons.Ranged;
using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.GameObjects.Verbs;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs
index e8ea1a012a..f1331d4e7e 100644
--- a/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs
+++ b/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs
@@ -6,6 +6,7 @@ using Content.Shared.Damage;
using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.Components.Weapons.Ranged;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Server.GameObjects.EntitySystems;
diff --git a/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs b/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs
index d5a17bf19c..5a7e6bb994 100644
--- a/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs
@@ -70,7 +70,8 @@ namespace Content.Server.GameObjects.EntitySystems.AI
foreach (var message in _queuedMobStateMessages)
{
- if (!message.Entity.TryGetComponent(out AiControllerComponent? controller))
+ if (message.Entity.Deleted ||
+ !message.Entity.TryGetComponent(out AiControllerComponent? controller))
{
continue;
}
diff --git a/Content.Server/GameObjects/EntitySystems/AI/Steering/AiSteeringSystem.cs b/Content.Server/GameObjects/EntitySystems/AI/Steering/AiSteeringSystem.cs
index 4287f5d23f..2350ccb47b 100644
--- a/Content.Server/GameObjects/EntitySystems/AI/Steering/AiSteeringSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/AI/Steering/AiSteeringSystem.cs
@@ -8,6 +8,7 @@ using Content.Server.GameObjects.EntitySystems.AI.Pathfinding;
using Content.Server.GameObjects.EntitySystems.AI.Pathfinding.Pathfinders;
using Content.Server.GameObjects.EntitySystems.JobQueues;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Utility;
using Robust.Server.Interfaces.Timing;
using Robust.Shared.GameObjects.Components;
diff --git a/Content.Server/GameObjects/EntitySystems/Body/Surgery/SurgeryToolSystem.cs b/Content.Server/GameObjects/EntitySystems/Body/Surgery/SurgeryToolSystem.cs
new file mode 100644
index 0000000000..6e7d65b03b
--- /dev/null
+++ b/Content.Server/GameObjects/EntitySystems/Body/Surgery/SurgeryToolSystem.cs
@@ -0,0 +1,65 @@
+using System.Collections.Generic;
+using Content.Server.GameObjects.Components.Body.Surgery;
+using Content.Server.GameObjects.Components.Body.Surgery.Messages;
+using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
+using Content.Shared.GameTicking;
+using Content.Shared.Utility;
+using JetBrains.Annotations;
+using Robust.Shared.GameObjects.Systems;
+
+namespace Content.Server.GameObjects.EntitySystems.Body.Surgery
+{
+ [UsedImplicitly]
+ public class SurgeryToolSystem : EntitySystem, IResettingEntitySystem
+ {
+ private readonly HashSet _openSurgeryUIs = new();
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnSurgeryWindowOpen);
+ SubscribeLocalEvent(OnSurgeryWindowClose);
+ }
+
+ public void Reset()
+ {
+ _openSurgeryUIs.Clear();
+ }
+
+ private void OnSurgeryWindowOpen(SurgeryWindowOpenMessage ev)
+ {
+ _openSurgeryUIs.Add(ev.Tool);
+ }
+
+ private void OnSurgeryWindowClose(SurgeryWindowCloseMessage ev)
+ {
+ _openSurgeryUIs.Remove(ev.Tool);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ foreach (var tool in _openSurgeryUIs)
+ {
+ if (tool.PerformerCache == null)
+ {
+ continue;
+ }
+
+ if (tool.BodyCache == null)
+ {
+ continue;
+ }
+
+ if (!ActionBlockerSystem.CanInteract(tool.PerformerCache) ||
+ !tool.PerformerCache.InRangeUnobstructed(tool.BodyCache))
+ {
+ tool.CloseAllSurgeryUIs();
+ }
+ }
+ }
+ }
+}
diff --git a/Content.Server/GameObjects/EntitySystems/BuckleSystem.cs b/Content.Server/GameObjects/EntitySystems/BuckleSystem.cs
index 1993021296..596aa1c319 100644
--- a/Content.Server/GameObjects/EntitySystems/BuckleSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/BuckleSystem.cs
@@ -26,6 +26,14 @@ namespace Content.Server.GameObjects.EntitySystems
SubscribeLocalEvent(ContainerModified);
}
+ public override void Update(float frameTime)
+ {
+ foreach (var comp in ComponentManager.EntityQuery(false))
+ {
+ comp.Update();
+ }
+ }
+
public override void Shutdown()
{
base.Shutdown();
diff --git a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs
index f2ac56a7f7..08119c5363 100644
--- a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs
@@ -11,6 +11,7 @@ using Content.Shared.GameObjects.Components.Inventory;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.EntitySystemMessages;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Input;
using Content.Shared.Interfaces.GameObjects.Components;
using Content.Shared.Utility;
diff --git a/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs b/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs
index 973c249a07..41640fa5b9 100644
--- a/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs
@@ -11,6 +11,7 @@ using Content.Server.GameObjects.EntitySystems.DoAfter;
using Content.Shared.Construction;
using Content.Shared.GameObjects.Components;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces;
using Content.Shared.Utility;
using JetBrains.Annotations;
diff --git a/Content.Server/GameObjects/EntitySystems/PointingSystem.cs b/Content.Server/GameObjects/EntitySystems/PointingSystem.cs
index 84862a76db..016d92312e 100644
--- a/Content.Server/GameObjects/EntitySystems/PointingSystem.cs
+++ b/Content.Server/GameObjects/EntitySystems/PointingSystem.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using Content.Server.GameObjects.Components.Pointing;
using Content.Server.Players;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Input;
using Content.Shared.Interfaces;
using Content.Shared.Utility;
diff --git a/Content.Server/GameTicking/GameTicker.JobController.cs b/Content.Server/GameTicking/GameTicker.JobController.cs
index 32fb69e2e8..1051af0f65 100644
--- a/Content.Server/GameTicking/GameTicker.JobController.cs
+++ b/Content.Server/GameTicking/GameTicker.JobController.cs
@@ -45,7 +45,11 @@ namespace Content.Server.GameTicking
.Where(j =>
{
var (jobId, priority) = j;
- var job = _prototypeManager.Index(jobId);
+ if (!_prototypeManager.TryIndex(jobId, out JobPrototype job))
+ {
+ // Job doesn't exist, probably old data?
+ return false;
+ }
if (job.IsHead != heads)
{
return false;
diff --git a/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs b/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs
index d2da0870d0..c5fd4c9865 100644
--- a/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs
+++ b/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs
@@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis;
using Content.Server.GameObjects.Components.Items.Storage;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Server.GameObjects.Components.Container;
using Robust.Server.GameObjects.EntitySystemMessages;
using Robust.Shared.Interfaces.GameObjects;
@@ -47,7 +48,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
/// The name of the hand to get.
/// The item in the held, null if no item is held
/// Whether it was holding an item
- bool TryGetItem(string handName, [MaybeNullWhen(false)] out ItemComponent item);
+ bool TryGetItem(string handName, [NotNullWhen(true)] out ItemComponent? item);
///
/// Gets item held by the current active hand
@@ -102,7 +103,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items
///
/// true if the entity is held, false otherwise
///
- bool TryHand(IEntity entity, [MaybeNullWhen(false)] out string handName);
+ bool TryHand(IEntity entity, [NotNullWhen(true)] out string? handName);
///
/// Drops the item contained in the slot to the same position as our entity.
diff --git a/Content.Server/MoMMILink.cs b/Content.Server/MoMMILink.cs
index 1455598c47..facd9ce93f 100644
--- a/Content.Server/MoMMILink.cs
+++ b/Content.Server/MoMMILink.cs
@@ -82,6 +82,12 @@ namespace Content.Server
var password = _configurationManager.GetCVar(CCVars.StatusMoMMIPassword);
+ if (string.IsNullOrEmpty(password))
+ {
+ response.StatusCode = (int) HttpStatusCode.Forbidden;
+ return true;
+ }
+
OOCPostMessage message = null;
try
{
diff --git a/Content.Server/Preferences/ServerPreferencesManager.cs b/Content.Server/Preferences/ServerPreferencesManager.cs
index a17bdbbb45..96a0cf2d8c 100644
--- a/Content.Server/Preferences/ServerPreferencesManager.cs
+++ b/Content.Server/Preferences/ServerPreferencesManager.cs
@@ -7,6 +7,7 @@ using Content.Server.Interfaces;
using Content.Shared;
using Content.Shared.Network.NetMessages;
using Content.Shared.Preferences;
+using Content.Shared.Roles;
using Robust.Server.Interfaces.Player;
using Robust.Shared.Interfaces.Configuration;
using Robust.Shared.Interfaces.Network;
@@ -250,7 +251,36 @@ namespace Content.Server.Preferences
return await _db.InitPrefsAsync(userId, HumanoidCharacterProfile.Default());
}
- return prefs;
+ return SanitizePreferences(prefs);
+ }
+
+ private PlayerPreferences SanitizePreferences(PlayerPreferences prefs)
+ {
+ // Clean up preferences in case of changes to the game,
+ // such as removed jobs still being selected.
+
+ return new PlayerPreferences(prefs.Characters.Select(p =>
+ {
+ ICharacterProfile newProf;
+ switch (p.Value)
+ {
+ case HumanoidCharacterProfile hp:
+ {
+ newProf = hp
+ .WithJobPriorities(
+ hp.JobPriorities.Where(job =>
+ _protos.HasIndex(job.Key)))
+ .WithAntagPreferences(
+ hp.AntagPreferences.Where(antag =>
+ _protos.HasIndex(antag)));
+ break;
+ }
+ default:
+ throw new NotSupportedException();
+ }
+
+ return new KeyValuePair(p.Key, newProf);
+ }), prefs.SelectedCharacterIndex);
}
public IEnumerable> GetSelectedProfilesForPlayers(
diff --git a/Content.Server/Throw/ThrowHelper.cs b/Content.Server/Throw/ThrowHelper.cs
index 300460f578..4d760383f7 100644
--- a/Content.Server/Throw/ThrowHelper.cs
+++ b/Content.Server/Throw/ThrowHelper.cs
@@ -2,6 +2,7 @@
using Content.Server.GameObjects.Components.Projectiles;
using Content.Shared.GameObjects.Components.Movement;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Physics;
using Robust.Shared.GameObjects.Components;
using Robust.Shared.Interfaces.GameObjects;
diff --git a/Content.Shared/CCVars.cs b/Content.Shared/CCVars.cs
index 06a99baa82..db9b5bc90c 100644
--- a/Content.Shared/CCVars.cs
+++ b/Content.Shared/CCVars.cs
@@ -12,10 +12,10 @@ namespace Content.Shared
*/
public static readonly CVarDef StatusMoMMIUrl =
- CVarDef.Create("status.mommiurl", null);
+ CVarDef.Create("status.mommiurl", "", CVar.SERVERONLY);
public static readonly CVarDef StatusMoMMIPassword =
- CVarDef.Create("status.mommipassword", null);
+ CVarDef.Create("status.mommipassword", "", CVar.SERVERONLY);
/*
diff --git a/Content.Shared/Damage/DamageClass.cs b/Content.Shared/Damage/DamageClass.cs
index 55e6a47045..0801728f39 100644
--- a/Content.Shared/Damage/DamageClass.cs
+++ b/Content.Shared/Damage/DamageClass.cs
@@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
+using Content.Shared.GameObjects.EntitySystems;
+using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Serialization;
namespace Content.Shared.Damage
@@ -18,27 +20,21 @@ namespace Content.Shared.Damage
public static class DamageClassExtensions
{
- // TODO DAMAGE This but not hardcoded
- private static readonly ImmutableDictionary> ClassToType =
- new Dictionary>
- {
- {DamageClass.Brute, new List {DamageType.Blunt, DamageType.Slash, DamageType.Piercing}},
- {DamageClass.Burn, new List {DamageType.Heat, DamageType.Shock, DamageType.Cold}},
- {DamageClass.Toxin, new List {DamageType.Poison, DamageType.Radiation}},
- {DamageClass.Airloss, new List {DamageType.Asphyxiation, DamageType.Bloodloss}},
- {DamageClass.Genetic, new List {DamageType.Cellular}}
- }.ToImmutableDictionary();
-
- public static List ToTypes(this DamageClass @class)
+ public static ImmutableList ToTypes(this DamageClass @class)
{
- return ClassToType[@class];
+ return DamageSystem.ClassToType[@class];
}
- public static Dictionary ToDictionary()
+ public static Dictionary ToNewDictionary()
{
return Enum.GetValues(typeof(DamageClass))
.Cast()
- .ToDictionary(@class => @class, type => 0);
+ .ToDictionary(@class => @class, _ => default(T));
+ }
+
+ public static Dictionary ToNewDictionary()
+ {
+ return ToNewDictionary();
}
}
}
diff --git a/Content.Shared/Damage/DamageType.cs b/Content.Shared/Damage/DamageType.cs
index 6b139e2569..a16bc2794a 100644
--- a/Content.Shared/Damage/DamageType.cs
+++ b/Content.Shared/Damage/DamageType.cs
@@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
-using System.Collections.Immutable;
using System.Linq;
+using Content.Shared.GameObjects.EntitySystems;
+using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Serialization;
namespace Content.Shared.Damage
@@ -24,38 +25,26 @@ namespace Content.Shared.Damage
public static class DamageTypeExtensions
{
- // TODO: Automatically generate this
- private static readonly ImmutableDictionary TypeToClass =
- new Dictionary
- {
- {DamageType.Blunt, DamageClass.Brute},
- {DamageType.Slash, DamageClass.Brute},
- {DamageType.Piercing, DamageClass.Brute},
- {DamageType.Heat, DamageClass.Burn},
- {DamageType.Shock, DamageClass.Burn},
- {DamageType.Cold, DamageClass.Burn},
- {DamageType.Poison, DamageClass.Toxin},
- {DamageType.Radiation, DamageClass.Toxin},
- {DamageType.Asphyxiation, DamageClass.Airloss},
- {DamageType.Bloodloss, DamageClass.Airloss},
- {DamageType.Cellular, DamageClass.Genetic}
- }.ToImmutableDictionary();
-
public static DamageClass ToClass(this DamageType type)
{
- return TypeToClass[type];
+ return DamageSystem.TypeToClass[type];
}
- public static Dictionary ToDictionary()
+ public static Dictionary ToNewDictionary()
{
return Enum.GetValues(typeof(DamageType))
.Cast()
- .ToDictionary(type => type, type => 0);
+ .ToDictionary(type => type, _ => default(T));
+ }
+
+ public static Dictionary ToNewDictionary()
+ {
+ return ToNewDictionary();
}
public static Dictionary ToClassDictionary(IReadOnlyDictionary types)
{
- var classes = DamageClassExtensions.ToDictionary();
+ var classes = DamageClassExtensions.ToNewDictionary();
foreach (var @class in classes.Keys.ToList())
{
diff --git a/Content.Shared/GameObjects/Components/ActionBlocking/SharedCuffableComponent.cs b/Content.Shared/GameObjects/Components/ActionBlocking/SharedCuffableComponent.cs
index ce5be9f0e6..188a3bd555 100644
--- a/Content.Shared/GameObjects/Components/ActionBlocking/SharedCuffableComponent.cs
+++ b/Content.Shared/GameObjects/Components/ActionBlocking/SharedCuffableComponent.cs
@@ -1,5 +1,6 @@
using System;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Shared.GameObjects;
using Robust.Shared.Maths;
using Robust.Shared.Serialization;
diff --git a/Content.Shared/GameObjects/Components/Buckle/SharedBuckleComponent.cs b/Content.Shared/GameObjects/Components/Buckle/SharedBuckleComponent.cs
index 221d1cb845..a78bd4a35c 100644
--- a/Content.Shared/GameObjects/Components/Buckle/SharedBuckleComponent.cs
+++ b/Content.Shared/GameObjects/Components/Buckle/SharedBuckleComponent.cs
@@ -1,30 +1,56 @@
-using System;
+#nullable enable
+using System;
using Content.Shared.GameObjects.Components.Strap;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects;
+using Robust.Shared.GameObjects.ComponentDependencies;
+using Robust.Shared.GameObjects.Components;
using Robust.Shared.Interfaces.GameObjects;
+using Robust.Shared.Physics;
using Robust.Shared.Serialization;
namespace Content.Shared.GameObjects.Components.Buckle
{
- public abstract class SharedBuckleComponent : Component, IActionBlocker, IEffectBlocker, IDraggable
+ public abstract class SharedBuckleComponent : Component, IActionBlocker, IEffectBlocker, IDraggable, ICollideSpecial
{
public sealed override string Name => "Buckle";
public sealed override uint? NetID => ContentNetIDs.BUCKLE;
-
///
/// True if the entity is buckled, false otherwise.
///
public abstract bool Buckled { get; }
+ public EntityUid? LastEntityBuckledTo { get; set; }
+ public bool IsOnStrapEntityThisFrame { get; set; }
+ public bool DontCollide { get; set; }
public abstract bool TryBuckle(IEntity user, IEntity to);
+ [ComponentDependency] protected IPhysicsComponent? Body;
+
+ bool ICollideSpecial.PreventCollide(IPhysBody collidedwith)
+ {
+ if (collidedwith.Entity.Uid == LastEntityBuckledTo)
+ {
+ IsOnStrapEntityThisFrame = true;
+ return Buckled || DontCollide;
+ }
+
+ return false;
+ }
+
bool IActionBlocker.CanMove()
{
return !Buckled;
}
+ public override void Initialize()
+ {
+ base.Initialize();
+ Owner.TryGetComponent(out Body);
+ }
bool IActionBlocker.CanChangeDirection()
{
@@ -50,13 +76,17 @@ namespace Content.Shared.GameObjects.Components.Buckle
[Serializable, NetSerializable]
public sealed class BuckleComponentState : ComponentState
{
- public BuckleComponentState(bool buckled, int? drawDepth) : base(ContentNetIDs.BUCKLE)
+ public BuckleComponentState(bool buckled, int? drawDepth, EntityUid? lastEntityBuckledTo, bool dontCollide) : base(ContentNetIDs.BUCKLE)
{
Buckled = buckled;
DrawDepth = drawDepth;
+ LastEntityBuckledTo = lastEntityBuckledTo;
+ DontCollide = dontCollide;
}
public bool Buckled { get; }
+ public EntityUid? LastEntityBuckledTo { get; }
+ public bool DontCollide { get; }
public int? DrawDepth;
}
diff --git a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs
index c42f6f7cc9..548d546044 100644
--- a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs
+++ b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs
@@ -34,7 +34,7 @@ namespace Content.Shared.GameObjects.Components.Damage
public override uint? NetID => ContentNetIDs.DAMAGEABLE;
- private readonly Dictionary _damageList = DamageTypeExtensions.ToDictionary();
+ private readonly Dictionary _damageList = DamageTypeExtensions.ToNewDictionary();
private readonly HashSet _supportedTypes = new();
private readonly HashSet _supportedClasses = new();
private DamageFlag _flags;
diff --git a/Content.Shared/GameObjects/Components/GUI/SharedStrippableComponent.cs b/Content.Shared/GameObjects/Components/GUI/SharedStrippableComponent.cs
index 9b172820a4..77f41e77a4 100644
--- a/Content.Shared/GameObjects/Components/GUI/SharedStrippableComponent.cs
+++ b/Content.Shared/GameObjects/Components/GUI/SharedStrippableComponent.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Components.UserInterface;
diff --git a/Content.Shared/GameObjects/Components/Instruments/SharedInstrumentComponent.cs b/Content.Shared/GameObjects/Components/Instruments/SharedInstrumentComponent.cs
index 17b7c5a6df..65f96d9103 100644
--- a/Content.Shared/GameObjects/Components/Instruments/SharedInstrumentComponent.cs
+++ b/Content.Shared/GameObjects/Components/Instruments/SharedInstrumentComponent.cs
@@ -11,11 +11,21 @@ namespace Content.Shared.GameObjects.Components.Instruments
public override string Name => "Instrument";
public override uint? NetID => ContentNetIDs.INSTRUMENTS;
+ [ViewVariables(VVAccess.ReadWrite)]
public virtual byte InstrumentProgram { get; set; }
+
+ [ViewVariables(VVAccess.ReadWrite)]
public virtual byte InstrumentBank { get; set; }
+
+ [ViewVariables(VVAccess.ReadWrite)]
public virtual bool AllowPercussion { get; set; }
+
+ [ViewVariables(VVAccess.ReadWrite)]
public virtual bool AllowProgramChange { get ; set; }
+ [ViewVariables(VVAccess.ReadWrite)]
+ public virtual bool RespectMidiLimits { get; set; }
+
public virtual void Update(float delta)
{
}
@@ -61,14 +71,16 @@ namespace Content.Shared.GameObjects.Components.Instruments
public byte InstrumentBank { get; }
public bool AllowPercussion { get; }
public bool AllowProgramChange { get; }
+ public bool RespectMidiLimits { get; }
- public InstrumentState(bool playing, byte instrumentProgram, byte instrumentBank, bool allowPercussion, bool allowProgramChange, uint sequencerTick = 0) : base(ContentNetIDs.INSTRUMENTS)
+ public InstrumentState(bool playing, byte instrumentProgram, byte instrumentBank, bool allowPercussion, bool allowProgramChange, bool respectMidiLimits, uint sequencerTick = 0) : base(ContentNetIDs.INSTRUMENTS)
{
Playing = playing;
InstrumentProgram = instrumentProgram;
InstrumentBank = instrumentBank;
AllowPercussion = allowPercussion;
AllowProgramChange = allowProgramChange;
+ RespectMidiLimits = respectMidiLimits;
}
}
diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs
index 9620d186ae..794ab734be 100644
--- a/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs
+++ b/Content.Shared/GameObjects/Components/Mobs/SharedStunnableComponent.cs
@@ -3,6 +3,7 @@ using System.Threading;
using Content.Shared.Alert;
using Content.Shared.GameObjects.Components.Movement;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Components.Timers;
diff --git a/Content.Shared/GameObjects/Components/Mobs/State/IMobState.cs b/Content.Shared/GameObjects/Components/Mobs/State/IMobState.cs
index e17fa2f2b2..1cacbe57ab 100644
--- a/Content.Shared/GameObjects/Components/Mobs/State/IMobState.cs
+++ b/Content.Shared/GameObjects/Components/Mobs/State/IMobState.cs
@@ -1,4 +1,5 @@
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Serialization;
diff --git a/Content.Shared/GameObjects/Components/Mobs/State/SharedMobStateComponent.cs b/Content.Shared/GameObjects/Components/Mobs/State/SharedMobStateComponent.cs
index cd34d1297b..4bcda6ac00 100644
--- a/Content.Shared/GameObjects/Components/Mobs/State/SharedMobStateComponent.cs
+++ b/Content.Shared/GameObjects/Components/Mobs/State/SharedMobStateComponent.cs
@@ -6,6 +6,7 @@ using System.Linq;
using Content.Shared.Alert;
using Content.Shared.GameObjects.Components.Damage;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Serialization;
@@ -269,6 +270,7 @@ namespace Content.Shared.GameObjects.Components.Mobs.State
var message = new MobStateChangedMessage(this, old, state);
SendMessage(message);
+ Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, message);
}
bool IActionBlocker.CanInteract()
diff --git a/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs
index cf81cdd7ac..e55e599f63 100644
--- a/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs
+++ b/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs
@@ -1,5 +1,6 @@
using System;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Physics;
using Robust.Shared.GameObjects;
using Robust.Shared.GameObjects.Components;
diff --git a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs
index 6e79a32faa..de3b2bdd8f 100644
--- a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs
+++ b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Content.Shared.GameObjects.Components.Mobs;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
using Content.Shared.Physics;
using Robust.Shared.Containers;
using Robust.Shared.GameObjects;
diff --git a/Content.Shared/GameObjects/Components/Observer/SharedGhostComponent.cs b/Content.Shared/GameObjects/Components/Observer/SharedGhostComponent.cs
index 9d17d1258e..3eebfdc8ae 100644
--- a/Content.Shared/GameObjects/Components/Observer/SharedGhostComponent.cs
+++ b/Content.Shared/GameObjects/Components/Observer/SharedGhostComponent.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
diff --git a/Content.Shared/GameObjects/Components/PDA/UplinkCategory.cs b/Content.Shared/GameObjects/Components/PDA/UplinkCategory.cs
index 13f8ad5245..a9278bba79 100644
--- a/Content.Shared/GameObjects/Components/PDA/UplinkCategory.cs
+++ b/Content.Shared/GameObjects/Components/PDA/UplinkCategory.cs
@@ -4,6 +4,12 @@ namespace Content.Shared.GameObjects.Components.PDA
{
Weapons,
Ammo,
+ Explosives,
+ Misc,
+ Bundles,
+ Tools,
Utility,
+ Armor,
+ Pointless,
}
}
diff --git a/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs b/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs
index 2bbdb8ffe1..2bdbc43363 100644
--- a/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs
+++ b/Content.Shared/GameObjects/Components/Storage/SharedStorageComponent.cs
@@ -3,6 +3,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Interfaces.GameObjects.Components;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlocker/ActionBlockerExtensions.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlocker/ActionBlockerExtensions.cs
new file mode 100644
index 0000000000..c8052699d2
--- /dev/null
+++ b/Content.Shared/GameObjects/EntitySystems/ActionBlocker/ActionBlockerExtensions.cs
@@ -0,0 +1,77 @@
+using Robust.Shared.Interfaces.GameObjects;
+
+namespace Content.Shared.GameObjects.EntitySystems.ActionBlocker
+{
+ public static class ActionBlockerExtensions
+ {
+ public static bool CanMove(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanMove(entity);
+ }
+
+ public static bool CanInteract(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanInteract(entity);
+ }
+
+ public static bool CanUse(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanUse(entity);
+ }
+
+ public static bool CanThrow(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanThrow(entity);
+ }
+
+ public static bool CanSpeak(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanSpeak(entity);
+ }
+
+ public static bool CanDrop(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanDrop(entity);
+ }
+
+ public static bool CanPickup(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanPickup(entity);
+ }
+
+ public static bool CanEmote(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanEmote(entity);
+ }
+
+ public static bool CanAttack(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanAttack(entity);
+ }
+
+ public static bool CanEquip(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanEquip(entity);
+ }
+
+ public static bool CanUnequip(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanUnequip(entity);
+ }
+
+ public static bool CanChangeDirection(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanChangeDirection(entity);
+ }
+
+ public static bool CanShiver(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanShiver(entity);
+ }
+
+ public static bool CanSweat(this IEntity entity)
+ {
+ return ActionBlockerSystem.CanSweat(entity);
+ }
+ }
+}
diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlocker/ActionBlockerSystem.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlocker/ActionBlockerSystem.cs
new file mode 100644
index 0000000000..63367caa19
--- /dev/null
+++ b/Content.Shared/GameObjects/EntitySystems/ActionBlocker/ActionBlockerSystem.cs
@@ -0,0 +1,179 @@
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
+using JetBrains.Annotations;
+using Robust.Shared.GameObjects.Systems;
+using Robust.Shared.Interfaces.GameObjects;
+
+namespace Content.Shared.GameObjects.EntitySystems.ActionBlocker
+{
+ ///
+ /// Utility methods to check if a specific entity is allowed to perform an action.
+ /// For effects see
+ ///
+ [UsedImplicitly]
+ public class ActionBlockerSystem : EntitySystem
+ {
+ public static bool CanMove(IEntity entity)
+ {
+ var canMove = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canMove &= blocker.CanMove(); // Sets var to false if false
+ }
+
+ return canMove;
+ }
+
+ public static bool CanInteract(IEntity entity)
+ {
+ var canInteract = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canInteract &= blocker.CanInteract();
+ }
+
+ return canInteract;
+ }
+
+ public static bool CanUse(IEntity entity)
+ {
+ var canUse = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canUse &= blocker.CanUse();
+ }
+
+ return canUse;
+ }
+
+ public static bool CanThrow(IEntity entity)
+ {
+ var canThrow = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canThrow &= blocker.CanThrow();
+ }
+
+ return canThrow;
+ }
+
+ public static bool CanSpeak(IEntity entity)
+ {
+ var canSpeak = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canSpeak &= blocker.CanSpeak();
+ }
+
+ return canSpeak;
+ }
+
+ public static bool CanDrop(IEntity entity)
+ {
+ var canDrop = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canDrop &= blocker.CanDrop();
+ }
+
+ return canDrop;
+ }
+
+ public static bool CanPickup(IEntity entity)
+ {
+ var canPickup = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canPickup &= blocker.CanPickup();
+ }
+
+ return canPickup;
+ }
+
+ public static bool CanEmote(IEntity entity)
+ {
+ var canEmote = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canEmote &= blocker.CanEmote();
+ }
+
+ return canEmote;
+ }
+
+ public static bool CanAttack(IEntity entity)
+ {
+ var canAttack = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canAttack &= blocker.CanAttack();
+ }
+
+ return canAttack;
+ }
+
+ public static bool CanEquip(IEntity entity)
+ {
+ var canEquip = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canEquip &= blocker.CanEquip();
+ }
+
+ return canEquip;
+ }
+
+ public static bool CanUnequip(IEntity entity)
+ {
+ var canUnequip = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canUnequip &= blocker.CanUnequip();
+ }
+
+ return canUnequip;
+ }
+
+ public static bool CanChangeDirection(IEntity entity)
+ {
+ var canChangeDirection = true;
+
+ foreach (var blocker in entity.GetAllComponents())
+ {
+ canChangeDirection &= blocker.CanChangeDirection();
+ }
+
+ return canChangeDirection;
+ }
+
+ public static bool CanShiver(IEntity entity)
+ {
+ var canShiver = true;
+ foreach (var component in entity.GetAllComponents())
+ {
+ canShiver &= component.CanShiver();
+ }
+ return canShiver;
+ }
+
+ public static bool CanSweat(IEntity entity)
+ {
+ var canSweat = true;
+ foreach (var component in entity.GetAllComponents())
+ {
+ canSweat &= component.CanSweat();
+ }
+ return canSweat;
+ }
+ }
+}
diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlocker/IActionBlocker.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlocker/IActionBlocker.cs
new file mode 100644
index 0000000000..8d23ceea0d
--- /dev/null
+++ b/Content.Shared/GameObjects/EntitySystems/ActionBlocker/IActionBlocker.cs
@@ -0,0 +1,39 @@
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
+
+namespace Content.Shared.GameObjects.EntitySystems.ActionBlocker
+{
+ ///
+ /// This interface gives components the ability to block certain actions from
+ /// being done by the owning entity. For effects see
+ ///
+ public interface IActionBlocker
+ {
+ bool CanMove() => true;
+
+ bool CanInteract() => true;
+
+ bool CanUse() => true;
+
+ bool CanThrow() => true;
+
+ bool CanSpeak() => true;
+
+ bool CanDrop() => true;
+
+ bool CanPickup() => true;
+
+ bool CanEmote() => true;
+
+ bool CanAttack() => true;
+
+ bool CanEquip() => true;
+
+ bool CanUnequip() => true;
+
+ bool CanChangeDirection() => true;
+
+ bool CanShiver() => true;
+
+ bool CanSweat() => true;
+ }
+}
diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs
deleted file mode 100644
index b0fc6baf20..0000000000
--- a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs
+++ /dev/null
@@ -1,195 +0,0 @@
-using Robust.Shared.GameObjects.Systems;
-using Robust.Shared.Interfaces.GameObjects;
-
-namespace Content.Shared.GameObjects.EntitySystems
-{
- ///
- /// This interface gives components the ability to block certain actions from
- /// being done by the owning entity. For effects see
- ///
- public interface IActionBlocker
- {
- bool CanMove() => true;
- bool CanInteract() => true;
- bool CanUse() => true;
- bool CanThrow() => true;
- bool CanSpeak() => true;
- bool CanDrop() => true;
- bool CanPickup() => true;
- bool CanEmote() => true;
- bool CanAttack() => true;
-
- bool CanEquip() => true;
-
- bool CanUnequip() => true;
-
- bool CanChangeDirection() => true;
-
- bool CanShiver() => true;
- bool CanSweat() => true;
- }
-
- ///
- /// Utility methods to check if a specific entity is allowed to perform an action.
- /// For effects see
- ///
- public class ActionBlockerSystem : EntitySystem
- {
- public static bool CanMove(IEntity entity)
- {
- bool canmove = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canmove &= actionblockercomponents.CanMove(); // Sets var to false if false
- }
-
- return canmove;
- }
-
- public static bool CanInteract(IEntity entity)
- {
- bool caninteract = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- caninteract &= actionblockercomponents.CanInteract();
- }
-
- return caninteract;
- }
-
- public static bool CanUse(IEntity entity)
- {
- bool canuse = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canuse &= actionblockercomponents.CanUse();
- }
-
- return canuse;
- }
-
- public static bool CanThrow(IEntity entity)
- {
- bool canthrow = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canthrow &= actionblockercomponents.CanThrow();
- }
-
- return canthrow;
- }
-
- public static bool CanSpeak(IEntity entity)
- {
- bool canspeak = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canspeak &= actionblockercomponents.CanSpeak();
- }
-
- return canspeak;
- }
-
- public static bool CanDrop(IEntity entity)
- {
- bool candrop = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- candrop &= actionblockercomponents.CanDrop();
- }
-
- return candrop;
- }
-
- public static bool CanPickup(IEntity entity)
- {
- bool canpickup = true;
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canpickup &= actionblockercomponents.CanPickup();
- }
-
- return canpickup;
- }
-
- public static bool CanEmote(IEntity entity)
- {
- bool canemote = true;
-
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canemote &= actionblockercomponents.CanEmote();
- }
-
- return canemote;
- }
-
- public static bool CanAttack(IEntity entity)
- {
- bool canattack = true;
-
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canattack &= actionblockercomponents.CanAttack();
- }
-
- return canattack;
- }
-
- public static bool CanEquip(IEntity entity)
- {
- bool canequip = true;
-
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canequip &= actionblockercomponents.CanEquip();
- }
-
- return canequip;
- }
-
- public static bool CanUnequip(IEntity entity)
- {
- bool canunequip = true;
-
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canunequip &= actionblockercomponents.CanUnequip();
- }
-
- return canunequip;
- }
-
- public static bool CanChangeDirection(IEntity entity)
- {
- bool canchangedirection = true;
-
- foreach (var actionblockercomponents in entity.GetAllComponents())
- {
- canchangedirection &= actionblockercomponents.CanChangeDirection();
- }
-
- return canchangedirection;
- }
-
- public static bool CanShiver(IEntity entity)
- {
- var canShiver = true;
- foreach (var component in entity.GetAllComponents())
- {
- canShiver &= component.CanShiver();
- }
- return canShiver;
- }
-
- public static bool CanSweat(IEntity entity)
- {
- var canSweat = true;
- foreach (var component in entity.GetAllComponents())
- {
- canSweat &= component.CanSweat();
- }
- return canSweat;
- }
- }
-}
diff --git a/Content.Shared/GameObjects/EntitySystems/DamageSystem.cs b/Content.Shared/GameObjects/EntitySystems/DamageSystem.cs
new file mode 100644
index 0000000000..502d71062d
--- /dev/null
+++ b/Content.Shared/GameObjects/EntitySystems/DamageSystem.cs
@@ -0,0 +1,67 @@
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using Content.Shared.Damage;
+using JetBrains.Annotations;
+using Robust.Shared.GameObjects.Systems;
+
+namespace Content.Shared.GameObjects.EntitySystems
+{
+ [UsedImplicitly]
+ public class DamageSystem : EntitySystem
+ {
+ public static ImmutableDictionary> ClassToType { get; } = DefaultClassToType();
+
+ public static ImmutableDictionary TypeToClass { get; } = DefaultTypeToClass();
+
+ private static ImmutableDictionary> DefaultClassToType()
+ {
+ return new Dictionary>
+ {
+ [DamageClass.Brute] = new List
+ {
+ DamageType.Blunt,
+ DamageType.Slash,
+ DamageType.Piercing
+ }.ToImmutableList(),
+ [DamageClass.Burn] = new List
+ {
+ DamageType.Heat,
+ DamageType.Shock,
+ DamageType.Cold
+ }.ToImmutableList(),
+ [DamageClass.Toxin] = new List
+ {
+ DamageType.Poison,
+ DamageType.Radiation
+ }.ToImmutableList(),
+ [DamageClass.Airloss] = new List
+ {
+ DamageType.Asphyxiation,
+ DamageType.Bloodloss
+ }.ToImmutableList(),
+ [DamageClass.Genetic] = new List
+ {
+ DamageType.Cellular
+ }.ToImmutableList()
+ }.ToImmutableDictionary();
+ }
+
+ private static ImmutableDictionary DefaultTypeToClass()
+ {
+ return new Dictionary
+ {
+ {DamageType.Blunt, DamageClass.Brute},
+ {DamageType.Slash, DamageClass.Brute},
+ {DamageType.Piercing, DamageClass.Brute},
+ {DamageType.Heat, DamageClass.Burn},
+ {DamageType.Shock, DamageClass.Burn},
+ {DamageType.Cold, DamageClass.Burn},
+ {DamageType.Poison, DamageClass.Toxin},
+ {DamageType.Radiation, DamageClass.Toxin},
+ {DamageType.Asphyxiation, DamageClass.Airloss},
+ {DamageType.Bloodloss, DamageClass.Airloss},
+ {DamageType.Cellular, DamageClass.Genetic}
+ }.ToImmutableDictionary();
+ }
+ }
+}
diff --git a/Content.Shared/GameObjects/EntitySystems/EffectBlocker/EffectBlockerExtensions.cs b/Content.Shared/GameObjects/EntitySystems/EffectBlocker/EffectBlockerExtensions.cs
new file mode 100644
index 0000000000..842695f3ec
--- /dev/null
+++ b/Content.Shared/GameObjects/EntitySystems/EffectBlocker/EffectBlockerExtensions.cs
@@ -0,0 +1,17 @@
+using Robust.Shared.Interfaces.GameObjects;
+
+namespace Content.Shared.GameObjects.EntitySystems.EffectBlocker
+{
+ public static class EffectBlockerExtensions
+ {
+ public static bool CanFall(this IEntity entity)
+ {
+ return EffectBlockerSystem.CanFall(entity);
+ }
+
+ public static bool CanSlip(this IEntity entity)
+ {
+ return EffectBlockerSystem.CanSlip(entity);
+ }
+ }
+}
diff --git a/Content.Shared/GameObjects/EntitySystems/EffectBlockerSystem.cs b/Content.Shared/GameObjects/EntitySystems/EffectBlocker/EffectBlockerSystem.cs
similarity index 69%
rename from Content.Shared/GameObjects/EntitySystems/EffectBlockerSystem.cs
rename to Content.Shared/GameObjects/EntitySystems/EffectBlocker/EffectBlockerSystem.cs
index c7e003f03a..215630014c 100644
--- a/Content.Shared/GameObjects/EntitySystems/EffectBlockerSystem.cs
+++ b/Content.Shared/GameObjects/EntitySystems/EffectBlocker/EffectBlockerSystem.cs
@@ -1,27 +1,21 @@
-using Robust.Shared.GameObjects.Systems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
+using JetBrains.Annotations;
+using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Interfaces.GameObjects;
-namespace Content.Shared.GameObjects.EntitySystems
+namespace Content.Shared.GameObjects.EntitySystems.EffectBlocker
{
- ///
- /// This interface gives components the ability to block certain effects
- /// from affecting the owning entity. For actions see
- ///
- public interface IEffectBlocker
- {
- bool CanFall() => true;
- bool CanSlip() => true;
- }
-
///
/// Utility methods to check if an effect is allowed to affect a specific entity.
/// For actions see
///
+ [UsedImplicitly]
public class EffectBlockerSystem : EntitySystem
{
public static bool CanFall(IEntity entity)
{
var canFall = true;
+
foreach (var blocker in entity.GetAllComponents())
{
canFall &= blocker.CanFall(); // Sets var to false if false
@@ -33,6 +27,7 @@ namespace Content.Shared.GameObjects.EntitySystems
public static bool CanSlip(IEntity entity)
{
var canSlip = true;
+
foreach (var blocker in entity.GetAllComponents())
{
canSlip &= blocker.CanSlip(); // Sets var to false if false
diff --git a/Content.Shared/GameObjects/EntitySystems/EffectBlocker/IEffectBlocker.cs b/Content.Shared/GameObjects/EntitySystems/EffectBlocker/IEffectBlocker.cs
new file mode 100644
index 0000000000..5cce28829d
--- /dev/null
+++ b/Content.Shared/GameObjects/EntitySystems/EffectBlocker/IEffectBlocker.cs
@@ -0,0 +1,14 @@
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
+
+namespace Content.Shared.GameObjects.EntitySystems.EffectBlocker
+{
+ ///
+ /// This interface gives components the ability to block certain effects
+ /// from affecting the owning entity. For actions see
+ ///
+ public interface IEffectBlocker
+ {
+ bool CanFall() => true;
+ bool CanSlip() => true;
+ }
+}
diff --git a/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs
index ee0ce1b188..127cd56b8a 100644
--- a/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs
+++ b/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs
@@ -2,6 +2,7 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.GameObjects.Components.Items;
using Content.Shared.GameObjects.Components.Movement;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Content.Shared.Physics;
using Content.Shared.Physics.Pull;
using Robust.Shared.Configuration;
@@ -50,7 +51,7 @@ namespace Content.Shared.GameObjects.EntitySystems
}
//TODO: reorganize this to make more logical sense
- protected void UpdateKinematics(ITransformComponent transform, IMoverComponent mover, IPhysicsComponent physics)
+ protected void UpdateKinematics(ITransformComponent transform, IMoverComponent mover, IPhysicsComponent physics)
{
physics.EnsureController();
@@ -71,7 +72,7 @@ namespace Content.Shared.GameObjects.EntitySystems
// TODO: movement check.
var (walkDir, sprintDir) = mover.VelocityDir;
var combined = walkDir + sprintDir;
- if (combined.LengthSquared < 0.001 || !ActionBlockerSystem.CanMove(mover.Owner) && !weightless)
+ if (combined.LengthSquared < 0.001 || !ActionBlockerSystem.CanMove(mover.Owner) && !weightless)
{
if (physics.TryGetController(out MoverController controller))
{
@@ -177,7 +178,7 @@ namespace Content.Shared.GameObjects.EntitySystems
moverComp.SetSprinting(subTick, walking);
}
- private static bool TryGetAttachedComponent(ICommonSession? session, [MaybeNullWhen(false)] out T component)
+ private static bool TryGetAttachedComponent(ICommonSession? session, [NotNullWhen(true)] out T? component)
where T : class, IComponent
{
component = default;
diff --git a/Content.Shared/GameObjects/EntitySystems/SharedStandingStateSystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedStandingStateSystem.cs
index 9526b5414a..46fb1dec2e 100644
--- a/Content.Shared/GameObjects/EntitySystems/SharedStandingStateSystem.cs
+++ b/Content.Shared/GameObjects/EntitySystems/SharedStandingStateSystem.cs
@@ -1,3 +1,4 @@
+using Content.Shared.GameObjects.EntitySystems.EffectBlocker;
using Robust.Shared.GameObjects.Systems;
using Robust.Shared.Interfaces.GameObjects;
diff --git a/Content.Shared/Physics/ThrowKnockbackController.cs b/Content.Shared/Physics/ThrowKnockbackController.cs
index d6bf507174..0b11cab2a3 100644
--- a/Content.Shared/Physics/ThrowKnockbackController.cs
+++ b/Content.Shared/Physics/ThrowKnockbackController.cs
@@ -1,5 +1,6 @@
using Content.Shared.GameObjects.Components.Movement;
using Content.Shared.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.EntitySystems.ActionBlocker;
using Robust.Shared.Interfaces.Physics;
using Robust.Shared.IoC;
using Robust.Shared.Maths;
diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs
index a2b1104730..371d30d429 100644
--- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs
+++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs
@@ -106,7 +106,7 @@ namespace Content.Shared.Preferences
return new(Name, Age, Sex, appearance, _jobPriorities, PreferenceUnavailable, _antagPreferences);
}
- public HumanoidCharacterProfile WithJobPriorities(IReadOnlyDictionary jobPriorities)
+ public HumanoidCharacterProfile WithJobPriorities(IEnumerable> jobPriorities)
{
return new(
Name,
@@ -138,7 +138,7 @@ namespace Content.Shared.Preferences
return new(Name, Age, Sex, Appearance, _jobPriorities, mode, _antagPreferences);
}
- public HumanoidCharacterProfile WithAntagPreferences(IReadOnlyList antagPreferences)
+ public HumanoidCharacterProfile WithAntagPreferences(IEnumerable antagPreferences)
{
return new(
Name,
diff --git a/Content.Shared/Preferences/JobPriority.cs b/Content.Shared/Preferences/JobPriority.cs
index 73deac3523..bf0bbf6aad 100644
--- a/Content.Shared/Preferences/JobPriority.cs
+++ b/Content.Shared/Preferences/JobPriority.cs
@@ -2,7 +2,7 @@ namespace Content.Shared.Preferences
{
public enum JobPriority
{
- // These enum values HAVE to match the ones in DbJobPriority in Server.Database.
+ // These enum values HAVE to match the ones in DbJobPriority in Content.Server.Database
Never = 0,
Low = 1,
Medium = 2,
diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs
index 63aea01f21..08bf12e340 100644
--- a/Content.Shared/Roles/JobPrototype.cs
+++ b/Content.Shared/Roles/JobPrototype.cs
@@ -42,7 +42,7 @@ namespace Content.Shared.Roles
public JobSpecial Special { get; private set; }
- public IReadOnlyCollection Department { get; private set; }
+ public IReadOnlyCollection Departments { get; private set; }
public IReadOnlyCollection Access { get; private set; }
public void LoadFrom(YamlMappingNode mapping)
@@ -51,7 +51,7 @@ namespace Content.Shared.Roles
ID = srz.ReadDataField("id");
Name = Loc.GetString(srz.ReadDataField("name"));
StartingGear = srz.ReadDataField("startingGear");
- Department = srz.ReadDataField>("department");
+ Departments = srz.ReadDataField>("departments");
TotalPositions = srz.ReadDataField("positions");
srz.DataField(this, p => p.SpawnPositions, "spawnPositions", TotalPositions);
diff --git a/Resources/Audio/Machines/phasein.ogg b/Resources/Audio/Machines/phasein.ogg
new file mode 100644
index 0000000000..9bb4d443f0
Binary files /dev/null and b/Resources/Audio/Machines/phasein.ogg differ
diff --git a/Resources/Audio/Misc/windowsXP_error.ogg b/Resources/Audio/Misc/windowsXP_error.ogg
new file mode 100644
index 0000000000..83a0ccc0b4
Binary files /dev/null and b/Resources/Audio/Misc/windowsXP_error.ogg differ
diff --git a/Resources/Audio/Misc/windowsXP_shutdown.ogg b/Resources/Audio/Misc/windowsXP_shutdown.ogg
new file mode 100644
index 0000000000..acbb9a64e1
Binary files /dev/null and b/Resources/Audio/Misc/windowsXP_shutdown.ogg differ
diff --git a/Resources/Audio/Misc/windowsXP_startup.ogg b/Resources/Audio/Misc/windowsXP_startup.ogg
new file mode 100644
index 0000000000..32cd462de3
Binary files /dev/null and b/Resources/Audio/Misc/windowsXP_startup.ogg differ
diff --git a/Resources/Prototypes/Catalog/Fills/duffel.yml b/Resources/Prototypes/Catalog/Fills/duffel.yml
index b86c279f9d..4a6180c7c9 100644
--- a/Resources/Prototypes/Catalog/Fills/duffel.yml
+++ b/Resources/Prototypes/Catalog/Fills/duffel.yml
@@ -1,7 +1,7 @@
- type: entity
parent: ClothingBackpackDuffelMedical
id: ClothingBackpackDuffelSurgeryFilled
- name: surgical duffel bag
+ name: surgical duffelbag
description: "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
components:
- type: StorageFill
@@ -14,3 +14,129 @@
- name: Scalpel
- type: Storage
capacity: 30
+
+- type: entity
+ parent: ClothingBackpackDuffelSyndicate
+ id: ClothingBackpackDuffelSyndicateFilledMedical
+ name: syndicate surgical duffelbag
+ description: "A large duffel bag for holding extra medical supplies - this one seems to be designed for holding surgical tools."
+ components:
+ - type: Sprite
+ state: icon-med
+ - type: StorageFill
+ contents:
+ - name: Hemostat
+ - name: BoneSaw
+ - name: Drill
+ - name: Cautery
+ - name: Retractor
+ - name: Scalpel
+ - type: Storage
+ capacity: 30
+
+- type: entity
+ parent: ClothingBackpackDuffelSyndicate
+ id: ClothingBackpackDuffelSyndicateFilledShotgun
+ name: Bojevic bundle
+ description: "Lean and mean: Contains the popular Bojevic Shotgun, a 12g beanbag drum and 2 12g buckshot drums." #, and a pair of Thermal Imaging Goggles.
+ components:
+ - type: Sprite
+ state: icon-ammo
+ - type: StorageFill
+ contents:
+ - name: ShotgunBojevic
+ - name: MagazineShotgun
+ - name: MagazineShotgunBeanbag
+# - name: ThermalImagingGoggles
+ - type: Storage
+ capacity: 100
+
+- type: entity
+ parent: ClothingBackpackDuffelSyndicate
+ id: ClothingBackpackDuffelSyndicateFilledSMG
+ name: C-20r bundle
+ description: "Old faithful: The classic C-20r Submachine Gun, bundled with three magazines." #, and a Suppressor.
+ components:
+ - type: Sprite
+ state: icon-ammo
+ - type: StorageFill
+ contents:
+ - name: SmgC20r
+ - name: MagazinePistolSmg
+ amount: 2
+# - name: SMGSuppressor
+ - type: Storage
+ capacity: 100
+
+- type: entity
+ parent: ClothingBackpackDuffelSyndicate
+ id: ClothingBackpackDuffelSyndicateFilledLMG
+ name: L6 Saw bundle
+ description: "More dakka: The iconic L6 lightmachinegun, bundled with 2 box magazines."
+ components:
+ - type: Sprite
+ state: icon-ammo
+ - type: StorageFill
+ contents:
+ - name: LMGL6
+ - name: MagazineLRifleBox
+ - type: Storage
+ capacity: 100
+
+- type: entity
+ parent: ClothingBackpackDuffelSyndicate
+ id: ClothingBackpackDuffelSyndicateFilledGrenadeLauncher
+ name: China-Lake bundle
+ description: "An old China-Lake grenade launcher bundled with 9 rounds of various destruction capability."
+ components:
+ - type: Sprite
+ state: icon-ammo
+ - type: StorageFill
+ contents:
+ - name: LauncherChinaLake
+ - name: GrenadeBlast
+ amount: 3
+ - name: GrenadeFlash
+ amount: 3
+ - name: GrenadeFrag
+ amount: 3
+ - type: Storage
+ capacity: 200
+
+- type: entity
+ parent: ClothingBackpackDuffel
+ id: ClothingBackpackDuffelSyndicateCostumeCentcom
+ name: Centcom official costume duffelbag
+ description: "Contains a full CentCom Official uniform set, headset and clipboard included. The headset comes without an encryption key."
+ components:
+ - type: StorageFill
+ contents:
+ - name: ClothingHeadHatCaptain
+ - name: ClothingEyesGlassesSunglasses
+ - name: ClothingUniformJumpsuitCentcomOfficial
+ - name: ClothingShoesBootsJack
+ - name: ClothingHandsGlovesColorGray
+ - name: ClothingHeadsetService
+ - name: ClothingOuterVestKevlar
+ - name: Paper
+ - name: Pen
+ - name: CentcomPDA
+ - type: Storage
+ capacity: 50
+
+- type: entity
+ parent: ClothingBackpackDuffelClown
+ id: ClothingBackpackDuffelSyndicateCostumeClown
+ name: clown costume duffelbag
+ description: "Contains a complete Clown outfit."
+ components:
+ - type: StorageFill
+ contents:
+ - name: ClothingUniformJumpsuitClown
+ - name: ClothingShoesClown
+ - name: ClothingMaskClown
+ - name: BikeHorn
+ - name: ClownPDA
+ - name: ClothingHeadsetService
+ - type: Storage
+ capacity: 30
diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml
index 1c1542f2ef..6a5d0c75d5 100644
--- a/Resources/Prototypes/Catalog/uplink_catalog.yml
+++ b/Resources/Prototypes/Catalog/uplink_catalog.yml
@@ -1,17 +1,238 @@
+# Guns
+
- type: uplinkListing
id: UplinkPistolClarissa
category: Weapons
itemId: PistolClarissa
- price: 15
+ price: 6
+
+- type: uplinkListing
+ id: UplinkRevolverInspector
+ category: Weapons
+ itemId: RevolverInspector
+ price: 8
+
+# Inbuilt suppressor so it's sneaky + more expensive.
+- type: uplinkListing
+ id: UplinkPistolMandella
+ category: Weapons
+ itemId: PistolMandella
+ price: 8
+
+#- type: uplinkListing
+# id: UplinkCrossbowEnergyMini
+# category: Weapons
+# itemId: CrossbowEnergyMini
+# price: 8
+
+# bug swept to make
+#- type: uplinkListing
+# id: UplinkESword
+# category: Weapons
+# itemId: ESword
+# price: 8
+
+# bug swept to make
+#- type: uplinkListing
+# id: UplinkDoubleBladedESword
+# category: Weapons
+# itemId: DoubleBladedESword
+# price: 16
+
+# bug swept to make
+#- type: uplinkListing
+# id: UplinkEnergyDagger
+# category: Weapons
+# itemId: EnergyDagger
+# price: 2
+
+# Explosives
+
+- type: uplinkListing
+ id: UplinkExplosiveGrenade
+ category: Explosives
+ itemId: ExGrenade
+ price: 4
+
+- type: uplinkListing
+ id: UplinkExplosiveGrenadeFlash
+ category: Explosives
+ itemId: GrenadeFlashBang
+ price: 4
+
+- type: uplinkListing
+ id: UplinkSyndieMiniBomb
+ category: Explosives
+ itemId: SyndieMiniBomb
+ price: 6
+
+#- type: uplinkListing
+# id: UplinkExplosiveC4
+# category: Weapons
+# itemId: ExplosiveC4
+# price: 5
+
+#- type: uplinkListing
+# id: UplinkDuffelExplosiveC4
+# category: Weapons
+# itemId: DuffelExplosiveC4
+# price: 15
+
+# Ammo
- type: uplinkListing
id: UplinkPistol9mmMagazine
category: Ammo
itemId: magazine_9mm
+ price: 2
+
+# For the Mandella
+- type: uplinkListing
+ id: UplinkMagazineClRiflePistol
+ category: Ammo
+ itemId: MagazineClRiflePistol
+ price: 2
+
+# For the Inspector
+- type: uplinkListing
+ id: UplinkSLMagnum
+ category: Ammo
+ itemId: SLMagnum
+ price: 2
+
+# Bundles
+
+- type: uplinkListing
+ id: UplinkC20RBundle
+ category: Bundles
+ itemId: ClothingBackpackDuffelSyndicateFilledSMG
+ price: 14
+
+- type: uplinkListing
+ id: UplinkBojevicBundle
+ category: Bundles
+ itemId: ClothingBackpackDuffelSyndicateFilledShotgun
+ price: 13
+
+- type: uplinkListing
+ id: UplinkL6SawBundle
+ category: Bundles
+ itemId: ClothingBackpackDuffelSyndicateFilledLMG
+ price: 18
+
+- type: uplinkListing
+ id: UplinkGrenadeLauncherBundle
+ category: Bundles
+ itemId: ClothingBackpackDuffelSyndicateFilledGrenadeLauncher
+ price: 25
+
+# Tools
+
+- type: uplinkListing
+ id: UplinkToolbox
+ category: Tools
+ itemId: ToolboxSyndicateFilled
price: 5
+- type: uplinkListing
+ id: UplinkSyndicateJawsOfLife
+ category: Tools
+ itemId: SyndicateJawsOfLife
+ price: 2
+
+- type: uplinkListing
+ id: UplinkDuffelSurgery
+ category: Tools
+ itemId: ClothingBackpackDuffelSyndicateFilledMedical
+ price: 5
+
+- type: uplinkListing
+ id: UplinkCarpDehydrated
+ category: Tools
+ itemId: DehydratedSpaceCarp
+ price: 5
+
+# Armor
+
+# Should be cameleon shoes, change when implemented.
+- type: uplinkListing
+ id: UplinkClothingNoSlipsShoes
+ category: Armor
+ itemId: ClothingShoesChameleonNoSlips
+ price: 2
+
+- type: uplinkListing
+ id: UplinkClothingOuterVestWeb
+ category: Armor
+ itemId: ClothingOuterVestWeb
+ price: 5
+
+- type: uplinkListing
+ id: UplinkHardsuitSyndie
+ category: Armor
+ itemId: ClothingOuterHardsuitSyndie
+ price: 5
+
+- type: uplinkListing
+ id: UplinkHardsuitSyndieHelmet
+ category: Armor
+ itemId: ClothingHeadHelmetHardsuitSyndie
+ price: 5
+
+# Misc
+
+- type: uplinkListing
+ id: UplinkBalloon
+ category: Misc
+ itemId: BalloonSyn
+ price: 20
+
+- type: uplinkListing
+ id: UplinkDecoyDisk
+ category: Misc
+ itemId: NukeDiskFake
+ price: 1
+
+- type: uplinkListing
+ id: UplinkRevolverCapGun
+ category: Misc
+ itemId: RevolverCapGun
+ price: 4
+
- type: uplinkListing
id: UplinkPen
- category: Utility
+ category: Misc
itemId: Pen
price: 2
+
+- type: uplinkListing
+ id: UplinkSoapSyndie
+ category: Misc
+ itemId: SoapSyndie
+ price: 1
+
+- type: uplinkListing
+ id: UplinkUltrabrightLantern
+ category: Misc
+ itemId: lanternextrabright
+ price: 2
+
+#- type: uplinkListing
+# id: UplinkTelecrystal
+# category: Misc
+# itemId: Telecrystal
+# price: 1
+
+# Pointless
+
+- type: uplinkListing
+ id: UplinkCostumeCentcom
+ category: Pointless
+ itemId: ClothingBackpackDuffelSyndicateCostumeCentcom
+ price: 4
+
+- type: uplinkListing
+ id: UplinkCostumeClown
+ category: Pointless
+ itemId: ClothingBackpackDuffelSyndicateCostumeClown
+ price: 4
diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
index 34489d77ae..af8bdb86c9 100644
--- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
+++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
@@ -125,3 +125,14 @@
sprite: Clothing/Hands/Gloves/spaceninja.rsi
- type: Clothing
sprite: Clothing/Hands/Gloves/spaceninja.rsi
+
+- type: entity
+ parent: ClothingHandsBase
+ id: ClothingHandsGlovesCombat
+ name: combat gloves
+ description: These tactical gloves are fireproof and shock resistant.
+ components:
+ - type: Sprite
+ sprite: Clothing/Hands/Gloves/Color/black.rsi
+ - type: Clothing
+ sprite: Clothing/Hands/Gloves/Color/black.rsi
diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
index 37e5bb9aa0..5ad0b459a6 100644
--- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
+++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
@@ -79,3 +79,13 @@
sprite: Clothing/Shoes/Specific/wizard.rsi
- type: Clothing
sprite: Clothing/Shoes/Specific/wizard.rsi
+
+- type: entity
+ parent: ClothingShoesColorBlack
+ id: ClothingShoesChameleonNoSlips
+ name: no-slip shoes
+ #name: no-slip chameleon shoes
+ #description: These shoes have an action button to change shape, but unlike the chameleon shoes from the kit they also protect you from slips.
+ description: These protect you from slips while looking like normal sneakers.
+ components:
+ - type: NoSlip
diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml
index 740398223d..9d7a21edee 100644
--- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml
@@ -1,3 +1,14 @@
+- type: entity
+ parent: ClothingUniformBase
+ id: ClothingUniformJumpsuitAncient
+ name: ancient jumpsuit
+ description: A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Jumpsuit/ancient.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Jumpsuit/ancient.rsi
+
- type: entity
parent: ClothingUniformBase
id: ClothingUniformJumpsuitBartender
@@ -74,6 +85,28 @@
- type: Clothing
sprite: Clothing/Uniforms/Jumpsuit/chaplain.rsi
+- type: entity
+ parent: ClothingUniformBase
+ id: ClothingUniformJumpsuitCentcomOfficial
+ name: centcom official's jumpsuit
+ description: It's a jumpsuit worn by CentCom's officials.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Jumpsuit/centcom_official.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Jumpsuit/centcom_official.rsi
+
+- type: entity
+ parent: ClothingUniformBase
+ id: ClothingUniformJumpsuitCentcomOfficer
+ name: centcom officer's jumpsuit
+ description: It's a jumpsuit worn by CentCom Officers.
+ components:
+ - type: Sprite
+ sprite: Clothing/Uniforms/Jumpsuit/centcom_officer.rsi
+ - type: Clothing
+ sprite: Clothing/Uniforms/Jumpsuit/centcom_officer.rsi
+
- type: entity
parent: ClothingUniformBase
id: ClothingUniformJumpsuitChef
diff --git a/Resources/Prototypes/Entities/Constructible/Power/arcade.yml b/Resources/Prototypes/Entities/Constructible/Power/arcade.yml
index 59a771a9e9..f670343f7e 100644
--- a/Resources/Prototypes/Entities/Constructible/Power/arcade.yml
+++ b/Resources/Prototypes/Entities/Constructible/Power/arcade.yml
@@ -62,6 +62,7 @@
- type: entity
id: RandomArcade
name: Random Arcade Spawner
+ parent: MarkerBase
components:
- type: RandomArcade
- type: Sprite
diff --git a/Resources/Prototypes/Entities/Constructible/Specific/Conveyor/conveyor.yml b/Resources/Prototypes/Entities/Constructible/Specific/Conveyor/conveyor.yml
index 3a6e2f43bc..a456138250 100644
--- a/Resources/Prototypes/Entities/Constructible/Specific/Conveyor/conveyor.yml
+++ b/Resources/Prototypes/Entities/Constructible/Specific/Conveyor/conveyor.yml
@@ -27,6 +27,7 @@
drawdepth: FloorObjects
- type: SignalReceiver
maxTransmitters: 1
+ - type: PowerReceiver
- type: Conveyor
- type: Appearance
visuals:
@@ -34,7 +35,6 @@
state_running: conveyor_started_cw
state_stopped: conveyor_stopped_cw
state_reversed: conveyor_started_cw_r
- - type: PowerReceiver
- type: Construction
graph: ConveyorGraph
node: entity
diff --git a/Resources/Prototypes/Entities/Constructible/Specific/cargo_telepad.yml b/Resources/Prototypes/Entities/Constructible/Specific/cargo_telepad.yml
new file mode 100644
index 0000000000..7d1fe9fb29
--- /dev/null
+++ b/Resources/Prototypes/Entities/Constructible/Specific/cargo_telepad.yml
@@ -0,0 +1,29 @@
+- type: entity
+ name: cargo telepad
+ id: cargoTelepad
+ description: "Temporary cargo delivery for developing Nanotrasen stations! Warning: destroying this while goods are in transit will lose them forever!"
+ placement:
+ mode: SnapgridCenter
+ components:
+ - type: Clickable
+ - type: InteractionOutline
+ - type: Physics
+ mass: 25
+ anchored: true
+ shapes:
+ - !type:PhysShapeAabb
+ bounds: "-0.45, -0.45, 0.00, 0.45"
+ layer: [ Passable ]
+ - type: Sprite
+ sprite: Constructible/Power/cargo_teleporter.rsi
+ state: pad-offline
+ - type: Damageable
+ resistances: metallicResistances
+ - type: Destructible
+ thresholds:
+ 75:
+ Acts: ["Destruction"]
+ - type: Anchorable
+ - type: Pullable
+ - type: PowerReceiver
+ - type: CargoTelepad
diff --git a/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml b/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml
index 68d1485e5f..71939a4229 100644
--- a/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml
+++ b/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml
@@ -1,21 +1,10 @@
- type: entity
name: base conditional spawner
id: BaseConditionalSpawner
+ parent: MarkerBase
abstract: true
components:
- - type: Sprite
- netsync: false
- visible: false
- sprite: Interface/Misc/markers.rsi
- state: cross_blue
-
- - type: Marker
- - type: Clickable
- - type: InteractionOutline
- - type: Physics
- type: ConditionalSpawner
- placement:
- mode: AlignTileAny
- type: entity
name: Suspicion Rifle Spawner
diff --git a/Resources/Prototypes/Entities/Effects/Markers/marker_base.yml b/Resources/Prototypes/Entities/Effects/Markers/marker_base.yml
index 66c9fa0352..9ef628f01e 100644
--- a/Resources/Prototypes/Entities/Effects/Markers/marker_base.yml
+++ b/Resources/Prototypes/Entities/Effects/Markers/marker_base.yml
@@ -5,12 +5,13 @@
- type: Marker
- type: Clickable
- type: InteractionOutline
- - type: Physics
- type: Sprite
netsync: false
visible: false
sprite: Interface/Misc/markers.rsi
state: cross_blue
+ placement:
+ mode: AlignTileAny
diff --git a/Resources/Prototypes/Entities/Effects/Markers/spawn_points.yml b/Resources/Prototypes/Entities/Effects/Markers/spawn_points.yml
index 897cd496e7..3b1faefe13 100644
--- a/Resources/Prototypes/Entities/Effects/Markers/spawn_points.yml
+++ b/Resources/Prototypes/Entities/Effects/Markers/spawn_points.yml
@@ -1,21 +1,10 @@
- type: entity
name: spawn point
id: SpawnPoint
+ parent: MarkerBase
abstract: true
components:
- - type: Sprite
- netsync: false
- visible: false
- sprite: Interface/Misc/markers.rsi
- state: cross_blue
-
- type: SpawnPoint
- - type: Marker
- - type: Clickable
- - type: InteractionOutline
- - type: Physics
- placement:
- mode: AlignTileAny
- type: entity
name: latejoin spawn point
diff --git a/Resources/Prototypes/Entities/Effects/Markers/toy_spawner.yml b/Resources/Prototypes/Entities/Effects/Markers/toy_spawner.yml
index 96e9b06f2a..cbd285d48e 100644
--- a/Resources/Prototypes/Entities/Effects/Markers/toy_spawner.yml
+++ b/Resources/Prototypes/Entities/Effects/Markers/toy_spawner.yml
@@ -1,17 +1,13 @@
- type: entity
name: Toy Spawner
id: ToySpawner
+ parent: MarkerBase
components:
- type: Sprite
netsync: false
visible: false
sprite: Interface/Misc/markers.rsi
state: spawner_toy
-
- - type: Marker
- - type: Clickable
- - type: InteractionOutline
- - type: Physics
- type: TrashSpawner
rarePrototypes:
- CarvingHelpMe
@@ -32,23 +28,17 @@
- ToyMouse
chance: 0.5
offset: 0.2
- placement:
- mode: AlignTileAny
- type: entity
name: Figure Spawner
id: FigureSpawner
+ parent: MarkerBase
components:
- type: Sprite
netsync: false
visible: false
sprite: Interface/Misc/markers.rsi
state: spawner_figure
-
- - type: Marker
- - type: Clickable
- - type: InteractionOutline
- - type: Physics
- type: TrashSpawner
prototypes:
- ToyAi
@@ -72,5 +62,3 @@
- ToySkeleton
chance: 0.5
offset: 0.2
- placement:
- mode: AlignTileAny
diff --git a/Resources/Prototypes/Entities/Objects/Consumable/food.yml b/Resources/Prototypes/Entities/Objects/Consumable/food.yml
index 84197458e6..0d5a0f08e2 100644
--- a/Resources/Prototypes/Entities/Objects/Consumable/food.yml
+++ b/Resources/Prototypes/Entities/Objects/Consumable/food.yml
@@ -1763,25 +1763,6 @@
sprite: Objects/Consumable/Food/hburger.rsi
- type: Grindable
-- type: entity
- parent: FoodBase
- id: FoodMonkeyCube
- name: monkey cube
- description: Just add water!
- components:
- - type: SolutionContainer
- contents:
- reagents:
- - ReagentId: chem.Nutriment
- Quantity: 10
- maxVol: 11 # needs room for water
- caps: AddTo, RemoveFrom, FitsInDispenser
- - type: Sprite
- sprite: Objects/Consumable/Food/monkeycube.rsi
- - type: Rehydratable
- target: MonkeyMob_Content
- - type: Grindable
-
- type: entity
parent: FoodBase
id: FoodMonkeysDelight
@@ -2997,4 +2978,3 @@
sprite: Objects/Consumable/Food/memoryleek.rsi
state: memoryLeek
- type: Grindable
-
diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml
index d4fe1f426f..f39b7d6e0d 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml
@@ -350,3 +350,12 @@
state: pda-security
- type: Icon
state: pda-security
+
+- type: entity
+ name: Centcom PDA
+ parent: AssistantPDA
+ id: CentcomPDA
+ description: Colored the numbing grey of bureaucracy.
+ components:
+ - type: PDA
+ idCard: CentcomIDCardSyndie
diff --git a/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml
new file mode 100644
index 0000000000..c1107f0d7f
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Misc/dat_fukken_disk.yml
@@ -0,0 +1,19 @@
+- type: entity
+ name: nuclear authentication disk
+ parent: BaseItem
+ id: NukeDisk
+ description: GET DAT FUCKKEN DISK
+ components:
+ - type: Sprite
+ netsync: false
+ sprite: Objects/Misc/nukedisk.rsi
+ state: icon
+ - type: Item
+ size: 12
+ sprite: Objects/Misc/nukedisk.rsi
+ state: icon
+
+- type: entity
+ parent: NukeDisk
+ id: NukeDiskFake
+ description: GET DAT FUCK- wait a second...
diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml
index 16617ddfc2..91916f84af 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml
@@ -7,7 +7,6 @@
components:
- type: Sprite
sprite: Objects/Misc/id_cards.rsi
-
- type: Clothing
Slots:
- idcard
@@ -26,9 +25,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idassistant
-
- type: PresetIdCard
job: Assistant
@@ -40,9 +37,7 @@
- type: Sprite
layers:
- state: gold
- - state: assigned
- state: idcaptain
-
- type: Clothing
HeldPrefix: gold
- type: PresetIdCard
@@ -56,9 +51,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idsecurityofficer
-
- type: PresetIdCard
job: SecurityOfficer
@@ -70,9 +63,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idwarden
-
- type: PresetIdCard
job: Warden
@@ -84,9 +75,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idstationengineer
-
- type: PresetIdCard
job: StationEngineer
@@ -98,9 +87,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idmedicaldoctor
-
- type: PresetIdCard
job: MedicalDoctor
@@ -112,9 +99,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idcargotechnician
-
- type: PresetIdCard
job: CargoTechnician
@@ -126,9 +111,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idquartermaster
-
- type: PresetIdCard
job: Quartermaster
@@ -140,9 +123,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idscientist
-
- type: PresetIdCard
job: Scientist
@@ -154,9 +135,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idclown
-
- type: PresetIdCard
job: Clown
@@ -168,9 +147,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idmime
-
- type: PresetIdCard
job: Mime
@@ -182,7 +159,7 @@
# - type: Sprite
# layers:
# - state: default
-# - state: assigned
+#
# - state: idchaplain
#
# - type: PresetIdCard
@@ -196,9 +173,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idjanitor
-
- type: PresetIdCard
job: Janitor
@@ -210,9 +185,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idbartender
-
- type: PresetIdCard
job: Bartender
@@ -224,9 +197,7 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idcook
-
- type: PresetIdCard
job: Chef
@@ -238,13 +209,10 @@
- type: Sprite
layers:
- state: default
- - state: assigned
- state: idbotanist
-
- type: PresetIdCard
job: Botanist
-
- type: entity
parent: IDCardStandard
id: HoPIDCard
@@ -253,9 +221,7 @@
- type: Sprite
layers:
- state: silver
- - state: assigned
- state: idheadofpersonnel
-
- type: Clothing
HeldPrefix: silver
- type: PresetIdCard
@@ -269,9 +235,7 @@
- type: Sprite
layers:
- state: silver
- - state: assigned
- state: idchiefengineer
-
- type: Clothing
HeldPrefix: silver
- type: PresetIdCard
@@ -285,9 +249,7 @@
- type: Sprite
layers:
- state: silver
- - state: assigned
- state: idchiefmedicalofficer
-
- type: Clothing
HeldPrefix: silver
- type: PresetIdCard
@@ -301,9 +263,7 @@
- type: Sprite
layers:
- state: silver
- - state: assigned
- state: idresearchdirector
-
- type: Clothing
HeldPrefix: silver
- type: PresetIdCard
@@ -317,9 +277,7 @@
- type: Sprite
layers:
- state: silver
- - state: assigned
- state: idheadofsecurity
-
- type: Clothing
HeldPrefix: silver
- type: PresetIdCard
@@ -333,9 +291,7 @@
- type: Sprite
layers:
- state: gold
- - state: assigned
- state: idcentcom
-
- type: Clothing
HeldPrefix: gold
- type: IdCard
@@ -364,3 +320,19 @@
- Kitchen
- Janitor
- Theatre
+
+- type: entity
+ parent: IDCardStandard
+ id: CentcomIDCardSyndie
+ name: Centcom ID card
+ components:
+ - type: Sprite
+ layers:
+ - state: centcom
+ - type: Clothing
+ HeldPrefix: blue
+ - type: IdCard
+ jobTitle: Central Commander
+ - type: Access
+ tags:
+ - Maintenance
diff --git a/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml b/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml
new file mode 100644
index 0000000000..8039c156e5
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Specific/rehydrateable.yml
@@ -0,0 +1,34 @@
+- type: entity
+ parent: FoodBase
+ id: MonkeyCube
+ name: monkey cube
+ description: Just add water!
+ components:
+ - type: SolutionContainer
+ contents:
+ reagents:
+ - ReagentId: chem.Nutriment
+ Quantity: 10
+ maxVol: 11 # needs room for water
+ caps: AddTo, RemoveFrom, FitsInDispenser
+ - type: Sprite
+ sprite: Objects/Consumable/Food/monkeycube.rsi
+ - type: Rehydratable
+ target: MonkeyMob_Content
+ - type: Grindable
+
+- type: entity
+ parent: PlushieCarp
+ id: DehydratedSpaceCarp
+ name: dehydrated space carp
+ description: Looks like a plush toy carp, but just add water and it becomes a real-life space carp!
+ components:
+ - type: SolutionContainer
+ contents:
+ reagents:
+ - ReagentId: chem.Nutriment
+ Quantity: 10
+ maxVol: 11 # needs room for water
+ caps: AddTo, RemoveFrom, FitsInDispenser
+ - type: Rehydratable
+ target: CarpMob_Content
diff --git a/Resources/Prototypes/Entities/Objects/Tools/jaws-of-life.yml b/Resources/Prototypes/Entities/Objects/Tools/jaws-of-life.yml
new file mode 100644
index 0000000000..eaf81c2e3f
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Tools/jaws-of-life.yml
@@ -0,0 +1,41 @@
+- type: entity
+ name: jaws of life
+ parent: BaseItem
+ id: JawsOfLife
+ description: A set of jaws of life, compressed through the magic of science.
+ components:
+ - type: Sprite
+ sprite: Objects/Tools/jaws_of_life.rsi
+ state: jaws_pry
+ - type: Item
+ sprite: Objects/Tools/jaws_of_life.rsi
+ - type: TilePrying
+ - type: Tool
+ qualities:
+ - Prying
+ statusShowBehavior: true
+ - type: MultiTool
+ tools:
+ - behavior: Prying
+ state: jaws_pry
+ useSound: /Audio/Items/jaws_pry.ogg
+ changeSound: /Audio/Items/change_jaws.ogg
+ - behavior: Cutting
+ state: jaws_cutter
+ useSound: /Audio/Items/jaws_cut.ogg
+ changeSound: /Audio/Items/change_jaws.ogg
+
+- type: entity
+ name: syndicate jaws of life
+ parent: JawsOfLife
+ id: SyndicateJawsOfLife
+ description: Useful for entering the station or its departments.
+ components:
+ - type: Sprite
+ state: syn_jaws_pry
+ - type: MultiTool
+ tools:
+ - behavior: Prying
+ state: syn_jaws_pry
+ - behavior: Cutting
+ state: syn_jaws_cutter
diff --git a/Resources/Prototypes/Entities/Objects/Tools/lantern.yml b/Resources/Prototypes/Entities/Objects/Tools/lantern.yml
index a8f62030fd..e50fc08d74 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/lantern.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/lantern.yml
@@ -27,3 +27,16 @@
- type: Appearance
visuals:
- type: LanternVisualizer
+
+- type: entity
+ name: extra-bright lantern
+ parent: lantern
+ id: lanternextrabright
+ description: Blinding.
+ components:
+ - type: PointLight
+ enabled: false
+ radius: 5
+ energy: 10
+ color: "#FFC458"
+ - type: LoopingSound
diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
index b310ee431a..282b5d590f 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
@@ -9,6 +9,7 @@
size: 9999
- type: ItemCooldown
- type: MeleeWeapon
+ damage: 10
hitSound: "/Audio/Weapons/smash.ogg"
- type: entity
@@ -98,7 +99,7 @@
sprite: Objects/Tools/Toolboxes/toolbox_green.rsi
- type: entity
- name: syndicate toolbox
+ name: suspicious toolbox
parent: ToolboxBase
id: ToolboxSyndicate
description: A sinister looking toolbox filled with elite syndicate tools.
@@ -108,6 +109,24 @@
state: icon
- type: Item
sprite: Objects/Tools/Toolboxes/toolbox_syn.rsi
+ - type: MeleeWeapon
+ damage: 15
+
+- type: entity
+ id: ToolboxSyndicateFilled
+ name: suspicious toolbox
+ suffix: Filled
+ parent: ToolboxSyndicate
+ components:
+ - type: StorageFill
+ contents:
+ - name: Screwdriver
+ - name: Wrench
+ - name: Welder
+ - name: Crowbar
+ - name: Multitool
+ - name: Wirecutter
+ - name: ClothingHandsGlovesCombat
- type: entity
name: golden toolbox
diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml
index cafa7ee90f..b9fdc3a66f 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml
@@ -133,33 +133,6 @@
- Multitool
- type: SignalLinker
-- type: entity
- name: jaws of life
- parent: BaseItem
- id: JawsOfLife
- description: A set of jaws of life, compressed through the magic of science.
- components:
- - type: Sprite
- sprite: Objects/Tools/jaws_of_life.rsi
- state: jaws_pry
- - type: Item
- sprite: Objects/Tools/jaws_of_life.rsi
- - type: TilePrying
- - type: Tool
- qualities:
- - Prying
- statusShowBehavior: true
- - type: MultiTool
- tools:
- - behavior: Prying
- state: jaws_pry
- useSound: /Audio/Items/jaws_pry.ogg
- changeSound: /Audio/Items/change_jaws.ogg
- - behavior: Cutting
- state: jaws_cutter
- useSound: /Audio/Items/jaws_cut.ogg
- changeSound: /Audio/Items/change_jaws.ogg
-
- type: entity
name: power drill
parent: BaseItem
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
index 00df4ea10a..43d4ee7eb9 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
@@ -2,7 +2,7 @@
name: retro laser gun
parent: BaseItem
id: LaserGun
- description: A weapon using light amplified by the stimulated emission of radiation. Ancient inefficient model.
+ description: A weapon using light amplified by the stimulated emission of radiation.
components:
- type: Sprite
netsync: false
@@ -42,7 +42,7 @@
name: laser cannon
parent: BaseItem
id: LaserCannon
- description: With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!
+ description: Pew pew.
components:
- type: Sprite
netsync: false
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml
index 1708167025..fdf5f67b87 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml
@@ -38,7 +38,7 @@
name: L6 SAW
id: LMGL6
parent: LMGBase
- description: A rather traditionally made L6 SAW with a pleasantly lacquered wooden pistol grip. This one is unmarked.
+ description: A rather traditionally made LMG with a pleasantly lacquered wooden pistol grip.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/LMGs/l6.rsi
@@ -74,7 +74,7 @@
name: pulemyot kalashnikova
id: LMGPK
parent: LMGBase
- description: Kalashnikov's Machinegun, a well preserved and maintained antique weapon of war.
+ description: A well preserved and maintained antique weapon of war.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/LMGs/pk.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml
index 3b4d8fd1c0..b8cd8d9c9d 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml
@@ -15,7 +15,7 @@
name: china lake
parent: LauncherBase
id: LauncherChinaLake
- description: This centuries-old design was recently rediscovered and adapted for use in modern battlefields. Working similar to a pump-action combat shotgun, its light weight and robust design quickly made it a popular weapon. It uses specialised grenade shells.
+ description: PLOOP
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Launchers/china_lake.rsi
@@ -48,7 +48,7 @@
name: RPG-7
parent: LauncherBase
id: LauncherRocket
- description: A modified ancient rocket-propelled grenade launcher, this design is centuries old, but well preserved.
+ description: A modified ancient rocket-propelled grenade launcher.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Launchers/rocket.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml
index c4d8aa2b28..c979894e65 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml
@@ -108,7 +108,7 @@
name: giskard
parent: PistolBase
id: PistolGiskard
- description: A popular "Frozen Star" brand pocket pistol chambered for the ubiquitous .35 auto round. Uses standard capacity magazines.
+ description: A popular "Frozen Star" brand pocket pistol.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/giskard.rsi
@@ -219,7 +219,7 @@
name: mandella
parent: PistolBase
id: PistolMandella
- description: A rugged, robust operator handgun with inbuilt silencer. Chambered in caseless rifle ammunition, this time-tested handgun is your absolute choice if you need to take someone down silently, as it's deadly, produces no sound, and leaves no trace.
+ description: A rugged, robust operator handgun with inbuilt silencer.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/mandella.rsi
@@ -253,7 +253,7 @@
name: mk 58
parent: PistolBase
id: PistolMk58
- description: The NT Mk58 is a cheap, ubiquitous sidearm, that was produced by a NanoTrasen subsidiary.
+ description: A cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/mk58.rsi
@@ -285,7 +285,7 @@
name: mk 58 (wood)
parent: PistolBase
id: PistolMk58Wood
- description: The NT Mk58 is a cheap, ubiquitous sidearm, that was produced by a NanoTrasen subsidiary.
+ description: A cheap, ubiquitous sidearm, that was produced by a NanoTrasen subsidiary.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/mk58_wood.rsi
@@ -317,7 +317,7 @@
name: molly
parent: PistolBase
id: PistolMolly
- description: An experimental fully automatic pistol, designed as a middle ground between SMGs and Pistols. Primarily employed in CQC scenarios or as a civilian self defence tool. Takes both highcap pistol and smg mags.
+ description: An experimental fully automatic pistol.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/molly.rsi
@@ -347,7 +347,7 @@
name: olivaw
parent: PistolBase
id: PistolOlivaw
- description: A popular "Frozen Star" machine pistol. This one has a two-round burst-fire mode and is chambered for .35 auto. It can use normal and high capacity magazines.
+ description: A popular "Frozen Star" machine pistol.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/olivaw_civil.rsi
@@ -380,7 +380,7 @@
name: paco
parent: PistolBase
id: PistolPaco
- description: A modern and reliable sidearm for the soldier in the field. Commonly issued as a sidearm to Ironhammer Operatives.
+ description: A modern and reliable sidearm for the soldier in the field.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/paco.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml
index 1d144ed9e7..161e87fa22 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml
@@ -34,7 +34,7 @@
name: AKMS
parent: RifleBase
id: RifleAk
- description: Weapon of the oppressed, oppressors, and extremists of all flavours. This is a copy of an ancient semi-automatic rifle chambered for .30 Rifle. If it won't fire, percussive maintenance should get it working again. It is known for its easy maintenance, and low price. This gun is not in active military service anymore, but has become ubiquitous among criminals and insurgents. This is a high-quality copy, which has an automatic fire mode.
+ description: An iconic weapon of war.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/ak.rsi
@@ -73,7 +73,7 @@
name: black AK
parent: RifleBase
id: RifleBlackAk
- description: Weapon of the oppressed, oppressors, and extremists of all flavours. This is a copy of an ancient semi-automatic rifle chambered for .30 Rifle. If it won't fire, percussive maintenance should get it working again. It is known for its easy maintenance, and low price. This gun is not in active military service anymore, but has become ubiquitous among criminals and insurgents. This is a high-quality copy, which has an automatic fire mode.
+ description: An iconic weapon of war; painted black.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/black_ak.rsi
@@ -112,7 +112,7 @@
name: Z8 Bulldog
parent: RifleBase
id: RifleCarbine
- description: The Z8 Bulldog is an older bullpup carbine model, made by Frozen Star.
+ description: An older bullpup carbine model, made by Frozen Star.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/carbine.rsi
@@ -155,7 +155,7 @@
name: Dallas
parent: RifleBase
id: RifleDallas
- description: Dallas is a pulse-action air-cooled automatic assault rifle made by unknown manufacturer. This weapon is very rare, but deadly efficient. It's used by elite mercenaries, assassins or bald marines.
+ description: A pulse-action air-cooled automatic assault rifle.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/dallas.rsi
@@ -195,7 +195,7 @@
name: STS-35
parent: RifleBase
id: RifleSTS
- description: The rugged STS-35 is a durable automatic weapon, popular on frontier worlds. Uses .30 Rifle rounds. This one is unmarked.
+ description: A rugged and durable automatic weapon.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/sts.rsi
@@ -237,7 +237,7 @@
name: Vintorez
parent: RifleBase
id: RifleVintorez
- description: This gun is a copy of a design from a country that no longer exists. It is still highly prized for its armor piercing capabilities.
+ description: Highly prized for its armor piercing capabilities.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/vintorez.rsi
@@ -276,7 +276,7 @@
name: Wintermute
parent: RifleBase
id: RifleWintermute
- description: A high end military grade assault rifle, designed as a modern ballistic infantry weapon. Primarily used by and produced for IH troops.
+ description: A high end military grade assault rifle.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/wintermute.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml
index e044460f3e..171c3ac910 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml
@@ -122,7 +122,7 @@
name: Drozd
parent: SmgBase
id: SmgDrozd
- description: An excellent fully automatic Heavy SMG. Rifled to take a larger caliber than a typical submachine gun, but unlike other heavy SMGs makes use of increased caliber to achieve excellent armor penetration capabilities. Suffers a bit less from poor recoil control and has worse than average fire rate.
+ description: An excellent fully automatic Heavy SMG.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/SMGs/drozd.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml
index 36978465b2..9e43bdc4a0 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml
@@ -32,7 +32,7 @@
name: Bojevic
parent: ShotgunBase
id: ShotgunBojevic
- description: It's a magazine-fed shotgun designed for close quarters combat, nicknamed 'Striker' by boarding parties. A robust and reliable design allows you to swap magazines on the go and dump as many shells at your foes as you want... if you can manage the recoil, of course.
+ description: It's a magazine-fed shotgun designed for close quarters combat.
components:
- type: Sprite
netsync: false
@@ -120,7 +120,7 @@
name: Bull
parent: ShotgunBase
id: ShotgunBull
- description: A Frozen Star pump-action shotgun. A marvel of engineering, this gun is often used by Ironhammer tactical units. Due to shorter than usual barrels, recoil kicks slightly harder.
+ description: A Frozen Star pump-action shotgun.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/bull.rsi
@@ -150,7 +150,7 @@
name: Gladstone
parent: ShotgunBase
id: ShotgunGladstone
- description: It is a next-generation Frozen Star shotgun intended as a cost-effective competitor to the aging NT "Regulator 1000". It has a semi-rifled lightweight full-length barrel which gives it exceptional accuracy with all types of ammunition, with a high-capacity magazine tube below it.
+ description: A next-generation Frozen Star shotgun.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/gladstone.rsi
@@ -167,7 +167,7 @@
name: Regulator 1000
parent: ShotgunBase
id: ShotgunRegulator
- description: Designed for close quarters combat, the Regulator is widely regarded as a weapon of choice for repelling boarders. Some may say that it's too old, but it actually proved itself useful.
+ description: Ol' reliable.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/regulator.rsi
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml
index 5718881ebe..3b7cb37869 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml
@@ -34,7 +34,7 @@
name: Kardashev-Mosin
parent: SniperBase
id: SniperBoltGun
- description: Weapon for hunting, or endless trench warfare. If you’re on a budget, it’s a darn good rifle for just about everything.
+ description: Weapon for hunting, or endless trench warfare.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Snipers/bolt_gun.rsi
@@ -50,7 +50,7 @@
name: Kardashev-Mosin
parent: SniperBase
id: SniperBoltGunWood
- description: Weapon for hunting, or endless trench warfare. If you’re on a budget, it’s a darn good rifle for just about everything.
+ description: Weapon for hunting, or endless trench warfare.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi
@@ -64,7 +64,7 @@
name: Hristov
parent: SniperBase
id: SniperHeavy
- description: A portable anti-armour rifle, fitted with a scope, it was originally designed for use against armoured exosuits. It is capable of punching through windows and non-reinforced walls with ease. Fires armor piercing 14.5mm shells.
+ description: A portable anti-armour rifle. Fires armor piercing 14.5mm shells.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Snipers/heavy_sniper.rsi
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
index 80b764c620..5f9d492902 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml
@@ -4,7 +4,7 @@
positions: 2
spawnPositions: 1
startingGear: CargoTechGear
- department:
+ departments:
- Cargo
icon: "CargoTechnician"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
index c733b02d29..9c2ac826f0 100644
--- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
+++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml
@@ -4,7 +4,7 @@
positions: 1
spawnPositions: 1
startingGear: QuartermasterGear
- department:
+ departments:
- Cargo
icon: "QuarterMaster"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml b/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
index 3df6e98b9d..07a5162534 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml
@@ -3,7 +3,7 @@
name: "assistant"
positions: -1 # Treated as infinite.
startingGear: AssistantGear
- department:
+ departments:
- Civilian
icon: "Assistant"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
index c40b5162c0..04d367ae25 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml
@@ -3,7 +3,7 @@
name: "bartender"
positions: 1
startingGear: BartenderGear
- department:
+ departments:
- Civilian
icon: "Bartender"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
index 7d20c703bc..94c8d0ab37 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml
@@ -4,7 +4,7 @@
positions: 2
spawnPositions: 2
startingGear: BotanistGear
- department:
+ departments:
- Civilian
icon: "Botanist"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
index bb67525c43..3f4736aa89 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml
@@ -3,7 +3,7 @@
# name: "chaplain"
# positions: 1
# startingGear: ChaplainGear
-# department:
+# departments:
# - Civilian
# icon: "Chaplain"
# access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
index 0c06658301..bc62b37288 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml
@@ -3,7 +3,7 @@
name: "chef"
positions: 1
startingGear: ChefGear
- department:
+ departments:
- Civilian
icon: "Chef"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
index c709f8ff76..15bdd058e8 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml
@@ -3,7 +3,7 @@
name: "clown"
positions: 1
startingGear: ClownGear
- department:
+ departments:
- Civilian
icon: "Clown"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
index 8701597c8a..5b5f6824d5 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml
@@ -3,7 +3,7 @@
name: "janitor"
positions: 1
startingGear: JanitorGear
- department:
+ departments:
- Civilian
icon: "Janitor"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
index 4e0dd184d6..c2053ca915 100644
--- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
+++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
@@ -3,7 +3,7 @@
name: "mime"
positions: 1
startingGear: MimeGear
- department:
+ departments:
- Civilian
icon: "Mime"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
index 849e517d00..2000efb720 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml
@@ -4,7 +4,7 @@
head: true
positions: 1
startingGear: CaptainGear
- department:
+ departments:
- Command
icon: "Captain"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
index 716e0ded13..ec51cd6a54 100644
--- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
+++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml
@@ -4,7 +4,7 @@
head: true
positions: 1
startingGear: HoPGear
- department:
+ departments:
- Command
- Civilian
icon: "HeadOfPersonnel"
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
index 7ebf03b75b..fea846c5a4 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml
@@ -4,7 +4,7 @@
head: true
positions: 1
startingGear: ChiefEngineerGear
- department:
+ departments:
- Command
- Engineering
icon: "ChiefEngineer"
diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
index 0e3e49807c..d99ed5d635 100644
--- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml
@@ -4,7 +4,7 @@
positions: 3
spawnPositions: 2
startingGear: StationEngineerGear
- department:
+ departments:
- Engineering
icon: "StationEngineer"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
index 7eb6037b6c..570a0c0c88 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml
@@ -6,7 +6,7 @@
head: true
positions: 1
startingGear: CMOGear
- department:
+ departments:
- Command
- Medical
icon: "ChiefMedicalOfficer"
diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
index 8e4e3b6080..55b09224aa 100644
--- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
+++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml
@@ -4,7 +4,7 @@
positions: 3
spawnPositions: 2
startingGear: DoctorGear
- department:
+ departments:
- Medical
icon: "MedicalDoctor"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
index 9034e9a6b5..791d95ab78 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml
@@ -4,7 +4,7 @@
head: true
positions: 1
startingGear: ResearchDirectorGear
- department:
+ departments:
- Command
- Science
icon: "ResearchDirector"
diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
index 72ae62d7c8..dd32adf4fb 100644
--- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
+++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml
@@ -4,7 +4,7 @@
positions: 3
spawnPositions: 2
startingGear: ScientistGear
- department:
+ departments:
- Science
icon: "Scientist"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
index 0e24f9ebdb..bc170284fa 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml
@@ -4,7 +4,7 @@
head: true
positions: 1
startingGear: HoSGear
- department:
+ departments:
- Command
- Security
icon: "HeadOfSecurity"
diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
index 3bd87c2371..2cb0c2efdf 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml
@@ -4,7 +4,7 @@
positions: 3
spawnPositions: 2
startingGear: SecurityOfficerGear
- department:
+ departments:
- Security
icon: "SecurityOfficer"
access:
diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
index d659f558ea..5780ffd4d7 100644
--- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml
+++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml
@@ -4,7 +4,7 @@
positions: 1
spawnPositions: 1
startingGear: WardenGear
- department:
+ departments:
- Security
icon: "Warden"
access:
diff --git a/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/icon-ammo.png b/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/icon-ammo.png
new file mode 100644
index 0000000000..8f16dfb352
Binary files /dev/null and b/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/icon-ammo.png differ
diff --git a/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/icon-med.png b/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/icon-med.png
new file mode 100644
index 0000000000..210878cb81
Binary files /dev/null and b/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/icon-med.png differ
diff --git a/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/meta.json b/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/meta.json
index 89236692cc..32bf2ce77e 100644
--- a/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/meta.json
+++ b/Resources/Textures/Clothing/Back/Duffels/syndicate.rsi/meta.json
@@ -11,6 +11,14 @@
"name": "icon",
"directions": 1
},
+ {
+ "name": "icon-ammo",
+ "directions": 1
+ },
+ {
+ "name": "icon-med",
+ "directions": 1
+ },
{
"name": "equipped-BACKPACK",
"directions": 4
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 0000000000..e74a13048f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/icon.png
new file mode 100644
index 0000000000..61b1d0694a
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/inhand-left.png
new file mode 100644
index 0000000000..ae15d262d7
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/inhand-right.png
new file mode 100644
index 0000000000..60bea1b51a
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/meta.json
new file mode 100644
index 0000000000..b361c3328c
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/ancient.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit (Will update when PR'd)",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon",
+ "directions": 1
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 0000000000..c0c5f8ad07
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/icon.png
new file mode 100644
index 0000000000..66c859b96f
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/inhand-left.png
new file mode 100644
index 0000000000..5456486c25
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/inhand-right.png
new file mode 100644
index 0000000000..23855a8759
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/meta.json
new file mode 100644
index 0000000000..d01e147030
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_officer.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon",
+ "directions": 1
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/equipped-INNERCLOTHING.png
new file mode 100644
index 0000000000..aef08cee2c
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/icon.png
new file mode 100644
index 0000000000..9fcf7ace5a
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/inhand-left.png
new file mode 100644
index 0000000000..942a5247ab
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/inhand-right.png
new file mode 100644
index 0000000000..65f7b91a71
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/meta.json
new file mode 100644
index 0000000000..d01e147030
--- /dev/null
+++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/centcom_official.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon",
+ "directions": 1
+ },
+ {
+ "name": "equipped-INNERCLOTHING",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/meta.json b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/meta.json
new file mode 100644
index 0000000000..668446e50b
--- /dev/null
+++ b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/meta.json
@@ -0,0 +1,45 @@
+{
+ "version":1,
+ "size":{
+ "x":32,
+ "y":32
+ },
+ "license":"CC-BY-SA-3.0",
+ "copyright":"Taken from /vg/station at commit 5c50dee8fb2a55d6be3b3c9c90a782a618a5506e",
+ "states":[
+ {
+ "name":"pad-beam",
+ "directions":1,
+ "delays":[
+ [
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name":"pad-idle",
+ "directions":1,
+ "delays":[
+ [
+ 0.2,
+ 0.2,
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name":"pad-offline",
+ "directions":1,
+ "delays":[
+ [
+ 1.0
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-beam.png b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-beam.png
new file mode 100644
index 0000000000..08e4dd0eda
Binary files /dev/null and b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-beam.png differ
diff --git a/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-idle.png b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-idle.png
new file mode 100644
index 0000000000..bf79fade7d
Binary files /dev/null and b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-idle.png differ
diff --git a/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-offline.png b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-offline.png
new file mode 100644
index 0000000000..e701d9994d
Binary files /dev/null and b/Resources/Textures/Constructible/Power/cargo_teleporter.rsi/pad-offline.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/assigned.png b/Resources/Textures/Objects/Misc/id_cards.rsi/assigned.png
deleted file mode 100644
index ffaf2654cc..0000000000
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/assigned.png and /dev/null differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/blue-inhand-left.png b/Resources/Textures/Objects/Misc/id_cards.rsi/blue-inhand-left.png
new file mode 100644
index 0000000000..9adcd4b6a3
Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/blue-inhand-left.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/blue-inhand-right.png b/Resources/Textures/Objects/Misc/id_cards.rsi/blue-inhand-right.png
new file mode 100644
index 0000000000..394cc79b27
Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/blue-inhand-right.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idassistant.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idassistant.png
index 0f92b2edf1..397b416a59 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idassistant.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idassistant.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png
index effef4daf3..f5dfdb8662 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idbotanist.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png
index c0ee96e365..25b7017a70 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idcentcom.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png
index 259d125daf..f105b4f88a 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefengineer.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png
index 70cc3c0abb..82a608a9a1 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idchiefmedicalofficer.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png
index 56d8e50c90..1303135aa5 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idgeneticist.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png
index 3e716b0195..9e390bb606 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idmedicaldoctor.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png
index 2a1fe45f39..1881839e96 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idparamedic.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png
index 13f4957204..420378538c 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idresearchdirector.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png
index 4571a5e345..a9d6c5facd 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idroboticist.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png
index 7322d0b8bc..a5be2ca632 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idscientist.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png
index bbcf4456f0..cc0b6c4774 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idvirologist.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png
index f2c207fa17..0b4086478c 100644
Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idwarden.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json b/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
index d0f801dde0..0fc51bd2b7 100644
--- a/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
+++ b/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json
@@ -1,603 +1,263 @@
{
- "version": 1,
- "size": {
- "x": 32,
- "y": 32
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "default",
+ "directions": 1
},
- "states": [
- {
- "name": "assigned",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "centcom",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "default",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "default-inhand-left",
- "directions": 4,
- "delays": [
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ]
- ]
- },
- {
- "name": "default-inhand-right",
- "directions": 4,
- "delays": [
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ]
- ]
- },
- {
- "name": "ert_chaplain",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "ert_commander",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "ert_engineer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "ert_janitor",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "ert_medic",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "ert_security",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "gold",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "gold-inhand-left",
- "directions": 4,
- "delays": [
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ]
- ]
- },
- {
- "name": "gold-inhand-right",
- "directions": 4,
- "delays": [
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idassistant",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idatmospherictechnician",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idbartender",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idbotanist",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idcaptain",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idcargotechnician",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idcentcom",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idchaplain",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idchemist",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idchiefengineer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idchiefmedicalofficer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idclown",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idcook",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idcurator",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "iddetective",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idgeneticist",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idheadofpersonnel",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idheadofsecurity",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idjanitor",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idlawyer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idmedicaldoctor",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idmime",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idparamedic",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idprisoner",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idquartermaster",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idresearchdirector",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idroboticist",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idscientist",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idsecurityofficer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idshaftminer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idstationengineer",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idunknown",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idvirologist",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "idwarden",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "orange",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_001",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_002",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_003",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_004",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_005",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_006",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "prisoner_007",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "silver",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- },
- {
- "name": "silver-inhand-left",
- "directions": 4,
- "delays": [
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ]
- ]
- },
- {
- "name": "silver-inhand-right",
- "directions": 4,
- "delays": [
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ],
- [
- 1.0
- ]
- ]
- },
- {
- "name": "syndie",
- "directions": 1,
- "delays": [
- [
- 1.0
- ]
- ]
- }
- ]
-}
\ No newline at end of file
+ {
+ "name": "centcom",
+ "directions": 1
+ },
+ {
+ "name": "ert_chaplain",
+ "directions": 1
+ },
+ {
+ "name": "ert_commander",
+ "directions": 1
+ },
+ {
+ "name": "ert_engineer",
+ "directions": 1
+ },
+ {
+ "name": "ert_janitor",
+ "directions": 1
+ },
+ {
+ "name": "ert_medic",
+ "directions": 1
+ },
+ {
+ "name": "ert_security",
+ "directions": 1
+ },
+ {
+ "name": "gold",
+ "directions": 1
+ },
+ {
+ "name": "idassistant",
+ "directions": 1
+ },
+ {
+ "name": "idatmospherictechnician",
+ "directions": 1
+ },
+ {
+ "name": "idbartender",
+ "directions": 1
+ },
+ {
+ "name": "idbotanist",
+ "directions": 1
+ },
+ {
+ "name": "idcaptain",
+ "directions": 1
+ },
+ {
+ "name": "idcargotechnician",
+ "directions": 1
+ },
+ {
+ "name": "idcentcom",
+ "directions": 1
+ },
+ {
+ "name": "idchaplain",
+ "directions": 1
+ },
+ {
+ "name": "idchemist",
+ "directions": 1
+ },
+ {
+ "name": "idchiefengineer",
+ "directions": 1
+ },
+ {
+ "name": "idchiefmedicalofficer",
+ "directions": 1
+ },
+ {
+ "name": "idclown",
+ "directions": 1
+ },
+ {
+ "name": "idcook",
+ "directions": 1
+ },
+ {
+ "name": "idcurator",
+ "directions": 1
+ },
+ {
+ "name": "iddetective",
+ "directions": 1
+ },
+ {
+ "name": "idgeneticist",
+ "directions": 1
+ },
+ {
+ "name": "idheadofpersonnel",
+ "directions": 1
+ },
+ {
+ "name": "idheadofsecurity",
+ "directions": 1
+ },
+ {
+ "name": "idjanitor",
+ "directions": 1
+ },
+ {
+ "name": "idlawyer",
+ "directions": 1
+ },
+ {
+ "name": "idmedicaldoctor",
+ "directions": 1
+ },
+ {
+ "name": "idmime",
+ "directions": 1
+ },
+ {
+ "name": "idparamedic",
+ "directions": 1
+ },
+ {
+ "name": "idprisoner",
+ "directions": 1
+ },
+ {
+ "name": "idquartermaster",
+ "directions": 1
+ },
+ {
+ "name": "idresearchdirector",
+ "directions": 1
+ },
+ {
+ "name": "idroboticist",
+ "directions": 1
+ },
+ {
+ "name": "idscientist",
+ "directions": 1
+ },
+ {
+ "name": "idsecurityofficer",
+ "directions": 1
+ },
+ {
+ "name": "idshaftminer",
+ "directions": 1
+ },
+ {
+ "name": "idstationengineer",
+ "directions": 1
+ },
+ {
+ "name": "idunknown",
+ "directions": 1
+ },
+ {
+ "name": "idvirologist",
+ "directions": 1
+ },
+ {
+ "name": "idwarden",
+ "directions": 1
+ },
+ {
+ "name": "orange",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_001",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_002",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_003",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_004",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_005",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_006",
+ "directions": 1
+ },
+ {
+ "name": "prisoner_007",
+ "directions": 1
+ },
+ {
+ "name": "silver",
+ "directions": 1
+ },
+ {
+ "name": "syndie",
+ "directions": 1
+ },
+ {
+ "name": "gold-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "gold-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "default-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "default-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "silver-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "silver-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "orange-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "orange-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "blue-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "blue-inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/orange-inhand-left.png b/Resources/Textures/Objects/Misc/id_cards.rsi/orange-inhand-left.png
new file mode 100644
index 0000000000..5937b9cd21
Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/orange-inhand-left.png differ
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/orange-inhand-right.png b/Resources/Textures/Objects/Misc/id_cards.rsi/orange-inhand-right.png
new file mode 100644
index 0000000000..027f8aea2a
Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/orange-inhand-right.png differ
diff --git a/Resources/Textures/Objects/Misc/nukedisk.rsi/icon.png b/Resources/Textures/Objects/Misc/nukedisk.rsi/icon.png
new file mode 100644
index 0000000000..1ef83e9abb
Binary files /dev/null and b/Resources/Textures/Objects/Misc/nukedisk.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Misc/nukedisk.rsi/meta.json b/Resources/Textures/Objects/Misc/nukedisk.rsi/meta.json
new file mode 100644
index 0000000000..81c0661e3c
--- /dev/null
+++ b/Resources/Textures/Objects/Misc/nukedisk.rsi/meta.json
@@ -0,0 +1,21 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/a7215663648f4289d2446a1c82aec1c9a406310c",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon",
+ "directions": 1,
+ "delays": [
+ [
+ 0.1,
+ 0.1
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Tools/jaws_of_life.rsi/meta.json b/Resources/Textures/Objects/Tools/jaws_of_life.rsi/meta.json
index 2ab00fd169..6f0fd01ae1 100644
--- a/Resources/Textures/Objects/Tools/jaws_of_life.rsi/meta.json
+++ b/Resources/Textures/Objects/Tools/jaws_of_life.rsi/meta.json
@@ -1 +1,83 @@
-{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC BY-SA 3.0", "copyright": "Taken from https://github.com/tgstation/tgstation at commit ea59fb4b810decbb5996b36d8876614b57c3d189", "states": [{"name": "jaws_cutter", "directions": 1, "delays": [[1.0]]}, {"name": "jaws_pry", "directions": 1, "delays": [[1.0]]}, {"name": "inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]}
\ No newline at end of file
+{
+ "version": 1,
+ "license": "CC BY-SA 3.0",
+ "copyright": "Taken from https://github.com/tgstation/tgstation at commit ea59fb4b810decbb5996b36d8876614b57c3d189",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "jaws_cutter",
+ "directions": 1,
+ "delays": [
+ [
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "jaws_pry",
+ "directions": 1,
+ "delays": [
+ [
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "syn_jaws_cutter",
+ "directions": 1,
+ "delays": [
+ [
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "syn_jaws_pry",
+ "directions": 1,
+ "delays": [
+ [
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4,
+ "delays": [
+ [
+ 1
+ ],
+ [
+ 1
+ ],
+ [
+ 1
+ ],
+ [
+ 1
+ ]
+ ]
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4,
+ "delays": [
+ [
+ 1
+ ],
+ [
+ 1
+ ],
+ [
+ 1
+ ],
+ [
+ 1
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/Objects/Tools/jaws_of_life.rsi/syn_jaws_cutter.png b/Resources/Textures/Objects/Tools/jaws_of_life.rsi/syn_jaws_cutter.png
new file mode 100644
index 0000000000..973b1428b8
Binary files /dev/null and b/Resources/Textures/Objects/Tools/jaws_of_life.rsi/syn_jaws_cutter.png differ
diff --git a/Resources/Textures/Objects/Tools/jaws_of_life.rsi/syn_jaws_pry.png b/Resources/Textures/Objects/Tools/jaws_of_life.rsi/syn_jaws_pry.png
new file mode 100644
index 0000000000..ed36af3d67
Binary files /dev/null and b/Resources/Textures/Objects/Tools/jaws_of_life.rsi/syn_jaws_pry.png differ
diff --git a/RobustToolbox b/RobustToolbox
index 7ef2cec121..58560f589f 160000
--- a/RobustToolbox
+++ b/RobustToolbox
@@ -1 +1 @@
-Subproject commit 7ef2cec121edb831a73a0e02d4e7283b4f3d08e5
+Subproject commit 58560f589f6defe7e092cecd71b2353d26a2220d