Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

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);
}
}
}