diff --git a/Projects/UOContent/Items/Weapons/Abilities/ArmorIgnore.cs b/Projects/UOContent/Items/Weapons/Abilities/ArmorIgnore.cs index 540fc2c3c..b5aa2af30 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/ArmorIgnore.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/ArmorIgnore.cs @@ -12,7 +12,7 @@ namespace Server.Items public override int BaseMana => 30; public override double DamageScalar => 0.9; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/ArmorPierce.cs b/Projects/UOContent/Items/Weapons/Abilities/ArmorPierce.cs index 1d3cb2507..d8b6e8160 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/ArmorPierce.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/ArmorPierce.cs @@ -12,7 +12,7 @@ namespace Server.Items public override bool RequiresSE => true; public override bool RequiresSecondarySkill(Mobile from) => true; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/Bladeweave.cs b/Projects/UOContent/Items/Weapons/Abilities/Bladeweave.cs index 3ac67b7e2..e57e8dd5f 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/Bladeweave.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/Bladeweave.cs @@ -69,18 +69,18 @@ namespace Server.Items ? bwr.NewAbility.OnBeforeDamage(attacker, defender) : base.OnBeforeDamage(attacker, defender); - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (CheckMana(attacker, false)) { if (_newAttack.TryGetValue(attacker, out var bwr)) { attacker.SendLocalizedMessage(1072841, $"#{bwr.ClilocEntry}"); - bwr.NewAbility.OnHit(attacker, defender, damage); + bwr.NewAbility.OnHit(attacker, defender, damage, worldLocation); } else { - base.OnHit(attacker, defender, damage); + base.OnHit(attacker, defender, damage, worldLocation); } _newAttack.Remove(attacker); diff --git a/Projects/UOContent/Items/Weapons/Abilities/BleedAttack.cs b/Projects/UOContent/Items/Weapons/Abilities/BleedAttack.cs index 0cc6f25c4..bf07da601 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/BleedAttack.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/BleedAttack.cs @@ -17,7 +17,7 @@ namespace Server.Items public override int BaseMana => 30; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/Block.cs b/Projects/UOContent/Items/Weapons/Abilities/Block.cs index 8ace4d3bd..0d74d0160 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/Block.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/Block.cs @@ -13,7 +13,7 @@ namespace Server.Items public override int BaseMana => 30; public override bool RequiresSecondarySkill(Mobile from) => true; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/CrushingBlow.cs b/Projects/UOContent/Items/Weapons/Abilities/CrushingBlow.cs index 0dc5d9a60..a16950d61 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/CrushingBlow.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/CrushingBlow.cs @@ -26,7 +26,7 @@ namespace Server.Items return 200.0; } - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/DefenseMastery.cs b/Projects/UOContent/Items/Weapons/Abilities/DefenseMastery.cs index 44715634a..8b86bde70 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/DefenseMastery.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/DefenseMastery.cs @@ -14,7 +14,7 @@ namespace Server.Items public override int BaseMana => 30; public override bool RequiresSecondarySkill(Mobile from) => true; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/Disarm.cs b/Projects/UOContent/Items/Weapons/Abilities/Disarm.cs index d6aab6fdb..caf97f850 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/Disarm.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/Disarm.cs @@ -33,7 +33,7 @@ namespace Server.Items return 200.0; } - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/Dismount.cs b/Projects/UOContent/Items/Weapons/Abilities/Dismount.cs index 7a46d1196..3121b9516 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/Dismount.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/Dismount.cs @@ -16,7 +16,7 @@ public class Dismount : WeaponAbility public override int BaseMana => 20; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/DoubleShot.cs b/Projects/UOContent/Items/Weapons/Abilities/DoubleShot.cs index c32132fac..b86ac6d0a 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/DoubleShot.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/DoubleShot.cs @@ -10,7 +10,7 @@ namespace Server.Items public override bool RequiresTactics(Mobile from) => false; public override bool RequiresSecondarySkill(Mobile from) => true; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { Use(attacker, defender); } diff --git a/Projects/UOContent/Items/Weapons/Abilities/DoubleStrike.cs b/Projects/UOContent/Items/Weapons/Abilities/DoubleStrike.cs index bf963e7f4..bb278292c 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/DoubleStrike.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/DoubleStrike.cs @@ -9,7 +9,7 @@ namespace Server.Items public override int BaseMana => 30; public override double DamageScalar => 0.9; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/DualWield.cs b/Projects/UOContent/Items/Weapons/Abilities/DualWield.cs index c8ea1b1af..cf6e179c6 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/DualWield.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/DualWield.cs @@ -15,7 +15,7 @@ namespace Server.Items public override bool RequiresSecondarySkill(Mobile from) => true; public override SkillName GetSecondarySkillName(Mobile from) => SkillName.Ninjitsu; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/Feint.cs b/Projects/UOContent/Items/Weapons/Abilities/Feint.cs index 20c738a77..dfdf2d2f5 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/Feint.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/Feint.cs @@ -13,7 +13,7 @@ namespace Server.Items public override int BaseMana => 30; public override bool RequiresSecondarySkill(Mobile from) => true; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/ForceArrow.cs b/Projects/UOContent/Items/Weapons/Abilities/ForceArrow.cs index 23298c4f7..e184d9ba2 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/ForceArrow.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/ForceArrow.cs @@ -10,7 +10,7 @@ namespace Server.Items public override bool RequiresTactics(Mobile from) => false; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/ForceOfNature.cs b/Projects/UOContent/Items/Weapons/Abilities/ForceOfNature.cs index 96cbbb3ec..8bea3724d 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/ForceOfNature.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/ForceOfNature.cs @@ -7,7 +7,7 @@ namespace Server.Items { public override int BaseMana => 35; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/FrenziedWhirlwind.cs b/Projects/UOContent/Items/Weapons/Abilities/FrenziedWhirlwind.cs index 2e403eb4a..9750f5f02 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/FrenziedWhirlwind.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/FrenziedWhirlwind.cs @@ -15,7 +15,7 @@ namespace Server.Items public override bool RequiresTactics(Mobile from) => false; public override bool RequiresSecondarySkill(Mobile from) => true; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/InfectiousStrike.cs b/Projects/UOContent/Items/Weapons/Abilities/InfectiousStrike.cs index 92936d0f9..6e9b7df2b 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/InfectiousStrike.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/InfectiousStrike.cs @@ -21,7 +21,7 @@ namespace Server.Items public override bool RequiresTactics(Mobile from) => false; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/InfusedThrow.cs b/Projects/UOContent/Items/Weapons/Abilities/InfusedThrow.cs index 84f7b7580..b5c7aa60a 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/InfusedThrow.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/InfusedThrow.cs @@ -12,7 +12,7 @@ public class InfusedThrow : WeaponAbility { public override int BaseMana => 25; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/LightningArrow.cs b/Projects/UOContent/Items/Weapons/Abilities/LightningArrow.cs index 9c4bc1c39..5805fb406 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/LightningArrow.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/LightningArrow.cs @@ -8,10 +8,7 @@ namespace Server.Items { public override int BaseMana => 20; - //TODO - add ConsumeAmmo on weaponabilities - // public override bool ConsumeAmmo => false; - - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker)) { @@ -28,26 +25,38 @@ namespace Server.Items } using var list = PooledRefList.Create(); - foreach (Mobile m in defender.GetMobilesInRange(5)) + foreach (Mobile m in worldLocation.Map.GetMobilesInRange(worldLocation.Location, 5)) { - if (m != defender && m != attacker && SpellHelper.ValidIndirectTarget(attacker, m) && m?.Deleted == false && - m.Map == attacker.Map && m.Alive && attacker.CanSee(m) && attacker.CanBeHarmful(m) && + if (m != defender && m != attacker && SpellHelper.ValidIndirectTarget(attacker, m) && + m is { Deleted: false, Alive: true } && attacker.CanSee(m) && attacker.CanBeHarmful(m) && attacker.InRange(m, weapon.MaxRange) && attacker.InLOS(m)) { list.Add(m); } } - defender.BoltEffect(0); + // Defender might be already dead/internalized + if (defender is { Deleted: false, Alive: true }) + { + defender.BoltEffect(0); + AOS.Damage(defender, attacker, Utility.RandomMinMax(29, 40), 0, 0, 0, 0, 100); + } + else + { + Effects.SendBoltEffect(new Entity(Serial.Zero, worldLocation.Location, worldLocation.Map)); + } var count = Math.Min(list.Count, 2); - list.Shuffle(); - - for (var i = 0; i < count; i++) + if (count > 0) { - var m = list[i]; - m.BoltEffect(0); - AOS.Damage(m, attacker, Utility.RandomMinMax(29, 40), 0, 0, 0, 0, 100); + list.Shuffle(); + + for (var i = 0; i < count; i++) + { + var m = list[i]; + m.BoltEffect(0); + AOS.Damage(m, attacker, Utility.RandomMinMax(29, 40), 0, 0, 0, 0, 100); + } } } } diff --git a/Projects/UOContent/Items/Weapons/Abilities/MortalStrike.cs b/Projects/UOContent/Items/Weapons/Abilities/MortalStrike.cs index 4c2894a73..a86747b85 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/MortalStrike.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/MortalStrike.cs @@ -17,7 +17,7 @@ namespace Server.Items public override int BaseMana => 30; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/MovingShot.cs b/Projects/UOContent/Items/Weapons/Abilities/MovingShot.cs index 43cb45472..e0b543cfd 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/MovingShot.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/MovingShot.cs @@ -23,7 +23,7 @@ namespace Server.Items attacker.SendLocalizedMessage(1060089); // You fail to execute your special move } - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { // Validates in OnSwing for accuracy scalar diff --git a/Projects/UOContent/Items/Weapons/Abilities/MysticArc.cs b/Projects/UOContent/Items/Weapons/Abilities/MysticArc.cs index a5d0be3ff..560bafff2 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/MysticArc.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/MysticArc.cs @@ -13,7 +13,7 @@ public class MysticArc : WeaponAbility public override int BaseMana => 20; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!CheckMana(attacker, true) && defender != null) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/NerveStrike.cs b/Projects/UOContent/Items/Weapons/Abilities/NerveStrike.cs index 11eb81352..93f0e8e2d 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/NerveStrike.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/NerveStrike.cs @@ -23,7 +23,7 @@ namespace Server.Items return true; } - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/ParalyzingBlow.cs b/Projects/UOContent/Items/Weapons/Abilities/ParalyzingBlow.cs index ecd9ebf1b..772ce34da 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/ParalyzingBlow.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/ParalyzingBlow.cs @@ -54,7 +54,7 @@ namespace Server.Items return true; } - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/PsychicAttack.cs b/Projects/UOContent/Items/Weapons/Abilities/PsychicAttack.cs index c38d387dd..c6e084062 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/PsychicAttack.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/PsychicAttack.cs @@ -8,7 +8,7 @@ namespace Server.Items public static Dictionary Registry { get; } = new(); public override int BaseMana => 30; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/RidingSwipe.cs b/Projects/UOContent/Items/Weapons/Abilities/RidingSwipe.cs index cf2be4a65..b43255d11 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/RidingSwipe.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/RidingSwipe.cs @@ -16,7 +16,7 @@ namespace Server.Items public override bool RequiresSecondarySkill(Mobile from) => true; public override SkillName GetSecondarySkillName(Mobile from) => SkillName.Bushido; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!defender.Mounted) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/SerpentArrow.cs b/Projects/UOContent/Items/Weapons/Abilities/SerpentArrow.cs index fd3ba4afa..e21cd7fef 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/SerpentArrow.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/SerpentArrow.cs @@ -9,7 +9,7 @@ namespace Server.Items public override double GetRequiredSecondarySkill(Mobile from) => 60; public override SkillName GetSecondarySkillName(Mobile from) => SkillName.Poisoning; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/ShadowStrike.cs b/Projects/UOContent/Items/Weapons/Abilities/ShadowStrike.cs index 18b174893..f2eff1929 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/ShadowStrike.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/ShadowStrike.cs @@ -35,7 +35,7 @@ namespace Server.Items return false; } - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/TalonStrike.cs b/Projects/UOContent/Items/Weapons/Abilities/TalonStrike.cs index 13963d11d..25791564e 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/TalonStrike.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/TalonStrike.cs @@ -17,7 +17,7 @@ namespace Server.Items public override SkillName GetSecondarySkillName(Mobile from) => SkillName.Ninjitsu; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (_defenders.Contains(defender) || !Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/Abilities/WeaponAbility.cs b/Projects/UOContent/Items/Weapons/Abilities/WeaponAbility.cs index 498cb6e2f..2d586f55a 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/WeaponAbility.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/WeaponAbility.cs @@ -96,7 +96,8 @@ namespace Server.Items public virtual bool ValidatesDuringHit => true; - public virtual void OnHit(Mobile attacker, Mobile defender, int damage) + // Passing location since defender might be already killed (deleted/internalized) + public virtual void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { } @@ -276,7 +277,7 @@ namespace Server.Items return false; } - private int GetSkillLocalization(SkillName skill) + private static int GetSkillLocalization(SkillName skill) { return skill switch { @@ -359,28 +360,36 @@ namespace Server.Items string option = this switch { ArmorIgnore _ => "Armor Ignore", + ArmorPierce _ => "Armor Pierce", + Bladeweave _ => "Bladeweave", BleedAttack _ => "Bleed Attack", + Block _ => "Block", ConcussionBlow _ => "Concussion Blow", CrushingBlow _ => "Crushing Blow", + DefenseMastery _ => "Defense Mastery", Disarm _ => "Disarm", Dismount _ => "Dismount", + DoubleShot _ => "Double Shot", DoubleStrike _ => "Double Strike", + DualWield _ => "Dual Wield", + Feint _ => "Feint", + ForceArrow _ => "Force Arrow", + ForceOfNature _ => "Force of Nature", + FrenziedWhirlwind _ => "Frenzied Whirlwind", InfectiousStrike _ => "Infectious Strike", + InfusedThrow _ => "Infused Throw", + LightningArrow _ => "Lightning Arrow", MortalStrike _ => "Mortal Strike", MovingShot _ => "Moving Shot", - ParalyzingBlow _ => "Paralyzing Blow", - ShadowStrike _ => "Shadow Strike", - WhirlwindAttack _ => "Whirlwind Attack", - RidingSwipe _ => "Riding Swipe", - FrenziedWhirlwind _ => "Frenzied Whirlwind", - Block _ => "Block", - DefenseMastery _ => "Defense Mastery", + MysticArc _ => "Mystic Arc", NerveStrike _ => "Nerve Strike", + ParalyzingBlow _ => "Paralyzing Blow", + PsychicAttack _ => "Psychic Attack", + RidingSwipe _ => "Riding Swipe", + SerpentArrow _ => "Serpent Arrow", + ShadowStrike _ => "Shadow Strike", TalonStrike _ => "Talon Strike", - Feint _ => "Feint", - DualWield _ => "Dual Wield", - DoubleShot _ => "Double Shot", - ArmorPierce _ => "Armor Pierce", + WhirlwindAttack _ => "Whirlwind Attack", _ => null }; diff --git a/Projects/UOContent/Items/Weapons/Abilities/WhirlwindAttack.cs b/Projects/UOContent/Items/Weapons/Abilities/WhirlwindAttack.cs index b0e7f7a93..54e2802c1 100644 --- a/Projects/UOContent/Items/Weapons/Abilities/WhirlwindAttack.cs +++ b/Projects/UOContent/Items/Weapons/Abilities/WhirlwindAttack.cs @@ -12,7 +12,7 @@ namespace Server.Items { public override int BaseMana => 15; - public override void OnHit(Mobile attacker, Mobile defender, int damage) + public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation) { if (!Validate(attacker) || !CheckMana(attacker, true)) { diff --git a/Projects/UOContent/Items/Weapons/BaseWeapon.cs b/Projects/UOContent/Items/Weapons/BaseWeapon.cs index 26e300729..3c5bc16b7 100644 --- a/Projects/UOContent/Items/Weapons/BaseWeapon.cs +++ b/Projects/UOContent/Items/Weapons/BaseWeapon.cs @@ -1066,21 +1066,19 @@ public abstract partial class BaseWeapon : Item, IWeapon, IFactionItem, ICraftab { var m = from; - var serial = Serial; - if (strBonus != 0) { - m.AddStatMod(new StatMod(StatType.Str, $"{serial}Str", strBonus, TimeSpan.Zero)); + m.AddStatMod(new StatMod(StatType.Str, $"{Serial}Str", strBonus, TimeSpan.Zero)); } if (dexBonus != 0) { - m.AddStatMod(new StatMod(StatType.Dex, $"{serial}Dex", dexBonus, TimeSpan.Zero)); + m.AddStatMod(new StatMod(StatType.Dex, $"{Serial}Dex", dexBonus, TimeSpan.Zero)); } if (intBonus != 0) { - m.AddStatMod(new StatMod(StatType.Int, $"{serial}Int", intBonus, TimeSpan.Zero)); + m.AddStatMod(new StatMod(StatType.Int, $"{Serial}Int", intBonus, TimeSpan.Zero)); } } @@ -1871,6 +1869,7 @@ public abstract partial class BaseWeapon : Item, IWeapon, IFactionItem, ICraftab damage = AOS.Scale(damage, 100 + percentageBonus); + var defLoc = new WorldLocation(defender); var bcAtt = attacker as BaseCreature; var bcDef = defender as BaseCreature; @@ -2210,7 +2209,7 @@ public abstract partial class BaseWeapon : Item, IWeapon, IFactionItem, ICraftab bcAtt?.OnGaveMeleeAttack(defender, damage); bcDef?.OnGotMeleeAttack(attacker, damage); - a?.OnHit(attacker, defender, damage); + a?.OnHit(attacker, defender, damage, defLoc); move?.OnHit(attacker, defender, damage); ForceOfNature.OnHit(attacker, defender); @@ -2276,23 +2275,26 @@ public abstract partial class BaseWeapon : Item, IWeapon, IFactionItem, ICraftab public virtual CheckSlayerResult CheckSlayers(Mobile attacker, Mobile defender) { - var atkWeapon = attacker.Weapon as BaseWeapon; - var atkSlayer = SlayerGroup.GetEntryByName(atkWeapon?.Slayer ?? SlayerName.None); - var atkSlayer2 = SlayerGroup.GetEntryByName(atkWeapon?.Slayer2 ?? SlayerName.None); - - if (atkWeapon is ButchersWarCleaver && TalismanSlayer.Slays(TalismanSlayerName.Bovine, defender)) + if (WeaponAbility.GetCurrentAbility(attacker) is not LightningArrow) { - return CheckSlayerResult.Slayer; - } + var atkWeapon = attacker.Weapon as BaseWeapon; + var atkSlayer = SlayerGroup.GetEntryByName(atkWeapon?.Slayer ?? SlayerName.None); + var atkSlayer2 = SlayerGroup.GetEntryByName(atkWeapon?.Slayer2 ?? SlayerName.None); - if (atkSlayer?.Slays(defender) == true || atkSlayer2?.Slays(defender) == true) - { - return CheckSlayerResult.Slayer; - } + if (atkWeapon is ButchersWarCleaver && TalismanSlayer.Slays(TalismanSlayerName.Bovine, defender)) + { + return CheckSlayerResult.Slayer; + } - if (attacker.Talisman is BaseTalisman talisman && TalismanSlayer.Slays(talisman.Slayer, defender)) - { - return CheckSlayerResult.Slayer; + if (atkSlayer?.Slays(defender) == true || atkSlayer2?.Slays(defender) == true) + { + return CheckSlayerResult.Slayer; + } + + if (attacker.Talisman is BaseTalisman talisman && TalismanSlayer.Slays(talisman.Slayer, defender)) + { + return CheckSlayerResult.Slayer; + } } if (!Core.SE) diff --git a/Projects/UOContent/Items/Weapons/Ranged/BaseRanged.cs b/Projects/UOContent/Items/Weapons/Ranged/BaseRanged.cs index 017440db9..bbe80daf6 100644 --- a/Projects/UOContent/Items/Weapons/Ranged/BaseRanged.cs +++ b/Projects/UOContent/Items/Weapons/Ranged/BaseRanged.cs @@ -81,6 +81,12 @@ namespace Server.Items OnMiss(attacker, defender); } } + else if (WeaponAbility.GetCurrentAbility(attacker) is LightningArrow lightningArrow) + { + // Lightning Arrow doesn't require ammunition + attacker.MovingEffect(defender, EffectID, 18, 1, false, false); + lightningArrow.OnHit(attacker, defender, 0, new WorldLocation(defender)); + } } attacker.RevealingAction(); @@ -201,7 +207,6 @@ namespace Server.Items } attacker.MovingEffect(defender, EffectID, 18, 1, false, false); - return true; } }