combined MeleeHitEvent and ItemMeleeDamageEvent (#11628)

Co-authored-by: CommieFlowers <rasmus.cedergren@hotmail.com>
This commit is contained in:
rolfero
2022-11-03 13:01:08 +01:00
committed by GitHub
parent 6c834c5371
commit e3579c99f5
10 changed files with 32 additions and 53 deletions

View File

@@ -13,7 +13,7 @@ namespace Content.Server.Abilities.Boxer
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<BoxerComponent, ComponentInit>(OnInit); SubscribeLocalEvent<BoxerComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<BoxerComponent, ItemMeleeDamageEvent>(GetDamageModifiers); SubscribeLocalEvent<BoxerComponent, MeleeHitEvent>(OnMeleeHit);
SubscribeLocalEvent<BoxingGlovesComponent, StaminaMeleeHitEvent>(OnStamHit); SubscribeLocalEvent<BoxingGlovesComponent, StaminaMeleeHitEvent>(OnStamHit);
} }
@@ -22,7 +22,7 @@ namespace Content.Server.Abilities.Boxer
if (TryComp<MeleeWeaponComponent>(uid, out var meleeComp)) if (TryComp<MeleeWeaponComponent>(uid, out var meleeComp))
meleeComp.Range *= component.RangeBonus; 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); args.ModifiersList.Add(component.UnarmedModifiers);
} }

View File

@@ -90,6 +90,9 @@ public sealed class StaminaSystem : EntitySystem
private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args) private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args)
{ {
if (!args.IsHit)
return;
if (component.Damage <= 0f) return; if (component.Damage <= 0f) return;
var ev = new StaminaDamageOnHitAttemptEvent(); var ev = new StaminaDamageOnHitAttemptEvent();

View File

@@ -43,6 +43,9 @@ namespace Content.Server.Flash
private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent args) private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent args)
{ {
if (!args.IsHit)
return;
if (!UseFlash(comp, args.User)) if (!UseFlash(comp, args.User))
return; return;

View File

@@ -33,10 +33,10 @@ namespace Content.Server.Stunnable.Systems
SubscribeLocalEvent<StunbatonComponent, UseInHandEvent>(OnUseInHand); SubscribeLocalEvent<StunbatonComponent, UseInHandEvent>(OnUseInHand);
SubscribeLocalEvent<StunbatonComponent, ExaminedEvent>(OnExamined); SubscribeLocalEvent<StunbatonComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<StunbatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt); SubscribeLocalEvent<StunbatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<StunbatonComponent, ItemMeleeDamageEvent>(OnMeleeHit); SubscribeLocalEvent<StunbatonComponent, MeleeHitEvent>(OnMeleeHit);
} }
private void OnMeleeHit(EntityUid uid, StunbatonComponent component, ItemMeleeDamageEvent args) private void OnMeleeHit(EntityUid uid, StunbatonComponent component, MeleeHitEvent args)
{ {
if (!component.Activated) return; if (!component.Activated) return;

View File

@@ -42,10 +42,10 @@ namespace Content.Server.Tools
SubscribeLocalEvent<WelderComponent, ToolUseFinishAttemptEvent>(OnWelderToolUseFinishAttempt); SubscribeLocalEvent<WelderComponent, ToolUseFinishAttemptEvent>(OnWelderToolUseFinishAttempt);
SubscribeLocalEvent<WelderComponent, ComponentShutdown>(OnWelderShutdown); SubscribeLocalEvent<WelderComponent, ComponentShutdown>(OnWelderShutdown);
SubscribeLocalEvent<WelderComponent, ComponentGetState>(OnWelderGetState); SubscribeLocalEvent<WelderComponent, ComponentGetState>(OnWelderGetState);
SubscribeLocalEvent<WelderComponent, ItemMeleeDamageEvent>(OnMeleeHit); SubscribeLocalEvent<WelderComponent, MeleeHitEvent>(OnMeleeHit);
} }
private void OnMeleeHit(EntityUid uid, WelderComponent component, ItemMeleeDamageEvent args) private void OnMeleeHit(EntityUid uid, WelderComponent component, MeleeHitEvent args)
{ {
if (!args.Handled && component.Lit) if (!args.Handled && component.Lit)
args.BonusDamage += component.LitMeleeDamageBonus; args.BonusDamage += component.LitMeleeDamageBonus;

View File

@@ -28,7 +28,7 @@ namespace Content.Server.Weapons.Melee.EnergySword
base.Initialize(); base.Initialize();
SubscribeLocalEvent<EnergySwordComponent, MapInitEvent>(OnMapInit); SubscribeLocalEvent<EnergySwordComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<EnergySwordComponent, ItemMeleeDamageEvent>(OnMeleeHit); SubscribeLocalEvent<EnergySwordComponent, MeleeHitEvent>(OnMeleeHit);
SubscribeLocalEvent<EnergySwordComponent, UseInHandEvent>(OnUseInHand); SubscribeLocalEvent<EnergySwordComponent, UseInHandEvent>(OnUseInHand);
SubscribeLocalEvent<EnergySwordComponent, InteractUsingEvent>(OnInteractUsing); SubscribeLocalEvent<EnergySwordComponent, InteractUsingEvent>(OnInteractUsing);
SubscribeLocalEvent<EnergySwordComponent, IsHotEvent>(OnIsHotEvent); SubscribeLocalEvent<EnergySwordComponent, IsHotEvent>(OnIsHotEvent);
@@ -40,7 +40,7 @@ namespace Content.Server.Weapons.Melee.EnergySword
comp.BladeColor = _random.Pick(comp.ColorOptions); 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; if (!comp.Activated) return;

View File

@@ -1,30 +0,0 @@
using Content.Shared.Damage;
namespace Content.Server.Weapons.Melee.Events;
public sealed class ItemMeleeDamageEvent : HandledEntityEventArgs
{
/// <summary>
/// The base amount of damage dealt by the melee hit.
/// </summary>
public readonly DamageSpecifier BaseDamage = new();
/// <summary>
/// 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.
/// </summary>
public List<DamageModifierSet> ModifiersList = new();
/// <summary>
/// Damage to add to the default melee weapon damage. Applied before modifiers.
/// </summary>
/// <remarks>
/// This might be required as damage modifier sets cannot add a new damage type to a DamageSpecifier.
/// </remarks>
public DamageSpecifier BonusDamage = new();
public ItemMeleeDamageEvent(DamageSpecifier baseDamage)
{
BaseDamage = baseDamage;
}
}

View File

@@ -44,6 +44,15 @@ public sealed class MeleeHitEvent : HandledEntityEventArgs
/// </summary> /// </summary>
public EntityUid User { get; } public EntityUid User { get; }
/// <summary>
/// Check if this is true before attempting to do something during a melee attack other than changing/adding bonus damage. <br/>
/// For example, do not spend charges unless <see cref="IsHit"/> equals true.
/// </summary>
/// <remarks>
/// Examining melee weapons calls this event, but with <see cref="IsHit"/> set to false.
/// </remarks>
public bool IsHit = true;
public MeleeHitEvent(List<EntityUid> hitEntities, EntityUid user, DamageSpecifier baseDamage) public MeleeHitEvent(List<EntityUid> hitEntities, EntityUid user, DamageSpecifier baseDamage)
{ {
HitEntities = hitEntities; HitEntities = hitEntities;

View File

@@ -68,7 +68,8 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
if (!args.CanInteract || !args.CanAccess || component.HideFromExamine) if (!args.CanInteract || !args.CanAccess || component.HideFromExamine)
return; return;
var getDamage = new ItemMeleeDamageEvent(component.Damage); var getDamage = new MeleeHitEvent(new List<EntityUid>(), args.User, component.Damage);
getDamage.IsHit = false;
RaiseLocalEvent(uid, getDamage); RaiseLocalEvent(uid, getDamage);
var damageSpec = GetDamage(component); var damageSpec = GetDamage(component);
@@ -140,11 +141,6 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
if (hitEvent.Handled) if (hitEvent.Handled)
return; return;
var itemDamage = new ItemMeleeDamageEvent(damage);
RaiseLocalEvent(component.Owner, itemDamage);
var modifiers = itemDamage.ModifiersList;
modifiers.AddRange(hitEvent.ModifiersList);
var targets = new List<EntityUid>(1) var targets = new List<EntityUid>(1)
{ {
ev.Target.Value ev.Target.Value
@@ -160,7 +156,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
// For stuff that cares about it being attacked. // For stuff that cares about it being attacked.
RaiseLocalEvent(ev.Target.Value, new AttackedEvent(component.Owner, user, targetXform.Coordinates)); 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); var damageResult = _damageable.TryChangeDamage(ev.Target, modifiedDamage, origin:user);
if (damageResult != null && damageResult.Total > FixedPoint2.Zero) if (damageResult != null && damageResult.Total > FixedPoint2.Zero)
@@ -251,11 +247,6 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
if (hitEvent.Handled) if (hitEvent.Handled)
return; return;
var itemDamage = new ItemMeleeDamageEvent(damage);
RaiseLocalEvent(component.Owner, itemDamage);
var modifiers = itemDamage.ModifiersList;
modifiers.AddRange(hitEvent.ModifiersList);
_interaction.DoContactInteraction(user, ev.Weapon); _interaction.DoContactInteraction(user, ev.Weapon);
// For stuff that cares about it being attacked. // 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)); 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(); var appliedDamage = new DamageSpecifier();
foreach (var entity in targets) foreach (var entity in targets)
@@ -555,6 +546,9 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
private void OnChemicalInjectorHit(EntityUid owner, MeleeChemicalInjectorComponent comp, MeleeHitEvent args) private void OnChemicalInjectorHit(EntityUid owner, MeleeChemicalInjectorComponent comp, MeleeHitEvent args)
{ {
if (!args.IsHit)
return;
if (!_solutions.TryGetSolution(owner, comp.Solution, out var solutionContainer)) if (!_solutions.TryGetSolution(owner, comp.Solution, out var solutionContainer))
return; return;

View File

@@ -37,7 +37,7 @@ namespace Content.Server.Wieldable
SubscribeLocalEvent<WieldableComponent, GetVerbsEvent<InteractionVerb>>(AddToggleWieldVerb); SubscribeLocalEvent<WieldableComponent, GetVerbsEvent<InteractionVerb>>(AddToggleWieldVerb);
SubscribeLocalEvent<WieldableComponent, DisarmAttemptEvent>(OnDisarmAttemptEvent); SubscribeLocalEvent<WieldableComponent, DisarmAttemptEvent>(OnDisarmAttemptEvent);
SubscribeLocalEvent<IncreaseDamageOnWieldComponent, ItemMeleeDamageEvent>(OnMeleeHit); SubscribeLocalEvent<IncreaseDamageOnWieldComponent, MeleeHitEvent>(OnMeleeHit);
} }
private void OnDisarmAttemptEvent(EntityUid uid, WieldableComponent component, DisarmAttemptEvent args) private void OnDisarmAttemptEvent(EntityUid uid, WieldableComponent component, DisarmAttemptEvent args)
@@ -233,7 +233,7 @@ namespace Content.Server.Wieldable
AttemptUnwield(args.BlockingEntity, component, args.User); 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<WieldableComponent>(uid, out var wield)) if (EntityManager.TryGetComponent<WieldableComponent>(uid, out var wield))
{ {