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: