Rotate and Offset station CCVar nuke (#26175)

* no content

* add noRot to Europa

* bruh. and this

* yay

* fix
This commit is contained in:
Ed
2024-04-14 17:26:28 +03:00
committed by GitHub
parent fbec5d18cf
commit 44b20f60ff
7 changed files with 70 additions and 39 deletions

View File

@@ -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;
}

View File

@@ -1,9 +1,10 @@
using System.Linq; using System.Linq;
using System.Numerics;
using Content.Server.Chat.Systems; using Content.Server.Chat.Systems;
using Content.Server.GameTicking; using Content.Server.GameTicking;
using Content.Server.Station.Components; using Content.Server.Station.Components;
using Content.Server.Station.Events; using Content.Server.Station.Events;
using Content.Shared.CCVar; using Content.Shared.Fax;
using Content.Shared.Station; using Content.Shared.Station;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Server.GameObjects; using Robust.Server.GameObjects;
@@ -49,17 +50,12 @@ public sealed class StationSystem : EntitySystem
_sawmill = _logManager.GetSawmill("station"); _sawmill = _logManager.GetSawmill("station");
SubscribeLocalEvent<GameRunLevelChangedEvent>(OnRoundEnd); SubscribeLocalEvent<GameRunLevelChangedEvent>(OnRoundEnd);
SubscribeLocalEvent<PreGameMapLoad>(OnPreGameMapLoad);
SubscribeLocalEvent<PostGameMapLoad>(OnPostGameMapLoad); SubscribeLocalEvent<PostGameMapLoad>(OnPostGameMapLoad);
SubscribeLocalEvent<StationDataComponent, ComponentStartup>(OnStationAdd); SubscribeLocalEvent<StationDataComponent, ComponentStartup>(OnStationAdd);
SubscribeLocalEvent<StationDataComponent, ComponentShutdown>(OnStationDeleted); SubscribeLocalEvent<StationDataComponent, ComponentShutdown>(OnStationDeleted);
SubscribeLocalEvent<StationMemberComponent, ComponentShutdown>(OnStationGridDeleted); SubscribeLocalEvent<StationMemberComponent, ComponentShutdown>(OnStationGridDeleted);
SubscribeLocalEvent<StationMemberComponent, PostGridSplitEvent>(OnStationSplitEvent); 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; _player.PlayerStatusChanged += OnPlayerStatusChanged;
} }
@@ -112,19 +108,6 @@ public sealed class StationSystem : EntitySystem
RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast()); 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) private void OnPostGameMapLoad(PostGameMapLoad ev)
{ {
var dict = new Dictionary<string, List<EntityUid>>(); var dict = new Dictionary<string, List<EntityUid>>();
@@ -311,6 +294,8 @@ public sealed class StationSystem : EntitySystem
// Use overrides for setup. // Use overrides for setup.
var station = EntityManager.SpawnEntity(stationConfig.StationPrototype, MapCoordinates.Nullspace, stationConfig.StationComponentOverrides); var station = EntityManager.SpawnEntity(stationConfig.StationPrototype, MapCoordinates.Nullspace, stationConfig.StationComponentOverrides);
if (name is not null) if (name is not null)
RenameStation(station, name, false); RenameStation(station, name, false);
@@ -319,11 +304,48 @@ public sealed class StationSystem : EntitySystem
var data = Comp<StationDataComponent>(station); var data = Comp<StationDataComponent>(station);
name ??= MetaData(station).EntityName; 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); 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)); var ev = new StationPostInitEvent((station, data));
RaiseLocalEvent(station, ref ev, true); RaiseLocalEvent(station, ref ev, true);

View File

@@ -229,25 +229,6 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<bool> public static readonly CVarDef<bool>
GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED); 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> /// <summary>
/// When enabled, guests will be assigned permanent UIDs and will have their preferences stored. /// When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
/// </summary> /// </summary>

View File

@@ -4,6 +4,12 @@
components: components:
- type: StationData - type: StationData
- type: entity
id: BaseRandomStation
abstract: true
components:
- type: StationRandomTransform
- type: entity - type: entity
id: BaseStationCargo id: BaseStationCargo
abstract: true abstract: true

View File

@@ -25,6 +25,7 @@
- BaseStationSiliconLawCrewsimov - BaseStationSiliconLawCrewsimov
- BaseStationAllEventsEligible - BaseStationAllEventsEligible
- BaseStationNanotrasen - BaseStationNanotrasen
- BaseRandomStation
noSpawn: true noSpawn: true
components: components:
- type: Transform - type: Transform

View File

@@ -8,6 +8,9 @@
Europa: Europa:
stationProto: StandardNanotrasenStation stationProto: StandardNanotrasenStation
components: components:
- type: StationRandomTransform
enableStationRotation: false
maxStationOffset: null
- type: StationNameSetup - type: StationNameSetup
mapNameTemplate: '{0} Europa {1}' mapNameTemplate: '{0} Europa {1}'
nameGenerator: nameGenerator:

View File

@@ -8,6 +8,8 @@
Train: Train:
stationProto: StandardNanotrasenStation stationProto: StandardNanotrasenStation
components: components:
- type: StationRandomTransform
enableStationRotation: false
- type: StationNameSetup - type: StationNameSetup
mapNameTemplate: 'Train "Sentipode" {0}-{1}' mapNameTemplate: 'Train "Sentipode" {0}-{1}'
nameGenerator: nameGenerator: