combined MeleeHitEvent and ItemMeleeDamageEvent (#11628)
Co-authored-by: CommieFlowers <rasmus.cedergren@hotmail.com>
This commit is contained in:
@@ -13,7 +13,7 @@ namespace Content.Server.Abilities.Boxer
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<BoxerComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<BoxerComponent, ItemMeleeDamageEvent>(GetDamageModifiers);
|
||||
SubscribeLocalEvent<BoxerComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
SubscribeLocalEvent<BoxingGlovesComponent, StaminaMeleeHitEvent>(OnStamHit);
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Content.Server.Abilities.Boxer
|
||||
if (TryComp<MeleeWeaponComponent>(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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -33,10 +33,10 @@ namespace Content.Server.Stunnable.Systems
|
||||
SubscribeLocalEvent<StunbatonComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<StunbatonComponent, ExaminedEvent>(OnExamined);
|
||||
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;
|
||||
|
||||
|
||||
@@ -42,10 +42,10 @@ namespace Content.Server.Tools
|
||||
SubscribeLocalEvent<WelderComponent, ToolUseFinishAttemptEvent>(OnWelderToolUseFinishAttempt);
|
||||
SubscribeLocalEvent<WelderComponent, ComponentShutdown>(OnWelderShutdown);
|
||||
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)
|
||||
args.BonusDamage += component.LitMeleeDamageBonus;
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace Content.Server.Weapons.Melee.EnergySword
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<EnergySwordComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<EnergySwordComponent, ItemMeleeDamageEvent>(OnMeleeHit);
|
||||
SubscribeLocalEvent<EnergySwordComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
SubscribeLocalEvent<EnergySwordComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<EnergySwordComponent, InteractUsingEvent>(OnInteractUsing);
|
||||
SubscribeLocalEvent<EnergySwordComponent, IsHotEvent>(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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -44,6 +44,15 @@ public sealed class MeleeHitEvent : HandledEntityEventArgs
|
||||
/// </summary>
|
||||
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)
|
||||
{
|
||||
HitEntities = hitEntities;
|
||||
|
||||
@@ -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<EntityUid>(), 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<EntityUid>(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;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Content.Server.Wieldable
|
||||
SubscribeLocalEvent<WieldableComponent, GetVerbsEvent<InteractionVerb>>(AddToggleWieldVerb);
|
||||
SubscribeLocalEvent<WieldableComponent, DisarmAttemptEvent>(OnDisarmAttemptEvent);
|
||||
|
||||
SubscribeLocalEvent<IncreaseDamageOnWieldComponent, ItemMeleeDamageEvent>(OnMeleeHit);
|
||||
SubscribeLocalEvent<IncreaseDamageOnWieldComponent, MeleeHitEvent>(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<WieldableComponent>(uid, out var wield))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user