Overwrite

Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
Unstable Kitsune
2023-11-28 23:20:26 -05:00
parent 3cd54811de
commit b918192e4e
11608 changed files with 2644205 additions and 47 deletions

View File

@@ -0,0 +1,30 @@
using System;
namespace Server.EventSystem
{
public enum TownMonsterType
{
Abyss,
Arachnid,
DragonKind,
Elementals,
Humanoid,
OrcsandRatmen,
OreElementals,
Ophidian,
Snakes,
Undead
}
public enum TownChampionType
{
Barracoon,
Harrower,
LordOaks,
Mephitis,
Neira,
Rikktor,
Semidar,
Serado
}
}

View File

@@ -0,0 +1,181 @@
using System;
using Server.Network;
using Server.Items;
namespace Server.Mobiles
{
[CorpseName("Corpse of the neighborhood watch")]
public class InvasionAnnouncer : Lich
{
private static bool m_Talked;
private static string m_BroadcastMessage = "Everything is looking fine at the moment. Travel safe.";
private static bool m_GaveNews;
[Constructable]
public InvasionAnnouncer() : base()
{
Title = "the Neighborhood Watch";
Blessed = true;
CantWalk = true;
SpeechHue = Utility.RandomDyedHue();
Hue = Utility.RandomSkinHue();
if ( Female = Utility.RandomBool() )
{
Body = 0x191;
Name = NameList.RandomName( "female" );
switch( Utility.Random( 2 ) )
{
case 0: AddItem( new LeatherSkirt() ); break;
case 1: AddItem( new LeatherShorts() ); break;
}
switch( Utility.Random( 5 ) )
{
case 0: AddItem( new FemaleLeatherChest() ); break;
case 1: AddItem( new FemaleStuddedChest() ); break;
case 2: AddItem( new LeatherBustierArms() ); break;
case 3: AddItem( new StuddedBustierArms() ); break;
case 4: AddItem( new FemalePlateChest() ); break;
}
}
else
{
Body = 0x190;
Name = NameList.RandomName( "male" );
AddItem( new PlateChest() );
AddItem( new PlateArms() );
AddItem( new PlateLegs() );
switch( Utility.Random( 3 ) )
{
case 0: AddItem( new Doublet( Utility.RandomNondyedHue() ) ); break;
case 1: AddItem( new Tunic( Utility.RandomNondyedHue() ) ); break;
case 2: AddItem( new BodySash( Utility.RandomNondyedHue() ) ); break;
}
}
Utility.AssignRandomHair( this );
if( Utility.RandomBool() )
Utility.AssignRandomFacialHair( this, HairHue );
Halberd Weapon = new Halberd();
Weapon.Movable = false;
Weapon.Crafter = this;
//Weapon.Quality = Weapon.Exceptional;
AddItem( Weapon );
Container pack = new Backpack();
pack.Movable = false;
pack.DropItem( new Gold( 10, 25 ) );
AddItem( pack );
Skills[SkillName.Anatomy].Base = 120.0;
Skills[SkillName.Tactics].Base = 120.0;
Skills[SkillName.Swords].Base = 120.0;
Skills[SkillName.MagicResist].Base = 120.0;
Skills[SkillName.DetectHidden].Base = 100.0;
}
public InvasionAnnouncer( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( (string) m_BroadcastMessage);
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_BroadcastMessage = reader.ReadString();
}
public override void OnMovement( Mobile m, Point3D oldLocation )
{
if( m_Talked == false )
{
if ( m.InRange( this, 3 ) && m is PlayerMobile)
{
m_Talked = true;
this.Say( m_BroadcastMessage );
this.Move( GetDirectionTo( m.Location ) );
SpamTimer t = new SpamTimer();
t.Start();
}
}
}
public override void OnSpeech( SpeechEventArgs e )
{
base.OnSpeech( e );
if ( !e.Handled && InRange( e.Mobile, 3 ) )
{
if ( e.HasKeyword( 0x30 ) && m_GaveNews == false )
{
m_GaveNews = true;
this.Say( m_BroadcastMessage );
this.Move( GetDirectionTo( e.Mobile.Location ) );
NewsTimer t = new NewsTimer();
t.Start();
}
}
}
private class SpamTimer : Timer
{
public SpamTimer() : base( TimeSpan.FromMinutes( 1 ) )
{
Priority = TimerPriority.OneSecond;
}
protected override void OnTick()
{
m_Talked = false;
}
}
private class NewsTimer : Timer
{
public NewsTimer() : base( TimeSpan.FromSeconds( 30 ) )
{
Priority = TimerPriority.OneSecond;
}
protected override void OnTick()
{
m_GaveNews = false;
}
}
public static void SetAnnouncement( string str )
{
m_BroadcastMessage = str;
}
public static void DeleteAnnouncements()
{
m_BroadcastMessage = "Everything is looking fine at the moment. Travel safe.";
}
}
}

View File

@@ -0,0 +1,157 @@
using System;
using Server.Mobiles;
namespace Server.EventSystem
{
public class MonsterTownSpawnEntry
{
#region MonsterSpawnEntries
public static MonsterTownSpawnEntry[] Undead = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Zombie ), 65 ),
new MonsterTownSpawnEntry( typeof( Skeleton ), 65 ),
new MonsterTownSpawnEntry( typeof( SkeletalMage ), 40 ),
new MonsterTownSpawnEntry( typeof( BoneKnight ), 45 ),
new MonsterTownSpawnEntry( typeof( SkeletalKnight ), 45 ),
new MonsterTownSpawnEntry( typeof( Lich ), 45 ),
new MonsterTownSpawnEntry( typeof( Ghoul ), 40 ),
new MonsterTownSpawnEntry( typeof( BoneMagi ), 40 ),
new MonsterTownSpawnEntry( typeof( Wraith ), 35 ),
new MonsterTownSpawnEntry( typeof( RottingCorpse ), 35 ),
new MonsterTownSpawnEntry( typeof( LichLord ), 35 ),
new MonsterTownSpawnEntry( typeof( Spectre ), 30 ),
new MonsterTownSpawnEntry( typeof( Shade ), 30 ),
new MonsterTownSpawnEntry( typeof( AncientLich ), 30 )
};
public static MonsterTownSpawnEntry[] Humanoid = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Brigand ), 60 ),
new MonsterTownSpawnEntry( typeof( Executioner ), 30 ),
new MonsterTownSpawnEntry( typeof( EvilMage ), 70 ),
new MonsterTownSpawnEntry( typeof( EvilMageLord ), 40 ),
new MonsterTownSpawnEntry( typeof( Ettin ), 45 ),
new MonsterTownSpawnEntry( typeof( Ogre ), 45 ),
new MonsterTownSpawnEntry( typeof( OgreLord ), 40 ),
new MonsterTownSpawnEntry( typeof( ArcticOgreLord ), 40 ),
new MonsterTownSpawnEntry( typeof( Troll ), 55 ),
new MonsterTownSpawnEntry( typeof( Cyclops ), 55 ),
new MonsterTownSpawnEntry( typeof( Titan ), 40 )
};
public static MonsterTownSpawnEntry[] OrcsandRatmen = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Orc ), 80 ),
new MonsterTownSpawnEntry( typeof( OrcishMage ), 45 ),
new MonsterTownSpawnEntry( typeof( OrcishLord ), 55 ),
new MonsterTownSpawnEntry( typeof( OrcCaptain ), 50 ),
new MonsterTownSpawnEntry( typeof( OrcBomber ), 55 ),
new MonsterTownSpawnEntry( typeof( OrcBrute ), 40 ),
new MonsterTownSpawnEntry( typeof( Ratman ), 80 ),
new MonsterTownSpawnEntry( typeof( RatmanArcher ), 50 ),
new MonsterTownSpawnEntry( typeof( RatmanMage ), 45 )
};
public static MonsterTownSpawnEntry[] Elementals = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( EarthElemental ), 95 ),
new MonsterTownSpawnEntry( typeof( AirElemental ), 70 ),
new MonsterTownSpawnEntry( typeof( FireElemental ), 60 ),
new MonsterTownSpawnEntry( typeof( WaterElemental ), 60 ),
new MonsterTownSpawnEntry( typeof( SnowElemental ), 40 ),
new MonsterTownSpawnEntry( typeof( IceElemental ), 40 ),
new MonsterTownSpawnEntry( typeof( Efreet ), 45 ),
new MonsterTownSpawnEntry( typeof( PoisonElemental ), 35 ),
new MonsterTownSpawnEntry( typeof( BloodElemental ), 35 )
};
public static MonsterTownSpawnEntry[] OreElementals = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( DullCopperElemental ), 90 ),
new MonsterTownSpawnEntry( typeof( CopperElemental ), 80 ),
new MonsterTownSpawnEntry( typeof( BronzeElemental ), 50 ),
new MonsterTownSpawnEntry( typeof( ShadowIronElemental ), 60 ),
new MonsterTownSpawnEntry( typeof( GoldenElemental ), 55 ),
new MonsterTownSpawnEntry( typeof( AgapiteElemental ), 45 ),
new MonsterTownSpawnEntry( typeof( VeriteElemental ), 40 ),
new MonsterTownSpawnEntry( typeof( ValoriteElemental ), 40 )
};
public static MonsterTownSpawnEntry[] Ophidian = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( OphidianWarrior ), 170 ),
new MonsterTownSpawnEntry( typeof( OphidianMage ), 70 ),
new MonsterTownSpawnEntry( typeof( OphidianArchmage ), 60 ),
new MonsterTownSpawnEntry( typeof( OphidianKnight ), 55 ),
new MonsterTownSpawnEntry( typeof( OphidianMatriarch ), 45 )
};
public static MonsterTownSpawnEntry[] Arachnid = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Scorpion ), 75 ),
new MonsterTownSpawnEntry( typeof( GiantSpider ), 75 ),
new MonsterTownSpawnEntry( typeof( TerathanDrone ), 75 ),
new MonsterTownSpawnEntry( typeof( TerathanWarrior ), 70 ),
new MonsterTownSpawnEntry( typeof( TerathanMatriarch ), 45 ),
new MonsterTownSpawnEntry( typeof( TerathanAvenger ), 45 ),
new MonsterTownSpawnEntry( typeof( DreadSpider ), 40 ),
new MonsterTownSpawnEntry( typeof( FrostSpider ), 35 )
};
public static MonsterTownSpawnEntry[] Snakes = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Snake ), 95 ),
new MonsterTownSpawnEntry( typeof( GiantSerpent ), 95 ),
new MonsterTownSpawnEntry( typeof( LavaSnake ), 50 ),
new MonsterTownSpawnEntry( typeof( LavaSerpent ), 55 ),
new MonsterTownSpawnEntry( typeof( IceSnake ), 50 ),
new MonsterTownSpawnEntry( typeof( IceSerpent ), 55 ),
new MonsterTownSpawnEntry( typeof( SilverSerpent ), 40 )
};
public static MonsterTownSpawnEntry[] Abyss = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Gargoyle ), 160 ),
new MonsterTownSpawnEntry( typeof( StoneGargoyle ), 60 ),
new MonsterTownSpawnEntry( typeof( FireGargoyle ), 60 ),
new MonsterTownSpawnEntry( typeof( Daemon ), 60 ),
new MonsterTownSpawnEntry( typeof( IceFiend ), 50 ),
new MonsterTownSpawnEntry( typeof( Balron ), 30 )
};
public static MonsterTownSpawnEntry[] DragonKind = new MonsterTownSpawnEntry[]
{
//Monster //Amount
new MonsterTownSpawnEntry( typeof( Wyvern ), 160 ),
new MonsterTownSpawnEntry( typeof( Drake ), 60 ),
new MonsterTownSpawnEntry( typeof( Dragon ), 60 ),
new MonsterTownSpawnEntry( typeof( WhiteWyrm ), 60 ),
new MonsterTownSpawnEntry( typeof( ShadowWyrm ), 50 ),
new MonsterTownSpawnEntry( typeof( AncientWyrm ), 30 )
};
#endregion
private Type m_Monster;
private int m_Amount;
public Type Monster { get { return m_Monster; } set { m_Monster = value; } }
public int Amount { get { return m_Amount; } set { m_Amount = value; } }
public MonsterTownSpawnEntry( Type monster, int amount )
{
m_Monster = monster;
m_Amount = amount;
}
}
}

View File

@@ -0,0 +1,507 @@
using System;
using System.Collections.Generic;
using Server.Mobiles;
using Server.Regions;
using Server.Misc;
using Server.Commands;
namespace Server.EventSystem
{
public class TownInvasion : BaseEvent
{
public static TimeSpan m_TIEventRate = TimeSpan.FromHours( 12.0 );
#region Private Variables
private int m_MinSpawnZ;
private int m_MaxSpawnZ;
private int m_LastMsg;
private bool m_Broadcast = true;
private bool m_FinalStage;
private Point3D m_Top = new Point3D(4394, 1058, 30);
private Point3D m_Bottom = new Point3D(4481, 1173, 0);
private Map m_SpawnMap = Map.Felucca;
private List<Mobile> m_Spawned;
private TownMonsterType m_TownMonsterType = TownMonsterType.OrcsandRatmen;
private TownChampionType m_TownChampionType = TownChampionType.Barracoon;
private double m_ParagonChance = 0.05;
private bool m_AlwaysMurderer = false;
private bool m_IsRunning;
private DateTime m_TimeNextScheduledEvent = DateTime.MinValue;
private DateTime m_TimeLastEvent = DateTime.MinValue;
private string m_TownInvaded = "Moonglow";
#endregion
#region Public Variables
[CommandProperty( AccessLevel.Administrator )]
public int MinSpawnZ { get { return m_MinSpawnZ; } set { m_MinSpawnZ = value; } }
[CommandProperty( AccessLevel.Administrator )]
public int MaxSpawnZ { get { return m_MaxSpawnZ; } set { m_MaxSpawnZ = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public bool Broadcast { get { return m_Broadcast; } set { m_Broadcast = value; } }
[CommandProperty( AccessLevel.Administrator )]
public Point3D Top { get { return m_Top; } set { m_Top = value; } }
[CommandProperty( AccessLevel.Administrator )]
public Point3D Bottom { get { return m_Bottom; } set { m_Bottom = value; } }
[CommandProperty( AccessLevel.Administrator )]
public Map SpawnMap { get { return m_SpawnMap; } set { m_SpawnMap = value; } }
public List<Mobile> Spawned { get { return m_Spawned; } set { m_Spawned = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public TownMonsterType TownMonsterType { get { return m_TownMonsterType; } set { m_TownMonsterType = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public TownChampionType TownChampionType { get { return m_TownChampionType; } set { m_TownChampionType = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public double ParagonChance { get { return m_ParagonChance; } set { m_ParagonChance = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public bool AlwaysMurderer { get { return m_AlwaysMurderer; } set { m_AlwaysMurderer = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public bool IsRunning { get { return m_IsRunning; } set { m_IsRunning = value; } }
[CommandProperty( AccessLevel.GameMaster, true )]
public DateTime TimeNextScheduledEvent { get { return m_TimeNextScheduledEvent; } set { m_TimeNextScheduledEvent = value; } }
[CommandProperty( AccessLevel.GameMaster, true )]
public DateTime TimeLastEvent { get { return m_TimeLastEvent; } set { m_TimeLastEvent = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public TimeSpan TIEventRate { get { return m_TIEventRate; } set { m_TIEventRate = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public string TownInvaded { get { return m_TownInvaded; } set { m_TownInvaded = value; } }
#endregion
#region Property Overrides
public override EventType EventType { get { return EventType.TownInvasion; } }
public override string EventName { get { return "Town Invasion"; } }
public override TimeSpan TimerFrequency { get { return TimeSpan.FromSeconds( 1.0 ); } }
public override Map StartingMap { get { return Map.Felucca; } }
public override Point3D StartingLocation { get { return new Point3D(6804, 2233, 0); } }
#endregion
#region Constructor
public TownInvasion()
{
m_Spawned = new List<Mobile>();
}
#endregion
#region Method Overrides
protected override void OnEnable()
{
}
protected override void OnDisable()
{
}
public override void OnStart()
{
if( !this.IsRunning )
{
switch( Utility.Random(6) )
{
/*case 0: //Britain Doesn't Get Invaded Anymore
{
this.Top = new Point3D(1426, 1554, 30);
this.Bottom = new Point3D(1490, 1735, 0);
this.MinSpawnZ = 0;
this.MaxSpawnZ = 31;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Britain";
this.TownMonsterType = TownMonsterType.OrcsandRatmen;
this.TownChampionType = TownChampionType.Barracoon;
break;
}*/
case 0: //Moonglow
{
this.Top = new Point3D(4394, 1058, 30);
this.Bottom = new Point3D(4481, 1173, 0);
this.MinSpawnZ = 0;
this.MaxSpawnZ = 31;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Moonglow";
this.TownMonsterType = TownMonsterType.Abyss;
this.TownChampionType = TownChampionType.Rikktor;
break;
}
case 1: //Minoc
{
this.Top = new Point3D(2443, 420, 15);
this.Bottom = new Point3D(2520, 539, 0);
this.MinSpawnZ = 0;
this.MaxSpawnZ = 16;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Minoc";
this.TownMonsterType = TownMonsterType.OreElementals;
this.TownChampionType = TownChampionType.LordOaks;
break;
}
case 2: //Delucia
{
this.Top = new Point3D(5171, 3980, 41);
this.Bottom = new Point3D(5300, 4040, 39);
this.MinSpawnZ = 39;
this.MaxSpawnZ = 42;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Delucia";
this.TownMonsterType = TownMonsterType.Ophidian;
this.TownChampionType = TownChampionType.Mephitis;
break;
}
case 3: //Ocllo
{
this.Top = new Point3D(3617, 2482, 0);
this.Bottom = new Point3D(3712, 2630, 20);
this.MinSpawnZ = 0;
this.MaxSpawnZ = 21;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Ocllo";
this.TownMonsterType = TownMonsterType.Elementals;
this.TownChampionType = TownChampionType.Semidar;
break;
}
case 4: //Skara Brae
{
this.Top = new Point3D(577, 2131, -90);
this.Bottom = new Point3D(634, 2234, -90);
this.MinSpawnZ = 0;
this.MaxSpawnZ = 1;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Skara Brae";
this.TownMonsterType = TownMonsterType.Humanoid;
this.TownChampionType = TownChampionType.Serado;
break;
}
case 5: //Yew
{
this.Top = new Point3D(457, 913, 30);
this.Bottom = new Point3D(662, 1117, 0);
this.MinSpawnZ = 0;
this.MaxSpawnZ = 0;
this.SpawnMap = Map.Felucca;
this.TownInvaded = "Yew";
this.TownMonsterType = TownMonsterType.OrcsandRatmen;
this.TownChampionType = TownChampionType.Barracoon;
break;
}
}
foreach ( Region r in Region.Regions )
{
if ( r is GuardedRegion && r.Name == this.TownInvaded )
{
((GuardedRegion)r).Disabled = true;
}
}
Spawn();
this.m_TimeLastEvent = DateTime.Now;
this.m_TimeNextScheduledEvent = DateTime.Now + TIEventRate;
//World.Broadcast( 0x35, true, "{0} is being invaded! The guards have fled! Help save it's citzens!", this.m_TownInvaded);
string bc = this.m_TownInvaded + " is being invaded! The guards have fled! Help save it's citizens!";
Server.Mobiles.InvasionAnnouncer.SetAnnouncement( bc );
this.IsRunning = true;
}
}
protected override void OnStop()
{
Despawn();
foreach ( Region r in Region.Regions )
{
if ( r is GuardedRegion && r.Name == this.TownInvaded )
{
((GuardedRegion)r).Disabled = false;
}
}
Server.Mobiles.InvasionAnnouncer.DeleteAnnouncements();
this.IsRunning = false; //it's not running anymore
}
public override void OnTick( int ticks )
{
int count = 0;
for ( int i = 0; i < m_Spawned.Count; ++i )
if ( m_Spawned[i] != null && !m_Spawned[i].Deleted && m_Spawned[i].Alive )
++count;
if ( !m_FinalStage ) //Monsters
{
if ( count == 0 ) //All monsters have been slayed
SpawnChamp();
}
else //Champion
{
if ( count == 0 ) //Champion is dead
{
if ( m_Broadcast )
Announce( 1161, "The city of {0} has been saved and the guards have returned to their posts. The citizens of {1} thank you!", m_TownInvaded, m_TownInvaded );
Stop();
}
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)3 ); //version
//v 3
writer.Write( m_Spawned, true );
// v 2
writer.Write( m_IsRunning );
// v 1
writer.Write( m_ParagonChance );
writer.Write( m_AlwaysMurderer );
writer.Write( m_TimeNextScheduledEvent );
writer.Write( m_TimeLastEvent );
writer.Write( m_TIEventRate );
// v 0
writer.Write( m_MinSpawnZ );
writer.Write( m_MaxSpawnZ );
writer.Write( m_Broadcast );
writer.Write( m_Top );
writer.Write( m_Bottom );
writer.Write( m_SpawnMap );
writer.WriteEncodedInt( (int)m_TownMonsterType );
writer.WriteEncodedInt( (int)m_TownChampionType );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 3:
{
m_Spawned = reader.ReadStrongMobileList();
goto case 2;
}
case 2:
{
m_IsRunning = reader.ReadBool();
goto case 1;
}
case 1:
{
m_ParagonChance = reader.ReadDouble();
m_AlwaysMurderer = reader.ReadBool();
m_TimeNextScheduledEvent = reader.ReadDateTime();
m_TimeLastEvent = reader.ReadDateTime();
m_TIEventRate = reader.ReadTimeSpan();
goto case 0;
}
case 0:
{
m_MinSpawnZ = reader.ReadInt();
m_MaxSpawnZ = reader.ReadInt();
m_Broadcast = reader.ReadBool();
m_Top = reader.ReadPoint3D();
m_Bottom = reader.ReadPoint3D();
m_SpawnMap = reader.ReadMap();
m_TownMonsterType = (TownMonsterType)reader.ReadEncodedInt();
m_TownChampionType = (TownChampionType)reader.ReadEncodedInt();
break;
}
}
OnStop();
m_IsRunning = false;
//m_Spawned = new List<Mobile>();
}
#endregion
#region Private Methods
private void Spawn()
{
Despawn();
MonsterTownSpawnEntry[] entries = null;
switch ( m_TownMonsterType )
{
default:
case TownMonsterType.Abyss: entries = MonsterTownSpawnEntry.Abyss; break;
case TownMonsterType.Arachnid: entries = MonsterTownSpawnEntry.Arachnid; break;
case TownMonsterType.DragonKind: entries = MonsterTownSpawnEntry.DragonKind; break;
case TownMonsterType.Elementals: entries = MonsterTownSpawnEntry.Elementals; break;
case TownMonsterType.Humanoid: entries = MonsterTownSpawnEntry.Humanoid; break;
case TownMonsterType.Ophidian: entries = MonsterTownSpawnEntry.Ophidian; break;
case TownMonsterType.OrcsandRatmen: entries = MonsterTownSpawnEntry.OrcsandRatmen; break;
case TownMonsterType.OreElementals: entries = MonsterTownSpawnEntry.OreElementals; break;
case TownMonsterType.Snakes: entries = MonsterTownSpawnEntry.Snakes; break;
case TownMonsterType.Undead: entries = MonsterTownSpawnEntry.Undead; break;
}
for ( int i = 0; i < entries.Length; ++i )
for ( int count = 0; count < entries[i].Amount; ++count )
AddMonster( entries[i].Monster );
}
private void Despawn()
{
foreach ( Mobile m in m_Spawned )
if ( m != null && !m.Deleted )
m.Delete();
m_Spawned.Clear();
m_FinalStage = false;
}
private Point3D FindSpawnLocation()
{
int x, y, z;
do
{
x = Utility.Random( m_Top.X, ( m_Bottom.X - m_Top.X ) );
y = Utility.Random( m_Top.Y, ( m_Bottom.Y - m_Top.Y ) );
z = SpawnMap.GetAverageZ( x, y );
}
while ( !SpawnMap.CanSpawnMobile( x, y, z ) );
return new Point3D( x, y, z );
}
private void AddMonster( Type type )
{
object monster = Activator.CreateInstance( type );
if ( monster != null && monster is Mobile )
{
Point3D location = FindSpawnLocation();
Mobile from = (Mobile)monster;
if ( m_FinalStage )
{
Announce( 1161, "{0} has come to take over {1}! Please save it's citizens!", from.Name, m_TownInvaded );
//TODO: Pack Goodies
}
from.MoveToWorld( location, SpawnMap );
if ( from is BaseCreature )
{
( (BaseCreature)from ).Tamable = false;
if ( !(from is BaseChampion) && !(from is Harrower) && !(from is BaseVendor) && !(from is BaseEscortable) && !(from is Clone) )
{
//if( Utility.RandomDouble() < m_ParagonChance )
//( (BaseCreature)from ).IsParagon = true;
if( m_AlwaysMurderer )
( (BaseCreature)from ).Kills = 6;
}
}
m_Spawned.Add( from );
}
}
public void SpawnChamp()
{
Despawn();
m_FinalStage = true;
switch ( m_TownChampionType )
{
default:
case TownChampionType.Barracoon: AddMonster( typeof( Barracoon ) ); break;
case TownChampionType.Harrower: AddMonster( typeof( Harrower ) ); break;
case TownChampionType.LordOaks: AddMonster( typeof( LordOaks ) ); break;
case TownChampionType.Mephitis: AddMonster( typeof( Mephitis ) ); break;
case TownChampionType.Neira: AddMonster( typeof( Neira ) ); break;
case TownChampionType.Rikktor: AddMonster( typeof( Rikktor ) ); break;
case TownChampionType.Semidar: AddMonster( typeof( Semidar ) ); break;
case TownChampionType.Serado: AddMonster( typeof( Serado ) ); break;
}
}
#endregion
}
public class TIWorldTimer : Timer
{
public static void Initialize()
{
new TIWorldTimer().Start();
}
public TIWorldTimer() : base( TownInvasion.m_TIEventRate, TownInvasion.m_TIEventRate )
{
Priority = TimerPriority.OneMinute;
}
protected override void OnTick()
{
BaseEvent evnt = Server.EventSystem.EventCore.FindEvent( EventType.TownInvasion );
if( evnt != null ) //don't run a new one if one is running already.
{
evnt.Start();
}
}
}
}