]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix station events that use update loops (#15834)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Sat, 29 Apr 2023 03:15:06 +0000 (23:15 -0400)
committerGitHub <noreply@github.com>
Sat, 29 Apr 2023 03:15:06 +0000 (13:15 +1000)
Content.Server/StationEvents/Components/MeteorSwarmRuleComponent.cs
Content.Server/StationEvents/Components/StationEventComponent.cs
Content.Server/StationEvents/EventManagerSystem.cs
Content.Server/StationEvents/Events/MeteorSwarmRule.cs
Content.Server/StationEvents/Events/StationEventSystem.cs
Resources/Prototypes/GameRules/events.yml

index e42eef5b26014bcbab72c38690ba4a3dcad00ea5..96664c44d01c7b51e46abf27ed1ecbdacb6910a5 100644 (file)
@@ -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;
 
     /// <summary>
     /// We'll send a specific amount of waves of meteors towards the station per ending rather than using a timer.
     /// </summary>
-    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;
 }
index e79fd6e86d0dcc52b855926696469b75a0bd3a18..7c9323183cd1b81595a445ff0f07b2abbb371371 100644 (file)
@@ -52,7 +52,7 @@ public sealed class StationEventComponent : Component
     ///     How long the event lasts.
     /// </summary>
     [DataField("duration")]
-    public TimeSpan Duration = TimeSpan.FromSeconds(1);
+    public TimeSpan? Duration = TimeSpan.FromSeconds(1);
 
     /// <summary>
     ///     The max amount of time the event lasts.
@@ -85,5 +85,5 @@ public sealed class StationEventComponent : Component
     /// When the station event starts.
     /// </summary>
     [DataField("endTime", customTypeSerializer: typeof(TimeOffsetSerializer))]
-    public TimeSpan EndTime;
+    public TimeSpan? EndTime;
 }
index 72a5dfac7733da24c35a0e04330ab764275a35aa..7779eafbbacb3a6fb4c0d737dd6f58232899d066 100644 (file)
@@ -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()
index eb0597a92ef5596087766170a71997658e595e04..acae238a6cb91ffb24590d99bc30f079ec5fe161 100644 (file)
@@ -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<PhysicsComponent>(meteor);
                 _physics.SetBodyStatus(physics, BodyStatus.InAir);
                 _physics.SetLinearDamping(physics, 0f);
index bcec380987f5e3ab1676b75d192fe55d8e3d9356..2ff37824b448dd7dd3a776870c2f02238c112a1b 100644 (file)
@@ -69,11 +69,15 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> 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;
+        }
     }
 
     /// <inheritdoc/>
@@ -101,6 +105,8 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : Compon
     /// <inheritdoc/>
     public override void Update(float frameTime)
     {
+        base.Update(frameTime);
+
         var query = EntityQueryEnumerator<StationEventComponent, GameRuleComponent>();
         while (query.MoveNext(out var uid, out var stationEvent, out var ruleData))
         {
@@ -111,7 +117,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> 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);
             }
index 7163998af58022d772a7373eada86ebc15b0e302..4c8e245ca2274bae7f9f80c0dbad9b814be46eb0 100644 (file)
       path: /Audio/Announcements/meteors.ogg
       params:
         volume: -4
+    duration: null #ending is handled by MeteorSwarmRule
     startAfter: 30
   - type: MeteorSwarmRule