Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
129
Scripts/Mobiles/AI/Magical AI/SamuraiAI.cs
Normal file
129
Scripts/Mobiles/AI/Magical AI/SamuraiAI.cs
Normal file
@@ -0,0 +1,129 @@
|
||||
#region References
|
||||
using System;
|
||||
|
||||
using Server.Spells;
|
||||
using Server.Spells.Bushido;
|
||||
#endregion
|
||||
|
||||
namespace Server.Mobiles
|
||||
{
|
||||
public class SamuraiAI : MeleeAI
|
||||
{
|
||||
private DateTime m_NextCastTime;
|
||||
private DateTime m_NextSpecial;
|
||||
|
||||
public SamuraiAI(BaseCreature bc)
|
||||
: base(bc)
|
||||
{
|
||||
m_NextCastTime = DateTime.UtcNow;
|
||||
m_NextSpecial = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public virtual SpecialMove GetSpecialMove()
|
||||
{
|
||||
var skill = (int)m_Mobile.Skills[SkillName.Bushido].Value;
|
||||
|
||||
if (skill <= 50)
|
||||
return null;
|
||||
|
||||
if (m_Mobile.Combatant != null && m_Mobile.Combatant.Hits <= 10 && skill >= 25)
|
||||
return SpellRegistry.GetSpecialMove(400); //new HonerableExecution();
|
||||
if (skill >= 70 && CheckForMomentumStrike() && 0.5 > Utility.RandomDouble())
|
||||
return SpellRegistry.GetSpecialMove(405); //new MomentumStrike();
|
||||
return SpellRegistry.GetSpecialMove(404); // new LightningStrike();
|
||||
}
|
||||
|
||||
private bool CheckForMomentumStrike()
|
||||
{
|
||||
var count = 0;
|
||||
IPooledEnumerable eable = m_Mobile.GetMobilesInRange(1);
|
||||
|
||||
foreach (Mobile m in eable)
|
||||
{
|
||||
if (m.CanBeHarmful(m_Mobile) && m != m_Mobile)
|
||||
count++;
|
||||
}
|
||||
|
||||
eable.Free();
|
||||
|
||||
return count > 1;
|
||||
}
|
||||
|
||||
public virtual Spell GetRandomSpell()
|
||||
{
|
||||
// 25 - Confidence
|
||||
// 40 - Counter Attack
|
||||
// 60 - Evasion
|
||||
var skill = (int)m_Mobile.Skills[SkillName.Bushido].Value;
|
||||
|
||||
if (skill < 25)
|
||||
return null;
|
||||
|
||||
var avail = 1;
|
||||
|
||||
if (skill >= 60)
|
||||
avail = 3;
|
||||
else if (skill >= 40)
|
||||
avail = 2;
|
||||
|
||||
switch (Utility.Random(avail))
|
||||
{
|
||||
case 0:
|
||||
return new Confidence(m_Mobile, null);
|
||||
case 1:
|
||||
return new CounterAttack(m_Mobile, null);
|
||||
case 2:
|
||||
return new Evasion(m_Mobile, null);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public override bool DoActionCombat()
|
||||
{
|
||||
base.DoActionCombat();
|
||||
|
||||
var c = m_Mobile.Combatant as Mobile;
|
||||
|
||||
if (c != null)
|
||||
{
|
||||
var move = SpecialMove.GetCurrentMove(m_Mobile);
|
||||
|
||||
if (move == null && m_NextSpecial < DateTime.UtcNow && 0.05 > Utility.RandomDouble())
|
||||
{
|
||||
move = GetSpecialMove();
|
||||
|
||||
if (move != null)
|
||||
{
|
||||
SpecialMove.SetCurrentMove(m_Mobile, move);
|
||||
m_NextSpecial = DateTime.UtcNow + GetCastDelay();
|
||||
}
|
||||
}
|
||||
else if (m_Mobile.Spell == null && m_NextCastTime < DateTime.UtcNow && 0.05 > Utility.RandomDouble())
|
||||
{
|
||||
var spell = GetRandomSpell();
|
||||
|
||||
if (spell != null)
|
||||
{
|
||||
spell.Cast();
|
||||
m_NextCastTime = DateTime.UtcNow + GetCastDelay();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public TimeSpan GetCastDelay()
|
||||
{
|
||||
var skill = (int)m_Mobile.Skills[SkillName.Bushido].Value;
|
||||
|
||||
if (skill >= 60)
|
||||
return TimeSpan.FromSeconds(15);
|
||||
if (skill > 25)
|
||||
return TimeSpan.FromSeconds(30);
|
||||
|
||||
return TimeSpan.FromSeconds(45);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user