- extensive framework for dueling, tournaments, and events

- IP address command implementor
- miscellaneous minor fixes
This commit is contained in:
mark 2012-04-22 05:37:16 +00:00
parent c52504151b
commit 599b2af6d5
82 changed files with 11920 additions and 63 deletions

View file

@ -157,6 +157,30 @@ namespace Server.Spells
return false;
}
#region Dueling
string option = null;
if ( this is Backstab )
option = "Backstab";
else if ( this is DeathStrike )
option = "Death Strike";
else if ( this is FocusAttack )
option = "Focus Attack";
else if ( this is KiAttack )
option = "Ki Attack";
else if ( this is SurpriseAttack )
option = "Surprise Attack";
else if ( this is HonorableExecution )
option = "Honorable Execution";
else if ( this is LightningStrike )
option = "Lightning Strike";
else if ( this is MomentumStrike )
option = "Momentum Strike";
if ( option != null && !Engines.ConPVP.DuelContext.AllowSpecialMove( from, option, this ) )
return false;
#endregion
return CheckSkills( from ) && CheckMana( from, false );
}

View file

@ -237,6 +237,9 @@ namespace Server.Spells
if ( AosAttributes.GetValue( m_Caster, AosAttribute.LowerRegCost ) > Utility.Random( 100 ) )
return true;
if ( Engines.ConPVP.DuelContext.IsFreeConsume( m_Caster ) )
return true;
Container pack = m_Caster.Backpack;
if ( pack == null )
@ -508,6 +511,11 @@ namespace Server.Spells
{
m_Caster.SendLocalizedMessage( 1072060 ); // You cannot cast a spell while calmed.
}
#region Dueling
else if ( m_Caster is PlayerMobile && ((PlayerMobile)m_Caster).DuelContext != null && !((PlayerMobile)m_Caster).DuelContext.AllowSpellCast( m_Caster, this ) )
{
}
#endregion
else if ( m_Caster.Mana >= ScaleMana( GetMana() ) )
{
if ( m_Caster.Spell == null && m_Caster.CheckSpellCast( this ) && CheckCast() && m_Caster.Region.OnBeginSpellCast( m_Caster, this ) )

View file

@ -363,6 +363,33 @@ namespace Server.Spells
if( to.Hidden && to.AccessLevel > from.AccessLevel )
return false;
#region Dueling
PlayerMobile pmFrom = from as PlayerMobile;
PlayerMobile pmTarg = to as PlayerMobile;
if ( pmFrom == null && from is BaseCreature )
{
BaseCreature bcFrom = (BaseCreature) from;
if ( bcFrom.Summoned )
pmFrom = bcFrom.SummonMaster as PlayerMobile;
}
if ( pmTarg == null && to is BaseCreature )
{
BaseCreature bcTarg = (BaseCreature) to;
if ( bcTarg.Summoned )
pmTarg = bcTarg.SummonMaster as PlayerMobile;
}
if ( pmFrom != null && pmTarg != null )
{
if ( pmFrom.DuelContext != null && pmFrom.DuelContext == pmTarg.DuelContext && pmFrom.DuelContext.Started && pmFrom.DuelPlayer != null && pmTarg.DuelPlayer != null )
return ( pmFrom.DuelPlayer.Participant != pmTarg.DuelPlayer.Participant );
}
#endregion
Guild fromGuild = GetGuildFor( from );
Guild toGuild = GetGuildFor( to );
@ -550,6 +577,7 @@ namespace Server.Spells
new TravelValidator( IsCrystalCave ),
new TravelValidator( IsDoomGauntlet ),
new TravelValidator( IsDoomFerry ),
new TravelValidator( IsSafeZone ),
new TravelValidator( IsFactionStronghold ),
new TravelValidator( IsChampionSpawn ),
new TravelValidator( IsTokunoDungeon ),
@ -561,14 +589,14 @@ namespace Server.Spells
private static bool[,] m_Rules = new bool[,]
{
/*T2A(Fel) Ilshenar Wind(Tram), Wind(Fel), Dungeons(Fel), Solen(Tram), Solen(Fel), CrystalCave(Malas), Gauntlet(Malas), Gauntlet(Ferry), Stronghold, ChampionSpawn, Dungeons(Tokuno[Malas]), LampRoom(Doom), GuardianRoom(Doom), Heartwood, MLDungeons */
/* Recall From */ { false, true, true, false, false, true, false, false, false, false, true, false, true, false, false, false, false },
/* Recall To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate From */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Mark In */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Tele From */ { true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, false, true },
/* Tele To */ { true, true, true, true, true, true, true, false, true, false, false, true, true, true, true, false, false },
/*T2A(Fel) Ilshenar Wind(Tram), Wind(Fel), Dungeons(Fel), Solen(Tram), Solen(Fel), CrystalCave(Malas), Gauntlet(Malas), Gauntlet(Ferry), SafeZone, Stronghold, ChampionSpawn, Dungeons(Tokuno[Malas]), LampRoom(Doom), GuardianRoom(Doom), Heartwood, MLDungeons */
/* Recall From */ { false, true, true, false, false, true, false, false, false, false, true, true, false, true, false, false, false, false },
/* Recall To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate From */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Gate To */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Mark In */ { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false },
/* Tele From */ { true, true, true, true, true, true, true, false, true, true, true, false, true, true, true, true, false, true },
/* Tele To */ { true, true, true, true, true, true, true, false, true, false, false, false, true, true, true, true, false, false },
};
public static void SendInvalidMessage( Mobile caster, TravelCheckType type )
@ -706,6 +734,26 @@ namespace Server.Spells
|| ( x >= 1188 && y >= 509 && x < 1201 && y < 513 );
}
public static bool IsSafeZone( Map map, Point3D loc )
{
#region Duels
if ( Region.Find( loc, map ).IsPartOf( typeof( Engines.ConPVP.SafeZone ) ) )
{
if ( m_TravelType == TravelCheckType.TeleportTo || m_TravelType == TravelCheckType.TeleportFrom )
{
PlayerMobile pm = m_TravelCaster as PlayerMobile;
if ( pm != null && pm.DuelPlayer != null && !pm.DuelPlayer.Eliminated )
return true;
}
return true;
}
#endregion
return false;
}
public static bool IsFactionStronghold( Map map, Point3D loc )
{
/*// Teleporting is allowed, but only for faction members
@ -821,7 +869,19 @@ namespace Server.Spells
if( map == null )
return false;
GuardedRegion reg = (GuardedRegion)Region.Find( loc, map ).GetRegion( typeof( GuardedRegion ) );
#region Dueling
Engines.ConPVP.SafeZone sz = (Engines.ConPVP.SafeZone) Region.Find( loc, map ).GetRegion( typeof( Engines.ConPVP.SafeZone ) );
if ( sz != null )
{
PlayerMobile pm = (PlayerMobile) caster;
if ( pm == null || pm.DuelContext == null || !pm.DuelContext.Started || pm.DuelPlayer == null || pm.DuelPlayer.Eliminated )
return true;
}
#endregion
GuardedRegion reg = (GuardedRegion) Region.Find( loc, map ).GetRegion( typeof( GuardedRegion ) );
return (reg != null && !reg.IsDisabled());
}

View file

@ -25,6 +25,17 @@ namespace Server.Spells.Chivalry
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -26,6 +26,17 @@ namespace Server.Spells.Chivalry
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -27,6 +27,17 @@ namespace Server.Spells.Chivalry
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -22,6 +22,17 @@ namespace Server.Spells.Eighth
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -23,6 +23,17 @@ namespace Server.Spells.First
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -24,6 +24,17 @@ namespace Server.Spells.Fourth
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -156,8 +156,13 @@ namespace Server.Spells.Necromancy
double spirit = m_From.Skills[SkillName.SpiritSpeak].Value;
BaseCreature check = (BaseCreature)SummonFamiliarSpell.Table[m_From];
if ( check != null && !check.Deleted )
#region Dueling
if ( m_From is PlayerMobile && ( (PlayerMobile)m_From ).DuelContext != null && !( (PlayerMobile)m_From ).DuelContext.AllowSpellCast( m_From, m_Spell ) )
{
}
#endregion
else if ( check != null && !check.Deleted )
{
m_From.SendLocalizedMessage( 1061605 ); // You already have a familiar.
}

View file

@ -474,11 +474,16 @@ namespace Server.Spells.Ninjitsu
}
else if (BaseFormTalisman.EntryEnabled(sender.Mobile, entry.Type))
{
if (AnimalForm.Morph(m_Caster, entryID) == MorphResult.Fail)
#region Dueling
if ( m_Caster is PlayerMobile && ((PlayerMobile)m_Caster).DuelContext != null && !((PlayerMobile)m_Caster).DuelContext.AllowSpellCast( m_Caster, m_Spell ) )
{
m_Caster.LocalOverheadMessage(MessageType.Regular, 0x3B2, 502632); // The spell fizzles.
m_Caster.FixedParticles(0x3735, 1, 30, 9503, EffectLayer.Waist);
m_Caster.PlaySound(0x5C);
}
#endregion
else if (AnimalForm.Morph(m_Caster, entryID) == MorphResult.Fail)
{
m_Caster.LocalOverheadMessage( MessageType.Regular, 0x3B2, 502632 ); // The spell fizzles.
m_Caster.FixedParticles( 0x3735, 1, 30, 9503, EffectLayer.Waist );
m_Caster.PlaySound( 0x5C );
}
else
{

View file

@ -20,6 +20,17 @@ namespace Server.Spells.Second
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -20,6 +20,17 @@ namespace Server.Spells.Second
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -20,6 +20,17 @@ namespace Server.Spells.Second
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -20,6 +20,17 @@ namespace Server.Spells.Second
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -22,6 +22,17 @@ namespace Server.Spells.Sixth
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -20,6 +20,17 @@ namespace Server.Spells.Third
{
}
public override bool CheckCast()
{
if ( Engines.ConPVP.DuelContext.CheckSuddenDeath( Caster ) )
{
Caster.SendMessage( 0x22, "You cannot cast this spell when in sudden death." );
return false;
}
return base.CheckCast();
}
public override void OnCast()
{
Caster.Target = new InternalTarget( this );

View file

@ -71,7 +71,28 @@ namespace Server.Spells.Third
}
else
{
double total = Caster.Skills[SkillName.Magery].Value + Caster.Skills[SkillName.Poisoning].Value;
//double total = Caster.Skills[SkillName.Magery].Value + Caster.Skills[SkillName.Poisoning].Value;
#region Dueling
double total = Caster.Skills[SkillName.Magery].Value;
if ( Caster is Mobiles.PlayerMobile )
{
Mobiles.PlayerMobile pm = (Mobiles.PlayerMobile)Caster;
if ( pm.DuelContext != null && pm.DuelContext.Started && !pm.DuelContext.Finished && !pm.DuelContext.Ruleset.GetOption( "Skills", "Poisoning" ) )
{
}
else
{
total += Caster.Skills[SkillName.Poisoning].Value;
}
}
else
{
total += Caster.Skills[SkillName.Poisoning].Value;
}
#endregion
double dist = Caster.GetDistanceToSqrt( m );