From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 29 Apr 2023 03:15:06 +0000 (-0400) Subject: Fix station events that use update loops (#15834) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=51506e3d3065873a9874f635f2844fb453ec0fa2;p=space-station-14.git Fix station events that use update loops (#15834) --- 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