CVarify meteor behavior (#29030)
* CVarify meteor behavior * Cache value to reduce CVar calls, hook into OnValueChanged * _cfg is still null at construction time, fixed by just making it set up on Started instead * Invoke immediately! Learning more every step of the way. * Move cached value initialisation to Initialize call * Add explicit supercall
This commit is contained in:
@@ -21,15 +21,4 @@ public sealed partial class MeteorSchedulerComponent : Component
|
|||||||
[DataField, AutoPausedField]
|
[DataField, AutoPausedField]
|
||||||
public TimeSpan NextSwarmTime = TimeSpan.Zero;
|
public TimeSpan NextSwarmTime = TimeSpan.Zero;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The minimum time between swarms
|
|
||||||
/// </summary>
|
|
||||||
[DataField]
|
|
||||||
public TimeSpan MinSwarmDelay = TimeSpan.FromMinutes(7.5f);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The maximum time between swarms
|
|
||||||
/// </summary>
|
|
||||||
[DataField]
|
|
||||||
public TimeSpan MaxSwarmDelay = TimeSpan.FromMinutes(12.5f);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
using Content.Server.GameTicking.Rules;
|
using Content.Server.GameTicking.Rules;
|
||||||
using Content.Server.StationEvents.Components;
|
using Content.Server.StationEvents.Components;
|
||||||
|
using Content.Shared.CCVar;
|
||||||
using Content.Shared.GameTicking.Components;
|
using Content.Shared.GameTicking.Components;
|
||||||
using Content.Shared.Random.Helpers;
|
using Content.Shared.Random.Helpers;
|
||||||
|
using Robust.Shared.Configuration;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server.StationEvents;
|
namespace Content.Server.StationEvents;
|
||||||
@@ -13,12 +15,24 @@ namespace Content.Server.StationEvents;
|
|||||||
public sealed class MeteorSchedulerSystem : GameRuleSystem<MeteorSchedulerComponent>
|
public sealed class MeteorSchedulerSystem : GameRuleSystem<MeteorSchedulerComponent>
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||||
|
|
||||||
|
private TimeSpan _meteorMinDelay;
|
||||||
|
private TimeSpan _meteorMaxDelay;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
_cfg.OnValueChanged(CCVars.MeteorSwarmMinTime, f => { _meteorMinDelay = TimeSpan.FromMinutes(f); }, true);
|
||||||
|
_cfg.OnValueChanged(CCVars.MeteorSwarmMaxTime, f => { _meteorMaxDelay = TimeSpan.FromMinutes(f); }, true);
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Started(EntityUid uid, MeteorSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
|
protected override void Started(EntityUid uid, MeteorSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
|
||||||
{
|
{
|
||||||
base.Started(uid, component, gameRule, args);
|
base.Started(uid, component, gameRule, args);
|
||||||
|
|
||||||
component.NextSwarmTime = Timing.CurTime + RobustRandom.Next(component.MinSwarmDelay, component.MaxSwarmDelay);
|
component.NextSwarmTime = Timing.CurTime + RobustRandom.Next(_meteorMinDelay, _meteorMaxDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ActiveTick(EntityUid uid, MeteorSchedulerComponent component, GameRuleComponent gameRule, float frameTime)
|
protected override void ActiveTick(EntityUid uid, MeteorSchedulerComponent component, GameRuleComponent gameRule, float frameTime)
|
||||||
@@ -28,7 +42,8 @@ public sealed class MeteorSchedulerSystem : GameRuleSystem<MeteorSchedulerCompon
|
|||||||
if (Timing.CurTime < component.NextSwarmTime)
|
if (Timing.CurTime < component.NextSwarmTime)
|
||||||
return;
|
return;
|
||||||
RunSwarm((uid, component));
|
RunSwarm((uid, component));
|
||||||
component.NextSwarmTime += RobustRandom.Next(component.MinSwarmDelay, component.MaxSwarmDelay);
|
|
||||||
|
component.NextSwarmTime += RobustRandom.Next(_meteorMinDelay, _meteorMaxDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunSwarm(Entity<MeteorSchedulerComponent> ent)
|
private void RunSwarm(Entity<MeteorSchedulerComponent> ent)
|
||||||
|
|||||||
@@ -124,6 +124,18 @@ namespace Content.Shared.CCVar
|
|||||||
public static readonly CVarDef<float>
|
public static readonly CVarDef<float>
|
||||||
EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 6f, CVar.ARCHIVE | CVar.SERVERONLY);
|
EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 6f, CVar.ARCHIVE | CVar.SERVERONLY);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Minimum time between meteor swarms in minutes.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<float>
|
||||||
|
MeteorSwarmMinTime = CVarDef.Create("events.meteor_swarm_min_time", 7.5f, CVar.ARCHIVE | CVar.SERVERONLY);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Maximum time between meteor swarms in minutes.
|
||||||
|
/// </summary>
|
||||||
|
public static readonly CVarDef<float>
|
||||||
|
MeteorSwarmMaxTime = CVarDef.Create("events.meteor_swarm_max_time", 12.5f, CVar.ARCHIVE | CVar.SERVERONLY);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Game
|
* Game
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user