diff --git a/Content.Server/GameObjects/Components/Mobs/DamageStates.cs b/Content.Server/GameObjects/Components/Mobs/DamageStates.cs index 1134a65539..74ce8cf13e 100644 --- a/Content.Server/GameObjects/Components/Mobs/DamageStates.cs +++ b/Content.Server/GameObjects/Components/Mobs/DamageStates.cs @@ -191,7 +191,7 @@ namespace Content.Server.GameObjects if(entity.TryGetComponent(out StunnableComponent stun)) stun.CancelAll(); - StandingStateHelper.Down(entity); + StandingStateHelper.Down(entity, playSound:false); if (entity.TryGetComponent(out CollidableComponent collidable)) { diff --git a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs index 7e654e6241..d5d64aa8e8 100644 --- a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs @@ -31,7 +31,7 @@ namespace Content.Server.GameObjects.Components.Mobs private float _stunCap = 20f; private float _knockdownCap = 20f; private float _helpKnockdownRemove = 1f; - private float _helpInterval = 0.5f; + private float _helpInterval = 1f; private float _stunnedTimer = 0f; private float _knockdownTimer = 0f; @@ -46,7 +46,7 @@ namespace Content.Server.GameObjects.Components.Mobs base.ExposeData(serializer); serializer.DataField(ref _stunCap, "stunCap", 20f); serializer.DataField(ref _knockdownCap, "knockdownCap", 20f); - serializer.DataField(ref _helpInterval, "helpInterval", 0.5f); + serializer.DataField(ref _helpInterval, "helpInterval", 1f); serializer.DataField(ref _helpKnockdownRemove, "helpKnockdownRemove", 1f); } diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs index 32c9f4c127..5e399f2aa7 100644 --- a/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs @@ -75,6 +75,10 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee serializer.DataField(ref _cooldownTime, "cooldownTime", 1f); } + public virtual void OnHitEntities(IEnumerable entities) + { + } + void IAttack.Attack(AttackEventArgs eventArgs) { var curTime = IoCManager.Resolve().CurTime; @@ -101,6 +105,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee } } + OnHitEntities(hitEntities); + var audioSystem = _entitySystemManager.GetEntitySystem(); var emitter = hitEntities.Count == 0 ? eventArgs.User : hitEntities[0]; audioSystem.Play(hitEntities.Count > 0 ? _hitSound : "/Audio/weapons/punchmiss.ogg", emitter); diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs new file mode 100644 index 0000000000..e03a2172c8 --- /dev/null +++ b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Content.Server.GameObjects.Components.Mobs; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Server.GameObjects.Components.Weapon.Melee +{ + [RegisterComponent] + public class StunbatonComponent : MeleeWeaponComponent + { + public override string Name => "Stunbaton"; + + private float _paralyzeTime = 10f; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(ref _paralyzeTime, "paralyzeTime", 10f); + } + + public override void OnHitEntities(IEnumerable entities) + { + foreach (var entity in entities) + { + if(entity.TryGetComponent(out StunnableComponent stunnable)) + stunnable.Paralyze(_paralyzeTime); + } + } + } +} diff --git a/Resources/Prototypes/Entities/Items/Weapons/security.yml b/Resources/Prototypes/Entities/Items/Weapons/security.yml new file mode 100644 index 0000000000..cb0ccd7b73 --- /dev/null +++ b/Resources/Prototypes/Entities/Items/Weapons/security.yml @@ -0,0 +1,24 @@ +- type: entity + name: Stun baton + parent: BaseItem + id: Stunbaton + components: + - type: Sprite + sprite: Objects/Melee/spear.rsi + state: spear + + - type: Icon + sprite: Objects/Melee/spear.rsi + state: spear + + - type: Stunbaton + range: 1.5 + arcwidth: 0 + arc: default + + - type: Item + Size: 24 + sprite: Objects/Melee/spear.rsi + prefix: inhand + + - type: ItemCooldown