* LOCKED THE FUCK IN * Forgot this little fella * Crying * All entity effects ported, needs cleanup still * Commit * HEHEHEHAW * Shelve for now * fixe * Big * First big chunk of changes * Big if true * Commit * IT BUILDS!!! * Fix LINTER fails * Cleanup * Scale working, cut down on some evil code * Delete old Entity Effects * Accidentally breaking shit by fixing bugs * Fix a bunch of effects not working * Fix reagent thresholds * Update damage * Wait don't change the gas metabolisms A * Cleanup * more fixes * Eh * Misc fixes and jank * Remove two things, add bullshit, change condition to inverted * Remove unused "Shared" system structure * Namespace fix * merge conflicts/cleanup * More fixes * Guidebook text begins * Shelve * Push * More shit to push * Fix * Fix merg conflicts * BLOOD FOR THE BLOOD GOD!!! * Mild cleanup and lists * Fix localization and comments * Shuffle localization around a bit. * All done? * Nearly everything * Is this the end? * Whoops forgot to remove that TODO * Get rid of some warnings for good measure... * It's done * Should make those virtual in case we want to override them tbqh... * Update Content.Shared/EntityEffects/Effects/Botany/PlantAttributes/PlantDestroySeeds.cs Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com> * Fix test fails real * Add to codeowners * Documentation to everything * Forgot to push whoops * Standardize Condition names * Fix up metabolism a little as a treat * review * add IsServer checks --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com>
98 lines
3.6 KiB
C#
98 lines
3.6 KiB
C#
using System.Linq;
|
|
using Content.Shared.Atmos;
|
|
using Content.Shared.Movement.Components;
|
|
using Content.Shared.Movement.Systems;
|
|
using Content.Shared.Temperature.Components;
|
|
using Robust.Shared.Physics.Components;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Content.Shared.Temperature.Systems;
|
|
|
|
/// <summary>
|
|
/// This handles predicting temperature based speedup.
|
|
/// </summary>
|
|
public abstract class SharedTemperatureSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly IGameTiming _timing = default!;
|
|
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
|
|
|
|
/// <summary>
|
|
/// Band-aid for unpredicted atmos. Delays the application for a short period so that laggy clients can get the replicated temperature.
|
|
/// </summary>
|
|
private static readonly TimeSpan SlowdownApplicationDelay = TimeSpan.FromSeconds(1f);
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<TemperatureSpeedComponent, OnTemperatureChangeEvent>(OnTemperatureChanged);
|
|
SubscribeLocalEvent<TemperatureSpeedComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovementSpeedModifiers);
|
|
}
|
|
|
|
private void OnTemperatureChanged(Entity<TemperatureSpeedComponent> ent, ref OnTemperatureChangeEvent args)
|
|
{
|
|
foreach (var (threshold, modifier) in ent.Comp.Thresholds)
|
|
{
|
|
if (args.CurrentTemperature < threshold && args.LastTemperature > threshold ||
|
|
args.CurrentTemperature > threshold && args.LastTemperature < threshold)
|
|
{
|
|
ent.Comp.NextSlowdownUpdate = _timing.CurTime + SlowdownApplicationDelay;
|
|
ent.Comp.CurrentSpeedModifier = modifier;
|
|
Dirty(ent);
|
|
break;
|
|
}
|
|
}
|
|
|
|
var maxThreshold = ent.Comp.Thresholds.Max(p => p.Key);
|
|
if (args.CurrentTemperature > maxThreshold && args.LastTemperature < maxThreshold)
|
|
{
|
|
ent.Comp.NextSlowdownUpdate = _timing.CurTime + SlowdownApplicationDelay;
|
|
ent.Comp.CurrentSpeedModifier = null;
|
|
Dirty(ent);
|
|
}
|
|
}
|
|
|
|
private void OnRefreshMovementSpeedModifiers(Entity<TemperatureSpeedComponent> ent, ref RefreshMovementSpeedModifiersEvent args)
|
|
{
|
|
// Don't update speed and mispredict while we're compensating for lag.
|
|
if (ent.Comp.NextSlowdownUpdate != null || ent.Comp.CurrentSpeedModifier == null)
|
|
return;
|
|
|
|
args.ModifySpeed(ent.Comp.CurrentSpeedModifier.Value, ent.Comp.CurrentSpeedModifier.Value);
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
var query = EntityQueryEnumerator<TemperatureSpeedComponent, MovementSpeedModifierComponent>();
|
|
while (query.MoveNext(out var uid, out var temp, out var movement))
|
|
{
|
|
if (temp.NextSlowdownUpdate == null)
|
|
continue;
|
|
|
|
if (_timing.CurTime < temp.NextSlowdownUpdate)
|
|
continue;
|
|
|
|
temp.NextSlowdownUpdate = null;
|
|
_movementSpeedModifier.RefreshMovementSpeedModifiers(uid, movement);
|
|
Dirty(uid, temp);
|
|
}
|
|
}
|
|
|
|
public virtual void ChangeHeat(EntityUid uid, float heatAmount, bool ignoreHeatResistance = false, TemperatureComponent? temperature = null)
|
|
{
|
|
|
|
}
|
|
|
|
public float GetHeatCapacity(EntityUid uid, TemperatureComponent? comp = null, PhysicsComponent? physics = null)
|
|
{
|
|
if (!Resolve(uid, ref comp) || !Resolve(uid, ref physics, false) || physics.FixturesMass <= 0)
|
|
{
|
|
return Atmospherics.MinimumHeatCapacity;
|
|
}
|
|
|
|
return comp.SpecificHeat * physics.FixturesMass;
|
|
}
|
|
}
|