Candles (#21087)
Co-authored-by: faint <46868845+ficcialfaint@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: ElectroJr <leonsfriedrich@gmail.com>
This commit is contained in:
@@ -1,24 +1,30 @@
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Atmos.Components;
|
||||
using Content.Server.Explosion.EntitySystems;
|
||||
using Content.Server.Stunnable;
|
||||
using Content.Server.Temperature.Components;
|
||||
using Content.Server.Temperature.Systems;
|
||||
using Content.Shared.ActionBlocker;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Interaction.Events;
|
||||
using Content.Shared.Physics;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Rejuvenate;
|
||||
using Content.Shared.Temperature;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Timing;
|
||||
using Content.Shared.Toggleable;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Physics.Events;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server.Atmos.EntitySystems
|
||||
{
|
||||
@@ -36,6 +42,9 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly UseDelaySystem _useDelay = default!;
|
||||
[Dependency] private readonly AudioSystem _audio = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
|
||||
public const float MinimumFireStacks = -10f;
|
||||
public const float MaximumFireStacks = 20f;
|
||||
@@ -63,6 +72,9 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
SubscribeLocalEvent<IgniteOnCollideComponent, LandEvent>(OnIgniteLand);
|
||||
|
||||
SubscribeLocalEvent<IgniteOnMeleeHitComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
|
||||
SubscribeLocalEvent<ExtinguishOnInteractComponent, UseInHandEvent>(OnExtinguishUsingInHand);
|
||||
SubscribeLocalEvent<ExtinguishOnInteractComponent, ActivateInWorldEvent>(OnExtinguishActivateInWorld);
|
||||
}
|
||||
|
||||
private void OnMeleeHit(EntityUid uid, IgniteOnMeleeHitComponent component, MeleeHitEvent args)
|
||||
@@ -128,6 +140,35 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnExtinguishActivateInWorld(EntityUid uid, ExtinguishOnInteractComponent component, ActivateInWorldEvent args)
|
||||
{
|
||||
TryHandExtinguish(uid, component);
|
||||
}
|
||||
|
||||
private void OnExtinguishUsingInHand(EntityUid uid, ExtinguishOnInteractComponent component, UseInHandEvent args)
|
||||
{
|
||||
TryHandExtinguish(uid, component);
|
||||
}
|
||||
|
||||
private void TryHandExtinguish(EntityUid uid, ExtinguishOnInteractComponent component)
|
||||
{
|
||||
if (!TryComp(uid, out FlammableComponent? flammable))
|
||||
return;
|
||||
if (!flammable.OnFire)
|
||||
return;
|
||||
if (TryComp(uid, out UseDelayComponent? useDelay) && _useDelay.ActiveDelay(uid, useDelay))
|
||||
return;
|
||||
|
||||
_useDelay.BeginDelay(uid);
|
||||
_audio.PlayPvs(component.ExtinguishAttemptSound, uid);
|
||||
if (_random.Prob(component.Probability))
|
||||
{
|
||||
AdjustFireStacks(uid, component.StackDelta, flammable);
|
||||
} else
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString(component.ExtinguishFailed), uid);
|
||||
}
|
||||
}
|
||||
private void OnCollide(EntityUid uid, FlammableComponent flammable, ref StartCollideEvent args)
|
||||
{
|
||||
var otherUid = args.OtherEntity;
|
||||
@@ -208,6 +249,12 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
|
||||
_appearance.SetData(uid, FireVisuals.OnFire, flammable.OnFire, appearance);
|
||||
_appearance.SetData(uid, FireVisuals.FireStacks, flammable.FireStacks, appearance);
|
||||
|
||||
// Also enable toggleable-light visuals
|
||||
// This is intended so that matches & candles can re-use code for un-shaded layers on in-hand sprites.
|
||||
// However, this could cause conflicts if something is ACTUALLY both a toggleable light and flammable.
|
||||
// if that ever happens, then fire visuals will need to implement their own in-hand sprite management.
|
||||
_appearance.SetData(uid, ToggleableLightVisuals.Enabled, true, appearance);
|
||||
}
|
||||
|
||||
public void AdjustFireStacks(EntityUid uid, float relativeFireStacks, FlammableComponent? flammable = null)
|
||||
@@ -338,7 +385,7 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
|
||||
_damageableSystem.TryChangeDamage(uid, flammable.Damage * damageScale);
|
||||
|
||||
AdjustFireStacks(uid, -0.1f * (flammable.Resisting ? 10f : 1f), flammable);
|
||||
AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user