diff --git a/Content.Shared/Magic/SharedMagicSystem.cs b/Content.Shared/Magic/SharedMagicSystem.cs index 6afba65a39..3301180e8a 100644 --- a/Content.Shared/Magic/SharedMagicSystem.cs +++ b/Content.Shared/Magic/SharedMagicSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Charges.Systems; using Content.Shared.Coordinates.Helpers; using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; +using Content.Shared.Examine; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; @@ -66,6 +67,7 @@ public abstract class SharedMagicSystem : EntitySystem [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly ExamineSystemShared _examine= default!; private static readonly ProtoId InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell"; @@ -399,22 +401,30 @@ public abstract class SharedMagicSystem : EntitySystem #endregion #region Knock Spells /// - /// Opens all doors and locks within range + /// Opens all doors and locks within range. /// - /// private void OnKnockSpell(KnockSpellEvent args) { if (args.Handled || !PassesSpellPrerequisites(args.Action, args.Performer)) return; args.Handled = true; + Knock(args.Performer, args.Range); + } - var transform = Transform(args.Performer); + /// + /// Opens all doors and locks within range. + /// + /// Performer of spell. + /// Radius around in which all doors and locks should be opened. + public void Knock(EntityUid performer, float range) + { + var transform = Transform(performer); // Look for doors and lockers, and don't open/unlock them if they're already opened/unlocked. - foreach (var target in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(args.Performer, transform), args.Range, flags: LookupFlags.Dynamic | LookupFlags.Static)) + foreach (var target in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(performer, transform), range, flags: LookupFlags.Dynamic | LookupFlags.Static)) { - if (!_interaction.InRangeUnobstructed(args.Performer, target, range: 0, collisionMask: CollisionGroup.Opaque)) + if (!_examine.InRangeUnOccluded(performer, target, range: 0)) continue; if (TryComp(target, out var doorBoltComp) && doorBoltComp.BoltsDown) @@ -424,7 +434,7 @@ public abstract class SharedMagicSystem : EntitySystem _door.StartOpening(target); if (TryComp(target, out var lockComp) && lockComp.Locked) - _lock.Unlock(target, args.Performer, lockComp); + _lock.Unlock(target, performer, lockComp); } } // End Knock Spells diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs index 9cc9efe51b..716ef6c660 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs @@ -1,6 +1,5 @@ -using Content.Shared.Magic.Events; +using Content.Shared.Magic; using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; -using Robust.Shared.Timing; namespace Content.Shared.Xenoarchaeology.Artifact.XAE; @@ -9,19 +8,10 @@ namespace Content.Shared.Xenoarchaeology.Artifact.XAE; /// public sealed class XAEKnockSystem : BaseXAESystem { - [Dependency] private readonly IGameTiming _timing = default!; - + [Dependency] private readonly SharedMagicSystem _magic = default!; /// protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) { - if (!_timing.IsFirstTimePredicted) - return; - - var ev = new KnockSpellEvent - { - Performer = ent.Owner, - Range = ent.Comp.KnockRange - }; - RaiseLocalEvent(ev); + _magic.Knock(args.Artifact, ent.Comp.KnockRange); } }