--- /dev/null
+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");
+}
--- /dev/null
+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);
+ }
+ }
+ }
+}
artifact-effect-hint-communication = Long-distance communication
artifact-effect-hint-phasing = Structural phasing
artifact-effect-hint-sentience = Neurological activity
+artifact-effect-hint-polymorph = Transmogrificational activity
# the triggers should be more obvious than the effects
# gives people an idea of what to do: don't be too specific (i.e. no "welders")