Polymorph Artifact Effect (#20660)

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
This commit is contained in:
brainfood1183 2023-10-10 00:49:42 +01:00 committed by Debug
parent 13c864b5a3
commit 9f7baed5d4
5 changed files with 122 additions and 1 deletions

View File

@ -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");
}

View File

@ -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);
}
}
}
}

View File

@ -18,6 +18,7 @@ artifact-effect-hint-soap = Lubricated surface
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")

View File

@ -102,3 +102,37 @@
transferName: true
revertOnDeath: true
# this is the monkey polymorph for artifact.
- type: polymorph
id: ArtifactMonkey
entity: MobMonkey
forced: true
transferName: true
allowRepeatedMorphs: true
inventory: Transfer
revertOnCrit: true
revertOnDeath: true
duration: 20
- type: polymorph
id: ArtifactCluwne
entity: MobCluwne
forced: true
transferName: true
transferHumanoidAppearance: true
inventory: None
revertOnDeath: true
revertOnCrit: true
duration: 30
- type: polymorph
id: ArtifactLizard
entity: MobLizard
forced: true
transferName: true
transferHumanoidAppearance: true
inventory: None
revertOnDeath: true
revertOnCrit: true
duration: 20

View File

@ -1,4 +1,4 @@
- type: artifactEffect
- type: artifactEffect
id: EffectBadFeeling
targetDepth: 0
effectHint: artifact-effect-hint-mental
@ -405,6 +405,21 @@
components:
- type: EmpArtifact
- type: artifactEffect
id: EffectPolyMonkey
targetDepth: 2
effectHint: artifact-effect-hint-polymorph
components:
- type: PolyArtifact
- type: artifactEffect
id: EffectPolyLizard
targetDepth: 2
effectHint: artifact-effect-hint-polymorph
components:
- type: PolyArtifact
polymorphPrototypeName: ArtifactLizard
- type: artifactEffect
id: EffectHealAll
targetDepth: 3