Lots of fixes, changes, rewrites of various things, including but not limited to:
Logging of staff crafting items, Fixes for the OSI client changes The potion stacking stuff BaseWeapon fix, so that damage increase things don't multiply themselves. admin gump fixes for Firewall Various display tweaks for weight SoS no longer spawn in Tokuno Hiryu hues happified to OSI standards staff now see alliance chat correctly Play barkeeper text increased per OSI Various other OSI skill requirement changes Various unimplemented features of the SE moves EventSink for when the client version is received from client. Client validation moved out of the core. Client version validation now has options to ignore/kick/warn/annoy. Automagically tries to detect current client. Reverted the delayeddamagecontext back to OSI standards. Can no longer use bags of sending in jail. MagerySpell implemented. Now only Magery spells have a circle, and various other properties of 'em. TransformationSpellHelper now implemented. Things moved around for this. Spells now need a Timespan for the cast delay, instead of arbitrarily based on Circle. Circle doesn't make sense for non-Magery spells! Alot of the spellweaving spells added to OSI standards.
This commit is contained in:
parent
f12e9745c6
commit
2ad37d54aa
214 changed files with 4881 additions and 1243 deletions
|
|
@ -13,13 +13,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Animate Dead", "Uus Corp",
|
||||
SpellCircle.Fourth, // 0.5 + 1.0 = 1.5s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.GraveDust,
|
||||
Reagent.DaemonBlood
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.5 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 40.0; } }
|
||||
public override int RequiredMana{ get{ return 23; } }
|
||||
|
||||
|
|
|
|||
|
|
@ -10,12 +10,13 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Blood Oath", "In Jux Mani Xen",
|
||||
SpellCircle.Fourth, // 0.5 + 1.0 = 1.5s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.DaemonBlood
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.5 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 20.0; } }
|
||||
public override int RequiredMana{ get{ return 13; } }
|
||||
|
||||
|
|
@ -69,6 +70,7 @@ namespace Server.Spells.Necromancy
|
|||
m.FixedParticles( 0x3728, 1, 13, 9502, 33, 7, (EffectLayer)255 );
|
||||
|
||||
TimeSpan duration = TimeSpan.FromSeconds( ((GetDamageSkill( Caster ) - GetResistSkill( m )) / 8) + 8 );
|
||||
m.CheckSkill( SkillName.MagicResist, 0.0, 120.0 ); //Skill check for gain
|
||||
|
||||
new ExpireTimer( Caster, m, duration ).Start();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,13 +10,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Corpse Skin", "In Agle Corp Ylem",
|
||||
SpellCircle.Fourth, // 0.5 + 1.0 = 1.5s base cast delay
|
||||
203,
|
||||
9051,
|
||||
Reagent.BatWing,
|
||||
Reagent.GraveDust
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.5 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 20.0; } }
|
||||
public override int RequiredMana{ get{ return 11; } }
|
||||
|
||||
|
|
@ -59,6 +60,7 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
double ss = GetDamageSkill( Caster );
|
||||
double mr = ( Caster == m ? 0.0 : GetResistSkill( m ) );
|
||||
m.CheckSkill( SkillName.MagicResist, 0.0, 120.0 ); //Skill check for gain
|
||||
|
||||
TimeSpan duration = TimeSpan.FromSeconds( ((ss - mr) / 2.5) + 40.0 );
|
||||
|
||||
|
|
|
|||
|
|
@ -10,12 +10,13 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Curse Weapon", "An Sanct Gra Char",
|
||||
SpellCircle.First, // 0.5 + 0.25 = 0.75s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.PigIron
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 0.75 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 0.0; } }
|
||||
public override int RequiredMana{ get{ return 7; } }
|
||||
|
||||
|
|
|
|||
|
|
@ -11,13 +11,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Evil Omen", "Pas Tym An Sanct",
|
||||
SpellCircle.First, // 0.5 + 0.25 = 0.75s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.BatWing,
|
||||
Reagent.NoxCrystal
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 0.75 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 20.0; } }
|
||||
public override int RequiredMana{ get{ return 11; } }
|
||||
|
||||
|
|
|
|||
|
|
@ -14,13 +14,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Exorcism", "Ort Corp Grav",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.NoxCrystal,
|
||||
Reagent.GraveDust
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill { get { return 80.0; } }
|
||||
public override int RequiredMana { get { return 40; } }
|
||||
|
||||
|
|
@ -42,7 +43,7 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
public override bool DelayedDamage { get { return false; } }
|
||||
|
||||
private const int Range = 18;
|
||||
private static readonly int Range = (Core.ML ? 48 : 18);
|
||||
|
||||
public override int ComputeKarmaAward()
|
||||
{
|
||||
|
|
@ -59,10 +60,6 @@ namespace Server.Spells.Necromancy
|
|||
}
|
||||
else if( CheckSequence() )
|
||||
{
|
||||
/* Creates a withering frost around the Caster,
|
||||
* which deals Cold Damage to all valid targets in a radius of 5 tiles.
|
||||
*/
|
||||
|
||||
Map map = Caster.Map;
|
||||
|
||||
if( map != null )
|
||||
|
|
@ -73,17 +70,11 @@ namespace Server.Spells.Necromancy
|
|||
if( IsValidTarget( m ) )
|
||||
targets.Add( m );
|
||||
|
||||
//Effects.PlaySound( Caster.Location, map, 0x1FB );
|
||||
//Effects.PlaySound( Caster.Location, map, 0x10B );
|
||||
//Effects.SendLocationParticles( EffectItem.Create( Caster.Location, map, EffectItem.DefaultDuration ), 0x37CC, 1, 40, 97, 3, 9917, 0 );
|
||||
|
||||
for( int i = 0; i < targets.Count; ++i )
|
||||
{
|
||||
Mobile m = targets[i];
|
||||
|
||||
//m.FixedParticles( 0x374A, 1, 15, 9502, 97, 3, (EffectLayer)255 );
|
||||
|
||||
//Suprisingly, no effects
|
||||
//Suprisingly, no sparkle type effects
|
||||
|
||||
m.Location = GetNearestShrine( m );
|
||||
}
|
||||
|
|
@ -97,10 +88,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
if( !m.Player || m.Alive )
|
||||
return false;
|
||||
/*
|
||||
if( m.Corpse != null && m.Corpse.Map == m.Map )
|
||||
return false;
|
||||
* */
|
||||
|
||||
Corpse c = m.Corpse as Corpse;
|
||||
Map map = m.Map;
|
||||
|
|
|
|||
|
|
@ -10,13 +10,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Horrific Beast", "Rel Xen Vas Bal",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.BatWing,
|
||||
Reagent.DaemonBlood
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 40.0; } }
|
||||
public override int RequiredMana{ get{ return 11; } }
|
||||
|
||||
|
|
@ -26,10 +27,17 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
}
|
||||
|
||||
public override void PlayEffect( Mobile m )
|
||||
public override void DoEffect( Mobile m )
|
||||
{
|
||||
m.PlaySound( 0x165 );
|
||||
m.FixedParticles( 0x3728, 1, 13, 9918, 92, 3, EffectLayer.Head );
|
||||
|
||||
m.Delta( MobileDelta.WeaponDamage );
|
||||
}
|
||||
|
||||
public override void RemoveEffect( Mobile m )
|
||||
{
|
||||
m.Delta( MobileDelta.WeaponDamage );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Lich Form", "Rel Xen Corp Ort",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.GraveDust,
|
||||
|
|
@ -18,6 +17,8 @@ namespace Server.Spells.Necromancy
|
|||
Reagent.NoxCrystal
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 70.0; } }
|
||||
public override int RequiredMana{ get{ return 23; } }
|
||||
|
||||
|
|
@ -33,7 +34,7 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
}
|
||||
|
||||
public override void PlayEffect( Mobile m )
|
||||
public override void DoEffect( Mobile m )
|
||||
{
|
||||
m.PlaySound( 0x19C );
|
||||
m.FixedParticles( 0x3709, 1, 30, 9904, 1108, 6, EffectLayer.RightFoot );
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Mind Rot", "Wis An Ben",
|
||||
SpellCircle.Fourth, // 0.5 + 1.0 = 1.5s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.BatWing,
|
||||
|
|
@ -18,6 +17,8 @@ namespace Server.Spells.Necromancy
|
|||
Reagent.DaemonBlood
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.5 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 30.0; } }
|
||||
public override int RequiredMana{ get{ return 17; } }
|
||||
|
||||
|
|
@ -50,6 +51,7 @@ namespace Server.Spells.Necromancy
|
|||
m.FixedParticles( 0x373A, 1, 17, 9903, 15, 4, EffectLayer.Head );
|
||||
|
||||
TimeSpan duration = TimeSpan.FromSeconds( (((GetDamageSkill( Caster ) - GetResistSkill( m )) / 5.0) + 20.0) * (m.Player ? 1.0 : 2.0 ) );
|
||||
m.CheckSkill( SkillName.MagicResist, 0.0, 120.0 ); //Skill check for gain
|
||||
|
||||
if ( m.Player )
|
||||
SetMindRotScalar( Caster, m, 1.25, duration );
|
||||
|
|
|
|||
|
|
@ -11,9 +11,11 @@ namespace Server.Spells.Necromancy
|
|||
public override SkillName CastSkill{ get{ return SkillName.Necromancy; } }
|
||||
public override SkillName DamageSkill{ get{ return SkillName.SpiritSpeak; } }
|
||||
|
||||
//public override int CastDelayBase{ get{ return base.CastDelayBase; } } // Reference, 3
|
||||
|
||||
public override bool ClearHandsOnCast{ get{ return false; } }
|
||||
|
||||
public override int CastDelayFastScalar{ get{ return (Core.SE? base.CastDelayFastScalar : 0); } } // Necromancer spells are not effected by fast cast items, though they are by fast cast recovery
|
||||
public override double CastDelayFastScalar{ get{ return (Core.SE? base.CastDelayFastScalar : 0); } } // Necromancer spells are not affected by fast cast items, though they are by fast cast recovery
|
||||
|
||||
public NecromancerSpell( Mobile caster, Item scroll, SpellInfo info ) : base( caster, scroll, info )
|
||||
{
|
||||
|
|
@ -21,7 +23,11 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
public override int ComputeKarmaAward()
|
||||
{
|
||||
return -(70 + (10 * (int)Circle));
|
||||
//TODO: Verify this formula being that Necro spells don't HAVE a circle.
|
||||
|
||||
//return -(70 + (10 * (int)Circle));
|
||||
|
||||
return -(40 + (int)(10 * (CastDelayBase.TotalSeconds / CastDelaySecondsPerTick)));
|
||||
}
|
||||
|
||||
public override void GetCastSkills( out double min, out double max )
|
||||
|
|
|
|||
|
|
@ -10,13 +10,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Pain Spike", "In Sar",
|
||||
SpellCircle.Second, // 0.5 + 0.5 = 1s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.GraveDust,
|
||||
Reagent.PigIron
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 20.0; } }
|
||||
public override int RequiredMana{ get{ return 5; } }
|
||||
|
||||
|
|
@ -37,7 +38,7 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
SpellHelper.Turn( Caster, m );
|
||||
|
||||
SpellHelper.CheckReflect( (int)this.Circle, Caster, ref m );
|
||||
//SpellHelper.CheckReflect( (int)this.Circle, Caster, ref m ); //Irrelevent asfter AoS
|
||||
|
||||
/* Temporarily causes intense physical pain to the target, dealing direct damage.
|
||||
* After 10 seconds the spell wears off, and if the target is still alive,
|
||||
|
|
@ -49,6 +50,7 @@ namespace Server.Spells.Necromancy
|
|||
m.PlaySound( 0x210 );
|
||||
|
||||
double damage = ((GetDamageSkill( Caster ) - GetResistSkill( m )) / 10) + (m.Player ? 18 : 30);
|
||||
m.CheckSkill( SkillName.MagicResist, 0.0, 120.0 ); //Skill check for gain
|
||||
|
||||
if ( damage < 1 )
|
||||
damage = 1;
|
||||
|
|
|
|||
|
|
@ -10,17 +10,18 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Poison Strike", "In Vas Nox",
|
||||
(Core.ML ? SpellCircle.Fifth : // 0.5 + 1.25 = 1.75s base cast delay
|
||||
SpellCircle.Fourth), // 0.5 + 1.0 = 1.5s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.NoxCrystal
|
||||
);
|
||||
|
||||
public override double RequiredSkill{ get{ return 50.0; } }
|
||||
public override int RequiredMana{ get{ return 17; } }
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( (Core.ML ? 1.75 : 1.5) ); } }
|
||||
|
||||
public PoisonStrikeSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info )
|
||||
public override double RequiredSkill { get { return 50.0; } }
|
||||
public override int RequiredMana { get { return 17; } }
|
||||
|
||||
public PoisonStrikeSpell( Mobile caster, Item scroll )
|
||||
: base( caster, scroll, m_Info )
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -29,11 +30,11 @@ namespace Server.Spells.Necromancy
|
|||
Caster.Target = new InternalTarget( this );
|
||||
}
|
||||
|
||||
public override bool DelayedDamage{ get{ return false; } }
|
||||
public override bool DelayedDamage { get { return false; } }
|
||||
|
||||
public void Target( Mobile m )
|
||||
{
|
||||
if ( CheckHSequence( m ) )
|
||||
if( CheckHSequence( m ) )
|
||||
{
|
||||
SpellHelper.Turn( Caster, m );
|
||||
|
||||
|
|
@ -42,7 +43,7 @@ namespace Server.Spells.Necromancy
|
|||
* One tile from main target receives 50% damage, two tiles from target receives 33% damage.
|
||||
*/
|
||||
|
||||
CheckResisted( m ); // Check magic resist for skill, but do not use return value
|
||||
//CheckResisted( m ); // Check magic resist for skill, but do not use return value //reports from OSI: Necro spells don't give Resist gain
|
||||
|
||||
Effects.SendLocationParticles( EffectItem.Create( m.Location, m.Map, EffectItem.DefaultDuration ), 0x36B0, 1, 14, 63, 7, 9915, 0 );
|
||||
Effects.PlaySound( m.Location, m.Map, 0x229 );
|
||||
|
|
@ -51,23 +52,23 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
Map map = m.Map;
|
||||
|
||||
if ( map != null )
|
||||
if( map != null )
|
||||
{
|
||||
List<Mobile> targets = new List<Mobile>();
|
||||
|
||||
foreach ( Mobile targ in m.GetMobilesInRange( 2 ) )
|
||||
if ( (Caster == targ || SpellHelper.ValidIndirectTarget( Caster, targ )) && Caster.CanBeHarmful( targ, false ) )
|
||||
foreach( Mobile targ in m.GetMobilesInRange( 2 ) )
|
||||
if( (Caster == targ || SpellHelper.ValidIndirectTarget( Caster, targ )) && Caster.CanBeHarmful( targ, false ) )
|
||||
targets.Add( targ );
|
||||
|
||||
for ( int i = 0; i < targets.Count; ++i )
|
||||
for( int i = 0; i < targets.Count; ++i )
|
||||
{
|
||||
Mobile targ = targets[i];
|
||||
|
||||
int num;
|
||||
|
||||
if ( targ.InRange( m.Location, 0 ) )
|
||||
if( targ.InRange( m.Location, 0 ) )
|
||||
num = 1;
|
||||
else if ( targ.InRange( m.Location, 1 ) )
|
||||
else if( targ.InRange( m.Location, 1 ) )
|
||||
num = 2;
|
||||
else
|
||||
num = 3;
|
||||
|
|
@ -85,15 +86,16 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private PoisonStrikeSpell m_Owner;
|
||||
|
||||
public InternalTarget( PoisonStrikeSpell owner ) : base( 12, false, TargetFlags.Harmful )
|
||||
public InternalTarget( PoisonStrikeSpell owner )
|
||||
: base( 12, false, TargetFlags.Harmful )
|
||||
{
|
||||
m_Owner = owner;
|
||||
}
|
||||
|
||||
protected override void OnTarget( Mobile from, object o )
|
||||
{
|
||||
if ( o is Mobile )
|
||||
m_Owner.Target( (Mobile) o );
|
||||
if( o is Mobile )
|
||||
m_Owner.Target( (Mobile)o );
|
||||
}
|
||||
|
||||
protected override void OnTargetFinish( Mobile from )
|
||||
|
|
|
|||
|
|
@ -10,13 +10,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Strangle", "In Bal Nox",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
209,
|
||||
9031,
|
||||
Reagent.DaemonBlood,
|
||||
Reagent.NoxCrystal
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 65.0; } }
|
||||
public override int RequiredMana{ get{ return 29; } }
|
||||
|
||||
|
|
@ -35,7 +36,7 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
SpellHelper.Turn( Caster, m );
|
||||
|
||||
SpellHelper.CheckReflect( (int)this.Circle, Caster, ref m );
|
||||
//SpellHelper.CheckReflect( (int)this.Circle, Caster, ref m ); //Irrelevent after AoS
|
||||
|
||||
/* Temporarily chokes off the air suply of the target with poisonous fumes.
|
||||
* The target is inflicted with poison damage over time.
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Summon Familiar", "Kal Xen Bal",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.BatWing,
|
||||
|
|
@ -20,6 +19,8 @@ namespace Server.Spells.Necromancy
|
|||
Reagent.DaemonBlood
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 30.0; } }
|
||||
public override int RequiredMana{ get{ return 17; } }
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ using Server.Spells.Seventh;
|
|||
|
||||
namespace Server.Spells.Necromancy
|
||||
{
|
||||
public abstract class TransformationSpell : NecromancerSpell
|
||||
public abstract class TransformationSpell : NecromancerSpell, ITransformationSpell
|
||||
{
|
||||
public abstract int Body{ get; }
|
||||
public virtual int Hue{ get{ return 0; } }
|
||||
|
|
@ -26,116 +26,15 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
public override bool CheckCast()
|
||||
{
|
||||
/*if ( Caster.Mounted )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1042561 ); // Please dismount first.
|
||||
if( !TransformationSpellHelper.CheckCast( Caster, this ) )
|
||||
return false;
|
||||
}
|
||||
else */
|
||||
if ( Factions.Sigil.ExistsOn( Caster ) )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1061632 ); // You can't do that while carrying the sigil.
|
||||
return false;
|
||||
}
|
||||
else if ( !Caster.CanBeginAction( typeof( PolymorphSpell ) ) )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1061628 ); // You can't do that while polymorphed.
|
||||
return false;
|
||||
}
|
||||
else if ( Spells.Ninjitsu.AnimalForm.UnderTransformation( Caster ) )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1061091 ); // You cannot cast that spell in this form.
|
||||
return false;
|
||||
}
|
||||
|
||||
return base.CheckCast();
|
||||
}
|
||||
|
||||
public override void OnCast()
|
||||
{
|
||||
Mobile caster = this.Caster;
|
||||
|
||||
/*if ( caster.Mounted )
|
||||
{
|
||||
caster.SendLocalizedMessage( 1042561 ); // Please dismount first.
|
||||
}
|
||||
else */
|
||||
if ( Factions.Sigil.ExistsOn( Caster ) )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1061632 ); // You can't do that while carrying the sigil.
|
||||
}
|
||||
else if ( !caster.CanBeginAction( typeof( PolymorphSpell ) ) )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1061628 ); // You can't do that while polymorphed.
|
||||
}
|
||||
else if ( Spells.Ninjitsu.AnimalForm.UnderTransformation( Caster ) )
|
||||
{
|
||||
Caster.SendLocalizedMessage( 1061091 ); // You cannot cast that spell in this form.
|
||||
}
|
||||
else if ( !caster.CanBeginAction( typeof( IncognitoSpell ) ) || (caster.IsBodyMod && GetContext( caster ) == null) )
|
||||
{
|
||||
DoFizzle();
|
||||
}
|
||||
else if ( CheckSequence() )
|
||||
{
|
||||
TransformContext context = GetContext( caster );
|
||||
Type ourType = this.GetType();
|
||||
|
||||
bool wasTransformed = ( context != null );
|
||||
bool ourTransform = ( wasTransformed && context.Type == ourType );
|
||||
|
||||
if ( wasTransformed )
|
||||
{
|
||||
RemoveContext( caster, context, ourTransform );
|
||||
|
||||
if ( ourTransform )
|
||||
{
|
||||
caster.PlaySound( 0xFA );
|
||||
caster.FixedParticles( 0x3728, 1, 13, 5042, EffectLayer.Waist );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !ourTransform )
|
||||
{
|
||||
List<ResistanceMod> mods = new List<ResistanceMod>();
|
||||
|
||||
if ( PhysResistOffset != 0 )
|
||||
mods.Add( new ResistanceMod( ResistanceType.Physical, PhysResistOffset ) );
|
||||
|
||||
if ( FireResistOffset != 0 )
|
||||
mods.Add( new ResistanceMod( ResistanceType.Fire, FireResistOffset ) );
|
||||
|
||||
if ( ColdResistOffset != 0 )
|
||||
mods.Add( new ResistanceMod( ResistanceType.Cold, ColdResistOffset ) );
|
||||
|
||||
if ( PoisResistOffset != 0 )
|
||||
mods.Add( new ResistanceMod( ResistanceType.Poison, PoisResistOffset ) );
|
||||
|
||||
if ( NrgyResistOffset != 0 )
|
||||
mods.Add( new ResistanceMod( ResistanceType.Energy, NrgyResistOffset ) );
|
||||
|
||||
if ( !((Body)this.Body).IsHuman )
|
||||
{
|
||||
Mobiles.IMount mt = Caster.Mount;
|
||||
|
||||
if ( mt != null )
|
||||
mt.Rider = null;
|
||||
}
|
||||
|
||||
caster.BodyMod = this.Body;
|
||||
caster.HueMod = this.Hue;
|
||||
|
||||
for ( int i = 0; i < mods.Count; ++i )
|
||||
caster.AddResistanceMod( mods[i] );
|
||||
|
||||
PlayEffect( caster );
|
||||
|
||||
Timer timer = new TransformTimer( caster, this );
|
||||
timer.Start();
|
||||
|
||||
AddContext( caster, new TransformContext( timer, mods, ourType ) );
|
||||
}
|
||||
}
|
||||
TransformationSpellHelper.OnCast( Caster, this );
|
||||
|
||||
FinishSequence();
|
||||
}
|
||||
|
|
@ -146,109 +45,12 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
}
|
||||
|
||||
public virtual void PlayEffect( Mobile m )
|
||||
public virtual void DoEffect( Mobile m )
|
||||
{
|
||||
}
|
||||
|
||||
private static Hashtable m_Table = new Hashtable();
|
||||
|
||||
public static void AddContext( Mobile m, TransformContext context )
|
||||
public virtual void RemoveEffect( Mobile m )
|
||||
{
|
||||
m_Table[m] = context;
|
||||
|
||||
if ( context.Type == typeof( HorrificBeastSpell ) )
|
||||
m.Delta( MobileDelta.WeaponDamage );
|
||||
}
|
||||
|
||||
public static void RemoveContext( Mobile m, bool resetGraphics )
|
||||
{
|
||||
TransformContext context = GetContext( m );
|
||||
|
||||
if ( context != null )
|
||||
RemoveContext( m, context, resetGraphics );
|
||||
}
|
||||
|
||||
public static void RemoveContext( Mobile m, TransformContext context, bool resetGraphics )
|
||||
{
|
||||
m_Table.Remove( m );
|
||||
|
||||
List<ResistanceMod> mods = context.Mods;
|
||||
|
||||
for ( int i = 0; i < mods.Count; ++i )
|
||||
m.RemoveResistanceMod( mods[i] );
|
||||
|
||||
if ( resetGraphics )
|
||||
{
|
||||
m.HueMod = -1;
|
||||
m.BodyMod = 0;
|
||||
}
|
||||
|
||||
context.Timer.Stop();
|
||||
|
||||
if ( context.Type == typeof( HorrificBeastSpell ) )
|
||||
m.Delta( MobileDelta.WeaponDamage );
|
||||
}
|
||||
|
||||
public static TransformContext GetContext( Mobile m )
|
||||
{
|
||||
return ( m_Table[m] as TransformContext );
|
||||
}
|
||||
|
||||
public static bool UnderTransformation( Mobile m )
|
||||
{
|
||||
return ( GetContext( m ) != null );
|
||||
}
|
||||
|
||||
public static bool UnderTransformation( Mobile m, Type type )
|
||||
{
|
||||
TransformContext context = GetContext( m );
|
||||
|
||||
return ( context != null && context.Type == type );
|
||||
}
|
||||
}
|
||||
|
||||
public class TransformContext
|
||||
{
|
||||
private Timer m_Timer;
|
||||
private List<ResistanceMod> m_Mods;
|
||||
private Type m_Type;
|
||||
|
||||
public Timer Timer{ get{ return m_Timer; } }
|
||||
public List<ResistanceMod> Mods{ get{ return m_Mods; } }
|
||||
public Type Type{ get{ return m_Type; } }
|
||||
|
||||
public TransformContext( Timer timer, List<ResistanceMod> mods, Type type )
|
||||
{
|
||||
m_Timer = timer;
|
||||
m_Mods = mods;
|
||||
m_Type = type;
|
||||
}
|
||||
}
|
||||
|
||||
public class TransformTimer : Timer
|
||||
{
|
||||
private Mobile m_Mobile;
|
||||
private TransformationSpell m_Spell;
|
||||
|
||||
public TransformTimer( Mobile from, TransformationSpell spell ) : base( TimeSpan.FromSeconds( spell.TickRate ), TimeSpan.FromSeconds( spell.TickRate ) )
|
||||
{
|
||||
m_Mobile = from;
|
||||
m_Spell = spell;
|
||||
|
||||
Priority = TimerPriority.TwoFiftyMS;
|
||||
}
|
||||
|
||||
protected override void OnTick()
|
||||
{
|
||||
if ( m_Mobile.Deleted || !m_Mobile.Alive || m_Mobile.Body != m_Spell.Body || m_Mobile.Hue != m_Spell.Hue )
|
||||
{
|
||||
TransformationSpell.RemoveContext( m_Mobile, true );
|
||||
Stop();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Spell.OnTick( m_Mobile );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Vampiric Embrace", "Rel Xen An Sanct",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.BatWing,
|
||||
|
|
@ -18,6 +17,8 @@ namespace Server.Spells.Necromancy
|
|||
Reagent.PigIron
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 99.0; } }
|
||||
public override int RequiredMana{ get{ return 23; } }
|
||||
|
||||
|
|
@ -43,7 +44,7 @@ namespace Server.Spells.Necromancy
|
|||
}
|
||||
}
|
||||
|
||||
public override void PlayEffect( Mobile m )
|
||||
public override void DoEffect( Mobile m )
|
||||
{
|
||||
Effects.SendLocationParticles( EffectItem.Create( m.Location, m.Map, EffectItem.DefaultDuration ), 0x373A, 1, 17, 1108, 7, 9914, 0 );
|
||||
Effects.SendLocationParticles( EffectItem.Create( m.Location, m.Map, EffectItem.DefaultDuration ), 0x376A, 1, 22, 67, 7, 9502, 0 );
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Vengeful Spirit", "Kal Xen Bal Beh",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.BatWing,
|
||||
|
|
@ -19,6 +18,8 @@ namespace Server.Spells.Necromancy
|
|||
Reagent.PigIron
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 80.0; } }
|
||||
public override int RequiredMana{ get{ return 41; } }
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Wither", "Kal Vas An Flam",
|
||||
SpellCircle.Third, // 0.5 + 0.75 = 1.25s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.NoxCrystal,
|
||||
|
|
@ -18,6 +17,8 @@ namespace Server.Spells.Necromancy
|
|||
Reagent.PigIron
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.25 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 60.0; } }
|
||||
public override int RequiredMana{ get{ return 23; } }
|
||||
|
||||
|
|
|
|||
|
|
@ -10,13 +10,14 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
private static SpellInfo m_Info = new SpellInfo(
|
||||
"Wraith Form", "Rel Xen Um",
|
||||
SpellCircle.Sixth, // 0.5 + 1.5 = 2s base cast delay
|
||||
203,
|
||||
9031,
|
||||
Reagent.NoxCrystal,
|
||||
Reagent.PigIron
|
||||
);
|
||||
|
||||
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 2.0 ); } }
|
||||
|
||||
public override double RequiredSkill{ get{ return 20.0; } }
|
||||
public override int RequiredMana{ get{ return 17; } }
|
||||
|
||||
|
|
@ -33,7 +34,7 @@ namespace Server.Spells.Necromancy
|
|||
{
|
||||
}
|
||||
|
||||
public override void PlayEffect( Mobile m )
|
||||
public override void DoEffect( Mobile m )
|
||||
{
|
||||
m.PlaySound( 0x17F );
|
||||
m.FixedParticles( 0x374A, 1, 15, 9902, 1108, 4, EffectLayer.Waist );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue