From e3579c99f511a07f8c869228e9bea0bc77544a9b Mon Sep 17 00:00:00 2001 From: rolfero <45628623+rolfero@users.noreply.github.com> Date: Thu, 3 Nov 2022 13:01:08 +0100 Subject: [PATCH] combined MeleeHitEvent and ItemMeleeDamageEvent (#11628) Co-authored-by: CommieFlowers --- .../Abilities/Boxer/BoxingSystem.cs | 4 +-- .../Damage/Systems/StaminaSystem.cs | 3 ++ Content.Server/Flash/FlashSystem.cs | 3 ++ .../Stunnable/Systems/StunbatonSystem.cs | 4 +-- Content.Server/Tools/ToolSystem.Welder.cs | 4 +-- .../Melee/EnergySword/EnergySwordSystem.cs | 4 +-- .../Melee/Events/ItemMeleeDamageEvent.cs | 30 ------------------- .../Weapons/Melee/Events/MeleeHitEvent.cs | 9 ++++++ .../Weapons/Melee/MeleeWeaponSystem.cs | 20 +++++-------- Content.Server/Wieldable/WieldableSystem.cs | 4 +-- 10 files changed, 32 insertions(+), 53 deletions(-) delete mode 100644 Content.Server/Weapons/Melee/Events/ItemMeleeDamageEvent.cs diff --git a/Content.Server/Abilities/Boxer/BoxingSystem.cs b/Content.Server/Abilities/Boxer/BoxingSystem.cs index e6672e466e..6c046bda9b 100644 --- a/Content.Server/Abilities/Boxer/BoxingSystem.cs +++ b/Content.Server/Abilities/Boxer/BoxingSystem.cs @@ -13,7 +13,7 @@ namespace Content.Server.Abilities.Boxer { base.Initialize(); SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(GetDamageModifiers); + SubscribeLocalEvent(OnMeleeHit); SubscribeLocalEvent(OnStamHit); } @@ -22,7 +22,7 @@ namespace Content.Server.Abilities.Boxer if (TryComp(uid, out var meleeComp)) meleeComp.Range *= component.RangeBonus; } - private void GetDamageModifiers(EntityUid uid, BoxerComponent component, ItemMeleeDamageEvent args) + private void OnMeleeHit(EntityUid uid, BoxerComponent component, MeleeHitEvent args) { args.ModifiersList.Add(component.UnarmedModifiers); } diff --git a/Content.Server/Damage/Systems/StaminaSystem.cs b/Content.Server/Damage/Systems/StaminaSystem.cs index e1e4d26b79..b7b5969668 100644 --- a/Content.Server/Damage/Systems/StaminaSystem.cs +++ b/Content.Server/Damage/Systems/StaminaSystem.cs @@ -90,6 +90,9 @@ public sealed class StaminaSystem : EntitySystem private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args) { + if (!args.IsHit) + return; + if (component.Damage <= 0f) return; var ev = new StaminaDamageOnHitAttemptEvent(); diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index abd70c5a2e..c2bf86ef55 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -43,6 +43,9 @@ namespace Content.Server.Flash private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent args) { + if (!args.IsHit) + return; + if (!UseFlash(comp, args.User)) return; diff --git a/Content.Server/Stunnable/Systems/StunbatonSystem.cs b/Content.Server/Stunnable/Systems/StunbatonSystem.cs index 9cf044c0d2..eabe7beca0 100644 --- a/Content.Server/Stunnable/Systems/StunbatonSystem.cs +++ b/Content.Server/Stunnable/Systems/StunbatonSystem.cs @@ -33,10 +33,10 @@ namespace Content.Server.Stunnable.Systems SubscribeLocalEvent(OnUseInHand); SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnStaminaHitAttempt); - SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnMeleeHit); } - private void OnMeleeHit(EntityUid uid, StunbatonComponent component, ItemMeleeDamageEvent args) + private void OnMeleeHit(EntityUid uid, StunbatonComponent component, MeleeHitEvent args) { if (!component.Activated) return; diff --git a/Content.Server/Tools/ToolSystem.Welder.cs b/Content.Server/Tools/ToolSystem.Welder.cs index 4f8a576060..6a74b443d8 100644 --- a/Content.Server/Tools/ToolSystem.Welder.cs +++ b/Content.Server/Tools/ToolSystem.Welder.cs @@ -42,10 +42,10 @@ namespace Content.Server.Tools SubscribeLocalEvent(OnWelderToolUseFinishAttempt); SubscribeLocalEvent(OnWelderShutdown); SubscribeLocalEvent(OnWelderGetState); - SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnMeleeHit); } - private void OnMeleeHit(EntityUid uid, WelderComponent component, ItemMeleeDamageEvent args) + private void OnMeleeHit(EntityUid uid, WelderComponent component, MeleeHitEvent args) { if (!args.Handled && component.Lit) args.BonusDamage += component.LitMeleeDamageBonus; diff --git a/Content.Server/Weapons/Melee/EnergySword/EnergySwordSystem.cs b/Content.Server/Weapons/Melee/EnergySword/EnergySwordSystem.cs index a2a13f564c..bd27330920 100644 --- a/Content.Server/Weapons/Melee/EnergySword/EnergySwordSystem.cs +++ b/Content.Server/Weapons/Melee/EnergySword/EnergySwordSystem.cs @@ -28,7 +28,7 @@ namespace Content.Server.Weapons.Melee.EnergySword base.Initialize(); SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnMeleeHit); SubscribeLocalEvent(OnUseInHand); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnIsHotEvent); @@ -40,7 +40,7 @@ namespace Content.Server.Weapons.Melee.EnergySword comp.BladeColor = _random.Pick(comp.ColorOptions); } - private void OnMeleeHit(EntityUid uid, EnergySwordComponent comp, ItemMeleeDamageEvent args) + private void OnMeleeHit(EntityUid uid, EnergySwordComponent comp, MeleeHitEvent args) { if (!comp.Activated) return; diff --git a/Content.Server/Weapons/Melee/Events/ItemMeleeDamageEvent.cs b/Content.Server/Weapons/Melee/Events/ItemMeleeDamageEvent.cs deleted file mode 100644 index 52a60c5fa6..0000000000 --- a/Content.Server/Weapons/Melee/Events/ItemMeleeDamageEvent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Content.Shared.Damage; - -namespace Content.Server.Weapons.Melee.Events; - -public sealed class ItemMeleeDamageEvent : HandledEntityEventArgs -{ - /// - /// The base amount of damage dealt by the melee hit. - /// - public readonly DamageSpecifier BaseDamage = new(); - - /// - /// Modifier sets to apply to the damage when it's all said and done. - /// This should be modified by adding a new entry to the list. - /// - public List ModifiersList = new(); - - /// - /// Damage to add to the default melee weapon damage. Applied before modifiers. - /// - /// - /// This might be required as damage modifier sets cannot add a new damage type to a DamageSpecifier. - /// - public DamageSpecifier BonusDamage = new(); - - public ItemMeleeDamageEvent(DamageSpecifier baseDamage) - { - BaseDamage = baseDamage; - } -} diff --git a/Content.Server/Weapons/Melee/Events/MeleeHitEvent.cs b/Content.Server/Weapons/Melee/Events/MeleeHitEvent.cs index 7a3772d8fc..1c16315c26 100644 --- a/Content.Server/Weapons/Melee/Events/MeleeHitEvent.cs +++ b/Content.Server/Weapons/Melee/Events/MeleeHitEvent.cs @@ -44,6 +44,15 @@ public sealed class MeleeHitEvent : HandledEntityEventArgs /// public EntityUid User { get; } + /// + /// Check if this is true before attempting to do something during a melee attack other than changing/adding bonus damage.
+ /// For example, do not spend charges unless equals true. + ///
+ /// + /// Examining melee weapons calls this event, but with set to false. + /// + public bool IsHit = true; + public MeleeHitEvent(List hitEntities, EntityUid user, DamageSpecifier baseDamage) { HitEntities = hitEntities; diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 526d8513f2..b00b919ea7 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -68,7 +68,8 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem if (!args.CanInteract || !args.CanAccess || component.HideFromExamine) return; - var getDamage = new ItemMeleeDamageEvent(component.Damage); + var getDamage = new MeleeHitEvent(new List(), args.User, component.Damage); + getDamage.IsHit = false; RaiseLocalEvent(uid, getDamage); var damageSpec = GetDamage(component); @@ -140,11 +141,6 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem if (hitEvent.Handled) return; - var itemDamage = new ItemMeleeDamageEvent(damage); - RaiseLocalEvent(component.Owner, itemDamage); - var modifiers = itemDamage.ModifiersList; - modifiers.AddRange(hitEvent.ModifiersList); - var targets = new List(1) { ev.Target.Value @@ -160,7 +156,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem // For stuff that cares about it being attacked. RaiseLocalEvent(ev.Target.Value, new AttackedEvent(component.Owner, user, targetXform.Coordinates)); - var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage + itemDamage.BonusDamage, hitEvent.ModifiersList); + var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage, hitEvent.ModifiersList); var damageResult = _damageable.TryChangeDamage(ev.Target, modifiedDamage, origin:user); if (damageResult != null && damageResult.Total > FixedPoint2.Zero) @@ -251,11 +247,6 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem if (hitEvent.Handled) return; - var itemDamage = new ItemMeleeDamageEvent(damage); - RaiseLocalEvent(component.Owner, itemDamage); - var modifiers = itemDamage.ModifiersList; - modifiers.AddRange(hitEvent.ModifiersList); - _interaction.DoContactInteraction(user, ev.Weapon); // For stuff that cares about it being attacked. @@ -270,7 +261,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem RaiseLocalEvent(target, new AttackedEvent(component.Owner, user, Transform(target).Coordinates)); } - var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage + itemDamage.BonusDamage, hitEvent.ModifiersList); + var modifiedDamage = DamageSpecifier.ApplyModifierSets(damage + hitEvent.BonusDamage, hitEvent.ModifiersList); var appliedDamage = new DamageSpecifier(); foreach (var entity in targets) @@ -555,6 +546,9 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem private void OnChemicalInjectorHit(EntityUid owner, MeleeChemicalInjectorComponent comp, MeleeHitEvent args) { + if (!args.IsHit) + return; + if (!_solutions.TryGetSolution(owner, comp.Solution, out var solutionContainer)) return; diff --git a/Content.Server/Wieldable/WieldableSystem.cs b/Content.Server/Wieldable/WieldableSystem.cs index 4b4458ebce..9fb04f81ae 100644 --- a/Content.Server/Wieldable/WieldableSystem.cs +++ b/Content.Server/Wieldable/WieldableSystem.cs @@ -37,7 +37,7 @@ namespace Content.Server.Wieldable SubscribeLocalEvent>(AddToggleWieldVerb); SubscribeLocalEvent(OnDisarmAttemptEvent); - SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnMeleeHit); } private void OnDisarmAttemptEvent(EntityUid uid, WieldableComponent component, DisarmAttemptEvent args) @@ -233,7 +233,7 @@ namespace Content.Server.Wieldable AttemptUnwield(args.BlockingEntity, component, args.User); } - private void OnMeleeHit(EntityUid uid, IncreaseDamageOnWieldComponent component, ItemMeleeDamageEvent args) + private void OnMeleeHit(EntityUid uid, IncreaseDamageOnWieldComponent component, MeleeHitEvent args) { if (EntityManager.TryGetComponent(uid, out var wield)) {