diff --git a/Content.Server/Station/Components/StationRandomTransformComponent.cs b/Content.Server/Station/Components/StationRandomTransformComponent.cs
new file mode 100644
index 000000000000..ea0fc5f2696b
--- /dev/null
+++ b/Content.Server/Station/Components/StationRandomTransformComponent.cs
@@ -0,0 +1,16 @@
+using Content.Server.Station.Systems;
+
+namespace Content.Server.Station.Components;
+
+///
+/// Stores station parameters that can be randomized by the roundstart
+///
+[RegisterComponent, Access(typeof(StationSystem))]
+public sealed partial class StationRandomTransformComponent : Component
+{
+ [DataField]
+ public float? MaxStationOffset = 100.0f;
+
+ [DataField]
+ public bool EnableStationRotation = true;
+}
diff --git a/Content.Server/Station/Systems/StationSystem.cs b/Content.Server/Station/Systems/StationSystem.cs
index 492f15c8e2b1..408b3ebc5551 100644
--- a/Content.Server/Station/Systems/StationSystem.cs
+++ b/Content.Server/Station/Systems/StationSystem.cs
@@ -1,9 +1,10 @@
using System.Linq;
+using System.Numerics;
using Content.Server.Chat.Systems;
using Content.Server.GameTicking;
using Content.Server.Station.Components;
using Content.Server.Station.Events;
-using Content.Shared.CCVar;
+using Content.Shared.Fax;
using Content.Shared.Station;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
@@ -49,17 +50,12 @@ public override void Initialize()
_sawmill = _logManager.GetSawmill("station");
SubscribeLocalEvent(OnRoundEnd);
- SubscribeLocalEvent(OnPreGameMapLoad);
SubscribeLocalEvent(OnPostGameMapLoad);
SubscribeLocalEvent(OnStationAdd);
SubscribeLocalEvent(OnStationDeleted);
SubscribeLocalEvent(OnStationGridDeleted);
SubscribeLocalEvent(OnStationSplitEvent);
- Subs.CVar(_configurationManager, CCVars.StationOffset, x => _randomStationOffset = x, true);
- Subs.CVar(_configurationManager, CCVars.MaxStationOffset, x => _maxRandomStationOffset = x, true);
- Subs.CVar(_configurationManager, CCVars.StationRotation, x => _randomStationRotation = x, true);
-
_player.PlayerStatusChanged += OnPlayerStatusChanged;
}
@@ -112,19 +108,6 @@ private void OnStationDeleted(EntityUid uid, StationDataComponent component, Com
RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast());
}
- private void OnPreGameMapLoad(PreGameMapLoad ev)
- {
- // this is only for maps loaded during round setup!
- if (_gameTicker.RunLevel == GameRunLevel.InRound)
- return;
-
- if (_randomStationOffset)
- ev.Options.Offset += _random.NextVector2(_maxRandomStationOffset);
-
- if (_randomStationRotation)
- ev.Options.Rotation = _random.NextAngle();
- }
-
private void OnPostGameMapLoad(PostGameMapLoad ev)
{
var dict = new Dictionary>();
@@ -311,6 +294,8 @@ public EntityUid InitializeNewStation(StationConfig stationConfig, IEnumerable(station);
name ??= MetaData(station).EntityName;
- foreach (var grid in gridIds ?? Array.Empty())
+ var entry = gridIds ?? Array.Empty();
+
+ foreach (var grid in entry)
{
AddGridToStation(station, grid, null, data, name);
}
+ if (TryComp(station, out var random))
+ {
+ Angle? rotation = null;
+ Vector2? offset = null;
+
+ if (random.MaxStationOffset != null)
+ offset = _random.NextVector2(-random.MaxStationOffset.Value, random.MaxStationOffset.Value);
+
+ if (random.EnableStationRotation)
+ rotation = _random.NextAngle();
+
+ foreach (var grid in entry)
+ {
+ //planetary maps give an error when trying to change from position or rotation.
+ //This is still the case, but it will be irrelevant after the https://github.com/space-wizards/space-station-14/pull/26510
+ if (rotation != null && offset != null)
+ {
+ var pos = _transform.GetWorldPosition(grid);
+ _transform.SetWorldPositionRotation(grid, pos + offset.Value, rotation.Value);
+ continue;
+ }
+ if (rotation != null)
+ {
+ _transform.SetWorldRotation(grid, rotation.Value);
+ continue;
+ }
+ if (offset != null)
+ {
+ var pos = _transform.GetWorldPosition(grid);
+ _transform.SetWorldPosition(grid, pos + offset.Value);
+ continue;
+ }
+ }
+ }
+
var ev = new StationPostInitEvent((station, data));
RaiseLocalEvent(station, ref ev, true);
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index aa14c565a014..94f9e218b888 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -229,25 +229,6 @@ public static readonly CVarDef
public static readonly CVarDef
GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED);
- ///
- /// Whether a random position offset will be applied to the station on roundstart.
- ///
- public static readonly CVarDef StationOffset =
- CVarDef.Create("game.station_offset", true);
-
- ///
- /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0.
- /// Does nothing without as true.
- ///
- public static readonly CVarDef MaxStationOffset =
- CVarDef.Create("game.maxstationoffset", 1000.0f);
-
- ///
- /// Whether a random rotation will be applied to the station on roundstart.
- ///
- public static readonly CVarDef StationRotation =
- CVarDef.Create("game.station_rotation", true);
-
///
/// When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
///
diff --git a/Resources/Prototypes/Entities/Stations/base.yml b/Resources/Prototypes/Entities/Stations/base.yml
index c3fbb998b288..dcaa3d747a0d 100644
--- a/Resources/Prototypes/Entities/Stations/base.yml
+++ b/Resources/Prototypes/Entities/Stations/base.yml
@@ -4,6 +4,12 @@
components:
- type: StationData
+- type: entity
+ id: BaseRandomStation
+ abstract: true
+ components:
+ - type: StationRandomTransform
+
- type: entity
id: BaseStationCargo
abstract: true
diff --git a/Resources/Prototypes/Entities/Stations/nanotrasen.yml b/Resources/Prototypes/Entities/Stations/nanotrasen.yml
index ab885b03e537..7e650d536f22 100644
--- a/Resources/Prototypes/Entities/Stations/nanotrasen.yml
+++ b/Resources/Prototypes/Entities/Stations/nanotrasen.yml
@@ -25,6 +25,7 @@
- BaseStationSiliconLawCrewsimov
- BaseStationAllEventsEligible
- BaseStationNanotrasen
+ - BaseRandomStation
noSpawn: true
components:
- type: Transform
diff --git a/Resources/Prototypes/Maps/europa.yml b/Resources/Prototypes/Maps/europa.yml
index 5b824bd3512b..33c69d64b3a9 100644
--- a/Resources/Prototypes/Maps/europa.yml
+++ b/Resources/Prototypes/Maps/europa.yml
@@ -8,6 +8,9 @@
Europa:
stationProto: StandardNanotrasenStation
components:
+ - type: StationRandomTransform
+ enableStationRotation: false
+ maxStationOffset: null
- type: StationNameSetup
mapNameTemplate: '{0} Europa {1}'
nameGenerator:
diff --git a/Resources/Prototypes/Maps/train.yml b/Resources/Prototypes/Maps/train.yml
index 57b1ded749b2..f500d85af932 100644
--- a/Resources/Prototypes/Maps/train.yml
+++ b/Resources/Prototypes/Maps/train.yml
@@ -8,6 +8,8 @@
Train:
stationProto: StandardNanotrasenStation
components:
+ - type: StationRandomTransform
+ enableStationRotation: false
- type: StationNameSetup
mapNameTemplate: 'Train "Sentipode" {0}-{1}'
nameGenerator: