Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
This commit is contained in:
30
Scripts/SubSystem/Event System/Events/Town Invasion/Enums.cs
Normal file
30
Scripts/SubSystem/Event System/Events/Town Invasion/Enums.cs
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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.";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user