1
0

SharedTemperatureSystem.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Linq;
  2. using Content.Shared.Movement.Components;
  3. using Content.Shared.Movement.Systems;
  4. using Content.Shared.Temperature.Components;
  5. using Robust.Shared.Timing;
  6. namespace Content.Shared.Temperature.Systems;
  7. /// <summary>
  8. /// This handles predicting temperature based speedup.
  9. /// </summary>
  10. public sealed class SharedTemperatureSystem : EntitySystem
  11. {
  12. [Dependency] private readonly IGameTiming _timing = default!;
  13. [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
  14. /// <summary>
  15. /// Band-aid for unpredicted atmos. Delays the application for a short period so that laggy clients can get the replicated temperature.
  16. /// </summary>
  17. private static readonly TimeSpan SlowdownApplicationDelay = TimeSpan.FromSeconds(1f);
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<TemperatureSpeedComponent, OnTemperatureChangeEvent>(OnTemperatureChanged);
  22. SubscribeLocalEvent<TemperatureSpeedComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovementSpeedModifiers);
  23. }
  24. private void OnTemperatureChanged(Entity<TemperatureSpeedComponent> ent, ref OnTemperatureChangeEvent args)
  25. {
  26. foreach (var (threshold, modifier) in ent.Comp.Thresholds)
  27. {
  28. if (args.CurrentTemperature < threshold && args.LastTemperature > threshold ||
  29. args.CurrentTemperature > threshold && args.LastTemperature < threshold)
  30. {
  31. ent.Comp.NextSlowdownUpdate = _timing.CurTime + SlowdownApplicationDelay;
  32. ent.Comp.CurrentSpeedModifier = modifier;
  33. Dirty(ent);
  34. break;
  35. }
  36. }
  37. var maxThreshold = ent.Comp.Thresholds.Max(p => p.Key);
  38. if (args.CurrentTemperature > maxThreshold && args.LastTemperature < maxThreshold)
  39. {
  40. ent.Comp.NextSlowdownUpdate = _timing.CurTime + SlowdownApplicationDelay;
  41. ent.Comp.CurrentSpeedModifier = null;
  42. Dirty(ent);
  43. }
  44. }
  45. private void OnRefreshMovementSpeedModifiers(Entity<TemperatureSpeedComponent> ent, ref RefreshMovementSpeedModifiersEvent args)
  46. {
  47. // Don't update speed and mispredict while we're compensating for lag.
  48. if (ent.Comp.NextSlowdownUpdate != null || ent.Comp.CurrentSpeedModifier == null)
  49. return;
  50. args.ModifySpeed(ent.Comp.CurrentSpeedModifier.Value, ent.Comp.CurrentSpeedModifier.Value);
  51. }
  52. public override void Update(float frameTime)
  53. {
  54. base.Update(frameTime);
  55. var query = EntityQueryEnumerator<TemperatureSpeedComponent, MovementSpeedModifierComponent>();
  56. while (query.MoveNext(out var uid, out var temp, out var movement))
  57. {
  58. if (temp.NextSlowdownUpdate == null)
  59. continue;
  60. if (_timing.CurTime < temp.NextSlowdownUpdate)
  61. continue;
  62. temp.NextSlowdownUpdate = null;
  63. _movementSpeedModifier.RefreshMovementSpeedModifiers(uid, movement);
  64. Dirty(uid, temp);
  65. }
  66. }
  67. }