From 51506e3d3065873a9874f635f2844fb453ec0fa2 Mon Sep 17 00:00:00 2001
From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Date: Fri, 28 Apr 2023 23:15:06 -0400
Subject: [PATCH] Fix station events that use update loops (#15834)
---
.../Components/MeteorSwarmRuleComponent.cs | 19 +++++++++++++++++--
.../Components/StationEventComponent.cs | 4 ++--
.../StationEvents/EventManagerSystem.cs | 3 ++-
.../StationEvents/Events/MeteorSwarmRule.cs | 15 +++++++--------
.../Events/StationEventSystem.cs | 18 ++++++++++++------
Resources/Prototypes/GameRules/events.yml | 1 +
6 files changed, 41 insertions(+), 19 deletions(-)
diff --git a/Content.Server/StationEvents/Components/MeteorSwarmRuleComponent.cs b/Content.Server/StationEvents/Components/MeteorSwarmRuleComponent.cs
index e42eef5b26..96664c44d0 100644
--- a/Content.Server/StationEvents/Components/MeteorSwarmRuleComponent.cs
+++ b/Content.Server/StationEvents/Components/MeteorSwarmRuleComponent.cs
@@ -5,21 +5,36 @@ namespace Content.Server.StationEvents.Components;
[RegisterComponent, Access(typeof(MeteorSwarmRule))]
public sealed class MeteorSwarmRuleComponent : Component
{
- public float _cooldown;
+ [DataField("cooldown")]
+ public float Cooldown;
///
/// We'll send a specific amount of waves of meteors towards the station per ending rather than using a timer.
///
- public int _waveCounter;
+ [DataField("waveCounter")]
+ public int WaveCounter;
+ [DataField("minimumWaves")]
public int MinimumWaves = 3;
+
+ [DataField("maximumWaves")]
public int MaximumWaves = 8;
+ [DataField("minimumCooldown")]
public float MinimumCooldown = 10f;
+
+ [DataField("maximumCooldown")]
public float MaximumCooldown = 60f;
+ [DataField("meteorsPerWave")]
public int MeteorsPerWave = 5;
+
+ [DataField("meteorVelocity")]
public float MeteorVelocity = 10f;
+
+ [DataField("maxAngularVelocity")]
public float MaxAngularVelocity = 0.25f;
+
+ [DataField("minAngularVelocity")]
public float MinAngularVelocity = -0.25f;
}
diff --git a/Content.Server/StationEvents/Components/StationEventComponent.cs b/Content.Server/StationEvents/Components/StationEventComponent.cs
index e79fd6e86d..7c9323183c 100644
--- a/Content.Server/StationEvents/Components/StationEventComponent.cs
+++ b/Content.Server/StationEvents/Components/StationEventComponent.cs
@@ -52,7 +52,7 @@ public sealed class StationEventComponent : Component
/// How long the event lasts.
///
[DataField("duration")]
- public TimeSpan Duration = TimeSpan.FromSeconds(1);
+ public TimeSpan? Duration = TimeSpan.FromSeconds(1);
///
/// The max amount of time the event lasts.
@@ -85,5 +85,5 @@ public sealed class StationEventComponent : Component
/// When the station event starts.
///
[DataField("endTime", customTypeSerializer: typeof(TimeOffsetSerializer))]
- public TimeSpan EndTime;
+ public TimeSpan? EndTime;
}
diff --git a/Content.Server/StationEvents/EventManagerSystem.cs b/Content.Server/StationEvents/EventManagerSystem.cs
index 72a5dfac77..7779eafbba 100644
--- a/Content.Server/StationEvents/EventManagerSystem.cs
+++ b/Content.Server/StationEvents/EventManagerSystem.cs
@@ -36,7 +36,8 @@ public sealed class EventManagerSystem : EntitySystem
private void OnUnpaused(EntityUid uid, StationEventComponent component, ref EntityUnpausedEvent args)
{
component.StartTime += args.PausedTime;
- component.EndTime += args.PausedTime;
+ if (component.EndTime != null)
+ component.EndTime = component.EndTime.Value + args.PausedTime;
}
public override void Shutdown()
diff --git a/Content.Server/StationEvents/Events/MeteorSwarmRule.cs b/Content.Server/StationEvents/Events/MeteorSwarmRule.cs
index eb0597a92e..acae238a6c 100644
--- a/Content.Server/StationEvents/Events/MeteorSwarmRule.cs
+++ b/Content.Server/StationEvents/Events/MeteorSwarmRule.cs
@@ -16,13 +16,12 @@ namespace Content.Server.StationEvents.Events
base.Started(uid, component, gameRule, args);
var mod = Math.Sqrt(GetSeverityModifier());
- component._waveCounter = (int) (RobustRandom.Next(component.MinimumWaves, component.MaximumWaves) * mod);
+ component.WaveCounter = (int) (RobustRandom.Next(component.MinimumWaves, component.MaximumWaves) * mod);
}
protected override void ActiveTick(EntityUid uid, MeteorSwarmRuleComponent component, GameRuleComponent gameRule, float frameTime)
{
- base.ActiveTick(uid, component, gameRule, frameTime);
- if (component._waveCounter <= 0)
+ if (component.WaveCounter <= 0)
{
ForceEndSelf(uid, gameRule);
return;
@@ -30,14 +29,14 @@ namespace Content.Server.StationEvents.Events
var mod = GetSeverityModifier();
- component._cooldown -= frameTime;
+ component.Cooldown -= frameTime;
- if (component._cooldown > 0f)
+ if (component.Cooldown > 0f)
return;
- component._waveCounter--;
+ component.WaveCounter--;
- component._cooldown += (component.MaximumCooldown - component.MinimumCooldown) * RobustRandom.NextFloat() / mod + component.MinimumCooldown;
+ component.Cooldown += (component.MaximumCooldown - component.MinimumCooldown) * RobustRandom.NextFloat() / mod + component.MinimumCooldown;
Box2? playableArea = null;
var mapId = GameTicker.DefaultMap;
@@ -64,7 +63,7 @@ namespace Content.Server.StationEvents.Events
var angle = new Angle(RobustRandom.NextFloat() * MathF.Tau);
var offset = angle.RotateVec(new Vector2((maximumDistance - minimumDistance) * RobustRandom.NextFloat() + minimumDistance, 0));
var spawnPosition = new MapCoordinates(center + offset, mapId);
- var meteor = EntityManager.SpawnEntity("MeteorLarge", spawnPosition);
+ var meteor = Spawn("MeteorLarge", spawnPosition);
var physics = EntityManager.GetComponent(meteor);
_physics.SetBodyStatus(physics, BodyStatus.InAir);
_physics.SetLinearDamping(physics, 0f);
diff --git a/Content.Server/StationEvents/Events/StationEventSystem.cs b/Content.Server/StationEvents/Events/StationEventSystem.cs
index bcec380987..2ff37824b4 100644
--- a/Content.Server/StationEvents/Events/StationEventSystem.cs
+++ b/Content.Server/StationEvents/Events/StationEventSystem.cs
@@ -69,11 +69,15 @@ public abstract class StationEventSystem : GameRuleSystem where T : Compon
return;
AdminLogManager.Add(LogType.EventStarted, LogImpact.High, $"Event started: {ToPrettyString(uid)}");
- var duration = stationEvent.MaxDuration == null
- ? stationEvent.Duration
- : TimeSpan.FromSeconds(RobustRandom.NextDouble(stationEvent.Duration.TotalSeconds,
- stationEvent.MaxDuration.Value.TotalSeconds));
- stationEvent.EndTime = _timing.CurTime + duration;
+
+ if (stationEvent.Duration != null)
+ {
+ var duration = stationEvent.MaxDuration == null
+ ? stationEvent.Duration
+ : TimeSpan.FromSeconds(RobustRandom.NextDouble(stationEvent.Duration.Value.TotalSeconds,
+ stationEvent.MaxDuration.Value.TotalSeconds));
+ stationEvent.EndTime = _timing.CurTime + duration;
+ }
}
///
@@ -101,6 +105,8 @@ public abstract class StationEventSystem : GameRuleSystem where T : Compon
///
public override void Update(float frameTime)
{
+ base.Update(frameTime);
+
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out var stationEvent, out var ruleData))
{
@@ -111,7 +117,7 @@ public abstract class StationEventSystem : GameRuleSystem where T : Compon
{
GameTicker.StartGameRule(uid, ruleData);
}
- else if (GameTicker.IsGameRuleActive(uid, ruleData) && _timing.CurTime >= stationEvent.EndTime)
+ else if (stationEvent.EndTime != null && _timing.CurTime >= stationEvent.EndTime && GameTicker.IsGameRuleActive(uid, ruleData))
{
GameTicker.EndGameRule(uid, ruleData);
}
diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml
index 7163998af5..4c8e245ca2 100644
--- a/Resources/Prototypes/GameRules/events.yml
+++ b/Resources/Prototypes/GameRules/events.yml
@@ -149,6 +149,7 @@
path: /Audio/Announcements/meteors.ogg
params:
volume: -4
+ duration: null #ending is handled by MeteorSwarmRule
startAfter: 30
- type: MeteorSwarmRule
--
2.51.2