ModernUO/Projects/UOContent/Engines/InnateWeaponAbilities.cs

84 lines
2.9 KiB
C#

using System;
using Server.Mobiles;
using Server.Items;
namespace Server.Combat
{
public static class InnateWeaponAbilities
{
public static void CheckProc(Mobile attacker, Mobile defender, BaseWeapon weapon)
{
if (attacker == null || defender == null || weapon == null || !defender.Alive)
return;
double procChance = 0.10;
if (Utility.RandomDouble() >= procChance)
return;
switch (weapon.Skill)
{
case SkillName.Swords:
ApplyBleed(attacker, defender);
break;
case SkillName.Archery:
ApplyHinder(attacker, defender);
break;
case SkillName.Fencing:
ApplyPierce(attacker, defender);
break;
case SkillName.Macing:
ApplyConcussion(attacker, defender);
break;
}
}
private static void ApplyBleed(Mobile attacker, Mobile defender)
{
defender.PlaySound(0x133);
if (typeof(BaseWeapon).Assembly.GetType("Server.Items.BleedAttack") != null)
{
BleedAttack.BeginBleed(defender, attacker);
}
attacker.SendMessage(0x3F, "Your blade inflicts a bleeding wound!");
defender.SendMessage(0x22, "You are bleeding severely!");
}
private static void ApplyHinder(Mobile attacker, Mobile defender)
{
defender.PlaySound(0x204);
defender.FixedEffect(0x376A, 9, 32);
defender.Freeze(TimeSpan.FromSeconds(3.0));
attacker.SendMessage(0x481, "Your arrow pins the target in place!");
defender.SendMessage(0x22, "You have been pinned and cannot move!");
}
private static void ApplyPierce(Mobile attacker, Mobile defender)
{
defender.PlaySound(0x56);
int directDamage = (int)(attacker.Skills[SkillName.Tactics].Value * 0.2) + Utility.RandomMinMax(2, 5);
AOS.Damage(defender, attacker, directDamage, true, 100, 0, 0, 0, 0, 0);
attacker.SendMessage(0x42, $"Your precise thrust pierces through their armor for {directDamage} direct damage!");
defender.SendMessage(0x22, $"You are pierced for {directDamage} direct damage, bypassing your armor!");
}
private static void ApplyConcussion(Mobile attacker, Mobile defender)
{
defender.PlaySound(0x213);
int manaDrain = Utility.RandomMinMax(10, 15);
int stamDrain = Utility.RandomMinMax(10, 15);
defender.Mana -= manaDrain;
defender.Stam -= stamDrain;
attacker.SendMessage(0x35, $"Your crushing blow drained {manaDrain} mana and {stamDrain} stamina!");
}
}
}