diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 2042216c68..4150612d96 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -78,7 +78,7 @@ namespace Content.Client.Entry "SpeedLoader", "Hitscan", "ExplosiveProjectile", - "StunnableProjectile", + "StunOnCollide", "RandomPottedPlant", "CommunicationsConsole", "BarSign", diff --git a/Content.Server/Stunnable/Components/StunOnCollideComponent.cs b/Content.Server/Stunnable/Components/StunOnCollideComponent.cs new file mode 100644 index 0000000000..305604b134 --- /dev/null +++ b/Content.Server/Stunnable/Components/StunOnCollideComponent.cs @@ -0,0 +1,23 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization.Manager.Attributes; + +namespace Content.Server.Stunnable.Components +{ + /// + /// Adds stun when it collides with an entity + /// + [RegisterComponent] + internal sealed class StunOnCollideComponent : Component + { + // TODO: Can probably predict this. + public override string Name => "StunOnCollide"; + + // See stunnable for what these do + [DataField("stunAmount")] + internal int StunAmount = default; + [DataField("knockdownAmount")] + internal int KnockdownAmount = default; + [DataField("slowdownAmount")] + internal int SlowdownAmount = default; + } +} diff --git a/Content.Server/Stunnable/Components/StunnableProjectileComponent.cs b/Content.Server/Stunnable/Components/StunnableProjectileComponent.cs deleted file mode 100644 index 9ebd0f6aad..0000000000 --- a/Content.Server/Stunnable/Components/StunnableProjectileComponent.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Content.Server.Projectiles.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.Physics.Collision; -using Robust.Shared.Physics.Dynamics; -using Robust.Shared.Serialization.Manager.Attributes; - -namespace Content.Server.Stunnable.Components -{ - /// - /// Adds stun when it collides with an entity - /// - [RegisterComponent] - public sealed class StunnableProjectileComponent : Component, IStartCollide - { - public override string Name => "StunnableProjectile"; - - // See stunnable for what these do - [DataField("stunAmount")] - private int _stunAmount = default; - [DataField("knockdownAmount")] - private int _knockdownAmount = default; - [DataField("slowdownAmount")] - private int _slowdownAmount = default; - - protected override void Initialize() - { - base.Initialize(); - - Owner.EnsureComponentWarn(out ProjectileComponent _); - } - - void IStartCollide.CollideWith(Fixture ourFixture, Fixture otherFixture, in Manifold manifold) - { - if (otherFixture.Body.Owner.TryGetComponent(out StunnableComponent? stunnableComponent)) - { - stunnableComponent.Stun(_stunAmount); - stunnableComponent.Knockdown(_knockdownAmount); - stunnableComponent.Slowdown(_slowdownAmount); - } - } - } -} diff --git a/Content.Server/Stunnable/StunOnCollideSystem.cs b/Content.Server/Stunnable/StunOnCollideSystem.cs new file mode 100644 index 0000000000..178b733596 --- /dev/null +++ b/Content.Server/Stunnable/StunOnCollideSystem.cs @@ -0,0 +1,27 @@ +using Content.Server.Stunnable.Components; +using JetBrains.Annotations; +using Robust.Shared.GameObjects; +using Robust.Shared.Physics.Dynamics; + +namespace Content.Server.Stunnable +{ + [UsedImplicitly] + internal sealed class StunOnCollideSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(HandleCollide); + } + + private void HandleCollide(EntityUid uid, StunOnCollideComponent component, StartCollideEvent args) + { + if (args.OtherFixture.Body.Owner.TryGetComponent(out StunnableComponent? stunnableComponent)) + { + stunnableComponent.Stun(component.StunAmount); + stunnableComponent.Knockdown(component.KnockdownAmount); + stunnableComponent.Slowdown(component.SlowdownAmount); + } + } + } +} diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index f2156645d8..2bfe712a92 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -23,7 +23,7 @@ - type: Projectile damages: Blunt: 10 - - type: StunnableProjectile + - type: StunOnCollide - type: entity id: PelletShotgun diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 5f9b898de7..756de9f0cb 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -71,8 +71,9 @@ soundHit: /Audio/Weapons/Guns/Hits/snap.ogg damages: Blunt: 3 - - type: StunnableProjectile - paralyzeAmount: 2 + - type: StunOnCollide + stunAmount: 2 + knockdownAmount: 2 # Energy projectiles - type: entity @@ -105,7 +106,7 @@ soundHitSpecies: "/Audio/Weapons/Guns/Hits/taser_hit.ogg" damages: Heat: 5 - - type: StunnableProjectile + - type: StunOnCollide stunAmount: 5 knockdownAmount: 5 @@ -175,8 +176,9 @@ - type: Projectile deleteOnCollide: false soundHit: /Audio/Effects/gen_hit.ogg - - type: StunnableProjectile - paralyzeAmount: 8 + - type: StunOnCollide + stunAmount: 8 + knockdownAmount: 8 - type: entity id: BulletGrenadeBlast