diff --git a/Content.Client/Atmos/EntitySystems/GasPressurePumpSystem.cs b/Content.Client/Atmos/EntitySystems/GasPressurePumpSystem.cs index 54e16bc862..74a8166962 100644 --- a/Content.Client/Atmos/EntitySystems/GasPressurePumpSystem.cs +++ b/Content.Client/Atmos/EntitySystems/GasPressurePumpSystem.cs @@ -1,4 +1,3 @@ -using Content.Client.Atmos.UI; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.EntitySystems; using Content.Shared.Atmos.Piping.Binary.Components; @@ -15,7 +14,12 @@ public sealed class GasPressurePumpSystem : SharedGasPressurePumpSystem private void OnPumpUpdate(Entity ent, ref AfterAutoHandleStateEvent args) { - if (UserInterfaceSystem.TryGetOpenUi(ent.Owner, GasPressurePumpUiKey.Key, out var bui)) + UpdateUi(ent); + } + + protected override void UpdateUi(Entity ent) + { + if (UserInterfaceSystem.TryGetOpenUi(ent.Owner, GasPressurePumpUiKey.Key, out var bui)) { bui.Update(); } diff --git a/Content.Client/Atmos/UI/GasPressurePumpBoundUserInterface.cs b/Content.Client/Atmos/UI/GasPressurePumpBoundUserInterface.cs index 0c07eec402..3c3d8f1509 100644 --- a/Content.Client/Atmos/UI/GasPressurePumpBoundUserInterface.cs +++ b/Content.Client/Atmos/UI/GasPressurePumpBoundUserInterface.cs @@ -1,8 +1,7 @@ -using Content.Shared.Atmos; +using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.Piping.Binary.Components; using Content.Shared.IdentityManagement; -using Content.Shared.Localizations; using JetBrains.Annotations; using Robust.Client.UserInterface; @@ -12,7 +11,7 @@ namespace Content.Client.Atmos.UI; /// Initializes a and updates it when new server messages are received. /// [UsedImplicitly] -public sealed class GasPressurePumpBoundUserInterface : BoundUserInterface +public sealed class GasPressurePumpBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) { [ViewVariables] private const float MaxPressure = Atmospherics.MaxOutputPressure; @@ -20,10 +19,6 @@ public sealed class GasPressurePumpBoundUserInterface : BoundUserInterface [ViewVariables] private GasPressurePumpWindow? _window; - public GasPressurePumpBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) - { - } - protected override void Open() { base.Open(); @@ -35,7 +30,7 @@ public sealed class GasPressurePumpBoundUserInterface : BoundUserInterface Update(); } - public void Update() + public override void Update() { if (_window == null) return; @@ -52,7 +47,9 @@ public sealed class GasPressurePumpBoundUserInterface : BoundUserInterface private void OnToggleStatusButtonPressed() { - if (_window is null) return; + if (_window is null) + return; + SendPredictedMessage(new GasPressurePumpToggleStatusMessage(_window.PumpStatus)); } diff --git a/Content.Client/Atmos/UI/GasPressurePumpWindow.xaml.cs b/Content.Client/Atmos/UI/GasPressurePumpWindow.xaml.cs index aa86a1aa03..56c07e7fac 100644 --- a/Content.Client/Atmos/UI/GasPressurePumpWindow.xaml.cs +++ b/Content.Client/Atmos/UI/GasPressurePumpWindow.xaml.cs @@ -1,7 +1,6 @@ using Content.Client.UserInterface.Controls; using Content.Shared.Atmos; using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; namespace Content.Client.Atmos.UI diff --git a/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs b/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs index 50d079737d..312c4e8019 100644 --- a/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs +++ b/Content.Client/Cargo/Systems/CargoSystem.Telepad.cs @@ -67,8 +67,10 @@ public sealed partial class CargoSystem if (!Resolve(uid, ref sprite)) return; + if (!TryComp(uid, out var player)) + return; + _appearance.TryGetData(uid, CargoTelepadVisuals.State, out var state); - AnimationPlayerComponent? player = null; switch (state) { @@ -76,7 +78,7 @@ public sealed partial class CargoSystem if (_player.HasRunningAnimation(uid, TelepadBeamKey)) return; _player.Stop(uid, player, TelepadIdleKey); - _player.Play(uid, player, CargoTelepadBeamAnimation, TelepadBeamKey); + _player.Play((uid, player), CargoTelepadBeamAnimation, TelepadBeamKey); break; case CargoTelepadState.Unpowered: sprite.LayerSetVisible(CargoTelepadLayers.Beam, false); @@ -90,7 +92,7 @@ public sealed partial class CargoSystem _player.HasRunningAnimation(uid, player, TelepadBeamKey)) return; - _player.Play(uid, player, CargoTelepadIdleAnimation, TelepadIdleKey); + _player.Play((uid, player), CargoTelepadIdleAnimation, TelepadIdleKey); break; } } diff --git a/Content.Client/Chat/UI/EmotesMenu.xaml b/Content.Client/Chat/UI/EmotesMenu.xaml deleted file mode 100644 index 845b631617..0000000000 --- a/Content.Client/Chat/UI/EmotesMenu.xaml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Content.Client/Chat/UI/EmotesMenu.xaml.cs b/Content.Client/Chat/UI/EmotesMenu.xaml.cs deleted file mode 100644 index 80daa405a6..0000000000 --- a/Content.Client/Chat/UI/EmotesMenu.xaml.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System.Numerics; -using Content.Client.UserInterface.Controls; -using Content.Shared.Chat.Prototypes; -using Content.Shared.Speech; -using Content.Shared.Whitelist; -using Robust.Client.AutoGenerated; -using Robust.Client.GameObjects; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; - -namespace Content.Client.Chat.UI; - -[GenerateTypedNameReferences] -public sealed partial class EmotesMenu : RadialMenu -{ - [Dependency] private readonly EntityManager _entManager = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly ISharedPlayerManager _playerManager = default!; - - public event Action>? OnPlayEmote; - - public EmotesMenu() - { - IoCManager.InjectDependencies(this); - RobustXamlLoader.Load(this); - - var spriteSystem = _entManager.System(); - var whitelistSystem = _entManager.System(); - - var main = FindControl("Main"); - - var emotes = _prototypeManager.EnumeratePrototypes(); - foreach (var emote in emotes) - { - var player = _playerManager.LocalSession?.AttachedEntity; - if (emote.Category == EmoteCategory.Invalid || - emote.ChatTriggers.Count == 0 || - !(player.HasValue && whitelistSystem.IsWhitelistPassOrNull(emote.Whitelist, player.Value)) || - whitelistSystem.IsBlacklistPass(emote.Blacklist, player.Value)) - continue; - - if (!emote.Available && - _entManager.TryGetComponent(player.Value, out var speech) && - !speech.AllowedEmotes.Contains(emote.ID)) - continue; - - var parent = FindControl(emote.Category.ToString()); - - var button = new EmoteMenuButton - { - SetSize = new Vector2(64f, 64f), - ToolTip = Loc.GetString(emote.Name), - ProtoId = emote.ID, - }; - - var tex = new TextureRect - { - VerticalAlignment = VAlignment.Center, - HorizontalAlignment = HAlignment.Center, - Texture = spriteSystem.Frame0(emote.Icon), - TextureScale = new Vector2(2f, 2f), - }; - - button.AddChild(tex); - parent.AddChild(button); - foreach (var child in main.Children) - { - if (child is not RadialMenuTextureButton castChild) - continue; - - if (castChild.TargetLayer == emote.Category.ToString()) - { - castChild.Visible = true; - break; - } - } - } - - - // Set up menu actions - foreach (var child in Children) - { - if (child is not RadialContainer container) - continue; - AddEmoteClickAction(container); - } - } - - private void AddEmoteClickAction(RadialContainer container) - { - foreach (var child in container.Children) - { - if (child is not EmoteMenuButton castChild) - continue; - - castChild.OnButtonUp += _ => - { - OnPlayEmote?.Invoke(castChild.ProtoId); - Close(); - }; - } - } -} - - -public sealed class EmoteMenuButton : RadialMenuTextureButtonWithSector -{ - public ProtoId ProtoId { get; set; } -} diff --git a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs index 807ec4c1e7..e264b859a0 100644 --- a/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs +++ b/Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs @@ -6,7 +6,6 @@ using Robust.Client.AutoGenerated; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -using Robust.Client.Utility; using Robust.Shared.Prototypes; using Robust.Shared.Utility; using System.Linq; @@ -14,6 +13,7 @@ using System.Numerics; using Content.Shared.FixedPoint; using Robust.Client.Graphics; using static Robust.Client.UserInterface.Controls.BoxContainer; +using Robust.Client.GameObjects; namespace Content.Client.Chemistry.UI { @@ -24,6 +24,10 @@ namespace Content.Client.Chemistry.UI public sealed partial class ChemMasterWindow : FancyWindow { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + + private readonly SpriteSystem _sprite; + public event Action? OnReagentButtonPressed; public readonly Button[] PillTypeButtons; @@ -38,6 +42,8 @@ namespace Content.Client.Chemistry.UI RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + _sprite = _entityManager.System(); + // Pill type selection buttons, in total there are 20 pills. // Pill rsi file should have states named as pill1, pill2, and so on. var resourcePath = new ResPath(PillsRsiPath); @@ -69,7 +75,7 @@ namespace Content.Client.Chemistry.UI var specifier = new SpriteSpecifier.Rsi(resourcePath, "pill" + (i + 1)); TextureRect pillTypeTexture = new TextureRect { - Texture = specifier.Frame0(), + Texture = _sprite.Frame0(specifier), TextureScale = new Vector2(1.75f, 1.75f), Stretch = TextureRect.StretchMode.KeepCentered, }; diff --git a/Content.Client/Chemistry/Visualizers/FoamVisualizerSystem.cs b/Content.Client/Chemistry/Visualizers/FoamVisualizerSystem.cs index 2ee88956ff..2f895718c7 100644 --- a/Content.Client/Chemistry/Visualizers/FoamVisualizerSystem.cs +++ b/Content.Client/Chemistry/Visualizers/FoamVisualizerSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Shared.Timing; @@ -37,7 +37,7 @@ public sealed class FoamVisualizerSystem : VisualizerSystem(uid, out var animPlayer) && !AnimationSystem.HasRunningAnimation(uid, animPlayer, VaporVisualsComponent.AnimationKey)) { - AnimationSystem.Play(uid, animPlayer, comp.VaporFlick, VaporVisualsComponent.AnimationKey); + AnimationSystem.Play((uid, animPlayer), comp.VaporFlick, VaporVisualsComponent.AnimationKey); } } diff --git a/Content.Client/Examine/ExamineButton.cs b/Content.Client/Examine/ExamineButton.cs index 839e08f3d4..3d5ac211e4 100644 --- a/Content.Client/Examine/ExamineButton.cs +++ b/Content.Client/Examine/ExamineButton.cs @@ -1,11 +1,7 @@ -using Content.Client.ContextMenu.UI; -using Content.Client.Stylesheets; using Content.Shared.Verbs; -using Robust.Client.AutoGenerated; -using Robust.Client.Graphics; +using Robust.Client.GameObjects; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; -using Robust.Client.UserInterface.XAML; using Robust.Client.Utility; using Robust.Shared.Utility; @@ -27,14 +23,16 @@ public sealed class ExamineButton : ContainerButton public TextureRect Icon; public ExamineVerb Verb; + private SpriteSystem _sprite; - public ExamineButton(ExamineVerb verb) + public ExamineButton(ExamineVerb verb, SpriteSystem spriteSystem) { Margin = new Thickness(Thickness, Thickness, Thickness, Thickness); SetOnlyStyleClass(StyleClassExamineButton); Verb = verb; + _sprite = spriteSystem; if (verb.Disabled) { @@ -61,7 +59,7 @@ public sealed class ExamineButton : ContainerButton if (verb.Icon != null) { - Icon.Texture = verb.Icon.Frame0(); + Icon.Texture = _sprite.Frame0(verb.Icon); Icon.Stretch = TextureRect.StretchMode.KeepAspectCentered; AddChild(Icon); diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 07694ac24a..2e8d95c978 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -30,6 +30,7 @@ namespace Content.Client.Examine [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly VerbSystem _verbSystem = default!; + [Dependency] private readonly SpriteSystem _sprite = default!; public const string StyleClassEntityTooltip = "entity-tooltip"; @@ -332,7 +333,7 @@ namespace Content.Client.Examine if (!examine.ShowOnExamineTooltip) continue; - var button = new ExamineButton(examine); + var button = new ExamineButton(examine, _sprite); if (examine.HoverVerb) { diff --git a/Content.Client/Light/EntitySystems/RotatingLightSystem.cs b/Content.Client/Light/EntitySystems/RotatingLightSystem.cs index 5c2c4e4c87..1e20d7041a 100644 --- a/Content.Client/Light/EntitySystems/RotatingLightSystem.cs +++ b/Content.Client/Light/EntitySystems/RotatingLightSystem.cs @@ -85,7 +85,7 @@ public sealed class RotatingLightSystem : SharedRotatingLightSystem if (!_animations.HasRunningAnimation(uid, player, AnimKey)) { - _animations.Play(uid, player, GetAnimation(comp.Speed), AnimKey); + _animations.Play((uid, player), GetAnimation(comp.Speed), AnimKey); } } } diff --git a/Content.Client/Light/Visualizers/PoweredLightVisualizerSystem.cs b/Content.Client/Light/Visualizers/PoweredLightVisualizerSystem.cs index ee81641d26..c07742462b 100644 --- a/Content.Client/Light/Visualizers/PoweredLightVisualizerSystem.cs +++ b/Content.Client/Light/Visualizers/PoweredLightVisualizerSystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Light; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Shared.Animations; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Random; @@ -53,13 +52,14 @@ public sealed class PoweredLightVisualizerSystem : VisualizerSystem private void OnAnimationCompleted(EntityUid uid, PoweredLightVisualsComponent comp, AnimationCompletedEvent args) { + if (!TryComp(uid, out var animationPlayer)) + return; if (args.Key != PoweredLightVisualsComponent.BlinkingAnimationKey) return; - if(!comp.IsBlinking) return; - AnimationSystem.Play(uid, Comp(uid), BlinkingAnimation(comp), PoweredLightVisualsComponent.BlinkingAnimationKey); + AnimationSystem.Play((uid, animationPlayer), BlinkingAnimation(comp), PoweredLightVisualsComponent.BlinkingAnimationKey); } /// @@ -76,7 +76,7 @@ public sealed class PoweredLightVisualizerSystem : VisualizerSystem(uid); if (shouldBeBlinking) { - AnimationSystem.Play(uid, animationPlayer, BlinkingAnimation(comp), PoweredLightVisualsComponent.BlinkingAnimationKey); + AnimationSystem.Play((uid, animationPlayer), BlinkingAnimation(comp), PoweredLightVisualsComponent.BlinkingAnimationKey); } else if (AnimationSystem.HasRunningAnimation(uid, animationPlayer, PoweredLightVisualsComponent.BlinkingAnimationKey)) { diff --git a/Content.Client/Mapping/MappingState.cs b/Content.Client/Mapping/MappingState.cs index bcc739fe4f..57b45036e3 100644 --- a/Content.Client/Mapping/MappingState.cs +++ b/Content.Client/Mapping/MappingState.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Numerics; using Content.Client.Administration.Managers; using Content.Client.ContextMenu.UI; @@ -149,7 +149,7 @@ public sealed class MappingState : GameplayStateBase { Deselect(); - var coords = args.Coordinates.ToMap(_entityManager, _transform); + var coords = _transform.ToMapCoordinates(args.Coordinates); if (_verbs.TryGetEntityMenuEntities(coords, out var entities)) _entityMenuController.OpenRootMenu(entities); diff --git a/Content.Client/Movement/Systems/ClientSpriteMovementSystem.cs b/Content.Client/Movement/Systems/ClientSpriteMovementSystem.cs index 1700796ede..a6265204b7 100644 --- a/Content.Client/Movement/Systems/ClientSpriteMovementSystem.cs +++ b/Content.Client/Movement/Systems/ClientSpriteMovementSystem.cs @@ -1,7 +1,6 @@ using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Robust.Client.GameObjects; -using Robust.Shared.Timing; namespace Content.Client.Movement.Systems; @@ -10,8 +9,6 @@ namespace Content.Client.Movement.Systems; /// public sealed class ClientSpriteMovementSystem : SharedSpriteMovementSystem { - [Dependency] private readonly IGameTiming _timing = default!; - private EntityQuery _spriteQuery; public override void Initialize() diff --git a/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs b/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs index 9e8ca9a9c9..eb524cf4ee 100644 --- a/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs +++ b/Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs @@ -1,8 +1,6 @@ using System.Numerics; using Content.Client.Movement.Components; using Content.Shared.Camera; -using Content.Shared.Inventory; -using Content.Shared.Movement.Systems; using Robust.Client.Graphics; using Robust.Client.Input; using Robust.Shared.Map; @@ -16,8 +14,6 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem [Dependency] private readonly IInputManager _inputManager = default!; [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly SharedContentEyeSystem _contentEye = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IClyde _clyde = default!; // This value is here to make sure the user doesn't have to move their mouse @@ -42,7 +38,7 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem public Vector2? OffsetAfterMouse(EntityUid uid, EyeCursorOffsetComponent? component) { - var localPlayer = _player.LocalPlayer?.ControlledEntity; + var localPlayer = _player.LocalEntity; var mousePos = _inputManager.MouseScreenPosition; var screenSize = _clyde.MainWindow.Size; var minValue = MathF.Min(screenSize.X / 2, screenSize.Y / 2) * _edgeOffset; diff --git a/Content.Client/Movement/Systems/JetpackSystem.cs b/Content.Client/Movement/Systems/JetpackSystem.cs index 2954140d79..804736ab7a 100644 --- a/Content.Client/Movement/Systems/JetpackSystem.cs +++ b/Content.Client/Movement/Systems/JetpackSystem.cs @@ -49,13 +49,17 @@ public sealed class JetpackSystem : SharedJetpackSystem // TODO: Please don't copy-paste this I beg // make a generic particle emitter system / actual particles instead. - var query = EntityQueryEnumerator(); + var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp)) + while (query.MoveNext(out var uid, out var comp, out var xform)) { - if (_timing.CurTime < comp.TargetTime) - continue; + if (_transform.InRange(xform.Coordinates, comp.LastCoordinates, comp.MaxDistance)) + { + if (_timing.CurTime < comp.TargetTime) + continue; + } + comp.LastCoordinates = _transform.GetMoverCoordinates(xform.Coordinates); comp.TargetTime = _timing.CurTime + TimeSpan.FromSeconds(comp.EffectCooldown); CreateParticles(uid); diff --git a/Content.Client/RCD/RCDMenu.xaml b/Content.Client/RCD/RCDMenu.xaml deleted file mode 100644 index d8ab0ac8f4..0000000000 --- a/Content.Client/RCD/RCDMenu.xaml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Content.Client/RCD/RCDMenu.xaml.cs b/Content.Client/RCD/RCDMenu.xaml.cs deleted file mode 100644 index 7ea9894e41..0000000000 --- a/Content.Client/RCD/RCDMenu.xaml.cs +++ /dev/null @@ -1,172 +0,0 @@ -using Content.Client.UserInterface.Controls; -using Content.Shared.Popups; -using Content.Shared.RCD; -using Content.Shared.RCD.Components; -using Robust.Client.AutoGenerated; -using Robust.Client.GameObjects; -using Robust.Client.Player; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Prototypes; -using System.Numerics; - -namespace Content.Client.RCD; - -[GenerateTypedNameReferences] -public sealed partial class RCDMenu : RadialMenu -{ - [Dependency] private readonly EntityManager _entManager = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; - - private SharedPopupSystem _popup; - private SpriteSystem _sprites; - - public event Action>? SendRCDSystemMessageAction; - - private EntityUid _owner; - - public RCDMenu() - { - IoCManager.InjectDependencies(this); - RobustXamlLoader.Load(this); - - _popup = _entManager.System(); - _sprites = _entManager.System(); - - OnChildAdded += AddRCDMenuButtonOnClickActions; - } - - public void SetEntity(EntityUid uid) - { - _owner = uid; - Refresh(); - } - - public void Refresh() - { - // Find the main radial container - var main = FindControl("Main"); - - // Populate secondary radial containers - if (!_entManager.TryGetComponent(_owner, out var rcd)) - return; - - foreach (var protoId in rcd.AvailablePrototypes) - { - if (!_protoManager.TryIndex(protoId, out var proto)) - continue; - - if (proto.Mode == RcdMode.Invalid) - continue; - - var parent = FindControl(proto.Category); - var tooltip = Loc.GetString(proto.SetName); - - if ((proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject) && - proto.Prototype != null && _protoManager.TryIndex(proto.Prototype, out var entProto, logError: false)) - { - tooltip = Loc.GetString(entProto.Name); - } - - tooltip = OopsConcat(char.ToUpper(tooltip[0]).ToString(), tooltip.Remove(0, 1)); - - var button = new RCDMenuButton() - { - SetSize = new Vector2(64f, 64f), - ToolTip = tooltip, - ProtoId = protoId, - }; - - if (proto.Sprite != null) - { - var tex = new TextureRect() - { - VerticalAlignment = VAlignment.Center, - HorizontalAlignment = HAlignment.Center, - Texture = _sprites.Frame0(proto.Sprite), - TextureScale = new Vector2(2f, 2f), - }; - - button.AddChild(tex); - } - - parent.AddChild(button); - - // Ensure that the button that transitions the menu to the associated category layer - // is visible in the main radial container (as these all start with Visible = false) - foreach (var child in main.Children) - { - if (child is not RadialMenuTextureButton castChild) - continue; - - if (castChild.TargetLayer == proto.Category) - { - castChild.Visible = true; - break; - } - } - } - - // Set up menu actions - foreach (var child in Children) - { - AddRCDMenuButtonOnClickActions(child); - } - } - - private static string OopsConcat(string a, string b) - { - // This exists to prevent Roslyn being clever and compiling something that fails sandbox checks. - return a + b; - } - - private void AddRCDMenuButtonOnClickActions(Control control) - { - var radialContainer = control as RadialContainer; - - if (radialContainer == null) - return; - - foreach (var child in radialContainer.Children) - { - var castChild = child as RCDMenuButton; - - if (castChild == null) - continue; - - castChild.OnButtonUp += _ => - { - SendRCDSystemMessageAction?.Invoke(castChild.ProtoId); - - if (_playerManager.LocalSession?.AttachedEntity != null && - _protoManager.TryIndex(castChild.ProtoId, out var proto)) - { - var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.SetName))); - - if (proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject) - { - var name = Loc.GetString(proto.SetName); - - if (proto.Prototype != null && - _protoManager.TryIndex(proto.Prototype, out var entProto, logError: false)) - name = entProto.Name; - - msg = Loc.GetString("rcd-component-change-build-mode", ("name", name)); - } - - // Popup message - _popup.PopupClient(msg, _owner, _playerManager.LocalSession.AttachedEntity); - } - - Close(); - }; - } - } -} - -public sealed class RCDMenuButton : RadialMenuTextureButtonWithSector -{ - public ProtoId ProtoId { get; set; } -} diff --git a/Content.Client/RCD/RCDMenuBoundUserInterface.cs b/Content.Client/RCD/RCDMenuBoundUserInterface.cs index 1dd03626ae..d599c324e1 100644 --- a/Content.Client/RCD/RCDMenuBoundUserInterface.cs +++ b/Content.Client/RCD/RCDMenuBoundUserInterface.cs @@ -1,20 +1,32 @@ +using Content.Client.Popups; +using Content.Client.UserInterface.Controls; using Content.Shared.RCD; using Content.Shared.RCD.Components; using JetBrains.Annotations; -using Robust.Client.Graphics; -using Robust.Client.Input; using Robust.Client.UserInterface; +using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Client.RCD; [UsedImplicitly] public sealed class RCDMenuBoundUserInterface : BoundUserInterface { - [Dependency] private readonly IClyde _displayManager = default!; - [Dependency] private readonly IInputManager _inputManager = default!; + private static readonly Dictionary PrototypesGroupingInfo + = new Dictionary + { + ["WallsAndFlooring"] = ("rcd-component-walls-and-flooring", new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Radial/RCD/walls_and_flooring.png"))), + ["WindowsAndGrilles"] = ("rcd-component-windows-and-grilles", new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Radial/RCD/windows_and_grilles.png"))), + ["Airlocks"] = ("rcd-component-airlocks", new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Radial/RCD/airlocks.png"))), + ["Electrical"] = ("rcd-component-electrical", new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Radial/RCD/multicoil.png"))), + ["Lighting"] = ("rcd-component-lighting", new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Radial/RCD/lighting.png"))), + }; - private RCDMenu? _menu; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly ISharedPlayerManager _playerManager = default!; + + private SimpleRadialMenu? _menu; public RCDMenuBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { @@ -25,19 +37,107 @@ public sealed class RCDMenuBoundUserInterface : BoundUserInterface { base.Open(); - _menu = this.CreateWindow(); - _menu.SetEntity(Owner); - _menu.SendRCDSystemMessageAction += SendRCDSystemMessage; + if (!EntMan.TryGetComponent(Owner, out var rcd)) + return; - // Open the menu, centered on the mouse - var vpSize = _displayManager.ScreenSize; - _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize); + _menu = this.CreateWindow(); + _menu.Track(Owner); + var models = ConvertToButtons(rcd.AvailablePrototypes); + _menu.SetButtons(models); + + _menu.OpenOverMouseScreenPosition(); } - public void SendRCDSystemMessage(ProtoId protoId) + private IEnumerable ConvertToButtons(HashSet> prototypes) + { + Dictionary> buttonsByCategory = new(); + foreach (var protoId in prototypes) + { + var prototype = _prototypeManager.Index(protoId); + if (!PrototypesGroupingInfo.TryGetValue(prototype.Category, out var groupInfo)) + continue; + + if (!buttonsByCategory.TryGetValue(prototype.Category, out var list)) + { + list = new List(); + buttonsByCategory.Add(prototype.Category, list); + } + + var actionOption = new RadialMenuActionOption(HandleMenuOptionClick, prototype) + { + Sprite = prototype.Sprite, + ToolTip = GetTooltip(prototype) + }; + list.Add(actionOption); + } + + var models = new RadialMenuNestedLayerOption[buttonsByCategory.Count]; + var i = 0; + foreach (var (key, list) in buttonsByCategory) + { + var groupInfo = PrototypesGroupingInfo[key]; + models[i] = new RadialMenuNestedLayerOption(list) + { + Sprite = groupInfo.Sprite, + ToolTip = Loc.GetString(groupInfo.Tooltip) + }; + i++; + } + + return models; + } + + private void HandleMenuOptionClick(RCDPrototype proto) { // A predicted message cannot be used here as the RCD UI is closed immediately // after this message is sent, which will stop the server from receiving it - SendMessage(new RCDSystemMessage(protoId)); + SendMessage(new RCDSystemMessage(proto.ID)); + + + if (_playerManager.LocalSession?.AttachedEntity == null) + return; + + var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.SetName))); + + if (proto.Mode is RcdMode.ConstructTile or RcdMode.ConstructObject) + { + var name = Loc.GetString(proto.SetName); + + if (proto.Prototype != null && + _prototypeManager.TryIndex(proto.Prototype, out var entProto, logError: false)) + name = entProto.Name; + + msg = Loc.GetString("rcd-component-change-build-mode", ("name", name)); + } + + // Popup message + var popup = EntMan.System(); + popup.PopupClient(msg, Owner, _playerManager.LocalSession.AttachedEntity); + } + + private string GetTooltip(RCDPrototype proto) + { + string tooltip; + + if (proto.Mode is RcdMode.ConstructTile or RcdMode.ConstructObject + && proto.Prototype != null + && _prototypeManager.TryIndex(proto.Prototype, out var entProto, logError: false)) + { + tooltip = Loc.GetString(entProto.Name); + } + else + { + tooltip = Loc.GetString(proto.SetName); + } + + tooltip = OopsConcat(char.ToUpper(tooltip[0]).ToString(), tooltip.Remove(0, 1)); + + return tooltip; + } + + private static string OopsConcat(string a, string b) + { + // This exists to prevent Roslyn being clever and compiling something that fails sandbox checks. + return a + b; } } diff --git a/Content.Client/Rotation/RotationVisualizerSystem.cs b/Content.Client/Rotation/RotationVisualizerSystem.cs index 6d3be4d1c0..8dbcf97320 100644 --- a/Content.Client/Rotation/RotationVisualizerSystem.cs +++ b/Content.Client/Rotation/RotationVisualizerSystem.cs @@ -52,7 +52,7 @@ public sealed class RotationVisualizerSystem : SharedRotationVisualsSystem // Stop the current rotate animation and then start a new one if (_animation.HasRunningAnimation(animationComp, animationKey)) { - _animation.Stop(animationComp, animationKey); + _animation.Stop((uid, animationComp), animationKey); } var animation = new Animation diff --git a/Content.Client/Silicons/StationAi/StationAiBoundUserInterface.cs b/Content.Client/Silicons/StationAi/StationAiBoundUserInterface.cs index 68318305a0..77ac13c972 100644 --- a/Content.Client/Silicons/StationAi/StationAiBoundUserInterface.cs +++ b/Content.Client/Silicons/StationAi/StationAiBoundUserInterface.cs @@ -1,28 +1,46 @@ +using Content.Client.UserInterface.Controls; using Content.Shared.Silicons.StationAi; using Robust.Client.UserInterface; namespace Content.Client.Silicons.StationAi; -public sealed class StationAiBoundUserInterface : BoundUserInterface +public sealed class StationAiBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) { - private StationAiMenu? _menu; - - public StationAiBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) - { - } + private SimpleRadialMenu? _menu; protected override void Open() { base.Open(); - _menu = this.CreateWindow(); - _menu.Track(Owner); - _menu.OnAiRadial += args => + var ev = new GetStationAiRadialEvent(); + EntMan.EventBus.RaiseLocalEvent(Owner, ref ev); + + _menu = this.CreateWindow(); + _menu.Track(Owner); + var buttonModels = ConvertToButtons(ev.Actions); + _menu.SetButtons(buttonModels); + + _menu.Open(); + } + + private IEnumerable ConvertToButtons(IReadOnlyList actions) + { + var models = new RadialMenuActionOption[actions.Count]; + for (int i = 0; i < actions.Count; i++) { - SendPredictedMessage(new StationAiRadialMessage() + var action = actions[i]; + models[i] = new RadialMenuActionOption(HandleRadialMenuClick, action.Event) { - Event = args, - }); - }; + Sprite = action.Sprite, + ToolTip = action.Tooltip + }; + } + + return models; + } + + private void HandleRadialMenuClick(BaseStationAiAction p) + { + SendPredictedMessage(new StationAiRadialMessage { Event = p }); } } diff --git a/Content.Client/Silicons/StationAi/StationAiMenu.xaml b/Content.Client/Silicons/StationAi/StationAiMenu.xaml deleted file mode 100644 index cfa0b93234..0000000000 --- a/Content.Client/Silicons/StationAi/StationAiMenu.xaml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - diff --git a/Content.Client/Silicons/StationAi/StationAiMenu.xaml.cs b/Content.Client/Silicons/StationAi/StationAiMenu.xaml.cs deleted file mode 100644 index a536d911f3..0000000000 --- a/Content.Client/Silicons/StationAi/StationAiMenu.xaml.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System.Numerics; -using Content.Client.UserInterface.Controls; -using Content.Shared.Silicons.StationAi; -using Robust.Client.AutoGenerated; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.XAML; -using Robust.Shared.Timing; - -namespace Content.Client.Silicons.StationAi; - -[GenerateTypedNameReferences] -public sealed partial class StationAiMenu : RadialMenu -{ - [Dependency] private readonly IClyde _clyde = default!; - [Dependency] private readonly IEntityManager _entManager = default!; - - public event Action? OnAiRadial; - - private EntityUid _tracked; - - public StationAiMenu() - { - IoCManager.InjectDependencies(this); - RobustXamlLoader.Load(this); - } - - public void Track(EntityUid owner) - { - _tracked = owner; - - if (!_entManager.EntityExists(_tracked)) - { - Close(); - return; - } - - BuildButtons(); - UpdatePosition(); - } - - private void BuildButtons() - { - var ev = new GetStationAiRadialEvent(); - _entManager.EventBus.RaiseLocalEvent(_tracked, ref ev); - - var main = FindControl("Main"); - main.DisposeAllChildren(); - var sprites = _entManager.System(); - - foreach (var action in ev.Actions) - { - // TODO: This radial boilerplate is quite annoying - var button = new StationAiMenuButton(action.Event) - { - SetSize = new Vector2(64f, 64f), - ToolTip = action.Tooltip != null ? Loc.GetString(action.Tooltip) : null, - }; - - if (action.Sprite != null) - { - var texture = sprites.Frame0(action.Sprite); - var scale = Vector2.One; - - if (texture.Width <= 32) - { - scale *= 2; - } - - var tex = new TextureRect - { - VerticalAlignment = VAlignment.Center, - HorizontalAlignment = HAlignment.Center, - Texture = texture, - TextureScale = scale, - }; - - button.AddChild(tex); - } - - button.OnPressed += args => - { - OnAiRadial?.Invoke(action.Event); - Close(); - }; - main.AddChild(button); - } - } - - protected override void FrameUpdate(FrameEventArgs args) - { - base.FrameUpdate(args); - UpdatePosition(); - } - - private void UpdatePosition() - { - if (!_entManager.TryGetComponent(_tracked, out TransformComponent? xform)) - { - Close(); - return; - } - - if (!xform.Coordinates.IsValid(_entManager)) - { - Close(); - return; - } - - var coords = _entManager.System().GetSpriteScreenCoordinates((_tracked, null, xform)); - - if (!coords.IsValid) - { - Close(); - return; - } - - OpenScreenAt(coords.Position, _clyde); - } -} - -public sealed class StationAiMenuButton(BaseStationAiAction action) : RadialMenuTextureButtonWithSector -{ - public BaseStationAiAction Action = action; -} diff --git a/Content.Client/Temperature/Systems/EntityHeaterSystem.cs b/Content.Client/Temperature/Systems/EntityHeaterSystem.cs new file mode 100644 index 0000000000..300cfa3d44 --- /dev/null +++ b/Content.Client/Temperature/Systems/EntityHeaterSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Temperature.Systems; + +namespace Content.Client.Temperature.Systems; + +public sealed partial class EntityHeaterSystem : SharedEntityHeaterSystem; diff --git a/Content.Client/Turrets/DeployableTurretSystem.cs b/Content.Client/Turrets/DeployableTurretSystem.cs new file mode 100644 index 0000000000..a83997403e --- /dev/null +++ b/Content.Client/Turrets/DeployableTurretSystem.cs @@ -0,0 +1,121 @@ +using Content.Client.Power; +using Content.Shared.Turrets; +using Robust.Client.Animations; +using Robust.Client.GameObjects; + +namespace Content.Client.Turrets; + +public sealed partial class DeployableTurretSystem : SharedDeployableTurretSystem +{ + [Dependency] private readonly AppearanceSystem _appearance = default!; + [Dependency] private readonly AnimationPlayerSystem _animation = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnAnimationCompleted); + SubscribeLocalEvent(OnAppearanceChange); + } + + private void OnComponentInit(Entity ent, ref ComponentInit args) + { + ent.Comp.DeploymentAnimation = new Animation + { + Length = TimeSpan.FromSeconds(ent.Comp.DeploymentLength), + AnimationTracks = { + new AnimationTrackSpriteFlick() { + LayerKey = DeployableTurretVisuals.Turret, + KeyFrames = {new AnimationTrackSpriteFlick.KeyFrame(ent.Comp.DeployingState, 0f)} + }, + } + }; + + ent.Comp.RetractionAnimation = new Animation + { + Length = TimeSpan.FromSeconds(ent.Comp.RetractionLength), + AnimationTracks = { + new AnimationTrackSpriteFlick() { + LayerKey = DeployableTurretVisuals.Turret, + KeyFrames = {new AnimationTrackSpriteFlick.KeyFrame(ent.Comp.RetractingState, 0f)} + }, + } + }; + } + + private void OnAnimationCompleted(Entity ent, ref AnimationCompletedEvent args) + { + if (args.Key != DeployableTurretComponent.AnimationKey) + return; + + if (!TryComp(ent, out var sprite)) + return; + + if (!_appearance.TryGetData(ent, DeployableTurretVisuals.Turret, out var state)) + state = ent.Comp.VisualState; + + // Convert to terminal state + var targetState = state & DeployableTurretState.Deployed; + + UpdateVisuals(ent, targetState, sprite, args.AnimationPlayer); + } + + private void OnAppearanceChange(Entity ent, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (!TryComp(ent, out var animPlayer)) + return; + + if (!_appearance.TryGetData(ent, DeployableTurretVisuals.Turret, out var state, args.Component)) + state = DeployableTurretState.Retracted; + + UpdateVisuals(ent, state, args.Sprite, animPlayer); + } + + private void UpdateVisuals(Entity ent, DeployableTurretState state, SpriteComponent sprite, AnimationPlayerComponent? animPlayer = null) + { + if (!Resolve(ent, ref animPlayer)) + return; + + if (_animation.HasRunningAnimation(ent, animPlayer, DeployableTurretComponent.AnimationKey)) + return; + + if (state == ent.Comp.VisualState) + return; + + var targetState = state & DeployableTurretState.Deployed; + var destinationState = ent.Comp.VisualState & DeployableTurretState.Deployed; + + if (targetState != destinationState) + targetState = targetState | DeployableTurretState.Retracting; + + ent.Comp.VisualState = state; + + // Toggle layer visibility + sprite.LayerSetVisible(DeployableTurretVisuals.Weapon, (targetState & DeployableTurretState.Deployed) > 0); + sprite.LayerSetVisible(PowerDeviceVisualLayers.Powered, HasAmmo(ent) && targetState == DeployableTurretState.Retracted); + + // Change the visual state + switch (targetState) + { + case DeployableTurretState.Deploying: + _animation.Play((ent, animPlayer), (Animation)ent.Comp.DeploymentAnimation, DeployableTurretComponent.AnimationKey); + break; + + case DeployableTurretState.Retracting: + _animation.Play((ent, animPlayer), (Animation)ent.Comp.RetractionAnimation, DeployableTurretComponent.AnimationKey); + break; + + case DeployableTurretState.Deployed: + sprite.LayerSetState(DeployableTurretVisuals.Turret, ent.Comp.DeployedState); + break; + + case DeployableTurretState.Retracted: + sprite.LayerSetState(DeployableTurretVisuals.Turret, ent.Comp.RetractedState); + break; + } + } +} diff --git a/Content.Client/UserInterface/Controls/RadialMenu.cs b/Content.Client/UserInterface/Controls/RadialMenu.cs index 1b7f07aa2c..9734cf2960 100644 --- a/Content.Client/UserInterface/Controls/RadialMenu.cs +++ b/Content.Client/UserInterface/Controls/RadialMenu.cs @@ -1,10 +1,10 @@ -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.CustomControls; using System.Linq; using System.Numerics; using Content.Shared.Input; using Robust.Client.Graphics; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Input; namespace Content.Client.UserInterface.Controls; @@ -143,11 +143,8 @@ public class RadialMenu : BaseWindow return children.First(x => x.Visible); } - public bool TryToMoveToNewLayer(string newLayer) + public bool TryToMoveToNewLayer(Control newLayer) { - if (newLayer == string.Empty) - return false; - var currentLayer = GetCurrentActiveLayer(); if (currentLayer == null) @@ -161,7 +158,7 @@ public class RadialMenu : BaseWindow continue; // Hide layers which are not of interest - if (result == true || child.Name != newLayer) + if (result == true || child != newLayer) { child.Visible = false; } @@ -186,6 +183,19 @@ public class RadialMenu : BaseWindow return result; } + public bool TryToMoveToNewLayer(string targetLayerControlName) + { + foreach (var child in Children) + { + if (child.Name == targetLayerControlName && child is RadialContainer) + { + return TryToMoveToNewLayer(child); + } + } + + return false; + } + public void ReturnToPreviousLayer() { // Close the menu if the traversal path is empty @@ -296,9 +306,15 @@ public sealed class RadialMenuOuterAreaButton : RadialMenuTextureButtonBase public class RadialMenuTextureButton : RadialMenuTextureButtonBase { /// - /// Upon clicking this button the radial menu will be moved to the named layer + /// Upon clicking this button the radial menu will be moved to the layer of this control. /// - public string TargetLayer { get; set; } = string.Empty; + public Control? TargetLayer { get; set; } + + /// + /// Other way to set navigation to other container, as , + /// but using property of target . + /// + public string? TargetLayerControlName { get; set; } /// /// A simple texture button that can move the user to a different layer within a radial menu @@ -311,7 +327,7 @@ public class RadialMenuTextureButton : RadialMenuTextureButtonBase private void OnClicked(ButtonEventArgs args) { - if (TargetLayer == string.Empty) + if (TargetLayer == null && TargetLayerControlName == null) return; var parent = FindParentMultiLayerContainer(this); @@ -319,7 +335,14 @@ public class RadialMenuTextureButton : RadialMenuTextureButtonBase if (parent == null) return; - parent.TryToMoveToNewLayer(TargetLayer); + if (TargetLayer != null) + { + parent.TryToMoveToNewLayer(TargetLayer); + } + else + { + parent.TryToMoveToNewLayer(TargetLayerControlName!); + } } private RadialMenu? FindParentMultiLayerContainer(Control control) @@ -387,7 +410,7 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia private Color _hoverBorderColorSrgb = Color.ToSrgb(new Color(87, 91, 127, 128)); /// - /// Marker, that control should render border of segment. Is false by default. + /// Marker, that controls if border of segment should be rendered. Is false by default. /// /// /// By default color of border is same as color of background. Use @@ -400,13 +423,6 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia /// public bool DrawBackground { get; set; } = true; - /// - /// Marker, that control should render separator lines. - /// Separator lines are used to visually separate sector of radial menu items. - /// Is true by default - /// - public bool DrawSeparators { get; set; } = true; - /// /// Color of background in non-hovered state. Accepts RGB color, works with sRGB for DrawPrimitive internally. /// @@ -520,7 +536,7 @@ public class RadialMenuTextureButtonWithSector : RadialMenuTextureButton, IRadia DrawAnnulusSector(handle, containerCenter, _innerRadius * UIScale, _outerRadius * UIScale, angleFrom, angleTo, borderColor, false); } - if (!_isWholeCircle && DrawSeparators) + if (!_isWholeCircle && DrawBorder) { DrawSeparatorLines(handle, containerCenter, _innerRadius * UIScale, _outerRadius * UIScale, angleFrom, angleTo, SeparatorColor); } diff --git a/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml new file mode 100644 index 0000000000..307064334d --- /dev/null +++ b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml @@ -0,0 +1,8 @@ + + diff --git a/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs new file mode 100644 index 0000000000..15c8065a44 --- /dev/null +++ b/Content.Client/UserInterface/Controls/SimpleRadialMenu.xaml.cs @@ -0,0 +1,279 @@ +using Robust.Client.UserInterface; +using System.Numerics; +using Robust.Client.AutoGenerated; +using Robust.Client.Graphics; +using Robust.Shared.Utility; +using Robust.Client.GameObjects; +using Robust.Shared.Timing; +using Robust.Client.UserInterface.XAML; +using Robust.Client.Input; + +namespace Content.Client.UserInterface.Controls; + +[GenerateTypedNameReferences] +public partial class SimpleRadialMenu : RadialMenu +{ + private EntityUid? _attachMenuToEntity; + + [Dependency] private readonly IClyde _clyde = default!; + [Dependency] private readonly IEntityManager _entManager = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + + public SimpleRadialMenu() + { + IoCManager.InjectDependencies(this); + RobustXamlLoader.Load(this); + } + + public void Track(EntityUid owner) + { + _attachMenuToEntity = owner; + } + + public void SetButtons(IEnumerable models, SimpleRadialMenuSettings? settings = null) + { + ClearExistingChildrenRadialButtons(); + + var sprites = _entManager.System(); + Fill(models, sprites, Children, settings ?? new SimpleRadialMenuSettings()); + } + + public void OpenOverMouseScreenPosition() + { + var vpSize = _clyde.ScreenSize; + OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize); + } + + private void Fill( + IEnumerable models, + SpriteSystem sprites, + ICollection rootControlChildren, + SimpleRadialMenuSettings settings + ) + { + var rootContainer = new RadialContainer + { + HorizontalExpand = true, + VerticalExpand = true, + InitialRadius = settings.DefaultContainerRadius, + ReserveSpaceForHiddenChildren = false, + Visible = true + }; + rootControlChildren.Add(rootContainer); + + foreach (var model in models) + { + if (model is RadialMenuNestedLayerOption nestedMenuModel) + { + var linkButton = RecursiveContainerExtraction(sprites, rootControlChildren, nestedMenuModel, settings); + linkButton.Visible = true; + rootContainer.AddChild(linkButton); + } + else + { + var rootButtons = ConvertToButton(model, sprites, settings, false); + rootContainer.AddChild(rootButtons); + } + } + } + + private RadialMenuTextureButton RecursiveContainerExtraction( + SpriteSystem sprites, + ICollection rootControlChildren, + RadialMenuNestedLayerOption model, + SimpleRadialMenuSettings settings + ) + { + var container = new RadialContainer + { + HorizontalExpand = true, + VerticalExpand = true, + InitialRadius = model.ContainerRadius!.Value, + ReserveSpaceForHiddenChildren = false, + Visible = false + }; + foreach (var nested in model.Nested) + { + if (nested is RadialMenuNestedLayerOption nestedMenuModel) + { + var linkButton = RecursiveContainerExtraction(sprites, rootControlChildren, nestedMenuModel, settings); + container.AddChild(linkButton); + } + else + { + var button = ConvertToButton(nested, sprites, settings, false); + container.AddChild(button); + } + } + rootControlChildren.Add(container); + + var thisLayerLinkButton = ConvertToButton(model, sprites, settings, true); + thisLayerLinkButton.TargetLayer = container; + return thisLayerLinkButton; + } + + private RadialMenuTextureButton ConvertToButton( + RadialMenuOption model, + SpriteSystem sprites, + SimpleRadialMenuSettings settings, + bool haveNested + ) + { + var button = settings.UseSectors + ? ConvertToButtonWithSector(model, settings) + : new RadialMenuTextureButton(); + button.SetSize = new Vector2(64f, 64f); + button.ToolTip = model.ToolTip; + if (model.Sprite != null) + { + var scale = Vector2.One; + + var texture = sprites.Frame0(model.Sprite); + if (texture.Width <= 32) + { + scale *= 2; + } + + button.TextureNormal = texture; + button.Scale = scale; + } + + if (model is RadialMenuActionOption actionOption) + { + button.OnPressed += _ => + { + actionOption.OnPressed?.Invoke(); + if(!haveNested) + Close(); + }; + } + + return button; + } + + private static RadialMenuTextureButtonWithSector ConvertToButtonWithSector(RadialMenuOption model, SimpleRadialMenuSettings settings) + { + var button = new RadialMenuTextureButtonWithSector + { + DrawBorder = settings.DisplayBorders, + DrawBackground = !settings.NoBackground + }; + if (model.BackgroundColor.HasValue) + { + button.BackgroundColor = model.BackgroundColor.Value; + } + + if (model.HoverBackgroundColor.HasValue) + { + button.HoverBackgroundColor = model.HoverBackgroundColor.Value; + } + + return button; + } + + private void ClearExistingChildrenRadialButtons() + { + var toRemove = new List(ChildCount); + foreach (var child in Children) + { + if (child != ContextualButton && child != MenuOuterAreaButton) + { + toRemove.Add(child); + } + } + + foreach (var control in toRemove) + { + Children.Remove(control); + } + } + + #region target entity tracking + + protected override void FrameUpdate(FrameEventArgs args) + { + base.FrameUpdate(args); + if (_attachMenuToEntity != null) + { + UpdatePosition(); + } + } + + private void UpdatePosition() + { + if (!_entManager.TryGetComponent(_attachMenuToEntity, out TransformComponent? xform)) + { + Close(); + return; + } + + if (!xform.Coordinates.IsValid(_entManager)) + { + Close(); + return; + } + + var coords = _entManager.System().GetSpriteScreenCoordinates((_attachMenuToEntity.Value, null, xform)); + + if (!coords.IsValid) + { + Close(); + return; + } + + OpenScreenAt(coords.Position, _clyde); + } + + #endregion + +} + + +public abstract class RadialMenuOption +{ + public string? ToolTip { get; init; } + + public SpriteSpecifier? Sprite { get; init; } + public Color? BackgroundColor { get; set; } + public Color? HoverBackgroundColor { get; set; } +} + +public class RadialMenuActionOption(Action onPressed) : RadialMenuOption +{ + public Action OnPressed { get; } = onPressed; +} + +public class RadialMenuActionOption(Action onPressed, T data) + : RadialMenuActionOption(onPressed: () => onPressed(data)); + +public class RadialMenuNestedLayerOption(IReadOnlyCollection nested, float containerRadius = 100) + : RadialMenuOption +{ + public float? ContainerRadius { get; } = containerRadius; + + public IReadOnlyCollection Nested { get; } = nested; +} + +public class SimpleRadialMenuSettings +{ + /// + /// Default container draw radius. Is going to be further affected by per sector increment. + /// + public int DefaultContainerRadius = 100; + + /// + /// Marker, if sector-buttons should be used. + /// + public bool UseSectors = true; + + /// + /// Marker, if border of buttons should be rendered. Can only be used when = true. + /// + public bool DisplayBorders = true; + + /// + /// Marker, if sector background should not be rendered. Can only be used when = true. + /// + public bool NoBackground = false; +} + diff --git a/Content.Client/UserInterface/Systems/Emotes/EmotesUIController.cs b/Content.Client/UserInterface/Systems/Emotes/EmotesUIController.cs index 7b86859a1a..7652e39bfd 100644 --- a/Content.Client/UserInterface/Systems/Emotes/EmotesUIController.cs +++ b/Content.Client/UserInterface/Systems/Emotes/EmotesUIController.cs @@ -1,16 +1,17 @@ -using Content.Client.Chat.UI; using Content.Client.Gameplay; using Content.Client.UserInterface.Controls; using Content.Shared.Chat; using Content.Shared.Chat.Prototypes; using Content.Shared.Input; +using Content.Shared.Speech; +using Content.Shared.Whitelist; using JetBrains.Annotations; -using Robust.Client.Graphics; -using Robust.Client.Input; +using Robust.Client.Player; using Robust.Client.UserInterface.Controllers; using Robust.Client.UserInterface.Controls; using Robust.Shared.Input.Binding; using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Client.UserInterface.Systems.Emotes; @@ -18,11 +19,19 @@ namespace Content.Client.UserInterface.Systems.Emotes; public sealed class EmotesUIController : UIController, IOnStateChanged { [Dependency] private readonly IEntityManager _entityManager = default!; - [Dependency] private readonly IClyde _displayManager = default!; - [Dependency] private readonly IInputManager _inputManager = default!; - + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + private MenuButton? EmotesButton => UIManager.GetActiveUIWidgetOrNull()?.EmotesButton; - private EmotesMenu? _menu; + private SimpleRadialMenu? _menu; + + private static readonly Dictionary EmoteGroupingInfo + = new Dictionary + { + [EmoteCategory.General] = ("emote-menu-category-general", new SpriteSpecifier.Texture(new ResPath("/Textures/Clothing/Head/Soft/mimesoft.rsi/icon.png"))), + [EmoteCategory.Hands] = ("emote-menu-category-hands", new SpriteSpecifier.Texture(new ResPath("/Textures/Clothing/Hands/Gloves/latex.rsi/icon.png"))), + [EmoteCategory.Vocal] = ("emote-menu-category-vocal", new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/Emotes/vocal.png"))), + }; public void OnStateEntered(GameplayState state) { @@ -42,10 +51,16 @@ public sealed class EmotesUIController : UIController, IOnStateChanged(); + var prototypes = _prototypeManager.EnumeratePrototypes(); + var models = ConvertToButtons(prototypes); + + _menu = new SimpleRadialMenu(); + _menu.SetButtons(models); + + _menu.Open(); + _menu.OnClose += OnWindowClosed; _menu.OnOpen += OnWindowOpen; - _menu.OnPlayEmote += OnPlayEmote; if (EmotesButton != null) EmotesButton.SetClickPressed(true); @@ -56,16 +71,13 @@ public sealed class EmotesUIController : UIController, IOnStateChanged protoId) + private IEnumerable ConvertToButtons(IEnumerable emotePrototypes) { - _entityManager.RaisePredictiveEvent(new PlayEmoteMessage(protoId)); + var whitelistSystem = EntitySystemManager.GetEntitySystem(); + var player = _playerManager.LocalSession?.AttachedEntity; + + Dictionary> emotesByCategory = new(); + foreach (var emote in emotePrototypes) + { + if(emote.Category == EmoteCategory.Invalid) + continue; + + // only valid emotes that have ways to be triggered by chat and player have access / no restriction on + if (emote.Category == EmoteCategory.Invalid + || emote.ChatTriggers.Count == 0 + || !(player.HasValue && whitelistSystem.IsWhitelistPassOrNull(emote.Whitelist, player.Value)) + || whitelistSystem.IsBlacklistPass(emote.Blacklist, player.Value)) + continue; + + if (!emote.Available + && EntityManager.TryGetComponent(player.Value, out var speech) + && !speech.AllowedEmotes.Contains(emote.ID)) + continue; + + if (!emotesByCategory.TryGetValue(emote.Category, out var list)) + { + list = new List(); + emotesByCategory.Add(emote.Category, list); + } + + var actionOption = new RadialMenuActionOption(HandleRadialButtonClick, emote) + { + Sprite = emote.Icon, + ToolTip = Loc.GetString(emote.Name) + }; + list.Add(actionOption); + } + + var models = new RadialMenuOption[emotesByCategory.Count]; + var i = 0; + foreach (var (key, list) in emotesByCategory) + { + var tuple = EmoteGroupingInfo[key]; + + models[i] = new RadialMenuNestedLayerOption(list) + { + Sprite = tuple.Sprite, + ToolTip = Loc.GetString(tuple.Tooltip) + }; + i++; + } + + return models; + } + + private void HandleRadialButtonClick(EmotePrototype prototype) + { + _entityManager.RaisePredictiveEvent(new PlayEmoteMessage(prototype.ID)); } } diff --git a/Content.Client/UserInterface/Systems/Storage/Controls/StorageWindow.cs b/Content.Client/UserInterface/Systems/Storage/Controls/StorageWindow.cs index a4afebc217..39ffd883bb 100644 --- a/Content.Client/UserInterface/Systems/Storage/Controls/StorageWindow.cs +++ b/Content.Client/UserInterface/Systems/Storage/Controls/StorageWindow.cs @@ -42,6 +42,9 @@ public sealed class StorageWindow : BaseWindow private ValueList _contained = new(); private ValueList _toRemove = new(); + // Manually store this because you can't have a 0x0 GridContainer but we still need to add child controls for 1x1 containers. + private Vector2i _pieceGridSize; + private TextureButton? _backButton; private bool _isDirty; @@ -408,11 +411,14 @@ public sealed class StorageWindow : BaseWindow _contained.Clear(); _contained.AddRange(storageComp.Container.ContainedEntities.Reverse()); + var width = boundingGrid.Width + 1; + var height = boundingGrid.Height + 1; + // Build the grid representation - if (_pieceGrid.Rows - 1 != boundingGrid.Height || _pieceGrid.Columns - 1 != boundingGrid.Width) + if (_pieceGrid.Rows != _pieceGridSize.Y || _pieceGrid.Columns != _pieceGridSize.X) { - _pieceGrid.Rows = boundingGrid.Height + 1; - _pieceGrid.Columns = boundingGrid.Width + 1; + _pieceGrid.Rows = height; + _pieceGrid.Columns = width; _controlGrid.Clear(); for (var y = boundingGrid.Bottom; y <= boundingGrid.Top; y++) @@ -430,6 +436,7 @@ public sealed class StorageWindow : BaseWindow } } + _pieceGridSize = new(width, height); _toRemove.Clear(); // Remove entities no longer relevant / Update existing ones diff --git a/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs b/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs index 895bb2cf87..3f703ce774 100644 --- a/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs +++ b/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs @@ -12,35 +12,6 @@ namespace Content.IntegrationTests.Tests.Access [TestOf(typeof(AccessReaderComponent))] public sealed class AccessReaderTest { - [Test] - public async Task TestProtoTags() - { - await using var pair = await PoolManager.GetServerClient(); - var server = pair.Server; - - var protoManager = server.ResolveDependency(); - var accessName = server.ResolveDependency().GetComponentName(typeof(AccessReaderComponent)); - - await server.WaitAssertion(() => - { - foreach (var ent in protoManager.EnumeratePrototypes()) - { - if (!ent.Components.TryGetComponent(accessName, out var access)) - continue; - - var reader = (AccessReaderComponent) access; - var allTags = reader.AccessLists.SelectMany(c => c).Union(reader.DenyTags); - - foreach (var level in allTags) - { - Assert.That(protoManager.HasIndex(level), $"Invalid access level: {level} found on {ent}"); - } - } - }); - - await pair.CleanReturnAsync(); - } - [Test] public async Task TestTags() { diff --git a/Content.IntegrationTests/Tests/Embedding/EmbedTest.cs b/Content.IntegrationTests/Tests/Embedding/EmbedTest.cs index 5e09b5c482..f9db064163 100644 --- a/Content.IntegrationTests/Tests/Embedding/EmbedTest.cs +++ b/Content.IntegrationTests/Tests/Embedding/EmbedTest.cs @@ -1,5 +1,6 @@ using Content.IntegrationTests.Tests.Interaction; using Content.Shared.Projectiles; +using Robust.Shared.GameObjects; using Robust.Shared.Network; namespace Content.IntegrationTests.Tests.Embedding; @@ -88,4 +89,84 @@ public sealed class EmbedTest : InteractionTest AssertExists(projectile); await AssertEntityLookup(EmbeddableProtoId); } + + /// + /// Throws two embeddable projectiles at a target, then deletes them + /// one at a time, making sure that they are tracked correctly and that + /// the is removed once all + /// projectiles are gone. + /// + [Test] + public async Task TestDeleteWhileEmbedded() + { + // Spawn the target we're going to throw at + await SpawnTarget(TargetProtoId); + + // Give the player the embeddable to throw + var projectile1 = await PlaceInHands(EmbeddableProtoId); + Assert.That(TryComp(projectile1, out var embedComp), + $"{EmbeddableProtoId} does not have EmbeddableProjectileComponent."); + // Make sure the projectile isn't already embedded into anything + Assert.That(embedComp.EmbeddedIntoUid, Is.Null, + $"Projectile already embedded into {SEntMan.ToPrettyString(embedComp.EmbeddedIntoUid)}."); + + // Have the player throw the embeddable at the target + await ThrowItem(); + + // Give the player a second embeddable to throw + var projectile2 = await PlaceInHands(EmbeddableProtoId); + Assert.That(TryComp(projectile1, out var embedComp2), + $"{EmbeddableProtoId} does not have EmbeddableProjectileComponent."); + + // Wait a moment for the projectile to hit and embed + await RunSeconds(0.5f); + + // Make sure the projectile is embedded into the target + Assert.That(embedComp.EmbeddedIntoUid, Is.EqualTo(ToServer(Target)), + "First projectile not embedded into target."); + Assert.That(TryComp(out var containerComp), + "Target was not given EmbeddedContainerComponent."); + Assert.That(containerComp.EmbeddedObjects, Does.Contain(ToServer(projectile1)), + "Target is not tracking the first projectile as embedded."); + Assert.That(containerComp.EmbeddedObjects, Has.Count.EqualTo(1), + "Target has unexpected EmbeddedObjects count."); + + // Wait for the cooldown between throws + await RunSeconds(Hands.ThrowCooldown.Seconds); + + // Throw the second projectile + await ThrowItem(); + + // Wait a moment for the second projectile to hit and embed + await RunSeconds(0.5f); + + Assert.That(embedComp2.EmbeddedIntoUid, Is.EqualTo(ToServer(Target)), + "Second projectile not embedded into target"); + AssertComp(); + Assert.That(containerComp.EmbeddedObjects, Does.Contain(ToServer(projectile1)), + "Target is not tracking the second projectile as embedded."); + Assert.That(containerComp.EmbeddedObjects, Has.Count.EqualTo(2), + "Target EmbeddedObjects count did not increase with second projectile."); + + // Delete the first projectile + await Delete(projectile1); + + Assert.That(containerComp.EmbeddedObjects, Does.Not.Contain(ToServer(projectile1)), + "Target did not stop tracking first projectile after it was deleted."); + Assert.That(containerComp.EmbeddedObjects, Does.Not.Contain(EntityUid.Invalid), + "Target EmbeddedObjects contains an invalid entity."); + foreach (var embedded in containerComp.EmbeddedObjects) + { + Assert.That(!SEntMan.Deleted(embedded), + "Target EmbeddedObjects contains a deleted entity."); + } + Assert.That(containerComp.EmbeddedObjects, Has.Count.EqualTo(1), + "Target EmbeddedObjects count did not decrease after deleting first projectile."); + + // Delete the second projectile + await Delete(projectile2); + + Assert.That(!SEntMan.HasComponent(ToServer(Target)), + "Target did not remove EmbeddedContainerComponent after both projectiles were deleted."); + } } diff --git a/Content.IntegrationTests/Tests/UserInterface/UiControlTest.cs b/Content.IntegrationTests/Tests/UserInterface/UiControlTest.cs index c8378bb661..5efa009ca7 100644 --- a/Content.IntegrationTests/Tests/UserInterface/UiControlTest.cs +++ b/Content.IntegrationTests/Tests/UserInterface/UiControlTest.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Client.Chat.UI; using Content.Client.LateJoin; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.ContentPack; @@ -14,7 +13,6 @@ public sealed class UiControlTest // You should not be adding to this. private Type[] _ignored = new Type[] { - typeof(EmotesMenu), typeof(LateJoinGui), }; diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index b8a05c3e8f..79c5c86fe1 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -1,9 +1,11 @@ using Content.Server.Administration.Commands; using Content.Server.Antag; +using Content.Server.GameTicking; using Content.Server.GameTicking.Rules.Components; using Content.Server.Zombies; using Content.Shared.Administration; using Content.Shared.Database; +using Content.Shared.Humanoid; using Content.Shared.Mind.Components; using Content.Shared.Roles; using Content.Shared.Verbs; @@ -17,6 +19,7 @@ public sealed partial class AdminVerbSystem { [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly ZombieSystem _zombie = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; [ValidatePrototypeId] private const string DefaultTraitorRule = "Traitor"; @@ -36,6 +39,8 @@ public sealed partial class AdminVerbSystem [ValidatePrototypeId] private const string PirateGearId = "PirateGear"; + private readonly EntProtoId _paradoxCloneRuleId = "ParadoxCloneSpawn"; + // All antag verbs have names so invokeverb works. private void AddAntagVerbs(GetVerbsEvent args) { @@ -157,5 +162,29 @@ public sealed partial class AdminVerbSystem Message = string.Join(": ", thiefName, Loc.GetString("admin-verb-make-thief")), }; args.Verbs.Add(thief); + + var paradoxCloneName = Loc.GetString("admin-verb-text-make-paradox-clone"); + Verb paradox = new() + { + Text = paradoxCloneName, + Category = VerbCategory.Antag, + Icon = new SpriteSpecifier.Rsi(new("/Textures/Interface/Misc/job_icons.rsi"), "ParadoxClone"), + Act = () => + { + var ruleEnt = _gameTicker.AddGameRule(_paradoxCloneRuleId); + + if (!TryComp(ruleEnt, out var paradoxCloneRuleComp)) + return; + + paradoxCloneRuleComp.OriginalBody = args.Target; // override the target player + + _gameTicker.StartGameRule(ruleEnt); + }, + Impact = LogImpact.High, + Message = string.Join(": ", paradoxCloneName, Loc.GetString("admin-verb-make-paradox-clone")), + }; + + if (HasComp(args.Target)) // only humanoids can be cloned + args.Verbs.Add(paradox); } } diff --git a/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs b/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs index 23e0e472f0..7983493961 100644 --- a/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs @@ -81,14 +81,14 @@ public sealed class ProjectileAnomalySystem : EntitySystem EntityCoordinates targetCoords, float severity) { - var mapPos = coords.ToMap(EntityManager, _xform); + var mapPos = _xform.ToMapCoordinates(coords); var spawnCoords = _mapManager.TryFindGridAt(mapPos, out var gridUid, out _) - ? coords.WithEntityId(gridUid, EntityManager) + ? _xform.WithEntityId(coords, gridUid) : new(_mapManager.GetMapEntityId(mapPos.MapId), mapPos.Position); var ent = Spawn(component.ProjectilePrototype, spawnCoords); - var direction = targetCoords.ToMapPos(EntityManager, _xform) - mapPos.Position; + var direction = _xform.ToMapCoordinates(targetCoords).Position - mapPos.Position; if (!TryComp(ent, out var comp)) return; diff --git a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs index 983cf2c8f4..1f3a6520d4 100644 --- a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs @@ -16,7 +16,6 @@ public sealed class TechAnomalySystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly BeamSystem _beam = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly EmagSystem _emag = default!; public override void Initialize() { diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs index 5f0092f377..63944cd530 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Atmos.Piping.Components; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.EntitySystems; @@ -17,6 +18,7 @@ public sealed class GasPressurePumpSystem : SharedGasPressurePumpSystem [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly SharedAmbientSoundSystem _ambientSoundSystem = default!; [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; + [Dependency] private readonly PowerReceiverSystem _power = default!; public override void Initialize() { @@ -25,33 +27,33 @@ public sealed class GasPressurePumpSystem : SharedGasPressurePumpSystem SubscribeLocalEvent(OnPumpUpdated); } - private void OnPumpUpdated(EntityUid uid, GasPressurePumpComponent pump, ref AtmosDeviceUpdateEvent args) + private void OnPumpUpdated(Entity ent, ref AtmosDeviceUpdateEvent args) { - if (!pump.Enabled - || (TryComp(uid, out var power) && !power.Powered) - || !_nodeContainer.TryGetNodes(uid, pump.InletName, pump.OutletName, out PipeNode? inlet, out PipeNode? outlet)) + if (!ent.Comp.Enabled + || !_power.IsPowered(ent) + || !_nodeContainer.TryGetNodes(ent.Owner, ent.Comp.InletName, ent.Comp.OutletName, out PipeNode? inlet, out PipeNode? outlet)) { - _ambientSoundSystem.SetAmbience(uid, false); + _ambientSoundSystem.SetAmbience(ent, false); return; } var outputStartingPressure = outlet.Air.Pressure; - if (outputStartingPressure >= pump.TargetPressure) + if (outputStartingPressure >= ent.Comp.TargetPressure) { - _ambientSoundSystem.SetAmbience(uid, false); + _ambientSoundSystem.SetAmbience(ent, false); return; // No need to pump gas if target has been reached. } if (inlet.Air.TotalMoles > 0 && inlet.Air.Temperature > 0) { // We calculate the necessary moles to transfer using our good ol' friend PV=nRT. - var pressureDelta = pump.TargetPressure - outputStartingPressure; + var pressureDelta = ent.Comp.TargetPressure - outputStartingPressure; var transferMoles = (pressureDelta * outlet.Air.Volume) / (inlet.Air.Temperature * Atmospherics.R); var removed = inlet.Air.Remove(transferMoles); _atmosphereSystem.Merge(outlet.Air, removed); - _ambientSoundSystem.SetAmbience(uid, removed.TotalMoles > 0f); + _ambientSoundSystem.SetAmbience(ent, removed.TotalMoles > 0f); } } } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs index 128754bbf8..c277352b6f 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasPortableSystem.cs @@ -1,10 +1,8 @@ using System.Diagnostics.CodeAnalysis; using Content.Server.Atmos.Piping.Binary.Components; using Content.Server.Atmos.Piping.Unary.Components; -using Content.Server.NodeContainer; using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.Nodes; -using Content.Shared.Atmos.Piping.Unary.Components; using Content.Shared.Construction.Components; using JetBrains.Annotations; using Robust.Shared.Map; @@ -16,7 +14,6 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems public sealed class GasPortableSystem : EntitySystem { [Dependency] private readonly SharedMapSystem _mapSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly NodeContainerSystem _nodeContainer = default!; public override void Initialize() diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs index 75c46abe37..c86ff802ce 100644 --- a/Content.Server/Chat/Managers/ChatManager.cs +++ b/Content.Server/Chat/Managers/ChatManager.cs @@ -246,7 +246,7 @@ internal sealed partial class ChatManager : IChatManager Color? colorOverride = null; var wrappedMessage = Loc.GetString("chat-manager-send-ooc-wrap-message", ("playerName",player.Name), ("message", FormattedMessage.EscapeText(message))); - if (_adminManager.HasAdminFlag(player, AdminFlags.Admin)) + if (_adminManager.HasAdminFlag(player, AdminFlags.NameColor)) { var prefs = _preferencesManager.GetPreferences(player.UserId); colorOverride = prefs.AdminOOCColor; diff --git a/Content.Server/Destructible/DestructibleComponent.cs b/Content.Server/Destructible/DestructibleComponent.cs index 5c593fb083..d154811c78 100644 --- a/Content.Server/Destructible/DestructibleComponent.cs +++ b/Content.Server/Destructible/DestructibleComponent.cs @@ -9,8 +9,17 @@ namespace Content.Server.Destructible [RegisterComponent] public sealed partial class DestructibleComponent : Component { - [DataField("thresholds")] + /// + /// A list of damage thresholds for the entity; + /// includes their triggers and resultant behaviors + /// + [DataField] public List Thresholds = new(); + /// + /// Specifies whether the entity has passed a damage threshold that causes it to break + /// + [DataField] + public bool IsBroken = false; } } diff --git a/Content.Server/Destructible/DestructibleSystem.cs b/Content.Server/Destructible/DestructibleSystem.cs index 48b38e9d01..ca7f975e60 100644 --- a/Content.Server/Destructible/DestructibleSystem.cs +++ b/Content.Server/Destructible/DestructibleSystem.cs @@ -57,6 +57,8 @@ namespace Content.Server.Destructible /// public void Execute(EntityUid uid, DestructibleComponent component, DamageChangedEvent args) { + component.IsBroken = false; + foreach (var threshold in component.Thresholds) { if (threshold.Reached(args.Damageable, this)) @@ -96,6 +98,12 @@ namespace Content.Server.Destructible threshold.Execute(uid, this, EntityManager, args.Origin); } + if (threshold.OldTriggered) + { + component.IsBroken |= threshold.Behaviors.Any(b => b is DoActsBehavior doActsBehavior && + (doActsBehavior.HasAct(ThresholdActs.Breakage) || doActsBehavior.HasAct(ThresholdActs.Destruction))); + } + // if destruction behavior (or some other deletion effect) occurred, don't run other triggers. if (EntityManager.IsQueuedForDeletion(uid) || Deleted(uid)) return; diff --git a/Content.Server/GameTicking/GameTicker.Player.cs b/Content.Server/GameTicking/GameTicker.Player.cs index f376408130..2c3dcaba43 100644 --- a/Content.Server/GameTicking/GameTicker.Player.cs +++ b/Content.Server/GameTicking/GameTicker.Player.cs @@ -33,7 +33,7 @@ namespace Content.Server.GameTicking if (args.NewStatus != SessionStatus.Disconnected) { mind.Session = session; - _pvsOverride.AddSessionOverride(GetNetEntity(mindId.Value), session); + _pvsOverride.AddSessionOverride(mindId.Value, session); } DebugTools.Assert(mind.Session == session); diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 7ab6cfdc63..0e8f8bda1e 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -196,7 +196,7 @@ namespace Content.Server.GameTicking if (ev.GameMap.IsGrid) { - var mapUid = _map.CreateMap(out mapId); + var mapUid = _map.CreateMap(out mapId, runMapInit: options?.InitializeMaps ?? false); if (!_loader.TryLoadGrid(mapId, ev.GameMap.MapPath, out var grid, @@ -557,7 +557,7 @@ namespace Content.Server.GameTicking if (TryGetEntity(mind.OriginalOwnedEntity, out var entity) && pvsOverride) { - _pvsOverride.AddGlobalOverride(GetNetEntity(entity.Value), recursive: true); + _pvsOverride.AddGlobalOverride(entity.Value); } var roles = _roles.MindGetAllRoleInfo(mindId); diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 561e1cb787..26242925aa 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -427,7 +427,7 @@ namespace Content.Server.GameTicking // Ideally engine would just spawn them on grid directly I guess? Right now grid traversal is handling it during // update which means we need to add a hack somewhere around it. var spawn = _robustRandom.Pick(_possiblePositions); - var toMap = spawn.ToMap(EntityManager, _transform); + var toMap = _transform.ToMapCoordinates(spawn); if (_mapManager.TryFindGridAt(toMap, out var gridUid, out _)) { diff --git a/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs index 143659748a..e28a0bc35f 100644 --- a/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs @@ -22,12 +22,19 @@ public sealed partial class ParadoxCloneRuleComponent : Component [DataField] public EntProtoId GibProto = "MobParadoxTimed"; + /// + /// Entity of the original player. + /// Gets randomly chosen from all alive players if not specified. + /// + [DataField] + public EntityUid? OriginalBody; + /// /// Mind entity of the original player. /// Gets assigned when cloning. /// [DataField] - public EntityUid? Original; + public EntityUid? OriginalMind; /// /// Whitelist for Objectives to be copied to the clone. diff --git a/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs b/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs index 8a5cab85b8..ab8864caaa 100644 --- a/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs @@ -47,28 +47,42 @@ public sealed class ParadoxCloneRuleSystem : GameRuleSystem(clone.Value); - targetComp.Target = playerToClone.Owner; // set the kill target + targetComp.Target = ent.Comp.OriginalMind; // set the kill target var gibComp = EnsureComp(clone.Value); gibComp.SpawnProto = ent.Comp.GibProto; @@ -78,17 +92,16 @@ public sealed class ParadoxCloneRuleSystem : GameRuleSystem ent, ref AfterAntagEntitySelectedEvent args) { - if (ent.Comp.Original == null) + if (ent.Comp.OriginalMind == null) return; if (!_mind.TryGetMind(args.EntityUid, out var cloneMindId, out var cloneMindComp)) return; - _mind.CopyObjectives(ent.Comp.Original.Value, (cloneMindId, cloneMindComp), ent.Comp.ObjectiveWhitelist, ent.Comp.ObjectiveBlacklist); + _mind.CopyObjectives(ent.Comp.OriginalMind.Value, (cloneMindId, cloneMindComp), ent.Comp.ObjectiveWhitelist, ent.Comp.ObjectiveBlacklist); } } diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 341993ce2f..e8c3fe7028 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Examine; using Content.Shared.Guardian; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; +using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Mobs; @@ -188,7 +189,9 @@ namespace Content.Server.Guardian // Can only inject things with the component... if (!HasComp(target)) { - _popupSystem.PopupEntity(Loc.GetString("guardian-activator-invalid-target"), user, user); + var msg = Loc.GetString("guardian-activator-invalid-target", ("entity", Identity.Entity(target, EntityManager, user))); + + _popupSystem.PopupEntity(msg, user, user); return; } diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index 41f582cde8..1e8e012c52 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -39,6 +39,15 @@ namespace Content.Server.Hands.Systems [Dependency] private readonly PullingSystem _pullingSystem = default!; [Dependency] private readonly ThrowingSystem _throwingSystem = default!; + private EntityQuery _physicsQuery; + + /// + /// Items dropped when the holder falls down will be launched in + /// a direction offset by up to this many degrees from the holder's + /// movement direction. + /// + private const float DropHeldItemsSpread = 45; + public override void Initialize() { base.Initialize(); @@ -60,6 +69,8 @@ namespace Content.Server.Hands.Systems CommandBinds.Builder .Bind(ContentKeyFunctions.ThrowItemInHand, new PointerInputCmdHandler(HandleThrowItem)) .Register(); + + _physicsQuery = GetEntityQuery(); } public override void Shutdown() @@ -234,13 +245,13 @@ namespace Content.Server.Hands.Systems private void OnDropHandItems(Entity entity, ref DropHandItemsEvent args) { - var direction = EntityManager.TryGetComponent(entity, out PhysicsComponent? comp) ? comp.LinearVelocity / 50 : Vector2.Zero; - var dropAngle = _random.NextFloat(0.8f, 1.2f); + // If the holder doesn't have a physics component, they ain't moving + var holderVelocity = _physicsQuery.TryComp(entity, out var physics) ? physics.LinearVelocity : Vector2.Zero; + var spreadMaxAngle = Angle.FromDegrees(DropHeldItemsSpread); var fellEvent = new FellDownEvent(entity); RaiseLocalEvent(entity, fellEvent, false); - var worldRotation = TransformSystem.GetWorldRotation(entity).ToVec(); foreach (var hand in entity.Comp.Hands.Values) { if (hand.HeldEntity is not EntityUid held) @@ -255,10 +266,26 @@ namespace Content.Server.Hands.Systems if (!TryDrop(entity, hand, null, checkActionBlocker: false, handsComp: entity.Comp)) continue; + // Rotate the item's throw vector a bit for each item + var angleOffset = _random.NextAngle(-spreadMaxAngle, spreadMaxAngle); + // Rotate the holder's velocity vector by the angle offset to get the item's velocity vector + var itemVelocity = angleOffset.RotateVec(holderVelocity); + // Decrease the distance of the throw by a random amount + itemVelocity *= _random.NextFloat(1f); + // Heavier objects don't get thrown as far + // If the item doesn't have a physics component, it isn't going to get thrown anyway, but we'll assume infinite mass + itemVelocity *= _physicsQuery.TryComp(held, out var heldPhysics) ? heldPhysics.InvMass : 0; + // Throw at half the holder's intentional throw speed and + // vary the speed a little to make it look more interesting + var throwSpeed = entity.Comp.BaseThrowspeed * _random.NextFloat(0.45f, 0.55f); + _throwingSystem.TryThrow(held, - _random.NextAngle().RotateVec(direction / dropAngle + worldRotation / 50), - 0.5f * dropAngle * _random.NextFloat(-0.9f, 1.1f), - entity, 0); + itemVelocity, + throwSpeed, + entity, + pushbackRatio: 0, + compensateFriction: false + ); } } diff --git a/Content.Server/Mapping/MappingCommand.cs b/Content.Server/Mapping/MappingCommand.cs index 12a7af4484..b44a09869e 100644 --- a/Content.Server/Mapping/MappingCommand.cs +++ b/Content.Server/Mapping/MappingCommand.cs @@ -2,8 +2,6 @@ using System.Linq; using Content.Server.Administration; using Content.Server.GameTicking; using Content.Shared.Administration; -using Content.Shared.CCVar; -using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.ContentPack; using Robust.Shared.EntitySerialization; @@ -19,7 +17,6 @@ namespace Content.Server.Mapping { [Dependency] private readonly IEntityManager _entities = default!; [Dependency] private readonly IMapManager _map = default!; - [Dependency] private readonly IConfigurationManager _cfg = default!; public string Command => "mapping"; public string Description => Loc.GetString("cmd-mapping-desc"); diff --git a/Content.Server/Mapping/MappingManager.cs b/Content.Server/Mapping/MappingManager.cs index 0097df2e55..3a46b301e8 100644 --- a/Content.Server/Mapping/MappingManager.cs +++ b/Content.Server/Mapping/MappingManager.cs @@ -1,12 +1,9 @@ -using System.IO; +using System.IO; using Content.Server.Administration.Managers; using Content.Shared.Administration; using Content.Shared.Mapping; -using Robust.Server.GameObjects; using Robust.Server.Player; -using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; -using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -19,7 +16,6 @@ public sealed class MappingManager : IPostInjectInit { [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly ILogManager _log = default!; - [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IServerNetManager _net = default!; [Dependency] private readonly IPlayerManager _players = default!; [Dependency] private readonly IEntitySystemManager _systems = default!; diff --git a/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs b/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs deleted file mode 100644 index d7e971e953..0000000000 --- a/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Medical.Stethoscope.Components -{ - /// - /// Adds an innate verb when equipped to use a stethoscope. - /// - [RegisterComponent] - public sealed partial class StethoscopeComponent : Component - { - public bool IsActive = false; - - [DataField("delay")] - public float Delay = 2.5f; - - [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Action = "ActionStethoscope"; - - [DataField("actionEntity")] public EntityUid? ActionEntity; - } -} diff --git a/Content.Server/Medical/Stethoscope/Components/WearingStethoscopeComponent.cs b/Content.Server/Medical/Stethoscope/Components/WearingStethoscopeComponent.cs deleted file mode 100644 index dfce294a73..0000000000 --- a/Content.Server/Medical/Stethoscope/Components/WearingStethoscopeComponent.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Threading; - -namespace Content.Server.Medical.Components -{ - /// - /// Used to let doctors use the stethoscope on people. - /// - [RegisterComponent] - public sealed partial class WearingStethoscopeComponent : Component - { - public CancellationTokenSource? CancelToken; - - [DataField("delay")] - public float Delay = 2.5f; - - public EntityUid Stethoscope = default!; - } -} diff --git a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs deleted file mode 100644 index b8304c562a..0000000000 --- a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs +++ /dev/null @@ -1,153 +0,0 @@ -using Content.Server.Body.Components; -using Content.Server.Medical.Components; -using Content.Server.Medical.Stethoscope.Components; -using Content.Server.Popups; -using Content.Shared.Actions; -using Content.Shared.Clothing; -using Content.Shared.Damage; -using Content.Shared.DoAfter; -using Content.Shared.FixedPoint; -using Content.Shared.Medical; -using Content.Shared.Medical.Stethoscope; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Verbs; -using Robust.Shared.Utility; - -namespace Content.Server.Medical.Stethoscope -{ - public sealed class StethoscopeSystem : EntitySystem - { - [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly MobStateSystem _mobStateSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnEquipped); - SubscribeLocalEvent(OnUnequipped); - SubscribeLocalEvent>(AddStethoscopeVerb); - SubscribeLocalEvent(OnGetActions); - SubscribeLocalEvent(OnStethoscopeAction); - SubscribeLocalEvent(OnDoAfter); - } - - /// - /// Add the component the verb event subs to if the equippee is wearing the stethoscope. - /// - private void OnEquipped(EntityUid uid, StethoscopeComponent component, ref ClothingGotEquippedEvent args) - { - component.IsActive = true; - - var wearingComp = EnsureComp(args.Wearer); - wearingComp.Stethoscope = uid; - } - - private void OnUnequipped(EntityUid uid, StethoscopeComponent component, ref ClothingGotUnequippedEvent args) - { - if (!component.IsActive) - return; - - RemComp(args.Wearer); - component.IsActive = false; - } - - /// - /// This is raised when someone with WearingStethoscopeComponent requests verbs on an item. - /// It returns if the target is not a mob. - /// - private void AddStethoscopeVerb(EntityUid uid, WearingStethoscopeComponent component, GetVerbsEvent args) - { - if (!args.CanInteract || !args.CanAccess) - return; - - if (!HasComp(args.Target)) - return; - - if (component.CancelToken != null) - return; - - if (!TryComp(component.Stethoscope, out var stetho)) - return; - - InnateVerb verb = new() - { - Act = () => - { - StartListening(component.Stethoscope, uid, args.Target, stetho); // start doafter - }, - Text = Loc.GetString("stethoscope-verb"), - Icon = new SpriteSpecifier.Rsi(new ("Clothing/Neck/Misc/stethoscope.rsi"), "icon"), - Priority = 2 - }; - args.Verbs.Add(verb); - } - - - private void OnStethoscopeAction(EntityUid uid, StethoscopeComponent component, StethoscopeActionEvent args) - { - StartListening(uid, args.Performer, args.Target, component); - } - - private void OnGetActions(EntityUid uid, StethoscopeComponent component, GetItemActionsEvent args) - { - args.AddAction(ref component.ActionEntity, component.Action); - } - - // construct the doafter and start it - private void StartListening(EntityUid scope, EntityUid user, EntityUid target, StethoscopeComponent comp) - { - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, comp.Delay, new StethoscopeDoAfterEvent(), scope, target: target, used: scope) - { - NeedHand = true, - BreakOnMove = true, - }); - } - - private void OnDoAfter(EntityUid uid, StethoscopeComponent component, DoAfterEvent args) - { - if (args.Handled || args.Cancelled || args.Args.Target == null) - return; - - ExamineWithStethoscope(args.Args.User, args.Args.Target.Value); - } - - /// - /// Return a value based on the total oxyloss of the target. - /// Could be expanded in the future with reagent effects etc. - /// The loc lines are taken from the goon wiki. - /// - public void ExamineWithStethoscope(EntityUid user, EntityUid target) - { - // The mob check seems a bit redundant but (1) they could conceivably have lost it since when the doafter started and (2) I need it for .IsDead() - if (!HasComp(target) || !TryComp(target, out var mobState) || _mobStateSystem.IsDead(target, mobState)) - { - _popupSystem.PopupEntity(Loc.GetString("stethoscope-dead"), target, user); - return; - } - - if (!TryComp(target, out var damage)) - return; - // these should probably get loc'd at some point before a non-english fork accidentally breaks a bunch of stuff that does this - if (!damage.Damage.DamageDict.TryGetValue("Asphyxiation", out var value)) - return; - - var message = GetDamageMessage(value); - - _popupSystem.PopupEntity(Loc.GetString(message), target, user); - } - - private string GetDamageMessage(FixedPoint2 totalOxyloss) - { - var msg = (int) totalOxyloss switch - { - < 20 => "stethoscope-normal", - < 60 => "stethoscope-hyper", - < 80 => "stethoscope-irregular", - _ => "stethoscope-fucked" - }; - return msg; - } - } -} diff --git a/Content.Server/Mind/MindSystem.cs b/Content.Server/Mind/MindSystem.cs index 2447d88641..1b55a533e3 100644 --- a/Content.Server/Mind/MindSystem.cs +++ b/Content.Server/Mind/MindSystem.cs @@ -85,11 +85,11 @@ public sealed class MindSystem : SharedMindSystem { if (base.TryGetMind(user, out mindId, out mind)) { - DebugTools.Assert(_players.GetPlayerData(user).ContentData() is not { } data || data.Mind == mindId); + DebugTools.Assert(!_players.TryGetPlayerData(user, out var playerData) || playerData.ContentData() is not { } data || data.Mind == mindId); return true; } - DebugTools.Assert(_players.GetPlayerData(user).ContentData()?.Mind == null); + DebugTools.Assert(!_players.TryGetPlayerData(user, out var pData) || pData.ContentData()?.Mind == null); return false; } diff --git a/Content.Server/Movement/RotateEyesCommand.cs b/Content.Server/Movement/RotateEyesCommand.cs index 6395b93cab..733d341820 100644 --- a/Content.Server/Movement/RotateEyesCommand.cs +++ b/Content.Server/Movement/RotateEyesCommand.cs @@ -28,14 +28,15 @@ public sealed class RotateEyesCommand : IConsoleCommand } var count = 0; - - foreach (var mover in entManager.EntityQuery(true)) + var query = entManager.EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var mover)) { if (mover.TargetRelativeRotation.Equals(rotation)) continue; mover.TargetRelativeRotation = rotation; - entManager.Dirty(mover); + + entManager.Dirty(uid, mover); count++; } diff --git a/Content.Server/Movement/Systems/BoundarySystem.cs b/Content.Server/Movement/Systems/BoundarySystem.cs index a798f1052d..a82348926e 100644 --- a/Content.Server/Movement/Systems/BoundarySystem.cs +++ b/Content.Server/Movement/Systems/BoundarySystem.cs @@ -27,6 +27,6 @@ public sealed class BoundarySystem : EntitySystem // If for whatever reason you want to yeet them to the other side. // offset = new Angle(MathF.PI).RotateVec(offset); - _xform.SetWorldPosition(otherXform, center + offset); + _xform.SetWorldPosition((args.OtherEntity, otherXform), center + offset); } } diff --git a/Content.Server/Movement/Systems/PullController.cs b/Content.Server/Movement/Systems/PullController.cs index 4bd4b60371..40345a5867 100644 --- a/Content.Server/Movement/Systems/PullController.cs +++ b/Content.Server/Movement/Systems/PullController.cs @@ -2,6 +2,7 @@ using System.Numerics; using Content.Server.Movement.Components; using Content.Server.Physics.Controllers; using Content.Shared.ActionBlocker; +using Content.Shared.Conveyor; using Content.Shared.Gravity; using Content.Shared.Input; using Content.Shared.Movement.Pulling.Components; @@ -122,6 +123,12 @@ public sealed class PullController : VirtualController var pulled = pullerComp.Pulling; + // See update statement; this thing overwrites so many systems, DOESN'T EVEN LERP PROPERLY. + // We had a throwing version but it occasionally had issues. + // We really need the throwing version back. + if (TryComp(pulled, out ConveyedComponent? conveyed) && conveyed.Conveying) + return false; + if (!_pullableQuery.TryComp(pulled, out var pullable)) return false; @@ -132,9 +139,9 @@ public sealed class PullController : VirtualController // Cap the distance var range = 2f; - var fromUserCoords = coords.WithEntityId(player, EntityManager); + var fromUserCoords = _transformSystem.WithEntityId(coords, player); var userCoords = new EntityCoordinates(player, Vector2.Zero); - + if (!_transformSystem.InRange(coords, userCoords, range)) { var direction = fromUserCoords.Position - userCoords.Position; @@ -150,7 +157,7 @@ public sealed class PullController : VirtualController } fromUserCoords = new EntityCoordinates(player, direction.Normalized() * (range - 0.01f)); - coords = fromUserCoords.WithEntityId(coords.EntityId); + coords = _transformSystem.WithEntityId(fromUserCoords, coords.EntityId); } var moving = EnsureComp(pulled!.Value); @@ -241,7 +248,7 @@ public sealed class PullController : VirtualController var pullerXform = _xformQuery.Get(puller); var pullerPosition = TransformSystem.GetMapCoordinates(pullerXform); - var movingTo = mover.MovingTo.ToMap(EntityManager, TransformSystem); + var movingTo = TransformSystem.ToMapCoordinates(mover.MovingTo); if (movingTo.MapId != pullerPosition.MapId) { @@ -257,6 +264,13 @@ public sealed class PullController : VirtualController continue; } + // TODO: This whole thing is slop and really needs to be throwing again + if (TryComp(pullableEnt, out ConveyedComponent? conveyed) && conveyed.Conveying) + { + RemCompDeferred(pullableEnt); + continue; + } + var movingPosition = movingTo.Position; var ownerPosition = TransformSystem.GetWorldPosition(pullableXform); diff --git a/Content.Server/NPC/Queries/Considerations/TargetIsStunnedCon.cs b/Content.Server/NPC/Queries/Considerations/TargetIsStunnedCon.cs new file mode 100644 index 0000000000..6188ae96d4 --- /dev/null +++ b/Content.Server/NPC/Queries/Considerations/TargetIsStunnedCon.cs @@ -0,0 +1,10 @@ +namespace Content.Server.NPC.Queries.Considerations; + +/// +/// Returns 1f if the target has the +/// +public sealed partial class TargetIsStunnedCon : UtilityConsideration +{ + +} + diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index b5d3ac3cbd..eff4f2772b 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -19,6 +19,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.NPC.Systems; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; +using Content.Shared.Stunnable; using Content.Shared.Tools.Systems; using Content.Shared.Turrets; using Content.Shared.Weapons.Melee; @@ -360,6 +361,10 @@ public sealed class NPCUtilitySystem : EntitySystem return 1f; return 0f; } + case TargetIsStunnedCon: + { + return HasComp(targetUid) ? 1f : 0f; + } case TurretTargetingCon: { if (!TryComp(owner, out var turretTargetSettings) || diff --git a/Content.Server/Physics/Controllers/ConveyorController.cs b/Content.Server/Physics/Controllers/ConveyorController.cs index bf6abff158..494bc8c6f0 100644 --- a/Content.Server/Physics/Controllers/ConveyorController.cs +++ b/Content.Server/Physics/Controllers/ConveyorController.cs @@ -1,7 +1,6 @@ using Content.Server.DeviceLinking.Events; using Content.Server.DeviceLinking.Systems; using Content.Server.Materials; -using Content.Server.Power.Components; using Content.Shared.Conveyor; using Content.Shared.Destructible; using Content.Shared.Maps; @@ -10,7 +9,6 @@ using Content.Shared.Physics.Controllers; using Content.Shared.Power; using Robust.Shared.Physics; using Robust.Shared.Physics.Collision.Shapes; -using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; namespace Content.Server.Physics.Controllers; @@ -20,7 +18,6 @@ public sealed class ConveyorController : SharedConveyorController [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly DeviceLinkSystem _signalSystem = default!; [Dependency] private readonly MaterialReclaimerSystem _materialReclaimer = default!; - [Dependency] private readonly SharedBroadphaseSystem _broadphase = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; public override void Initialize() @@ -40,7 +37,7 @@ public sealed class ConveyorController : SharedConveyorController { _signalSystem.EnsureSinkPorts(uid, component.ReversePort, component.ForwardPort, component.OffPort); - if (TryComp(uid, out var physics)) + if (PhysicsQuery.TryComp(uid, out var physics)) { var shape = new PolygonShape(); shape.SetAsBox(0.55f, 0.55f); @@ -57,7 +54,7 @@ public sealed class ConveyorController : SharedConveyorController if (MetaData(uid).EntityLifeStage >= EntityLifeStage.Terminating) return; - if (!TryComp(uid, out var physics)) + if (!PhysicsQuery.TryComp(uid, out var physics)) return; _fixtures.DestroyFixture(uid, ConveyorFixture, body: physics); @@ -87,13 +84,11 @@ public sealed class ConveyorController : SharedConveyorController else if (args.Port == component.ForwardPort) { - AwakenEntities(uid, component); SetState(uid, ConveyorState.Forward, component); } else if (args.Port == component.ReversePort) { - AwakenEntities(uid, component); SetState(uid, ConveyorState.Reverse, component); } } @@ -108,8 +103,10 @@ public sealed class ConveyorController : SharedConveyorController component.State = state; - if (TryComp(uid, out var physics)) - _broadphase.RegenerateContacts((uid, physics)); + if (state != ConveyorState.Off) + { + WakeConveyed(uid); + } UpdateAppearance(uid, component); Dirty(uid, component); @@ -117,29 +114,29 @@ public sealed class ConveyorController : SharedConveyorController /// /// Awakens sleeping entities on the conveyor belt's tile when it's turned on. - /// Fixes an issue where non-hard/sleeping entities refuse to wake up + collide if a belt is turned off and on again. + /// Need this as we might activate under CollisionWake entities and need to forcefully check them. /// - private void AwakenEntities(EntityUid uid, ConveyorComponent component) + protected override void AwakenConveyor(Entity ent) { - var xformQuery = GetEntityQuery(); - var bodyQuery = GetEntityQuery(); - - if (!xformQuery.TryGetComponent(uid, out var xform)) + if (!XformQuery.Resolve(ent.Owner, ref ent.Comp)) return; + var xform = ent.Comp; + var beltTileRef = xform.Coordinates.GetTileRef(EntityManager, MapManager); if (beltTileRef != null) { - var intersecting = Lookup.GetLocalEntitiesIntersecting(beltTileRef.Value, 0f); + Intersecting.Clear(); + Lookup.GetLocalEntitiesIntersecting(beltTileRef.Value.GridUid, beltTileRef.Value.GridIndices, Intersecting, 0f, flags: LookupFlags.Dynamic | LookupFlags.Sundries | LookupFlags.Approximate); - foreach (var entity in intersecting) + foreach (var entity in Intersecting) { - if (!bodyQuery.TryGetComponent(entity, out var physics)) + if (!PhysicsQuery.TryGetComponent(entity, out var physics)) continue; if (physics.BodyType != BodyType.Static) - Physics.WakeBody(entity, body: physics); + PhysicsSystem.WakeBody(entity, body: physics); } } } diff --git a/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs b/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs deleted file mode 100644 index 577dadb5c8..0000000000 --- a/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Polymorph.Systems; -using Content.Shared.Polymorph; -using Content.Shared.Whitelist; -using Robust.Shared.Audio; -using Robust.Shared.Prototypes; - -namespace Content.Server.Polymorph.Components; - -[RegisterComponent] -[Access(typeof(PolymorphSystem))] -public sealed partial class PolymorphOnCollideComponent : Component -{ - [DataField(required: true)] - public ProtoId Polymorph; - - [DataField(required: true)] - public EntityWhitelist Whitelist = default!; - - [DataField] - public EntityWhitelist? Blacklist; - - [DataField] - public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/Magic/forcewall.ogg"); -} diff --git a/Content.Server/Rotatable/RotatableSystem.cs b/Content.Server/Rotatable/RotatableSystem.cs index 63b5e44c3d..85681535ca 100644 --- a/Content.Server/Rotatable/RotatableSystem.cs +++ b/Content.Server/Rotatable/RotatableSystem.cs @@ -21,6 +21,7 @@ namespace Content.Server.Rotatable [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; [Dependency] private readonly SharedInteractionSystem _interaction = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -112,7 +113,7 @@ namespace Content.Server.Rotatable var entity = EntityManager.SpawnEntity(component.MirrorEntity, oldTransform.Coordinates); var newTransform = EntityManager.GetComponent(entity); newTransform.LocalRotation = oldTransform.LocalRotation; - newTransform.Anchored = false; + _transform.Unanchor(entity, newTransform); EntityManager.DeleteEntity(uid); } diff --git a/Content.Server/Teleportation/HandTeleporterSystem.cs b/Content.Server/Teleportation/HandTeleporterSystem.cs index 5c9baf1854..aa4f7eec82 100644 --- a/Content.Server/Teleportation/HandTeleporterSystem.cs +++ b/Content.Server/Teleportation/HandTeleporterSystem.cs @@ -95,6 +95,10 @@ public sealed class HandTeleporterSystem : EntitySystem var timeout = EnsureComp(user); timeout.EnteredPortal = null; component.FirstPortal = Spawn(component.FirstPortalPrototype, Transform(user).Coordinates); + + if (component.AllowPortalsOnDifferentMaps && TryComp(component.FirstPortal, out var portal)) + portal.CanTeleportToOtherMaps = true; + _adminLogger.Add(LogType.EntitySpawn, LogImpact.High, $"{ToPrettyString(user):player} opened {ToPrettyString(component.FirstPortal.Value)} at {Transform(component.FirstPortal.Value).Coordinates} using {ToPrettyString(uid)}"); _audio.PlayPvs(component.NewPortalSound, uid); } @@ -113,6 +117,10 @@ public sealed class HandTeleporterSystem : EntitySystem var timeout = EnsureComp(user); timeout.EnteredPortal = null; component.SecondPortal = Spawn(component.SecondPortalPrototype, Transform(user).Coordinates); + + if (component.AllowPortalsOnDifferentMaps && TryComp(component.SecondPortal, out var portal)) + portal.CanTeleportToOtherMaps = true; + _adminLogger.Add(LogType.EntitySpawn, LogImpact.High, $"{ToPrettyString(user):player} opened {ToPrettyString(component.SecondPortal.Value)} at {Transform(component.SecondPortal.Value).Coordinates} linked to {ToPrettyString(component.FirstPortal!.Value)} using {ToPrettyString(uid)}"); _link.TryLink(component.FirstPortal!.Value, component.SecondPortal.Value, true); _audio.PlayPvs(component.NewPortalSound, uid); diff --git a/Content.Server/Temperature/Systems/EntityHeaterSystem.cs b/Content.Server/Temperature/Systems/EntityHeaterSystem.cs index c4b5b72a9c..8452edf8e9 100644 --- a/Content.Server/Temperature/Systems/EntityHeaterSystem.cs +++ b/Content.Server/Temperature/Systems/EntityHeaterSystem.cs @@ -1,45 +1,41 @@ using Content.Server.Power.Components; -using Content.Server.Temperature.Components; -using Content.Shared.Examine; using Content.Shared.Placeable; -using Content.Shared.Popups; -using Content.Shared.Power; using Content.Shared.Temperature; -using Content.Shared.Verbs; -using Robust.Server.Audio; +using Content.Shared.Temperature.Components; +using Content.Shared.Temperature.Systems; namespace Content.Server.Temperature.Systems; /// -/// Handles updating and events. +/// Handles the server-only parts of /// -public sealed class EntityHeaterSystem : EntitySystem +public sealed class EntityHeaterSystem : SharedEntityHeaterSystem { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly TemperatureSystem _temperature = default!; - [Dependency] private readonly AudioSystem _audio = default!; - - private readonly int SettingCount = Enum.GetValues(typeof(EntityHeaterSetting)).Length; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnExamined); - SubscribeLocalEvent>(OnGetVerbs); - SubscribeLocalEvent(OnPowerChanged); + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + // Set initial power level + if (TryComp(ent, out var power)) + power.Load = SettingPower(ent.Comp.Setting, ent.Comp.Power); } public override void Update(float deltaTime) { var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp, out var placer, out var power)) + while (query.MoveNext(out _, out _, out var placer, out var power)) { if (!power.Powered) continue; - // don't divide by total entities since its a big grill + // don't divide by total entities since it's a big grill // excess would just be wasted in the air but that's not worth simulating // if you want a heater thermomachine just use that... var energy = power.PowerReceived * deltaTime; @@ -50,66 +46,17 @@ public sealed class EntityHeaterSystem : EntitySystem } } - private void OnExamined(EntityUid uid, EntityHeaterComponent comp, ExaminedEvent args) + /// + /// doesn't exist on the client, so we need + /// this server-only override to handle setting the network load. + /// + protected override void ChangeSetting(Entity ent, EntityHeaterSetting setting, EntityUid? user = null) { - if (!args.IsInDetailsRange) + base.ChangeSetting(ent, setting, user); + + if (!TryComp(ent, out var power)) return; - args.PushMarkup(Loc.GetString("entity-heater-examined", ("setting", comp.Setting))); - } - - private void OnGetVerbs(EntityUid uid, EntityHeaterComponent comp, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - var setting = (int) comp.Setting; - setting++; - setting %= SettingCount; - var nextSetting = (EntityHeaterSetting) setting; - - args.Verbs.Add(new AlternativeVerb() - { - Text = Loc.GetString("entity-heater-switch-setting", ("setting", nextSetting)), - Act = () => - { - ChangeSetting(uid, nextSetting, comp); - _popup.PopupEntity(Loc.GetString("entity-heater-switched-setting", ("setting", nextSetting)), uid, args.User); - } - }); - } - - private void OnPowerChanged(EntityUid uid, EntityHeaterComponent comp, ref PowerChangedEvent args) - { - // disable heating element glowing layer if theres no power - // doesn't actually turn it off since that would be annoying - var setting = args.Powered ? comp.Setting : EntityHeaterSetting.Off; - _appearance.SetData(uid, EntityHeaterVisuals.Setting, setting); - } - - private void ChangeSetting(EntityUid uid, EntityHeaterSetting setting, EntityHeaterComponent? comp = null, ApcPowerReceiverComponent? power = null) - { - if (!Resolve(uid, ref comp, ref power)) - return; - - comp.Setting = setting; - power.Load = SettingPower(setting, comp.Power); - _appearance.SetData(uid, EntityHeaterVisuals.Setting, setting); - _audio.PlayPvs(comp.SettingSound, uid); - } - - private float SettingPower(EntityHeaterSetting setting, float max) - { - switch (setting) - { - case EntityHeaterSetting.Low: - return max / 3f; - case EntityHeaterSetting.Medium: - return max * 2f / 3f; - case EntityHeaterSetting.High: - return max; - default: - return 0f; - } + power.Load = SettingPower(setting, ent.Comp.Power); } } diff --git a/Content.Server/Thief/Components/ThiefUndeterminedBackpackComponent.cs b/Content.Server/Thief/Components/ThiefUndeterminedBackpackComponent.cs index 64f88df657..9080caa245 100644 --- a/Content.Server/Thief/Components/ThiefUndeterminedBackpackComponent.cs +++ b/Content.Server/Thief/Components/ThiefUndeterminedBackpackComponent.cs @@ -22,11 +22,18 @@ public sealed partial class ThiefUndeterminedBackpackComponent : Component public List SelectedSets = new(); [DataField] - public SoundSpecifier ApproveSound = new SoundPathSpecifier("/Audio/Effects/rustle1.ogg"); + public SoundCollectionSpecifier ApproveSound = new SoundCollectionSpecifier("storageRustle"); /// /// Max number of sets you can select. /// [DataField] public int MaxSelectedSets = 2; + + /// + /// What entity all the spawned items will appear inside of + /// If null, will instead drop on the ground. + /// + [DataField] + public EntProtoId? SpawnedStoragePrototype; } diff --git a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs index 3248a6b9c8..23f845a2e7 100644 --- a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs +++ b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs @@ -1,5 +1,7 @@ using Content.Server.Thief.Components; +using Content.Shared.Hands.EntitySystems; using Content.Shared.Item; +using Content.Shared.Storage.EntitySystems; using Content.Shared.Thief; using Robust.Server.GameObjects; using Robust.Server.Audio; @@ -17,6 +19,8 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly SharedStorageSystem _storage = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; public override void Initialize() { @@ -37,6 +41,10 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem if (backpack.Comp.SelectedSets.Count != backpack.Comp.MaxSelectedSets) return; + EntityUid? spawnedStorage = null; + if (backpack.Comp.SpawnedStoragePrototype != null) + spawnedStorage = Spawn(backpack.Comp.SpawnedStoragePrototype, _transform.GetMapCoordinates(backpack.Owner)); + foreach (var i in backpack.Comp.SelectedSets) { var set = _proto.Index(backpack.Comp.PossibleSets[i]); @@ -44,10 +52,20 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem { var ent = Spawn(item, _transform.GetMapCoordinates(backpack.Owner)); if (TryComp(ent, out var itemComponent)) - _transform.DropNextTo(ent, backpack.Owner); + { + if (spawnedStorage != null) + _storage.Insert(spawnedStorage.Value, ent, out _, playSound: false); + else + _transform.DropNextTo(ent, backpack.Owner); + } } } - _audio.PlayPvs(backpack.Comp.ApproveSound, backpack.Owner); + + if (spawnedStorage != null) + _hands.TryPickupAnyHand(args.Actor, spawnedStorage.Value); + + // Play the sound on coordinates of the backpack/toolbox. The reason being, since we immediately delete it, the sound gets deleted alongside it. + _audio.PlayPvs(backpack.Comp.ApproveSound, Transform(backpack.Owner).Coordinates); QueueDel(backpack); } private void OnChangeSet(Entity backpack, ref ThiefBackpackChangeSetMessage args) diff --git a/Content.Server/Turrets/DeployableTurretSystem.cs b/Content.Server/Turrets/DeployableTurretSystem.cs new file mode 100644 index 0000000000..359d91fd1d --- /dev/null +++ b/Content.Server/Turrets/DeployableTurretSystem.cs @@ -0,0 +1,175 @@ +using Content.Server.Destructible; +using Content.Server.DeviceNetwork; +using Content.Server.DeviceNetwork.Components; +using Content.Server.DeviceNetwork.Systems; +using Content.Server.NPC.HTN; +using Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat.Ranged; +using Content.Server.Power.Components; +using Content.Server.Repairable; +using Content.Shared.Destructible; +using Content.Shared.DeviceNetwork; +using Content.Shared.Power; +using Content.Shared.Turrets; +using Content.Shared.Weapons.Ranged.Events; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Timing; + +namespace Content.Server.Turrets; + +public sealed partial class DeployableTurretSystem : SharedDeployableTurretSystem +{ + [Dependency] private readonly HTNSystem _htn = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly DeviceNetworkSystem _deviceNetwork = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAmmoShot); + SubscribeLocalEvent(OnChargeChanged); + SubscribeLocalEvent(OnPowerChanged); + SubscribeLocalEvent(OnBroken); + SubscribeLocalEvent(OnRepaired); + SubscribeLocalEvent(OnBeforeBroadcast); + } + + private void OnAmmoShot(Entity ent, ref AmmoShotEvent args) + { + UpdateAmmoStatus(ent); + } + + private void OnChargeChanged(Entity ent, ref ChargeChangedEvent args) + { + UpdateAmmoStatus(ent); + } + + private void OnPowerChanged(Entity ent, ref PowerChangedEvent args) + { + UpdateAmmoStatus(ent); + } + + private void OnBroken(Entity ent, ref BreakageEventArgs args) + { + if (TryComp(ent, out var appearance)) + _appearance.SetData(ent, DeployableTurretVisuals.Broken, true, appearance); + + SetState(ent, false); + } + + private void OnRepaired(Entity ent, ref RepairedEvent args) + { + if (TryComp(ent, out var appearance)) + _appearance.SetData(ent, DeployableTurretVisuals.Broken, false, appearance); + } + + private void OnBeforeBroadcast(Entity ent, ref BeforeBroadcastAttemptEvent args) + { + if (!TryComp(ent, out var deviceNetwork)) + return; + + var recipientDeviceNetworks = new HashSet(); + + // Only broadcast to connected devices + foreach (var recipient in deviceNetwork.DeviceLists) + { + if (!TryComp(recipient, out var recipientDeviceNetwork)) + continue; + + recipientDeviceNetworks.Add(recipientDeviceNetwork); + } + + if (recipientDeviceNetworks.Count > 0) + args.ModifiedRecipients = recipientDeviceNetworks; + } + + private void SendStateUpdateToDeviceNetwork(Entity ent) + { + if (!TryComp(ent, out var device)) + return; + + var payload = new NetworkPayload + { + [DeviceNetworkConstants.Command] = DeviceNetworkConstants.CmdUpdatedState, + [DeviceNetworkConstants.CmdUpdatedState] = GetTurretState(ent) + }; + + _deviceNetwork.QueuePacket(ent, null, payload, device: device); + } + + protected override void SetState(Entity ent, bool enabled, EntityUid? user = null) + { + if (ent.Comp.Enabled == enabled) + return; + + base.SetState(ent, enabled, user); + DirtyField(ent, ent.Comp, nameof(DeployableTurretComponent.Enabled)); + + // Determine how much time is remaining in the current animation and the one next in queue + var animTimeRemaining = MathF.Max((float)(ent.Comp.AnimationCompletionTime - _timing.CurTime).TotalSeconds, 0f); + var animTimeNext = ent.Comp.Enabled ? ent.Comp.DeploymentLength : ent.Comp.RetractionLength; + + // End/restart any tasks the NPC was doing + // Delay the resumption of any tasks based on the total animation length (plus a buffer) + var planCooldown = animTimeRemaining + animTimeNext + 0.5f; + + if (TryComp(ent, out var htn)) + _htn.SetHTNEnabled((ent, htn), ent.Comp.Enabled, planCooldown); + + // Play audio + _audio.PlayPvs(ent.Comp.Enabled ? ent.Comp.DeploymentSound : ent.Comp.RetractionSound, ent, new AudioParams { Volume = -10f }); + } + + private void UpdateAmmoStatus(Entity ent) + { + if (!HasAmmo(ent)) + SetState(ent, false); + } + + private DeployableTurretState GetTurretState(Entity ent, DestructibleComponent? destructable = null, HTNComponent? htn = null) + { + Resolve(ent, ref destructable, ref htn); + + if (destructable?.IsBroken == true) + return DeployableTurretState.Broken; + + if (htn == null || !HasAmmo(ent)) + return DeployableTurretState.Disabled; + + if (htn.Plan?.CurrentTask.Operator is GunOperator) + return DeployableTurretState.Firing; + + if (ent.Comp.AnimationCompletionTime > _timing.CurTime) + return ent.Comp.Enabled ? DeployableTurretState.Deploying : DeployableTurretState.Retracting; + + return ent.Comp.Enabled ? DeployableTurretState.Deployed : DeployableTurretState.Retracted; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var deployableTurret, out var destructible, out var htn)) + { + // Check if the turret state has changed since the last update, + // and if it has, inform the device network + var ent = new Entity(uid, deployableTurret); + var newState = GetTurretState(ent, destructible, htn); + + if (newState != deployableTurret.CurrentState) + { + deployableTurret.CurrentState = newState; + DirtyField(uid, deployableTurret, nameof(DeployableTurretComponent.CurrentState)); + + SendStateUpdateToDeviceNetwork(ent); + + if (TryComp(ent, out var appearance)) + _appearance.SetData(ent, DeployableTurretVisuals.Turret, newState, appearance); + } + } + } +} diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index b393850497..47d94984c0 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -132,6 +132,16 @@ public sealed partial class ZombieSystem melee.Angle = 0.0f; melee.HitSound = zombiecomp.BiteSound; + DirtyFields(target, melee, null, fields: + [ + nameof(MeleeWeaponComponent.Animation), + nameof(MeleeWeaponComponent.WideAnimation), + nameof(MeleeWeaponComponent.AltDisarm), + nameof(MeleeWeaponComponent.Range), + nameof(MeleeWeaponComponent.Angle), + nameof(MeleeWeaponComponent.HitSound), + ]); + if (mobState.CurrentState == MobState.Alive) { // Groaning when damaged diff --git a/Content.Shared/Atmos/Components/GasPressurePumpComponent.cs b/Content.Shared/Atmos/Components/GasPressurePumpComponent.cs index 850a2a7a29..f0ffad0b0e 100644 --- a/Content.Shared/Atmos/Components/GasPressurePumpComponent.cs +++ b/Content.Shared/Atmos/Components/GasPressurePumpComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Shared.Atmos.Components; -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class GasPressurePumpComponent : Component { [DataField, AutoNetworkedField] diff --git a/Content.Shared/Atmos/EntitySystems/SharedGasPressurePumpSystem.cs b/Content.Shared/Atmos/EntitySystems/SharedGasPressurePumpSystem.cs index 77444eb3c5..140597971d 100644 --- a/Content.Shared/Atmos/EntitySystems/SharedGasPressurePumpSystem.cs +++ b/Content.Shared/Atmos/EntitySystems/SharedGasPressurePumpSystem.cs @@ -5,18 +5,15 @@ using Content.Shared.Atmos.Piping.Binary.Components; using Content.Shared.Atmos.Piping.Components; using Content.Shared.Database; using Content.Shared.Examine; -using Content.Shared.Popups; using Content.Shared.Power; -using Content.Shared.Power.Components; using Content.Shared.Power.EntitySystems; -using Content.Shared.UserInterface; namespace Content.Shared.Atmos.EntitySystems; public abstract class SharedGasPressurePumpSystem : EntitySystem { [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedPowerReceiverSystem _receiver = default!; [Dependency] protected readonly SharedUserInterfaceSystem UserInterfaceSystem = default!; @@ -36,62 +33,71 @@ public abstract class SharedGasPressurePumpSystem : EntitySystem SubscribeLocalEvent(OnExamined); } - private void OnExamined(EntityUid uid, GasPressurePumpComponent pump, ExaminedEvent args) + private void OnExamined(Entity ent, ref ExaminedEvent args) { - if (!Transform(uid).Anchored) + if (!Transform(ent).Anchored) return; - if (Loc.TryGetString("gas-pressure-pump-system-examined", out var str, + if (Loc.TryGetString("gas-pressure-pump-system-examined", + out var str, ("statusColor", "lightblue"), // TODO: change with pressure? - ("pressure", pump.TargetPressure) + ("pressure", ent.Comp.TargetPressure) )) { args.PushMarkup(str); } } - private void OnInit(EntityUid uid, GasPressurePumpComponent pump, ComponentInit args) + private void OnInit(Entity ent, ref ComponentInit args) { - UpdateAppearance(uid, pump); + UpdateAppearance(ent); } - private void OnPowerChanged(EntityUid uid, GasPressurePumpComponent component, ref PowerChangedEvent args) + private void OnPowerChanged(Entity ent, ref PowerChangedEvent args) { - UpdateAppearance(uid, component); + UpdateAppearance(ent); } - private void UpdateAppearance(EntityUid uid, GasPressurePumpComponent? pump = null, AppearanceComponent? appearance = null) + private void UpdateAppearance(Entity ent) { - if (!Resolve(uid, ref pump, ref appearance, false)) + if (!Resolve(ent, ref ent.Comp2, false)) return; - var pumpOn = pump.Enabled && _receiver.IsPowered(uid); - Appearance.SetData(uid, PumpVisuals.Enabled, pumpOn, appearance); + var pumpOn = ent.Comp1.Enabled && _receiver.IsPowered(ent.Owner); + _appearance.SetData(ent, PumpVisuals.Enabled, pumpOn, ent.Comp2); } - private void OnToggleStatusMessage(EntityUid uid, GasPressurePumpComponent pump, GasPressurePumpToggleStatusMessage args) + private void OnToggleStatusMessage(Entity ent, ref GasPressurePumpToggleStatusMessage args) { - pump.Enabled = args.Enabled; - _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); - Dirty(uid, pump); - UpdateAppearance(uid, pump); + ent.Comp.Enabled = args.Enabled; + _adminLogger.Add(LogType.AtmosPowerChanged, + LogImpact.Medium, + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(ent):device} to {args.Enabled}"); + Dirty(ent); + UpdateAppearance(ent); + UpdateUi(ent); } - private void OnOutputPressureChangeMessage(EntityUid uid, GasPressurePumpComponent pump, GasPressurePumpChangeOutputPressureMessage args) + private void OnOutputPressureChangeMessage(Entity ent, ref GasPressurePumpChangeOutputPressureMessage args) { - pump.TargetPressure = Math.Clamp(args.Pressure, 0f, Atmospherics.MaxOutputPressure); - _adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium, - $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); - Dirty(uid, pump); + ent.Comp.TargetPressure = Math.Clamp(args.Pressure, 0f, Atmospherics.MaxOutputPressure); + _adminLogger.Add(LogType.AtmosPressureChanged, + LogImpact.Medium, + $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(ent):device} to {args.Pressure}kPa"); + Dirty(ent); + UpdateUi(ent); } - private void OnPumpLeaveAtmosphere(EntityUid uid, GasPressurePumpComponent pump, ref AtmosDeviceDisabledEvent args) + private void OnPumpLeaveAtmosphere(Entity ent, ref AtmosDeviceDisabledEvent args) { - pump.Enabled = false; - Dirty(uid, pump); - UpdateAppearance(uid, pump); + ent.Comp.Enabled = false; + Dirty(ent); + UpdateAppearance(ent); - UserInterfaceSystem.CloseUi(uid, GasPressurePumpUiKey.Key); + UserInterfaceSystem.CloseUi(ent.Owner, GasPressurePumpUiKey.Key); + } + + protected virtual void UpdateUi(Entity ent) + { } } diff --git a/Content.Shared/CCVar/CCVars.Vote.cs b/Content.Shared/CCVar/CCVars.Vote.cs index ee9fee7d3d..deb860e03c 100644 --- a/Content.Shared/CCVar/CCVars.Vote.cs +++ b/Content.Shared/CCVar/CCVars.Vote.cs @@ -146,13 +146,13 @@ public sealed partial class CCVars /// The delay for which two votekicks are allowed to be made by separate people, in seconds. /// public static readonly CVarDef VotekickTimeout = - CVarDef.Create("votekick.timeout", 120f, CVar.SERVERONLY); + CVarDef.Create("votekick.timeout", 60f, CVar.SERVERONLY); /// /// Sets the duration of the votekick vote timer. /// public static readonly CVarDef - VotekickTimer = CVarDef.Create("votekick.timer", 60, CVar.SERVERONLY); + VotekickTimer = CVarDef.Create("votekick.timer", 45, CVar.SERVERONLY); /// /// Config for how many hours playtime a player must have to get protection from the Raider votekick type when playing as an antag. diff --git a/Content.Shared/Containers/ContainerFillSystem.cs b/Content.Shared/Containers/ContainerFillSystem.cs index 90eccb0341..3d49079ea7 100644 --- a/Content.Shared/Containers/ContainerFillSystem.cs +++ b/Content.Shared/Containers/ContainerFillSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using System.Numerics; using Content.Shared.EntityTable; using Robust.Shared.Containers; @@ -39,7 +40,8 @@ public sealed class ContainerFillSystem : EntitySystem var ent = Spawn(proto, coords); if (!_containerSystem.Insert(ent, container, containerXform: xform)) { - Log.Error($"Entity {ToPrettyString(uid)} with a {nameof(ContainerFillComponent)} failed to insert an entity: {ToPrettyString(ent)}."); + var alreadyContained = container.ContainedEntities.Count > 0 ? string.Join("\n", container.ContainedEntities.Select(e => $"\t - {EntityManager.ToPrettyString(e)}")) : "< empty >"; + Log.Error($"Entity {ToPrettyString(uid)} with a {nameof(ContainerFillComponent)} failed to insert an entity: {ToPrettyString(ent)}.\nCurrent contents:\n{alreadyContained}"); _transform.AttachToGridOrMap(ent); break; } @@ -72,7 +74,8 @@ public sealed class ContainerFillSystem : EntitySystem var spawn = Spawn(proto, coords); if (!_containerSystem.Insert(spawn, container, containerXform: xform)) { - Log.Error($"Entity {ToPrettyString(ent)} with a {nameof(EntityTableContainerFillComponent)} failed to insert an entity: {ToPrettyString(spawn)}."); + var alreadyContained = container.ContainedEntities.Count > 0 ? string.Join("\n", container.ContainedEntities.Select(e => $"\t - {EntityManager.ToPrettyString(e)}")) : "< empty >"; + Log.Error($"Entity {ToPrettyString(ent)} with a {nameof(EntityTableContainerFillComponent)} failed to insert an entity: {ToPrettyString(spawn)}.\nCurrent contents:\n{alreadyContained}"); _transform.AttachToGridOrMap(spawn); break; } diff --git a/Content.Shared/Conveyor/ConveyedComponent.cs b/Content.Shared/Conveyor/ConveyedComponent.cs index 25189d2182..212c4dc23f 100644 --- a/Content.Shared/Conveyor/ConveyedComponent.cs +++ b/Content.Shared/Conveyor/ConveyedComponent.cs @@ -3,11 +3,15 @@ using Robust.Shared.GameStates; namespace Content.Shared.Conveyor; /// -/// Indicates this entity is currently being conveyed. +/// Indicates this entity is currently contacting a conveyor and will subscribe to events as appropriate. /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ConveyedComponent : Component { - [ViewVariables, AutoNetworkedField] - public List Colliding = new(); + // TODO: Delete if pulling gets fixed. + /// + /// True if currently conveying. + /// + [DataField, AutoNetworkedField] + public bool Conveying; } diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index a1f5ec2a1c..bdb3a50454 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Administration.Components; using Content.Shared.Administration.Logs; using Content.Shared.Alert; using Content.Shared.Buckle.Components; +using Content.Shared.CombatMode; using Content.Shared.Cuffs.Components; using Content.Shared.Database; using Content.Shared.DoAfter; @@ -53,6 +54,7 @@ namespace Content.Shared.Cuffs [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly UseDelaySystem _delay = default!; + [Dependency] private readonly SharedCombatModeSystem _combatMode = default!; public override void Initialize() { @@ -717,10 +719,31 @@ namespace Content.Shared.Cuffs } } + var shoved = false; + // if combat mode is on, shove the person. + if (_combatMode.IsInCombatMode(user) && target != user && user != null) + { + var eventArgs = new DisarmedEvent { Target = target, Source = user.Value, PushProbability = 1}; + RaiseLocalEvent(target, eventArgs); + shoved = true; + } + if (cuffable.CuffedHandCount == 0) { if (user != null) - _popup.PopupClient(Loc.GetString("cuffable-component-remove-cuffs-success-message"), user.Value, user.Value); + { + if (shoved) + { + _popup.PopupClient(Loc.GetString("cuffable-component-remove-cuffs-push-success-message", + ("otherName", Identity.Name(user.Value, EntityManager, user))), + user.Value, + user.Value); + } + else + { + _popup.PopupClient(Loc.GetString("cuffable-component-remove-cuffs-success-message"), user.Value, user.Value); + } + } if (target != user && user != null) { diff --git a/Content.Shared/Damage/Components/DamageOnInteractComponent.cs b/Content.Shared/Damage/Components/DamageOnInteractComponent.cs index 9487dec8ef..d5465f19bd 100644 --- a/Content.Shared/Damage/Components/DamageOnInteractComponent.cs +++ b/Content.Shared/Damage/Components/DamageOnInteractComponent.cs @@ -44,4 +44,46 @@ public sealed partial class DamageOnInteractComponent : Component /// [DataField, AutoNetworkedField] public bool IsDamageActive = true; + + /// + /// Whether the thing should be thrown from its current position when they interact with the entity + /// + [DataField] + public bool Throw = false; + + /// + /// The speed applied to the thing when it is thrown + /// + [DataField] + public int ThrowSpeed = 10; + + /// + /// Time between being able to interact with this entity + /// + [DataField] + public uint InteractTimer = 0; + + /// + /// Tracks the last time this entity was interacted with, but only if the interaction resulted in the user taking damage + /// + [DataField] + public TimeSpan LastInteraction = TimeSpan.Zero; + + /// + /// Tracks the time that this entity can be interacted with, but only if the interaction resulted in the user taking damage + /// + [DataField] + public TimeSpan NextInteraction = TimeSpan.Zero; + + /// + /// Probability that the user will be stunned when they interact with with this entity and took damage + /// + [DataField] + public float StunChance = 0.0f; + + /// + /// Duration, in seconds, of the stun applied to the user when they interact with the entity and took damage + /// + [DataField] + public float StunSeconds = 0.0f; } diff --git a/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs b/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs index cc3b3f6d5d..0f43e93abf 100644 --- a/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs +++ b/Content.Shared/Damage/Systems/DamageOnInteractSystem.cs @@ -4,9 +4,15 @@ using Content.Shared.Database; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Popups; +using Robust.Shared.Random; +using Content.Shared.Throwing; using Robust.Shared.Audio.Systems; using Robust.Shared.Network; using Robust.Shared.Timing; +using Content.Shared.Random; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Effects; +using Content.Shared.Stunnable; namespace Content.Shared.Damage.Systems; @@ -17,6 +23,10 @@ public sealed class DamageOnInteractSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly ThrowingSystem _throwingSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedStunSystem _stun = default!; public override void Initialize() { @@ -35,6 +45,13 @@ public sealed class DamageOnInteractSystem : EntitySystem /// Contains the user that interacted with the entity private void OnHandInteract(Entity entity, ref InteractHandEvent args) { + // Stop the interaction if the user attempts to interact with the object before the timer is finished + if (_gameTiming.CurTime < entity.Comp.NextInteraction) + { + args.Handled = true; + return; + } + if (!entity.Comp.IsDamageActive) return; @@ -47,9 +64,8 @@ public sealed class DamageOnInteractSystem : EntitySystem // or checking the entity for the comp itself if the inventory didn't work if (protectiveEntity.Comp == null && TryComp(args.User, out var protectiveComp)) - { protectiveEntity = (args.User, protectiveComp); - } + // if protectiveComp isn't null after all that, it means the user has protection, // so let's calculate how much they resist @@ -59,17 +75,31 @@ public sealed class DamageOnInteractSystem : EntitySystem } } - totalDamage = _damageableSystem.TryChangeDamage(args.User, totalDamage, origin: args.Target); + totalDamage = _damageableSystem.TryChangeDamage(args.User, totalDamage, origin: args.Target); if (totalDamage != null && totalDamage.AnyPositive()) { + // Record this interaction and determine when a user is allowed to interact with this entity again + entity.Comp.LastInteraction = _gameTiming.CurTime; + entity.Comp.NextInteraction = _gameTiming.CurTime + TimeSpan.FromSeconds(entity.Comp.InteractTimer); + args.Handled = true; _adminLogger.Add(LogType.Damaged, $"{ToPrettyString(args.User):user} injured their hand by interacting with {ToPrettyString(args.Target):target} and received {totalDamage.GetTotal():damage} damage"); _audioSystem.PlayPredicted(entity.Comp.InteractSound, args.Target, args.User); if (entity.Comp.PopupText != null) _popupSystem.PopupClient(Loc.GetString(entity.Comp.PopupText), args.User, args.User); + + // Attempt to paralyze the user after they have taken damage + if (_random.Prob(entity.Comp.StunChance)) + _stun.TryParalyze(args.User, TimeSpan.FromSeconds(entity.Comp.StunSeconds), true); } + // Check if the entity's Throw bool is false, or if the entity has the PullableComponent, then if the entity is currently being pulled. + // BeingPulled must be checked because the entity will be spastically thrown around without this. + if (!entity.Comp.Throw || !TryComp(entity, out var pullComp) || pullComp.BeingPulled) + return; + + _throwingSystem.TryThrow(entity, _random.NextVector2(), entity.Comp.ThrowSpeed, doSpin: true); } public void SetIsDamageActiveTo(Entity entity, bool mode) diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 8557e5623f..fb55a6184e 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -296,7 +296,7 @@ namespace Content.Shared.Damage DamageChanged(uid, component, new DamageSpecifier()); } - public void SetDamageModifierSetId(EntityUid uid, string damageModifierSetId, DamageableComponent? comp = null) + public void SetDamageModifierSetId(EntityUid uid, string? damageModifierSetId, DamageableComponent? comp = null) { if (!_damageableQuery.Resolve(uid, ref comp)) return; diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index 94a32f5ef3..fada9822a3 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -67,6 +67,8 @@ public partial class InventorySystem SubscribeLocalEvent>(RefRelayInventoryEvent); SubscribeLocalEvent>(OnGetEquipmentVerbs); + SubscribeLocalEvent>(OnGetInnateVerbs); + } protected void RefRelayInventoryEvent(EntityUid uid, InventoryComponent component, ref T args) where T : IInventoryRelayEvent @@ -121,6 +123,17 @@ public partial class InventorySystem } } + private void OnGetInnateVerbs(EntityUid uid, InventoryComponent component, GetVerbsEvent args) + { + // Automatically relay stripping related verbs to all equipped clothing. + var ev = new InventoryRelayedEvent>(args); + var enumerator = new InventorySlotEnumerator(component, SlotFlags.WITHOUT_POCKET); + while (enumerator.NextItem(out var item)) + { + RaiseLocalEvent(item, ev); + } + } + } /// diff --git a/Content.Shared/Maps/TurfHelpers.cs b/Content.Shared/Maps/TurfHelpers.cs index 71bbb35db7..dfa12f3d8f 100644 --- a/Content.Shared/Maps/TurfHelpers.cs +++ b/Content.Shared/Maps/TurfHelpers.cs @@ -23,7 +23,7 @@ namespace Content.Shared.Maps return null; mapManager ??= IoCManager.Resolve(); - var pos = coordinates.ToMap(entityManager, entityManager.System()); + var pos = entityManager.System().ToMapCoordinates(coordinates); if (!mapManager.TryFindGridAt(pos, out _, out var grid)) return null; diff --git a/Content.Shared/Medical/Stethoscope/Components/StethoscopeComponent.cs b/Content.Shared/Medical/Stethoscope/Components/StethoscopeComponent.cs new file mode 100644 index 0000000000..7f740ef39c --- /dev/null +++ b/Content.Shared/Medical/Stethoscope/Components/StethoscopeComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Medical.Stethoscope.Components; + +/// +/// Adds a verb and action that allows the user to listen to the entity's breathing. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class StethoscopeComponent : Component +{ + /// + /// Time between each use of the stethoscope. + /// + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(1.75); + + /// + /// Last damage that was measured. Used to indicate if breathing is improving or getting worse. + /// + [DataField] + public FixedPoint2? LastMeasuredDamage; + + [DataField] + public EntProtoId Action = "ActionStethoscope"; + + [DataField] + public EntityUid? ActionEntity; +} + diff --git a/Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs b/Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs deleted file mode 100644 index 11ac8a2684..0000000000 --- a/Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Actions; - -namespace Content.Shared.Medical.Stethoscope; - -public sealed partial class StethoscopeActionEvent : EntityTargetActionEvent -{ -} diff --git a/Content.Shared/Medical/Stethoscope/StethoscopeSystem.cs b/Content.Shared/Medical/Stethoscope/StethoscopeSystem.cs new file mode 100644 index 0000000000..01d61aa06e --- /dev/null +++ b/Content.Shared/Medical/Stethoscope/StethoscopeSystem.cs @@ -0,0 +1,148 @@ +using Content.Shared.Actions; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.FixedPoint; +using Content.Shared.Inventory; +using Content.Shared.Medical.Stethoscope.Components; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Popups; +using Content.Shared.Verbs; +using Robust.Shared.Containers; + +namespace Content.Shared.Medical.Stethoscope; + +public sealed class StethoscopeSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + + // The damage type to "listen" for with the stethoscope. + private const string DamageToListenFor = "Asphyxiation"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>>(AddStethoscopeVerb); + SubscribeLocalEvent(OnGetActions); + SubscribeLocalEvent(OnStethoscopeAction); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnGetActions(Entity ent, ref GetItemActionsEvent args) + { + args.AddAction(ref ent.Comp.ActionEntity, ent.Comp.Action); + } + + private void OnStethoscopeAction(Entity ent, ref StethoscopeActionEvent args) + { + StartListening(ent, args.Target); + } + + private void AddStethoscopeVerb(Entity ent, ref InventoryRelayedEvent> args) + { + if (!args.Args.CanInteract || !args.Args.CanAccess) + return; + + if (!HasComp(args.Args.Target)) + return; + + var target = args.Args.Target; + + InnateVerb verb = new() + { + Act = () => StartListening(ent, target), + Text = Loc.GetString("stethoscope-verb"), + IconEntity = GetNetEntity(ent), + Priority = 2, + }; + args.Args.Verbs.Add(verb); + } + + private void StartListening(Entity ent, EntityUid target) + { + if (!_container.TryGetContainingContainer((ent, null, null), out var container)) + return; + + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, container.Owner, ent.Comp.Delay, new StethoscopeDoAfterEvent(), ent, target: target, used: ent) + { + DuplicateCondition = DuplicateConditions.SameEvent, + BreakOnMove = true, + Hidden = true, + BreakOnHandChange = false, + }); + } + + private void OnDoAfter(Entity ent, ref StethoscopeDoAfterEvent args) + { + var target = args.Target; + + if (args.Handled || target == null || args.Cancelled) + { + ent.Comp.LastMeasuredDamage = null; + return; + } + + ExamineWithStethoscope(ent, args.Args.User, target.Value); + + args.Repeat = true; + } + + private void ExamineWithStethoscope(Entity stethoscope, EntityUid user, EntityUid target) + { + // TODO: Add check for respirator component when it gets moved to shared. + // If the mob is dead or cannot asphyxiation damage, the popup shows nothing. + if (!TryComp(target, out var mobState) || + !TryComp(target, out var damageComp) || + _mobState.IsDead(target, mobState) || + !damageComp.Damage.DamageDict.TryGetValue(DamageToListenFor, out var asphyxDmg)) + { + _popup.PopupPredicted(Loc.GetString("stethoscope-nothing"), target, user); + stethoscope.Comp.LastMeasuredDamage = null; + return; + } + + var absString = GetAbsoluteDamageString(asphyxDmg); + + // Don't show the change if this is the first time listening. + if (stethoscope.Comp.LastMeasuredDamage == null) + { + _popup.PopupPredicted(absString, target, user); + } + else + { + var deltaString = GetDeltaDamageString(stethoscope.Comp.LastMeasuredDamage.Value, asphyxDmg); + _popup.PopupPredicted(Loc.GetString("stethoscope-combined-status", ("absolute", absString), ("delta", deltaString)), target, user); + } + + stethoscope.Comp.LastMeasuredDamage = asphyxDmg; + } + + private string GetAbsoluteDamageString(FixedPoint2 asphyxDmg) + { + var msg = (int) asphyxDmg switch + { + < 10 => "stethoscope-normal", + < 30 => "stethoscope-raggedy", + < 60 => "stethoscope-hyper", + < 80 => "stethoscope-irregular", + _ => "stethoscope-fucked", + }; + return Loc.GetString(msg); + } + + private string GetDeltaDamageString(FixedPoint2 lastDamage, FixedPoint2 currentDamage) + { + if (lastDamage > currentDamage) + return Loc.GetString("stethoscope-delta-improving"); + if (lastDamage < currentDamage) + return Loc.GetString("stethoscope-delta-worsening"); + return Loc.GetString("stethoscope-delta-steady"); + } + +} + +public sealed partial class StethoscopeActionEvent : EntityTargetActionEvent; diff --git a/Content.Shared/Medical/StethoscopeDoAfterEvent.cs b/Content.Shared/Medical/StethoscopeDoAfterEvent.cs index aeb1c133cf..d3f3962958 100644 --- a/Content.Shared/Medical/StethoscopeDoAfterEvent.cs +++ b/Content.Shared/Medical/StethoscopeDoAfterEvent.cs @@ -4,6 +4,4 @@ using Robust.Shared.Serialization; namespace Content.Shared.Medical; [Serializable, NetSerializable] -public sealed partial class StethoscopeDoAfterEvent : SimpleDoAfterEvent -{ -} +public sealed partial class StethoscopeDoAfterEvent : SimpleDoAfterEvent; diff --git a/Content.Shared/Movement/Components/ActiveJetpackComponent.cs b/Content.Shared/Movement/Components/ActiveJetpackComponent.cs index 615dc3aee4..03c2a8345d 100644 --- a/Content.Shared/Movement/Components/ActiveJetpackComponent.cs +++ b/Content.Shared/Movement/Components/ActiveJetpackComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Map; namespace Content.Shared.Movement.Components; @@ -9,5 +10,10 @@ namespace Content.Shared.Movement.Components; public sealed partial class ActiveJetpackComponent : Component { public float EffectCooldown = 0.3f; + + public float MaxDistance = 0.7f; + + public EntityCoordinates LastCoordinates; + public TimeSpan TargetTime = TimeSpan.Zero; } diff --git a/Content.Shared/Movement/Components/InputMoverComponent.cs b/Content.Shared/Movement/Components/InputMoverComponent.cs index f1e34c90df..7c3b8b431a 100644 --- a/Content.Shared/Movement/Components/InputMoverComponent.cs +++ b/Content.Shared/Movement/Components/InputMoverComponent.cs @@ -32,7 +32,7 @@ namespace Content.Shared.Movement.Components /// /// Should our velocity be applied to our parent? /// - [ViewVariables(VVAccess.ReadWrite), DataField("toParent")] + [DataField] public bool ToParent = false; public GameTick LastInputTick; @@ -43,6 +43,12 @@ namespace Content.Shared.Movement.Components public MoveButtons HeldMoveButtons = MoveButtons.None; + // I don't know if we even need this networked? It's mostly so conveyors can calculate properly. + /// + /// Direction to move this tick. + /// + public Vector2 WishDir; + /// /// Entity our movement is relative to. /// @@ -65,7 +71,6 @@ namespace Content.Shared.Movement.Components /// If we traverse on / off a grid then set a timer to update our relative inputs. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] - [ViewVariables(VVAccess.ReadWrite)] public TimeSpan LerpTarget; public const float LerpTime = 1.0f; diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 5de74d7294..6456444080 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -155,7 +155,6 @@ public abstract partial class SharedMoverController : VirtualController return; } - UsedMobMovement[uid] = true; // Specifically don't use mover.Owner because that may be different to the actual physics body being moved. var weightless = _gravity.IsWeightless(physicsUid, physicsComponent, xform); @@ -203,20 +202,21 @@ public abstract partial class SharedMoverController : VirtualController var total = walkDir * walkSpeed + sprintDir * sprintSpeed; var parentRotation = GetParentGridAngle(mover); - var worldTotal = _relativeMovement ? parentRotation.RotateVec(total) : total; + var wishDir = _relativeMovement ? parentRotation.RotateVec(total) : total; - DebugTools.Assert(MathHelper.CloseToPercent(total.Length(), worldTotal.Length())); + DebugTools.Assert(MathHelper.CloseToPercent(total.Length(), wishDir.Length())); - var velocity = physicsComponent.LinearVelocity; float friction; float weightlessModifier; float accel; + var velocity = physicsComponent.LinearVelocity; + // Whether we use weightless friction or not. if (weightless) { if (gridComp == null && !MapGridQuery.HasComp(xform.GridUid)) friction = moveSpeedComponent?.OffGridFriction ?? MovementSpeedModifierComponent.DefaultOffGridFriction; - else if (worldTotal != Vector2.Zero && touching) + else if (wishDir != Vector2.Zero && touching) friction = moveSpeedComponent?.WeightlessFriction ?? MovementSpeedModifierComponent.DefaultWeightlessFriction; else friction = moveSpeedComponent?.WeightlessFrictionNoInput ?? MovementSpeedModifierComponent.DefaultWeightlessFrictionNoInput; @@ -226,7 +226,7 @@ public abstract partial class SharedMoverController : VirtualController } else { - if (worldTotal != Vector2.Zero || moveSpeedComponent?.FrictionNoInput == null) + if (wishDir != Vector2.Zero || moveSpeedComponent?.FrictionNoInput == null) { friction = tileDef?.MobFriction ?? moveSpeedComponent?.Friction ?? MovementSpeedModifierComponent.DefaultFriction; } @@ -242,14 +242,27 @@ public abstract partial class SharedMoverController : VirtualController var minimumFrictionSpeed = moveSpeedComponent?.MinimumFrictionSpeed ?? MovementSpeedModifierComponent.DefaultMinimumFrictionSpeed; Friction(minimumFrictionSpeed, frameTime, friction, ref velocity); - if (worldTotal != Vector2.Zero) + wishDir *= weightlessModifier; + + if (!weightless || touching) + Accelerate(ref velocity, in wishDir, accel, frameTime); + + SetWishDir((uid, mover), wishDir); + + PhysicsSystem.SetLinearVelocity(physicsUid, velocity, body: physicsComponent); + + // Ensures that players do not spiiiiiiin + PhysicsSystem.SetAngularVelocity(physicsUid, 0, body: physicsComponent); + + // Handle footsteps at the end + if (total != Vector2.Zero) { if (!NoRotateQuery.HasComponent(uid)) { // TODO apparently this results in a duplicate move event because "This should have its event run during // island solver"??. So maybe SetRotation needs an argument to avoid raising an event? var worldRot = _transform.GetWorldRotation(xform); - _transform.SetLocalRotation(xform, xform.LocalRotation + worldTotal.ToWorldAngle() - worldRot); + _transform.SetLocalRotation(xform, xform.LocalRotation + wishDir.ToWorldAngle() - worldRot); } if (!weightless && MobMoverQuery.TryGetComponent(uid, out var mobMover) && @@ -272,16 +285,23 @@ public abstract partial class SharedMoverController : VirtualController } } } + } - worldTotal *= weightlessModifier; + public Vector2 GetWishDir(Entity mover) + { + if (!MoverQuery.Resolve(mover.Owner, ref mover.Comp, false)) + return Vector2.Zero; - if (!weightless || touching) - Accelerate(ref velocity, in worldTotal, accel, frameTime); + return mover.Comp.WishDir; + } - PhysicsSystem.SetLinearVelocity(physicsUid, velocity, body: physicsComponent); + public void SetWishDir(Entity mover, Vector2 wishDir) + { + if (mover.Comp.WishDir.Equals(wishDir)) + return; - // Ensures that players do not spiiiiiiin - PhysicsSystem.SetAngularVelocity(physicsUid, 0, body: physicsComponent); + mover.Comp.WishDir = wishDir; + Dirty(mover); } public void LerpRotation(EntityUid uid, InputMoverComponent mover, float frameTime) @@ -317,7 +337,7 @@ public abstract partial class SharedMoverController : VirtualController } } - private void Friction(float minimumFrictionSpeed, float frameTime, float friction, ref Vector2 velocity) + public void Friction(float minimumFrictionSpeed, float frameTime, float friction, ref Vector2 velocity) { var speed = velocity.Length(); @@ -338,7 +358,10 @@ public abstract partial class SharedMoverController : VirtualController velocity *= newSpeed; } - private void Accelerate(ref Vector2 currentVelocity, in Vector2 velocity, float accel, float frameTime) + /// + /// Adjusts the current velocity to the target velocity based on the specified acceleration. + /// + public static void Accelerate(ref Vector2 currentVelocity, in Vector2 velocity, float accel, float frameTime) { var wishDir = velocity != Vector2.Zero ? velocity.Normalized() : Vector2.Zero; var wishSpeed = velocity.Length(); diff --git a/Content.Shared/Physics/Controllers/SharedConveyorController.cs b/Content.Shared/Physics/Controllers/SharedConveyorController.cs index abcd2bc4a2..07bf6c7332 100644 --- a/Content.Shared/Physics/Controllers/SharedConveyorController.cs +++ b/Content.Shared/Physics/Controllers/SharedConveyorController.cs @@ -2,124 +2,211 @@ using Content.Shared.Conveyor; using Content.Shared.Gravity; using Content.Shared.Magic; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; using Robust.Shared.Collections; using Robust.Shared.Map; -using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Controllers; using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; -using Robust.Shared.Utility; +using Robust.Shared.Threading; namespace Content.Shared.Physics.Controllers; public abstract class SharedConveyorController : VirtualController { [Dependency] protected readonly IMapManager MapManager = default!; + [Dependency] private readonly IParallelManager _parallel = default!; + [Dependency] private readonly CollisionWakeSystem _wake = default!; [Dependency] protected readonly EntityLookupSystem Lookup = default!; - [Dependency] private readonly SharedMapSystem _maps = default!; - [Dependency] protected readonly SharedPhysicsSystem Physics = default!; - [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly FixtureSystem _fixtures = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedMoverController _mover = default!; protected const string ConveyorFixture = "conveyor"; - private EntityQuery _gridQuery; - private EntityQuery _xformQuery; + private ConveyorJob _job; - private ValueList _ents = new(); - private HashSet> _conveyors = new(); + private EntityQuery _conveyorQuery; + private EntityQuery _conveyedQuery; + protected EntityQuery PhysicsQuery; + protected EntityQuery XformQuery; + + protected HashSet Intersecting = new(); public override void Initialize() { - _gridQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); + _job = new ConveyorJob(this); + _conveyorQuery = GetEntityQuery(); + _conveyedQuery = GetEntityQuery(); + PhysicsQuery = GetEntityQuery(); + XformQuery = GetEntityQuery(); UpdatesAfter.Add(typeof(SharedMoverController)); + SubscribeLocalEvent(OnConveyedFriction); + SubscribeLocalEvent(OnConveyedStartup); + SubscribeLocalEvent(OnConveyedShutdown); + SubscribeLocalEvent(OnConveyorStartCollide); - SubscribeLocalEvent(OnConveyorEndCollide); + SubscribeLocalEvent(OnConveyorStartup); base.Initialize(); } - private void OnConveyorStartCollide(EntityUid uid, ConveyorComponent component, ref StartCollideEvent args) + private void OnConveyedFriction(Entity ent, ref TileFrictionEvent args) + { + // Conveyed entities don't get friction, they just get wishdir applied so will inherently slowdown anyway. + args.Modifier = 0f; + } + + private void OnConveyedStartup(Entity ent, ref ComponentStartup args) + { + // We need waking / sleeping to work and don't want collisionwake interfering with us. + _wake.SetEnabled(ent.Owner, false); + } + + private void OnConveyedShutdown(Entity ent, ref ComponentShutdown args) + { + _wake.SetEnabled(ent.Owner, true); + } + + private void OnConveyorStartup(Entity ent, ref ComponentStartup args) + { + AwakenConveyor(ent.Owner); + } + + /// + /// Forcefully awakens all entities near the conveyor. + /// + protected virtual void AwakenConveyor(Entity ent) + { + } + + /// + /// Wakes all conveyed entities contacting this conveyor. + /// + protected void WakeConveyed(EntityUid conveyorUid) + { + var contacts = PhysicsSystem.GetContacts(conveyorUid); + + while (contacts.MoveNext(out var contact)) + { + var other = contact.OtherEnt(conveyorUid); + + if (_conveyedQuery.HasComp(other)) + { + PhysicsSystem.WakeBody(other); + } + } + } + + private void OnConveyorStartCollide(Entity conveyor, ref StartCollideEvent args) { var otherUid = args.OtherEntity; - if (!args.OtherFixture.Hard || args.OtherBody.BodyType == BodyType.Static || component.State == ConveyorState.Off) + if (!args.OtherFixture.Hard || args.OtherBody.BodyType == BodyType.Static) return; - var conveyed = EnsureComp(otherUid); - - if (conveyed.Colliding.Contains(uid)) - return; - - conveyed.Colliding.Add(uid); - Dirty(otherUid, conveyed); - } - - private void OnConveyorEndCollide(Entity ent, ref EndCollideEvent args) - { - if (!TryComp(args.OtherEntity, out ConveyedComponent? conveyed)) - return; - - if (!conveyed.Colliding.Remove(ent.Owner)) - return; - - Dirty(args.OtherEntity, conveyed); + EnsureComp(otherUid); } public override void UpdateBeforeSolve(bool prediction, float frameTime) { base.UpdateBeforeSolve(prediction, frameTime); - var query = EntityQueryEnumerator(); - _ents.Clear(); + _job.Prediction = prediction; + _job.Conveyed.Clear(); - while (query.MoveNext(out var uid, out var comp, out var xform, out var physics)) + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var comp, out var fixtures, out var physics, out var xform)) { - if (TryConvey((uid, comp, physics, xform), prediction, frameTime)) - continue; - - _ents.Add(uid); + _job.Conveyed.Add(((uid, comp, fixtures, physics, xform), Vector2.Zero, false)); } - foreach (var ent in _ents) + _parallel.ProcessNow(_job, _job.Conveyed.Count); + + foreach (var ent in _job.Conveyed) { - RemComp(ent); + if (!ent.Entity.Comp3.Predict && prediction) + continue; + + var physics = ent.Entity.Comp3; + var velocity = physics.LinearVelocity; + var targetDir = ent.Direction; + + // If mob is moving with the conveyor then combine the directions. + var wishDir = _mover.GetWishDir(ent.Entity.Owner); + + if (Vector2.Dot(wishDir, targetDir) > 0f) + { + targetDir += wishDir; + } + + if (ent.Result) + { + SetConveying(ent.Entity.Owner, ent.Entity.Comp1, targetDir.LengthSquared() > 0f); + + // We apply friction here so when we push items towards the center of the conveyor they don't go overspeed. + // We also don't want this to apply to mobs as they apply their own friction and otherwise + // they'll go too slow. + if (!_mover.UsedMobMovement.TryGetValue(ent.Entity.Owner, out var usedMob) || !usedMob) + { + _mover.Friction(0f, frameTime: frameTime, friction: 5f, ref velocity); + } + + SharedMoverController.Accelerate(ref velocity, targetDir, 20f, frameTime); + } + else if (!_mover.UsedMobMovement.TryGetValue(ent.Entity.Owner, out var usedMob) || !usedMob) + { + // Need friction to outweigh the movement as it will bounce a bit against the wall. + // This facilitates being able to sleep entities colliding into walls. + _mover.Friction(0f, frameTime: frameTime, friction: 40f, ref velocity); + } + + PhysicsSystem.SetLinearVelocity(ent.Entity.Owner, velocity, wakeBody: false); + + if (!IsConveyed((ent.Entity.Owner, ent.Entity.Comp2))) + { + RemComp(ent.Entity.Owner); + } } } - private bool TryConvey(Entity entity, bool prediction, float frameTime) + private void SetConveying(EntityUid uid, ConveyedComponent conveyed, bool value) { - var physics = entity.Comp2; - var xform = entity.Comp3; - var contacting = entity.Comp1.Colliding.Count > 0; + if (conveyed.Conveying == value) + return; - if (!contacting) - return false; + conveyed.Conveying = value; + Dirty(uid, conveyed); + } + + /// + /// Gets the conveying direction for an entity. + /// + /// False if we should no longer be considered actively conveyed. + private bool TryConvey(Entity entity, + bool prediction, + out Vector2 direction) + { + direction = Vector2.Zero; + var fixtures = entity.Comp2; + var physics = entity.Comp3; + var xform = entity.Comp4; + + if (!physics.Awake) + return true; // Client moment if (!physics.Predict && prediction) return true; - if (physics.BodyType == BodyType.Static) - return false; - - if (!_gridQuery.TryComp(xform.GridUid, out var grid)) - return true; - - var gridTile = _maps.TileIndicesFor(xform.GridUid.Value, grid, xform.Coordinates); - _conveyors.Clear(); - - // Check for any conveyors on the attached tile. - Lookup.GetLocalEntitiesIntersecting(xform.GridUid.Value, gridTile, _conveyors); - DebugTools.Assert(_conveyors.Count <= 1); - - // No more conveyors. - if (_conveyors.Count == 0) + if (xform.GridUid == null) return true; if (physics.BodyStatus == BodyStatus.InAir || @@ -130,48 +217,93 @@ public abstract class SharedConveyorController : VirtualController Entity bestConveyor = default; var bestSpeed = 0f; + var contacts = PhysicsSystem.GetContacts((entity.Owner, fixtures)); + var transform = PhysicsSystem.GetPhysicsTransform(entity.Owner); + var anyConveyors = false; - foreach (var conveyor in _conveyors) + while (contacts.MoveNext(out var contact)) { - if (conveyor.Comp.Speed > bestSpeed && CanRun(conveyor)) + if (!contact.IsTouching) + continue; + + // Check if our center is over their fixture otherwise ignore it. + var other = contact.OtherEnt(entity.Owner); + + // Check for blocked, if so then we can't convey at all and just try to sleep + // Otherwise we may just keep pushing it into the wall + + if (!_conveyorQuery.TryComp(other, out var conveyor)) + continue; + + anyConveyors = true; + var otherFixture = contact.OtherFixture(entity.Owner); + var otherTransform = PhysicsSystem.GetPhysicsTransform(other); + + // Check if our center is over the conveyor, otherwise ignore it. + if (!_fixtures.TestPoint(otherFixture.Item2.Shape, otherTransform, transform.Position)) + continue; + + if (conveyor.Speed > bestSpeed && CanRun(conveyor)) { - bestSpeed = conveyor.Comp.Speed; - bestConveyor = conveyor; + bestSpeed = conveyor.Speed; + bestConveyor = (other, conveyor); } } + // If we have no touching contacts we shouldn't be using conveyed anyway so nuke it. + if (!anyConveyors) + return true; + if (bestSpeed == 0f || bestConveyor == default) return true; var comp = bestConveyor.Comp!; - var conveyorXform = _xformQuery.GetComponent(bestConveyor.Owner); - var conveyorPos = conveyorXform.LocalPosition; - var conveyorRot = conveyorXform.LocalRotation; + var conveyorXform = XformQuery.GetComponent(bestConveyor.Owner); + var (conveyorPos, conveyorRot) = TransformSystem.GetWorldPositionRotation(conveyorXform); conveyorRot += bestConveyor.Comp!.Angle; if (comp.State == ConveyorState.Reverse) conveyorRot += MathF.PI; - var direction = conveyorRot.ToWorldVec(); + var conveyorDirection = conveyorRot.ToWorldVec(); + direction = conveyorDirection; - var localPos = xform.LocalPosition; - var itemRelative = conveyorPos - localPos; + var itemRelative = conveyorPos - transform.Position; + direction = Convey(direction, bestSpeed, itemRelative); - localPos += Convey(direction, bestSpeed, frameTime, itemRelative); + // Do a final check for hard contacts so if we're conveying into a wall then NOOP. + contacts = PhysicsSystem.GetContacts((entity.Owner, fixtures)); - TransformSystem.SetLocalPosition(entity, localPos, xform); + while (contacts.MoveNext(out var contact)) + { + if (!contact.Hard || !contact.IsTouching) + continue; - // Force it awake for collisionwake reasons. - Physics.SetAwake((entity, physics), true); - Physics.SetSleepTime(physics, 0f); + var other = contact.OtherEnt(entity.Owner); + var otherBody = contact.OtherBody(entity.Owner); + + // If the blocking body is dynamic then don't ignore it for this. + if (otherBody.BodyType != BodyType.Static) + continue; + + var otherTransform = PhysicsSystem.GetPhysicsTransform(other); + var dotProduct = Vector2.Dot(otherTransform.Position - transform.Position, direction); + + // TODO: This should probably be based on conveyor speed, this is mainly so we don't + // go to sleep when conveying and colliding with tables perpendicular to the conveyance direction. + if (dotProduct > 1.5f) + { + direction = Vector2.Zero; + return false; + } + } return true; } - - private static Vector2 Convey(Vector2 direction, float speed, float frameTime, Vector2 itemRelative) + private static Vector2 Convey(Vector2 direction, float speed, Vector2 itemRelative) { - if (speed == 0 || direction.Length() == 0) + if (speed == 0 || direction.LengthSquared() == 0) return Vector2.Zero; /* @@ -190,15 +322,15 @@ public abstract class SharedConveyorController : VirtualController if (r.Length() < 0.1) { var velocity = direction * speed; - return velocity * frameTime; + return velocity; } else { // Give a slight nudge in the direction of the conveyor to prevent // to collidable objects (e.g. crates) on the locker from getting stuck // pushing each other when rounding a corner. - var velocity = (r + direction*0.2f).Normalized() * speed; - return velocity * frameTime; + var velocity = (r + direction).Normalized() * speed; + return velocity; } } @@ -206,4 +338,55 @@ public abstract class SharedConveyorController : VirtualController { return component.State != ConveyorState.Off && component.Powered; } + + private record struct ConveyorJob : IParallelRobustJob + { + public int BatchSize => 16; + + public List<(Entity Entity, Vector2 Direction, bool Result)> Conveyed = new(); + + public SharedConveyorController System; + + public bool Prediction; + + public ConveyorJob(SharedConveyorController controller) + { + System = controller; + } + + public void Execute(int index) + { + var convey = Conveyed[index]; + + var result = System.TryConvey( + (convey.Entity.Owner, convey.Entity.Comp1, convey.Entity.Comp2, convey.Entity.Comp3, convey.Entity.Comp4), + Prediction, out var direction); + + Conveyed[index] = (convey.Entity, direction, result); + } + } + + /// + /// Checks an entity's contacts to see if it's still being conveyed. + /// + private bool IsConveyed(Entity ent) + { + if (!Resolve(ent.Owner, ref ent.Comp)) + return false; + + var contacts = PhysicsSystem.GetContacts(ent.Owner); + + while (contacts.MoveNext(out var contact)) + { + if (!contact.IsTouching) + continue; + + var other = contact.OtherEnt(ent.Owner); + + if (_conveyorQuery.HasComp(other)) + return true; + } + + return false; + } } diff --git a/Content.Shared/Power/Components/ApcPowerReceiverBatteryChangedEvent.cs b/Content.Shared/Power/Components/ApcPowerReceiverBatteryComponent.cs similarity index 100% rename from Content.Shared/Power/Components/ApcPowerReceiverBatteryChangedEvent.cs rename to Content.Shared/Power/Components/ApcPowerReceiverBatteryComponent.cs diff --git a/Content.Shared/Projectiles/SharedProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs index d0cb3b2261..7161a39e0a 100644 --- a/Content.Shared/Projectiles/SharedProjectileSystem.cs +++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs @@ -39,6 +39,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem SubscribeLocalEvent(OnEmbedThrowDoHit); SubscribeLocalEvent(OnEmbedActivate); SubscribeLocalEvent(OnEmbedRemove); + SubscribeLocalEvent(OnEmbeddableCompShutdown); SubscribeLocalEvent(OnEmbeddableTermination); } @@ -75,6 +76,11 @@ public abstract partial class SharedProjectileSystem : EntitySystem _hands.TryPickupAnyHand(args.User, embeddable); } + private void OnEmbeddableCompShutdown(Entity embeddable, ref ComponentShutdown arg) + { + EmbedDetach(embeddable, embeddable.Comp); + } + private void OnEmbedThrowDoHit(Entity embeddable, ref ThrowDoHitEvent args) { if (!embeddable.Comp.EmbedOnThrow) @@ -130,16 +136,21 @@ public abstract partial class SharedProjectileSystem : EntitySystem if (!Resolve(uid, ref component)) return; - if (component.DeleteOnRemove) - { - QueueDel(uid); - return; - } - if (component.EmbeddedIntoUid is not null) { if (TryComp(component.EmbeddedIntoUid.Value, out var embeddedContainer)) + { embeddedContainer.EmbeddedObjects.Remove(uid); + Dirty(component.EmbeddedIntoUid.Value, embeddedContainer); + if (embeddedContainer.EmbeddedObjects.Count == 0) + RemCompDeferred(component.EmbeddedIntoUid.Value); + } + } + + if (component.DeleteOnRemove && _net.IsServer) + { + QueueDel(uid); + return; } var xform = Transform(uid); diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 8acfb56376..afdf9c2b6d 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -1,4 +1,3 @@ -using System.Diagnostics.CodeAnalysis; using Content.Shared.Actions.Events; using Content.Shared.IdentityManagement; using Content.Shared.Interaction.Events; @@ -122,6 +121,14 @@ public abstract partial class SharedStationAiSystem if (ev.Actor == ev.Target) return; + // no need to show menu if device is not powered. + if (!PowerReceiver.IsPowered(ev.Target)) + { + ShowDeviceNotRespondingPopup(ev.Actor); + ev.Cancel(); + return; + } + if (TryComp(ev.Actor, out StationAiHeldComponent? aiComp) && (!TryComp(ev.Target, out StationAiWhitelistComponent? whitelistComponent) || !ValidateAi((ev.Actor, aiComp)))) @@ -150,7 +157,8 @@ public abstract partial class SharedStationAiSystem private void OnTargetVerbs(Entity ent, ref GetVerbsEvent args) { if (!args.CanComplexInteract - || !HasComp(args.User)) + || !HasComp(args.User) + || !args.CanInteract) { return; } @@ -166,13 +174,6 @@ public abstract partial class SharedStationAiSystem Text = isOpen ? Loc.GetString("ai-close") : Loc.GetString("ai-open"), Act = () => { - // no need to show menu if device is not powered. - if (!PowerReceiver.IsPowered(ent.Owner)) - { - ShowDeviceNotRespondingPopup(user); - return; - } - if (isOpen) { _uiSystem.CloseUi(ent.Owner, AiUi.Key, user); diff --git a/Content.Shared/Sound/Components/BaseEmitSoundComponent.cs b/Content.Shared/Sound/Components/BaseEmitSoundComponent.cs index 870d20457e..7011f72ef0 100644 --- a/Content.Shared/Sound/Components/BaseEmitSoundComponent.cs +++ b/Content.Shared/Sound/Components/BaseEmitSoundComponent.cs @@ -1,4 +1,6 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; namespace Content.Shared.Sound.Components; @@ -8,10 +10,9 @@ namespace Content.Shared.Sound.Components; /// public abstract partial class BaseEmitSoundComponent : Component { - public static readonly AudioParams DefaultParams = AudioParams.Default.WithVolume(-2f); - - [AutoNetworkedField] - [ViewVariables(VVAccess.ReadWrite)] + /// + /// The to play. + /// [DataField(required: true)] public SoundSpecifier? Sound; @@ -22,3 +23,15 @@ public abstract partial class BaseEmitSoundComponent : Component [DataField] public bool Positional; } + +/// +/// Represents the state of . +/// +/// This is obviously very cursed, but since the BaseEmitSoundComponent is abstract, we cannot network it. +/// AutoGenerateComponentState attribute won't work here, and since everything revolves around inheritance for some fucking reason, +/// there's no better way of doing this. +[Serializable, NetSerializable] +public struct EmitSoundComponentState(SoundSpecifier? sound) : IComponentState +{ + public SoundSpecifier? Sound { get; } = sound; +} diff --git a/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs index 810f132d83..d6aa42177e 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnActivateComponent.cs @@ -17,6 +17,6 @@ public sealed partial class EmitSoundOnActivateComponent : BaseEmitSoundComponen /// otherwise this might enable sound spamming, as use-delays are only initiated if the interaction was /// handled. /// - [DataField("handle")] + [DataField] public bool Handle = true; } diff --git a/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs index a2cdd63ab7..4cdea05220 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnCollideComponent.cs @@ -11,13 +11,12 @@ public sealed partial class EmitSoundOnCollideComponent : BaseEmitSoundComponent /// /// Minimum velocity required for the sound to play. /// - [ViewVariables(VVAccess.ReadWrite), DataField("minVelocity")] + [DataField("minVelocity")] public float MinimumVelocity = 3f; /// /// To avoid sound spam add a cooldown to it. /// - [ViewVariables(VVAccess.ReadWrite), DataField("nextSound", customTypeSerializer: typeof(TimeOffsetSerializer))] - [AutoPausedField] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] public TimeSpan NextSound; } diff --git a/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs index 5e04295607..64ed5e60dc 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnDropComponent.cs @@ -6,6 +6,4 @@ namespace Content.Shared.Sound.Components; /// Simple sound emitter that emits sound on entity drop /// [RegisterComponent, NetworkedComponent] -public sealed partial class EmitSoundOnDropComponent : BaseEmitSoundComponent -{ -} +public sealed partial class EmitSoundOnDropComponent : BaseEmitSoundComponent; diff --git a/Content.Shared/Sound/Components/EmitSoundOnInteractUsingComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnInteractUsingComponent.cs index 49118d9799..d0b16fcec8 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnInteractUsingComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnInteractUsingComponent.cs @@ -1,5 +1,4 @@ using Content.Shared.Whitelist; -using Robust.Shared.Prototypes; using Robust.Shared.GameStates; namespace Content.Shared.Sound.Components; @@ -10,6 +9,9 @@ namespace Content.Shared.Sound.Components; [RegisterComponent, NetworkedComponent] public sealed partial class EmitSoundOnInteractUsingComponent : BaseEmitSoundComponent { + /// + /// The for the entities that can use this item. + /// [DataField(required: true)] public EntityWhitelist Whitelist = new(); } diff --git a/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs index 2d33a7f5f2..d3fceb85dd 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnLandComponent.cs @@ -6,6 +6,4 @@ namespace Content.Shared.Sound.Components; /// Simple sound emitter that emits sound on LandEvent /// [RegisterComponent, NetworkedComponent] -public sealed partial class EmitSoundOnLandComponent : BaseEmitSoundComponent -{ -} +public sealed partial class EmitSoundOnLandComponent : BaseEmitSoundComponent; diff --git a/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs index ee4b4b1688..dcf73b7ac2 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnPickupComponent.cs @@ -6,6 +6,4 @@ namespace Content.Shared.Sound.Components; /// Simple sound emitter that emits sound on entity pickup /// [RegisterComponent, NetworkedComponent] -public sealed partial class EmitSoundOnPickupComponent : BaseEmitSoundComponent -{ -} +public sealed partial class EmitSoundOnPickupComponent : BaseEmitSoundComponent; diff --git a/Content.Shared/Sound/Components/EmitSoundOnSpawnComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnSpawnComponent.cs index 49d40ce185..20d39b3460 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnSpawnComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnSpawnComponent.cs @@ -6,6 +6,4 @@ namespace Content.Shared.Sound.Components; /// Simple sound emitter that emits sound on entity spawn. /// [RegisterComponent, NetworkedComponent] -public sealed partial class EmitSoundOnSpawnComponent : BaseEmitSoundComponent -{ -} +public sealed partial class EmitSoundOnSpawnComponent : BaseEmitSoundComponent; diff --git a/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs index 5e3650a4a3..f8c0d1181b 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnThrowComponent.cs @@ -6,6 +6,4 @@ namespace Content.Shared.Sound.Components; /// Simple sound emitter that emits sound on ThrowEvent /// [RegisterComponent, NetworkedComponent] -public sealed partial class EmitSoundOnThrowComponent : BaseEmitSoundComponent -{ -} +public sealed partial class EmitSoundOnThrowComponent : BaseEmitSoundComponent; diff --git a/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs b/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs index a99a01cec4..ec7a277e92 100644 --- a/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs +++ b/Content.Shared/Sound/Components/EmitSoundOnUseComponent.cs @@ -5,7 +5,7 @@ namespace Content.Shared.Sound.Components; /// /// Simple sound emitter that emits sound on UseInHand /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class EmitSoundOnUseComponent : BaseEmitSoundComponent { /// @@ -17,6 +17,6 @@ public sealed partial class EmitSoundOnUseComponent : BaseEmitSoundComponent /// otherwise this might enable sound spamming, as use-delays are only initiated if the interaction was /// handled. /// - [DataField("handle")] + [DataField] public bool Handle = true; } diff --git a/Content.Shared/Sound/Components/SpamEmitSoundComponent.cs b/Content.Shared/Sound/Components/SpamEmitSoundComponent.cs index 149728a5ba..7c1428798c 100644 --- a/Content.Shared/Sound/Components/SpamEmitSoundComponent.cs +++ b/Content.Shared/Sound/Components/SpamEmitSoundComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Sound.Components; @@ -12,7 +13,7 @@ public sealed partial class SpamEmitSoundComponent : BaseEmitSoundComponent /// /// The time at which the next sound will play. /// - [DataField, AutoPausedField, AutoNetworkedField] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField, AutoNetworkedField] public TimeSpan NextSound; /// diff --git a/Content.Shared/Sound/Components/SpamEmitSoundRequirePowerComponent.cs b/Content.Shared/Sound/Components/SpamEmitSoundRequirePowerComponent.cs index b0547ea398..bf5e925e0d 100644 --- a/Content.Shared/Sound/Components/SpamEmitSoundRequirePowerComponent.cs +++ b/Content.Shared/Sound/Components/SpamEmitSoundRequirePowerComponent.cs @@ -5,6 +5,4 @@ namespace Content.Shared.Sound.Components; /// on the powered state of the entity. /// [RegisterComponent] -public sealed partial class SpamEmitSoundRequirePowerComponent : Component -{ -} +public sealed partial class SpamEmitSoundRequirePowerComponent : Component; diff --git a/Content.Shared/Sound/SharedEmitSoundSystem.cs b/Content.Shared/Sound/SharedEmitSoundSystem.cs index 67aabbb74d..58d541e363 100644 --- a/Content.Shared/Sound/SharedEmitSoundSystem.cs +++ b/Content.Shared/Sound/SharedEmitSoundSystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Whitelist; using JetBrains.Annotations; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; +using Robust.Shared.GameStates; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Network; @@ -54,6 +55,47 @@ public abstract class SharedEmitSoundSystem : EntitySystem SubscribeLocalEvent(OnEmitSoundOnCollide); SubscribeLocalEvent(OnMobState); + + // We need to handle state manually here + // BaseEmitSoundComponent isn't registered so we have to subscribe to each one + // TODO: Make it use autonetworking instead of relying on inheritance + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + SubscribeEmitComponent(); + + // Helper method so it's a little less ugly + void SubscribeEmitComponent() where T : BaseEmitSoundComponent + { + SubscribeLocalEvent(GetBaseEmitState); + SubscribeLocalEvent(HandleBaseEmitState); + } + } + + private static void GetBaseEmitState(Entity ent, ref ComponentGetState args) where T : BaseEmitSoundComponent + { + args.State = new EmitSoundComponentState(ent.Comp.Sound); + } + + private static void HandleBaseEmitState(Entity ent, ref ComponentHandleState args) where T : BaseEmitSoundComponent + { + if (args.Current is not EmitSoundComponentState state) + return; + + ent.Comp.Sound = state.Sound switch + { + SoundPathSpecifier pathSpec => new SoundPathSpecifier(pathSpec.Path, pathSpec.Params), + SoundCollectionSpecifier collectionSpec => collectionSpec.Collection != null + ? new SoundCollectionSpecifier(collectionSpec.Collection, collectionSpec.Params) + : null, + _ => null, + }; } private void HandleEmitSoundOnUIOpen(EntityUid uid, EmitSoundOnUIOpenComponent component, AfterActivatableUIOpenEvent args) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index f523a6c8a0..9297ea043d 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -22,6 +22,7 @@ using Content.Shared.Placeable; using Content.Shared.Popups; using Content.Shared.Stacks; using Content.Shared.Storage.Components; +using Content.Shared.Tag; using Content.Shared.Timing; using Content.Shared.Storage.Events; using Content.Shared.Verbs; @@ -66,6 +67,7 @@ public abstract class SharedStorageSystem : EntitySystem [Dependency] private readonly SharedStackSystem _stack = default!; [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; [Dependency] protected readonly SharedUserInterfaceSystem UI = default!; + [Dependency] private readonly TagSystem _tag = default!; [Dependency] protected readonly UseDelaySystem UseDelay = default!; private EntityQuery _itemQuery; @@ -276,7 +278,8 @@ public abstract class SharedStorageSystem : EntitySystem if (!UI.IsUiOpen(uid, args.UiKey)) { UpdateAppearance((uid, storageComp, null)); - Audio.PlayPredicted(storageComp.StorageCloseSound, uid, args.Actor); + if (!_tag.HasTag(args.Actor, storageComp.SilentStorageUserTag)) + Audio.PlayPredicted(storageComp.StorageCloseSound, uid, args.Actor); } } @@ -357,7 +360,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!UI.TryOpenUi(uid, StorageComponent.StorageUiKey.Key, entity)) return; - if (!silent) + if (!silent && !_tag.HasTag(entity, storageComp.SilentStorageUserTag)) { Audio.PlayPredicted(storageComp.StorageOpenSound, uid, entity); @@ -602,7 +605,8 @@ public abstract class SharedStorageSystem : EntitySystem // If we picked up at least one thing, play a sound and do a cool animation! if (successfullyInserted.Count > 0) { - Audio.PlayPredicted(component.StorageInsertSound, uid, args.User, _audioParams); + if (!_tag.HasTag(args.User, component.SilentStorageUserTag)) + Audio.PlayPredicted(component.StorageInsertSound, uid, args.User, _audioParams); EntityManager.RaiseSharedEvent(new AnimateInsertingEntitiesEvent( GetNetEntity(uid), GetNetEntityList(successfullyInserted), @@ -645,7 +649,8 @@ public abstract class SharedStorageSystem : EntitySystem $"{ToPrettyString(player):player} is attempting to take {ToPrettyString(item):item} out of {ToPrettyString(storage):storage}"); if (_sharedHandsSystem.TryPickupAnyHand(player, item, handsComp: player.Comp) - && storage.Comp.StorageRemoveSound != null) + && storage.Comp.StorageRemoveSound != null + && !_tag.HasTag(player, storage.Comp.SilentStorageUserTag)) { Audio.PlayPredicted(storage.Comp.StorageRemoveSound, storage, player, _audioParams); } @@ -903,8 +908,10 @@ public abstract class SharedStorageSystem : EntitySystem { Insert(target, entity, out _, user: user, targetComp, playSound: false); } - - Audio.PlayPredicted(sourceComp.StorageInsertSound, target, user, _audioParams); + if (user != null + && (!_tag.HasTag(user.Value, sourceComp.SilentStorageUserTag) + || !_tag.HasTag(user.Value, targetComp.SilentStorageUserTag))) + Audio.PlayPredicted(sourceComp.StorageInsertSound, target, user, _audioParams); } /// @@ -1077,12 +1084,17 @@ public abstract class SharedStorageSystem : EntitySystem * For now we just treat items as always being the same size regardless of stack count. */ + // Check if the sound is expected to play. + // If there is an user, the sound will not play if they have the SilentStorageUserTag + // If there is no user, only playSound is checked. + var canPlaySound = playSound && (user == null || !_tag.HasTag(user.Value, storageComp.SilentStorageUserTag)); + if (!stackAutomatically || !_stackQuery.TryGetComponent(insertEnt, out var insertStack)) { if (!ContainerSystem.Insert(insertEnt, storageComp.Container)) return false; - if (playSound) + if (canPlaySound) Audio.PlayPredicted(storageComp.StorageInsertSound, uid, user, _audioParams); return true; @@ -1112,7 +1124,7 @@ public abstract class SharedStorageSystem : EntitySystem return false; } - if (playSound) + if (canPlaySound) Audio.PlayPredicted(storageComp.StorageInsertSound, uid, user, _audioParams); return true; diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index f772ad2022..17d3fce62d 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Item; using Content.Shared.Storage.EntitySystems; +using Content.Shared.Tag; using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.Containers; @@ -141,6 +142,12 @@ namespace Content.Shared.Storage [DataField] public bool HideStackVisualsWhenClosed = true; + /// + /// Entities with this tag won't trigger storage sound. + /// + [DataField] + public ProtoId SilentStorageUserTag = "SilentStorageUser"; + [Serializable, NetSerializable] public enum StorageUiKey : byte { diff --git a/Content.Shared/Teleportation/Components/HandTeleporterComponent.cs b/Content.Shared/Teleportation/Components/HandTeleporterComponent.cs index 6ea29d3fd6..ea1aa492f3 100644 --- a/Content.Shared/Teleportation/Components/HandTeleporterComponent.cs +++ b/Content.Shared/Teleportation/Components/HandTeleporterComponent.cs @@ -21,11 +21,17 @@ public sealed partial class HandTeleporterComponent : Component public EntityUid? SecondPortal = null; /// - /// Portals can't be placed on different grids? + /// Should the portals be able to be placed across grids? /// [DataField] public bool AllowPortalsOnDifferentGrids; + /// + /// Should the portals work across maps? + /// + [DataField] + public bool AllowPortalsOnDifferentMaps; + [DataField("firstPortalPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string FirstPortalPrototype = "PortalRed"; diff --git a/Content.Server/Temperature/Components/EntityHeaterComponent.cs b/Content.Shared/Temperature/Components/EntityHeaterComponent.cs similarity index 73% rename from Content.Server/Temperature/Components/EntityHeaterComponent.cs rename to Content.Shared/Temperature/Components/EntityHeaterComponent.cs index 0b5acb421a..6cf97a0534 100644 --- a/Content.Server/Temperature/Components/EntityHeaterComponent.cs +++ b/Content.Shared/Temperature/Components/EntityHeaterComponent.cs @@ -1,26 +1,27 @@ -using Content.Server.Temperature.Systems; -using Content.Shared.Temperature; +using Content.Shared.Temperature.Systems; using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.Temperature.Components; +namespace Content.Shared.Temperature.Components; /// /// Adds thermal energy to entities with placed on it. /// -[RegisterComponent, Access(typeof(EntityHeaterSystem))] +[RegisterComponent, Access(typeof(SharedEntityHeaterSystem))] +[NetworkedComponent, AutoGenerateComponentState] public sealed partial class EntityHeaterComponent : Component { /// /// Power used when heating at the high setting. /// Low and medium are 33% and 66% respectively. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public float Power = 2400f; /// /// Current setting of the heater. If it is off or unpowered it won't heat anything. /// - [DataField] + [DataField, AutoNetworkedField] public EntityHeaterSetting Setting = EntityHeaterSetting.Off; /// diff --git a/Content.Shared/Temperature/Systems/SharedEntityHeaterSystem.cs b/Content.Shared/Temperature/Systems/SharedEntityHeaterSystem.cs new file mode 100644 index 0000000000..887047bfa1 --- /dev/null +++ b/Content.Shared/Temperature/Systems/SharedEntityHeaterSystem.cs @@ -0,0 +1,97 @@ +using Content.Shared.Examine; +using Content.Shared.Popups; +using Content.Shared.Power; +using Content.Shared.Power.EntitySystems; +using Content.Shared.Temperature.Components; +using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Temperature.Systems; + +/// +/// Handles events. +/// +public abstract partial class SharedEntityHeaterSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedPowerReceiverSystem _receiver = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + private readonly int _settingCount = Enum.GetValues().Length; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent>(OnGetVerbs); + SubscribeLocalEvent(OnPowerChanged); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + args.PushMarkup(Loc.GetString("entity-heater-examined", ("setting", ent.Comp.Setting))); + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + var nextSettingIndex = ((int)ent.Comp.Setting + 1) % _settingCount; + var nextSetting = (EntityHeaterSetting)nextSettingIndex; + + var user = args.User; + args.Verbs.Add(new AlternativeVerb() + { + Text = Loc.GetString("entity-heater-switch-setting", ("setting", nextSetting)), + Act = () => + { + ChangeSetting(ent, nextSetting, user); + } + }); + } + + private void OnPowerChanged(Entity ent, ref PowerChangedEvent args) + { + // disable heating element glowing layer if theres no power + // doesn't actually change the setting since that would be annoying + var setting = args.Powered ? ent.Comp.Setting : EntityHeaterSetting.Off; + _appearance.SetData(ent, EntityHeaterVisuals.Setting, setting); + } + + protected virtual void ChangeSetting(Entity ent, EntityHeaterSetting setting, EntityUid? user = null) + { + // Still allow changing the setting without power + ent.Comp.Setting = setting; + _audio.PlayPredicted(ent.Comp.SettingSound, ent, user); + _popup.PopupClient(Loc.GetString("entity-heater-switched-setting", ("setting", setting)), ent, user); + Dirty(ent); + + // Only show the glowing heating element layer if there's power + if (_receiver.IsPowered(ent.Owner)) + _appearance.SetData(ent, EntityHeaterVisuals.Setting, setting); + } + + protected float SettingPower(EntityHeaterSetting setting, float max) + { + // Power use while off needs to be non-zero so powernet doesn't consider the device powered + // by an unpowered network while in the off state. Otherwise, when we increase the load, + // the clientside APC receiver will think the device is powered until it gets the next + // update from the server, which will cause the heating element to glow for a moment. + // I spent several hours trying to figure out a better way to do this using PowerDisabled + // or something, but nothing worked as well as this. + // Just think of the load as a little LED, or bad wiring, or something. + return setting switch + { + EntityHeaterSetting.Low => max / 3f, + EntityHeaterSetting.Medium => max * 2f / 3f, + EntityHeaterSetting.High => max, + _ => 0.01f, + }; + } +} diff --git a/Content.Shared/Turrets/DeployableTurretComponent.cs b/Content.Shared/Turrets/DeployableTurretComponent.cs new file mode 100644 index 0000000000..a23b4ec86c --- /dev/null +++ b/Content.Shared/Turrets/DeployableTurretComponent.cs @@ -0,0 +1,161 @@ +using Content.Shared.Damage.Prototypes; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Turrets; + +/// +/// Attached to turrets that can be toggled between an inactive and active state +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(fieldDeltas: true), AutoGenerateComponentPause] +[Access(typeof(SharedDeployableTurretSystem))] +public sealed partial class DeployableTurretComponent : Component +{ + /// + /// Whether the turret is toggled 'on' or 'off' + /// + [DataField, AutoNetworkedField] + public bool Enabled = false; + + /// + /// The current state of the turret. Used to inform the device network. + /// + [DataField, AutoNetworkedField] + public DeployableTurretState CurrentState = DeployableTurretState.Retracted; + + /// + /// The visual state of the turret. Used on the client-side. + /// + [DataField] + public DeployableTurretState VisualState = DeployableTurretState.Retracted; + + /// + /// The physics fixture that will have its collisions disabled when the turret is retracted. + /// + [DataField] + public string? DeployedFixture = "turret"; + + /// + /// When retracted, the following damage modifier set will be applied to the turret. + /// + [DataField] + public ProtoId? RetractedDamageModifierSetId; + + /// + /// When deployed, the following damage modifier set will be applied to the turret. + /// + [DataField] + public ProtoId? DeployedDamageModifierSetId; + + #region: Sound data + + /// + /// Sound to play when denied access to the turret. + /// + [DataField] + public SoundSpecifier AccessDeniedSound = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg"); + + /// + /// Sound to play when the turret deploys. + /// + [DataField] + public SoundSpecifier DeploymentSound = new SoundPathSpecifier("/Audio/Machines/blastdoor.ogg"); + + /// + /// Sound to play when the turret retracts. + /// + [DataField] + public SoundSpecifier RetractionSound = new SoundPathSpecifier("/Audio/Machines/blastdoor.ogg"); + + #endregion + + #region: Animation data + + /// + /// The length of the deployment animation (in seconds) + /// + [DataField] + public float DeploymentLength = 1.19f; + + /// + /// The length of the retraction animation (in seconds) + /// + [DataField] + public float RetractionLength = 1.19f; + + /// + /// The time that the current animation should complete (in seconds) + /// + [DataField, AutoPausedField] + public TimeSpan AnimationCompletionTime = TimeSpan.Zero; + + /// + /// The animation used when turret activates + /// + [ViewVariables(VVAccess.ReadWrite)] + public object DeploymentAnimation = default!; + + /// + /// The animation used when turret deactivates + /// + [ViewVariables(VVAccess.ReadWrite)] + public object RetractionAnimation = default!; + + /// + /// The key used to index the animation played when turning the turret on/off. + /// + [ViewVariables(VVAccess.ReadOnly)] + public const string AnimationKey = "deployable_turret_animation"; + + #endregion + + #region: Visual state data + + /// + /// The visual state to use when the turret is deployed. + /// + [DataField] + public string DeployedState = "cover_open"; + + /// + /// The visual state to use when the turret is not deployed. + /// + [DataField] + public string RetractedState = "cover_closed"; + + /// + /// Used to build the deployment animation when the component is initialized. + /// + [DataField] + public string DeployingState = "cover_opening"; + + /// + /// Used to build the retraction animation when the component is initialized. + /// + [DataField] + public string RetractingState = "cover_closing"; + + #endregion +} + +[Serializable, NetSerializable] +public enum DeployableTurretVisuals : byte +{ + Turret, + Weapon, + Broken, +} + +[Serializable, NetSerializable] +public enum DeployableTurretState : byte +{ + Retracted = 0, + Deployed = (1 << 0), + Retracting = (1 << 1), + Deploying = (1 << 1) | Deployed, + Firing = (1 << 2) | Deployed, + Disabled = (1 << 3), + Broken = (1 << 4), +} diff --git a/Content.Shared/Turrets/SharedDeployableTurretSystem.cs b/Content.Shared/Turrets/SharedDeployableTurretSystem.cs new file mode 100644 index 0000000000..8209a49efd --- /dev/null +++ b/Content.Shared/Turrets/SharedDeployableTurretSystem.cs @@ -0,0 +1,167 @@ +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; +using Content.Shared.Damage; +using Content.Shared.Database; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.Timing; +using Content.Shared.Verbs; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Wires; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; +using Robust.Shared.Utility; + +namespace Content.Shared.Turrets; + +public abstract partial class SharedDeployableTurretSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly UseDelaySystem _useDelay = default!; + [Dependency] private readonly AccessReaderSystem _accessReader = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedWiresSystem _wires = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnActivate); + SubscribeLocalEvent(OnAttemptChangeWirePanelWire); + SubscribeLocalEvent>(OnGetVerb); + } + + private void OnGetVerb(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract) + return; + + if (!_accessReader.IsAllowed(args.User, ent)) + return; + + var user = args.User; + + var verb = new Verb + { + Priority = 1, + Text = ent.Comp.Enabled ? Loc.GetString("deployable-turret-component-deactivate") : Loc.GetString("deployable-turret-component-activate"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), + Disabled = !HasAmmo(ent), + Impact = LogImpact.Low, + Act = () => { TryToggleState(ent, user); } + }; + + args.Verbs.Add(verb); + } + + private void OnActivate(Entity ent, ref ActivateInWorldEvent args) + { + if (TryComp(ent, out UseDelayComponent? useDelay) && !_useDelay.TryResetDelay((ent, useDelay), true)) + return; + + if (!_accessReader.IsAllowed(args.User, ent)) + { + _popup.PopupClient(Loc.GetString("deployable-turret-component-access-denied"), ent, args.User); + _audio.PlayPredicted(ent.Comp.AccessDeniedSound, ent, args.User); + + return; + } + + TryToggleState(ent, args.User); + } + + private void OnAttemptChangeWirePanelWire(Entity ent, ref AttemptChangePanelEvent args) + { + if (!ent.Comp.Enabled || args.Cancelled) + return; + + _popup.PopupClient(Loc.GetString("deployable-turret-component-cannot-access-wires"), ent, args.User); + + args.Cancelled = true; + } + + public bool TryToggleState(Entity ent, EntityUid? user = null) + { + return TrySetState(ent, !ent.Comp.Enabled, user); + } + + public bool TrySetState(Entity ent, bool enabled, EntityUid? user = null) + { + if (enabled && ent.Comp.CurrentState == DeployableTurretState.Broken) + { + if (user != null) + _popup.PopupClient(Loc.GetString("deployable-turret-component-is-broken"), ent, user.Value); + + return false; + } + + if (enabled && !HasAmmo(ent)) + { + if (user != null) + _popup.PopupClient(Loc.GetString("deployable-turret-component-no-ammo"), ent, user.Value); + + return false; + } + + SetState(ent, enabled, user); + + return true; + } + + protected virtual void SetState(Entity ent, bool enabled, EntityUid? user = null) + { + if (ent.Comp.Enabled == enabled) + return; + + // Hide the wires panel UI on activation + if (enabled && TryComp(ent, out var wires) && wires.Open) + { + _wires.TogglePanel(ent, wires, false); + _audio.PlayPredicted(wires.ScrewdriverCloseSound, ent, user); + } + + // Determine how much time is remaining in the current animation and the one next in queue + // We track this so that when a turret is toggled on/off, we can wait for all queued animations + // to end before the turret's HTN is reactivated + var animTimeRemaining = MathF.Max((float)(ent.Comp.AnimationCompletionTime - _timing.CurTime).TotalSeconds, 0f); + var animTimeNext = enabled ? ent.Comp.DeploymentLength : ent.Comp.RetractionLength; + + ent.Comp.AnimationCompletionTime = _timing.CurTime + TimeSpan.FromSeconds(animTimeNext + animTimeRemaining); + + // Change the turret's damage modifiers + if (TryComp(ent, out var damageable)) + { + var damageSetID = enabled ? ent.Comp.DeployedDamageModifierSetId : ent.Comp.RetractedDamageModifierSetId; + _damageable.SetDamageModifierSetId(ent, damageSetID, damageable); + } + + // Change the turret's fixtures + if (ent.Comp.DeployedFixture != null && + TryComp(ent, out FixturesComponent? fixtures) && + fixtures.Fixtures.TryGetValue(ent.Comp.DeployedFixture, out var fixture)) + { + _physics.SetHard(ent, fixture, enabled); + } + + // Play pop up message + var msg = enabled ? "deployable-turret-component-activating" : "deployable-turret-component-deactivating"; + _popup.PopupClient(Loc.GetString(msg), ent, user); + + // Update enabled state + ent.Comp.Enabled = enabled; + DirtyField(ent, ent.Comp, "Enabled"); + } + + public bool HasAmmo(Entity ent) + { + var ammoCountEv = new GetAmmoCountEvent(); + RaiseLocalEvent(ent, ref ammoCountEv); + + return ammoCountEv.Count > 0; + } +} diff --git a/Content.Shared/Verbs/Verb.cs b/Content.Shared/Verbs/Verb.cs index 5faca9bb06..207c739466 100644 --- a/Content.Shared/Verbs/Verb.cs +++ b/Content.Shared/Verbs/Verb.cs @@ -281,12 +281,11 @@ namespace Content.Shared.Verbs } /// - /// This is for verbs facilitated by components on the user. + /// This is for verbs facilitated by components on the user or their clothing. /// Verbs from clothing, species, etc. rather than a held item. /// /// - /// Add a component to the user's entity and sub to the get verbs event - /// and it'll appear in the verbs menu on any target. + /// This will get relayed to all clothing (Not pockets) through an inventory relay event. /// [Serializable, NetSerializable] public sealed class InnateVerb : Verb diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 212c03475c..84e88156ad 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -10,7 +10,7 @@ namespace Content.Shared.Weapons.Melee; /// /// When given to a mob lets them do unarmed attacks, or when given to an item lets someone wield it to do attacks. /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(fieldDeltas: true), AutoGenerateComponentPause] public sealed partial class MeleeWeaponComponent : Component { // TODO: This is becoming bloated as shit. @@ -18,28 +18,26 @@ public sealed partial class MeleeWeaponComponent : Component /// /// Does this entity do a disarm on alt attack. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool AltDisarm = true; /// /// Should the melee weapon's damage stats be examinable. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField] + [DataField, AutoNetworkedField] public bool Hidden; /// /// Next time this component is allowed to light attack. Heavy attacks are wound up and never have a cooldown. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [ViewVariables(VVAccess.ReadWrite)] [AutoPausedField] public TimeSpan NextAttack; /// /// Starts attack cooldown when equipped if true. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public bool ResetOnHandSelected = true; /* @@ -51,72 +49,70 @@ public sealed partial class MeleeWeaponComponent : Component /// /// How many times we can attack per second. /// - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public float AttackRate = 1f; /// /// Are we currently holding down the mouse for an attack. /// Used so we can't just hold the mouse button and attack constantly. /// - [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [AutoNetworkedField] public bool Attacking = false; /// /// If true, attacks will be repeated automatically without requiring the mouse button to be lifted. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool AutoAttack; /// /// If true, attacks will bypass armor resistances. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool ResistanceBypass = false; - + /// /// Base damage for this weapon. Can be modified via heavy damage or other means. /// - [DataField(required: true)] - [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField(required: true), AutoNetworkedField] public DamageSpecifier Damage = default!; - [DataField] - [ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] public FixedPoint2 BluntStaminaDamageFactor = FixedPoint2.New(0.5f); /// /// Multiplies damage by this amount for single-target attacks. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public FixedPoint2 ClickDamageModifier = FixedPoint2.New(1); // TODO: Temporarily 1.5 until interactionoutline is adjusted to use melee, then probably drop to 1.2 /// /// Nearest edge range to hit an entity. /// - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public float Range = 1.5f; /// /// Total width of the angle for wide attacks. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public Angle Angle = Angle.FromDegrees(60); - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntProtoId Animation = "WeaponArcPunch"; - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntProtoId WideAnimation = "WeaponArcSlash"; /// /// Rotation of the animation. /// 0 degrees means the top faces the attacker. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public Angle WideAnimationRotation = Angle.Zero; - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public bool SwingLeft; diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 43be9a5b14..947c969a3e 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -104,7 +104,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (gun.NextFire > component.NextAttack) { component.NextAttack = gun.NextFire; - Dirty(uid, component); + DirtyField(uid, component, nameof(MeleeWeaponComponent.NextAttack)); } } @@ -128,7 +128,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem return; component.NextAttack = minimum; - Dirty(uid, component); + DirtyField(uid, component, nameof(MeleeWeaponComponent.NextAttack)); } private void OnGetBonusMeleeDamage(EntityUid uid, BonusMeleeDamageComponent component, ref GetMeleeDamageEvent args) @@ -168,7 +168,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem return; weapon.Attacking = false; - Dirty(weaponUid, weapon); + DirtyField(weaponUid, weapon, nameof(MeleeWeaponComponent.Attacking)); } private void OnLightAttack(LightAttackEvent msg, EntitySessionEventArgs args) @@ -392,7 +392,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem swings++; } - Dirty(weaponUid, weapon); + DirtyField(weaponUid, weapon, nameof(MeleeWeaponComponent.NextAttack)); // Do this AFTER attack so it doesn't spam every tick var ev = new AttemptMeleeEvent(); @@ -442,6 +442,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem RaiseLocalEvent(user, ref attackEv); weapon.Attacking = true; + DirtyField(weaponUid, weapon, nameof(MeleeWeaponComponent.Attacking)); return true; } @@ -838,15 +839,21 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem //Setting deactivated damage to the weapon's regular value before changing it. itemToggleMelee.DeactivatedDamage ??= meleeWeapon.Damage; meleeWeapon.Damage = itemToggleMelee.ActivatedDamage; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.Damage)); } - meleeWeapon.HitSound = itemToggleMelee.ActivatedSoundOnHit; + if (meleeWeapon.HitSound?.Equals(itemToggleMelee.ActivatedSoundOnHit) != true) + { + meleeWeapon.HitSound = itemToggleMelee.ActivatedSoundOnHit; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.HitSound)); + } if (itemToggleMelee.ActivatedSoundOnHitNoDamage != null) { //Setting the deactivated sound on no damage hit to the weapon's regular value before changing it. itemToggleMelee.DeactivatedSoundOnHitNoDamage ??= meleeWeapon.NoDamageSound; meleeWeapon.NoDamageSound = itemToggleMelee.ActivatedSoundOnHitNoDamage; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.NoDamageSound)); } if (itemToggleMelee.ActivatedSoundOnSwing != null) @@ -854,28 +861,41 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem //Setting the deactivated sound on no damage hit to the weapon's regular value before changing it. itemToggleMelee.DeactivatedSoundOnSwing ??= meleeWeapon.SwingSound; meleeWeapon.SwingSound = itemToggleMelee.ActivatedSoundOnSwing; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.SwingSound)); } if (itemToggleMelee.DeactivatedSecret) + { meleeWeapon.Hidden = false; + } } else { if (itemToggleMelee.DeactivatedDamage != null) + { meleeWeapon.Damage = itemToggleMelee.DeactivatedDamage; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.Damage)); + } meleeWeapon.HitSound = itemToggleMelee.DeactivatedSoundOnHit; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.HitSound)); if (itemToggleMelee.DeactivatedSoundOnHitNoDamage != null) + { meleeWeapon.NoDamageSound = itemToggleMelee.DeactivatedSoundOnHitNoDamage; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.NoDamageSound)); + } if (itemToggleMelee.DeactivatedSoundOnSwing != null) + { meleeWeapon.SwingSound = itemToggleMelee.DeactivatedSoundOnSwing; + DirtyField(uid, meleeWeapon, nameof(MeleeWeaponComponent.SwingSound)); + } if (itemToggleMelee.DeactivatedSecret) + { meleeWeapon.Hidden = true; + } } - - Dirty(uid, meleeWeapon); } } diff --git a/Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs b/Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs index b0ca1f215c..77b9f53b7b 100644 --- a/Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs @@ -43,3 +43,9 @@ public sealed partial class BatteryWeaponFireMode [DataField] public float FireCost = 100; } + +[Serializable, NetSerializable] +public enum BatteryWeaponFireModeVisuals : byte +{ + State +} diff --git a/Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs b/Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs index bae5b95a19..0c90ae1637 100644 --- a/Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs @@ -1,7 +1,8 @@ -using System.Linq; +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; using Content.Shared.Database; using Content.Shared.Examine; -using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; using Content.Shared.Popups; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Components; @@ -14,12 +15,14 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInteractHandEvent); + SubscribeLocalEvent(OnUseInHandEvent); SubscribeLocalEvent>(OnGetVerb); SubscribeLocalEvent(OnExamined); } @@ -44,12 +47,15 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem private void OnGetVerb(EntityUid uid, BatteryWeaponFireModesComponent component, GetVerbsEvent args) { - if (!args.CanAccess || !args.CanInteract || args.Hands == null) + if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract) return; if (component.FireModes.Count < 2) return; + if (!_accessReaderSystem.IsAllowed(args.User, uid)) + return; + for (var i = 0; i < component.FireModes.Count; i++) { var fireMode = component.FireModes[i]; @@ -62,11 +68,11 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem Category = VerbCategory.SelectType, Text = entProto.Name, Disabled = i == component.CurrentFireMode, - Impact = LogImpact.Low, + Impact = LogImpact.Medium, DoContactInteraction = true, Act = () => { - SetFireMode(uid, component, index, args.User); + TrySetFireMode(uid, component, index, args.User); } }; @@ -74,24 +80,31 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem } } - private void OnInteractHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, ActivateInWorldEvent args) + private void OnUseInHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, UseInHandEvent args) { - if (!args.Complex) - return; - - if (component.FireModes.Count < 2) - return; - - CycleFireMode(uid, component, args.User); + TryCycleFireMode(uid, component, args.User); } - private void CycleFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, EntityUid user) + public void TryCycleFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, EntityUid? user = null) { if (component.FireModes.Count < 2) return; var index = (component.CurrentFireMode + 1) % component.FireModes.Count; + TrySetFireMode(uid, component, index, user); + } + + public bool TrySetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, int index, EntityUid? user = null) + { + if (index < 0 || index >= component.FireModes.Count) + return false; + + if (user != null && !_accessReaderSystem.IsAllowed(user.Value, uid)) + return false; + SetFireMode(uid, component, index, user); + + return true; } private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, int index, EntityUid? user = null) @@ -100,26 +113,30 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem component.CurrentFireMode = index; Dirty(uid, component); + if (_prototypeManager.TryIndex(fireMode.Prototype, out var prototype)) + { + if (TryComp(uid, out var appearance)) + _appearanceSystem.SetData(uid, BatteryWeaponFireModeVisuals.State, prototype.ID, appearance); + + if (user != null) + _popupSystem.PopupClient(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value); + } + if (TryComp(uid, out ProjectileBatteryAmmoProviderComponent? projectileBatteryAmmoProviderComponent)) { - if (!_prototypeManager.TryIndex(fireMode.Prototype, out var prototype)) - return; - // TODO: Have this get the info directly from the batteryComponent when power is moved to shared. var OldFireCost = projectileBatteryAmmoProviderComponent.FireCost; projectileBatteryAmmoProviderComponent.Prototype = fireMode.Prototype; projectileBatteryAmmoProviderComponent.FireCost = fireMode.FireCost; + float FireCostDiff = (float)fireMode.FireCost / (float)OldFireCost; - projectileBatteryAmmoProviderComponent.Shots = (int)Math.Round(projectileBatteryAmmoProviderComponent.Shots/FireCostDiff); - projectileBatteryAmmoProviderComponent.Capacity = (int)Math.Round(projectileBatteryAmmoProviderComponent.Capacity/FireCostDiff); + projectileBatteryAmmoProviderComponent.Shots = (int)Math.Round(projectileBatteryAmmoProviderComponent.Shots / FireCostDiff); + projectileBatteryAmmoProviderComponent.Capacity = (int)Math.Round(projectileBatteryAmmoProviderComponent.Capacity / FireCostDiff); + Dirty(uid, projectileBatteryAmmoProviderComponent); + var updateClientAmmoEvent = new UpdateClientAmmoEvent(); RaiseLocalEvent(uid, ref updateClientAmmoEvent); - - if (user != null) - { - _popupSystem.PopupClient(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value); - } } } } diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 4a004a1c42..85fd757c0f 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -961,5 +961,20 @@ Entries: id: 116 time: '2025-03-25T20:15:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35622 +- author: slarticodefast + changes: + - message: Added an antag control verb to create a paradox clone ghost role of a + selected player. + type: Add + id: 117 + time: '2025-03-27T17:04:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36105 +- author: lzk228, ScarKy0 + changes: + - message: Aghost now silently interact with storages. + type: Tweak + id: 118 + time: '2025-03-27T17:42:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35417 Name: Admin Order: 1 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3af07d8de9..3e4a0be541 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,86 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Added 10 seconds delay to Succumb action - type: Add - id: 7612 - time: '2024-11-15T21:21:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32985 -- author: Beck Thompson - changes: - - message: Minor tweaks to clumsiness. Some of the timings and or noises have been - changed slightly! - type: Tweak - id: 7613 - time: '2024-11-15T23:46:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/31147 -- author: SaphireLattice - changes: - - message: Crayon UI now has categories and queue - type: Add - id: 7614 - time: '2024-11-16T03:25:06.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33101 -- author: Southbridge - changes: - - message: The BRB sign is now included in the Bureaucracy Crate - type: Add - id: 7615 - time: '2024-11-16T03:26:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33341 -- author: SaphireLattice - changes: - - message: Utensils can finally go into disposals - type: Fix - id: 7616 - time: '2024-11-16T03:39:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33326 -- author: K-Dynamic - changes: - - message: Solar assembly crate now comes with 10 flatpacks and 20 glass to make - expansion and repairs easier, as well as increasing in price from 525 to 1250 - spesos. - type: Tweak - id: 7617 - time: '2024-11-16T04:30:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33019 -- author: Aquif - changes: - - message: There is now a button to view your admin remarks in the character editor, - right next to the stats button. - type: Tweak - id: 7618 - time: '2024-11-16T05:09:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/31761 -- author: SpaceRox1244 - changes: - - message: Closets and lockers now have visuals for being labeled with papers. - type: Add - id: 7619 - time: '2024-11-17T03:27:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33318 -- author: Ubaser - changes: - - message: You can now craft dim light bulbs at an autolathe. - type: Add - id: 7620 - time: '2024-11-18T06:32:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33383 -- author: Ilya246 - changes: - - message: Multiple people using one shuttle console will no longer cause the shuttle - to slow down. - type: Fix - id: 7621 - time: '2024-11-19T02:59:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32381 -- author: ScarKy0 - changes: - - message: Secret doors no longer tell you if they're welded shut on examine. - type: Tweak - id: 7622 - time: '2024-11-19T05:07:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33365 - author: ArZarLordOfMango changes: - message: Most toggleable clothing must now be equipped to toggle their actions. @@ -3874,3 +3792,111 @@ id: 8111 time: '2025-03-27T06:26:13.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/36003 +- author: SlamBamActionman + changes: + - message: Liltenhead! Thank you for over 2 years of update videos, and congrats + on the 100th video! + type: Add + id: 8112 + time: '2025-03-27T17:19:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36104 +- author: metalgearsloth + changes: + - message: Rewrote how mob movement works to make movement more flexible in code. + While this should largely function the same (apart from conveyors now being + able to launch items) please report any bugs found. + type: Tweak + id: 8113 + time: '2025-03-27T22:29:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35931 +- author: ViceEmargo + changes: + - message: Botanist's leather gloves must now be equipped in order to pick up Death + Nettles. + type: Add + - message: Death Nettles will now pierce hardsuits, injecting 5 units of reagent. + type: Tweak + - message: Death Nettles will now "wilt" after 5 hits. + type: Add + - message: Fly Amanita has been changed to contain less Amatoxin. + type: Tweak + id: 8114 + time: '2025-03-29T09:35:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25253 +- author: chromiumboy + changes: + - message: Sentry turrets can potentially be found guarding sensitive areas of the + station. When deployed, they will shoot unauthorized personnel on sight with + either stunning or lethal laser bolts. Note that only cyborgs and robots can + safely pass sentry turrets that protect the station AI core + type: Add + id: 8115 + time: '2025-03-29T17:55:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35123 +- author: Killerqu00 + changes: + - message: Uncuffing someone with combat mode on will shove them down. + type: Add + id: 8116 + time: '2025-03-29T20:09:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35193 +- author: metalgearsloth + changes: + - message: Jetpacks emit particles more frequently. + type: Tweak + id: 8117 + time: '2025-03-30T04:06:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36093 +- author: beck-thompson + changes: + - message: Stethoscopes now automatically start doafters and also can tell if a + patient is losing oxygen damage or gaining it. + type: Add + - message: Moths can no longer eat stethoscopes. + type: Fix + - message: Stethoscopes action button now works properly. + type: Fix + id: 8118 + time: '2025-03-31T02:27:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36210 +- author: Tayrtahn + changes: + - message: Items thrown when someone slips now tend to scatter in the direction + they are moving, and respect the item's mass. + type: Tweak + id: 8119 + time: '2025-03-31T22:00:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36232 +- author: ScarKy0 + changes: + - message: Thieves now start with the thieving satchel instead of their toolbox. + The satchel will get all the selected kits spawned inside of it. + type: Add + - message: Thief Chameleon kit now comes with a backpack and a bonus pair of chameleon + gloves. Be careful, they aren't thieving gloves and can be tough to tell apart! + type: Tweak + - message: Updated smuggler stachel's description to reflect what it's used for. + type: Tweak + - message: Thieving satchel and toolbox now correctly play a sound when their kits + are selected. + type: Fix + id: 8120 + time: '2025-03-31T22:32:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36201 +- author: Tayrtahn + changes: + - message: Electric grills no longer appear powered when cycled while disconnected + from power. + type: Fix + - message: Interactions with electric grills are now predicted. + type: Tweak + id: 8121 + time: '2025-04-01T16:43:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/36241 +- author: MisterImp + changes: + - message: A new recipe has been added for pizza made with world peas, world peazza. + type: Add + id: 8122 + time: '2025-04-01T23:26:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35191 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index a6d5b82974..8d8296eeec 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alithsko, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, ApolloVector, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, Awlod, AzzyIsNotHere, baa14453, BackeTako, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, bellwetherlogic, ben, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainMaru, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, Catofquestionableethics, CatTheSystem, centcomofficer24, Centronias, Chaboricks, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, civilCornball, claustro305, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, dinnercalzone, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Helm4142, Henry, HerCoyote23, HighTechPuddle, hitomishirichan, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, htmlsystem, hubismal, Hugal31, Huxellberger, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, Litraxx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, lmsnoise, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, Lusatia, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OnyxTheBrave, Orange-Winds, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, PROG-MohamedDwidar, prole0, Pronana, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, Quantum-cross, quatre, QueerNB, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, sowelipililimute, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, stellar-novas, stewie523, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, Vexerot, VigersRay, violet754, Visne, vlados1408, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0tito, 0x6273, 12rabbits, 1337dakota, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alithsko, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, ApolloVector, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, Awlod, AzzyIsNotHere, baa14453, BackeTako, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, beck-thompson, bellwetherlogic, ben, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainMaru, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, Catofquestionableethics, CatTheSystem, centcomofficer24, Centronias, Chaboricks, chairbender, Chaoticaa, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, civilCornball, claustro305, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, dinnercalzone, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Helm4142, Henry, HerCoyote23, HighTechPuddle, hitomishirichan, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, htmlsystem, hubismal, Hugal31, Huxellberger, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, KieueCaprie, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, Litraxx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, lmsnoise, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, Lusatia, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OnyxTheBrave, Orange-Winds, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, PROG-MohamedDwidar, prole0, Pronana, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, Quantum-cross, quatre, QueerNB, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, sowelipililimute, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, stellar-novas, stewie523, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, t, Tainakov, takemysoult, tap, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, Vexerot, viceemargo, VigersRay, violet754, Visne, vlados1408, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex diff --git a/Resources/Locale/en-US/administration/antag.ftl b/Resources/Locale/en-US/administration/antag.ftl index ef4ad98c7c..1433cc1dc4 100644 --- a/Resources/Locale/en-US/administration/antag.ftl +++ b/Resources/Locale/en-US/administration/antag.ftl @@ -6,6 +6,7 @@ admin-verb-make-nuclear-operative = Make target into a lone Nuclear Operative. admin-verb-make-pirate = Make the target into a pirate. Note this doesn't configure the game rule. admin-verb-make-head-rev = Make the target into a Head Revolutionary. admin-verb-make-thief = Make the target into a thief. +admin-verb-make-paradox-clone = Create a Paradox Clone ghost role of the target. admin-verb-text-make-traitor = Make Traitor admin-verb-text-make-initial-infected = Make Initial Infected @@ -14,5 +15,6 @@ admin-verb-text-make-nuclear-operative = Make Nuclear Operative admin-verb-text-make-pirate = Make Pirate admin-verb-text-make-head-rev = Make Head Rev admin-verb-text-make-thief = Make Thief +admin-verb-text-make-paradox-clone = Create Paradox Clone admin-overlay-antag-classic = ANTAG diff --git a/Resources/Locale/en-US/construction/steps/arbitrary-insert-construction-graph-step.ftl b/Resources/Locale/en-US/construction/steps/arbitrary-insert-construction-graph-step.ftl index 430888ed36..b2c86dd6a6 100644 --- a/Resources/Locale/en-US/construction/steps/arbitrary-insert-construction-graph-step.ftl +++ b/Resources/Locale/en-US/construction/steps/arbitrary-insert-construction-graph-step.ftl @@ -8,3 +8,5 @@ construction-insert-info-examine-name-instrument-string = string intrument construction-insert-info-examine-name-instrument-woodwind = woodwind instrument construction-insert-info-examine-name-knife = knife construction-insert-info-examine-name-utensil = utensil +construction-insert-info-examine-name-laser-cannon = high power laser weapon +construction-insert-info-examine-name-power-cell = power cell diff --git a/Resources/Locale/en-US/cuffs/components/cuffable-component.ftl b/Resources/Locale/en-US/cuffs/components/cuffable-component.ftl index a2cb6ed658..092f1d6620 100644 --- a/Resources/Locale/en-US/cuffs/components/cuffable-component.ftl +++ b/Resources/Locale/en-US/cuffs/components/cuffable-component.ftl @@ -8,6 +8,7 @@ cuffable-component-start-uncuffing-target-message = You start unrestraining {$ta cuffable-component-start-uncuffing-by-other-message = {$otherName} starts unrestraining you! cuffable-component-remove-cuffs-success-message = You successfully remove the restraints. +cuffable-component-remove-cuffs-push-success-message = You successfully remove the restraints and push {$otherName} down. cuffable-component-remove-cuffs-by-other-success-message = {$otherName} unrestrains your hands. cuffable-component-remove-cuffs-to-other-partial-success-message = You successfully remove the restraints. {$cuffedHandCount} of {$otherName}'s hands remain restrained. cuffable-component-remove-cuffs-by-other-partial-success-message = {$otherName} removes your restraints. {$cuffedHandCount} of your hands remain restrained. diff --git a/Resources/Locale/en-US/devices/device-network.ftl b/Resources/Locale/en-US/devices/device-network.ftl index dd473866dc..c19903c313 100644 --- a/Resources/Locale/en-US/devices/device-network.ftl +++ b/Resources/Locale/en-US/devices/device-network.ftl @@ -9,6 +9,8 @@ device-frequency-prototype-name-fax = Fax device-frequency-prototype-name-basic-device = Basic Devices device-frequency-prototype-name-cyborg-control = Cyborg Control device-frequency-prototype-name-robotics-console = Robotics Console +device-frequency-prototype-name-turret = Sentry Turret +device-frequency-prototype-name-turret-control = Sentry Turret Control ## camera frequencies device-frequency-prototype-name-surveillance-camera-test = Subnet Test @@ -32,6 +34,7 @@ device-address-prefix-heater = HTR- device-address-prefix-freezer = FZR- device-address-prefix-volume-pump = VPP- device-address-prefix-smes = SMS- +device-address-prefix-turret = TRT- # PDAs and terminals device-address-prefix-console = CLS- diff --git a/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl b/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl index 29f0fa27e2..be7b6196b2 100644 --- a/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl +++ b/Resources/Locale/en-US/entity-systems/pointing/pointing-system.ftl @@ -5,6 +5,6 @@ pointing-system-point-at-self = You point at yourself. pointing-system-point-at-other = You point at {THE($other)}. pointing-system-point-at-self-others = {CAPITALIZE(THE($otherName))} points at {REFLEXIVE($other)}. pointing-system-point-at-other-others = {CAPITALIZE(THE($otherName))} points at {THE($other)}. -pointing-system-point-at-you-other = {$otherName} points at you. +pointing-system-point-at-you-other = {CAPITALIZE(THE($otherName))} points at you. pointing-system-point-at-tile = You point at the {$tileName}. pointing-system-other-point-at-tile = {CAPITALIZE(THE($otherName))} points at the {$tileName}. diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-thief.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-thief.ftl index ab2b8f88d7..46eab5fee3 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-thief.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-thief.ftl @@ -10,7 +10,7 @@ thief-role-greeting-animal = Steal things that you like. thief-role-greeting-equipment = - You have a toolbox of thieves' + You have a satchel of thieves' tools and chameleon thieves' gloves. Choose your starting equipment, and do your work stealthily. diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 3e89f912a9..9472118a1f 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -3,28 +3,28 @@ ghost-role-component-default-rules = All normal rules apply unless an administra You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -ghost-role-information-nonantagonist-rules = You are a [color=green][bold]Non-antagonist[/bold][/color]. You should generally not seek to harm the station and its crew. +ghost-role-information-nonantagonist-rules = You are [color={role-type-crew-aligned-alternate-color}][bold]{role-type-crew-aligned-name}[/bold][/color]. You should generally not seek to harm the station and its crew. You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -ghost-role-information-freeagent-rules = You are a [color=yellow][bold]Free Agent[/bold][/color]. You are free to act as either an antagonist or a non-antagonist. +ghost-role-information-freeagent-rules = You are a [color={role-type-free-agent-color}][bold]{role-type-free-agent-name}[/bold][/color]. You are free to act as either an antagonist or a non-antagonist. You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -ghost-role-information-antagonist-rules = You are a [color=red][bold]Solo Antagonist[/bold][/color]. Your intentions are clear, and harmful to the station and its crew. +ghost-role-information-antagonist-rules = You are a [color={role-type-solo-antagonist-color}][bold]{role-type-solo-antagonist-name}[/bold][/color]. Your intentions are clear, and harmful to the station and its crew. You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -ghost-role-information-rules-team-antagonist = You are a [color=red][bold]Team Antagonist[/bold][/color]. Your intentions are clear, and harmful to the station and its crew. +ghost-role-information-rules-team-antagonist = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color]. Your intentions are clear, and harmful to the station and its crew. You must [bold]work with your team[/bold] or follow reasonable directions from your team leaders. You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -ghost-role-information-familiar-rules = You are a [color=#6495ed][bold]Familiar[/bold][/color]. Serve the interests of your master, whatever those may be. +ghost-role-information-familiar-rules = You are a [color={role-type-familiar-color}][bold]{role-type-familiar-name}[/bold][/color]. Serve the interests of your master, whatever those may be. You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. -ghost-role-information-silicon-rules = You are a [color=#6495ed][bold]Silicon[/bold][/color]. Obey your laws. You are a Free Agent if you are not currently bound by any laws. +ghost-role-information-silicon-rules = You are a [color={role-type-silicon-color}][bold]{role-type-silicon-name}[/bold][/color]. Obey your laws. You are a {role-type-free-agent-name} if you are not currently bound by any laws. You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. @@ -46,7 +46,7 @@ ghost-role-information-snoth-description = A little snoth who doesn't mind a bit ghost-role-information-giant-spider-name = Giant Spider ghost-role-information-giant-spider-description = This station's inhabitants look mighty tasty, and your sticky web is perfect to catch them! -ghost-role-information-giant-spider-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other giant spiders. +ghost-role-information-giant-spider-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with all other giant spiders. ghost-role-information-cognizine-description = Made conscious with the magic of cognizine. @@ -61,7 +61,7 @@ ghost-role-information-slimes-description = An ordinary slime with no special ne ghost-role-information-angry-slimes-name = Slime ghost-role-information-angry-slimes-description = Everyone around you irritates your instincts, destroy them! -ghost-role-information-angry-slimes-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other angry slimes. +ghost-role-information-angry-slimes-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with all other angry slimes. ghost-role-information-smile-name = Smile the Slime ghost-role-information-smile-description = The sweetest creature in the world. Smile slime! @@ -71,7 +71,7 @@ ghost-role-information-punpun-description = An honorable member of the monkey so ghost-role-information-xeno-name = Xeno ghost-role-information-xeno-description = You are a xeno, co-operate with your hive to kill all crewmembers! -ghost-role-information-xeno-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other xenos. +ghost-role-information-xeno-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with all other xenos. ghost-role-information-revenant-name = Revenant ghost-role-information-revenant-description = You are a Revenant. Use your powers to harvest souls and unleash chaos upon the crew. Unlock new abilities with the essence you harvest. @@ -134,11 +134,11 @@ ghost-role-information-ifrit-description = Listen to your owner. Don't tank dama ghost-role-information-space-dragon-name = Space Dragon ghost-role-information-space-dragon-description = Call in 3 carp rifts and take over this quadrant! You have only 5 minutes in between each rift before you will disappear. -ghost-role-information-space-dragon-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all your summoned carp. -ghost-role-information-space-dragon-summoned-carp-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with your dragon and its allies. +ghost-role-information-space-dragon-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with all your summoned carp. +ghost-role-information-space-dragon-summoned-carp-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with your dragon and its allies. ghost-role-information-space-dragon-dungeon-description = Defend the expedition dungeon with your fishy comrades! -ghost-role-information-space-dragon-dungeon-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all dungeon mobs. +ghost-role-information-space-dragon-dungeon-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with all dungeon mobs. ghost-role-information-cluwne-name = Cluwne ghost-role-information-cluwne-description = Become a pitiful cluwne, your only goal in life is to find a sweet release from your suffering (usually by being beaten to death). A cluwne is not an antagonist but may defend itself. Crewmembers may murder cluwnes freely. @@ -182,11 +182,11 @@ ghost-role-information-cburn-agent-description = A highly trained CentComm agent ghost-role-information-centcom-official-name = CentComm Official ghost-role-information-centcom-official-description = Perform CentComm related duties such as inspect the station, jotting down performance reviews for heads of staff, and managing the fax machine. -ghost-role-information-nukeop-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with all other nuclear operatives. Covert syndicate agents are not guaranteed to help you. +ghost-role-information-nukeop-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with all other nuclear operatives. Covert syndicate agents are not guaranteed to help you. ghost-role-information-loneop-name = Lone Operative ghost-role-information-loneop-description = You are a lone nuclear operative. Destroy the station! -ghost-role-information-loneop-rules = You are a [color=red][bold]Solo Antagonist[/bold][/color]. Covert syndicate agents are not guaranteed to help you. +ghost-role-information-loneop-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-solo-antagonist-name}[/bold][/color]. Covert syndicate agents are not guaranteed to help you. ghost-role-information-behonker-name = Behonker ghost-role-information-behonker-description = You are an antagonist, bring death and honks to those who do not follow the honkmother. @@ -196,11 +196,11 @@ ghost-role-information-hellspawn-description = Bring death to those who do not f ghost-role-information-Death-Squad-name = Death Squad Operative ghost-role-information-Death-Squad-description = One of Nanotrasen's top internal affairs agents. Await orders from CentComm or an official. -ghost-role-information-Death-Squad-rules = You are required to obey orders given by your superior, you are effectively their [color=#6495ed][bold]Familiar[/bold][/color]. +ghost-role-information-Death-Squad-rules = You are required to obey orders given by your superior, you are effectively their [color={role-type-familiar-color}][bold]{role-type-familiar-name}[/bold][/color]. ghost-role-information-SyndiCat-name = SyndiCat ghost-role-information-SyndiCat-description = You're the faithful trained pet of nuclear operatives with a microbomb. Serve your master to the death! -ghost-role-information-SyndiCat-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you. +ghost-role-information-SyndiCat-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with the agent who summoned you. ghost-role-information-Cak-name = Cak ghost-role-information-Cak-description = You are the chef's favorite child. You're a living cake cat. @@ -216,7 +216,7 @@ ghost-role-information-paradox-clone-description = A freak space-time anomaly ha ghost-role-information-syndicate-reinforcement-name = Syndicate Agent ghost-role-information-syndicate-reinforcement-description = Someone needs reinforcements. You, the first person the syndicate could find, will help them. -ghost-role-information-syndicate-reinforcement-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you. +ghost-role-information-syndicate-reinforcement-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with the agent who summoned you. ghost-role-information-syndicate-reinforcement-medic-name = Syndicate Medic ghost-role-information-syndicate-reinforcement-medic-description = Someone needs reinforcements. Your task is to keep the agent who called you alive. @@ -229,7 +229,7 @@ ghost-role-information-syndicate-reinforcement-thief-description = Someone needs ghost-role-information-nukeop-reinforcement-name = Nuclear Operative ghost-role-information-nukeop-reinforcement-description = The nuclear operatives need reinforcements. You, a reserve agent, will help them. -ghost-role-information-nukeop-reinforcement-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the nuclear operatives who summoned you. +ghost-role-information-nukeop-reinforcement-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with the nuclear operatives who summoned you. ghost-role-information-syndicate-monkey-reinforcement-name = Syndicate Monkey Agent ghost-role-information-syndicate-monkey-reinforcement-description = Someone needs reinforcements. You, a trained monkey, will help them. diff --git a/Resources/Locale/en-US/guardian/guardian.ftl b/Resources/Locale/en-US/guardian/guardian.ftl index 141646087d..13cb9ad9da 100644 --- a/Resources/Locale/en-US/guardian/guardian.ftl +++ b/Resources/Locale/en-US/guardian/guardian.ftl @@ -6,8 +6,7 @@ guardian-already-present-invalid-creation = You are NOT re-living that haunting guardian-no-actions-invalid-creation = You don't have the ability to host a guardian! guardian-activator-empty-invalid-creation = The injector is spent. guardian-activator-empty-examine = [color=#ba1919]The injector is spent.[/color] -# TODO: Change this once other species can inject it? -guardian-activator-invalid-target = Only humans can be injected! +guardian-activator-invalid-target = {CAPITALIZE(THE($entity))} cannot be injected! guardian-no-soul = Your guardian has no soul. guardian-available = Your guardian now has a soul. guardian-inside-container = There's no room to release your guardian! diff --git a/Resources/Locale/en-US/health-examinable/stethoscope.ftl b/Resources/Locale/en-US/health-examinable/stethoscope.ftl index decfd7795b..d4baf4cc93 100644 --- a/Resources/Locale/en-US/health-examinable/stethoscope.ftl +++ b/Resources/Locale/en-US/health-examinable/stethoscope.ftl @@ -1,6 +1,15 @@ stethoscope-verb = Listen with stethoscope -stethoscope-dead = You hear nothing. + +stethoscope-nothing = You don't hear anything. + stethoscope-normal = You hear normal breathing. +stethoscope-raggedy = You hear raggedy breathing. stethoscope-hyper = You hear hyperventilation. stethoscope-irregular = You hear hyperventilation with an irregular pattern. stethoscope-fucked = You hear twitchy, labored breathing interspersed with short gasps. + +stethoscope-delta-steady = It's steady. +stethoscope-delta-improving = It's improving. +stethoscope-delta-worsening = It's getting worse. + +stethoscope-combined-status = {$absolute} {$delta} diff --git a/Resources/Locale/en-US/mind/role-types.ftl b/Resources/Locale/en-US/mind/role-types.ftl index 9b4ce9288c..1139bf1ab0 100644 --- a/Resources/Locale/en-US/mind/role-types.ftl +++ b/Resources/Locale/en-US/mind/role-types.ftl @@ -7,3 +7,13 @@ role-type-silicon-name = Silicon role-type-silicon-antagonist-name = Altered Silicon role-type-update-message = Your role is [color = {$color}]{$role}[/color] + +# If you change a color here, you might want to also change it in role_types.yml +role-type-crew-aligned-color = #eeeeee +role-type-crew-aligned-alternate-color = #008000 +role-type-solo-antagonist-color = #d82000 +role-type-team-antagonist-color = #d82000 +role-type-free-agent-color = #ffff00 +role-type-familiar-color = #6495ed +role-type-silicon-color = #6495ed +role-type-silicon-antagonist-color =#c832e6 diff --git a/Resources/Locale/en-US/temperature/entity-heater.ftl b/Resources/Locale/en-US/temperature/entity-heater.ftl index a809d508e7..391e84e512 100644 --- a/Resources/Locale/en-US/temperature/entity-heater.ftl +++ b/Resources/Locale/en-US/temperature/entity-heater.ftl @@ -1,3 +1,18 @@ -entity-heater-examined = It is set to [color=gray]{$setting}[/color] -entity-heater-switch-setting = Switch to {$setting} -entity-heater-switched-setting = Switched to {$setting} +-entity-heater-setting-name = + { $setting -> + [off] off + [low] low + [medium] medium + [high] high + *[other] unknown + } + +entity-heater-examined = It is set to { $setting -> + [off] [color=gray]{ -entity-heater-setting-name(setting: "off") }[/color] + [low] [color=yellow]{ -entity-heater-setting-name(setting: "low") }[/color] + [medium] [color=orange]{ -entity-heater-setting-name(setting: "medium") }[/color] + [high] [color=red]{ -entity-heater-setting-name(setting: "high") }[/color] + *[other] [color=purple]{ -entity-heater-setting-name(setting: "other") }[/color] +}. +entity-heater-switch-setting = Switch to { -entity-heater-setting-name(setting: $setting) } +entity-heater-switched-setting = Switched to { -entity-heater-setting-name(setting: $setting) }. diff --git a/Resources/Locale/en-US/thief/backpack.ftl b/Resources/Locale/en-US/thief/backpack.ftl index 6d3baa2c0d..962480e2e2 100644 --- a/Resources/Locale/en-US/thief/backpack.ftl +++ b/Resources/Locale/en-US/thief/backpack.ftl @@ -1,4 +1,4 @@ -thief-backpack-window-title = thief toolbox +thief-backpack-window-title = thieving kit thief-backpack-window-description = Inside are your tools of the trade, which will dissolve when you're ready. diff --git a/Resources/Locale/en-US/tips.ftl b/Resources/Locale/en-US/tips.ftl index e0e71d66da..ae43ea094a 100644 --- a/Resources/Locale/en-US/tips.ftl +++ b/Resources/Locale/en-US/tips.ftl @@ -135,3 +135,4 @@ tips-dataset-134 = You can tell if an area with firelocks up is spaced by lookin tips-dataset-135 = Instead of picking it up, you can alt-click food to eat it. This also works for mice and other creatures without hands. tips-dataset-136 = If you're trapped behind an electrified door, disable the APC or throw your ID at the door to avoid getting shocked! tips-dataset-137 = If the AI electrifies a door and you have insulated gloves, snip and mend the power wire to reset their electrification! +tips-dataset-138 = If you want to stop your prisoner from escaping from the cell right after being uncuffed, turn on combat mode while uncuffing - this will shove the prisoner down. diff --git a/Resources/Locale/en-US/weapons/ranged/turrets.ftl b/Resources/Locale/en-US/weapons/ranged/turrets.ftl new file mode 100644 index 0000000000..213599d926 --- /dev/null +++ b/Resources/Locale/en-US/weapons/ranged/turrets.ftl @@ -0,0 +1,12 @@ +# Deployable turret component +deployable-turret-component-activating = Deploying... +deployable-turret-component-deactivating = Deactivating... +deployable-turret-component-activate = Activate +deployable-turret-component-deactivate = Deactivate +deployable-turret-component-access-denied = Access denied +deployable-turret-component-no-ammo = Weapon systems depleted +deployable-turret-component-is-broken = The turret is heavily damaged and must be repaired +deployable-turret-component-cannot-access-wires = You can't reach the maintenance panel while the turret is active + +# Turret notification for station AI +station-ai-turret-is-attacking-warning = {CAPITALIZE($source)} has engaged a hostile target. \ No newline at end of file diff --git a/Resources/Locale/en-US/wires/wire-names.ftl b/Resources/Locale/en-US/wires/wire-names.ftl index 08e5af4000..1c35bdeb8c 100644 --- a/Resources/Locale/en-US/wires/wire-names.ftl +++ b/Resources/Locale/en-US/wires/wire-names.ftl @@ -43,6 +43,8 @@ wires-board-name-jukebox = Jukebox wires-board-name-computer = Computer wires-board-name-holopad = Holopad wires-board-name-barsign = Bar Sign +wires-board-name-weapon-energy-turret = Sentry turret +wires-board-name-turret-controls = Sentry turret control panel # names that get displayed in the wire hacking hud & admin logs. diff --git a/Resources/Locale/en-US/zombies/zombie.ftl b/Resources/Locale/en-US/zombies/zombie.ftl index b6abf86364..b46e2ebc30 100644 --- a/Resources/Locale/en-US/zombies/zombie.ftl +++ b/Resources/Locale/en-US/zombies/zombie.ftl @@ -4,6 +4,6 @@ zombie-infection-greeting = You have become a zombie. Your goal is to seek out t zombie-generic = zombie zombie-name-prefix = zombified {$baseName} zombie-role-desc = A malevolent creature of the dead. -zombie-role-rules = You are an antagonist. Search out the living and bite them in order to infect them and turn them into zombies. Work together with the other zombies and remaining initial infected to overtake the station. +zombie-role-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color]. Search out the living and bite them in order to infect them and turn them into zombies. Work together with the other zombies and remaining initial infected to overtake the station. zombie-permadeath = This time, you're dead for real. diff --git a/Resources/Maps/Shuttles/ShuttleEvent/manowar.yml b/Resources/Maps/Shuttles/ShuttleEvent/manowar.yml index b7c52597a0..3b0683a8e5 100644 --- a/Resources/Maps/Shuttles/ShuttleEvent/manowar.yml +++ b/Resources/Maps/Shuttles/ShuttleEvent/manowar.yml @@ -1,6 +1,17 @@ meta: - format: 6 - postmapinit: false + format: 7 + category: Grid + engineVersion: 250.0.0 + forkId: "" + forkVersion: "" + time: 03/29/2025 03:19:37 + entityCount: 448 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] tilemap: 0: Space 2: FloorBrokenWood @@ -933,6 +944,46 @@ entities: - type: Transform pos: 4.5,-1.5 parent: 1 + - uid: 441 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 442 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 443 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 444 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 445 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 446 + components: + - type: Transform + pos: 0.5,13.5 + parent: 1 + - uid: 447 + components: + - type: Transform + pos: 3.5,-3.5 + parent: 1 + - uid: 448 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 - proto: CableHV entities: - uid: 234 diff --git a/Resources/Maps/Shuttles/emergency_courser.yml b/Resources/Maps/Shuttles/emergency_courser.yml index 738ef3307b..5e61c16e96 100644 --- a/Resources/Maps/Shuttles/emergency_courser.yml +++ b/Resources/Maps/Shuttles/emergency_courser.yml @@ -1,6 +1,17 @@ meta: - format: 6 - postmapinit: false + format: 7 + category: Grid + engineVersion: 250.0.0 + forkId: "" + forkVersion: "" + time: 03/29/2025 03:02:29 + entityCount: 662 +maps: [] +grids: +- 656 +orphans: +- 656 +nullspace: [] tilemap: 0: Space 29: FloorDark @@ -61,10 +72,10 @@ entities: gravityShakeSound: !type:SoundPathSpecifier path: /Audio/Effects/alert.ogg - type: DeviceNetwork + deviceNetId: Wireless configurators: [] deviceLists: [] transmitFrequencyId: ShuttleTimer - deviceNetId: Wireless - type: DecalGrid chunkCollection: version: 2 @@ -3146,6 +3157,33 @@ entities: - type: Transform pos: 1.5,-0.5 parent: 656 +- proto: Screen + entities: + - uid: 658 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 656 + - uid: 659 + components: + - type: Transform + pos: 6.5,1.5 + parent: 656 + - uid: 660 + components: + - type: Transform + pos: -6.5,1.5 + parent: 656 + - uid: 661 + components: + - type: Transform + pos: 3.5,-11.5 + parent: 656 + - uid: 662 + components: + - type: Transform + pos: -3.5,-11.5 + parent: 656 - proto: ShuttleWindow entities: - uid: 7 diff --git a/Resources/Maps/Shuttles/emergency_meta.yml b/Resources/Maps/Shuttles/emergency_meta.yml index 4d8a9b1f6b..de701abab8 100644 --- a/Resources/Maps/Shuttles/emergency_meta.yml +++ b/Resources/Maps/Shuttles/emergency_meta.yml @@ -1,6 +1,17 @@ meta: - format: 6 - postmapinit: false + format: 7 + category: Grid + engineVersion: 250.0.0 + forkId: "" + forkVersion: "" + time: 03/29/2025 03:10:03 + entityCount: 927 +maps: [] +grids: +- 1 +orphans: +- 1 +nullspace: [] tilemap: 0: Space 29: FloorDark @@ -69,10 +80,10 @@ entities: gravityShakeSound: !type:SoundPathSpecifier path: /Audio/Effects/alert.ogg - type: DeviceNetwork + deviceNetId: Wireless configurators: [] deviceLists: [] transmitFrequencyId: ShuttleTimer - deviceNetId: Wireless - type: DecalGrid chunkCollection: version: 2 @@ -2321,6 +2332,22 @@ entities: rot: -1.5707963267948966 rad pos: 16.5,-2.5 parent: 1 +- proto: ChemistryBottleEpinephrine + entities: + - uid: 579 + components: + - type: Transform + pos: 6.5416865,-8.488731 + parent: 1 + - type: Physics + canCollide: False + - uid: 580 + components: + - type: Transform + pos: 6.7847424,-8.481787 + parent: 1 + - type: Physics + canCollide: False - proto: CigaretteSpent entities: - uid: 483 @@ -2998,22 +3025,6 @@ entities: parent: 539 - type: Physics canCollide: False -- proto: EpinephrineChemistryBottle - entities: - - uid: 579 - components: - - type: Transform - pos: 6.5416865,-8.488731 - parent: 1 - - type: Physics - canCollide: False - - uid: 580 - components: - - type: Transform - pos: 6.7847424,-8.481787 - parent: 1 - - type: Physics - canCollide: False - proto: ExtinguisherCabinetFilled entities: - uid: 419 @@ -5692,6 +5703,28 @@ entities: parent: 422 - type: Physics canCollide: False +- proto: Screen + entities: + - uid: 56 + components: + - type: Transform + pos: -4.5,-9.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 5.5,-9.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 17.5,-3.5 + parent: 1 - proto: Screwdriver entities: - uid: 260 diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 0cc097fd8b..2ac538e80f 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -1,10 +1,10 @@ meta: format: 7 category: Map - engineVersion: 249.0.0 + engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/23/2025 08:00:27 + time: 03/27/2025 06:48:27 entityCount: 25710 maps: - 943 @@ -75883,6 +75883,9 @@ entities: - type: Transform pos: -14.52124,-43.447884 parent: 60 + - type: CollisionWake + enabled: False + - type: Conveyed - proto: FoodBoxDonkpocketPizza entities: - uid: 15714 diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index 279da0cba6..457ef0a8ef 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 247.2.0 + engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/07/2025 19:15:23 - entityCount: 28254 + time: 03/29/2025 05:00:25 + entityCount: 28319 maps: - 780 grids: @@ -179,7 +179,7 @@ entities: version: 6 1,2: ind: 1,2 - tiles: WQAAAAAAWQAAAAADWQAAAAACWQAAAAADeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAABWQAAAAAAWQAAAAADUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACWQAAAAACWQAAAAADeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAHQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAWQAAAAABWQAAAAACWQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAWQAAAAADWQAAAAAAWQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAWQAAAAADWQAAAAADWQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAADWQAAAAACWQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAABWQAAAAABWQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: WQAAAAAAWQAAAAADWQAAAAACWQAAAAADeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAABWQAAAAAAWQAAAAADUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACWQAAAAACWQAAAAADeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAHQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAWQAAAAABWQAAAAACWQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAWQAAAAADWQAAAAAAWQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAdgAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAWQAAAAADWQAAAAADWQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAdgAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAADWQAAAAACWQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAABWQAAAAABWQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 2,1: ind: 2,1 @@ -315,7 +315,7 @@ entities: version: 6 4,-2: ind: 4,-2 - tiles: eQAAAAAAbAAAAAACbAAAAAAAbAAAAAACeQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAADHQAAAAACHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAADbAAAAAABeQAAAAAAHQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAADHQAAAAACeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAbAAAAAADbAAAAAACbAAAAAABeQAAAAAAHQAAAAACWQAAAAADWQAAAAABWQAAAAACWQAAAAACHQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAbAAAAAAAbAAAAAADbAAAAAACeQAAAAAAHQAAAAABWQAAAAAAWQAAAAADWQAAAAACWQAAAAADHQAAAAACeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAbAAAAAAAbAAAAAAAbAAAAAACbAAAAAAAeQAAAAAAHQAAAAACWQAAAAACWQAAAAACWQAAAAACWQAAAAABHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAABbAAAAAACbAAAAAADbAAAAAACeQAAAAAAHQAAAAABWQAAAAAAWQAAAAACWQAAAAADWQAAAAACHQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAACeQAAAAAAHQAAAAABHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAACeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACWQAAAAABeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAACbAAAAAABbAAAAAAAbAAAAAABbAAAAAADbAAAAAAAbAAAAAABeQAAAAAAbAAAAAADbAAAAAAAbAAAAAAAbAAAAAADWQAAAAACbAAAAAAAbAAAAAABbAAAAAABbAAAAAABbAAAAAABbAAAAAACbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAACbAAAAAACbAAAAAACbAAAAAACbAAAAAABbAAAAAACeQAAAAAAbAAAAAADbAAAAAABbAAAAAAAbAAAAAAAbAAAAAABbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAAAeQAAAAAAbAAAAAABbAAAAAACbAAAAAACbAAAAAAAbAAAAAAAbAAAAAACbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAADWQAAAAACbAAAAAABbAAAAAACbAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAHQAAAAABaAAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAABbAAAAAAAbAAAAAABbAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAHQAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAABbAAAAAAAbAAAAAADbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAHQAAAAADaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAAAbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAABeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAACeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA + tiles: eQAAAAAAbAAAAAACbAAAAAAAbAAAAAACeQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAADHQAAAAACHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAADbAAAAAABeQAAAAAAHQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAADHQAAAAACeQAAAAAAeAAAAAAAeAAAAAAAaQAAAAAATQAAAAAAeQAAAAAAbAAAAAADbAAAAAACbAAAAAABeQAAAAAAHQAAAAACWQAAAAADWQAAAAABWQAAAAACWQAAAAACHQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAaQAAAAAATQAAAAAAeQAAAAAAbAAAAAAAbAAAAAADbAAAAAACeQAAAAAAHQAAAAABWQAAAAAAWQAAAAADWQAAAAACWQAAAAADHQAAAAACeQAAAAAAeAAAAAAAeAAAAAAAaQAAAAAATQAAAAAAbAAAAAAAbAAAAAAAbAAAAAACbAAAAAAAeQAAAAAAHQAAAAACWQAAAAACWQAAAAACWQAAAAACWQAAAAABHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAABbAAAAAACbAAAAAADbAAAAAACeQAAAAAAHQAAAAABWQAAAAAAWQAAAAACWQAAAAADWQAAAAACHQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAACeQAAAAAAHQAAAAABHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAACeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACWQAAAAABeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAACbAAAAAABbAAAAAAAbAAAAAABbAAAAAADbAAAAAAAbAAAAAABeQAAAAAAbAAAAAADbAAAAAAAbAAAAAAAbAAAAAADWQAAAAACbAAAAAAAbAAAAAABbAAAAAABbAAAAAABbAAAAAABbAAAAAACbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAACbAAAAAACbAAAAAACbAAAAAACbAAAAAABbAAAAAACeQAAAAAAbAAAAAADbAAAAAABbAAAAAAAbAAAAAAAbAAAAAABbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAAAeQAAAAAAbAAAAAABbAAAAAACbAAAAAACbAAAAAAAbAAAAAAAbAAAAAACbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAADWQAAAAACbAAAAAABbAAAAAACbAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAHQAAAAABaAAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAABbAAAAAAAbAAAAAABbAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAHQAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAABbAAAAAAAbAAAAAADbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAHQAAAAADaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAAAbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAABeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAACeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA version: 6 5,-2: ind: 5,-2 @@ -323,7 +323,7 @@ entities: version: 6 4,-3: ind: 4,-3 - tiles: eQAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAAAeQAAAAAAWQAAAAABWQAAAAACWQAAAAABWQAAAAADWQAAAAADWQAAAAABWQAAAAADWQAAAAAAWQAAAAABaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAABbAAAAAADeQAAAAAAWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAADWQAAAAACWQAAAAAAWQAAAAADWQAAAAADaAAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAACbAAAAAAAbAAAAAAAbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAAAbAAAAAAAbAAAAAACaAAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAABbAAAAAACeQAAAAAAbAAAAAABbAAAAAACbAAAAAACbAAAAAADbAAAAAADbAAAAAAAbAAAAAACbAAAAAACbAAAAAACaAAAAAAAeQAAAAAAbAAAAAABbAAAAAAAbAAAAAABbAAAAAADeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACWQAAAAACWQAAAAACWQAAAAADbAAAAAAAbAAAAAACbAAAAAADaAAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAADeQAAAAAAeAAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAbAAAAAACbAAAAAAAWQAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAACbAAAAAACeQAAAAAAeAAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAbAAAAAABbAAAAAACWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAABbAAAAAAAbAAAAAADeQAAAAAAeAAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAbAAAAAADbAAAAAACWQAAAAACeQAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAAAeQAAAAAAbAAAAAABbAAAAAADbAAAAAADbAAAAAAAbAAAAAAAbAAAAAADeQAAAAAAWQAAAAAAWQAAAAACWQAAAAACeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAACbAAAAAADbAAAAAABbAAAAAADbAAAAAABbAAAAAACbAAAAAACbAAAAAABeQAAAAAAWQAAAAACWQAAAAACWQAAAAAAWQAAAAAAbAAAAAACbAAAAAADbAAAAAABbAAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAABbAAAAAAAbAAAAAADbAAAAAACeQAAAAAAWQAAAAADWQAAAAABWQAAAAACeQAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAADbAAAAAAAbAAAAAADbAAAAAAAeQAAAAAAWQAAAAACWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAAAbAAAAAADeQAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAAAbAAAAAAAbAAAAAADeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACeQAAAAAA + tiles: eQAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAAAeQAAAAAAWQAAAAABWQAAAAACWQAAAAABWQAAAAADWQAAAAADWQAAAAABWQAAAAADWQAAAAAAWQAAAAABaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAABbAAAAAADeQAAAAAAWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAADWQAAAAACWQAAAAAAWQAAAAADWQAAAAADaAAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAACbAAAAAAAbAAAAAAAbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAAAbAAAAAAAbAAAAAACaAAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAABbAAAAAACeQAAAAAAbAAAAAABbAAAAAACbAAAAAACbAAAAAADbAAAAAADbAAAAAAAbAAAAAACbAAAAAACbAAAAAACaAAAAAAAeQAAAAAAbAAAAAABbAAAAAAAbAAAAAABbAAAAAADeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACWQAAAAACWQAAAAACWQAAAAADbAAAAAAAbAAAAAACbAAAAAADaAAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAADeQAAAAAAeAAAAAAAaQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAbAAAAAACbAAAAAAAWQAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAACbAAAAAACeQAAAAAAeAAAAAAAaQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAbAAAAAABbAAAAAACWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAABbAAAAAAAbAAAAAADeQAAAAAAeAAAAAAAaQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAbAAAAAADbAAAAAACWQAAAAACeQAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAAAeQAAAAAAbAAAAAABbAAAAAADbAAAAAADbAAAAAAAbAAAAAAAbAAAAAADeQAAAAAAWQAAAAAAWQAAAAACWQAAAAACeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAACbAAAAAADbAAAAAABbAAAAAADbAAAAAABbAAAAAACbAAAAAACbAAAAAABeQAAAAAAWQAAAAACWQAAAAACWQAAAAAAWQAAAAAAbAAAAAACbAAAAAADbAAAAAABbAAAAAAAeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAABbAAAAAAAbAAAAAADbAAAAAACeQAAAAAAWQAAAAADWQAAAAABWQAAAAACeQAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAAAeQAAAAAAbAAAAAABbAAAAAABbAAAAAADbAAAAAAAbAAAAAADbAAAAAAAeQAAAAAAWQAAAAACWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAAAbAAAAAADeQAAAAAAbAAAAAACbAAAAAACbAAAAAABbAAAAAAAbAAAAAAAbAAAAAADeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACeQAAAAAAeQAAAAAAbAAAAAACbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACeQAAAAAA version: 6 3,-3: ind: 3,-3 @@ -383,7 +383,7 @@ entities: version: 6 -2,-5: ind: -2,-5 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAHQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAADeQAAAAAAWQAAAAACWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAADHQAAAAADHQAAAAACWQAAAAACWQAAAAABeQAAAAAAWQAAAAACWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAHQAAAAABHQAAAAACHQAAAAAAHQAAAAACHQAAAAABeQAAAAAAWQAAAAADWQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABDgAAAAABDgAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAHQAAAAADHQAAAAAAHQAAAAADHQAAAAABHQAAAAABeQAAAAAAWQAAAAACWQAAAAABeQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAADgAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAHQAAAAABHQAAAAADHQAAAAADHQAAAAAAHQAAAAABeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAWQAAAAABWQAAAAADeQAAAAAADgAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAABeQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAWQAAAAACWQAAAAABWQAAAAACWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAWQAAAAACWQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAWQAAAAAAWQAAAAACWQAAAAABWQAAAAACWQAAAAABHQAAAAADWQAAAAADWQAAAAABWQAAAAABWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAADHQAAAAAAeQAAAAAAHQAAAAACHQAAAAABeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAACHQAAAAACeQAAAAAAHQAAAAACHQAAAAABeQAAAAAAaQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAABeQAAAAAAHQAAAAAAHQAAAAABeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAACHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAABHQAAAAADHQAAAAACHQAAAAABHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAHQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAADeQAAAAAAWQAAAAACWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAADHQAAAAADHQAAAAACWQAAAAACWQAAAAABeQAAAAAAWQAAAAACWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAHQAAAAABHQAAAAACHQAAAAAAHQAAAAACHQAAAAABeQAAAAAAWQAAAAADWQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABDgAAAAABDgAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAHQAAAAADHQAAAAAAHQAAAAADHQAAAAABHQAAAAABeQAAAAAAWQAAAAACWQAAAAABeQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAADgAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAHQAAAAABHQAAAAADHQAAAAADHQAAAAAAHQAAAAABeQAAAAAAeQAAAAAAWQAAAAABeQAAAAAAWQAAAAABWQAAAAADeQAAAAAADgAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABeQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAWQAAAAACWQAAAAABWQAAAAACWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAWQAAAAACWQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAWQAAAAAAWQAAAAACWQAAAAABWQAAAAACWQAAAAABHQAAAAADWQAAAAADWQAAAAABWQAAAAABWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAADHQAAAAAAeQAAAAAAHQAAAAACHQAAAAABeQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAACHQAAAAACeQAAAAAAHQAAAAACHQAAAAABeQAAAAAAaQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAABeQAAAAAAHQAAAAAAHQAAAAABeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAACHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAABHQAAAAADHQAAAAACHQAAAAABHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA version: 6 -3,-4: ind: -3,-4 @@ -447,7 +447,7 @@ entities: version: 6 2,2: ind: 2,2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 3,2: ind: 3,2 @@ -1746,6 +1746,13 @@ entities: 1680: 66,-22 2436: 31,-34 2615: 9,-74 + - node: + angle: 1.5707963267948966 rad + color: '#FFFFFFFF' + id: Caution + decals: + 6322: 79,-30 + 6323: 74,-41 - node: color: '#3B393B85' id: CheckerNESW @@ -2079,6 +2086,16 @@ entities: 2552: 7,-47 2553: 6,-47 2554: 5,-47 + - node: + color: '#FFFFFFFF' + id: Delivery + decals: + 6324: 78,-29 + 6325: 78,-30 + 6326: 78,-31 + 6327: 70,-40 + 6328: 70,-41 + 6329: 70,-42 - node: zIndex: 1 color: '#FFFFFFFF' @@ -4156,7 +4173,6 @@ entities: 5867: -24,-71 5868: -20,-70 5869: -17,-70 - 5870: -21,-73 5871: -15,-74 5872: -14,-74 5873: -17,-76 @@ -6754,7 +6770,6 @@ entities: 6046: 0,-21 6047: -1,-29 6048: -1,-26 - 6217: -21,-73 - node: color: '#FFFFFFFF' id: WarnCornerGreyscaleNE @@ -6782,6 +6797,7 @@ entities: decals: 3516: 25,19 6267: 68,-45 + 6298: 12,-72 - node: color: '#FFFFFFFF' id: WarnCornerSE @@ -6840,6 +6856,7 @@ entities: 1665: 51,-21 2314: -73,-4 3512: -13,-63 + 6310: 24,-80 - node: zIndex: 1 color: '#FFFFFFFF' @@ -6861,6 +6878,7 @@ entities: 2312: -69,-4 2313: -76,-4 3511: -11,-63 + 6306: 20,-72 - node: zIndex: 1 color: '#FFFFFFFF' @@ -6878,6 +6896,7 @@ entities: 1663: 51,-17 2317: -73,8 6275: 2,36 + 6311: 24,-74 - node: zIndex: 1 color: '#FFFFFFFF' @@ -6957,6 +6976,11 @@ entities: 3514: 23,18 6271: 2,34 6272: 2,35 + 6312: 24,-79 + 6313: 24,-78 + 6314: 24,-77 + 6315: 24,-76 + 6316: 24,-75 - node: zIndex: 1 color: '#FFFFFFFF' @@ -7262,6 +7286,8 @@ entities: 2604: -3,-79 6273: 4,36 6274: 3,36 + 6317: 25,-74 + 6318: 26,-74 - node: zIndex: 1 color: '#FFFFFFFF' @@ -7334,6 +7360,19 @@ entities: 3568: -11,35 3569: -11,36 3703: -38,-11 + 6289: 12,-81 + 6290: 12,-80 + 6291: 12,-79 + 6292: 12,-78 + 6293: 12,-77 + 6294: 12,-76 + 6295: 12,-75 + 6296: 12,-74 + 6297: 12,-73 + 6307: 12,-82 + 6319: 79,-29 + 6320: 79,-30 + 6321: 79,-31 - node: zIndex: 1 color: '#FFFFFFFF' @@ -7347,7 +7386,6 @@ entities: 6213: -21,-77 6214: -21,-76 6215: -21,-75 - 6216: -21,-74 - node: zIndex: 2 color: '#FFFFFFFF' @@ -7418,6 +7456,15 @@ entities: 2472: 10,-46 2473: 9,-46 3508: -12,-63 + 6299: 13,-72 + 6300: 14,-72 + 6301: 15,-72 + 6302: 16,-72 + 6303: 17,-72 + 6304: 18,-72 + 6305: 19,-72 + 6308: 26,-80 + 6309: 25,-80 - node: zIndex: 1 color: '#FFFFFFFF' @@ -10610,6 +10657,21 @@ entities: container: 11756 - proto: AirAlarm entities: + - uid: 2 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 47.5,-29.5 + parent: 8364 + - type: DeviceList + devices: + - 23905 + - 21996 + - 24674 + - 22679 + - 24673 + - 24672 + - 24671 - uid: 256 components: - type: Transform @@ -10670,6 +10732,16 @@ entities: - type: DeviceList devices: - 23910 + - uid: 2468 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,12.5 + parent: 8364 + - type: DeviceList + devices: + - 23905 + - 21996 - uid: 3087 components: - type: Transform @@ -12008,17 +12080,6 @@ entities: - 25274 - 25480 - 25485 - - uid: 25517 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -9.5,15.5 - parent: 8364 - - type: DeviceList - devices: - - 25375 - - 23905 - - 21996 - uid: 25825 components: - type: Transform @@ -13845,7 +13906,7 @@ entities: pos: 24.5,16.5 parent: 8364 - type: Door - secondsUntilStateChange: -93688.41 + secondsUntilStateChange: -95912.98 state: Opening - type: DeviceLinkSource lastSignals: @@ -15007,6 +15068,11 @@ entities: - type: Transform pos: 46.5,-30.5 parent: 8364 + - uid: 28317 + components: + - type: Transform + pos: -13.5,4.5 + parent: 8364 - proto: AirlockMedicalLocked entities: - uid: 1752 @@ -15227,6 +15293,11 @@ entities: - type: Transform pos: 64.5,-27.5 parent: 8364 + - uid: 28318 + components: + - type: Transform + pos: -13.5,1.5 + parent: 8364 - proto: AirlockScienceLocked entities: - uid: 2078 @@ -15390,7 +15461,7 @@ entities: pos: 9.5,25.5 parent: 8364 - type: Door - secondsUntilStateChange: -6944.9043 + secondsUntilStateChange: -9169.472 state: Opening - type: DeviceLinkSource lastSignals: @@ -15869,6 +15940,9 @@ entities: - type: Transform pos: 45.5,-27.5 parent: 8364 + - type: DeviceNetwork + deviceLists: + - 2 - uid: 22680 components: - type: Transform @@ -16444,14 +16518,6 @@ entities: parent: 8364 - proto: APCBasic entities: - - uid: 2 - components: - - type: MetaData - name: Medical Storage APC - - type: Transform - rot: -1.5707963267948966 rad - pos: 47.5,-22.5 - parent: 8364 - uid: 1260 components: - type: MetaData @@ -16904,16 +16970,6 @@ entities: rot: 3.141592653589793 rad pos: -37.5,-63.5 parent: 8364 - - uid: 14455 - components: - - type: MetaData - name: Janitor Closet APC - - type: Transform - pos: -52.5,-6.5 - parent: 8364 - - type: PowerNetworkBattery - loadingNetworkDemand: 5 - supplyRampPosition: 2.4463015 - uid: 14643 components: - type: MetaData @@ -16942,6 +16998,14 @@ entities: rot: -1.5707963267948966 rad pos: 10.5,36.5 parent: 8364 + - uid: 15732 + components: + - type: MetaData + name: Medical Storage APC + - type: Transform + rot: -1.5707963267948966 rad + pos: 47.5,-28.5 + parent: 8364 - uid: 15812 components: - type: MetaData @@ -17023,6 +17087,14 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,-54.5 parent: 8364 + - uid: 18183 + components: + - type: MetaData + name: Janitor's Closet APC + - type: Transform + rot: 3.141592653589793 rad + pos: -51.5,-9.5 + parent: 8364 - uid: 18413 components: - type: MetaData @@ -17218,14 +17290,6 @@ entities: rot: 3.141592653589793 rad pos: -13.5,14.5 parent: 8364 - - uid: 9657 - components: - - type: MetaData - name: Detective Office APC - - type: Transform - rot: 3.141592653589793 rad - pos: -8.5,14.5 - parent: 8364 - uid: 9976 components: - type: Transform @@ -17300,6 +17364,14 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,-41.5 parent: 8364 + - uid: 28319 + components: + - type: MetaData + name: Detective's Office APC + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,14.5 + parent: 8364 - proto: APCSuperCapacity entities: - uid: 3119 @@ -20830,6 +20902,11 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,-86.5 parent: 8364 + - uid: 4458 + components: + - type: Transform + pos: 70.5,-40.5 + parent: 8364 - uid: 4704 components: - type: Transform @@ -20931,16 +21008,17 @@ entities: - type: Transform pos: 91.5,-25.5 parent: 8364 + - uid: 20002 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 78.5,-28.5 + parent: 8364 - uid: 20180 components: - type: Transform pos: 70.5,-39.5 parent: 8364 - - uid: 20181 - components: - - type: Transform - pos: 70.5,-40.5 - parent: 8364 - uid: 20182 components: - type: Transform @@ -20982,6 +21060,18 @@ entities: - type: Transform pos: 2.5,-73.5 parent: 8364 + - uid: 28251 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 78.5,-29.5 + parent: 8364 + - uid: 28253 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 78.5,-30.5 + parent: 8364 - proto: BlastDoorOpen entities: - uid: 3134 @@ -22203,11 +22293,6 @@ entities: - type: Transform pos: -50.5,-6.5 parent: 8364 - - uid: 1235 - components: - - type: Transform - pos: -52.5,-6.5 - parent: 8364 - uid: 1254 components: - type: Transform @@ -23293,6 +23378,11 @@ entities: - type: Transform pos: 5.5,-14.5 parent: 8364 + - uid: 5553 + components: + - type: Transform + pos: -51.5,-9.5 + parent: 8364 - uid: 5572 components: - type: Transform @@ -23328,6 +23418,11 @@ entities: - type: Transform pos: 4.5,-14.5 parent: 8364 + - uid: 5731 + components: + - type: Transform + pos: -7.5,15.5 + parent: 8364 - uid: 5750 components: - type: Transform @@ -25661,7 +25756,7 @@ entities: - uid: 9695 components: - type: Transform - pos: -8.5,14.5 + pos: -50.5,-8.5 parent: 8364 - uid: 9696 components: @@ -25713,11 +25808,6 @@ entities: - type: Transform pos: -13.5,-25.5 parent: 8364 - - uid: 9817 - components: - - type: Transform - pos: 47.5,-22.5 - parent: 8364 - uid: 9819 components: - type: Transform @@ -29348,6 +29438,11 @@ entities: - type: Transform pos: -35.5,0.5 parent: 8364 + - uid: 12173 + components: + - type: Transform + pos: -7.5,14.5 + parent: 8364 - uid: 12190 components: - type: Transform @@ -33163,6 +33258,11 @@ entities: - type: Transform pos: -52.5,-16.5 parent: 8364 + - uid: 14097 + components: + - type: Transform + pos: -51.5,-8.5 + parent: 8364 - uid: 14103 components: - type: Transform @@ -33393,11 +33493,6 @@ entities: - type: Transform pos: -21.5,-6.5 parent: 8364 - - uid: 14344 - components: - - type: Transform - pos: -51.5,-6.5 - parent: 8364 - uid: 14407 components: - type: Transform @@ -43868,6 +43963,11 @@ entities: - type: Transform pos: -3.5,-20.5 parent: 8364 + - uid: 28295 + components: + - type: Transform + pos: 47.5,-28.5 + parent: 8364 - proto: CableApcStack entities: - uid: 1195 @@ -44035,6 +44135,11 @@ entities: - type: Transform pos: -19.5,-35.5 parent: 8364 + - uid: 1719 + components: + - type: Transform + pos: -16.5,-20.5 + parent: 8364 - uid: 1889 components: - type: Transform @@ -48465,6 +48570,11 @@ entities: - type: Transform pos: -23.5,-66.5 parent: 8364 + - uid: 14454 + components: + - type: Transform + pos: -20.5,-73.5 + parent: 8364 - uid: 14600 components: - type: Transform @@ -51035,6 +51145,71 @@ entities: - type: Transform pos: -22.5,-11.5 parent: 8364 + - uid: 28297 + components: + - type: Transform + pos: -16.5,-21.5 + parent: 8364 + - uid: 28298 + components: + - type: Transform + pos: -16.5,-22.5 + parent: 8364 + - uid: 28299 + components: + - type: Transform + pos: -16.5,-23.5 + parent: 8364 + - uid: 28300 + components: + - type: Transform + pos: -16.5,-24.5 + parent: 8364 + - uid: 28301 + components: + - type: Transform + pos: -16.5,-25.5 + parent: 8364 + - uid: 28302 + components: + - type: Transform + pos: -16.5,-26.5 + parent: 8364 + - uid: 28303 + components: + - type: Transform + pos: -16.5,-27.5 + parent: 8364 + - uid: 28304 + components: + - type: Transform + pos: -16.5,-28.5 + parent: 8364 + - uid: 28305 + components: + - type: Transform + pos: -16.5,-29.5 + parent: 8364 + - uid: 28306 + components: + - type: Transform + pos: -16.5,-30.5 + parent: 8364 + - uid: 28307 + components: + - type: Transform + pos: -17.5,-30.5 + parent: 8364 + - uid: 28308 + components: + - type: Transform + pos: -17.5,-31.5 + parent: 8364 + - uid: 28309 + components: + - type: Transform + pos: -17.5,-32.5 + parent: 8364 - proto: CableHVStack entities: - uid: 1683 @@ -51067,6 +51242,11 @@ entities: - type: Transform pos: -65.73044,14.545363 parent: 8364 + - uid: 14455 + components: + - type: Transform + pos: 82.56774,-63.335052 + parent: 8364 - uid: 15964 components: - type: Transform @@ -51129,6 +51309,11 @@ entities: - type: Transform pos: -63.5,14.5 parent: 8364 + - uid: 1235 + components: + - type: Transform + pos: 45.5,-28.5 + parent: 8364 - uid: 1236 components: - type: Transform @@ -51354,11 +51539,6 @@ entities: - type: Transform pos: 8.5,-28.5 parent: 8364 - - uid: 5553 - components: - - type: Transform - pos: 46.5,-22.5 - parent: 8364 - uid: 5609 components: - type: Transform @@ -51389,11 +51569,6 @@ entities: - type: Transform pos: -12.5,-19.5 parent: 8364 - - uid: 5731 - components: - - type: Transform - pos: 47.5,-22.5 - parent: 8364 - uid: 5734 components: - type: Transform @@ -53059,6 +53234,11 @@ entities: - type: Transform pos: 20.5,35.5 parent: 8364 + - uid: 9657 + components: + - type: Transform + pos: 45.5,-26.5 + parent: 8364 - uid: 9659 components: - type: Transform @@ -53159,6 +53339,11 @@ entities: - type: Transform pos: -13.5,14.5 parent: 8364 + - uid: 9817 + components: + - type: Transform + pos: 45.5,-25.5 + parent: 8364 - uid: 9835 components: - type: Transform @@ -53339,6 +53524,11 @@ entities: - type: Transform pos: 24.5,6.5 parent: 8364 + - uid: 10423 + components: + - type: Transform + pos: 45.5,-27.5 + parent: 8364 - uid: 10492 components: - type: Transform @@ -54327,12 +54517,7 @@ entities: - uid: 12172 components: - type: Transform - pos: -8.5,15.5 - parent: 8364 - - uid: 12173 - components: - - type: Transform - pos: -8.5,14.5 + pos: -7.5,14.5 parent: 8364 - uid: 12174 components: @@ -55384,6 +55569,11 @@ entities: - type: Transform pos: -44.5,-9.5 parent: 8364 + - uid: 14344 + components: + - type: Transform + pos: -51.5,-9.5 + parent: 8364 - uid: 14378 components: - type: Transform @@ -55532,12 +55722,7 @@ entities: - uid: 14450 components: - type: Transform - pos: -51.5,-6.5 - parent: 8364 - - uid: 14454 - components: - - type: Transform - pos: -52.5,-6.5 + pos: 45.5,-24.5 parent: 8364 - uid: 14490 components: @@ -57449,11 +57634,6 @@ entities: - type: Transform pos: 45.5,-23.5 parent: 8364 - - uid: 18183 - components: - - type: Transform - pos: 46.5,-23.5 - parent: 8364 - uid: 18187 components: - type: Transform @@ -60369,11 +60549,6 @@ entities: - type: Transform pos: -0.5,-15.5 parent: 8364 - - uid: 26956 - components: - - type: Transform - pos: -20.5,-72.5 - parent: 8364 - uid: 27008 components: - type: Transform @@ -60664,6 +60839,16 @@ entities: - type: Transform pos: -3.5,-22.5 parent: 8364 + - uid: 28293 + components: + - type: Transform + pos: 46.5,-28.5 + parent: 8364 + - uid: 28294 + components: + - type: Transform + pos: 47.5,-28.5 + parent: 8364 - proto: CableMVStack entities: - uid: 1697 @@ -60856,6 +61041,12 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-11.5 parent: 8364 + - uid: 27282 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,-72.5 + parent: 8364 - proto: CannabisSeeds entities: - uid: 26471 @@ -66794,6 +66985,18 @@ entities: rot: 1.5707963267948966 rad pos: 33.5,-84.5 parent: 8364 + - uid: 28243 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-72.5 + parent: 8364 + - uid: 28246 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -20.5,-73.5 + parent: 8364 - proto: Cautery entities: - uid: 21262 @@ -68517,6 +68720,19 @@ entities: - type: Transform pos: 21.5,-20.5 parent: 8364 +- proto: ChemistryBottleRobustHarvest + entities: + - uid: 13505 + components: + - type: Transform + pos: -19.744875,7.720537 + parent: 8364 + - uid: 13547 + components: + - type: Transform + rot: 2.9154674848541617E-05 rad + pos: -22.735086,7.7025566 + parent: 8364 - proto: ChemistryHotplate entities: - uid: 18903 @@ -73368,10 +73584,6 @@ entities: rot: 3.141592653589793 rad pos: 79.5,-26.5 parent: 8364 - - type: DeviceLinkSource - linkedPorts: - 20207: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver - uid: 17552 components: - type: Transform @@ -73771,18 +73983,18 @@ entities: - type: Transform pos: -2.5,-66.5 parent: 8364 - - uid: 20071 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 82.5,-64.5 - parent: 8364 - uid: 26624 components: - type: Transform rot: -1.5707963267948966 rad pos: 7.5,-43.5 parent: 8364 + - uid: 28256 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 80.5,-64.5 + parent: 8364 - proto: ComputerStationRecords entities: - uid: 9260 @@ -75646,11 +75858,6 @@ entities: rot: 1.5707963267948966 rad pos: -10.5,30.5 parent: 8364 - - uid: 15732 - components: - - type: Transform - pos: 29.5,-31.5 - parent: 8364 - uid: 17861 components: - type: Transform @@ -75666,6 +75873,12 @@ entities: - type: Transform pos: -42.5,6.5 parent: 8364 + - uid: 28292 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 33.5,-37.5 + parent: 8364 - proto: DeployableBarrier entities: - uid: 7678 @@ -83659,6 +83872,12 @@ entities: rot: -1.5707963267948966 rad pos: -25.5,-12.5 parent: 8364 + - uid: 28291 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 42.5,-45.5 + parent: 8364 - proto: DisposalRouter entities: - uid: 22062 @@ -85858,11 +86077,6 @@ entities: - type: Transform pos: 3.5,30.5 parent: 8364 - - uid: 14097 - components: - - type: Transform - pos: -54.5,-9.5 - parent: 8364 - uid: 16813 components: - type: Transform @@ -85873,6 +86087,11 @@ entities: - type: Transform pos: 63.5,-17.5 parent: 8364 + - uid: 28296 + components: + - type: Transform + pos: -54.5,-10.5 + parent: 8364 - proto: filingCabinetDrawerRandom entities: - uid: 2354 @@ -87889,7 +88108,7 @@ entities: pos: 18.5,-13.5 parent: 8364 - type: Door - secondsUntilStateChange: -919.4161 + secondsUntilStateChange: -3143.983 state: Closing - uid: 13388 components: @@ -87897,7 +88116,7 @@ entities: pos: 18.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -955.1161 + secondsUntilStateChange: -3179.683 state: Closing - uid: 13389 components: @@ -88065,7 +88284,7 @@ entities: pos: -34.5,-14.5 parent: 8364 - type: Door - secondsUntilStateChange: -87876.945 + secondsUntilStateChange: -90101.516 state: Closing - uid: 15010 components: @@ -88844,6 +89063,11 @@ entities: - type: Transform pos: 6.185224,-70.45571 parent: 8364 + - uid: 28257 + components: + - type: Transform + pos: 82.519135,-63.66839 + parent: 8364 - proto: FlippoLighter entities: - uid: 5114 @@ -115577,7 +115801,8 @@ entities: parent: 8364 - type: DeviceNetwork deviceLists: - - 25517 + - 2468 + - 2 - type: AtmosPipeColor color: '#0055CCFF' - uid: 23949 @@ -116025,6 +116250,9 @@ entities: - type: Transform pos: 40.5,-27.5 parent: 8364 + - type: DeviceNetwork + deviceLists: + - 2 - type: AtmosPipeColor color: '#0055CCFF' - uid: 24672 @@ -116033,6 +116261,9 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,-28.5 parent: 8364 + - type: DeviceNetwork + deviceLists: + - 2 - type: AtmosPipeColor color: '#0055CCFF' - uid: 24706 @@ -117214,7 +117445,8 @@ entities: parent: 8364 - type: DeviceNetwork deviceLists: - - 25517 + - 2468 + - 2 - type: AtmosPipeColor color: '#990000FF' - uid: 22003 @@ -117854,6 +118086,9 @@ entities: rot: 3.141592653589793 rad pos: 41.5,-27.5 parent: 8364 + - type: DeviceNetwork + deviceLists: + - 2 - type: AtmosPipeColor color: '#990000FF' - uid: 24674 @@ -117862,6 +118097,9 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,-26.5 parent: 8364 + - type: DeviceNetwork + deviceLists: + - 2 - type: AtmosPipeColor color: '#990000FF' - uid: 24709 @@ -126048,11 +126286,57 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,-24.5 parent: 8364 + - uid: 28255 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 92.5,-30.5 + parent: 8364 + - uid: 28258 + components: + - type: Transform + pos: 41.5,42.5 + parent: 8364 + - uid: 28259 + components: + - type: Transform + pos: 40.5,42.5 + parent: 8364 + - uid: 28260 + components: + - type: Transform + pos: 39.5,42.5 + parent: 8364 + - uid: 28261 + components: + - type: Transform + pos: 38.5,42.5 + parent: 8364 - uid: 28262 components: - type: Transform pos: 30.5,43.5 parent: 8364 + - uid: 28264 + components: + - type: Transform + pos: 37.5,42.5 + parent: 8364 + - uid: 28265 + components: + - type: Transform + pos: 36.5,42.5 + parent: 8364 + - uid: 28266 + components: + - type: Transform + pos: 36.5,40.5 + parent: 8364 + - uid: 28267 + components: + - type: Transform + pos: 35.5,40.5 + parent: 8364 - uid: 28268 components: - type: Transform @@ -126093,6 +126377,51 @@ entities: - type: Transform pos: 28.5,45.5 parent: 8364 + - uid: 28276 + components: + - type: Transform + pos: 34.5,40.5 + parent: 8364 + - uid: 28277 + components: + - type: Transform + pos: 33.5,40.5 + parent: 8364 + - uid: 28278 + components: + - type: Transform + pos: 32.5,40.5 + parent: 8364 + - uid: 28279 + components: + - type: Transform + pos: 32.5,42.5 + parent: 8364 + - uid: 28280 + components: + - type: Transform + pos: 34.5,42.5 + parent: 8364 + - uid: 28281 + components: + - type: Transform + pos: 38.5,40.5 + parent: 8364 + - uid: 28282 + components: + - type: Transform + pos: 42.5,42.5 + parent: 8364 + - uid: 28310 + components: + - type: Transform + pos: -13.5,3.5 + parent: 8364 + - uid: 28312 + components: + - type: Transform + pos: -13.5,2.5 + parent: 8364 - proto: GrilleBroken entities: - uid: 453 @@ -126336,6 +126665,53 @@ entities: rot: 1.5707963267948966 rad pos: -13.5,-83.5 parent: 8364 +- proto: GrilleSpawner + entities: + - uid: 26956 + components: + - type: Transform + pos: 33.5,42.5 + parent: 8364 + - uid: 28283 + components: + - type: Transform + pos: 31.5,40.5 + parent: 8364 + - uid: 28284 + components: + - type: Transform + pos: 31.5,42.5 + parent: 8364 + - uid: 28285 + components: + - type: Transform + pos: 35.5,42.5 + parent: 8364 + - uid: 28286 + components: + - type: Transform + pos: 34.5,41.5 + parent: 8364 + - uid: 28287 + components: + - type: Transform + pos: 37.5,40.5 + parent: 8364 + - uid: 28288 + components: + - type: Transform + pos: 39.5,41.5 + parent: 8364 + - uid: 28289 + components: + - type: Transform + pos: 42.5,41.5 + parent: 8364 + - uid: 28290 + components: + - type: Transform + pos: 44.5,40.5 + parent: 8364 - proto: GunSafeDisabler entities: - uid: 9207 @@ -127542,11 +127918,11 @@ entities: - type: Transform pos: 58.5,-38.5 parent: 8364 - - uid: 10423 + - uid: 28250 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 75.5,-26.5 + rot: 1.5707963267948966 rad + pos: 68.5,-18.5 parent: 8364 - proto: IntercomSecurity entities: @@ -129671,7 +130047,7 @@ entities: - uid: 20207 components: - type: Transform - pos: 79.5,-29.5 + pos: 80.5,-29.5 parent: 8364 - uid: 21199 components: @@ -132396,6 +132772,13 @@ entities: - type: Transform pos: -0.5,-14.5 parent: 8364 +- proto: PlushieArachind + entities: + - uid: 28248 + components: + - type: Transform + pos: 14.575281,-54.354546 + parent: 8364 - proto: PlushieBee entities: - uid: 6609 @@ -137482,14 +137865,6 @@ entities: parent: 8364 - type: ApcPowerReceiver powerLoad: 0 - - uid: 20002 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 92.5,-29.5 - parent: 8364 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 20004 components: - type: Transform @@ -137637,6 +138012,12 @@ entities: parent: 8364 - type: ApcPowerReceiver powerLoad: 0 + - uid: 26577 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 92.5,-30.5 + parent: 8364 - uid: 27459 components: - type: Transform @@ -138629,10 +139010,11 @@ entities: parent: 8364 - proto: RandomArtifactSpawner entities: - - uid: 25983 + - uid: 20071 components: - type: Transform - pos: 78.5,-29.5 + rot: 1.5707963267948966 rad + pos: 79.5,-30.5 parent: 8364 - proto: RandomArtifactSpawner20 entities: @@ -144360,6 +144742,12 @@ entities: - type: Transform pos: -0.5,-65.5 parent: 8364 + - uid: 20181 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 92.5,-30.5 + parent: 8364 - uid: 20196 components: - type: Transform @@ -144728,6 +145116,16 @@ entities: - type: Transform pos: 60.5,-69.5 parent: 8364 + - uid: 28311 + components: + - type: Transform + pos: -13.5,3.5 + parent: 8364 + - uid: 28316 + components: + - type: Transform + pos: -13.5,2.5 + parent: 8364 - proto: RemoteSignaller entities: - uid: 5286 @@ -144839,19 +145237,6 @@ entities: - type: Transform pos: -3.5,-23.2 parent: 8364 -- proto: RobustHarvestChemistryBottle - entities: - - uid: 13505 - components: - - type: Transform - pos: -19.744875,7.720537 - parent: 8364 - - uid: 13547 - components: - - type: Transform - rot: 2.9154674848541617E-05 rad - pos: -22.735086,7.7025566 - parent: 8364 - proto: RockGuitarInstrument entities: - uid: 25902 @@ -146057,21 +146442,6 @@ entities: - Pressed: Toggle 5223: - Pressed: Toggle - - uid: 2468 - components: - - type: MetaData - name: Blast Doors - - type: Transform - pos: 70.5,-38.5 - parent: 8364 - - type: DeviceLinkSource - linkedPorts: - 20853: - - Pressed: Toggle - 20852: - - Pressed: Toggle - 20851: - - Pressed: Toggle - uid: 2638 components: - type: Transform @@ -146327,7 +146697,7 @@ entities: linkedPorts: 20182: - Pressed: Toggle - 20181: + 4458: - Pressed: Toggle 20180: - Pressed: Toggle @@ -146360,6 +146730,20 @@ entities: - Pressed: Toggle 10835: - Pressed: Toggle + - uid: 25517 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 70.5,-38.5 + parent: 8364 + - type: DeviceLinkSource + linkedPorts: + 20853: + - Pressed: Toggle + 20852: + - Pressed: Toggle + 20851: + - Pressed: Toggle - uid: 26795 components: - type: Transform @@ -146479,6 +146863,22 @@ entities: - Pressed: Toggle 13849: - Pressed: Toggle + - uid: 28254 + components: + - type: MetaData + name: Spacing Doors + - type: Transform + rot: 1.5707963267948966 rad + pos: 75.5,-25.5 + parent: 8364 + - type: DeviceLinkSource + linkedPorts: + 20002: + - Pressed: Toggle + 28251: + - Pressed: Toggle + 28253: + - Pressed: Toggle - proto: SignalButtonDirectional entities: - uid: 10732 @@ -148240,6 +148640,11 @@ entities: - type: Transform pos: -1.5,-11.5 parent: 8364 + - uid: 25983 + components: + - type: Transform + pos: -20.5,-72.5 + parent: 8364 - uid: 27765 components: - type: Transform @@ -151109,13 +151514,6 @@ entities: loadingNetworkDemand: 260.0401 currentSupply: 260.0401 supplyRampPosition: 260.0401 - - uid: 4458 - components: - - type: MetaData - name: Gravity & Anchor Substation - - type: Transform - pos: -20.5,-72.5 - parent: 8364 - uid: 5893 components: - type: MetaData @@ -151212,6 +151610,13 @@ entities: - type: Transform pos: 8.5,-78.5 parent: 8364 + - uid: 27281 + components: + - type: MetaData + name: Gravity Gen/Station Anchor Substation + - type: Transform + pos: -20.5,-73.5 + parent: 8364 - proto: SubstationMachineCircuitboard entities: - uid: 12456 @@ -151277,6 +151682,16 @@ entities: - type: Transform pos: 72.5,-34.5 parent: 8364 + - uid: 28313 + components: + - type: Transform + pos: -14.5,3.5 + parent: 8364 + - uid: 28314 + components: + - type: Transform + pos: -14.5,2.5 + parent: 8364 - proto: SuitStorageHOS entities: - uid: 25002 @@ -170787,11 +171202,6 @@ entities: - type: Transform pos: 46.5,12.5 parent: 8364 - - uid: 1719 - components: - - type: Transform - pos: 92.5,-30.5 - parent: 8364 - uid: 1728 components: - type: Transform @@ -179422,6 +179832,11 @@ entities: rot: -1.5707963267948966 rad pos: -1.5,-20.5 parent: 8364 + - uid: 28315 + components: + - type: Transform + pos: -14.5,3.5 + parent: 8364 - proto: Wirecutter entities: - uid: 11686 diff --git a/Resources/Maps/convex.yml b/Resources/Maps/convex.yml index 422dedbaaa..0f4b6c133b 100644 --- a/Resources/Maps/convex.yml +++ b/Resources/Maps/convex.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 248.0.0 + engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/11/2025 05:03:59 - entityCount: 37722 + time: 03/29/2025 01:24:46 + entityCount: 37721 maps: - 353 grids: @@ -14312,7 +14312,7 @@ entities: 1: 2036 16,31: 0: 7 - 5: 60928 + 2: 60928 13,33: 1: 30583 13,34: @@ -14329,32 +14329,32 @@ entities: 1: 61437 15,34: 0: 4371 - 2: 52224 - 3: 8 + 3: 52224 + 4: 8 15,35: 0: 8977 - 2: 12 - 3: 34816 + 3: 12 + 4: 34816 15,33: 0: 8742 - 3: 34816 + 4: 34816 15,36: 0: 17954 - 3: 8 + 4: 8 16,32: - 4: 30464 - 5: 14 + 5: 30464 + 2: 14 16,33: - 4: 7 - 3: 13056 + 5: 7 + 4: 13056 0: 34816 16,34: - 3: 3 - 2: 4352 + 4: 3 + 3: 4352 0: 52360 16,35: - 2: 1 - 3: 13056 + 3: 1 + 4: 13056 0: 34956 13,36: 1: 32624 @@ -14373,13 +14373,13 @@ entities: 1: 8739 0: 2184 16,36: - 3: 30467 + 4: 30467 0: 8 16,37: - 3: 60935 + 4: 60935 16,38: 0: 3840 - 3: 14 + 4: 14 16,39: 1: 47295 17,2: @@ -14656,9 +14656,9 @@ entities: 1: 13107 0: 34944 20,32: - 3: 65504 + 4: 65504 20,33: - 3: 239 + 4: 239 1: 61440 20,34: 1: 65535 @@ -14973,7 +14973,7 @@ entities: 1: 49073 21,32: 1: 34952 - 3: 4352 + 4: 4352 0: 8736 22,32: 1: 48059 @@ -14994,7 +14994,7 @@ entities: 24,31: 1: 53503 21,33: - 3: 1 + 4: 1 1: 64136 0: 34 21,34: @@ -15330,59 +15330,59 @@ entities: 24,35: 1: 1638 25,32: - 3: 4592 + 4: 4592 0: 58880 25,33: - 3: 4369 + 4: 4369 0: 25828 25,34: - 3: 6007 + 4: 6007 0: 24576 25,35: - 3: 4369 + 4: 4369 0: 58596 25,36: - 3: 241 + 4: 241 0: 6 1: 28672 26,32: - 3: 35056 + 4: 35056 0: 29952 26,33: 0: 4593 26,35: 0: 29169 - 3: 32768 + 4: 32768 26,34: 0: 4465 - 3: 2184 + 4: 2184 26,36: 0: 5 - 3: 248 + 4: 248 1: 61440 27,32: - 3: 13296 + 4: 13296 0: 50176 27,33: 0: 4592 27,34: - 3: 819 + 4: 819 0: 4288 27,35: 0: 49393 - 3: 12288 + 4: 12288 27,36: - 3: 243 + 4: 243 0: 4 1: 61440 28,32: - 3: 240 + 4: 240 0: 64768 28,33: 0: 54773 28,34: 0: 53521 - 3: 3276 + 4: 3276 28,35: 0: 62965 24,37: @@ -15400,7 +15400,7 @@ entities: 27,38: 1: 65423 28,36: - 3: 240 + 4: 240 1: 56320 0: 13 28,37: @@ -15651,7 +15651,7 @@ entities: 1: 28927 29,32: 1: 1092 - 3: 4368 + 4: 4368 30,29: 1: 65527 30,30: @@ -15677,16 +15677,16 @@ entities: 32,31: 1: 49075 29,33: - 3: 4369 + 4: 4369 1: 52428 29,34: - 3: 4369 + 4: 4369 1: 52428 29,35: - 3: 4369 + 4: 4369 1: 3276 29,36: - 3: 17 + 4: 17 1: 25668 30,34: 1: 61423 @@ -16164,6 +16164,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 6666.982 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -16209,21 +16224,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 6666.982 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 235 moles: @@ -17289,8 +17289,6 @@ entities: - 18415 - 29309 - 25080 - - 6702 - - 6703 - 22419 - 6828 - 1363 @@ -126645,22 +126643,6 @@ entities: deviceLists: - 29482 - 29481 - - uid: 6702 - components: - - type: Transform - pos: 153.5,91.5 - parent: 1 - - type: DeviceNetwork - deviceLists: - - 15662 - - uid: 6703 - components: - - type: Transform - pos: 153.5,90.5 - parent: 1 - - type: DeviceNetwork - deviceLists: - - 15662 - uid: 6708 components: - type: Transform @@ -189599,6 +189581,9 @@ entities: rot: -25.132741228718352 rad pos: 152.48033,103.53659 parent: 1 + - type: CollisionWake + enabled: False + - type: Conveyed - proto: MedicalBed entities: - uid: 17649 @@ -189670,6 +189655,9 @@ entities: - type: Transform pos: 148.54587,98.56909 parent: 1 + - type: CollisionWake + enabled: False + - type: Conveyed - uid: 26882 components: - type: Transform @@ -190716,6 +190704,9 @@ entities: rot: -50.265482457436725 rad pos: 148.54797,95.561005 parent: 1 + - type: CollisionWake + enabled: False + - type: Conveyed - uid: 16060 components: - type: Transform @@ -191026,6 +191017,13 @@ entities: - type: Transform pos: 43.5,24.5 parent: 1 +- proto: PlushieArachind + entities: + - uid: 6702 + components: + - type: Transform + pos: 128.51471,136.496 + parent: 1 - proto: PlushieRGBee entities: - uid: 9265 @@ -215266,6 +215264,7 @@ entities: - type: Transform pos: 152.5,73.5 parent: 1 + - type: Conveyed - uid: 26750 components: - type: Transform @@ -215279,6 +215278,7 @@ entities: rot: -1.5707963267948966 rad pos: 153.5,74.5 parent: 1 + - type: Conveyed - proto: TegCenter entities: - uid: 36737 diff --git a/Resources/Maps/fland.yml b/Resources/Maps/fland.yml index 5946a3c4b4..43761ac5e3 100644 --- a/Resources/Maps/fland.yml +++ b/Resources/Maps/fland.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 247.2.0 + engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/07/2025 20:05:06 - entityCount: 36004 + time: 03/29/2025 03:57:17 + entityCount: 36017 maps: - 1 grids: @@ -19518,7 +19518,7 @@ entities: pos: -15.5,-4.5 parent: 13329 - type: Door - secondsUntilStateChange: -10532.307 + secondsUntilStateChange: -11435.99 state: Opening - type: DeviceLinkSource lastSignals: @@ -30925,6 +30925,17 @@ entities: rot: -1.5707963267948966 rad pos: 127.5,-2.5 parent: 13329 + - uid: 36010 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 91.5,-13.5 + parent: 13329 + - uid: 36011 + components: + - type: Transform + pos: 91.5,-13.5 + parent: 13329 - proto: ButtonFrameCautionSecurity entities: - uid: 8648 @@ -46444,6 +46455,11 @@ entities: - type: Transform pos: 101.5,-31.5 parent: 13329 + - uid: 25543 + components: + - type: Transform + pos: 30.5,37.5 + parent: 13329 - uid: 25626 components: - type: Transform @@ -47314,6 +47330,16 @@ entities: - type: Transform pos: 47.5,-55.5 parent: 13329 + - uid: 26179 + components: + - type: Transform + pos: 29.5,37.5 + parent: 13329 + - uid: 26180 + components: + - type: Transform + pos: 28.5,37.5 + parent: 13329 - uid: 26356 components: - type: Transform @@ -54702,22 +54728,7 @@ entities: - uid: 35387 components: - type: Transform - pos: 31.5,37.5 - parent: 13329 - - uid: 35388 - components: - - type: Transform - pos: 30.5,37.5 - parent: 13329 - - uid: 35389 - components: - - type: Transform - pos: 29.5,37.5 - parent: 13329 - - uid: 35390 - components: - - type: Transform - pos: 28.5,37.5 + pos: 27.5,37.5 parent: 13329 - uid: 35481 components: @@ -54914,6 +54925,21 @@ entities: - type: Transform pos: 124.5,57.5 parent: 13329 + - uid: 36005 + components: + - type: Transform + pos: 26.5,37.5 + parent: 13329 + - uid: 36006 + components: + - type: Transform + pos: 25.5,37.5 + parent: 13329 + - uid: 36007 + components: + - type: Transform + pos: 24.5,37.5 + parent: 13329 - proto: CableApcStack entities: - uid: 12137 @@ -68630,6 +68656,21 @@ entities: - type: Transform pos: 39.5,0.5 parent: 13329 + - uid: 36015 + components: + - type: Transform + pos: 98.5,-37.5 + parent: 13329 + - uid: 36016 + components: + - type: Transform + pos: 98.5,-38.5 + parent: 13329 + - uid: 36017 + components: + - type: Transform + pos: 98.5,-39.5 + parent: 13329 - proto: CableHVStack entities: - uid: 26657 @@ -97664,6 +97705,12 @@ entities: - type: Transform pos: -31.5,62.5 parent: 13329 + - uid: 36014 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 98.5,-39.5 + parent: 13329 - proto: ComputerRadar entities: - uid: 11641 @@ -116433,12 +116480,16 @@ entities: - type: Transform pos: 131.71098,-3.6476665 parent: 13329 + - type: CollisionWake + enabled: False - type: Conveyed - uid: 34758 components: - type: Transform pos: 131.32036,-3.2101665 parent: 13329 + - type: CollisionWake + enabled: False - type: Conveyed - proto: FoodBoxDonkpocketPizza entities: @@ -116745,6 +116796,8 @@ entities: rot: -1.5707963267948966 rad pos: 130.64848,-3.0851665 parent: 13329 + - type: CollisionWake + enabled: False - type: Conveyed - proto: FoodTinMRETrash entities: @@ -169040,6 +169093,13 @@ entities: - type: Transform pos: 5.4847407,11.716763 parent: 13329 +- proto: PlushieArachind + entities: + - uid: 36012 + components: + - type: Transform + pos: 99.55299,-39.23832 + parent: 13329 - proto: PlushieBee entities: - uid: 12133 @@ -169435,6 +169495,11 @@ entities: - type: Transform pos: 99.5,-51.5 parent: 13329 + - uid: 36008 + components: + - type: Transform + pos: 29.5,38.5 + parent: 13329 - proto: PosterContrabandVoteWeh entities: - uid: 31602 @@ -170605,6 +170670,20 @@ entities: - type: Transform pos: 53.51421,-41.376694 parent: 13329 +- proto: PoweredDimSmallLight + entities: + - uid: 35388 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 95.5,-16.5 + parent: 13329 + - uid: 35389 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 91.5,-16.5 + parent: 13329 - proto: Poweredlight entities: - uid: 1446 @@ -174692,22 +174771,6 @@ entities: parent: 13329 - type: ApcPowerReceiver powerLoad: 0 - - uid: 26179 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 95.5,-16.5 - parent: 13329 - - type: ApcPowerReceiver - powerLoad: 0 - - uid: 26180 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 91.5,-16.5 - parent: 13329 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 26181 components: - type: Transform @@ -185098,19 +185161,6 @@ entities: - Pressed: Toggle 24021: - Pressed: Toggle - - uid: 25543 - components: - - type: Transform - pos: 91.5,-13.5 - parent: 13329 - - type: DeviceLinkSource - linkedPorts: - 25540: - - Pressed: Toggle - 25541: - - Pressed: Toggle - 25542: - - Pressed: Toggle - uid: 25903 components: - type: Transform @@ -185537,6 +185587,22 @@ entities: currentLabel: Cell Blast Doors - type: NameModifier baseName: Switch (Cell Blast Doors) + - uid: 35390 + components: + - type: Transform + pos: 91.5,-13.5 + parent: 13329 + - type: DeviceLinkSource + linkedPorts: + 25540: + - On: Open + - Off: Close + 25541: + - On: Open + - Off: Close + 25542: + - On: Open + - Off: Close - uid: 35971 components: - type: MetaData @@ -185607,6 +185673,23 @@ entities: currentLabel: Cell Blast Doors - type: NameModifier baseName: Switch (Cell Blast Doors) + - uid: 36009 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 91.5,-13.5 + parent: 13329 + - type: DeviceLinkSource + linkedPorts: + 25540: + - On: Open + - Off: Close + 25541: + - Off: Close + - On: Open + 25542: + - On: Open + - Off: Close - proto: SignAnomaly entities: - uid: 20083 @@ -191692,6 +191775,12 @@ entities: - type: Transform pos: 48.5,-50.5 parent: 13329 + - uid: 36013 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 99.49049,-39.26957 + parent: 13329 - proto: StoolBar entities: - uid: 194 diff --git a/Resources/Maps/meta.yml b/Resources/Maps/meta.yml index 6c82e84365..bfd02ba6de 100644 --- a/Resources/Maps/meta.yml +++ b/Resources/Maps/meta.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Map - engineVersion: 247.2.0 + engineVersion: 250.0.0 forkId: "" forkVersion: "" - time: 03/07/2025 19:53:37 - entityCount: 28709 + time: 03/29/2025 04:10:56 + entityCount: 28717 maps: - 951 grids: @@ -6885,9 +6885,11 @@ entities: 0,10: 0: 30503 -1,10: - 0: 65319 + 10: 1 + 0: 65318 0,11: - 0: 887 + 0: 631 + 6: 256 1: 32768 -1,11: 0: 4095 @@ -6951,7 +6953,8 @@ entities: -2,9: 0: 63351 -2,10: - 0: 30471 + 0: 29447 + 6: 1024 -2,11: 0: 1919 -2,12: @@ -7237,7 +7240,7 @@ entities: 0: 65520 11,6: 0: 3903 - 10: 192 + 11: 192 11,7: 0: 30549 11,8: @@ -7565,7 +7568,7 @@ entities: 1: 61440 16,-4: 1: 8738 - 11: 2184 + 12: 2184 16,-3: 1: 8738 5: 2184 @@ -7576,7 +7579,7 @@ entities: 1: 8738 5: 2184 17,-4: - 11: 819 + 12: 819 5: 2176 1: 32768 17,-3: @@ -8833,6 +8836,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14975 + moles: + - 20.067156 + - 75.49073 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -9042,13 +9060,6 @@ entities: container: 18691 - proto: ActionToggleLight entities: - - uid: 7435 - components: - - type: Transform - parent: 7385 - - type: InstantAction - originalIconColor: '#FFFFFFFF' - container: 7385 - uid: 9671 components: - type: Transform @@ -12384,7 +12395,7 @@ entities: pos: 11.5,29.5 parent: 5350 - type: Door - secondsUntilStateChange: -3620.7197 + secondsUntilStateChange: -4233.237 state: Opening - type: DeviceLinkSource lastSignals: @@ -14219,6 +14230,11 @@ entities: - type: Transform pos: 39.5,24.5 parent: 5350 + - uid: 7224 + components: + - type: Transform + pos: -48.5,-28.5 + parent: 5350 - uid: 8150 components: - type: Transform @@ -14678,12 +14694,6 @@ entities: - type: Transform pos: -29.5,15.5 parent: 5350 - - type: Door - secondsUntilStateChange: -257550.02 - state: Opening - - type: DeviceLinkSource - lastSignals: - DoorStatus: True - proto: AirlockResearchDirectorGlassLocked entities: - uid: 20369 @@ -14943,7 +14953,7 @@ entities: pos: -4.5,53.5 parent: 5350 - type: Door - secondsUntilStateChange: -112203.75 + secondsUntilStateChange: -112816.266 state: Opening - type: DeviceLinkSink invokeCounter: 2 @@ -17375,14 +17385,6 @@ entities: rot: 3.141592653589793 rad pos: 104.5,-14.5 parent: 5350 - - uid: 25968 - components: - - type: MetaData - name: AI Sat West APC - - type: Transform - rot: 3.141592653589793 rad - pos: 98.5,-1.5 - parent: 5350 - uid: 27589 components: - type: MetaData @@ -17402,7 +17404,7 @@ entities: - uid: 28239 components: - type: MetaData - name: AI Sat East APC + name: AI Sat West APC - type: Transform rot: -1.5707963267948966 rad pos: 101.5,1.5 @@ -21923,11 +21925,6 @@ entities: parent: 5350 - proto: Barricade entities: - - uid: 17522 - components: - - type: Transform - pos: -49.5,-28.5 - parent: 5350 - uid: 17523 components: - type: Transform @@ -21956,6 +21953,11 @@ entities: rot: 1.5707963267948966 rad pos: 35.5,-41.5 parent: 5350 + - uid: 7131 + components: + - type: Transform + pos: -48.5,-28.5 + parent: 5350 - uid: 15470 components: - type: Transform @@ -39520,11 +39522,6 @@ entities: - type: Transform pos: 104.5,-14.5 parent: 5350 - - uid: 25994 - components: - - type: Transform - pos: 100.5,-1.5 - parent: 5350 - uid: 25997 components: - type: Transform @@ -43289,6 +43286,11 @@ entities: - type: Transform pos: 31.5,-38.5 parent: 5350 + - uid: 6286 + components: + - type: Transform + pos: 10.5,9.5 + parent: 5350 - uid: 6338 components: - type: Transform @@ -43424,6 +43426,21 @@ entities: - type: Transform pos: -16.5,38.5 parent: 5350 + - uid: 7191 + components: + - type: Transform + pos: 11.5,9.5 + parent: 5350 + - uid: 7209 + components: + - type: Transform + pos: 9.5,9.5 + parent: 5350 + - uid: 7218 + components: + - type: Transform + pos: 8.5,9.5 + parent: 5350 - uid: 7223 components: - type: Transform @@ -43444,11 +43461,26 @@ entities: - type: Transform pos: 10.5,-56.5 parent: 5350 + - uid: 7385 + components: + - type: Transform + pos: 7.5,9.5 + parent: 5350 + - uid: 7435 + components: + - type: Transform + pos: 5.5,9.5 + parent: 5350 - uid: 7448 components: - type: Transform pos: 13.5,-56.5 parent: 5350 + - uid: 7462 + components: + - type: Transform + pos: 4.5,9.5 + parent: 5350 - uid: 7479 components: - type: Transform @@ -43469,6 +43501,16 @@ entities: - type: Transform pos: -18.5,24.5 parent: 5350 + - uid: 7545 + components: + - type: Transform + pos: 3.5,9.5 + parent: 5350 + - uid: 7757 + components: + - type: Transform + pos: 2.5,9.5 + parent: 5350 - uid: 7908 components: - type: Transform @@ -43479,6 +43521,11 @@ entities: - type: Transform pos: 8.5,-56.5 parent: 5350 + - uid: 7939 + components: + - type: Transform + pos: 1.5,9.5 + parent: 5350 - uid: 7945 components: - type: Transform @@ -46729,6 +46776,11 @@ entities: - type: Transform pos: -38.5,-46.5 parent: 5350 + - uid: 17522 + components: + - type: Transform + pos: 0.5,9.5 + parent: 5350 - uid: 17648 components: - type: Transform @@ -49044,6 +49096,11 @@ entities: - type: Transform pos: 68.5,29.5 parent: 5350 + - uid: 23973 + components: + - type: Transform + pos: -0.5,9.5 + parent: 5350 - uid: 24059 components: - type: Transform @@ -49079,6 +49136,11 @@ entities: - type: Transform pos: 16.5,7.5 parent: 5350 + - uid: 24182 + components: + - type: Transform + pos: -1.5,9.5 + parent: 5350 - uid: 24209 components: - type: Transform @@ -49259,6 +49321,16 @@ entities: - type: Transform pos: 25.5,3.5 parent: 5350 + - uid: 25967 + components: + - type: Transform + pos: -2.5,9.5 + parent: 5350 + - uid: 25968 + components: + - type: Transform + pos: -3.5,9.5 + parent: 5350 - uid: 25988 components: - type: Transform @@ -49279,6 +49351,11 @@ entities: - type: Transform pos: 111.5,2.5 parent: 5350 + - uid: 25994 + components: + - type: Transform + pos: -4.5,9.5 + parent: 5350 - uid: 26229 components: - type: Transform @@ -49799,6 +49876,46 @@ entities: - type: Transform pos: -6.5,26.5 parent: 5350 + - uid: 28710 + components: + - type: Transform + pos: -5.5,9.5 + parent: 5350 + - uid: 28711 + components: + - type: Transform + pos: -6.5,9.5 + parent: 5350 + - uid: 28712 + components: + - type: Transform + pos: -7.5,9.5 + parent: 5350 + - uid: 28713 + components: + - type: Transform + pos: -8.5,9.5 + parent: 5350 + - uid: 28714 + components: + - type: Transform + pos: -9.5,9.5 + parent: 5350 + - uid: 28715 + components: + - type: Transform + pos: -10.5,9.5 + parent: 5350 + - uid: 28716 + components: + - type: Transform + pos: -11.5,9.5 + parent: 5350 + - uid: 28717 + components: + - type: Transform + pos: 6.5,9.5 + parent: 5350 - proto: CableHVStack entities: - uid: 1551 @@ -57833,11 +57950,6 @@ entities: - type: Transform pos: 104.5,0.5 parent: 5350 - - uid: 25967 - components: - - type: Transform - pos: 100.5,-1.5 - parent: 5350 - uid: 25970 components: - type: Transform @@ -67457,31 +67569,6 @@ entities: - type: Transform pos: -49.479202,-34.51553 parent: 5350 -- proto: ClothingBeltSecurityFilled - entities: - - uid: 7218 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: GroupExamine - group: - - hoverMessage: "" - contextText: verb-examine-group-other - icon: /Textures/Interface/examine-star.png - components: - - Armor - - ClothingSpeedModifier - entries: - - message: >- - It provides the following protection: - - - [color=orange]Explosion[/color] damage [color=white]to contents[/color] reduced by [color=lightblue]10%[/color]. - priority: 0 - component: Armor - title: null - - type: InsideEntityStorage - proto: ClothingBeltUtility entities: - uid: 5395 @@ -67534,13 +67621,6 @@ entities: parent: 5350 - proto: ClothingEyesGlassesSecurity entities: - - uid: 7209 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - uid: 8206 components: - type: Transform @@ -67731,15 +67811,6 @@ entities: - type: Transform pos: -40.43663,-23.468378 parent: 5350 -- proto: ClothingHandsGlovesCombat - entities: - - uid: 7191 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: ClothingHandsGlovesLatex entities: - uid: 14975 @@ -68534,13 +68605,6 @@ entities: - type: Transform pos: 26.36865,-59.55566 parent: 5350 - - uid: 7545 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: ClothingShoesBootsMagSci entities: - uid: 6381 @@ -70588,6 +70652,7 @@ entities: - type: Transform pos: -41.5,37.5 parent: 5350 + - type: Conveyed - uid: 19846 components: - type: Transform @@ -80910,15 +80975,6 @@ entities: rot: 3.141592653589793 rad pos: 76.5,-27.5 parent: 5350 -- proto: DoorRemoteArmory - entities: - - uid: 7757 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: Dresser entities: - uid: 3195 @@ -81797,17 +81853,6 @@ entities: parent: 5350 - type: PowerConsumer drawRate: 1 - - uid: 23973 - components: - - type: Transform - anchored: False - rot: 1.5707963267948966 rad - pos: 61.5,13.5 - parent: 5350 - - type: Physics - bodyType: Dynamic - - type: PowerConsumer - drawRate: 1 - uid: 24048 components: - type: Transform @@ -84542,7 +84587,7 @@ entities: pos: 31.5,-33.5 parent: 5350 - type: Door - secondsUntilStateChange: -35042.797 + secondsUntilStateChange: -35655.312 state: Closing - uid: 9615 components: @@ -86156,13 +86201,6 @@ entities: parent: 5350 - proto: Flash entities: - - uid: 7384 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - uid: 12066 components: - type: Transform @@ -86255,27 +86293,6 @@ entities: - type: ActionsContainer - proto: FlashlightSeclite entities: - - uid: 7385 - components: - - type: Transform - parent: 6696 - - type: HandheldLight - toggleActionEntity: 7435 - - type: ContainerContainer - containers: - cell_slot: !type:ContainerSlot - showEnts: False - occludes: True - ent: 7462 - actions: !type:Container - showEnts: False - occludes: True - ents: - - 7435 - - type: Physics - canCollide: False - - type: ActionsContainer - - type: InsideEntityStorage - uid: 9670 components: - type: Transform @@ -116589,8 +116606,6 @@ entities: parent: 5350 - type: GasThermoMachine targetTemperature: 200.15 - - type: ApcPowerReceiver - powerDisabled: False - uid: 22353 components: - type: Transform @@ -129631,15 +129646,6 @@ entities: - type: Transform pos: -50.5,-14.5 parent: 5350 -- proto: HoloprojectorSecurity - entities: - - uid: 7939 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: HospitalCurtainsOpen entities: - uid: 4105 @@ -131792,6 +131798,24 @@ entities: anchored: True pos: 0.5,46.5 parent: 5350 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - type: Physics bodyType: Static - uid: 7688 @@ -131818,24 +131842,21 @@ entities: parent: 5350 - type: Physics bodyType: Static -- proto: LockerWarden +- proto: LockerWardenFilled entities: - uid: 6696 components: - type: Transform - anchored: True pos: -3.5,40.5 parent: 5350 - - type: Physics - bodyType: Static - type: EntityStorage air: volume: 200 immutable: False - temperature: 293.14673 + temperature: 293.14676 moles: - - 1.8839531 - - 7.0872526 + - 1.7449701 + - 6.5644107 - 0 - 0 - 0 @@ -131846,26 +131867,6 @@ entities: - 0 - 0 - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 7939 - - 7385 - - 7384 - - 7224 - - 7218 - - 7209 - - 7191 - - 7131 - - 7545 - - 7757 - paper_label: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - proto: LockerWeldingSuppliesFilled entities: - uid: 6288 @@ -136565,12 +136566,6 @@ entities: parent: 5350 - proto: PowerCellHigh entities: - - uid: 7462 - components: - - type: Transform - parent: 7385 - - type: Physics - canCollide: False - uid: 9672 components: - type: Transform @@ -141838,6 +141833,11 @@ entities: parent: 5350 - proto: RandomPosterAny entities: + - uid: 7384 + components: + - type: Transform + pos: 27.5,34.5 + parent: 5350 - uid: 13743 components: - type: Transform @@ -141933,11 +141933,6 @@ entities: - type: Transform pos: 23.5,30.5 parent: 5350 - - uid: 24182 - components: - - type: Transform - pos: 26.5,34.5 - parent: 5350 - uid: 24183 components: - type: Transform @@ -146129,15 +146124,6 @@ entities: - type: Transform pos: -34.732925,-41.207012 parent: 5350 -- proto: RubberStampWarden - entities: - - uid: 7131 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: SalvageMagnet entities: - uid: 6114 @@ -154057,6 +154043,24 @@ entities: - type: Transform pos: -5.5,42.5 parent: 5350 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - uid: 6512 components: - type: Transform @@ -160172,11 +160176,13 @@ entities: rot: -1.5707963267948966 rad pos: -24.5,41.5 parent: 5350 + - type: Conveyed - uid: 28246 components: - type: Transform pos: -23.5,46.5 parent: 5350 + - type: Conveyed - proto: TegCenter entities: - uid: 26997 @@ -179853,13 +179859,6 @@ entities: - type: Transform pos: 9.465627,24.685179 parent: 5350 - - uid: 7224 - components: - - type: Transform - parent: 6696 - - type: Physics - canCollide: False - - type: InsideEntityStorage - proto: WeaponDisablerPractice entities: - uid: 22293 @@ -185226,18 +185225,13 @@ entities: parent: 5350 - proto: WoodDoor entities: - - uid: 6286 - components: - - type: Transform - pos: -48.5,-28.5 - parent: 5350 - uid: 17569 components: - type: Transform pos: -28.5,-5.5 parent: 5350 - type: Door - secondsUntilStateChange: -40754.707 + secondsUntilStateChange: -41367.223 state: Opening - uid: 17570 components: diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml index 65c8d5ccea..7d9fe7fb59 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/medical.yml @@ -1,74 +1,79 @@ -- type: entity - id: LockerMedicineFilled - suffix: Filled - parent: LockerMedicine - components: - - type: StorageFill - contents: - - id: BoxSyringe - - id: ChemistryBottleEpinephrine - amount: 1 - - id: Brutepack - amount: 2 - - id: Ointment - amount: 2 - - id: Bloodpack - amount: 2 - - id: Gauze +- type: entityTable + id: LockerFillMedicine + table: !type:AllSelector + children: + - id: BoxSyringe + - id: ChemistryBottleEpinephrine + - id: Brutepack + amount: !type:ConstantNumberSelector + value: 2 + - id: Ointment + amount: !type:ConstantNumberSelector + value: 2 + - id: Bloodpack + amount: !type:ConstantNumberSelector + value: 2 + - id: Gauze - type: entity + parent: LockerMedicine + id: LockerMedicineFilled + suffix: Filled + components: + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: LockerFillMedicine + +- type: entity + parent: LockerWallMedical id: LockerWallMedicalFilled name: medicine wall locker suffix: Filled - parent: LockerWallMedical components: - - type: StorageFill - contents: - - id: BoxSyringe - - id: ChemistryBottleEpinephrine - amount: 1 - - id: Brutepack - amount: 2 - - id: Ointment - amount: 2 - - id: Bloodpack - amount: 2 - - id: Gauze + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: LockerFillMedicine +- type: entityTable + id: LockerFillMedicalDoctor + table: !type:AllSelector + children: + - id: HandheldHealthAnalyzer + prob: 0.6 + - id: ClothingHeadMirror + prob: 0.1 + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingEyesHudMedical + - !type:GroupSelector + children: + - id: ClothingHeadHatSurgcapGreen + weight: 0.1 + - id: ClothingHeadHatSurgcapPurple + weight: 0.05 + - id: ClothingHeadHatSurgcapBlue + weight: 0.90 + - !type:GroupSelector + children: + - id: UniformScrubsColorBlue + weight: 0.5 + - id: UniformScrubsColorGreen + weight: 0.1 + - id: UniformScrubsColorPurple + weight: 0.05 + - id: ClothingMaskSterile - type: entity + parent: LockerMedical id: LockerMedicalFilled suffix: Filled - parent: LockerMedical components: - - type: StorageFill - contents: - - id: HandheldHealthAnalyzer - prob: 0.6 - - id: ClothingHeadMirror - prob: 0.1 - - id: ClothingHandsGlovesLatex - - id: ClothingHeadsetMedical - - id: ClothingEyesHudMedical - - id: ClothingHeadHatSurgcapGreen - prob: 0.1 - orGroup: Surgcaps - - id: ClothingHeadHatSurgcapPurple - prob: 0.05 - orGroup: Surgcaps - - id: ClothingHeadHatSurgcapBlue - prob: 0.90 - orGroup: Surgcaps - - id: UniformScrubsColorBlue - prob: 0.5 - orGroup: Surgshrubs - - id: UniformScrubsColorGreen - prob: 0.1 - orGroup: Surgshrubs - - id: UniformScrubsColorPurple - prob: 0.05 - orGroup: Surgshrubs - - id: ClothingMaskSterile + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: LockerFillMedicalDoctor - type: entity parent: LockerWallMedical @@ -76,72 +81,64 @@ name: medical doctor's wall locker suffix: Filled components: - - type: StorageFill - contents: - - id: HandheldHealthAnalyzer - prob: 0.6 - - id: ClothingHandsGlovesLatex - - id: ClothingHeadsetMedical - - id: ClothingEyesHudMedical - - id: ClothingHeadHatSurgcapGreen - prob: 0.1 - orGroup: Surgcaps - - id: ClothingHeadHatSurgcapPurple - prob: 0.05 - orGroup: Surgcaps - - id: ClothingHeadHatSurgcapBlue - prob: 0.90 - orGroup: Surgcaps - - id: UniformScrubsColorBlue - prob: 0.5 - orGroup: Surgshrubs - - id: UniformScrubsColorGreen - prob: 0.1 - orGroup: Surgshrubs - - id: UniformScrubsColorPurple - prob: 0.05 - orGroup: Surgshrubs - - id: ClothingMaskSterile + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: LockerFillMedicalDoctor + +- type: entityTable + id: LockerFillChemistry + table: !type:AllSelector + children: + - id: BoxSyringe + - id: BoxBeaker + - id: BoxBeaker + prob: 0.3 + - id: BoxPillCanister + - id: BoxBottle + - id: BoxVial + - id: PlasmaChemistryVial + - id: ChemBag + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingMaskSterile + - id: HandLabeler + prob: 0.5 - type: entity + parent: LockerChemistry id: LockerChemistryFilled suffix: Filled - parent: LockerChemistry components: - - type: StorageFill - contents: - - id: BoxSyringe - - id: BoxBeaker - - id: BoxBeaker - prob: 0.3 - - id: BoxPillCanister - - id: BoxBottle - - id: BoxVial - - id: PlasmaChemistryVial - - id: ChemBag - - id: ClothingHandsGlovesLatex - - id: ClothingHeadsetMedical - - id: ClothingMaskSterile - - id: HandLabeler - prob: 0.5 + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: LockerFillChemistry + +- type: entityTable + id: LockerFillParamedic + table: !type:AllSelector + children: + - id: ClothingOuterHardsuitVoidParamed + - id: ClothingOuterCoatParamedicWB + - id: ClothingHeadHatParamedicsoft + - id: ClothingOuterWinterPara + - id: ClothingUniformJumpsuitParamedic + - id: ClothingUniformJumpskirtParamedic + - id: ClothingEyesHudMedical + - id: ClothingHandsGlovesLatex + - id: ClothingHeadsetMedical + - id: ClothingMaskSterile + - id: HandheldGPSBasic + - id: MedkitFilled + prob: 0.3 - type: entity + parent: LockerParamedic id: LockerParamedicFilled suffix: Filled - parent: LockerParamedic components: - - type: StorageFill - contents: - - id: ClothingOuterHardsuitVoidParamed - - id: ClothingOuterCoatParamedicWB - - id: ClothingHeadHatParamedicsoft - - id: ClothingOuterWinterPara - - id: ClothingUniformJumpsuitParamedic - - id: ClothingUniformJumpskirtParamedic - - id: ClothingEyesHudMedical - - id: ClothingHandsGlovesLatex - - id: ClothingHeadsetMedical - - id: ClothingMaskSterile - - id: HandheldGPSBasic - - id: MedkitFilled - prob: 0.3 + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: LockerFillParamedic diff --git a/Resources/Prototypes/Catalog/thief_toolbox_sets.yml b/Resources/Prototypes/Catalog/thief_toolbox_sets.yml index 7826c1db97..a17cb128a7 100644 --- a/Resources/Prototypes/Catalog/thief_toolbox_sets.yml +++ b/Resources/Prototypes/Catalog/thief_toolbox_sets.yml @@ -6,16 +6,7 @@ sprite: /Textures/Clothing/OuterClothing/Misc/black_hoodie.rsi state: icon content: - - ChameleonPDA - - ClothingUniformJumpsuitChameleon - - ClothingOuterChameleon - - ClothingNeckChameleon - - ClothingMaskGasChameleon - - ClothingHeadHatChameleon - - ClothingEyesChameleon - - ClothingHeadsetChameleon - - ClothingShoesChameleon - - BarberScissors + - ClothingBackpackChameleonFill - ChameleonProjector - FakeMindShieldImplanter - AgentIDCard diff --git a/Resources/Prototypes/Device/devicenet_frequencies.yml b/Resources/Prototypes/Device/devicenet_frequencies.yml index ecdbb3bb4c..64b8c8e687 100644 --- a/Resources/Prototypes/Device/devicenet_frequencies.yml +++ b/Resources/Prototypes/Device/devicenet_frequencies.yml @@ -87,6 +87,30 @@ name: device-frequency-prototype-name-cyborg-control frequency: 1292 +# Turret controllers send data to their turrets on this frequency +- type: deviceFrequency + id: TurretControl + name: device-frequency-prototype-name-turret-control + frequency: 2151 + +# Turrets send data to their controllers on this frequency +- type: deviceFrequency + id: Turret + name: device-frequency-prototype-name-turret + frequency: 2152 + +# AI turret controllers send data to their turrets on this frequency +- type: deviceFrequency + id: TurretControlAI + name: device-frequency-prototype-name-turret-control + frequency: 2153 + +# AI turrets send data to their controllers on this frequency +- type: deviceFrequency + id: TurretAI + name: device-frequency-prototype-name-turret + frequency: 2154 + # This frequency will likely have a LARGE number of listening entities. Please don't broadcast on this frequency. - type: deviceFrequency id: SmartLight #used by powered lights. diff --git a/Resources/Prototypes/Entities/Clothing/Back/smuggler.yml b/Resources/Prototypes/Entities/Clothing/Back/smuggler.yml index c9d7f61890..f5ec4fcd3a 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/smuggler.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/smuggler.yml @@ -37,7 +37,7 @@ id: ClothingBackpackSatchelSmuggler name: smuggler's satchel suffix: Empty - description: A dingy, suspicious looking satchel. + description: A handy, suspicious looking satchel. Just flat enough to fit underneath floor tiles. components: - type: Sprite sprite: Clothing/Back/Satchels/smuggler.rsi @@ -48,7 +48,7 @@ id: ClothingBackpackSatchelSmugglerUnanchored name: smuggler's satchel suffix: Empty, Unanchored - description: A dingy, suspicious looking satchel. + description: A handy, suspicious looking satchel. Just flat enough to fit underneath floor tiles. components: - type: Sprite sprite: Clothing/Back/Satchels/smuggler.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index 20c2488aa7..6f23003c1a 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -171,6 +171,11 @@ fiberMaterial: fibers-leather fiberColor: fibers-brown - type: FingerprintMask + - type: DamageOnInteractProtection + damageProtection: + flatReductions: + Heat: 10 + Caustic: 5 - type: entity parent: ClothingHandsBase diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index c24e1b1b2c..6264748293 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -691,6 +691,17 @@ - type: Clothing sprite: Clothing/Head/Hats/fishcap.rsi +- type: entity + parent: ClothingHeadBase + id: ClothingHeadWehcellentCap + name: wehcellent cap + description: It was a net hat! Tiders wear them all the time! It's got airholes in the back to keep a cross-breeze going and everything! + components: + - type: Sprite + sprite: Clothing/Head/Hats/wehcellentcap.rsi + - type: Clothing + sprite: Clothing/Head/Hats/wehcellentcap.rsi + - type: entity parent: ClothingHeadBase id: ClothingHeadNurseHat diff --git a/Resources/Prototypes/Entities/Clothing/Neck/misc.yml b/Resources/Prototypes/Entities/Clothing/Neck/misc.yml index f712ec1b1d..26071b5146 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/misc.yml @@ -32,17 +32,36 @@ path: /Audio/Items/flashlight_off.ogg - type: entity - parent: ClothingNeckBase + parent: Clothing id: ClothingNeckStethoscope name: stethoscope description: An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing. components: + - type: Item + size: Small - type: Sprite sprite: Clothing/Neck/Misc/stethoscope.rsi + state: icon - type: Clothing sprite: Clothing/Neck/Misc/stethoscope.rsi + quickEquip: true + slots: + - neck - type: Stethoscope +- type: entity + id: ActionStethoscope + name: Listen with stethoscope + components: + - type: EntityTargetAction + icon: + sprite: Clothing/Neck/Misc/stethoscope.rsi + state: icon + event: !type:StethoscopeActionEvent + checkCanInteract: false + priority: -1 + itemIconStyle: BigAction + - type: entity parent: ClothingNeckBase id: ClothingNeckBling @@ -69,18 +88,6 @@ - type: TypingIndicatorClothing proto: lawyer -- type: entity - id: ActionStethoscope - name: Listen with stethoscope - components: - - type: EntityTargetAction - icon: - sprite: Clothing/Neck/Misc/stethoscope.rsi - state: icon - event: !type:StethoscopeActionEvent - checkCanInteract: false - priority: -1 - - type: entity parent: ClothingNeckBase id: Dinkystar diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_single.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_single.yml index 4b7805c3d3..fda7b85b75 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_single.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_single.yml @@ -67,4 +67,5 @@ - FoodBurgerCrazy - FoodPizzaArnoldSlice - FoodPizzaUraniumSlice + - FoodPizzaWorldpeasSlice rareChance: 0.05 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml index 5ac356573c..2a1988d8ad 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml @@ -157,4 +157,5 @@ - PosterLegitSafetyMothHardhat - PosterLegitSafetyMothSSD - PosterLegitOppenhopper + - PosterLegitTyrone chance: 1 diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 0933cd5573..8fecb53818 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -13,6 +13,7 @@ - BypassInteractionRangeChecks - BypassDropChecks - NoConsoleSound + - SilentStorageUser - type: Input context: "aghost" - type: Ghost diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml index 8f476f9263..9fe96a18a1 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml @@ -681,3 +681,55 @@ Quantity: 0.8 - ReagentId: Fiber Quantity: 1.5 + +- type: entity + name: world peazza + parent: FoodPizzaBase + id: FoodPizzaWorldpeas + description: Modern diplomacy in the shape of a disc. + components: + - type: FlavorProfile + flavors: + - bread + - numbingtranquility + - type: Sprite + layers: + - state: worldpeas + - type: SliceableFood + slice: FoodPizzaWorldpeasSlice + - type: SolutionContainerManager + solutions: + food: + maxVol: 45 + reagents: + - ReagentId: Nutriment + Quantity: 20 + - ReagentId: Happiness + Quantity: 12 + - ReagentId: Pax + Quantity: 8 + +- type: entity + name: slice of world peazza + parent: FoodPizzaSliceBase + id: FoodPizzaWorldpeasSlice + description: Dividing the world up is a small price to pay for harmony. + components: + - type: FlavorProfile + flavors: + - bread + - numbingtranquility + - type: Sprite + layers: + - state: worldpeas-slice + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 3.5 + - ReagentId: Happiness + Quantity: 2 + - ReagentId: Pax + Quantity: 1.5 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index fe690d8bd1..7dd402ae6d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -273,6 +273,9 @@ - id: FoodPizzaCotton prob: 0.10 orGroup: Pizza + - id: FoodPizzaWorldpeas + prob: 0.05 + orGroup: Pizza - id: KnifePlastic - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index ac9757edfb..0c79c233a4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -250,7 +250,7 @@ name: death nettle description: This nettle's out for blood. id: DeathNettle - parent: ProduceBase + parent: [ProduceBase, BaseMajorContraband] components: - type: Sprite sprite: Objects/Specific/Hydroponics/death_nettle.rsi @@ -261,24 +261,56 @@ - type: MeleeWeapon damage: types: - Heat: 8.5 - Caustic: 8.5 + Heat: 8 + Caustic: 8 - type: SolutionContainerManager solutions: food: reagents: - ReagentId: SulfuricAcid - Quantity: 3 + Quantity: 15 - ReagentId: FluorosulfuricAcid - Quantity: 3 + Quantity: 15 - type: Produce seedId: deathNettle - type: MeleeChemicalInjector - transferAmount: 2 + transferAmount: 5 solution: food - pierceArmor: false + pierceArmor: true - type: Extractable grindableSolutionName: food + - type: DamageOnInteract + damage: + types: + Heat: 4 + Caustic: 4 + throw: true + throwSpeed: 3 + interactTimer: 2 # Stop the player from spam clicking the entity + ignoreResistances: false + popupText: powered-light-component-burn-hand + interactSound: /Audio/Effects/lightburn.ogg + stunChance: 0.10 + stunSeconds: 1.5 + - type: Damageable + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 25 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Voice/Diona/diona_salute.ogg + params: + volume: -5 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: DamageOnHit + damage: + types: + Blunt: 5 # The nettle will "wilt" after 5 hits. - type: entity name: banana @@ -1791,10 +1823,10 @@ - type: SolutionContainerManager solutions: food: - maxVol: 30 + maxVol: 15 reagents: - ReagentId: Amatoxin - Quantity: 25 + Quantity: 10 - ReagentId: Nutriment Quantity: 5 - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/turrets.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/turrets.yml new file mode 100644 index 0000000000..5bbf2bb596 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/turrets.yml @@ -0,0 +1,36 @@ +- type: entity + id: WeaponEnergyTurretStationMachineCircuitboard + parent: BaseMachineCircuitboard + name: sentry turret machine board + description: A machine printed circuit board for a sentry turret. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: security + - type: MachineBoard + prototype: WeaponEnergyTurretStation + tagRequirements: + TurretCompatibleWeapon: + amount: 1 + defaultPrototype: WeaponLaserCannon + examineName: construction-insert-info-examine-name-laser-cannon + ProximitySensor: + amount: 1 + defaultPrototype: ProximitySensor + componentRequirements: + PowerCell: + amount: 1 + defaultPrototype: PowerCellMedium + examineName: construction-insert-info-examine-name-power-cell + +- type: entity + id: WeaponEnergyTurretAIMachineCircuitboard + parent: WeaponEnergyTurretStationMachineCircuitboard + name: AI sentry turret machine board + description: A machine printed circuit board for an AI sentry turret. + components: + - type: Sprite + sprite: Objects/Misc/module.rsi + state: command + - type: MachineBoard + prototype: WeaponEnergyTurretAI \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/hand_teleporter.yml b/Resources/Prototypes/Entities/Objects/Devices/hand_teleporter.yml index 192aca65fc..f6e30d1e97 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/hand_teleporter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/hand_teleporter.yml @@ -28,5 +28,7 @@ - state: icon color: green - type: HandTeleporter + allowPortalsOnDifferentGrids: true + allowPortalsOnDifferentMaps: true firstPortalPrototype: PortalGatewayBlue secondPortalPrototype: PortalGatewayOrange diff --git a/Resources/Prototypes/Entities/Objects/Tools/thief.yml b/Resources/Prototypes/Entities/Objects/Tools/thief.yml new file mode 100644 index 0000000000..7200c8c06d --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/thief.yml @@ -0,0 +1,80 @@ +- type: entity + parent: BaseMinorContraband + id: ThiefBeacon + name: thieving beacon + description: A device that will teleport everything around it to the thief's vault at the end of the shift. + components: + - type: ThiefBeacon + - type: StealArea + range: 2 # Slightly larger than fulton beacon's random offset + - type: Item + size: Normal + - type: Physics + bodyType: Dynamic + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.4,0.25,0.1" + density: 20 + mask: + - Impassable + - type: Foldable + folded: true + - type: Clickable + - type: InteractionOutline + - type: Appearance + - type: GenericVisualizer + visuals: + enum.FoldedVisuals.State: + foldedLayer: + True: { state: folded_extraction } + False: { state: extraction_point } + - type: Sprite + sprite: Objects/Tools/thief_beacon.rsi + drawdepth: SmallObjects + noRot: true + layers: + - state: extraction_point + map: [ "foldedLayer" ] + +- type: entity + id: ToolboxThief + name: undetermined thieving toolbox + description: This is where your favorite thief's supplies lie. Try to remember which ones. + parent: [ BaseItem, BaseMinorContraband ] + components: + - type: Sprite + sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi + state: icon + - type: ThiefUndeterminedBackpack + possibleSets: + # TODO Thief pinpointer needed + - ChemistrySet + - ToolsSet + - ChameleonSet # TODO Chameleon stump PR needed + - SyndieSet + - SleeperSet + - CommunicatorSet + - SmugglerSet + - type: ActivatableUI + key: enum.ThiefBackpackUIKey.Key + - type: UserInterface + interfaces: + enum.ThiefBackpackUIKey.Key: + type: ThiefBackpackBoundUserInterface + +- type: entity + id: SatchelThief + name: undetermined thieving satchel + description: This is where your favorite thief's supplies lie. Folded for your convenience. + parent: ToolboxThief + components: + - type: Sprite + sprite: Clothing/Back/Satchels/smuggler.rsi + state: folded + - type: Item + storedRotation: 90 + - type: ThiefUndeterminedBackpack + spawnedStoragePrototype: ClothingBackpackSatchelSmugglerUnanchored diff --git a/Resources/Prototypes/Entities/Objects/Tools/thief_beacon.yml b/Resources/Prototypes/Entities/Objects/Tools/thief_beacon.yml deleted file mode 100644 index f0f3737417..0000000000 --- a/Resources/Prototypes/Entities/Objects/Tools/thief_beacon.yml +++ /dev/null @@ -1,40 +0,0 @@ -- type: entity - parent: BaseMinorContraband - id: ThiefBeacon - name: thieving beacon - description: A device that will teleport everything around it to the thief's vault at the end of the shift. - components: - - type: ThiefBeacon - - type: StealArea - range: 2 # Slightly larger than fulton beacon's random offset - - type: Item - size: Normal - - type: Physics - bodyType: Dynamic - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.25,-0.4,0.25,0.1" - density: 20 - mask: - - Impassable - - type: Foldable - folded: true - - type: Clickable - - type: InteractionOutline - - type: Appearance - - type: GenericVisualizer - visuals: - enum.FoldedVisuals.State: - foldedLayer: - True: { state: folded_extraction } - False: { state: extraction_point } - - type: Sprite - sprite: Objects/Tools/thief_beacon.rsi - drawdepth: SmallObjects - noRot: true - layers: - - state: extraction_point - map: [ "foldedLayer" ] diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index dd1f41e571..d0f42e405f 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -143,29 +143,3 @@ state: icon - type: Item sprite: Objects/Tools/Toolboxes/toolbox_gold.rsi - -- type: entity - id: ToolboxThief - name: thief undetermined toolbox - description: This is where your favorite thief's supplies lie. Try to remember which ones. - parent: [ BaseItem, BaseMinorContraband ] - components: - - type: Sprite - sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi - state: icon - - type: ThiefUndeterminedBackpack - possibleSets: - # TODO Thief pinpointer needed - - ChemistrySet - - ToolsSet - - ChameleonSet # TODO Chameleon stump PR needed - - SyndieSet - - SleeperSet - - CommunicatorSet - - SmugglerSet - - type: ActivatableUI - key: enum.ThiefBackpackUIKey.Key - - type: UserInterface - interfaces: - enum.ThiefBackpackUIKey.Key: - type: ThiefBackpackBoundUserInterface 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 73d06a200c..7b1c77b8d0 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -371,6 +371,9 @@ - type: HitscanBatteryAmmoProvider proto: RedHeavyLaser fireCost: 100 + - type: Tag + tags: + - TurretCompatibleWeapon - type: entity name: portable particle decelerator diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_base.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_base.yml index aaa45a2136..ed157365da 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_base.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_base.yml @@ -127,9 +127,12 @@ maxCharge: 2000 startingCharge: 0 - type: ApcPowerReceiverBattery - idlePowerUse: 5 + idleLoad: 5 batteryRechargeRate: 200 batteryRechargeEfficiency: 1.225 - type: ApcPowerReceiver powerLoad: 5 - - type: ExtensionCableReceiver \ No newline at end of file + - type: ExtensionCableReceiver + - type: HTN + rootTask: + task: EnergyTurretCompound \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_energy.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_energy.yml new file mode 100644 index 0000000000..66860ae98c --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Turrets/turrets_energy.yml @@ -0,0 +1,182 @@ +- type: entity + parent: [BaseWeaponEnergyTurret, ConstructibleMachine] + id: WeaponEnergyTurretStation + name: sentry turret + description: A high-tech autonomous weapons system designed to keep unauthorized personnel out of sensitive areas. + components: + + # Physics + - type: Fixtures + fixtures: + body: + shape: + !type:PhysShapeCircle + radius: 0.45 + density: 60 + mask: + - Impassable + turret: + shape: + !type:PhysShapeCircle + radius: 0.45 + density: 60 + mask: + - MachineMask + layer: + - MachineLayer + hard: false + + # Sprites and appearance + - type: Sprite + sprite: Objects/Weapons/Guns/Turrets/sentry_turret.rsi + drawdepth: HighFloorObjects + granularLayersRendering: true + layers: + - state: support + renderingStrategy: NoRotation + - state: base_shadow + map: [ "shadow" ] + - state: base + map: [ "base" ] + - state: stun + map: [ "enum.DeployableTurretVisuals.Weapon" ] + shader: "unshaded" + visible: false + - state: cover_closed + map: [ "enum.DeployableTurretVisuals.Turret" ] + renderingStrategy: NoRotation + - state: cover_light_on + map: [ "enum.PowerDeviceVisualLayers.Powered" ] + shader: "unshaded" + renderingStrategy: NoRotation + visible: false + - state: panel + map: [ "enum.WiresVisualLayers.MaintenancePanel" ] + renderingStrategy: NoRotation + visible: false + - type: AnimationPlayer + - type: Appearance + - type: GenericVisualizer + visuals: + enum.BatteryWeaponFireModeVisuals.State: + enum.DeployableTurretVisuals.Weapon: + BulletEnergyTurretDisabler: { state: stun } + BulletEnergyTurretLaser: { state: lethal } + enum.DeployableTurretVisuals.Broken: + base: + True: { state: destroyed } + False: { state: base } + enum.WiresVisuals.MaintenancePanelState: + enum.WiresVisualLayers.MaintenancePanel: + True: { visible: false } + False: { visible: true } + + # HTN + - type: HTN + enabled: false + + # Faction / control + - type: StationAiWhitelist + - type: NpcFactionMember + factions: + - AllHostile + - type: AccessReader + access: [["Security"]] + + # Weapon systems + - type: ProjectileBatteryAmmoProvider + proto: BulletEnergyTurretDisabler + fireCost: 100 + - type: BatteryWeaponFireModes + fireModes: + - proto: BulletEnergyTurretDisabler + fireCost: 100 + - proto: BulletEnergyTurretLaser + fireCost: 100 + - type: TurretTargetSettings + exemptAccessLevels: + - Security + - Borg + - BasicSilicon + + # Defenses / destruction + - type: DeployableTurret + retractedDamageModifierSetId: Metallic + deployedDamageModifierSetId: FlimsyMetallic + - type: Damageable + damageModifierSet: Metallic + - type: Repairable + doAfterDelay: 10 + allowSelfRepair: false + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:DoActsBehavior + acts: [ "Breakage" ] + - trigger: + !type:DamageTrigger + damage: 600 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:ChangeConstructionNodeBehavior + node: machineFrame + - !type:DoActsBehavior + acts: ["Destruction"] + + # Device network + - type: DeviceNetwork + deviceNetId: Wired + receiveFrequencyId: TurretControl + transmitFrequencyId: Turret + sendBroadcastAttemptEvent: true + prefix: device-address-prefix-turret + examinableAddress: true + - type: DeviceNetworkRequiresPower + - type: WiredNetworkConnection + + # Wires + - type: UserInterface + interfaces: + enum.WiresUiKey.Key: + type: WiresBoundUserInterface + - type: WiresPanel + - type: WiresVisuals + - type: Wires + boardName: wires-board-name-weapon-energy-turret + layoutId: WeaponEnergyTurret + - type: Lock + locked: true + unlockOnClick: false + - type: LockedWiresPanel + + # General properties + - type: Machine + board: WeaponEnergyTurretStationMachineCircuitboard + - type: UseDelay + delay: 1.2 + +- type: entity + parent: WeaponEnergyTurretStation + id: WeaponEnergyTurretAI + name: AI sentry turret + description: A high-tech autonomous weapons system under the direct control of a local artifical intelligence. + components: + - type: AccessReader + access: [["StationAi"]] + - type: TurretTargetSettings + exemptAccessLevels: + - Borg + - BasicSilicon + - type: Machine + board: WeaponEnergyTurretAIMachineCircuitboard + - type: DeviceNetwork + receiveFrequencyId: TurretControlAI + transmitFrequencyId: TurretAI diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/posters.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/posters.yml index cf994b3e73..25bcb5b93a 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/posters.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/Signs/posters.yml @@ -1078,6 +1078,14 @@ - type: Sprite state: poster53_legit +- type: entity + parent: PosterBase + id: PosterLegitTyrone + name: "Tyrone's Guide to Space" + description: "A poster advertising online schooling about space. The classes listed seem to cover things from the basic usage of station equipment to complicated subjects like creating pipebombs or covering entire hallways in spacelube. A disclaimer reads \"It's never THAT bad, and at the end you might even get a tortilla.\"" + components: + - type: Sprite + state: poster54_legit #maps diff --git a/Resources/Prototypes/Entities/Structures/cargo_telepad.yml b/Resources/Prototypes/Entities/Structures/cargo_telepad.yml index a99f35a7d9..a3198b58ea 100644 --- a/Resources/Prototypes/Entities/Structures/cargo_telepad.yml +++ b/Resources/Prototypes/Entities/Structures/cargo_telepad.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: CargoTelepad parent: [ BaseMachinePowered, ConstructibleMachine ] name: cargo telepad @@ -49,3 +49,4 @@ - type: CollideOnAnchor - type: NameIdentifier group: CargoTelepads + - type: AnimationPlayer diff --git a/Resources/Prototypes/Entities/Structures/conveyor.yml b/Resources/Prototypes/Entities/Structures/conveyor.yml index 17c8f2e434..6722181b26 100644 --- a/Resources/Prototypes/Entities/Structures/conveyor.yml +++ b/Resources/Prototypes/Entities/Structures/conveyor.yml @@ -13,7 +13,7 @@ anchored: true - type: Sprite sprite: Structures/conveyor.rsi - state: conveyor_started_cw + state: conveyor_stopped_cw drawdepth: HighFloorObjects - type: ApcPowerReceiver - type: ExtensionCableReceiver @@ -24,10 +24,10 @@ conveyor: shape: !type:PolygonShape vertices: - - -0.49,-0.49 - - 0.49,-0.49 - - 0.49,0.49 - - -0.49,0.49 + - -0.50,-0.50 + - 0.50,-0.50 + - 0.50,0.50 + - -0.50,0.50 layer: - Impassable - MidImpassable diff --git a/Resources/Prototypes/Hydroponics/seeds.yml b/Resources/Prototypes/Hydroponics/seeds.yml index 0df1008834..68524b15ff 100644 --- a/Resources/Prototypes/Hydroponics/seeds.yml +++ b/Resources/Prototypes/Hydroponics/seeds.yml @@ -666,6 +666,7 @@ production: 6 yield: 2 potency: 20 + growthStages: 3 idealLight: 9 idealHeat: 298 chemicals: @@ -1401,8 +1402,8 @@ chemicals: Amatoxin: Min: 1 - Max: 25 - PotencyDivisor: 4 + Max: 10 + PotencyDivisor: 12 Nutriment: ## yumby :) Min: 1 Max: 5 diff --git a/Resources/Prototypes/NPCs/utility_queries.yml b/Resources/Prototypes/NPCs/utility_queries.yml index 03764e2b1f..69ae4a337d 100644 --- a/Resources/Prototypes/NPCs/utility_queries.yml +++ b/Resources/Prototypes/NPCs/utility_queries.yml @@ -190,6 +190,8 @@ curve: !type:BoolCurve - !type:TargetIsCritCon curve: !type:InverseBoolCurve + - !type:TargetIsStunnedCon + curve: !type:InverseBoolCurve - !type:TurretTargetingCon curve: !type:BoolCurve - !type:TargetDistanceCon diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 2eeb3c392b..28a47fdc21 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -718,6 +718,15 @@ FoodDoughCottonFlat: 1 CottonBol: 4 +- type: microwaveMealRecipe + id: RecipeWorldpeasPizza + name: world peazza recipe + result: FoodPizzaWorldpeas + time: 30 + solids: + FoodDoughFlat: 1 + FoodWorldPeas: 3 + #Italian - type: microwaveMealRecipe id: RecipeBoiledSpaghetti diff --git a/Resources/Prototypes/Roles/Antags/thief.yml b/Resources/Prototypes/Roles/Antags/thief.yml index 0309b00b50..12fdefba2b 100644 --- a/Resources/Prototypes/Roles/Antags/thief.yml +++ b/Resources/Prototypes/Roles/Antags/thief.yml @@ -11,5 +11,5 @@ storage: back: - ThiefBeacon - - ToolboxThief + - SatchelThief - ClothingHandsChameleonThief diff --git a/Resources/Prototypes/Roles/role_types.yml b/Resources/Prototypes/Roles/role_types.yml index b395286dc0..7ae2b44054 100644 --- a/Resources/Prototypes/Roles/role_types.yml +++ b/Resources/Prototypes/Roles/role_types.yml @@ -1,6 +1,8 @@ # For use by Role Types # Do not touch these +# If you change/add a color here, also change it in role-types.ftl! + - type: roleType id: Neutral name: role-type-crew-aligned-name diff --git a/Resources/Prototypes/Wires/layouts.yml b/Resources/Prototypes/Wires/layouts.yml index 32c1488683..d94355361f 100644 --- a/Resources/Prototypes/Wires/layouts.yml +++ b/Resources/Prototypes/Wires/layouts.yml @@ -204,4 +204,25 @@ wires: - !type:PowerWireAction - !type:AiInteractWireAction - - !type:AccessWireAction \ No newline at end of file + - !type:AccessWireAction + +- type: wireLayout + id: WeaponEnergyTurret + dummyWires: 4 + wires: + - !type:PowerWireAction + - !type:PowerWireAction + pulseTimeout: 15 + - !type:AiInteractWireAction + - !type:AccessWireAction + +- type: wireLayout + id: TurretControls + dummyWires: 2 + wires: + - !type:PowerWireAction + - !type:PowerWireAction + pulseTimeout: 15 + - !type:AiInteractWireAction + - !type:AccessWireAction + \ No newline at end of file diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 5d7d19950d..6577b7eb89 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1165,6 +1165,9 @@ - type: Tag id: SignalTrigger +- type: Tag + id: SilentStorageUser # used in SharedStorageSystem, so the entity will do all silently + - type: Tag id: SkeletonMotorcycleKeys @@ -1314,6 +1317,12 @@ - type: Tag id: Truncheon + +- type: Tag + id: TurretCompatibleWeapon # Used in the construction of sentry turrets + +- type: Tag + id: TurretControlElectronics # Used in the construction of sentry turret control panels - type: Tag id: Unimplantable diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml b/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml index 4c11fc0d99..ec871851c6 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml @@ -1,6 +1,6 @@ # Thieves - + [color=#999999][italic]"Yoink! I'll be taking that! And that! Ooh, don't mind if I do!"[/italic][/color] @@ -25,7 +25,7 @@ ## Tools of the Trade - You've got two more aces up your stolen sleeves: your [color=cyan]beacon[/color] and your [color=cyan]toolbox.[/color] + You've got two more aces up your stolen sleeves: your [color=cyan]beacon[/color] and your [color=cyan]satchel.[/color] Your [color=cyan]beacon[/color] provides safe passage home for trinkets that may not be easy to carry with you on the evac shuttle. Simply find a secluded part of the station to unfold the beacon, then set its coordinates to your hideout. Any shinies near it will be [bold]teleported to your vault when the shift ends,[/bold] fulfilling your objectives. @@ -36,11 +36,10 @@ - Your [color=cyan]toolbox[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists. - Approve your choices in a safe place, as the toolbox will dissolve and the gear will drop at your feet. + Your [color=cyan]satchel[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists. - + @@ -56,7 +55,7 @@ ## Centerpiece of the Collection Your kleptomania will take you places. One day, you'll feel like stealing a few figurines. Another day, you'll feel like stealing an industrial machine. - + No matter. They'll all be a part of your collection within a matter of time. You can steal items by [bold]having them on your person[/bold] when you get to CentComm. Failing this, you can steal larger items by [bold]leaving them by your beacon.[/bold] @@ -64,12 +63,12 @@ Some of the more [italic]animate[/italic] objectives may not cooperate with you. Make sure they're alive and with you or your beacon when the shift ends. Things that you may desire include but are not limited to: - + - + diff --git a/Resources/ServerInfo/Guidebook/Security/Security.xml b/Resources/ServerInfo/Guidebook/Security/Security.xml index 7306e3f761..3df94c6b9b 100644 --- a/Resources/ServerInfo/Guidebook/Security/Security.xml +++ b/Resources/ServerInfo/Guidebook/Security/Security.xml @@ -15,7 +15,7 @@ They face [textlink="Syndicate Agents" link="Traitors"], [textlink="Nuclear Oper ## Gear -First we have non-lethals a step above simply telling someone to cooperate with instructions. Both the stunbaton and disabler are capable of limiting the movement of an assailant, whereas handcuffs can be applied to deny a criminal free movement and access to their hands. +First we have non-lethals a step above simply telling someone to cooperate with instructions. Both the stunbaton and disabler are capable of limiting the movement of an assailant, whereas handcuffs can be applied to deny a criminal free movement and access to their hands. Cuffs will also shove the person down if your [color=red]harm mode[/color] is active during uncuff. @@ -31,7 +31,7 @@ It is worth noting that flashes can be both used in a large area ([color=yellow] - + ## Lethals Should the situation dictate, [color=#cb0000]Security[/color] have access to laser rifles, shotguns, handguns and automatic rifles able to put down substancial fire against any who would stand against the station. diff --git a/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/folded.png b/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/folded.png new file mode 100644 index 0000000000..0773c0b94d Binary files /dev/null and b/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/folded.png differ diff --git a/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/meta.json b/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/meta.json index d3b44ffaa2..66c0f6df16 100644 --- a/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/meta.json +++ b/Resources/Textures/Clothing/Back/Satchels/smuggler.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/a8056c6ba7f5367934ef829116e57d743226e1f0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/a8056c6ba7f5367934ef829116e57d743226e1f0, folded by princesscheeseballs (Discord)(https://github.com/Pronana).", "size": { "x": 32, "y": 32 @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "folded" + }, { "name": "equipped-BACKPACK", "directions": 4 diff --git a/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..3a33dfd1e2 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/icon.png new file mode 100644 index 0000000000..1322b1e962 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/inhand-left.png new file mode 100644 index 0000000000..a59ddf2cc3 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/inhand-right.png new file mode 100644 index 0000000000..8a997627b6 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/meta.json new file mode 100644 index 0000000000..0e37a10620 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/wehcellentcap.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by UBlueberry (GitHub) for Space Station 14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Interface/Misc/job_icons.rsi/ParadoxClone.png b/Resources/Textures/Interface/Misc/job_icons.rsi/ParadoxClone.png new file mode 100644 index 0000000000..6d1add3d21 Binary files /dev/null and b/Resources/Textures/Interface/Misc/job_icons.rsi/ParadoxClone.png differ diff --git a/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json b/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json index e2a26933fc..f6cc4d99e1 100644 --- a/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json +++ b/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/e71d6c4fba5a51f99b81c295dcaec4fc2f58fb19/icons/mob/screen1.dmi | Brigmedic icon made by PuroSlavKing (Github) | Zombie icon made by RamZ | Zookeper by netwy (discort) | Rev and Head Rev icon taken from https://tgstation13.org/wiki/HUD and edited by coolmankid12345 (Discord) | Mindshield icon taken from https://github.com/tgstation/tgstation/blob/ce6beb8a4d61235d9a597a7126c407160ed674ea/icons/mob/huds/hud.dmi | Admin recolored from MedicalIntern by TsjipTsjip | StationAi resprite to 8x8 size by lunarcomets | Service Worker resprite by anno_midi (Discord) and spanky-spanky (Github) | service icons darkened by frobnic8 (Discord and Github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/e71d6c4fba5a51f99b81c295dcaec4fc2f58fb19/icons/mob/screen1.dmi | Brigmedic icon made by PuroSlavKing (Github) | Zombie icon made by RamZ | Zookeper by netwy (discort) | Rev and Head Rev icon taken from https://tgstation13.org/wiki/HUD and edited by coolmankid12345 (Discord) | Mindshield icon taken from https://github.com/tgstation/tgstation/blob/ce6beb8a4d61235d9a597a7126c407160ed674ea/icons/mob/huds/hud.dmi | Admin recolored from MedicalIntern by TsjipTsjip | StationAi resprite to 8x8 size by lunarcomets | Service Worker resprite by anno_midi (Discord) and spanky-spanky (Github) | service icons darkened by frobnic8 (Discord and Github) | paradoxClone taken from tg station at commit https://github.com/tgstation/tgstation/commit/d0db1ff267557017ae7bde68e6490e70cbb6e42f and modifed by slarticodefast (Github)", "size": { "x": 8, @@ -191,6 +191,9 @@ }, { "name": "Admin" + }, + { + "name": "ParadoxClone" } ] } diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/meta.json index 607a9cf8f3..1d7e8a01a5 100644 --- a/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa, Spicy Rock Pizza modified from margherita pizza by mkanke, cotton made by mlexf (discord 1143460554963427380)", + "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa, Spicy Rock Pizza modified from margherita pizza by mkanke, cotton made by mlexf (discord 1143460554963427380), world peazza modified from margherita by MisterImp (GitHub)", "size": { "x": 32, "y": 32 @@ -149,6 +149,12 @@ }, { "name": "uranium-slice" + }, + { + "name": "worldpeas" + }, + { + "name": "worldpeas-slice" } ] } diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/worldpeas-slice.png b/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/worldpeas-slice.png new file mode 100644 index 0000000000..52216714bf Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/worldpeas-slice.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/worldpeas.png b/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/worldpeas.png new file mode 100644 index 0000000000..d521aa5c49 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/Baked/pizza.rsi/worldpeas.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/dead.png index 331639ed2e..510c797857 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/harvest.png index abfa423793..7c165a47f0 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/meta.json index 2939c7d55d..47289a1341 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/produce.png index 3e0c08cf2d..dfacad7e1b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-1.png index 7b2ea1af7d..767c866f9b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-2.png index 184dab3575..5a0482fd54 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-3.png index 1c1de6661d..e52fed7ecb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-4.png index 69fabf4da3..8b5bf39167 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-5.png index 48498a4e39..3701a9bf08 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png index 817c0f4bff..5d495e50be 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/harvest.png index 88538ed43a..16ef827191 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/meta.json index 3e15b491d2..9c4e3cc701 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/produce.png index cc0a026b59..46696f64ba 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png index 97245d27f2..e816403679 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-2.png index 02222142ce..902948e752 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png index 37bd6d53d1..4ddb337fb3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png index 8667357c88..abf9eedebd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png index 9a2100edd3..10f54f9d74 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png index be279f7c12..735371a6cb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/apple.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png index 3df1e3a500..16f9fe7caa 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png index 44aeb6c967..33f7755d25 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/meta.json index 58a75b93e6..be72e24bbc 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/6be7633abca9f1a51cab1020500cf0776ce78e5c, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/6be7633abca9f1a51cab1020500cf0776ce78e5c, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/produce.png index b9a55fa6db..5daf4ef910 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png index f455b562fe..813b28a7ed 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png index d6d3636e9e..a2a46d6189 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png index 2e2a215896..3d431f788f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png index 356953934b..70863a3f03 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png index 0aaa030699..43ba6e4d9f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-6.png index 5fbcf74eff..da29575174 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/banana.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/dead.png index 60756f9f0d..8566a76ad5 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/harvest.png index 73c06b1016..807efdc636 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/meta.json index bef4c8d95e..ead13236f1 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/commit/696dfcc59c9e65e7bbe3923d1f7e880ea384783f, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation: https://github.com/tgstation/tgstation/commit/696dfcc59c9e65e7bbe3923d1f7e880ea384783f, inhands by mubururu_ (github), Growth, harvest, and dead sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-1.png index cf39d0c73d..409944c8d3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-2.png index 53c51d4528..d80744d756 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-3.png index ef3fda7dfa..b8e98e76ac 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-4.png index 2f54d6d35b..a82690ba9a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-5.png index 7062b70c67..0aada886ef 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-6.png index 0319ddd239..faf5d8c5c8 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/berries.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/dead.png index 25d398c8f9..7c3c5cd3fa 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/harvest.png index a2628d5589..d01b7665ab 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/meta.json index c1aeb415a5..b1afd4b72d 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/produce.png index be24a81a60..d26eae6d19 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-1.png index e34ef20fff..ccb565a9a6 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-2.png index 129b560922..10d188de95 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-3.png index a80a9c7b6f..43399dfce0 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-4.png index 1cb5be1317..0ff13d5cd7 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-5.png index abdb41dd9c..b492618388 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-6.png index bcf5686df9..bc34f12415 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/blood_tomato.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/dead.png index e66da2064a..7ee1ea0e83 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/harvest.png index 3a1aece3b0..e27aec92a2 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/meta.json index 608b22835e..8422d06a3d 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/5d507cfbad6f73d1beaba66d93f31f893adb3a84, modified by potato1234_x (github), inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/5d507cfbad6f73d1beaba66d93f31f893adb3a84, modified by potato1234_x (github), inhands by mubururu_ (github), Growth, harvest, and dead created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-1.png index 762e986ae9..abbfbb056b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-2.png index 22f418d571..3059e65361 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-3.png index eb08406899..e8584ceb8c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_pumpkin.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/dead.png index 25d398c8f9..d2c761b8ca 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/harvest.png index 930f67cc65..a32aa473ec 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/meta.json index c1aeb415a5..b1afd4b72d 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/produce.png index b2a6d230a3..9530583488 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-1.png index 5353eb5a6c..87e3c4de81 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-2.png index 7ed189bdbc..dfb43e1e10 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-3.png index 9a253c7354..64fca54416 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-4.png index b8eccc4585..55f376cab0 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-5.png index 1397b0b044..6d1c01c17c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-6.png index 27afd0c2ec..5352624ee4 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/blue_tomato.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/dead.png index 3ce7308419..f81c13e125 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/harvest.png index 1d0706fd63..105735216e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/meta.json index 0862a8b1ea..e8994282cd 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12#diff-3fdb6bdffec70eb17e6315b5cc5447b4cc73d39f583f077f064ad70f286138fa, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12#diff-3fdb6bdffec70eb17e6315b5cc5447b4cc73d39f583f077f064ad70f286138fa, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/produce.png index 34f0c13081..f38d96a741 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/stage-1.png index 293e00f444..bbe4c6517c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/cabbage.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/dead.png index d5667d2721..5d495e50be 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/harvest.png index 16a55ee65f..f6a8f763a0 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/meta.json index 35c8da9203..5bf600156a 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068 and remade by RumiTiger", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068 and remade by RumiTiger, Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/produce.png index 9d48f86f86..1c3cd8b6f1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-1.png index 21053aed96..e816403679 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-2.png index 8073923cd6..902948e752 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-3.png index 09a351404e..4ddb337fb3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-4.png index 8256962328..abf9eedebd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-5.png index 038eff2fb2..10f54f9d74 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-6.png index 5bd86228a2..b5198baf5f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/cherry.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/dead.png index 5e8ef56941..2e17688c29 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/harvest.png index abee785681..14cd886477 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/meta.json index 3d233d61c3..d6374a3793 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/produce.png index 873f89e181..e7df7ca15f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-1.png index 3738f191d6..b484b1ca5b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-2.png index e6381c1c09..c6f0f2ef76 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-3.png index a5a94077a1..074cdb184e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-4.png index 5445d57a95..3beb0af2c9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-5.png index 72b38c2538..5ff2ef60d8 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-6.png index de66ea6474..0dacf86b32 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/chili.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/dead.png index 5e8ef56941..2e17688c29 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/harvest.png index 618fd68be3..bb5135df05 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/meta.json index 9de65c4712..f7affdef4c 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png index b2c59dc31a..f5c6e641bd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-1.png index 3738f191d6..b484b1ca5b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-2.png index e6381c1c09..c6f0f2ef76 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-3.png index a5a94077a1..074cdb184e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-4.png index 5445d57a95..3beb0af2c9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-5.png index 72b38c2538..5ff2ef60d8 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-6.png index de66ea6474..0dacf86b32 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/chilly.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png index eb913e6497..a5491b2734 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png index ad426280ae..a26d680266 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/meta.json index 251b99cd0f..eed50fb466 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, Growth, dead, harvest, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/produce.png index 50039ca1b3..40c0dd1d92 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png index 50c14731bc..6d0f0825fd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-2.png index e59dda8c24..9c6fa1bf7a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-3.png index 1a0c355340..0a7f6ad19f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/corn.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png index 9e1068d5e6..13bd7f8ddb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/harvest.png index 4613d52d9a..8c3fb0e8af 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/meta.json index 3e15b491d2..f7d57e59d0 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), produce modified from https://github.com/space-wizards/space-station-14/commit/484eb0bba44d3e014873e7d7026a99d7ba56f7b9#diff-5b9a7a38ef618b5f482f5baf4bb8db27dc87f9af7602d67cae9133e624aa3f91 by Chaoticaa (GitHub), Growth, harvest, and dead created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 @@ -28,15 +28,6 @@ { "name": "stage-3" }, - { - "name": "stage-4" - }, - { - "name": "stage-5" - }, - { - "name": "stage-6" - }, { "name": "produce-inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/produce.png index 17af603e7d..c412d88a6a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-1.png index 6f9321fade..9aa4d098ca 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png index 49e037ad76..5ee55e69d6 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-3.png index e35c93ea8a..0dc266d4f7 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-4.png deleted file mode 100644 index 89aec95f27..0000000000 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-4.png and /dev/null differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-5.png deleted file mode 100644 index c39c523ebf..0000000000 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-5.png and /dev/null differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-6.png deleted file mode 100644 index 1b167e4658..0000000000 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggplant.rsi/stage-6.png and /dev/null differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png index 9e1068d5e6..2e17688c29 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/harvest.png index ff61445c0d..3cc55a2ebf 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/meta.json index 775f8df408..d63234ce88 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, seed.png modified from https://github.com/space-wizards/space-station-14/pull/23210/files#diff-13896c37cf761a5782bb95bbc433bb738dd59ed89276af17dccd606adb759ee5 by Chaoticaa (GitHub), Growth stages, dead, and harvest sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/seed.png index f94001c1ad..73d221511c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/seed.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/seed.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png index 6f9321fade..b484b1ca5b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png index 49e037ad76..c6f0f2ef76 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-3.png index e35c93ea8a..074cdb184e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png index 89aec95f27..3beb0af2c9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-5.png index c39c523ebf..5ff2ef60d8 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-6.png index 1b167e4658..0dacf86b32 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/eggy.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/dead.png index 619a057e98..a055a84a84 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/harvest.png index 4572597035..96f3f6a28a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/meta.json index adc0db541c..c6b8930b4e 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a, inhands by mubururu_ (github), produce created by Chaoticaa (GitHub), Growth stages, harvest, and dead modified by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/produce.png index 96d1e506be..970286549e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-1.png index d4d7e4eab5..2db1f6f1a0 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-2.png index eba962c66c..c24f671584 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/fly_amanita.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/meta.json index 12f12bb53b..8750990f23 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/9f2e55e83cb93e7124d06c705d1942dfec63c93a", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/9f2e55e83cb93e7124d06c705d1942dfec63c93a, produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/produce.png index 8a2b50fb0a..caad0839f4 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/garlic.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/dead.png index 817c0f4bff..5d495e50be 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/harvest.png index 5a49c3f5c5..466fbb7384 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/meta.json index 3e15b491d2..9c4e3cc701 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/produce.png index 4c36982960..216473d05a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-1.png index e65be188b1..ec650d945d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-2.png index 165e17b57c..54c8b271ff 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-3.png index 9b193a59e3..834099b8d3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-4.png index e66ff1ddc9..a65924364c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-5.png index fc1807e089..65aceb0c11 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-6.png index e2790c179a..743b5564da 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/golden_apple.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/dead.png index b2bfbd028d..694e7a105f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/harvest.png index 08b3df4f47..6478097b10 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/meta.json index b668ebaeef..be6a0f367c 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/meta.json @@ -1,37 +1,37 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12, inhands and produce by mubururu_ (github)", - "size": { - "x": 32, - "y": 32 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12, Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub), inhands by mubururu_ (github)", + "size": { + "x": 32, + "y": 32 }, - "states": [ - { - "name": "dead" - }, - { - "name": "harvest" - }, - { - "name": "produce" - }, - { - "name": "seed" - }, - { - "name": "stage-1" - }, - { - "name": "stage-2" - }, - { - "name": "produce-inhand-left", - "directions": 4 - }, - { - "name": "produce-inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "dead" + }, + { + "name": "harvest" + }, + { + "name": "produce" + }, + { + "name": "seed" + }, + { + "name": "stage-1" + }, + { + "name": "stage-2" + }, + { + "name": "produce-inhand-left", + "directions": 4 + }, + { + "name": "produce-inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/produce.png index 8ba41e7183..7c4a64dcb9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-1.png index b26fc32c2c..b9ac058e50 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-2.png index 593a494e48..0c0d37fe6d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/grape.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/dead.png index a3896d57c1..cf8e4293c1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/harvest.png index 1a2a7d3747..3cb0902d3b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/meta.json index f7fecc7013..026589b450 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12 and https://github.com/tgstation/tgstation/commit/ead6d8d59753ef033efdfad17f337df268038ff3 and modified by slarticodefast, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12 and https://github.com/tgstation/tgstation/commit/ead6d8d59753ef033efdfad17f337df268038ff3 and modified by slarticodefast, inhands by mubururu_ (github), produce sprite modified by Chaoticaa (GitHub), Growth stages, harvest, and dead sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/produce.png index 73e458d832..e34bde5443 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-1.png index f926a279dc..424fda7634 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-2.png index 4213fc3225..3732c8260f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-3.png index 69b583f4e4..07bd9ca000 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-4.png index c496143bf6..52ebfd0f7c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-5.png index 5f9dc48217..c4aaf2038f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-6.png index a7a3cb4553..36480589b1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/holymelon.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/dead.png index 44755fdd88..8566a76ad5 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/harvest.png index 7d50c8a41e..4551465c7c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/meta.json index 4e433c101e..d8b2ea0e77 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/696dfcc59c9e65e7bbe3923d1f7e880ea384783f", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/696dfcc59c9e65e7bbe3923d1f7e880ea384783f, Growth, harvest, and dead created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-1.png index 9a12e8fdd8..fce35bba16 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-2.png index 05fbeeef12..016a7caaaf 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-3.png index 5d77527980..278646986d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-4.png index c1058f829a..d41edd7d5f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/koibean.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/dead.png index ded6b2eb77..e598a94fab 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/harvest.png index 602809f900..71cd70dd0d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/meta.json index e7b156c5d8..4c84d306f8 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/a5e6db8f99b436b643bd3b76fa131ac074dfd856 seed modified by potato1234_x (github) for ss14, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/a5e6db8f99b436b643bd3b76fa131ac074dfd856 seed modified by potato1234_x (github) for ss14, inhands by mubururu_ (github), Growth, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/produce.png index e4fd37ff96..71270b9f53 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-1.png index 1c710f40db..0ca537b88d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-2.png index 157a081b35..b70d6fb50b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-3.png index 311098b975..c7f94ad867 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/laughin_pea.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png index 00d15ded8d..5d495e50be 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/harvest.png index 478818f10b..72ec041b2f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json index 3e15b491d2..ea94e38df7 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png index dc357dce1e..71dba8d153 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png index 5f4bf31b4a..e816403679 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png index 597c915139..902948e752 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png index 918687cbd3..4ddb337fb3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png index 8bf24a1cb6..abf9eedebd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-5.png index bc4402e100..10f54f9d74 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-6.png index 5ff59e6bf3..f838f12548 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/lemon.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/harvest.png index 750707d5dc..4b57cff73e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/meta.json index 782dc2bfda..ed82841a35 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a seed modified by potato1234_X (github) for ss14, equipped-HELMET taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and changed hue", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a seed modified by potato1234_X (github) for ss14, equipped-HELMET taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e and changed hue, Harvest, and produce modified by Chaoticaa (github)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/produce.png index aa83786963..2d6f0b91bb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/lily.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/dead.png index b79722cbe5..5d495e50be 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/harvest.png index ada52d81fb..7644f3b081 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/meta.json index 3e15b491d2..ea94e38df7 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/produce.png index cc2b538c21..ecb689af0a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-1.png index 484b472660..e816403679 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-2.png index cfae403829..902948e752 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-3.png index e4e2ac9a39..4ddb337fb3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-4.png index 31054ca2c5..abf9eedebd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-5.png index 91014722a8..10f54f9d74 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-6.png index 96853e9790..735371a6cb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/lime.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/dead.png index 3a1e5735cd..2a8727c386 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/harvest.png index b0417c69c0..9e0ef29aed 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/meta.json index 7b674fb537..c4233795e8 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068 and https://github.com/tgstation/tgstation/commit/ead6d8d59753ef033efdfad17f337df268038ff3 and modified by slarticodefast, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068 and https://github.com/tgstation/tgstation/commit/ead6d8d59753ef033efdfad17f337df268038ff3 and modified by slarticodefast, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/produce.png index e6ab15f164..606abff6fb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-1.png index efdf35bb12..67fa88f1f3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-2.png index 1c9d20af4c..8366f7e431 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-3.png index bcec67f1e4..a5bce95b5e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-4.png index 8d471502ab..1212eaa782 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-5.png index bee9bd6b93..1fb88b01ab 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-6.png index 502f27714c..3b1ed0cab3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/meatwheat.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/dead.png index 3a1e5735cd..009776394c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/harvest.png index 8c5eb7dc51..e031eb6a3d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/meta.json index 3e64e3e49b..1ff69a9dbb 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from vgstation and modified by Swept at https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068", + "copyright": "Taken from vgstation and modified by Swept at https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/produce.png index e0898b8baf..dcd5d4f000 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-1.png index 77e20df4fc..2698dae055 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-2.png index 419ba77c1f..e26996cb79 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-3.png index 23a74c6983..a940b757ca 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-4.png index 2bea35ad62..701db9900d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-5.png index efe887736d..07df5618d9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-6.png index d063832b78..a7cfad050e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/oat.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/dead.png index 07b9366b96..2e28fe1847 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/harvest.png index 4285fc2a0c..7895ca1bf4 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/meta.json index ddad861a8f..9b816e9c2c 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/9b0c2e771e9d2442dd7d21c019b970c1299b5cf4, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/9b0c2e771e9d2442dd7d21c019b970c1299b5cf4, inhands by mubururu_ (github), slice modified from https://github.com/space-wizards/space-station-14/pull/3436/files#diff-65d1e265b787136da82b8e8b56ede11fdb879c31f9d14b4236d33a9a89d6a815 by Chaoticaa (GitHub), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/produce.png index 3de2582e42..d279f82d2b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/slice.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/slice.png index 6fa2063b25..4dc499d805 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/slice.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/slice.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-1.png index f3ee167fec..d61f25d741 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-2.png index 146f0f8846..eb57883bb1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-3.png index 24c5632811..95fb01299a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/dead.png index 07b9366b96..f7a524ccfd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/harvest.png index 6abaa49ad5..d5f4a5adb2 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/meta.json index ddad861a8f..21e0530172 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/9b0c2e771e9d2442dd7d21c019b970c1299b5cf4, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/9b0c2e771e9d2442dd7d21c019b970c1299b5cf4, inhands by mubururu_ (github), seed modified from https://github.com/space-wizards/space-station-14/pull/23210/files#diff-6b89a02e399bc4dd9c50c16ad274a353a92c8a0f462083fab0c1e5045d957ad2 by Chaoticaa (GitHub), slice modified from https://github.com/space-wizards/space-station-14/pull/3436/files#diff-65d1e265b787136da82b8e8b56ede11fdb879c31f9d14b4236d33a9a89d6a815 by Chaoticaa (GitHub), Growth, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/produce.png index 68fc745713..f1b3beb5a9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/seed.png index 032e25322a..da257cc6ff 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/seed.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/seed.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/slice.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/slice.png index b0c41b7c0d..630014aa62 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/slice.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/slice.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-1.png index 6ec16d9236..d61f25d741 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-2.png index 1cb53104ec..eb57883bb1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-3.png index 3520e6d7d9..c501ef0215 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/onion_red.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/dead.png index b79722cbe5..5d495e50be 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/harvest.png index 8bbddd83d8..15b58cc011 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/meta.json index 3e15b491d2..de4ed6fbe0 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), seed.png modified from https://github.com/space-wizards/space-station-14/pull/23210/files#diff-1ee24e9bb4023f490a3f87c861b65e459bd3fda10e688471cdf72b8a8aab381b by Chaoticaa (github), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/produce.png index 92d3022c0e..076c6170b4 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/seed.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/seed.png index 0b239c6d31..58a3d99b81 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/seed.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/seed.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-1.png index 484b472660..e816403679 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-2.png index cfae403829..902948e752 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-3.png index e4e2ac9a39..4ddb337fb3 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-4.png index 31054ca2c5..abf9eedebd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-5.png index 91014722a8..10f54f9d74 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-6.png index 96853e9790..735371a6cb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/orange.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/dead.png index 8fa7120b29..d44c4871f1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/harvest.png index d4f146d88a..0f72456b68 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/meta.json index 185c8ed1a4..012feb5906 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/a5e6db8f99b436b643bd3b76fa131ac074dfd856, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/a5e6db8f99b436b643bd3b76fa131ac074dfd856, inhands by mubururu_ (github), Growth, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/produce.png index d5881c2e3e..44c36ea8ae 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-1.png index cfd3786315..374da5d8bb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-2.png index b724176aa5..97032c89fd 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-3.png index fd9cfaaa3d..ac891b1948 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/pea.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/dead.png index 082443de97..2d9b4aebe9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/harvest.png index 5e52276009..3d093329e8 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/meta.json index 81e4e04be2..19bce5327f 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/9b0c2e771e9d2442dd7d21c019b970c1299b5cf4, inhands by mubururu_ (github)", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/9b0c2e771e9d2442dd7d21c019b970c1299b5cf4, inhands by mubururu_ (github), slice.png modified from https://github.com/space-wizards/space-station-14/pull/31012/commits/f840c12356368798ab2dbe7de8232ed8181d29d6#diff-2ca7537b4a0f25517344be1d3a98d6cc33a3176c0af385bc5882b96d77afc64d by Chaoticaa (GitHub), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/produce.png index e831df78c6..2388f0dcc0 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/slice.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/slice.png index 50882ec820..6a989d55e6 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/slice.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/slice.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-1.png index 2678518fca..e5f12887ae 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-2.png index 287d5625f0..39c531b342 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-3.png index 01128a82bc..12dfd66f73 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/pineapple.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/harvest.png index 99ad68a5d2..7e428959c7 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/meta.json index b49b49cc85..5319d70e7f 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a, equipped-HELMET taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a, equipped-HELMET taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, Poppy produce and harvest sprites modified by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/produce.png index de8601d255..208d2d6579 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png index d3444b9383..6b90de5b32 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png index 35242e1222..d90c069950 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json index 7f331416d0..3d679a29ad 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, dead, harvest, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png index 426106d046..1856cc3fe5 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-1.png index e718745274..1b8209c3c4 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png index db81535872..15e7e827f7 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png index f6964e668a..196856f84b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png index 5668fb94ce..3e5eb50520 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/potato.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/dead.png index e66da2064a..7ee1ea0e83 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/harvest.png index ea6a13ed31..90f7b522ab 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/meta.json index df17201a0a..0560aabe98 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation/blob/5d507cfbad6f73d1beaba66d93f31f893adb3a84/icons/obj/hydroponics/harvest.dmi, carved sprites by ps3moira, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/tgstation/tgstation/blob/5d507cfbad6f73d1beaba66d93f31f893adb3a84/icons/obj/hydroponics/harvest.dmi, carved sprites by ps3moira, inhands by mubururu_ (github), Growth stages, dead, and harvest sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-1.png index 762e986ae9..abbfbb056b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-2.png index 22f418d571..3059e65361 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-3.png index eb08406899..e8584ceb8c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/pumpkin.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/dead.png index fad40105e1..009776394c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/harvest.png index 513f2554a8..702f6bd351 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/meta.json index 33a3e76ce4..dbbf0cdad9 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/produce.png index abf70fe162..b23daaef3c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-1.png index 33333f209d..2698dae055 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-2.png index 9891ba9956..a940b757ca 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-3.png index ada9aa7adf..701db9900d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-4.png index 138ab45eab..a7cfad050e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/rice.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/dead.png index 44755fdd88..8566a76ad5 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/harvest.png index 7d50c8a41e..e83d2c932c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/meta.json index 516ec2496c..8d9ef7d1f2 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/BeeStation/BeeStation-Hornet/commit/bd870d649cc8ac9d8af2fbc046af4a79afb5ab28", + "copyright": "Taken from https://github.com/BeeStation/BeeStation-Hornet/commit/bd870d649cc8ac9d8af2fbc046af4a79afb5ab28, produce modified from https://github.com/space-wizards/space-station-14/pull/13989/files#diff-a55f533faecbd8741098e25f259fa528683197ccc0e99a77f0f592a3ae2faa03 by Chaoticaa (GitHub), Growth, harvest, and dead created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/produce.png index ab4f4fda82..42cf4ae4c2 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-1.png index 9a12e8fdd8..2a32fdeba6 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-2.png index 05fbeeef12..55cffe4605 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-3.png index 5d77527980..02ebeb8f4d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-4.png index c1058f829a..9b50a97019 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/soybeans.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/dead.png index 0bbbc8df13..ec73be01da 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png index c0419b7202..46ec48540b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/meta.json index 8aa302e1a6..7c890d6313 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/produce.png index 6647242fb0..e08945b0fa 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-1.png index 4f641ddae9..623e111b23 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png index c5541e0de3..05dec90269 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png index caf581eb89..9c1e752f22 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/sugarcane.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/dead.png index 25d398c8f9..ab282390a7 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/harvest.png index 85856923e4..f0100a8e54 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json index c1aeb415a5..b1afd4b72d 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png index 70734354b7..6db95fbcbe 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png index 6188a2d2ca..164f812c4e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png index 56e4f6b523..6654e420f4 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-3.png index 48fb857251..4e4ac94e1b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-4.png index 424d449634..1b3199b086 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-5.png index b2413ccc1c..31125123a9 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-6.png index a490430b70..689e11fafb 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/tomato.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/dead.png index a3896d57c1..cf8e4293c1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/harvest.png index 7c718ed6af..d16a936f8a 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/meta.json index 46c0cf5415..5b56a84b55 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12 and https://github.com/tgstation/tgstation/commit/ead6d8d59753ef033efdfad17f337df268038ff3, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/b459ea3fdee965bdc3e93e7983ad7fa610d05c12 and https://github.com/tgstation/tgstation/commit/ead6d8d59753ef033efdfad17f337df268038ff3, inhands by mubururu_ (github), slice.png modified from https://github.com/space-wizards/space-station-14/pull/14587/files#diff-3d6e5b157c429de7aa62396e8677d0a2fab073a2d6d6e796af4931cb8d979330 by Chaoticaa (GitHub), Growth stages, harvest, dead, and produce sprites Created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/produce.png index 655628bc88..57c39ae7a6 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/slice.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/slice.png index 2c76c9a361..4963de0a61 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/slice.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/slice.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-1.png index f926a279dc..424fda7634 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-2.png index 4213fc3225..3732c8260f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-3.png index fe04965157..07bd9ca000 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-4.png index 74315813c2..52ebfd0f7c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-5.png index 1eb32e8bec..c4aaf2038f 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-6.png index fc47c27bb6..36480589b1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/watermelon.rsi/stage-6.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/dead.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/dead.png index 3a1e5735cd..009776394c 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/dead.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/dead.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png index 9eb45d1199..2caeda662b 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/harvest.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json index 3e15b491d2..9c4e3cc701 100644 --- a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github)", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/commit/1dbcf389b0ec6b2c51b002df5fef8dd1519f8068, inhands by mubururu_ (github), Growth stages, harvest, dead, and produce sprites created by Chaoticaa (GitHub)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png index 37c4163300..dcb7452ff1 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/produce.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-1.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-1.png index 77e20df4fc..2698dae055 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-1.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-1.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-2.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-2.png index 419ba77c1f..e26996cb79 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-2.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-2.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-3.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-3.png index 23a74c6983..a940b757ca 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-3.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-3.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-4.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-4.png index 2bea35ad62..701db9900d 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-4.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-4.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png index efe887736d..c4d1f5b41e 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-5.png differ diff --git a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png index d49034836d..e1ca244dd7 100644 Binary files a/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png and b/Resources/Textures/Objects/Specific/Hydroponics/wheat.rsi/stage-6.png differ diff --git a/Resources/Textures/Structures/Wallmounts/posters.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/posters.rsi/meta.json index f4677e6099..46f2b816dc 100644 --- a/Resources/Textures/Structures/Wallmounts/posters.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/posters.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from at commit https://github.com/tgstation/tgstation/commit/f01de25493e2bd2706ef9b0303cb0d7b5e3e471b. poster52_contraband, poster53_contraband and poster54_contraband taken from https://github.com/vgstation-coders/vgstation13/blob/435ed5f2a7926e91cc31abac3a0d47d7e9ad7ed4/icons/obj/posters.dmi. originmap, poster55_contraband, poster56_contraband, poster57_contraband and poster39_legit by discord brainfood#7460, poster63_contraband by discord foboscheshir_, poster52_legit by SlamBamActionman, poster53_legit and the original version by @RCOI on discord, modified by Spessmann.", + "copyright": "Taken from at commit https://github.com/tgstation/tgstation/commit/f01de25493e2bd2706ef9b0303cb0d7b5e3e471b. poster52_contraband, poster53_contraband and poster54_contraband taken from https://github.com/vgstation-coders/vgstation13/blob/435ed5f2a7926e91cc31abac3a0d47d7e9ad7ed4/icons/obj/posters.dmi. originmap, poster55_contraband, poster56_contraband, poster57_contraband and poster39_legit by discord brainfood#7460, poster63_contraband by discord foboscheshir_, poster52_legit by SlamBamActionman, poster53_legit and the original version by @RCOI on discord, modified by Spessmann, poster54_legit by hex_reject on Discord.", "size": { "x": 32, "y": 32 @@ -387,6 +387,9 @@ { "name": "poster53_legit" }, + { + "name": "poster54_legit" + }, { "name": "random_legit" }, diff --git a/Resources/Textures/Structures/Wallmounts/posters.rsi/poster54_legit.png b/Resources/Textures/Structures/Wallmounts/posters.rsi/poster54_legit.png new file mode 100644 index 0000000000..d1d633d3d0 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/posters.rsi/poster54_legit.png differ