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;
[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<TagPrototype> InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell";
#endregion
#region Knock Spells
/// <summary>
- /// Opens all doors and locks within range
+ /// Opens all doors and locks within range.
/// </summary>
- /// <param name="args"></param>
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);
+ /// <summary>
+ /// Opens all doors and locks within range.
+ /// </summary>
+ /// <param name="performer">Performer of spell. </param>
+ /// <param name="range">Radius around <see cref="performer"/> in which all doors and locks should be opened.</param>
+ 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<DoorBoltComponent>(target, out var doorBoltComp) && doorBoltComp.BoltsDown)
_door.StartOpening(target);
if (TryComp<LockComponent>(target, out var lockComp) && lockComp.Locked)
- _lock.Unlock(target, args.Performer, lockComp);
+ _lock.Unlock(target, performer, lockComp);
}
}
// End Knock Spells
-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;
/// </summary>
public sealed class XAEKnockSystem : BaseXAESystem<XAEKnockComponent>
{
- [Dependency] private readonly IGameTiming _timing = default!;
-
+ [Dependency] private readonly SharedMagicSystem _magic = default!;
/// <inheritdoc />
protected override void OnActivated(Entity<XAEKnockComponent> 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);
}
}