From 4931674150d6890377d96f832b6b54c47ed6521b Mon Sep 17 00:00:00 2001 From: Koollan Date: Sun, 3 May 2026 01:16:48 -0700 Subject: [PATCH 01/31] feature: Adds Space Sectors Adds space sectors and the ability to add events to them. Currently the only event is a test event labeled GravitationalStorm which does nothing but make the sector it's targetting have a purple border --- Content.Client/Shuttles/UI/NavScreen.xaml | 5 + Content.Client/Shuttles/UI/NavScreen.xaml.cs | 5 + .../Shuttles/UI/ShuttleNavControl.xaml.cs | 148 +++++++++++++++++- .../Commands/SectorWeatherCommand.cs | 64 ++++++++ .../Events/SectorWeatherChangedEvent.cs | 15 ++ .../Sectors/Systems/SectorWeatherSystem.cs | 40 +++++ .../Shuttles/Systems/RadarConsoleSystem.cs | 14 ++ .../Shuttles/Systems/ShuttleConsoleSystem.cs | 24 ++- Content.Shared/CCVar/CCVars.Sectors.cs | 18 +++ .../Prototypes/SectorWeatherPrototype.cs | 17 ++ Content.Shared/Sectors/SectorHelpers.cs | 54 +++++++ Content.Shared/Sectors/SharedSectorSystem.cs | 67 ++++++++ Content.Shared/Sectors/SpaceSector.cs | 14 ++ .../Shuttles/BUIStates/NavInterfaceState.cs | 8 +- .../Shared/Sectors/SectorHelpersTest.cs | 30 ++++ Resources/Locale/en-US/sectors/weather.ftl | 1 + Resources/Locale/en-US/shuttles/console.ftl | 11 ++ .../Prototypes/Sectors/sector_weather.yml | 4 + 18 files changed, 533 insertions(+), 6 deletions(-) create mode 100644 Content.Server/Administration/Commands/SectorWeatherCommand.cs create mode 100644 Content.Server/Sectors/Events/SectorWeatherChangedEvent.cs create mode 100644 Content.Server/Sectors/Systems/SectorWeatherSystem.cs create mode 100644 Content.Shared/CCVar/CCVars.Sectors.cs create mode 100644 Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs create mode 100644 Content.Shared/Sectors/SectorHelpers.cs create mode 100644 Content.Shared/Sectors/SharedSectorSystem.cs create mode 100644 Content.Shared/Sectors/SpaceSector.cs create mode 100644 Content.Tests/Shared/Sectors/SectorHelpersTest.cs create mode 100644 Resources/Locale/en-US/sectors/weather.ftl create mode 100644 Resources/Prototypes/Sectors/sector_weather.yml diff --git a/Content.Client/Shuttles/UI/NavScreen.xaml b/Content.Client/Shuttles/UI/NavScreen.xaml index d67992f8179..c5a8e7d7cc3 100644 --- a/Content.Client/Shuttles/UI/NavScreen.xaml +++ b/Content.Client/Shuttles/UI/NavScreen.xaml @@ -35,6 +35,11 @@ Text="0.0, 0.0" HorizontalExpand="True" Align="Right"/> + + (); + _sectorSystem = _entManager.System(); IFFToggle.OnToggled += OnIFFTogglePressed; IFFToggle.Pressed = NavRadar.ShowIFF; @@ -99,6 +102,8 @@ protected override void Draw(DrawingHandleScreen handle) GridPosition.Text = Loc.GetString("shuttle-console-position-value", ("X", $"{worldPos.X:0.0}"), ("Y", $"{worldPos.Y:0.0}")); + GridSector.Text = Loc.GetString("shuttle-console-sector-value", + ("sector", _sectorSystem.GetSectorName(_sectorSystem.GetSector(worldPos)))); GridOrientation.Text = Loc.GetString("shuttle-console-orientation-value", ("angle", $"{displayRot.Degrees:0.0}")); diff --git a/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs b/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs index aef872e2905..b1012c44d8f 100644 --- a/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs +++ b/Content.Client/Shuttles/UI/ShuttleNavControl.xaml.cs @@ -1,4 +1,7 @@ using Content.Shared.Movement.Components; +using Content.Shared.CCVar; +using Content.Shared.Sectors; +using Content.Shared.Sectors.Prototypes; using Content.Shared.Shuttles.BUIStates; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Systems; @@ -7,11 +10,13 @@ using Robust.Client.Graphics; using Robust.Client.UserInterface; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; using Robust.Shared.Input; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; +using Robust.Shared.Prototypes; using System.Numerics; namespace Content.Client.Shuttles.UI; @@ -20,7 +25,10 @@ namespace Content.Client.Shuttles.UI; public sealed partial class ShuttleNavControl : BaseShuttleControl { [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly IPrototypeManager _prototypes = default!; private readonly SharedShuttleSystem _shuttles; + private readonly SharedSectorSystem _sectors; private readonly SharedTransformSystem _transform; /// @@ -36,6 +44,7 @@ public sealed partial class ShuttleNavControl : BaseShuttleControl private Angle? _rotation; private Dictionary> _docks = new(); + private Dictionary _sectorWeatherEvents = new(); public bool ShowIFF { get; set; } = true; public bool ShowDocks { get; set; } = true; @@ -55,6 +64,7 @@ public ShuttleNavControl() : base(64f, 256f, 256f) { RobustXamlLoader.Load(this); _shuttles = EntManager.System(); + _sectors = EntManager.System(); _transform = EntManager.System(); } @@ -125,6 +135,7 @@ public void UpdateState(NavInterfaceState state) RotateWithEntity = state.RotateWithEntity; _docks = state.Docks; + _sectorWeatherEvents = state.SectorWeatherEvents; } protected override void Draw(DrawingHandleScreen handle) @@ -152,6 +163,11 @@ protected override void Draw(DrawingHandleScreen handle) } var mapPos = _transform.ToMapCoordinates(_coordinates.Value); + + var sectorName = _sectors.GetSectorName(_sectors.GetSector(mapPos.Position)); + var sectorText = Loc.GetString("shuttle-console-sector-value", ("sector", sectorName)); + handle.DrawString(Font, new Vector2(8f, 8f), sectorText, Color.White); + var posMatrix = Matrix3Helpers.CreateTransform(_coordinates.Value.Position, _rotation.Value); var ourEntRot = RotateWithEntity ? _transform.GetWorldRotation(xform) : _rotation.Value; var ourEntMatrix = Matrix3Helpers.CreateTransform(_transform.GetWorldPosition(xform), ourEntRot); @@ -159,6 +175,9 @@ protected override void Draw(DrawingHandleScreen handle) var shuttleToWorld = Matrix3x2.Multiply(posMatrix, ourEntMatrix); Matrix3x2.Invert(shuttleToWorld, out var worldToShuttle); var shuttleToView = Matrix3x2.CreateScale(new Vector2(MinimapScale, -MinimapScale)) * Matrix3x2.CreateTranslation(MidPointVector); + var worldToView = worldToShuttle * shuttleToView; + + DrawSectorBoundaries(handle, worldToView); var map = _transform.GetMap(xform.Coordinates); if (map != null && mapBoundsQuery.TryGetComponent(map, out var mapBounds) && mapBounds != null) @@ -307,7 +326,7 @@ protected override void Draw(DrawingHandleScreen handle) if (consoleXform.ParentUid != _coordinates.Value.EntityId) { var consolePositionWorld = _transform.GetWorldPosition((EntityUid)_consoleEntity); - var p = Vector2.Transform(consolePositionWorld, worldToShuttle * shuttleToView); + var p = Vector2.Transform(consolePositionWorld, worldToView); handle.DrawCircle(p, 5, Color.ToSrgb(Color.Cyan), true); } } @@ -319,6 +338,133 @@ private bool ShouldFade(IFFComponent? iff) return !_shuttles.MatchesSortTag(iff, SortMode); } + private void DrawSectorBoundaries(DrawingHandleScreen handle, Matrix3x2 worldToView) + { + var centerRadius = _configuration.GetCVar(CCVars.SectorCenterRadius); + var maxRadius = _configuration.GetCVar(CCVars.SectorMaxRadius); + + var origin = Vector2.Transform(Vector2.Zero, worldToView); + var centerEdge = Vector2.Transform(new Vector2(centerRadius, 0f), worldToView); + var scaledCenterRadius = (centerEdge - origin).Length(); + + var ringColor = new Color(0.43f, 0.66f, 0.87f, 0.34f); + var borderColor = new Color(0.34f, 0.56f, 0.77f, 0.24f); + + handle.DrawCircle(origin, scaledCenterRadius, ringColor, false); + + // Octant boundaries: 22.5 + n * 45 keeps sector centers on cardinals and diagonals. + for (var i = 0; i < 8; i++) + { + DrawSectorBoundaryRay(handle, worldToView, centerRadius, maxRadius, SectorHelpers.EastLowerBoundary + (45f * i), borderColor); + } + + foreach (var (sector, weatherId) in _sectorWeatherEvents) + { + if (!_prototypes.TryIndex(weatherId, out var weather)) + continue; + + var weatherColor = Color.ToSrgb(weather.BorderColor); + + if (sector == SpaceSector.Center) + { + handle.DrawCircle(origin, scaledCenterRadius, weatherColor, false); + continue; + } + + if (!TryGetSectorBoundaryAngles(sector, out var firstBoundary, out var secondBoundary)) + continue; + + DrawSectorBoundaryRay(handle, worldToView, centerRadius, maxRadius, firstBoundary, weatherColor); + DrawSectorBoundaryRay(handle, worldToView, centerRadius, maxRadius, secondBoundary, weatherColor); + DrawSectorArc(handle, worldToView, centerRadius, firstBoundary, secondBoundary, weatherColor); + } + } + + private static bool TryGetSectorBoundaryAngles(SpaceSector sector, out float firstBoundary, out float secondBoundary) + { + switch (sector) + { + case SpaceSector.NorthEast: + firstBoundary = SectorHelpers.EastLowerBoundary; + secondBoundary = SectorHelpers.NorthEastUpperBoundary; + return true; + case SpaceSector.North: + firstBoundary = SectorHelpers.NorthEastUpperBoundary; + secondBoundary = SectorHelpers.NorthUpperBoundary; + return true; + case SpaceSector.NorthWest: + firstBoundary = SectorHelpers.NorthUpperBoundary; + secondBoundary = SectorHelpers.NorthWestUpperBoundary; + return true; + case SpaceSector.West: + firstBoundary = SectorHelpers.NorthWestUpperBoundary; + secondBoundary = SectorHelpers.WestUpperBoundary; + return true; + case SpaceSector.SouthWest: + firstBoundary = SectorHelpers.WestUpperBoundary; + secondBoundary = SectorHelpers.SouthWestUpperBoundary; + return true; + case SpaceSector.South: + firstBoundary = SectorHelpers.SouthWestUpperBoundary; + secondBoundary = SectorHelpers.SouthUpperBoundary; + return true; + case SpaceSector.SouthEast: + firstBoundary = SectorHelpers.SouthUpperBoundary; + secondBoundary = SectorHelpers.SouthEastUpperBoundary; + return true; + case SpaceSector.East: + firstBoundary = SectorHelpers.SouthEastUpperBoundary; + secondBoundary = SectorHelpers.EastLowerBoundary; + return true; + default: + firstBoundary = 0f; + secondBoundary = 0f; + return false; + } + } + + private static void DrawSectorBoundaryRay( + DrawingHandleScreen handle, + Matrix3x2 worldToView, + float centerRadius, + float maxRadius, + float boundaryDegrees, + Color color) + { + var boundaryDirection = Angle.FromDegrees(boundaryDegrees).ToVec(); + var startWorld = boundaryDirection * centerRadius; + var endpointWorld = boundaryDirection * maxRadius; + var startView = Vector2.Transform(startWorld, worldToView); + var endpointView = Vector2.Transform(endpointWorld, worldToView); + handle.DrawLine(startView, endpointView, color); + } + + private static void DrawSectorArc( + DrawingHandleScreen handle, + Matrix3x2 worldToView, + float centerRadius, + float startDegrees, + float endDegrees, + Color color) + { + const int segments = 12; + // Handle wrap-around (e.g. East sector: 337.5° → 22.5°) + var range = endDegrees > startDegrees + ? endDegrees - startDegrees + : endDegrees + 360f - startDegrees; + + Vector2? prev = null; + for (var i = 0; i <= segments; i++) + { + var t = i / (float) segments; + var dir = Angle.FromDegrees(startDegrees + range * t).ToVec(); + var viewPos = Vector2.Transform(dir * centerRadius, worldToView); + if (prev.HasValue) + handle.DrawLine(prev.Value, viewPos, color); + prev = viewPos; + } + } + private void DrawDocks(DrawingHandleScreen handle, EntityUid uid, Matrix3x2 gridToView) { if (!ShowDocks) diff --git a/Content.Server/Administration/Commands/SectorWeatherCommand.cs b/Content.Server/Administration/Commands/SectorWeatherCommand.cs new file mode 100644 index 00000000000..a35bf345064 --- /dev/null +++ b/Content.Server/Administration/Commands/SectorWeatherCommand.cs @@ -0,0 +1,64 @@ +using System.Linq; +using Content.Server.Sectors.Systems; +using Content.Shared.Administration; +using Content.Shared.Sectors; +using Content.Shared.Sectors.Prototypes; +using Robust.Shared.Console; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Admin)] +public sealed class SectorWeatherCommand : LocalizedEntityCommands +{ + [Dependency] private readonly SectorWeatherSystem _sectorWeather = default!; + + public override string Command => "sectorweather"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 2) + { + shell.WriteLine("Usage: sectorweather "); + return; + } + + if (!Enum.TryParse(args[0], true, out var sector)) + { + shell.WriteError($"Invalid sector '{args[0]}'."); + return; + } + + var value = args[1]; + if (string.Equals(value, "clear", StringComparison.OrdinalIgnoreCase)) + { + if (_sectorWeather.ClearWeather(sector)) + shell.WriteLine($"Cleared sector weather for {sector}."); + else + shell.WriteLine($"No active weather found for {sector}."); + + return; + } + + if (!_sectorWeather.TrySetWeather(sector, value)) + { + shell.WriteError($"Unknown sector weather prototype '{value}'."); + return; + } + + shell.WriteLine($"Set {sector} weather to {value}."); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + var sectorOptions = Enum.GetNames(); + + return args.Length switch + { + 1 => CompletionResult.FromHintOptions(sectorOptions, "Sector name"), + 2 => CompletionResult.FromHintOptions( + CompletionHelper.PrototypeIDs().Append(new CompletionOption("clear")), + "Weather prototype ID or clear"), + _ => CompletionResult.Empty, + }; + } +} diff --git a/Content.Server/Sectors/Events/SectorWeatherChangedEvent.cs b/Content.Server/Sectors/Events/SectorWeatherChangedEvent.cs new file mode 100644 index 00000000000..ae1bc53cbd6 --- /dev/null +++ b/Content.Server/Sectors/Events/SectorWeatherChangedEvent.cs @@ -0,0 +1,15 @@ +using Content.Shared.Sectors; + +namespace Content.Server.Sectors.Events; + +public sealed class SectorWeatherChangedEvent : EntityEventArgs +{ + public SpaceSector Sector { get; } + public string? WeatherId { get; } + + public SectorWeatherChangedEvent(SpaceSector sector, string? weatherId) + { + Sector = sector; + WeatherId = weatherId; + } +} diff --git a/Content.Server/Sectors/Systems/SectorWeatherSystem.cs b/Content.Server/Sectors/Systems/SectorWeatherSystem.cs new file mode 100644 index 00000000000..f81ce929aae --- /dev/null +++ b/Content.Server/Sectors/Systems/SectorWeatherSystem.cs @@ -0,0 +1,40 @@ +using Content.Server.Sectors.Events; +using Content.Shared.Sectors; +using Content.Shared.Sectors.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Server.Sectors.Systems; + +/// +/// Tracks active sector weather events and broadcasts changes for UI systems. +/// +public sealed class SectorWeatherSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototypes = default!; + + private readonly Dictionary _activeWeather = new(); + + public Dictionary GetWeatherSnapshot() + { + return new Dictionary(_activeWeather); + } + + public bool TrySetWeather(SpaceSector sector, string weatherId) + { + if (!_prototypes.HasIndex(weatherId)) + return false; + + _activeWeather[sector] = weatherId; + RaiseLocalEvent(new SectorWeatherChangedEvent(sector, weatherId)); + return true; + } + + public bool ClearWeather(SpaceSector sector) + { + if (!_activeWeather.Remove(sector)) + return false; + + RaiseLocalEvent(new SectorWeatherChangedEvent(sector, null)); + return true; + } +} diff --git a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs index 3ac93e702dd..8d6aeeb19b0 100644 --- a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs @@ -4,6 +4,8 @@ using Robust.Server.GameObjects; using Robust.Shared.Map; using System.Numerics; +using Content.Server.Sectors.Events; +using Content.Server.Sectors.Systems; namespace Content.Server.Shuttles.Systems; @@ -11,6 +13,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem { [Dependency] private readonly ShuttleConsoleSystem _console = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly SectorWeatherSystem _sectorWeather = default!; public override void Initialize() { @@ -21,6 +24,8 @@ public override void Initialize() { subs.Event(UpdateUserInterface); }); + + SubscribeLocalEvent(OnSectorWeatherChanged); } private void UpdateUserInterface(EntityUid uid, RadarConsoleComponent component, BoundUIOpenedEvent args) @@ -33,6 +38,15 @@ private void OnRadarStartup(EntityUid uid, RadarConsoleComponent component, Comp UpdateState(uid, component); } + private void OnSectorWeatherChanged(SectorWeatherChangedEvent ev) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + UpdateState(uid, comp); + } + } + protected override void UpdateState(EntityUid uid, RadarConsoleComponent component) { var xform = Transform(uid); diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index a8b07791edc..80b0e70a25a 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -1,4 +1,6 @@ using Content.Server.Power.EntitySystems; +using Content.Server.Sectors.Events; +using Content.Server.Sectors.Systems; using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; using Content.Server.Station.Systems; @@ -37,6 +39,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem [Dependency] private readonly TagSystem _tags = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly SharedContentEyeSystem _eyeSystem = default!; + [Dependency] private readonly SectorWeatherSystem _sectorWeather = default!; private EntityQuery _metaQuery; private EntityQuery _xformQuery; @@ -74,6 +77,7 @@ public override void Initialize() SubscribeLocalEvent(OnDock); SubscribeLocalEvent(OnUndock); + SubscribeLocalEvent(OnSectorWeatherChanged); SubscribeLocalEvent(OnGetState); SubscribeLocalEvent(OnStopPilotingAlert); @@ -104,6 +108,11 @@ private void OnUndock(UndockEvent ev) RefreshShuttleConsoles(); } + private void OnSectorWeatherChanged(SectorWeatherChangedEvent ev) + { + RefreshShuttleConsoles(); + } + /// /// Refreshes all the shuttle console data for a particular grid. /// @@ -277,7 +286,13 @@ private void UpdateState(EntityUid consoleUid, ref DockingInterfaceState? dockSt } else { - navState = new NavInterfaceState(0f, null, null, new Dictionary>(), ShuttleDampingMode.Normal); + navState = new NavInterfaceState( + 0f, + null, + null, + new Dictionary>(), + ShuttleDampingMode.Normal, + _sectorWeather.GetWeatherSnapshot()); mapState = new ShuttleMapInterfaceState( FTLState.Invalid, default, @@ -399,7 +414,7 @@ public NavInterfaceState GetNavState(Entity diff --git a/Content.Shared/CCVar/CCVars.Sectors.cs b/Content.Shared/CCVar/CCVars.Sectors.cs new file mode 100644 index 00000000000..fcef012d7e8 --- /dev/null +++ b/Content.Shared/CCVar/CCVars.Sectors.cs @@ -0,0 +1,18 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.CCVar; + +public sealed partial class CCVars +{ + /// + /// Radius around the world origin that resolves to the center sector. + /// + public static readonly CVarDef SectorCenterRadius = + CVarDef.Create("sector.center_radius", 1250f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + + /// + /// Reserved maximum radius for future sector-based systems. + /// + public static readonly CVarDef SectorMaxRadius = + CVarDef.Create("sector.max_radius", 50000f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); +} \ No newline at end of file diff --git a/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs b/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs new file mode 100644 index 00000000000..6b9e45c9733 --- /dev/null +++ b/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Maths; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Sectors.Prototypes; + +[Prototype("sectorWeather")] +public sealed partial class SectorWeatherPrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField] + public string Name { get; private set; } = string.Empty; + + [DataField(required: true)] + public Color BorderColor { get; private set; } = Color.White; +} diff --git a/Content.Shared/Sectors/SectorHelpers.cs b/Content.Shared/Sectors/SectorHelpers.cs new file mode 100644 index 00000000000..889f2e53ab2 --- /dev/null +++ b/Content.Shared/Sectors/SectorHelpers.cs @@ -0,0 +1,54 @@ +using System.Numerics; +using Robust.Shared.Maths; + +namespace Content.Shared.Sectors; + +/// +/// Shared sector math helpers for classifying world positions into compass sectors. +/// +public static class SectorHelpers +{ + public const float EastLowerBoundary = 22.5f; + public const float NorthEastUpperBoundary = 67.5f; + public const float NorthUpperBoundary = 112.5f; + public const float NorthWestUpperBoundary = 157.5f; + public const float WestUpperBoundary = 202.5f; + public const float SouthWestUpperBoundary = 247.5f; + public const float SouthUpperBoundary = 292.5f; + public const float SouthEastUpperBoundary = 337.5f; + + /// + /// Classifies a world position into a space sector relative to the fixed origin. + /// + public static SpaceSector GetSector(Vector2 worldPos, float centerRadius) + { + if (worldPos.Length() <= centerRadius) + return SpaceSector.Center; + + var angleRadians = MathF.Atan2(worldPos.Y, worldPos.X); + var degrees = (MathHelper.RadiansToDegrees(angleRadians) + 360f) % 360f; + + if (degrees >= SouthEastUpperBoundary || degrees < EastLowerBoundary) + return SpaceSector.East; + + if (degrees < NorthEastUpperBoundary) + return SpaceSector.NorthEast; + + if (degrees < NorthUpperBoundary) + return SpaceSector.North; + + if (degrees < NorthWestUpperBoundary) + return SpaceSector.NorthWest; + + if (degrees < WestUpperBoundary) + return SpaceSector.West; + + if (degrees < SouthWestUpperBoundary) + return SpaceSector.SouthWest; + + if (degrees < SouthUpperBoundary) + return SpaceSector.South; + + return SpaceSector.SouthEast; + } +} \ No newline at end of file diff --git a/Content.Shared/Sectors/SharedSectorSystem.cs b/Content.Shared/Sectors/SharedSectorSystem.cs new file mode 100644 index 00000000000..b06c26aa0f5 --- /dev/null +++ b/Content.Shared/Sectors/SharedSectorSystem.cs @@ -0,0 +1,67 @@ +using System.Numerics; +using Content.Shared.CCVar; +using Robust.Shared.Configuration; + +namespace Content.Shared.Sectors; + +/// +/// Shared API for resolving named sectors from world positions and entities. +/// +public sealed class SharedSectorSystem : EntitySystem +{ + [Dependency] private readonly IConfigurationManager _configuration = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + private float CenterRadius => _configuration.GetCVar(CCVars.SectorCenterRadius); + + /// + /// Gets the space sector for the provided world position. + /// + public SpaceSector GetSector(Vector2 worldPos) + { + return SectorHelpers.GetSector(worldPos, CenterRadius); + } + + /// + /// Gets the space sector for an entity's world position. + /// + public SpaceSector GetSector(EntityUid uid) + { + return GetSector(_transform.GetWorldPosition(uid)); + } + + /// + /// Tries to resolve the space sector for an entity. + /// + public bool TryGetSector(EntityUid uid, out SpaceSector sector) + { + if (!Exists(uid)) + { + sector = default; + return false; + } + + sector = GetSector(uid); + return true; + } + + /// + /// Gets the localized display name for a sector. + /// + public string GetSectorName(SpaceSector sector) + { + return Loc.GetString(sector switch + { + SpaceSector.Center => "sector-center", + SpaceSector.North => "sector-north", + SpaceSector.NorthEast => "sector-northeast", + SpaceSector.East => "sector-east", + SpaceSector.SouthEast => "sector-southeast", + SpaceSector.South => "sector-south", + SpaceSector.SouthWest => "sector-southwest", + SpaceSector.West => "sector-west", + SpaceSector.NorthWest => "sector-northwest", + _ => throw new ArgumentOutOfRangeException(nameof(sector), sector, null), + }); + } +} \ No newline at end of file diff --git a/Content.Shared/Sectors/SpaceSector.cs b/Content.Shared/Sectors/SpaceSector.cs new file mode 100644 index 00000000000..85184976980 --- /dev/null +++ b/Content.Shared/Sectors/SpaceSector.cs @@ -0,0 +1,14 @@ +namespace Content.Shared.Sectors; + +public enum SpaceSector +{ + Center, + North, + NorthEast, + East, + SouthEast, + South, + SouthWest, + West, + NorthWest, +} \ No newline at end of file diff --git a/Content.Shared/Shuttles/BUIStates/NavInterfaceState.cs b/Content.Shared/Shuttles/BUIStates/NavInterfaceState.cs index afda10ff808..5acd5bef296 100644 --- a/Content.Shared/Shuttles/BUIStates/NavInterfaceState.cs +++ b/Content.Shared/Shuttles/BUIStates/NavInterfaceState.cs @@ -1,3 +1,4 @@ +using Content.Shared.Sectors; using Content.Shared.Shuttles.Components; using Robust.Shared.Map; using Robust.Shared.Serialization; @@ -21,6 +22,8 @@ public sealed class NavInterfaceState public Dictionary> Docks; + public Dictionary SectorWeatherEvents; + public bool RotateWithEntity = true; public readonly ShuttleDampingMode DampingMode; @@ -29,13 +32,16 @@ public NavInterfaceState( float maxRange, NetCoordinates? coordinates, Angle? angle, - Dictionary> docks, ShuttleDampingMode dampingMode) + Dictionary> docks, + ShuttleDampingMode dampingMode, + Dictionary? sectorWeatherEvents = null) { MaxRange = maxRange; Coordinates = coordinates; Angle = angle; Docks = docks; DampingMode = dampingMode; + SectorWeatherEvents = sectorWeatherEvents ?? new Dictionary(); } } diff --git a/Content.Tests/Shared/Sectors/SectorHelpersTest.cs b/Content.Tests/Shared/Sectors/SectorHelpersTest.cs new file mode 100644 index 00000000000..3f4fc94e68e --- /dev/null +++ b/Content.Tests/Shared/Sectors/SectorHelpersTest.cs @@ -0,0 +1,30 @@ +using System.Numerics; +using Content.Shared.Sectors; +using NUnit.Framework; +using Robust.UnitTesting; + +namespace Content.Tests.Shared.Sectors; + +[TestFixture] +public sealed class SectorHelpersTest : RobustUnitTest +{ + private const float CenterRadius = 1250f; + + [TestCase(0f, 0f, SpaceSector.Center)] + [TestCase(10000f, 0f, SpaceSector.East)] + [TestCase(-10000f, 0f, SpaceSector.West)] + [TestCase(0f, 10000f, SpaceSector.North)] + [TestCase(0f, -10000f, SpaceSector.South)] + [TestCase(10000f, 10000f, SpaceSector.NorthEast)] + [TestCase(-10000f, 10000f, SpaceSector.NorthWest)] + [TestCase(10000f, -10000f, SpaceSector.SouthEast)] + [TestCase(-10000f, -10000f, SpaceSector.SouthWest)] + [TestCase(1250f, 0f, SpaceSector.Center)] + [TestCase(1250.1f, 0f, SpaceSector.East)] + public void GetSector_ReturnsExpectedSector(float x, float y, SpaceSector expected) + { + var sector = SectorHelpers.GetSector(new Vector2(x, y), CenterRadius); + + Assert.That(sector, Is.EqualTo(expected)); + } +} \ No newline at end of file diff --git a/Resources/Locale/en-US/sectors/weather.ftl b/Resources/Locale/en-US/sectors/weather.ftl new file mode 100644 index 00000000000..145217382be --- /dev/null +++ b/Resources/Locale/en-US/sectors/weather.ftl @@ -0,0 +1 @@ +sector-weather-gravitational-storm = Gravitational storm diff --git a/Resources/Locale/en-US/shuttles/console.ftl b/Resources/Locale/en-US/shuttles/console.ftl index 75b82fa69ed..67cd83677a3 100644 --- a/Resources/Locale/en-US/shuttles/console.ftl +++ b/Resources/Locale/en-US/shuttles/console.ftl @@ -11,12 +11,23 @@ shuttle-console-display-label = Display shuttle-console-position = Position: shuttle-console-position-value = {$X}, {$Y} +shuttle-console-sector = Current Sector: +shuttle-console-sector-value = {$sector} shuttle-console-orientation = Orientation: shuttle-console-orientation-value = {$angle} shuttle-console-linear-velocity = Linear velocity: shuttle-console-linear-velocity-value = {$X}, {$Y} shuttle-console-angular-velocity = Angular velocity: shuttle-console-angular-velocity-value = {$angularVelocity} +sector-center = Center +sector-north = North +sector-northeast = NorthEast +sector-east = East +sector-southeast = SouthEast +sector-south = South +sector-southwest = SouthWest +sector-west = West +sector-northwest = NorthWest shuttle-console-damping-label = Damping shuttle-console-damping-cruise = Cruise shuttle-console-damping-normal = Normal diff --git a/Resources/Prototypes/Sectors/sector_weather.yml b/Resources/Prototypes/Sectors/sector_weather.yml new file mode 100644 index 00000000000..88006c2e932 --- /dev/null +++ b/Resources/Prototypes/Sectors/sector_weather.yml @@ -0,0 +1,4 @@ +- type: sectorWeather + id: GravitationalStorm + name: sector-weather-gravitational-storm + borderColor: "#7B3FA0C0" From 3dbfe19173d3876a6d18cd7957e54385bec1e3ea Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Sun, 3 May 2026 13:29:04 -0600 Subject: [PATCH 02/31] update config preset --- Content.Client/MessageBoard/UI/MessageBoard.xaml | 6 +++--- Content.Client/MessageBoard/UI/MessageBoard.xaml.cs | 1 + Resources/ConfigPresets/persist.toml | 10 ++++++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Content.Client/MessageBoard/UI/MessageBoard.xaml b/Content.Client/MessageBoard/UI/MessageBoard.xaml index 8f5cc6dd0f8..0519c40bf33 100644 --- a/Content.Client/MessageBoard/UI/MessageBoard.xaml +++ b/Content.Client/MessageBoard/UI/MessageBoard.xaml @@ -5,7 +5,7 @@ MinSize="600 690"> - + /// Any time this is modified, should be called. [DataField("baseDecayRate"), ViewVariables(VVAccess.ReadWrite)] - public float BaseDecayRate = 0.01666666666f; + public float BaseDecayRate = 0.008333333f; /// /// The actual amount at which decays. diff --git a/Content.Shared/Nutrition/Components/ThirstComponent.cs b/Content.Shared/Nutrition/Components/ThirstComponent.cs index 5c32b4af286..4f9e2fd4fe8 100644 --- a/Content.Shared/Nutrition/Components/ThirstComponent.cs +++ b/Content.Shared/Nutrition/Components/ThirstComponent.cs @@ -14,7 +14,7 @@ public sealed partial class ThirstComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField("baseDecayRate")] [AutoNetworkedField] - public float BaseDecayRate = 0.1f; + public float BaseDecayRate = 0.05f; [ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] From 4dde39fc34290c841fa7c8350e5e01d4b84d0c34 Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Mon, 4 May 2026 14:00:37 -0500 Subject: [PATCH 09/31] Reduced penalty for overfed and overthirst to 1.1, down from 1.2 --- Content.Shared/Nutrition/Components/HungerComponent.cs | 2 +- Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Nutrition/Components/HungerComponent.cs b/Content.Shared/Nutrition/Components/HungerComponent.cs index 35ba06f4abd..48694c2591b 100644 --- a/Content.Shared/Nutrition/Components/HungerComponent.cs +++ b/Content.Shared/Nutrition/Components/HungerComponent.cs @@ -97,7 +97,7 @@ public sealed partial class HungerComponent : Component [AutoNetworkedField] public Dictionary HungerThresholdDecayModifiers = new() { - { HungerThreshold.Overfed, 1.2f }, + { HungerThreshold.Overfed, 1.1f }, { HungerThreshold.Okay, 1f }, { HungerThreshold.Peckish, 0.8f }, { HungerThreshold.Starving, 0.6f }, diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 1730f7b3f21..51e244043fa 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -193,7 +193,7 @@ private void UpdateEffects(EntityUid uid, ThirstComponent component) { case ThirstThreshold.OverHydrated: component.LastThirstThreshold = component.CurrentThirstThreshold; - component.ActualDecayRate = component.BaseDecayRate * 1.2f; + component.ActualDecayRate = component.BaseDecayRate * 1.1f; return; case ThirstThreshold.Okay: From 15f5224f5ced9f4ca0d0098a53f73fb08e9efa7a Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Mon, 4 May 2026 14:22:21 -0500 Subject: [PATCH 10/31] Updated Diona body to match relative thirst and hunger decay rates --- Resources/Prototypes/Body/Species/diona.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Body/Species/diona.yml b/Resources/Prototypes/Body/Species/diona.yml index 7790c67ecf5..e32531cbe27 100644 --- a/Resources/Prototypes/Body/Species/diona.yml +++ b/Resources/Prototypes/Body/Species/diona.yml @@ -79,9 +79,9 @@ types: Asphyxiation: -1.0 - type: Hunger - baseDecayRate: 0.0083 + baseDecayRate: 0.00415 - type: Thirst - baseDecayRate: 0.0083 + baseDecayRate: 0.00415 - type: Damageable damageModifierSet: Diona - type: DamageVisuals From 0a5d4e082fcfcb73679ca1b0a5248960748bc3d8 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Mon, 4 May 2026 16:29:36 -0600 Subject: [PATCH 11/31] fix errors --- .../CrewMetaRecords/Components/CrewMetaRecordsComponent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs b/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs index e442b045423..29eea956961 100644 --- a/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs +++ b/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.CrewAssignments.Prototypes; using Content.Shared.CrewAssignments.Systems; +using Content.Shared.MessageBoard.Components; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -7,7 +8,6 @@ namespace Content.Shared.CrewMetaRecords; [RegisterComponent, NetworkedComponent] -[AutoGenerateComponentState] public sealed partial class CrewMetaRecordsComponent : Component { [DataField] @@ -26,6 +26,8 @@ public sealed partial class CrewMetaRecordsComponent : Component public List CompletedObjectives { get; set; } = new(); [DataField] public List CodexEntries { get; set; } = new(); + + public List MessageBoardEntries { get; set; } = new(); [DataField] public Dictionary CrewMetaRecords { get; set; } = new(); [DataField] From f5e1b8aafbb58b47d06f0fea02f794b6cab2ce36 Mon Sep 17 00:00:00 2001 From: Koollan Date: Mon, 4 May 2026 21:08:39 -0700 Subject: [PATCH 12/31] feat: Customizable Sectors V1 with Configurable Events ADDS: Sectors on the world map that can be named, resized and configured by admins. Two example events that overlay a shader depending on what sector you are. More features for the sector events planned in the near future. Admin tool added specifically to configure the sectors easily. This is to make the world more custom, interactive for the players (they can possibly name them in-character and ahelp the new sector name for admins to put in). --- .../UI/Tabs/AdminTab/AdminSectorWindow.xaml | 35 +++++ .../Tabs/AdminTab/AdminSectorWindow.xaml.cs | 136 ++++++++++++++++++ .../UI/Tabs/AdminTab/AdminTab.xaml | 1 + .../Sectors/Overlays/SectorEventOverlay.cs | 56 ++++++++ .../Systems/SectorEventVisualsSystem.cs | 89 ++++++++++++ Content.Client/Shuttles/UI/NavScreen.xaml | 5 + Content.Client/Shuttles/UI/NavScreen.xaml.cs | 31 +++- .../Sectors/Systems/SectorWeatherSystem.cs | 59 +++++++- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 8 +- Content.Shared/CCVar/CCVars.Sectors.cs | 22 +++ .../Events/SectorWeatherStateUpdateEvent.cs | 15 ++ .../Prototypes/SectorWeatherPrototype.cs | 12 ++ Content.Shared/Sectors/SharedSectorSystem.cs | 21 +++ .../tabs/admin-tab/player-actions-window.ftl | 16 +++ Resources/Locale/en-US/sectors/weather.ftl | 3 +- Resources/Locale/en-US/shuttles/console.ftl | 3 + .../Prototypes/Sectors/sector_weather.yml | 13 ++ Resources/Prototypes/Shaders/shaders.yml | 5 + .../Textures/Shaders/sector_event_tint.swsl | 26 ++++ 19 files changed, 549 insertions(+), 7 deletions(-) create mode 100644 Content.Client/Administration/UI/Tabs/AdminTab/AdminSectorWindow.xaml create mode 100644 Content.Client/Administration/UI/Tabs/AdminTab/AdminSectorWindow.xaml.cs create mode 100644 Content.Client/Sectors/Overlays/SectorEventOverlay.cs create mode 100644 Content.Client/Sectors/Systems/SectorEventVisualsSystem.cs create mode 100644 Content.Shared/Sectors/Events/SectorWeatherStateUpdateEvent.cs create mode 100644 Resources/Textures/Shaders/sector_event_tint.swsl diff --git a/Content.Client/Administration/UI/Tabs/AdminTab/AdminSectorWindow.xaml b/Content.Client/Administration/UI/Tabs/AdminTab/AdminSectorWindow.xaml new file mode 100644 index 00000000000..5161c22b054 --- /dev/null +++ b/Content.Client/Administration/UI/Tabs/AdminTab/AdminSectorWindow.xaml @@ -0,0 +1,35 @@ + + + + + + public sealed class SectorWeatherSystem : EntitySystem { + [Dependency] private readonly IPlayerManager _players = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; + [Dependency] private readonly IAdminLogManager _adminLog = default!; private readonly Dictionary _activeWeather = new(); + public override void Initialize() + { + base.Initialize(); + _activeWeather.Clear(); + _players.PlayerStatusChanged += OnPlayerStatusChanged; + } + + public override void Shutdown() + { + base.Shutdown(); + _players.PlayerStatusChanged -= OnPlayerStatusChanged; + _activeWeather.Clear(); + BroadcastWeatherState(); + } + public Dictionary GetWeatherSnapshot() { return new Dictionary(_activeWeather); } + public Dictionary GetHazardWeatherSnapshot() + { + var snapshot = new Dictionary(); + + foreach (var (sector, weatherId) in _activeWeather) + { + if (!_prototypes.TryIndex(weatherId, out var weather)) + continue; + + if (weather.Hazard) + snapshot[sector] = weatherId; + } + + return snapshot; + } + public bool TrySetWeather(SpaceSector sector, string weatherId) { if (!_prototypes.HasIndex(weatherId)) @@ -26,15 +66,32 @@ public bool TrySetWeather(SpaceSector sector, string weatherId) _activeWeather[sector] = weatherId; RaiseLocalEvent(new SectorWeatherChangedEvent(sector, weatherId)); + BroadcastWeatherState(); + _adminLog.Add(LogType.Action, LogImpact.Medium, $"Sector weather event '{weatherId}' set for sector {sector}."); return true; } public bool ClearWeather(SpaceSector sector) { - if (!_activeWeather.Remove(sector)) + if (!_activeWeather.Remove(sector, out var clearedId)) return false; RaiseLocalEvent(new SectorWeatherChangedEvent(sector, null)); + BroadcastWeatherState(); + _adminLog.Add(LogType.Action, LogImpact.Medium, $"Sector weather event '{clearedId}' cleared from sector {sector}."); return true; } + + private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs args) + { + if (args.NewStatus != SessionStatus.Connected) + return; + + RaiseNetworkEvent(new SectorWeatherStateUpdateEvent(GetWeatherSnapshot()), args.Session.Channel); + } + + private void BroadcastWeatherState() + { + RaiseNetworkEvent(new SectorWeatherStateUpdateEvent(GetWeatherSnapshot())); + } } diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index 80b0e70a25a..0d1ca146b73 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -292,7 +292,7 @@ private void UpdateState(EntityUid consoleUid, ref DockingInterfaceState? dockSt null, new Dictionary>(), ShuttleDampingMode.Normal, - _sectorWeather.GetWeatherSnapshot()); + _sectorWeather.GetHazardWeatherSnapshot()); mapState = new ShuttleMapInterfaceState( FTLState.Invalid, default, @@ -414,7 +414,7 @@ public NavInterfaceState GetNavState(Entity diff --git a/Content.Shared/CCVar/CCVars.Sectors.cs b/Content.Shared/CCVar/CCVars.Sectors.cs index fcef012d7e8..894532968af 100644 --- a/Content.Shared/CCVar/CCVars.Sectors.cs +++ b/Content.Shared/CCVar/CCVars.Sectors.cs @@ -15,4 +15,26 @@ public sealed partial class CCVars /// public static readonly CVarDef SectorMaxRadius = CVarDef.Create("sector.max_radius", 50000f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + + /// + /// Optional display name overrides for each sector. Empty string uses localization defaults. + /// + public static readonly CVarDef SectorNameCenter = + CVarDef.Create("sector.name.center", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameNorth = + CVarDef.Create("sector.name.north", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameNorthEast = + CVarDef.Create("sector.name.northeast", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameEast = + CVarDef.Create("sector.name.east", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameSouthEast = + CVarDef.Create("sector.name.southeast", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameSouth = + CVarDef.Create("sector.name.south", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameSouthWest = + CVarDef.Create("sector.name.southwest", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameWest = + CVarDef.Create("sector.name.west", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef SectorNameNorthWest = + CVarDef.Create("sector.name.northwest", string.Empty, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); } \ No newline at end of file diff --git a/Content.Shared/Sectors/Events/SectorWeatherStateUpdateEvent.cs b/Content.Shared/Sectors/Events/SectorWeatherStateUpdateEvent.cs new file mode 100644 index 00000000000..e6e8a4becb4 --- /dev/null +++ b/Content.Shared/Sectors/Events/SectorWeatherStateUpdateEvent.cs @@ -0,0 +1,15 @@ +using Content.Shared.Sectors; +using Robust.Shared.Serialization; + +namespace Content.Shared.Sectors.Events; + +[Serializable, NetSerializable] +public sealed class SectorWeatherStateUpdateEvent : EntityEventArgs +{ + public readonly Dictionary ActiveWeather; + + public SectorWeatherStateUpdateEvent(Dictionary activeWeather) + { + ActiveWeather = activeWeather; + } +} \ No newline at end of file diff --git a/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs b/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs index 6b9e45c9733..c6829e955d2 100644 --- a/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs +++ b/Content.Shared/Sectors/Prototypes/SectorWeatherPrototype.cs @@ -14,4 +14,16 @@ public sealed partial class SectorWeatherPrototype : IPrototype [DataField(required: true)] public Color BorderColor { get; private set; } = Color.White; + + [DataField] + public bool Hazard { get; private set; } = false; + + [DataField] + public Color ScreenTintColor { get; private set; } = Color.Transparent; + + [DataField] + public float ScreenTintStrength { get; private set; } = 1f; + + [DataField] + public float ScreenTintNoiseStrength { get; private set; } = 0f; } diff --git a/Content.Shared/Sectors/SharedSectorSystem.cs b/Content.Shared/Sectors/SharedSectorSystem.cs index b06c26aa0f5..b3d309267f1 100644 --- a/Content.Shared/Sectors/SharedSectorSystem.cs +++ b/Content.Shared/Sectors/SharedSectorSystem.cs @@ -50,6 +50,10 @@ public bool TryGetSector(EntityUid uid, out SpaceSector sector) /// public string GetSectorName(SpaceSector sector) { + var overrideName = _configuration.GetCVar(GetSectorNameCVar(sector)); + if (!string.IsNullOrWhiteSpace(overrideName)) + return overrideName; + return Loc.GetString(sector switch { SpaceSector.Center => "sector-center", @@ -64,4 +68,21 @@ public string GetSectorName(SpaceSector sector) _ => throw new ArgumentOutOfRangeException(nameof(sector), sector, null), }); } + + public static CVarDef GetSectorNameCVar(SpaceSector sector) + { + return sector switch + { + SpaceSector.Center => CCVars.SectorNameCenter, + SpaceSector.North => CCVars.SectorNameNorth, + SpaceSector.NorthEast => CCVars.SectorNameNorthEast, + SpaceSector.East => CCVars.SectorNameEast, + SpaceSector.SouthEast => CCVars.SectorNameSouthEast, + SpaceSector.South => CCVars.SectorNameSouth, + SpaceSector.SouthWest => CCVars.SectorNameSouthWest, + SpaceSector.West => CCVars.SectorNameWest, + SpaceSector.NorthWest => CCVars.SectorNameNorthWest, + _ => throw new ArgumentOutOfRangeException(nameof(sector), sector, null), + }; + } } \ No newline at end of file diff --git a/Resources/Locale/en-US/administration/ui/tabs/admin-tab/player-actions-window.ftl b/Resources/Locale/en-US/administration/ui/tabs/admin-tab/player-actions-window.ftl index 171e25d29fe..7f9ee1d99de 100644 --- a/Resources/Locale/en-US/administration/ui/tabs/admin-tab/player-actions-window.ftl +++ b/Resources/Locale/en-US/administration/ui/tabs/admin-tab/player-actions-window.ftl @@ -3,6 +3,22 @@ admin-player-actions-window-admin-ghost = Admin Ghost admin-player-actions-window-permissions = Permissions Panel admin-player-actions-window-announce = Announce admin-player-actions-window-shuttle = (Re)call Shuttle +admin-player-actions-window-sector-tools = Sector Tools admin-player-actions-window-admin-logs = Admin Logs admin-player-actions-window-admin-fax = Admin Fax admin-player-actions-window-admin-chat = Admin Chat + +admin-sector-title = Sector Tools +admin-sector-weather-header = Sector Event +admin-sector-sector-label = Sector: +admin-sector-weather-id-label = Event ID: +admin-sector-set-weather = Set Event +admin-sector-clear-weather = Clear Event +admin-sector-name-label = Sector Name: +admin-sector-set-name = Set Name +admin-sector-clear-name = Clear Name +admin-sector-radius-header = Sector Radii (CVars) +admin-sector-center-radius-label = Center Radius: +admin-sector-set-center-radius = Set Center Radius +admin-sector-max-radius-label = Max Radius: +admin-sector-set-max-radius = Set Max Radius diff --git a/Resources/Locale/en-US/sectors/weather.ftl b/Resources/Locale/en-US/sectors/weather.ftl index 145217382be..9d3aed45aa2 100644 --- a/Resources/Locale/en-US/sectors/weather.ftl +++ b/Resources/Locale/en-US/sectors/weather.ftl @@ -1 +1,2 @@ -sector-weather-gravitational-storm = Gravitational storm +sector-weather-gravitational-storm = Gravitational Storm +sector-weather-electron-surge = Electron Surge diff --git a/Resources/Locale/en-US/shuttles/console.ftl b/Resources/Locale/en-US/shuttles/console.ftl index 67cd83677a3..f820578e492 100644 --- a/Resources/Locale/en-US/shuttles/console.ftl +++ b/Resources/Locale/en-US/shuttles/console.ftl @@ -13,6 +13,9 @@ shuttle-console-position = Position: shuttle-console-position-value = {$X}, {$Y} shuttle-console-sector = Current Sector: shuttle-console-sector-value = {$sector} +shuttle-console-hazard-event = Hazard: +shuttle-console-hazard-event-none = None +shuttle-console-hazard-event-single = {$event} shuttle-console-orientation = Orientation: shuttle-console-orientation-value = {$angle} shuttle-console-linear-velocity = Linear velocity: diff --git a/Resources/Prototypes/Sectors/sector_weather.yml b/Resources/Prototypes/Sectors/sector_weather.yml index 88006c2e932..5eca29b8937 100644 --- a/Resources/Prototypes/Sectors/sector_weather.yml +++ b/Resources/Prototypes/Sectors/sector_weather.yml @@ -2,3 +2,16 @@ id: GravitationalStorm name: sector-weather-gravitational-storm borderColor: "#7B3FA0C0" + hazard: true + screenTintColor: "#C78AE6AA" + screenTintStrength: 0.12 + screenTintNoiseStrength: 0.75 + +- type: sectorWeather + id: ElectronSurge + name: sector-weather-electron-surge + borderColor: "#2B7DC890" + hazard: true + screenTintColor: "#4DC8FF80" + screenTintStrength: 0.08 + screenTintNoiseStrength: 0.50 diff --git a/Resources/Prototypes/Shaders/shaders.yml b/Resources/Prototypes/Shaders/shaders.yml index 057abf0ac23..4d453e37645 100644 --- a/Resources/Prototypes/Shaders/shaders.yml +++ b/Resources/Prototypes/Shaders/shaders.yml @@ -115,3 +115,8 @@ id: Hologram kind: source path: "/Textures/Shaders/hologram.swsl" + +- type: shader + id: SectorEventTint + kind: source + path: "/Textures/Shaders/sector_event_tint.swsl" diff --git a/Resources/Textures/Shaders/sector_event_tint.swsl b/Resources/Textures/Shaders/sector_event_tint.swsl new file mode 100644 index 00000000000..3112c5b906d --- /dev/null +++ b/Resources/Textures/Shaders/sector_event_tint.swsl @@ -0,0 +1,26 @@ +uniform sampler2D SCREEN_TEXTURE; +uniform highp vec4 tintColor; +uniform highp float noiseStrength; + +void fragment() { + highp vec2 uv = FRAGCOORD.xy * SCREEN_PIXEL_SIZE.xy; + highp vec2 coord = FRAGCOORD.xy; + highp vec4 src = zTextureSpec(SCREEN_TEXTURE, uv); + + // Blend the scene very gently toward the configured tint color. + highp float strength = clamp(tintColor.a, 0.0, 1.0); + highp float noise = ( + sin(coord.x * 0.012 + TIME * 0.32) + + sin(coord.y * 0.010 - TIME * 0.27) + + sin((coord.x + coord.y) * 0.007 + TIME * 0.21) + ) / 3.0; + highp float noiseFactor = 1.0 + noise * clamp(noiseStrength, 0.0, 1.0); + noiseFactor = clamp(noiseFactor, 0.0, 2.0); + strength *= noiseFactor; + strength = clamp(strength, 0.0, 1.0); + + highp vec3 tinted = mix(src.rgb, tintColor.rgb, 0.18); + src.rgb = mix(src.rgb, tinted, strength); + + COLOR = src; +} From 0516b53fe3805ba4465687007c729455e57687bc Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Mon, 4 May 2026 22:54:03 -0600 Subject: [PATCH 13/31] fix sniper market --- Resources/Prototypes/Catalog/Cargo/cargo_syndicate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_syndicate.yml b/Resources/Prototypes/Catalog/Cargo/cargo_syndicate.yml index 0d3546fceee..11d68f83bd2 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_syndicate.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_syndicate.yml @@ -251,7 +251,7 @@ product: BriefcaseSyndieSniperBundleFilled cost: 30000 category: cargoproduct-category-name-syndicate - group: syndicatemarket5 + group: syndicatemarket4 - type: cargoProduct id: ChemicalSynthesisKit From bd3281cd367fc31b43c4a720115834c610382e86 Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Tue, 5 May 2026 13:22:52 -0500 Subject: [PATCH 14/31] Artifact Glue Rebalance Changed a lot about how artifact glue is made. 1) space glue recipe changed from 1 Space Lube + 1 Slime -> 2 Space Glue to 2 Space Lube + 1 Slime + 1 Fiber -> 2 Space Glue. 2) Artifact Glue recipe changed from 1 Space Glue + 1 Artifexium -> 2 Artifact Glue to 1 Space Glue + 1 Artifexium + 1 Phoron -> 2 Artifact Glue + 1 Phoron. Added minimum heat of 370 to artifact glue recipe. 3) Made phoron decompose at a heat of 500. 4) Added Phoron reagent to grinding recipe for phoron alloy and phoron glass. Currently set to 5 alloy or glass per 1u Phoron reagent. --- .../Entities/Objects/Materials/Sheets/glass.yml | 2 ++ .../Prototypes/Entities/Objects/Materials/materials.yml | 2 ++ Resources/Prototypes/Recipes/Reactions/chemicals.yml | 4 ++++ .../Prototypes/Recipes/_Persistence14/phoron-balance.yml | 8 ++++++++ 4 files changed, 16 insertions(+) create mode 100644 Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index fc20f1a6863..e5ad06ff5e3 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -407,6 +407,8 @@ Quantity: 8 - ReagentId: Titanium Quantity: 4 + - ReagentID: Phoron + Quantity: .2 # 5 phoron glass to 1 Phoron reagent canReact: false - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index 944886b6adf..309d82a9dbb 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -445,6 +445,8 @@ Quantity: 20 - ReagentId: Titanium Quantity: 10 + - ReagentId: Phoron + Quantity: .2 canReact: false - type: Material - type: PhysicalComposition diff --git a/Resources/Prototypes/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/Recipes/Reactions/chemicals.yml index 5d6559337e3..75ce204d0d4 100644 --- a/Resources/Prototypes/Recipes/Reactions/chemicals.yml +++ b/Resources/Prototypes/Recipes/Reactions/chemicals.yml @@ -523,13 +523,17 @@ - type: reaction id: ArtifactGlue + min-temp: 370 reactants: SpaceGlue: amount: 1 Artifexium: amount: 1 + Phoron: + amount: 1 products: ArtifactGlue: 2 + Phoron: 1 - type: reaction id: Lye diff --git a/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml b/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml new file mode 100644 index 00000000000..7c5d400901b --- /dev/null +++ b/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml @@ -0,0 +1,8 @@ +- type: reaction + id: phoron-decay + min-temp: 500 + reactants: + Phoron: + amount: 1 + products: + Plasma: 1 \ No newline at end of file From 206fccb2aa51846ea429ba4e8871ae477f3db9f7 Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Tue, 5 May 2026 15:31:15 -0500 Subject: [PATCH 15/31] Makes glass phoron shards give significantly less phoron... Added fix for error in CreateEntry.xaml.cs I really don't know what's going on there. Fix may have broken other things but the project now builds. Corrected min-temp to minTemp for phoron-decay reaction. Corrected mistake in Artifact Glue recipe effect adding some comments i guess Forgot to add the glue changes it seems Again with the minTemp stuff Fixed error with minTemp reading as min-temp and breaking on the ArtifactGlue reaction Fixed error is reagent grinding I used 'ReagentID' instead of 'ReagentId' --- Content.Client/MessageBoard/UI/CreateEntry.xaml.cs | 5 +++++ .../Prototypes/Entities/Objects/Materials/Sheets/glass.yml | 4 +++- .../Prototypes/Entities/Objects/Materials/materials.yml | 2 +- Resources/Prototypes/Entities/Objects/Materials/shards.yml | 2 +- Resources/Prototypes/Recipes/Reactions/chemicals.yml | 3 ++- Resources/Prototypes/Recipes/Reactions/fun.yml | 4 +++- .../Prototypes/Recipes/_Persistence14/phoron-balance.yml | 2 +- 7 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs b/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs index bf2b3357d9c..b59b9e26e95 100644 --- a/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs +++ b/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs @@ -1,5 +1,6 @@ using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; namespace Content.Client.MessageBoard.UI; [GenerateTypedNameReferences] @@ -13,5 +14,9 @@ public enum EntryType : byte public EntryType CurrentEntryType = EntryType.Public; + public CreateEntry() + { + RobustXamlLoader.Load(this); + } } diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index e5ad06ff5e3..58941b21513 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -407,7 +407,7 @@ Quantity: 8 - ReagentId: Titanium Quantity: 4 - - ReagentID: Phoron + - ReagentId: Phoron Quantity: .2 # 5 phoron glass to 1 Phoron reagent canReact: false @@ -492,6 +492,8 @@ Quantity: 4.5 - ReagentId: Carbon Quantity: 0.5 + - ReagentId: Phoron + Quantity: 0.2 canReact: false - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index 309d82a9dbb..14bd6d8d994 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -446,7 +446,7 @@ - ReagentId: Titanium Quantity: 10 - ReagentId: Phoron - Quantity: .2 + Quantity: .2 # 5 phoron alloy to 1u Phoron reagent canReact: false - type: Material - type: PhysicalComposition diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 985a90a36c6..8d34699f4a1 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -228,7 +228,7 @@ - ReagentId: Silicon Quantity: 5 - ReagentId: Phoron - Quantity: 5 + Quantity: .1 - type: Construction graph: PhoronShivConstruct node: start diff --git a/Resources/Prototypes/Recipes/Reactions/chemicals.yml b/Resources/Prototypes/Recipes/Reactions/chemicals.yml index 75ce204d0d4..5671df47771 100644 --- a/Resources/Prototypes/Recipes/Reactions/chemicals.yml +++ b/Resources/Prototypes/Recipes/Reactions/chemicals.yml @@ -523,7 +523,7 @@ - type: reaction id: ArtifactGlue - min-temp: 370 + minTemp: 370 reactants: SpaceGlue: amount: 1 @@ -535,6 +535,7 @@ ArtifactGlue: 2 Phoron: 1 + - type: reaction id: Lye reactants: diff --git a/Resources/Prototypes/Recipes/Reactions/fun.yml b/Resources/Prototypes/Recipes/Reactions/fun.yml index fb2d184779a..31a3cce7585 100644 --- a/Resources/Prototypes/Recipes/Reactions/fun.yml +++ b/Resources/Prototypes/Recipes/Reactions/fun.yml @@ -49,9 +49,11 @@ minTemp: 370 reactants: SpaceLube: - amount: 1 + amount: 2 Slime: amount: 1 + Fiber: + amount: 1 products: SpaceGlue: 2 diff --git a/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml b/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml index 7c5d400901b..ddcfdeb854c 100644 --- a/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml +++ b/Resources/Prototypes/Recipes/_Persistence14/phoron-balance.yml @@ -1,6 +1,6 @@ - type: reaction id: phoron-decay - min-temp: 500 + minTemp: 500 reactants: Phoron: amount: 1 From dc4524e8035a171ad1d7f01130caaae68d36686d Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Tue, 5 May 2026 16:42:18 -0600 Subject: [PATCH 16/31] remove dead pixels from logo --- Resources/Textures/Logo/logo.png | Bin 54540 -> 56485 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Logo/logo.png b/Resources/Textures/Logo/logo.png index 41127e63f8c1a68aa65d4de6446a5e5589683816..23ad341115c53e2cca884b2d34ef70ade2ff4c75 100644 GIT binary patch literal 56485 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 literal 54540 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 a!uEv2MBpa Date: Tue, 5 May 2026 16:42:40 -0600 Subject: [PATCH 17/31] remove random money from salvage, research. --- .../Prototypes/Procedural/salvage_rewards.yml | 22 +++++++++---------- Resources/Prototypes/XenoArch/effects.yml | 8 +++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Resources/Prototypes/Procedural/salvage_rewards.yml b/Resources/Prototypes/Procedural/salvage_rewards.yml index 984ccc26d29..7bd685be663 100644 --- a/Resources/Prototypes/Procedural/salvage_rewards.yml +++ b/Resources/Prototypes/Procedural/salvage_rewards.yml @@ -15,9 +15,9 @@ RandomArtifactSpawner: 0.25 # weighted down since it sells for a lot NuclearBombKeg: 0.1 - # money - SpaceCash500: 0.5 - SpaceCash1000: 0.25 + # # money + # SpaceCash500: 0.5 + # SpaceCash1000: 0.25 - type: weightedRandomEntity id: SalvageRewardRare @@ -46,10 +46,10 @@ ClothingOuterArmorBasicSlim: 0.25 # rare weapons WeaponMakeshiftLaser: 0.1 - # money - SpaceCash500: 1.0 - SpaceCash1000: 0.75 - SpaceCash2500: 0.5 + # # money + # SpaceCash500: 1.0 + # SpaceCash1000: 0.75 + # SpaceCash2500: 0.5 - type: weightedRandomEntity id: SalvageRewardEpic @@ -69,7 +69,7 @@ # rare chemicals ChemistryBottleCognizine: 1.0 ChemistryBottleOmnizine: 1.0 - # money - SpaceCash2500: 1.0 - SpaceCash5000: 0.75 - SpaceCash10000: 0.5 + # # money + # SpaceCash2500: 1.0 + # SpaceCash5000: 0.75 + # SpaceCash10000: 0.5 diff --git a/Resources/Prototypes/XenoArch/effects.yml b/Resources/Prototypes/XenoArch/effects.yml index 0ceb48401a3..450ef4e4913 100644 --- a/Resources/Prototypes/XenoArch/effects.yml +++ b/Resources/Prototypes/XenoArch/effects.yml @@ -979,13 +979,13 @@ rolls: !type:RangeNumberSelector range: 2, 4 children: - - id: SpaceCash10 + - id: TreasureCoinIron weight: 0.75 - - id: SpaceCash100 + - id: TreasueCoinSilver weight: 0.5 - - id: SpaceCash500 + - id: TreasureCoinGold weight: 0.25 - - id: SpaceCash1000 + - id: TreasureCoinDiamond weight: 0.1 - type: entity From 3a69955bd906ac59114d735d07c8dd247022f1cd Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Wed, 6 May 2026 06:18:53 -0500 Subject: [PATCH 18/31] Hotfix: CreateEntry.xaml.cs error Added a constructor with the XamlLoad method to address the build error. No idea what riples this will have. --- Content.Client/MessageBoard/UI/CreateEntry.xaml.cs | 6 +++++- .../Artifact/SharedXenoArtifactSystem.Node.cs | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs b/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs index bf2b3357d9c..be71a2dd5d6 100644 --- a/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs +++ b/Content.Client/MessageBoard/UI/CreateEntry.xaml.cs @@ -1,6 +1,6 @@ using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.CustomControls; - +using Robust.Client.UserInterface.XAML; namespace Content.Client.MessageBoard.UI; [GenerateTypedNameReferences] public sealed partial class CreateEntry : DefaultWindow @@ -13,5 +13,9 @@ public enum EntryType : byte public EntryType CurrentEntryType = EntryType.Public; + public CreateEntry() + { + RobustXamlLoader.Load(this); + } } diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs index 7958ef955b5..7f7697a5bb7 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs @@ -370,7 +370,7 @@ List>> otherSegments /// /// Sets node research point amount that can be extracted. - /// Used up durability increases amount to be extracted. + /// Used up durability increases amount to be extracted. (It looks like the exact opposite is true?) /// public void UpdateNodeResearchValue(Entity node) { @@ -383,7 +383,7 @@ public void UpdateNodeResearchValue(Entity node) var artifact = _xenoArtifactQuery.Get(nodeComponent.Attached.Value); - var nonactiveNodes = GetActiveNodes(artifact); + var nonactiveNodes = GetActiveNodes(artifact); // This seems like its... wrong... var durabilityEffect = MathF.Pow((float)nodeComponent.Durability / nodeComponent.MaxDurability, 2); var durabilityMultiplier = nonactiveNodes.Contains(node) ? 1f - durabilityEffect From f3ac0318482b35083dc045a9db69e630201d32f4 Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Wed, 6 May 2026 11:27:44 -0500 Subject: [PATCH 19/31] Node Research Value Update The research value of a node now properly scales with the amount of durability used. Added DurabilityResearchMultiplier field to the XenoArtifactNode component allowing the tuning of this effect. --- .../Artifact/Components/XenoArtifactNodeComponent.cs | 6 ++++++ .../Artifact/SharedXenoArtifactSystem.Node.cs | 8 +++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs index b18f9cb69d7..a8983b639c6 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/Components/XenoArtifactNodeComponent.cs @@ -52,6 +52,12 @@ public sealed partial class XenoArtifactNodeComponent : Component [DataField, AutoNetworkedField] public int MaxDurability = 5; + /// + /// The maximum factor by which using the durability of an artifact will scale it's Research Value. + /// + [DataField] + public float DurabilityResearchMultiplier = 2f; + /// /// The variance from MaxDurability present when a node is created. /// diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs index 7958ef955b5..1aca9145e74 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.Node.cs @@ -383,13 +383,11 @@ public void UpdateNodeResearchValue(Entity node) var artifact = _xenoArtifactQuery.Get(nodeComponent.Attached.Value); - var nonactiveNodes = GetActiveNodes(artifact); var durabilityEffect = MathF.Pow((float)nodeComponent.Durability / nodeComponent.MaxDurability, 2); - var durabilityMultiplier = nonactiveNodes.Contains(node) - ? 1f - durabilityEffect - : 1f + durabilityEffect; + var durabilityMultiplier = nodeComponent.DurabilityResearchMultiplier - (nodeComponent.DurabilityResearchMultiplier - 1) * durabilityEffect; var predecessorNodes = GetPredecessorNodes((artifact, artifact), node); - nodeComponent.ResearchValue = (int)(Math.Pow(1.25, Math.Pow(predecessorNodes.Count, 1.5f)) * nodeComponent.BasePointValue * durabilityMultiplier); + var predecessorMultiplier = Math.Pow(1.25, Math.Pow(predecessorNodes.Count, 1.5f)); + nodeComponent.ResearchValue = (int)(nodeComponent.BasePointValue * predecessorMultiplier * durabilityMultiplier); } } From c1ea849d07298a3d734c92570a484d2efe9722a8 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Wed, 6 May 2026 11:22:32 -0600 Subject: [PATCH 20/31] update trade stations --- .../Catalog/Bounties/infrastructurelevels.yml | 153 ++++++++++-------- 1 file changed, 82 insertions(+), 71 deletions(-) diff --git a/Resources/Prototypes/Catalog/Bounties/infrastructurelevels.yml b/Resources/Prototypes/Catalog/Bounties/infrastructurelevels.yml index cfd04324256..009a523f2a4 100644 --- a/Resources/Prototypes/Catalog/Bounties/infrastructurelevels.yml +++ b/Resources/Prototypes/Catalog/Bounties/infrastructurelevels.yml @@ -11,7 +11,7 @@ ServiceBounty : 1 GasBounty : 1 ReagentBounty : 1 - income: -5000 + income: 0 - type: infrastructureLevel id: ILevelGeneral2 @@ -75,7 +75,6 @@ name: Simple Research Outpost (1) markets: - sciencemarket - - explorermarket groups: ScienceBounty : 2 MaterialBounty : 2 @@ -90,8 +89,6 @@ markets: - sciencemarket - sciencemarket2 - - explorermarket - - explorermarket2 groups: ScienceBounty : 3 MaterialBounty : 2 @@ -110,9 +107,6 @@ - sciencemarket - sciencemarket2 - sciencemarket3 - - explorermarket - - explorermarket2 - - explorermarket3 groups: ScienceBounty : 4 MaterialBounty : 2 @@ -132,10 +126,6 @@ - sciencemarket2 - sciencemarket3 - sciencemarket4 - - explorermarket - - explorermarket2 - - explorermarket3 - - explorermarket4 groups: ScienceBounty : 5 MaterialBounty : 3 @@ -145,6 +135,85 @@ income: 30000 level: 4 +- type: infrastructureLevel + id: ILevelExploration1 + demotionXP: 0 + requiredXP: 0 + name: Simple Explorer's Post (1) + markets: + - explorermarket + - huntermarket + groups: + ExplorationBounty : 2 + HunterBounty : 1 + ServiceBounty : 1 + income: 0 + +- type: infrastructureLevel + id: ILevelExploration2 + demotionXP: 150 + requiredXP: 200 + name: Decent Explorer's Outpost (2) + markets: + - explorermarket + - explorermarket2 + - huntermarket + - huntermarket2 + groups: + ExplorationBounty : 3 + HunterBounty : 1 + ServiceBounty : 1 + MaterialBounty : 1 + StationBounty : 1 + income: 0 + level: 2 + +- type: infrastructureLevel + id: ILevelExploration3 + demotionXP: 650 + requiredXP: 700 + name: Established Exploration Station (3) + markets: + - explorermarket + - explorermarket2 + - explorermarket3 + - huntermarket + - huntermarket2 + - huntermarket3 + groups: + ExplorationBounty : 4 + HunterBounty : 2 + ServiceBounty : 2 + MaterialBounty : 2 + StationBounty : 2 + income: 10000 + level: 3 + +- type: infrastructureLevel + id: ILevelExploration4 + demotionXP: 1400 + requiredXP: 1500 + name: Beacon of Exploration (4) + markets: + - explorermarket + - explorermarket2 + - explorermarket3 + - explorermarket4 + - huntermarket + - huntermarket2 + - huntermarket3 + - huntermarket4 + groups: + ExplorationBounty : 5 + HunterBounty : 3 + ServiceBounty : 3 + MaterialBounty : 3 + StationBounty : 3 + income: 30000 + level: 4 + + + - type: infrastructureLevel id: ILevelHunter1 demotionXP: 0 @@ -173,6 +242,8 @@ income: 0 level: 2 + + - type: infrastructureLevel id: ILevelHunter3 demotionXP: 650 @@ -263,63 +334,3 @@ income: 30000 level: 4 -- type: infrastructureLevel - id: ILevelExploration1 - demotionXP: 0 - requiredXP: 0 - name: Simple Explorer's Post (1) - markets: - - explorermarket - groups: - ExplorationBounty : 4 - ScienceBounty : 1 - ServiceBounty : 1 - income: -5000 - -- type: infrastructureLevel - id: ILevelExploration2 - demotionXP: 150 - requiredXP: 200 - name: Decent Explorer's Outpost (2) - markets: - - explorermarket - - explorermarket2 - groups: - ExplorationBounty : 6 - ScienceBounty : 1 - ServiceBounty : 2 - income: 0 - level: 2 - -- type: infrastructureLevel - id: ILevelExploration3 - demotionXP: 650 - requiredXP: 700 - name: Established Exploration Station (3) - markets: - - explorermarket - - explorermarket2 - - explorermarket3 - groups: - ExplorationBounty : 8 - ScienceBounty : 2 - ServiceBounty : 2 - income: 10000 - level: 3 - -- type: infrastructureLevel - id: ILevelExploration4 - demotionXP: 1400 - requiredXP: 1500 - name: Beacon of Exploration (4) - markets: - - explorermarket - - explorermarket2 - - explorermarket3 - - explorermarket4 - groups: - ExplorationBounty : 9 - ScienceBounty : 3 - ServiceBounty : 3 - income: 30000 - level: 4 From 65d0bf57b72cde4a7cc65e6f38762286c7b1c32b Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Wed, 6 May 2026 14:42:55 -0600 Subject: [PATCH 21/31] make meta records not network --- .../CrewMetaRecords/Components/CrewMetaRecordsComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs b/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs index 29eea956961..30fa4d8b7d1 100644 --- a/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs +++ b/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs @@ -7,7 +7,7 @@ namespace Content.Shared.CrewMetaRecords; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class CrewMetaRecordsComponent : Component { [DataField] From 2b05189ec3295b26cd7d3eab436e474e080a0a12 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Wed, 6 May 2026 21:09:51 -0600 Subject: [PATCH 22/31] Update CrewMetaRecordsComponent.cs --- .../CrewMetaRecords/Components/CrewMetaRecordsComponent.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs b/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs index 30fa4d8b7d1..5e9cb4c33e0 100644 --- a/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs +++ b/Content.Shared/CrewMetaRecords/Components/CrewMetaRecordsComponent.cs @@ -27,6 +27,7 @@ public sealed partial class CrewMetaRecordsComponent : Component [DataField] public List CodexEntries { get; set; } = new(); + [DataField] public List MessageBoardEntries { get; set; } = new(); [DataField] public Dictionary CrewMetaRecords { get; set; } = new(); From 0a3340ace054cd47552458e749bbf182c95a08ec Mon Sep 17 00:00:00 2001 From: Wolfkey Date: Wed, 6 May 2026 22:30:18 -0500 Subject: [PATCH 23/31] Tape recorders can be controlled with signals --- .../Components/TapeRecorderComponent.cs | 17 ++++++++++++++ .../Systems/SharedTapeRecorderSystem.cs | 23 +++++++++++++++++++ .../en-US/deltav/linkports/link-ports.ftl | 4 ++++ .../DeltaV/DeviceLinking/sink_ports.yml | 19 +++++++++++++++ .../Objects/Devices/tape_recorder.yml | 11 +++++++++ 5 files changed, 74 insertions(+) create mode 100644 Resources/Locale/en-US/deltav/linkports/link-ports.ftl create mode 100644 Resources/Prototypes/DeltaV/DeviceLinking/sink_ports.yml diff --git a/Content.Shared/DeltaV/TapeRecorder/Components/TapeRecorderComponent.cs b/Content.Shared/DeltaV/TapeRecorder/Components/TapeRecorderComponent.cs index c5600b8bcf6..1a18ea487af 100644 --- a/Content.Shared/DeltaV/TapeRecorder/Components/TapeRecorderComponent.cs +++ b/Content.Shared/DeltaV/TapeRecorder/Components/TapeRecorderComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.DeltaV.TapeRecorder.Systems; +using Content.Shared.DeviceLinking; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -80,4 +81,20 @@ public sealed partial class TapeRecorderComponent : Component { Params = AudioParams.Default.WithVolume(-2f).WithMaxDistance(3f) }; + + /// + /// Ports for signal control + /// + [DataField, AutoNetworkedField] + public ProtoId PausePort = "Pause"; + + [DataField, AutoNetworkedField] + public ProtoId RecordPort = "Record"; + + [DataField, AutoNetworkedField] + public ProtoId PlaybackPort = "Playback"; + + [DataField, AutoNetworkedField] + public ProtoId RewindPort = "Rewind"; + } diff --git a/Content.Shared/DeltaV/TapeRecorder/Systems/SharedTapeRecorderSystem.cs b/Content.Shared/DeltaV/TapeRecorder/Systems/SharedTapeRecorderSystem.cs index 1876d552c35..0fbd5a9f020 100644 --- a/Content.Shared/DeltaV/TapeRecorder/Systems/SharedTapeRecorderSystem.cs +++ b/Content.Shared/DeltaV/TapeRecorder/Systems/SharedTapeRecorderSystem.cs @@ -11,6 +11,8 @@ using Content.Shared.Toggleable; using Content.Shared.UserInterface; using Content.Shared.Whitelist; +using Content.Shared.DeviceLinking; +using Content.Shared.DeviceLinking.Events; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Random; @@ -45,6 +47,7 @@ public override void Initialize() SubscribeLocalEvent(OnRecorderExamined); SubscribeLocalEvent(OnChangeModeMessage); SubscribeLocalEvent(OnUIOpened); + SubscribeLocalEvent(OnSignalReceived); SubscribeLocalEvent(OnTapeExamined); SubscribeLocalEvent(OnDamagedChanged); @@ -415,6 +418,26 @@ private void UpdateUI(Entity ent) _ui.SetUiState(uid, TapeRecorderUIKey.Key, state); } + + private void OnSignalReceived(Entity ent, ref SignalReceivedEvent args) + { + if (args.Port == ent.Comp.PausePort) + { + SetMode(ent, TapeRecorderMode.Stopped); + } + else if (args.Port == ent.Comp.RecordPort) + { + SetMode(ent, TapeRecorderMode.Recording); + } + else if (args.Port == ent.Comp.PlaybackPort) + { + SetMode(ent, TapeRecorderMode.Playing); + } + else if (args.Port == ent.Comp.RewindPort) + { + SetMode(ent, TapeRecorderMode.Rewinding); + } + } } [Serializable, NetSerializable] diff --git a/Resources/Locale/en-US/deltav/linkports/link-ports.ftl b/Resources/Locale/en-US/deltav/linkports/link-ports.ftl new file mode 100644 index 00000000000..63e73db41b9 --- /dev/null +++ b/Resources/Locale/en-US/deltav/linkports/link-ports.ftl @@ -0,0 +1,4 @@ +signal-port-description-playback = Start audio playback. +signal-port-description-record = Start recording audio. +signal-port-description-rewind = Rewind audio. +signal-port-description-pause = Stop playing, recording, or rewinding. diff --git a/Resources/Prototypes/DeltaV/DeviceLinking/sink_ports.yml b/Resources/Prototypes/DeltaV/DeviceLinking/sink_ports.yml new file mode 100644 index 00000000000..cd82f46c01a --- /dev/null +++ b/Resources/Prototypes/DeltaV/DeviceLinking/sink_ports.yml @@ -0,0 +1,19 @@ +- type: sinkPort + id: Pause + name: tape-recorder-menu-stopped-button + description: signal-port-description-pause + +- type: sinkPort + id: Record + name: tape-recorder-menu-recording-button + description: signal-port-description-record + +- type: sinkPort + id: Playback + name: tape-recorder-menu-playing-button + description: signal-port-description-playback + +- type: sinkPort + id: Rewind + name: tape-recorder-menu-rewinding-button + description: signal-port-description-rewind diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/tape_recorder.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/tape_recorder.yml index bfce3188521..b9179c8bc7f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/tape_recorder.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/tape_recorder.yml @@ -50,6 +50,17 @@ interfaces: enum.TapeRecorderUIKey.Key: type: TapeRecorderBoundUserInterface + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + - type: WirelessNetworkConnection + range: 200 + - type: DeviceLinkSink + ports: + - Pause + - Record + - Playback + - Rewind - type: entity parent: TapeRecorder From 42855cd867572d5dffa6035d7adef502fbac12d1 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Thu, 7 May 2026 18:56:18 -0600 Subject: [PATCH 24/31] trade stations never unanchor --- Content.Server/Shuttles/Systems/StationAnchorSystem.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Server/Shuttles/Systems/StationAnchorSystem.cs b/Content.Server/Shuttles/Systems/StationAnchorSystem.cs index d2dd9732572..def1796836e 100644 --- a/Content.Server/Shuttles/Systems/StationAnchorSystem.cs +++ b/Content.Server/Shuttles/Systems/StationAnchorSystem.cs @@ -1,3 +1,4 @@ +using Content.Server.Cargo.Components; using Content.Server.Popups; using Content.Server.Power.EntitySystems; using Content.Server.Shuttles.Components; @@ -86,7 +87,8 @@ private void SetStatus(Entity ent, bool enabled, Shuttle } else { - _shuttleSystem.Enable(grid.Value); + if(!TryComp(grid, out _)) + _shuttleSystem.Enable(grid.Value); } shuttleComponent.Enabled = !enabled; From 0baf755dc4d4083fc785eaca847eddd6fd7eaeec Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Thu, 7 May 2026 18:56:29 -0600 Subject: [PATCH 25/31] nerf salvage magnet --- Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs b/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs index 91331db126d..6933537f40b 100644 --- a/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs +++ b/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs @@ -35,7 +35,7 @@ public sealed partial class SalvageMagnetDataComponent : Component /// Cooldown between offerings after one ends. /// [DataField] - public TimeSpan OfferCooldown = TimeSpan.FromMinutes(3); + public TimeSpan OfferCooldown = TimeSpan.FromMinutes(15); /// /// Seeds currently offered From 2e2481b4f1c9dbd3aff4ee4daba966c6d5f2c0f9 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Thu, 7 May 2026 18:56:46 -0600 Subject: [PATCH 26/31] nerf omnizine --- Resources/Prototypes/Reagents/medicine.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index b2e3a8063ea..5650265a114 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -853,10 +853,10 @@ effects: - !type:EvenHealthChange damage: - Burn: -2 - Toxin: -2 - Airloss: -2 - Brute: -2 + Burn: -0.2 + Toxin: -0.2 + Airloss: -0.2 + Brute: -0.2 - type: reagent id: Ultravasculine From 2532616388ff80b322b231c16127ea6d13e83806 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Thu, 7 May 2026 19:59:07 -0600 Subject: [PATCH 27/31] fix xenoarch protos --- Resources/Prototypes/XenoArch/effects.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/XenoArch/effects.yml b/Resources/Prototypes/XenoArch/effects.yml index 450ef4e4913..25f05819c0a 100644 --- a/Resources/Prototypes/XenoArch/effects.yml +++ b/Resources/Prototypes/XenoArch/effects.yml @@ -981,7 +981,7 @@ children: - id: TreasureCoinIron weight: 0.75 - - id: TreasueCoinSilver + - id: TreasureCoinSilver weight: 0.5 - id: TreasureCoinGold weight: 0.25 From 3e096bc604cf06e2482ae5768de17f6153fbe7c9 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Sat, 9 May 2026 12:53:10 -0600 Subject: [PATCH 28/31] add doafter to hypospray --- Resources/Prototypes/Chemistry/injector_modes.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Chemistry/injector_modes.yml b/Resources/Prototypes/Chemistry/injector_modes.yml index 1e2b38aa41b..1233efa0224 100644 --- a/Resources/Prototypes/Chemistry/injector_modes.yml +++ b/Resources/Prototypes/Chemistry/injector_modes.yml @@ -108,7 +108,8 @@ abstract: true parent: BaseHyposprayMode id: BaseInstantHyposprayMode - mobTime: 0 + mobTime: 1 + delayPerVolume: 0.05 - type: injectorMode parent: [ BaseInstantHyposprayMode, BaseInjectMode ] From de338d91d15dc01e011f36056b8f43f7228a1a13 Mon Sep 17 00:00:00 2001 From: Michael Chessall Date: Sat, 9 May 2026 12:53:42 -0600 Subject: [PATCH 29/31] remove unnecessary tags --- Content.Client/MessageBoard/UI/EntryWindow.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/MessageBoard/UI/EntryWindow.xaml b/Content.Client/MessageBoard/UI/EntryWindow.xaml index 6f72cf3cd24..590620537a0 100644 --- a/Content.Client/MessageBoard/UI/EntryWindow.xaml +++ b/Content.Client/MessageBoard/UI/EntryWindow.xaml @@ -11,7 +11,7 @@ - + From 65d6bbd0940c1c85aa060f800fa3d08ab602d2f4 Mon Sep 17 00:00:00 2001 From: Tiago Date: Sun, 10 May 2026 00:21:19 -0500 Subject: [PATCH 30/31] Fix hunterstation bounties --- .../Catalog/Bounties/{hunterbounties => hunterbounties.yml} | 1 + 1 file changed, 1 insertion(+) rename Resources/Prototypes/Catalog/Bounties/{hunterbounties => hunterbounties.yml} (99%) diff --git a/Resources/Prototypes/Catalog/Bounties/hunterbounties b/Resources/Prototypes/Catalog/Bounties/hunterbounties.yml similarity index 99% rename from Resources/Prototypes/Catalog/Bounties/hunterbounties rename to Resources/Prototypes/Catalog/Bounties/hunterbounties.yml index 946b368e69e..728a7860363 100644 --- a/Resources/Prototypes/Catalog/Bounties/hunterbounties +++ b/Resources/Prototypes/Catalog/Bounties/hunterbounties.yml @@ -41,6 +41,7 @@ - ToothSpaceCarp bountyType: PayPer +- type: cargoBounty id: BountyTeethSharkminnow reward: 3000 # 3000*3=9000 description: bounty-description-tooth-sharkminnow From 8afbba1f65a89a46b7d8054951c57075794801ec Mon Sep 17 00:00:00 2001 From: Zetaplx Date: Sun, 10 May 2026 09:42:35 -0500 Subject: [PATCH 31/31] Artifact Spawn Tether Bugfix Fixed a bug where handheld artifacts would spawn items attached to the player if held by them.This caused all sorts of weirdness, especially with 'ghost bears' or space bears which are attached to the player. --- .../Components/EntityTableSpawnerComponent.cs | 6 +++++ .../EntitySystems/ConditionalSpawnerSystem.cs | 7 +++++- .../Artifact/SharedXenoArtifactSystem.XAE.cs | 25 ++++++++++++++++++- Resources/Prototypes/XenoArch/effects.yml | 21 ++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Content.Server/Spawners/Components/EntityTableSpawnerComponent.cs b/Content.Server/Spawners/Components/EntityTableSpawnerComponent.cs index d122eb098b6..739f0d3ce68 100644 --- a/Content.Server/Spawners/Components/EntityTableSpawnerComponent.cs +++ b/Content.Server/Spawners/Components/EntityTableSpawnerComponent.cs @@ -19,6 +19,12 @@ public sealed partial class EntityTableSpawnerComponent : Component [DataField] public float Offset = 0.2f; + /// + /// If true, will spawn at the coordinates of the spawner, but detached from them. + /// + [DataField] + public bool SpawnDetached = false; + /// /// A variable meaning whether the spawn will /// be able to be used again or whether diff --git a/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs b/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs index 4613a4e8e1f..a8b04f80985 100644 --- a/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs +++ b/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs @@ -135,7 +135,12 @@ private void Spawn(Entity ent) var yOffset = _robustRandom.NextFloat(-offset, offset); var trueCoords = coords.Offset(new Vector2(xOffset, yOffset)); - SpawnAttachedTo(proto, trueCoords); + if (ent.Comp.SpawnDetached) + { + SpawnAtPosition(proto, trueCoords); // Currently ignores offset... would be nice to have. + } + else + SpawnAttachedTo(proto, trueCoords); } } } diff --git a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs index d98fa059f37..12a1f5be0e7 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/SharedXenoArtifactSystem.XAE.cs @@ -5,6 +5,7 @@ using Content.Shared.Timing; using Content.Shared.Xenoarchaeology.Artifact.Components; using Robust.Shared.Map; +using Robust.Shared.Map.Components; namespace Content.Shared.Xenoarchaeology.Artifact; @@ -12,6 +13,8 @@ public abstract partial class SharedXenoArtifactSystem { [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _map = default!; private void InitializeXAE() { @@ -25,7 +28,8 @@ private void OnUseInHand(Entity ent, ref UseInHandEvent a if (args.Handled) return; - args.Handled = TryActivateXenoArtifact(ent, args.User, args.User, Transform(args.User).Coordinates); + var coords = GetSafeActivationCoordininates(Transform(args.User).Coordinates); + args.Handled = TryActivateXenoArtifact(ent, args.User, args.User, coords); } private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) @@ -134,6 +138,25 @@ public bool ActivateNode( RaiseLocalEvent(node, ref ev); return true; } + + /// + /// Cleans the entity coordinates to remove any potential parenting to the activator of an artifact. + /// + /// + /// + private EntityCoordinates GetSafeActivationCoordininates(EntityCoordinates coords) + { + var mapCoords = _transform.ToMapCoordinates(coords); + var gridUid = _transform.GetGrid(coords); + + if (gridUid != null && TryComp(gridUid, out var mapGrid)) + { + return new EntityCoordinates(gridUid.Value, _map.WorldToLocal(gridUid.Value, mapGrid, mapCoords.Position)); + } + + var mapUid = _map.GetMap(mapCoords.MapId); + return new EntityCoordinates(mapUid, mapCoords.Position); + } } /// diff --git a/Resources/Prototypes/XenoArch/effects.yml b/Resources/Prototypes/XenoArch/effects.yml index 25f05819c0a..61b09a111f7 100644 --- a/Resources/Prototypes/XenoArch/effects.yml +++ b/Resources/Prototypes/XenoArch/effects.yml @@ -486,6 +486,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector rolls: !type:RangeNumberSelector range: 1, 4 @@ -515,6 +516,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: FoodBanana @@ -542,6 +544,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: RandomFloraTree @@ -641,6 +644,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: RandomInstruments @@ -661,6 +665,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: MobMonkey @@ -751,6 +756,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: SilverOre1 @@ -786,6 +792,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: SilverOre1 @@ -809,6 +816,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: PlasmaOre1 @@ -832,6 +840,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: GoldOre1 @@ -855,6 +864,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: UraniumOre1 @@ -878,6 +888,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: MobCarpMagic @@ -901,6 +912,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: MobMouse @@ -948,6 +960,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: MobAdultSlimesYellowAngry @@ -975,6 +988,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector rolls: !type:RangeNumberSelector range: 2, 4 @@ -1091,6 +1105,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: RandomAnomalySpawner @@ -1172,6 +1187,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: SheetGlass @@ -1187,6 +1203,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: SheetSteel @@ -1202,6 +1219,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:GroupSelector children: - id: SheetPlastic @@ -1229,6 +1247,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: RandomArtifactSpawner @@ -1275,6 +1294,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: Singularity @@ -1290,6 +1310,7 @@ components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false + spawnDetached: true table: !type:AllSelector children: - id: TeslaEnergyBall