Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rotate and Offset station CCVar nuke #26175

Merged
merged 5 commits into from
Apr 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Content.Server.Station.Systems;

namespace Content.Server.Station.Components;

/// <summary>
/// Stores station parameters that can be randomized by the roundstart
/// </summary>
[RegisterComponent, Access(typeof(StationSystem))]
public sealed partial class StationRandomTransformComponent : Component
{
[DataField]
public float? MaxStationOffset = 100.0f;

[DataField]
public bool EnableStationRotation = true;
}
62 changes: 42 additions & 20 deletions Content.Server/Station/Systems/StationSystem.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -50,17 +51,12 @@ public override void Initialize()
_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;
}

Expand Down Expand Up @@ -113,19 +109,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<string, List<EntityUid>>();
Expand Down Expand Up @@ -312,6 +295,8 @@ public EntityUid InitializeNewStation(StationConfig stationConfig, IEnumerable<E
// Use overrides for setup.
var station = EntityManager.SpawnEntity(stationConfig.StationPrototype, MapCoordinates.Nullspace, stationConfig.StationComponentOverrides);



if (name is not null)
RenameStation(station, name, false);

Expand All @@ -320,11 +305,48 @@ public EntityUid InitializeNewStation(StationConfig stationConfig, IEnumerable<E
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);

Expand Down
19 changes: 0 additions & 19 deletions Content.Shared/CCVar/CCVars.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,25 +229,6 @@ public static readonly CVarDef<bool>
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>
Expand Down
6 changes: 6 additions & 0 deletions Resources/Prototypes/Entities/Stations/base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@
components:
- type: StationData

- type: entity
id: BaseRandomStation
abstract: true
components:
- type: StationRandomTransform

- type: entity
id: BaseStationCargo
abstract: true
Expand Down
1 change: 1 addition & 0 deletions Resources/Prototypes/Entities/Stations/nanotrasen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
- BaseStationSiliconLawCrewsimov
- BaseStationAllEventsEligible
- BaseStationNanotrasen
- BaseRandomStation
noSpawn: true
components:
- type: Transform
Expand Down
3 changes: 3 additions & 0 deletions Resources/Prototypes/Maps/europa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
Europa:
stationProto: StandardNanotrasenStation
components:
- type: StationRandomTransform
enableStationRotation: false
maxStationOffset: null
- type: StationNameSetup
mapNameTemplate: '{0} Europa {1}'
nameGenerator:
Expand Down
2 changes: 2 additions & 0 deletions Resources/Prototypes/Maps/train.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
Train:
stationProto: StandardNanotrasenStation
components:
- type: StationRandomTransform
enableStationRotation: false
- type: StationNameSetup
mapNameTemplate: 'Train "Sentipode" {0}-{1}'
nameGenerator:
Expand Down
Loading