Polymorph Artifact Effect (#20660)
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
using Robust.Shared.Audio;
|
||||
using Content.Shared.Polymorph;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Artifact polymorphs surrounding entities when triggered.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class PolyArtifactComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The polymorph effect to trigger.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public ProtoId<PolymorphPrototype> PolymorphPrototypeName = "ArtifactMonkey";
|
||||
|
||||
/// <summary>
|
||||
/// range of the effect.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Range = 2f;
|
||||
|
||||
/// <summary>
|
||||
/// Sound to play on polymorph.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public SoundSpecifier PolySound = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/Magic/staff_animation.ogg");
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
|
||||
using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Server.Polymorph.Systems;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Polymorph;
|
||||
|
||||
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems;
|
||||
|
||||
public sealed class PolyArtifactSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
||||
[Dependency] private readonly MobStateSystem _mob = default!;
|
||||
[Dependency] private readonly PolymorphSystem _poly = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
|
||||
/// <summary>
|
||||
/// On effect trigger polymorphs targets in range.
|
||||
/// </summary>
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<PolyArtifactComponent, ArtifactActivatedEvent>(OnActivate);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provided target is alive and is not a zombie, polymorphs the target.
|
||||
/// </summary>
|
||||
private void OnActivate(EntityUid uid, PolyArtifactComponent component, ArtifactActivatedEvent args)
|
||||
{
|
||||
var xform = Transform(uid);
|
||||
foreach (var comp in _lookup.GetComponentsInRange<HumanoidAppearanceComponent>(xform.Coordinates, component.Range))
|
||||
{
|
||||
var target = comp.Owner;
|
||||
if (_mob.IsAlive(target))
|
||||
{
|
||||
_poly.PolymorphEntity(target, component.PolymorphPrototypeName);
|
||||
_audio.PlayPvs(component.PolySound, uid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user