Supermatter grenades (#13747)
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
This commit is contained in:
@@ -58,6 +58,7 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
[Dependency] private readonly SharedContainerSystem _container = default!;
|
||||
[Dependency] private readonly BodySystem _body = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
||||
[Dependency] private readonly RadioSystem _radioSystem = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
@@ -84,9 +85,32 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
SubscribeLocalEvent<ExplodeOnTriggerComponent, TriggerEvent>(HandleExplodeTrigger);
|
||||
SubscribeLocalEvent<FlashOnTriggerComponent, TriggerEvent>(HandleFlashTrigger);
|
||||
SubscribeLocalEvent<GibOnTriggerComponent, TriggerEvent>(HandleGibTrigger);
|
||||
|
||||
SubscribeLocalEvent<AnchorOnTriggerComponent, TriggerEvent>(OnAnchorTrigger);
|
||||
SubscribeLocalEvent<SoundOnTriggerComponent, TriggerEvent>(OnSoundTrigger);
|
||||
SubscribeLocalEvent<RattleComponent, TriggerEvent>(HandleRattleTrigger);
|
||||
}
|
||||
|
||||
private void OnSoundTrigger(EntityUid uid, SoundOnTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
_audio.PlayPvs(component.Sound, uid);
|
||||
if (component.RemoveOnTrigger)
|
||||
RemCompDeferred<SoundOnTriggerComponent>(uid);
|
||||
}
|
||||
|
||||
private void OnAnchorTrigger(EntityUid uid, AnchorOnTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
var xform = Transform(uid);
|
||||
|
||||
if (xform.Anchored)
|
||||
return;
|
||||
|
||||
_transformSystem.AnchorEntity(uid, xform);
|
||||
|
||||
if(component.RemoveOnTrigger)
|
||||
RemCompDeferred<AnchorOnTriggerComponent>(uid);
|
||||
}
|
||||
|
||||
private void OnSpawnTrigger(EntityUid uid, SpawnOnTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
var xform = Transform(uid);
|
||||
@@ -105,14 +129,12 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
#region Flash
|
||||
private void HandleFlashTrigger(EntityUid uid, FlashOnTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
// TODO Make flash durations sane ffs.
|
||||
_flashSystem.FlashArea(uid, args.User, component.Range, component.Duration * 1000f);
|
||||
args.Handled = true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void HandleDeleteTrigger(EntityUid uid, DeleteOnTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
using Robust.Shared.Timing;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
using Content.Server.Explosion.Components.OnTrigger;
|
||||
|
||||
namespace Content.Server.Explosion.EntitySystems;
|
||||
|
||||
public sealed class TwoStageTriggerSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IComponentFactory _factory = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly ISerializationManager _serializationManager = default!;
|
||||
[Dependency] private readonly TriggerSystem _triggerSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<TwoStageTriggerComponent, EntityUnpausedEvent>(OnTriggerUnpaused);
|
||||
SubscribeLocalEvent<TwoStageTriggerComponent, TriggerEvent>(OnTrigger);
|
||||
}
|
||||
|
||||
private void OnTriggerUnpaused(EntityUid uid, TwoStageTriggerComponent component, ref EntityUnpausedEvent args)
|
||||
{
|
||||
if (component.NextTriggerTime != null)
|
||||
component.NextTriggerTime = component.NextTriggerTime.Value + args.PausedTime;
|
||||
}
|
||||
|
||||
private void OnTrigger(EntityUid uid, TwoStageTriggerComponent component, TriggerEvent args)
|
||||
{
|
||||
if (component.Triggered)
|
||||
return;
|
||||
|
||||
component.Triggered = true;
|
||||
component.NextTriggerTime = _timing.CurTime + component.TriggerDelay;
|
||||
}
|
||||
|
||||
public void LoadComponents(EntityUid uid, TwoStageTriggerComponent component)
|
||||
{
|
||||
foreach (var (name, entry) in component.SecondStageComponents)
|
||||
{
|
||||
var comp = (Component) _factory.GetComponent(name);
|
||||
var temp = (object) comp;
|
||||
|
||||
if (EntityManager.TryGetComponent(uid, entry.Component.GetType(), out var c))
|
||||
RemComp(uid, c);
|
||||
|
||||
comp.Owner = uid;
|
||||
_serializationManager.CopyTo(entry.Component, ref temp);
|
||||
EntityManager.AddComponent(uid, comp);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
|
||||
var enumerator = EntityQueryEnumerator<TwoStageTriggerComponent>();
|
||||
|
||||
while (enumerator.MoveNext(out var uid, out var component))
|
||||
{
|
||||
if (component.NextTriggerTime == null)
|
||||
continue;
|
||||
|
||||
if (_timing.CurTime < component.NextTriggerTime)
|
||||
continue;
|
||||
|
||||
component.NextTriggerTime = null;
|
||||
LoadComponents(uid, component);
|
||||
_triggerSystem.Trigger(uid);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user