diff --git a/Content.Server/ImmovableRod/ImmovableRodComponent.cs b/Content.Server/ImmovableRod/ImmovableRodComponent.cs index f360591479551c..05fa3d9d9b2d2b 100644 --- a/Content.Server/ImmovableRod/ImmovableRodComponent.cs +++ b/Content.Server/ImmovableRod/ImmovableRodComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Damage; using Robust.Shared.Audio; namespace Content.Server.ImmovableRod; @@ -36,4 +37,16 @@ public sealed partial class ImmovableRodComponent : Component /// [DataField("destroyTiles")] public bool DestroyTiles = true; + + /// + /// If true, this will gib & delete bodies + /// + [DataField] + public bool ShouldGib = true; + + /// + /// Damage done, if not gibbing + /// + [DataField] + public DamageSpecifier? Damage; } diff --git a/Content.Server/ImmovableRod/ImmovableRodSystem.cs b/Content.Server/ImmovableRod/ImmovableRodSystem.cs index 429361cd8cda0d..c8f36e864c33ba 100644 --- a/Content.Server/ImmovableRod/ImmovableRodSystem.cs +++ b/Content.Server/ImmovableRod/ImmovableRodSystem.cs @@ -1,9 +1,10 @@ using Content.Server.Body.Systems; +using Content.Server.Polymorph.Components; using Content.Server.Popups; using Content.Shared.Body.Components; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.Popups; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -22,6 +23,8 @@ public sealed class ImmovableRodSystem : EntitySystem [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Update(float frameTime) { @@ -64,11 +67,11 @@ private void OnMapInit(EntityUid uid, ImmovableRodComponent component, MapInitEv var vel = component.DirectionOverride.Degrees switch { 0f => _random.NextVector2(component.MinSpeed, component.MaxSpeed), - _ => xform.WorldRotation.RotateVec(component.DirectionOverride.ToVec()) * _random.NextFloat(component.MinSpeed, component.MaxSpeed) + _ => _transform.GetWorldRotation(uid).RotateVec(component.DirectionOverride.ToVec()) * _random.NextFloat(component.MinSpeed, component.MaxSpeed) }; _physics.ApplyLinearImpulse(uid, vel, body: phys); - xform.LocalRotation = (vel - xform.WorldPosition).ToWorldAngle() + MathHelper.PiOver2; + xform.LocalRotation = (vel - _transform.GetWorldPosition(uid)).ToWorldAngle() + MathHelper.PiOver2; } } @@ -94,12 +97,28 @@ private void OnCollide(EntityUid uid, ImmovableRodComponent component, ref Start return; } - // gib em + // dont delete/hurt self if polymoprhed into a rod + if (TryComp(uid, out var polymorphed)) + { + if (polymorphed.Parent == ent) + return; + } + + // gib or damage em if (TryComp(ent, out var body)) { component.MobCount++; - _popup.PopupEntity(Loc.GetString("immovable-rod-penetrated-mob", ("rod", uid), ("mob", ent)), uid, PopupType.LargeCaution); + + if (!component.ShouldGib) + { + if (component.Damage == null || !TryComp(ent, out var damageable)) + return; + + _damageable.SetDamage(ent, damageable, component.Damage); + return; + } + _bodySystem.GibBody(ent, body: body); return; } diff --git a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml index f46abe8a5af67a..aad12a50254674 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml @@ -11,8 +11,6 @@ state: icon noRot: false - type: ImmovableRod - - type: TimedDespawn - lifetime: 30.0 - type: Physics bodyType: Dynamic linearDamping: 0 @@ -36,8 +34,15 @@ location: immovable rod - type: entity + id: ImmovableRodDespawn parent: ImmovableRod + components: + - type: TimedDespawn + lifetime: 30.0 + +- type: entity id: ImmovableRodSlow + parent: ImmovableRodDespawn suffix: Slow components: - type: ImmovableRod @@ -45,7 +50,7 @@ maxSpeed: 5 - type: entity - parent: ImmovableRod + parent: ImmovableRodDespawn id: ImmovableRodKeepTiles suffix: Keep Tiles components: @@ -53,6 +58,33 @@ destroyTiles: false hitSoundProbability: 1.0 +# For Wizard Polymorph +- type: entity + parent: ImmovableRod + id: ImmovableRodWizard + suffix: Wizard + components: + - type: ImmovableRod + minSpeed: 35 + destroyTiles: false + randomizeVelocity: false + shouldGib: false + damage: + types: + Blunt: 200 + - type: MovementIgnoreGravity + gravityState: true + - type: InputMover + - type: MovementSpeedModifier + weightlessAcceleration: 5 + weightlessModifier: 2 + weightlessFriction: 0 + friction: 0 + frictionNoInput: 0 + - type: CanMoveInAir + - type: MovementAlwaysTouching + - type: NoSlip + - type: entity parent: ImmovableRodKeepTiles id: ImmovableRodKeepTilesStill