using System;
using System.IO;
using System.Text;
using System.Collections;
using Server;
using Server.Items;
using Server.Mobiles;
using Server.Targets;
using Server.Targeting;
using Server.Network;
using Server.Gumps;
using Server.Factions;
using Server.Customs.OnSiteDueling.Gumps;
using Server.Customs.OnSiteDueling.Items;
namespace Server.Customs.OnSiteDueling
{
public class OnSiteCore
{
public const bool Enabled = true; //Enable/Disable the entire system
private static int m_MaxDist = 30; //Sets the max distance a player can run from another player without ending the duel.
private static bool m_WorldBroadcastWins = true; //If true will broadcast the winner of each duel.
private static bool m_KeepScore = true; //Turn the score keeping system on/off;
private static bool m_UseCommand = true; //Turn the command to duel on/off.
private static string m_ChallengeString = "i challenge thee to a duel"; //String used to start a duel.
private static string m_DuelCommand = "OnSiteDuel"; //The command players can call to duel someone.
private static string m_GetPointsString = "showpoints"; //String used to get your duelpoints.
private static Hashtable m_CurrentDuels; //This is the container for each duel in progress
private static Hashtable m_PointsTable; //Points tracker.
private static string m_SavePath = Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves\\scores.bin" );//Save path.
private static string m_Version = "2.0.2";
public static string Version { get { return m_Version; } }
public static Hashtable CurrentDuels { get { return m_CurrentDuels; } set { m_CurrentDuels = value; } }
public static Hashtable PointsTable { get { return m_PointsTable; } set { m_PointsTable = value; } }
public static void Initialize()
{
if( Enabled )
{
if( m_KeepScore )
m_PointsTable = new Hashtable();
if( m_UseCommand )
Commands.Register( m_DuelCommand, AccessLevel.Player, new CommandEventHandler( OnSiteDuel_Command ) );//Command event.
Commands.Register( "FixDuels", AccessLevel.Counselor, new CommandEventHandler( FixDuels_Command ) );//Command event.
m_CurrentDuels = new Hashtable();
Load();
EventSink.Speech += new SpeechEventHandler( EventSink_Speech );
EventSink.WorldSave += new WorldSaveEventHandler( EventSink_WorldSave );
EventSink.Movement += new MovementEventHandler( EventSink_Movement );//Checks distance between players.
EventSink.PlayerDeath += new PlayerDeathEventHandler( EventSink_PlayerDeath );//Checks each death to see if the player was in a duel.
}
}
[Usage( "FixDuels" )]
[Description( "Fixes Duels" )]
private static void FixDuels_Command( CommandEventArgs args )
{
m_CurrentDuels.Clear();
}
[Usage( "OnSiteDuel" )]
[Description( "Initiates a duel request with the targeted player." )]
private static void OnSiteDuel_Command( CommandEventArgs args )
{
Mobile m = ( Mobile )args.Mobile;
if( m == null )
return;
if( !CanDuel(m) )
return;
Duel duel = new Duel( m );
m_CurrentDuels.Add( m.Serial, duel );
m.CloseGump( typeof( DuelAcceptGump ) );
m.CloseGump( typeof( DuelOptionsGump ) );
m.SendGump( new DuelOptionsGump( duel ) );
}
public static bool CanDuel( Mobile m )
{
if (m.Criminal)
{
m.SendMessage("You may not start a duel while flagged criminal.");
return false;
}
else if( Spells.SpellHelper.CheckCombat( m ) )
{
m.SendMessage( "You cannot start a duel while in combat." );
return false;
}
else if( m.HasGump( typeof( DuelOptionsGump ) ) )
{
m.SendMessage( "You are already initiating a duel." );
return false;
}
else if( m.HasGump( typeof( DuelAcceptGump ) ) )
{
m.SendMessage( "You are already approving a duel." );
return false;
}
else if( IsInDuel( m ) )
{
m.SendMessage( "You are currently in a duel." );
return false;
}
else if( m.Target is SelectDueler )
{
m.SendMessage( "You are already starting a duel." );
return false;
}
else if( Factions.Sigil.ExistsOn( m ) )
{
m.SendMessage( "You may not challenge someone while you have a faction sigil." );
return false;
}
return true;
}
private static void EventSink_Speech( SpeechEventArgs e )
{
Mobile mobile = e.Mobile;
if( e.Speech.ToLower().IndexOf( m_GetPointsString ) >= 0 )
{
if( mobile != null )
{
if( PointsTable.ContainsKey( mobile.Serial ) )
{
DuelPoints dp = ( DuelPoints )PointsTable[mobile.Serial];
mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "{0} Wins/{1} Loses", dp.Wins, dp.Losses ) );
}
else
{
mobile.NonlocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "I have not duel yet" ) );
mobile.LocalOverheadMessage( Server.Network.MessageType.Regular, 38, true, String.Format( "You have not duel yet" ) );
}
}
}
if( e.Speech.ToLower().IndexOf( "bank" ) >= 0 )
{
if( IsInDuel( mobile ) )
{
e.Handled = true;
return;
}
}
if( e.Speech.ToLower().IndexOf( m_ChallengeString ) >= 0 )
{
Mobile m = mobile;
PlayerMobile pm = ( PlayerMobile )m;
if( m == null )
return;
if( !CanDuel( m ) )
return;
Duel duel = new Duel( m );
m_CurrentDuels.Add( m.Serial, duel );
m.CloseGump( typeof( DuelAcceptGump ) );
m.CloseGump( typeof( DuelOptionsGump ) );
m.SendGump( new DuelOptionsGump( duel ) );
}
}
private static void EventSink_WorldSave( WorldSaveEventArgs e )
{
if( m_KeepScore )
{
if( !Directory.Exists( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) ) )
Directory.CreateDirectory( Path.Combine( Core.BaseDirectory, "Data\\WoWDuelSaves" ) );
GenericWriter bin = new BinaryFileWriter( m_SavePath, true );
try
{
bin.Write( ( int )0 );//Versioning
ArrayList keyList = new ArrayList();
ArrayList valueList = new ArrayList();
IDictionaryEnumerator myEnum = m_PointsTable.GetEnumerator();
while( myEnum.MoveNext() )
{
keyList.Add( myEnum.Key );
valueList.Add( myEnum.Value );
}
int count = keyList.Count;
bin.Write( ( int )count );
for( int i = 0; i < count; i++ )
{
Serial key = ( Serial )keyList[i];
DuelPoints dp = ( DuelPoints )valueList[i];
bin.Write( ( int )key );
dp.Serialize( bin );
}
}
catch( Exception err )
{
Console.WriteLine( err.ToString() );
}
finally
{
bin.Close();
}
}
}
private static void Load()
{
if( m_KeepScore )
{
if( File.Exists( m_SavePath ) )
{
using( FileStream fs = new FileStream( m_SavePath, FileMode.Open, FileAccess.Read, FileShare.Read ) )
{
try
{
BinaryReader br = new BinaryReader( fs );
BinaryFileReader reader = new BinaryFileReader( br );
int version = reader.ReadInt();
switch( version )
{
case 0:
{
int count = reader.ReadInt();
for( int i = 0; i < count; i++ )
{
DuelPoints dp = new DuelPoints();
Serial s = reader.ReadInt();
dp.Deserialize( reader );
PointsTable.Add( s, dp );
}
break;
}
}
}
catch( Exception err )
{
Console.WriteLine( err.ToString() );
}
finally
{
fs.Close();
}
}
}
}
foreach( Mobile m in World.Mobiles.Values )
{
if( m != null )
{
if( m.Player )
{
Container b = m.Backpack;
if( b != null )
{
ArrayList toDelete = new ArrayList();
foreach( Item i in b.Items )
{
if( i != null && i is DuelFixBall )
{
m.Blessed = false;
toDelete.Add( i );
}
}
if( toDelete.Count > 0 )
{
foreach( Item i in toDelete )
i.Delete();
}
}
}
}
}
}
private static void EventSink_Movement( MovementEventArgs e )
{
Mobile m = e.Mobile;
if( m == null )
return;
if( m is PlayerMobile )
{
if( IsInDuel( m ) )
{
Duel duel = GetDuel( m );
if (duel.Started)
{
if ((duel.Defender.Location.X - duel.Attacker.Location.X) >= m_MaxDist ||
(duel.Defender.Location.X - duel.Attacker.Location.X) <= -m_MaxDist ||
(duel.Defender.Location.Y - duel.Attacker.Location.Y) >= m_MaxDist ||
(duel.Defender.Location.Y - duel.Attacker.Location.Y) <= -m_MaxDist)
{
duel.EndDuel(duel.Defender);
duel.Attacker.SendMessage("The duel was ended because one or more parties has fleed the battle");
duel.Defender.SendMessage("The duel was ended because one or more parties has fleed the battle");
m_CurrentDuels.Remove(duel);
}
if (duel.MagicOnly)
{
foreach (Layer layer in WeaponCheckLayers)
{
Item i = m.FindItemOnLayer(layer);
if (i != null)
{
Container bp = m.Backpack;
if (i is BaseWeapon)
{
BaseWeapon weapon = (BaseWeapon)i;
bp.AddItem(weapon);
m.SendMessage("This is a Magic Only duel. Please follow the rules!");
}
}
}
}
}
}
}
}
private static Layer[] WeaponCheckLayers = new Layer[]
{
Layer.OneHanded,
Layer.TwoHanded,
};
private static void EventSink_PlayerDeath( PlayerDeathEventArgs e )
{
Duel duel;
Mobile m = e.Mobile;
if( m == null )
return;
if( IsInDuel( m ) )
{
duel = GetDuel( m );
if( duel != null )
{
duel.EndDuel( m );
m_CurrentDuels.Remove( duel );
if( duel.Attacker != null && duel.Defender != null )
{
if( m_WorldBroadcastWins )
{
if( m == duel.Attacker )
World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Defender.Name, duel.Attacker.Name ) );
else
World.Broadcast( 0, false, String.Format( "{0} has defeated {1} in a duel.", duel.Attacker.Name, duel.Defender.Name ) );
}
if( m_KeepScore && duel.KeepScore )
{
if( m == duel.Attacker )
UpdatePoints( duel.Defender, duel.Attacker );
else
UpdatePoints( duel.Attacker, duel.Defender );
}
}
}
}
}
public static Duel GetDuel( Mobile m )
{
if( m_CurrentDuels.ContainsKey( m.Serial ) )
return ( Duel )m_CurrentDuels[m.Serial];
return null;
}
public static bool IsInDuel( Mobile m )
{
if( m_CurrentDuels.ContainsKey( m.Serial ) )
return true;
return false;
}
private static void UpdatePoints( Mobile winner, Mobile loser )
{
if( PointsTable.ContainsKey( winner.Serial ) )
{
DuelPoints dp = ( DuelPoints )PointsTable[winner.Serial];
dp.Wins++;
}
else
{
DuelPoints dp = new DuelPoints( winner, 1, 0 );
PointsTable.Add( winner.Serial, dp );
}
if( PointsTable.ContainsKey( loser.Serial ) )
{
DuelPoints dp = ( DuelPoints )PointsTable[loser.Serial];
dp.Losses++;
}
else
{
DuelPoints dp = new DuelPoints( loser, 0, 1 );
PointsTable.Add( loser.Serial, dp );
}
}
public static void DestroyDuel( Duel duel )
{
if( duel.Attacker != null )
m_CurrentDuels.Remove( duel.Attacker.Serial );
if( duel.Defender != null )
m_CurrentDuels.Remove( duel.Defender.Serial );
}
}
public class SelectDueler : Target
{
private int[] m_Switches;
private bool m_SevenFiveX;
private Duel m_Duel;
public SelectDueler( Duel duel, int[] switches, bool sevenFiveX ) : base( 100, false, TargetFlags.None )
{
m_Duel = duel;
m_Switches = switches;
m_SevenFiveX = sevenFiveX;
}
protected override void OnTargetOutOfLOS( Mobile from, object targeted )
{
from.SendMessage( "You cannot see that." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
protected override void OnTargetNotAccessible( Mobile from, object targeted )
{
from.SendMessage( "You cannot see that." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
protected override void OnTargetUntargetable( Mobile from, object targeted )
{
from.SendMessage( "You cannot see that." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
protected override void OnTargetDeleted( Mobile from, object targeted )
{
from.SendMessage( "You cannot see that." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
protected override void OnCantSeeTarget( Mobile from, object targeted )
{
from.SendMessage( "You cannot see that." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
protected override void OnTargetCancel( Mobile from, TargetCancelType cancelType )
{
base.OnTargetCancel( from, cancelType );
OnSiteCore.DestroyDuel( m_Duel );
from.SendMessage( "You have cancelled the duel request." );
}
protected override void OnTarget( Mobile from, object target )
{
if( target is PlayerMobile )
{
Mobile m = ( Mobile )target;
if( m.NetState == null )
{
from.SendMessage( "That player is not online." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
if( m == from )
{
from.SendMessage( "You slap yourself across the face and declare yourself the winner." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
if (m.Criminal)
{
m.SendMessage("You may not start a duel with someone who is flagged criminal.");
from.SendMessage("Select a new target.");
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
if( Spells.SpellHelper.CheckCombat( m ) )
{
from.SendMessage( "That person is currently in combat. You must wait to duel them." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
if( m.SkillsTotal > 500 && !m_SevenFiveX )
{
from.SendMessage( "That player has over 500 skillpoints and is not a valid candidate for a 5X duel." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
if( !OnSiteCore.IsInDuel( m ) )
{
if( !m.HasGump( typeof( DuelAcceptGump ) ) )
{
Rectangle2D r = new Rectangle2D( from.Location.X, from.Location.Y, ( m.Location.X - from.Location.X ), ( m.Location.Y - from.Location.Y ) );
int xMid = r.X + ( r.Width / 2 );
int yMid = r.Y + ( r.Height / 2 );
Point2D mid = new Point2D( xMid, yMid );
Point3D location;
Item poll = new Item( 0x9 );
location = new Point3D( xMid - 1, yMid, from.Location.Z + 70 );
poll.Movable = false;
poll.Name = "a duel request post";
poll.MoveToWorld( location, from.Map );
Item holder = new Item( 0xB99 );
location = new Point3D( xMid, yMid, from.Location.Z + 70 );
holder.Movable = false;
holder.Name = "a duel request post";
holder.MoveToWorld( location, from.Map );
Item sign = new Item( 0xBBF );
sign.Movable = false;
sign.Name = "a duel request post";
sign.MoveToWorld( location, from.Map );
Item[] items = new Item[] { poll, holder, sign };
foreach( Mobile mob in from.GetMobilesInRange( 10 ) )
{
if( mob != null )
mob.SendMessage( String.Format( "{0} has challenged {1} to a duel.", from.Name, m.Name ) );
}
new DropDuelFlag( items ).Start();
m_Duel.Items = items;
m_Duel.Switches = m_Switches;
m.CloseGump( typeof( DuelAcceptGump ) );
m.SendGump( new DuelAcceptGump( m_Duel, m_Switches, from, m, items ) );
}
else
{
m.SendMessage( "That player has already been offered a duel." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
}
else
{
from.SendMessage( "That player is already in a duel." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
}
else
{
from.SendMessage( "You may only duel players." );
from.SendMessage( "Select a new target." );
from.Target = new SelectDueler( m_Duel, m_Switches, m_SevenFiveX );
return;
}
}
public class DropDuelFlag : Timer
{
Item[] m_Items;
int count = 0;
public DropDuelFlag( Item[] items ) : base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
{
m_Items = items;
}
protected override void OnTick()
{
if( count <= 13 )
{
count++;
foreach( Item i in m_Items )
{
if( !i.Deleted && i != null )
{
Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z - 5 ) );
i.MoveToWorld( location );
}
}
}
else
Stop();
}
}
}
}
public class Duel
{
private Mobile m_Attacker;
private Mobile m_Defender;
private Item[] m_Items;
private int[] m_Switches;
private bool m_Started = false;
public bool Started { get { return m_Started; } set { m_Started = value; } }
public int[] Switches { get { return m_Switches; } set { m_Switches = value; } }
public Item[] Items { get { return m_Items; } set { m_Items = value; } }
public Mobile Attacker { get { return m_Attacker; } set { m_Attacker = value; } }
public Mobile Defender { get { return m_Defender; } set { m_Defender = value; } }
private bool m_MagicWeapons;
private bool m_MagicArmor;
private bool m_Potions;
private bool m_Bandaids;
private bool m_Mounts;
private bool m_Pets;
private bool m_MagicOnly;
private bool m_KeepScore;
private bool m_SevenFiveX;
private ArrayList m_AttackerFollowers;
private ArrayList m_DefenderFollowers;
public bool MagicWeapons { get { return m_MagicWeapons; } set { m_MagicWeapons = value; } }
public bool MagicArmor { get { return m_MagicArmor; } set { m_MagicArmor = value; } }
public bool Potions { get { return m_Potions; } set { m_Potions = value; } }
public bool Bandaids { get { return m_Bandaids; } set { m_Bandaids = value; } }
public bool Mounts { get { return m_Mounts; } set { m_Mounts = value; } }
public bool Pets { get { return m_Pets; } set { m_Pets = value; } }
public bool MagicOnly { get { return m_MagicOnly; } set { m_MagicOnly = value; } }
public bool KeepScore { get { return m_KeepScore; } set { m_KeepScore = value; } }
public bool SevenFiveX { get { return m_SevenFiveX; } set { m_SevenFiveX = value; } }
public Duel( Mobile attacker )
{
m_Attacker = attacker;
m_AttackerFollowers = new ArrayList();
m_DefenderFollowers = new ArrayList();
}
public void StartDuel()
{
SetupDuel();
SetupDuelers();
Started = true;
new DuelStartTimer( this, new Mobile[] { m_Attacker, m_Defender }, m_Items ).Start();
}
private void SetupDuel()
{
MagicWeapons = false;
MagicArmor = false;
Potions = false;
Bandaids = false;
Mounts = false;
Pets = false;
MagicOnly = false;
KeepScore = false;
SevenFiveX = false;
for( int i = 0; i < m_Switches.Length; i++ )
{
switch( m_Switches[i] )
{
case 2: { SevenFiveX = true; break; }
case 3: { KeepScore = true; break; }
case 4: { MagicOnly = true; break; }
case 5: { Pets = true; break; }
case 6: { Mounts = true; break; }
case 7: { Bandaids = true; break; }
case 8: { Potions = true; break; }
case 9: { MagicArmor = true; break; }
case 10: { MagicWeapons = true; break; }
}
}
}
private void SetupDuelers()
{
Mobile[] mobiles = new Mobile[] { m_Attacker, m_Defender };
foreach( Mobile m in mobiles )
{
if( !m.Alive )
m.Resurrect();
Container bp = m.Backpack;
Container bag = new Bag();
bag.Hue = 38;
BankBox bank = m.BankBox;
Item oncurs = m.Holding;
if( oncurs != null )
bp.DropItem( oncurs );
m.CurePoison( m );
m.Hits = m.HitsMax;
m.Mana = m.ManaMax;
m.Stam = m.StamMax;
m.StatMods.Clear();
ArrayList items = new ArrayList();
foreach( Layer layer in EquipmentLayers )
{
Item item = m.FindItemOnLayer( layer );
if( item != null )
{
if( item is BaseWeapon && !MagicWeapons )
{
BaseWeapon weapon = ( BaseWeapon )item;
if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
items.Add( weapon );
else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
items.Add( weapon );
else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
items.Add( weapon );
}
else if( item is BaseArmor && !MagicArmor )
{
BaseArmor armor = ( BaseArmor )item;
if( armor.Durability != ArmorDurabilityLevel.Regular )
items.Add( armor );
else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
items.Add( armor );
}
}
}
foreach( Item item in m.Backpack.Items )
{
if( item != null )
{
if( item is BaseWeapon && !MagicWeapons)
{
BaseWeapon weapon = ( BaseWeapon )item;
if( weapon.AccuracyLevel != WeaponAccuracyLevel.Regular )
items.Add( weapon );
else if( weapon.DamageLevel != WeaponDamageLevel.Regular )
items.Add( weapon );
else if( weapon.DurabilityLevel != WeaponDurabilityLevel.Regular )
items.Add( weapon );
}
else if( item is BaseArmor && !MagicArmor )
{
BaseArmor armor = ( BaseArmor )item;
if( armor.Durability != ArmorDurabilityLevel.Regular )
items.Add( armor );
else if( armor.ProtectionLevel != ArmorProtectionLevel.Regular )
items.Add( armor );
}
else if( item is BasePotion && !Potions )
items.Add( item );
else if( item is EtherealMount && !Mounts )
items.Add( item );
else if( item is Bandage && !Bandaids )
items.Add( item );
}
}
if( !Mounts )
{
if( m.Mount != null )
{
IMount mount = m.Mount;
mount.Rider = null;
if( mount is BaseMount )
{
if( mount is BaseCreature )
{
BaseCreature bc = ( BaseCreature )mount;
bc.ControlTarget = null;
bc.ControlOrder = OrderType.Stay;
bc.Internalize();
bc.SetControlMaster( null );
bc.SummonMaster = null;
bc.IsStabled = true;
m.Stabled.Add( bc );
if (m == m_Attacker)
m_AttackerFollowers.Add(bc);
else
m_DefenderFollowers.Add(bc);
}
}
}
}
ArrayList pets = new ArrayList();
if( !Pets )
{
foreach( Mobile mob in World.Mobiles.Values )
{
if( mob is BaseCreature )
{
BaseCreature bc = ( BaseCreature )mob;
if( ( bc.Controled && bc.ControlMaster == m ) || ( bc.Summoned && bc.SummonMaster == m ) )
pets.Add( bc );
}
}
foreach( BaseCreature c in pets )
{
if( c != null )
{
c.ControlTarget = null;
c.ControlOrder = OrderType.Stay;
c.Internalize();
c.SetControlMaster( null );
c.SummonMaster = null;
c.IsStabled = true;
m.Stabled.Add( c );
if (m == m_Attacker)
m_AttackerFollowers.Add(c);
else
m_DefenderFollowers.Add(c);
}
}
}
foreach( Item item in items )
{
bag.AddItem( item );
}
if( bag.Items.Count > 0 )
bank.DropItem( bag );
else
bag.Delete();
}
}
private Layer[] EquipmentLayers = new Layer[]
{
Layer.Cloak,
Layer.Bracelet,
Layer.Ring,
Layer.Shirt,
Layer.Pants,
Layer.InnerLegs,
Layer.Shoes,
Layer.Arms,
Layer.InnerTorso,
Layer.MiddleTorso,
Layer.OuterLegs,
Layer.Neck,
Layer.Waist,
Layer.Gloves,
Layer.OuterTorso,
Layer.OneHanded,
Layer.TwoHanded,
Layer.FacialHair,
Layer.Hair,
Layer.Helm
};
public void EndDuel( Mobile loser )
{
Started = false;
if( !loser.Alive )
{
loser.Resurrect();
HandleCorpse( loser );
}
foreach (BaseCreature bc in m_DefenderFollowers)
{
bc.ControlTarget = m_Defender;
bc.ControlOrder = OrderType.Stay;
bc.SetControlMaster(m_Defender);
bc.SummonMaster = m_Defender;
bc.IsStabled = false;
bc.MoveToWorld(m_Defender.Location, m_Defender.Map);
m_Defender.Stabled.Remove(bc);
}
foreach (BaseCreature bc in m_AttackerFollowers)
{
bc.ControlTarget = m_Attacker;
bc.ControlOrder = OrderType.Stay;
bc.SetControlMaster(m_Attacker);
bc.SummonMaster = m_Attacker;
bc.IsStabled = false;
bc.MoveToWorld(m_Attacker.Location, m_Attacker.Map);
m_Attacker.Stabled.Remove(bc);
}
Mobile[] mobs = new Mobile[] { Attacker, Defender };
foreach( Mobile m in mobs )
{
m.Aggressed.Clear();
m.Aggressors.Clear();
m.Hits = m.HitsMax;
m.Stam = m.StamMax;
m.Mana = m.ManaMax;
m.DamageEntries.Clear();
m.Combatant = null;
m.Blessed = true;
m.SendMessage( String.Format( "You have been made invulnerable for 10 seconds." ) );
}
new InvulTimer( mobs ).Start();
new RaiseDuelFlag( this, m_Items ).Start();
}
public void HandleCorpse( Mobile from )
{
if( from.Corpse != null )
{
Corpse c = (Corpse)from.Corpse;
Container b = from.Backpack;
foreach( Item i in new ArrayList( c.Items ) )
{
if( i.Map != Map.Internal )
b.AddItem( i );
}
c.Delete();
from.SendMessage( 1161, "The contents of your corpse have been safely placed into your backpack" );
}
}
public class DuelStartTimer : Timer
{
Item[] m_Items;
Mobile[] m_Mobiles;
Duel m_Duel;
int count = 5;
public DuelStartTimer( Duel duel, Mobile[] mobiles, Item[] items )
: base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_Duel = duel;
m_Items = items;
m_Mobiles = mobiles;
}
protected override void OnTick()
{
if( count <= 0 )
{
foreach( Mobile m in m_Mobiles )
if( m != null )
m.SendMessage( "Fight!" );
m_Duel.Started = true;
Stop();
}
foreach( Mobile m in m_Mobiles )
if( m != null )
m.SendMessage( String.Format( "{0}", count ) );
count--;
}
}
public class InvulTimer : Timer
{
Mobile[] m_Mobiles;
DuelFixBall[] m_FixBall;
int count = 0;
public InvulTimer( Mobile[] mobiles )
: base( TimeSpan.FromSeconds( 0 ), TimeSpan.FromSeconds( 1.0 ) )
{
m_Mobiles = mobiles;
m_FixBall = new DuelFixBall[2];
int i = 0;
foreach( Mobile m in mobiles )
{
Container b = m.Backpack;
DuelFixBall d = new DuelFixBall();
b.AddItem( d );
m_FixBall[i] = d;
i++;
}
}
protected override void OnTick()
{
if( count >= 10 )
{
int i = 0;
foreach( Mobile m in m_Mobiles )
{
if( m != null )
{
m.SendMessage( String.Format( "You are no longer invulnerable." ) );
m_FixBall[i].Delete();
m.Blessed = false;
}
i++;
}
Stop();
}
count++;
}
}
public class RaiseDuelFlag : Timer
{
Item[] m_Items;
Duel m_Duel;
int count = 0;
public RaiseDuelFlag( Duel duel, Item[] items )
: base( TimeSpan.FromSeconds( .1 ), TimeSpan.FromSeconds( .1 ) )
{
m_Items = items;
m_Duel = duel;
}
protected override void OnTick()
{
if( count <= 13 )
{
count++;
foreach( Item i in m_Items )
{
if( !i.Deleted && i != null )
{
Point3D location = new Point3D( i.Location.X, i.Location.Y, ( i.Location.Z + 5 ) );
i.MoveToWorld( location );
}
}
}
else
{
foreach( Item i in m_Items )
if( i != null && !i.Deleted )
i.Delete();
Server.Customs.OnSiteDueling.OnSiteCore.DestroyDuel( m_Duel );
Stop();
}
}
}
}
public class DuelPoints
{
private Mobile m_Mobile;
private int m_Wins;
private int m_Losses;
public Mobile Mob { get { return m_Mobile; } }
public int Wins { get { return m_Wins; } set { m_Wins = value; } }
public int Losses { get { return m_Losses; } set { m_Losses = value; } }
public DuelPoints( Mobile m, int wins, int losses )
{
m_Mobile = m;
m_Wins = wins;
m_Losses = losses;
}
public DuelPoints()
{
}
public void Serialize( GenericWriter writer )
{
writer.Write( ( int )0 );//Version
writer.Write( ( Mobile )m_Mobile );
writer.Write( ( int )m_Wins );
writer.Write( ( int )m_Losses );
}
public void Deserialize( GenericReader reader )
{
int version = reader.ReadInt();
switch( version )
{
case 0:
{
m_Mobile = reader.ReadMobile();
m_Wins = reader.ReadInt();
m_Losses = reader.ReadInt();
break;
}
}
}
}