Температурные пушки (#90)
* - add: Temperature guns. * - tweak: Change cryo sting slowdown. * - tweak: Tempgun tweaks. * - add: Hardsuit temperature adjustment system.
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
namespace Content.Server._White.ChangeTemperatureOnCollide;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class ChangeTemperatureOnCollideComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public float Temperature;
|
||||
|
||||
[DataField]
|
||||
public string FixtureID = "projectile";
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using Content.Server.Temperature.Components;
|
||||
using Content.Server.Temperature.Systems;
|
||||
using Content.Shared.Atmos;
|
||||
using Robust.Shared.Physics.Events;
|
||||
|
||||
namespace Content.Server._White.ChangeTemperatureOnCollide;
|
||||
|
||||
public sealed class ChangeTemperatureOnCollideSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly TemperatureSystem _temperature = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ChangeTemperatureOnCollideComponent, StartCollideEvent>(OnCollide);
|
||||
}
|
||||
|
||||
private void OnCollide(EntityUid uid, ChangeTemperatureOnCollideComponent component, ref StartCollideEvent args)
|
||||
{
|
||||
if (args.OurFixtureId != component.FixtureID)
|
||||
return;
|
||||
|
||||
if (!TryComp(args.OtherEntity, out TemperatureComponent? temperature))
|
||||
return;
|
||||
|
||||
_temperature.ForceChangeTemperature(args.OtherEntity,
|
||||
MathF.Max(Atmospherics.TCMB, temperature.CurrentTemperature + component.Temperature), temperature);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace Content.Server._White.ChangeTemperatureOnCollide;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class ClothingTemperatureAdjustComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public float Rate = 1f;
|
||||
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public float TargetTemperature = 310.15f;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Temperature;
|
||||
|
||||
namespace Content.Server._White.ChangeTemperatureOnCollide;
|
||||
|
||||
public sealed class ClothingTemperatureAdjustSystem : EntitySystem
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ClothingTemperatureAdjustComponent, InventoryRelayedEvent<AdjustTemperatureEvent>>(
|
||||
OnAdjustTemperature);
|
||||
}
|
||||
|
||||
private void OnAdjustTemperature(Entity<ClothingTemperatureAdjustComponent> ent,
|
||||
ref InventoryRelayedEvent<AdjustTemperatureEvent> args)
|
||||
{
|
||||
var delta = ent.Comp.TargetTemperature - args.Args.Temperature;
|
||||
var rate = Math.Min(ent.Comp.Rate, Math.Abs(delta));
|
||||
args.Args.Temperature += Math.Sign(delta) * rate;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using Content.Server.Temperature.Components;
|
||||
using Content.Server.Temperature.Systems;
|
||||
using Content.Shared.Movement.Components;
|
||||
using Content.Shared.Movement.Systems;
|
||||
|
||||
namespace Content.Server._White.ChangeTemperatureOnCollide;
|
||||
|
||||
public sealed class LowTemperatureSlowdownSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<MovementSpeedModifierComponent, OnTemperatureChangeEvent>(OnTemperatureChange);
|
||||
SubscribeLocalEvent<TemperatureComponent, RefreshMovementSpeedModifiersEvent>(OnMoveSpeedRefresh);
|
||||
}
|
||||
|
||||
private void OnMoveSpeedRefresh(EntityUid uid, TemperatureComponent component,
|
||||
RefreshMovementSpeedModifiersEvent args)
|
||||
{
|
||||
var modifier = !component.Slowdown ? 1f : GetSpeedModifier(component.CurrentTemperature);
|
||||
args.ModifySpeed(modifier, modifier);
|
||||
}
|
||||
|
||||
private void OnTemperatureChange(EntityUid uid, MovementSpeedModifierComponent component,
|
||||
OnTemperatureChangeEvent args)
|
||||
{
|
||||
// ReSharper disable once CompareOfFloatsByEqualityOperator
|
||||
if(GetSpeedModifier(args.LastTemperature) == GetSpeedModifier(args.CurrentTemperature))
|
||||
return;
|
||||
|
||||
_movementSpeedModifierSystem.RefreshMovementSpeedModifiers(uid, component);
|
||||
}
|
||||
|
||||
private static float GetSpeedModifier(float temperature)
|
||||
{
|
||||
return temperature switch
|
||||
{
|
||||
> 290f => 1f,
|
||||
> 280f => 0.9f,
|
||||
> 260f => 0.8f,
|
||||
> 230f => 0.7f,
|
||||
> 200f => 0.6f,
|
||||
> 160f => 0.5f,
|
||||
> 110f => 0.4f,
|
||||
> 50f => 0.3f,
|
||||
_ => 0.2f
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user