Fire update (#602)
* fire spread fixes and optimization * fix liquid drops nefty and suffix * some sharedization * melee fire extinguish * clean up fireSpread system * caution popup * cuffable zombies * fix zombie AI * lighter * torch integration attempt * fix torch igniting * yml tweaks * bonus flammable damage
This commit is contained in:
112
Content.Shared/_CP14/Temperature/CP14SharedFireSpreadSystem.cs
Normal file
112
Content.Shared/_CP14/Temperature/CP14SharedFireSpreadSystem.cs
Normal file
@@ -0,0 +1,112 @@
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._CP14.Temperature;
|
||||
|
||||
public abstract partial class CP14SharedFireSpreadSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CP14FireSpreadComponent, OnFireChangedEvent>(OnFireChangedSpread);
|
||||
SubscribeLocalEvent<CP14DespawnOnExtinguishComponent, OnFireChangedEvent>(OnFireChangedDespawn);
|
||||
SubscribeLocalEvent<CP14DelayedIgnitionSourceComponent, OnFireChangedEvent>(OnIgnitionSourceFireChanged);
|
||||
SubscribeLocalEvent<CP14DelayedIgnitionSourceComponent, AfterInteractEvent>(OnDelayedIgniteAttempt);
|
||||
}
|
||||
|
||||
private void OnFireChangedDespawn(Entity<CP14DespawnOnExtinguishComponent> ent, ref OnFireChangedEvent args)
|
||||
{
|
||||
if (!args.OnFire)
|
||||
QueueDel(ent);
|
||||
}
|
||||
|
||||
private void OnFireChangedSpread(Entity<CP14FireSpreadComponent> ent, ref OnFireChangedEvent args)
|
||||
{
|
||||
if (args.OnFire)
|
||||
{
|
||||
EnsureComp<CP14ActiveFireSpreadingComponent>(ent);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (HasComp<CP14ActiveFireSpreadingComponent>(ent))
|
||||
RemCompDeferred<CP14ActiveFireSpreadingComponent>(ent);
|
||||
}
|
||||
|
||||
ent.Comp.NextSpreadTime = _gameTiming.CurTime + TimeSpan.FromSeconds(ent.Comp.SpreadCooldownMax);
|
||||
}
|
||||
|
||||
private void OnDelayedIgniteAttempt(Entity<CP14DelayedIgnitionSourceComponent> ent, ref AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach || args.Handled || args.Target == null)
|
||||
return;
|
||||
|
||||
if (!ent.Comp.Enabled)
|
||||
return;
|
||||
|
||||
var time = ent.Comp.Delay;
|
||||
var caution = true;
|
||||
|
||||
if (TryComp<CP14IgnitionModifierComponent>(args.Target, out var modifier))
|
||||
{
|
||||
time *= modifier.IgnitionTimeModifier;
|
||||
caution = !modifier.HideCaution;
|
||||
}
|
||||
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
|
||||
args.User,
|
||||
time,
|
||||
new CP14IgnitionDoAfter(),
|
||||
args.Target,
|
||||
args.Target,
|
||||
args.Used)
|
||||
{
|
||||
BreakOnDamage = true,
|
||||
BreakOnMove = true,
|
||||
BreakOnDropItem = true,
|
||||
BreakOnHandChange = true,
|
||||
BlockDuplicate = true,
|
||||
CancelDuplicate = true
|
||||
});
|
||||
|
||||
var selfMessage = Loc.GetString("cp14-attempt-ignite-caution-self",
|
||||
("target", MetaData(args.Target.Value).EntityName));
|
||||
var otherMessage = Loc.GetString("cp14-attempt-ignite-caution",
|
||||
("name", Identity.Entity(args.User, EntityManager)),
|
||||
("target", Identity.Entity(args.Target.Value, EntityManager)));
|
||||
_popup.PopupPredicted(selfMessage,
|
||||
otherMessage,
|
||||
args.User,
|
||||
args.User,
|
||||
caution ? PopupType.MediumCaution : PopupType.Small);
|
||||
}
|
||||
|
||||
private void OnIgnitionSourceFireChanged(Entity<CP14DelayedIgnitionSourceComponent> ent, ref OnFireChangedEvent args)
|
||||
{
|
||||
ent.Comp.Enabled = args.OnFire;
|
||||
Dirty(ent);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised whenever an FlammableComponent OnFire is Changed
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public readonly record struct OnFireChangedEvent(bool OnFire)
|
||||
{
|
||||
public readonly bool OnFire = OnFire;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class CP14IgnitionDoAfter : SimpleDoAfterEvent
|
||||
{
|
||||
}
|
||||
Reference in New Issue
Block a user