185 lines
5.6 KiB
C#
185 lines
5.6 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Spells;
|
|
using Server.Network;
|
|
using Server.Mobiles;
|
|
using Server.Items;
|
|
|
|
/*When activated the shield user will execute a shield bash on successfully hitting or parrying their opponent
|
|
causing physical damage and paralyzing their opponent based on parry skill, best weapon skill, and mastery level.*/
|
|
|
|
namespace Server.Spells.SkillMasteries
|
|
{
|
|
public class ShieldBashSpell : SkillMasterySpell
|
|
{
|
|
private static SpellInfo m_Info = new SpellInfo(
|
|
"Shield Bash", "",
|
|
-1,
|
|
9002
|
|
);
|
|
|
|
public override int RequiredMana { get { return 40; } }
|
|
public override bool BlocksMovement { get { return false; } }
|
|
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds(1.0); } }
|
|
|
|
public override SkillName CastSkill { get { return SkillName.Parry; } }
|
|
|
|
public double Multiplier { get { return (Caster.Skills[GetBestSkill()].Value + Caster.Skills[SkillName.Parry].Value + (GetMasteryLevel() * 40)) / 360; } }
|
|
|
|
public ShieldBashSpell(Mobile caster, Item scroll)
|
|
: base(caster, scroll, m_Info)
|
|
{
|
|
}
|
|
|
|
public override bool CheckCast()
|
|
{
|
|
if (!HasShield())
|
|
return false;
|
|
|
|
if (HasSpell(Caster, this.GetType()))
|
|
return false;
|
|
|
|
return base.CheckCast();
|
|
}
|
|
|
|
public override void OnCast()
|
|
{
|
|
if (CheckSequence())
|
|
{
|
|
Caster.FixedParticles(0x376A, 9, 32, 5030, 1168, 0, EffectLayer.Waist, 0);
|
|
Caster.PlaySound(0x51A);
|
|
|
|
TimeSpan duration = TimeSpan.FromSeconds((int)Math.Max(3, 5.0 * Multiplier));
|
|
|
|
Caster.SendLocalizedMessage(1156022); // You ready your shield.
|
|
|
|
Expires = DateTime.UtcNow + duration;
|
|
BeginTimer();
|
|
|
|
BuffInfo.AddBuff(Caster, new BuffInfo(BuffIcon.ShieldBash, 1155923, 1156093, duration, Caster));
|
|
//Places you in an offensive stance which allows you to strike your target with your shield on your next successful attack or parry.
|
|
}
|
|
|
|
FinishSequence();
|
|
}
|
|
|
|
public override bool OnTick()
|
|
{
|
|
if (!HasShield())
|
|
{
|
|
Expire();
|
|
return false;
|
|
}
|
|
|
|
return base.OnTick();
|
|
}
|
|
|
|
private bool HasShield()
|
|
{
|
|
if (!Caster.Player)
|
|
return true;
|
|
|
|
BaseShield shield = Caster.FindItemOnLayer(Layer.TwoHanded) as BaseShield;
|
|
|
|
if (shield == null)
|
|
{
|
|
Caster.SendLocalizedMessage(1156096); // You must be wielding a shield to use this ability!
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void EndEffects()
|
|
{
|
|
BuffInfo.RemoveBuff(Caster, BuffIcon.ShieldBash);
|
|
}
|
|
|
|
public override void OnHit(Mobile defender, ref int damage)
|
|
{
|
|
if (!HasShield())
|
|
{
|
|
Expire();
|
|
return;
|
|
}
|
|
|
|
Caster.SendLocalizedMessage(1156027); // You bash you target with your shield!
|
|
bool pvp = Caster is PlayerMobile && defender is PlayerMobile;
|
|
|
|
var multiplier = Multiplier;
|
|
|
|
damage = pvp ? (int)(damage * (multiplier * 3)) : (int)(damage * (multiplier * 7));
|
|
|
|
if (pvp && damage > 35)
|
|
damage = 35;
|
|
|
|
Server.Timer.DelayCall(TimeSpan.FromMilliseconds(100), () =>
|
|
{
|
|
if (defender.Alive)
|
|
{
|
|
CheckParalyze(defender, TimeSpan.FromSeconds(pvp ? multiplier * 3 : multiplier * 6));
|
|
}
|
|
});
|
|
|
|
Expire();
|
|
}
|
|
|
|
private SkillName GetBestSkill()
|
|
{
|
|
double swrd = Caster.Skills[SkillName.Swords].Value;
|
|
double fenc = Caster.Skills[SkillName.Fencing].Value;
|
|
double mcng = Caster.Skills[SkillName.Macing].Value;
|
|
double wres = Caster.Skills[SkillName.Wrestling].Value;
|
|
|
|
SkillName sk = SkillName.Swords;
|
|
double val = swrd;
|
|
|
|
if (fenc > val)
|
|
{
|
|
sk = SkillName.Fencing;
|
|
val = fenc;
|
|
}
|
|
if (mcng > val)
|
|
{
|
|
sk = SkillName.Macing;
|
|
val = mcng;
|
|
}
|
|
if (wres > val)
|
|
{
|
|
sk = SkillName.Wrestling;
|
|
}
|
|
|
|
return sk;
|
|
}
|
|
|
|
private void CheckParalyze(Mobile defender, TimeSpan duration)
|
|
{
|
|
if (ParalyzingBlow.IsImmune(defender))
|
|
{
|
|
Caster.SendLocalizedMessage(1070804); // Your target resists paralysis.
|
|
defender.SendLocalizedMessage(1070813); // You resist paralysis.
|
|
return;
|
|
}
|
|
|
|
defender.FixedEffect(0x376A, 9, 32);
|
|
defender.PlaySound(0x204);
|
|
|
|
Caster.SendLocalizedMessage(1060163); // You deliver a paralyzing blow!
|
|
defender.SendLocalizedMessage(1060164); // The attack has temporarily paralyzed you!
|
|
|
|
// Treat it as paralyze not as freeze, effect must be removed when damaged.
|
|
defender.Paralyze(duration);
|
|
|
|
ParalyzingBlow.BeginImmunity(defender, duration);
|
|
}
|
|
|
|
public override void OnParried(Mobile attacker)
|
|
{
|
|
BaseWeapon wep = Caster.Weapon as BaseWeapon;
|
|
|
|
if (wep != null)
|
|
wep.OnHit(Caster, attacker, 1.0);
|
|
}
|
|
}
|
|
}
|