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;
_sawmill = _logManager.GetSawmill("station");
SubscribeLocalEvent<GameRunLevelChangedEvent>(OnRoundEnd);
- SubscribeLocalEvent<PreGameMapLoad>(OnPreGameMapLoad);
SubscribeLocalEvent<PostGameMapLoad>(OnPostGameMapLoad);
SubscribeLocalEvent<StationDataComponent, ComponentStartup>(OnStationAdd);
SubscribeLocalEvent<StationDataComponent, ComponentShutdown>(OnStationDeleted);
SubscribeLocalEvent<StationMemberComponent, ComponentShutdown>(OnStationGridDeleted);
SubscribeLocalEvent<StationMemberComponent, PostGridSplitEvent>(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;
}
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<string, List<EntityUid>>();
// Use overrides for setup.
var station = EntityManager.SpawnEntity(stationConfig.StationPrototype, MapCoordinates.Nullspace, stationConfig.StationComponentOverrides);
+
+
if (name is not null)
RenameStation(station, name, false);
var data = Comp<StationDataComponent>(station);
name ??= MetaData(station).EntityName;
- foreach (var grid in gridIds ?? Array.Empty<EntityUid>())
+ var entry = gridIds ?? Array.Empty<EntityUid>();
+
+ foreach (var grid in entry)
{
AddGridToStation(station, grid, null, data, name);
}
+ if (TryComp<StationRandomTransformComponent>(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);
public static readonly CVarDef<bool>
GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED);
- /// <summary>
- /// Whether a random position offset will be applied to the station on roundstart.
- /// </summary>
- public static readonly CVarDef<bool> StationOffset =
- CVarDef.Create("game.station_offset", true);
-
- /// <summary>
- /// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0.
- /// Does nothing without <see cref="StationOffset"/> as true.
- /// </summary>
- public static readonly CVarDef<float> MaxStationOffset =
- CVarDef.Create("game.maxstationoffset", 1000.0f);
-
- /// <summary>
- /// Whether a random rotation will be applied to the station on roundstart.
- /// </summary>
- public static readonly CVarDef<bool> StationRotation =
- CVarDef.Create("game.station_rotation", true);
-
/// <summary>
/// When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
/// </summary>