458 lines
11 KiB
C#
458 lines
11 KiB
C#
// Engine r117
|
|
using System;
|
|
using System.IO;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Mobiles;
|
|
|
|
namespace Server.Commands
|
|
{
|
|
public class GenOverseer
|
|
{
|
|
public static void Initialize()
|
|
{
|
|
CommandSystem.Register( "GenSeers", AccessLevel.Administrator, new CommandEventHandler( GenOverseer_OnCommand ) );
|
|
CommandSystem.Register( "GenOverseers", AccessLevel.Administrator, new CommandEventHandler( GenOverseer_OnCommand ) );
|
|
CommandSystem.Register( "GenSeer", AccessLevel.Administrator, new CommandEventHandler( GenOverseer_OnCommand ) );
|
|
CommandSystem.Register( "GenOverseer", AccessLevel.Administrator, new CommandEventHandler( GenOverseer_OnCommand ) );
|
|
}
|
|
|
|
[Usage( "GenSeers" )]
|
|
[Aliases( "GenSeer, GenOverseer and GenOverseers" )]
|
|
[Description( "Generates Spawns' Overseers around the world." )]
|
|
private static void GenOverseer_OnCommand( CommandEventArgs e )
|
|
{
|
|
m_Mobile = e.Mobile;
|
|
m_Count = 0;
|
|
|
|
m_Mobile.SendMessage( "Generating Spawns' Overseers, please wait." );
|
|
|
|
Generate( "Data/Spawns/britannia", Map.Britannia );
|
|
Generate( "Data/Spawns/underworld", Map.Underworld );
|
|
Generate( "Data/Spawns/darkness", Map.Darkness );
|
|
Generate( "Data/Spawns/ocean", Map.Ocean );
|
|
Generate( "Data/Spawns/grassland", Map.Grassland );
|
|
|
|
m_Mobile.SendMessage( "Spawns' Overseers generation complete. {0} seers were generated.", m_Count );
|
|
}
|
|
|
|
public static void Generate( string folder, params Map[] maps )
|
|
{
|
|
if ( !Directory.Exists( folder ) )
|
|
return;
|
|
|
|
string[] files = Directory.GetFiles( folder, "*.cfg" );
|
|
|
|
for ( int i = 0; i < files.Length; ++i )
|
|
{
|
|
ArrayList list = DecorationListSeers.ReadAll( files[i] );
|
|
|
|
for ( int j = 0; j < list.Count; ++j )
|
|
m_Count += ((DecorationListSeers)list[j]).Generate( maps );
|
|
}
|
|
}
|
|
|
|
private static Mobile m_Mobile;
|
|
private static int m_Count;
|
|
}
|
|
|
|
public class DecorationListSeers
|
|
{
|
|
private Type m_Type;
|
|
private int m_ItemID;
|
|
private string[] m_Params;
|
|
private ArrayList m_Entries;
|
|
|
|
public DecorationListSeers()
|
|
{
|
|
}
|
|
|
|
private static Type typeofStatic = typeof( Static );
|
|
private static Type typeofLocalizedStatic = typeof( LocalizedStatic );
|
|
|
|
public Item Construct()
|
|
{
|
|
Item item;
|
|
|
|
try
|
|
{
|
|
if ( m_Type == typeofStatic )
|
|
{
|
|
item = new Static( m_ItemID );
|
|
}
|
|
else if ( m_Type == typeofLocalizedStatic )
|
|
{
|
|
int labelNumber = 0;
|
|
|
|
for ( int i = 0; i < m_Params.Length; ++i )
|
|
{
|
|
if ( m_Params[i].StartsWith( "LabelNumber" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
{
|
|
labelNumber = Utility.ToInt32( m_Params[i].Substring( ++indexOf ) );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
item = new LocalizedStatic( m_ItemID, labelNumber );
|
|
}
|
|
else
|
|
{
|
|
item = (Item)Activator.CreateInstance( m_Type );
|
|
}
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
throw new Exception( String.Format( "Bad type: {0}", m_Type ), e );
|
|
}
|
|
|
|
if ( item is Server.Items.SpawnsOverseer )
|
|
{
|
|
Server.Items.SpawnsOverseer sp = (Server.Items.SpawnsOverseer)item;
|
|
|
|
for ( int i = 0; i < m_Params.Length; ++i )
|
|
{
|
|
if ( m_Params[i].StartsWith( "Range" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
sp.Range = Utility.ToInt32( m_Params[i].Substring( ++indexOf ) );
|
|
}
|
|
else if ( m_Params[i].StartsWith( "InRangeDelay" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
sp.InRangeDelay = Utility.ToInt32( m_Params[i].Substring( ++indexOf ) );
|
|
}
|
|
else if ( m_Params[i].StartsWith( "OutRangeDelay" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
sp.OutRangeDelay = Utility.ToInt32( m_Params[i].Substring( ++indexOf ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
item.Movable = false;
|
|
|
|
for ( int i = 0; i < m_Params.Length; ++i )
|
|
{
|
|
if ( m_Params[i].StartsWith( "Light" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
item.Light = (LightType)Enum.Parse( typeof( LightType ), m_Params[i].Substring( ++indexOf ), true );
|
|
}
|
|
else if ( m_Params[i].StartsWith( "Hue" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
{
|
|
int hue = Utility.ToInt32( m_Params[i].Substring( ++indexOf ) );
|
|
|
|
if ( item is DyeTub )
|
|
((DyeTub)item).DyedHue = hue;
|
|
else
|
|
item.Hue = hue;
|
|
}
|
|
}
|
|
else if ( m_Params[i].StartsWith( "Name" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
item.Name = m_Params[i].Substring( ++indexOf );
|
|
}
|
|
else if ( m_Params[i].StartsWith( "Amount" ) )
|
|
{
|
|
int indexOf = m_Params[i].IndexOf( '=' );
|
|
|
|
if ( indexOf >= 0 )
|
|
{
|
|
// Must supress stackable warnings
|
|
|
|
bool wasStackable = item.Stackable;
|
|
|
|
item.Stackable = true;
|
|
item.Amount = Utility.ToInt32( m_Params[i].Substring( ++indexOf ) );
|
|
item.Stackable = wasStackable;
|
|
}
|
|
}
|
|
}
|
|
|
|
return item;
|
|
}
|
|
|
|
private static Queue m_DeleteQueue = new Queue();
|
|
|
|
private static bool FindItem( int x, int y, int z, Map map, Item srcItem )
|
|
{
|
|
int itemID = srcItem.ItemID;
|
|
|
|
bool res = false;
|
|
|
|
IPooledEnumerable eable;
|
|
|
|
if ( (TileData.ItemTable[itemID & TileData.MaxItemValue].Flags & TileFlag.LightSource) != 0 )
|
|
{
|
|
eable = map.GetItemsInRange( new Point3D( x, y, z ), 0 );
|
|
|
|
LightType lt = srcItem.Light;
|
|
string srcName = srcItem.ItemData.Name;
|
|
|
|
foreach ( Item item in eable )
|
|
{
|
|
if ( item.Z == z )
|
|
{
|
|
if ( item.ItemID == itemID )
|
|
{
|
|
if ( item.Light != lt )
|
|
m_DeleteQueue.Enqueue( item );
|
|
else
|
|
res = true;
|
|
}
|
|
else if ( (item.ItemData.Flags & TileFlag.LightSource) != 0 && item.ItemData.Name == srcName )
|
|
{
|
|
m_DeleteQueue.Enqueue( item );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
eable = map.GetItemsInRange( new Point3D( x, y, z ), 0 );
|
|
|
|
foreach ( Item item in eable )
|
|
{
|
|
if ( item.Z == z && item.ItemID == itemID )
|
|
{
|
|
eable.Free();
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
eable.Free();
|
|
|
|
while ( m_DeleteQueue.Count > 0 )
|
|
((Item)m_DeleteQueue.Dequeue()).Delete();
|
|
|
|
return res;
|
|
}
|
|
|
|
public int Generate( Map[] maps )
|
|
{
|
|
int count = 0;
|
|
|
|
Item item = null;
|
|
|
|
for ( int i = 0; i < m_Entries.Count; ++i )
|
|
{
|
|
DecorationEntrySeers entry = (DecorationEntrySeers)m_Entries[i];
|
|
Point3D loc = entry.Location;
|
|
string extra = entry.Extra;
|
|
|
|
for ( int j = 0; j < maps.Length; ++j )
|
|
{
|
|
if ( item == null )
|
|
item = Construct();
|
|
|
|
if ( item == null )
|
|
continue;
|
|
|
|
if ( FindItem( loc.X, loc.Y, loc.Z, maps[j], item ) )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
item.MoveToWorld( loc, maps[j] );
|
|
++count;
|
|
|
|
item = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( item != null )
|
|
item.Delete();
|
|
|
|
return count;
|
|
}
|
|
|
|
public static ArrayList ReadAll( string path )
|
|
{
|
|
using ( StreamReader ip = new StreamReader( path ) )
|
|
{
|
|
ArrayList list = new ArrayList();
|
|
|
|
for ( DecorationListSeers v = Read( ip ); v != null; v = Read( ip ) )
|
|
list.Add( v );
|
|
|
|
return list;
|
|
}
|
|
}
|
|
|
|
private static string[] m_EmptyParams = new string[0];
|
|
|
|
public static DecorationListSeers Read( StreamReader ip )
|
|
{
|
|
string line;
|
|
|
|
while ( (line = ip.ReadLine()) != null )
|
|
{
|
|
line = line.Trim();
|
|
|
|
if ( line.Length > 0 && !line.StartsWith( "#" ) )
|
|
break;
|
|
}
|
|
|
|
if ( string.IsNullOrEmpty( line ) )
|
|
return null;
|
|
|
|
DecorationListSeers list = new DecorationListSeers();
|
|
|
|
int indexOf = line.IndexOf( ' ' );
|
|
|
|
list.m_Type = ScriptCompiler.FindTypeByName( line.Substring( 0, indexOf++ ), true );
|
|
|
|
if ( list.m_Type == null )
|
|
throw new ArgumentException( String.Format( "Type not found for header: '{0}'", line ) );
|
|
|
|
line = line.Substring( indexOf );
|
|
indexOf = line.IndexOf( '(' );
|
|
if ( indexOf >= 0 )
|
|
{
|
|
list.m_ItemID = Utility.ToInt32( line.Substring( 0, indexOf - 1 ) );
|
|
|
|
string parms = line.Substring( ++indexOf );
|
|
|
|
if ( line.EndsWith( ")" ) )
|
|
parms = parms.Substring( 0, parms.Length - 1 );
|
|
|
|
list.m_Params = parms.Split( ';' );
|
|
|
|
for ( int i = 0; i < list.m_Params.Length; ++i )
|
|
list.m_Params[i] = list.m_Params[i].Trim();
|
|
}
|
|
else
|
|
{
|
|
list.m_ItemID = Utility.ToInt32( line );
|
|
list.m_Params = m_EmptyParams;
|
|
}
|
|
|
|
list.m_Entries = new ArrayList();
|
|
|
|
while ( (line = ip.ReadLine()) != null )
|
|
{
|
|
line = line.Trim();
|
|
|
|
if ( line.Length == 0 )
|
|
break;
|
|
|
|
if ( line.StartsWith( "#" ) )
|
|
continue;
|
|
|
|
list.m_Entries.Add( new DecorationEntrySeers( line ) );
|
|
}
|
|
|
|
return list;
|
|
}
|
|
}
|
|
|
|
public class DecorationEntrySeers
|
|
{
|
|
private Point3D m_Location;
|
|
private string m_Extra;
|
|
|
|
public Point3D Location{ get{ return m_Location; } }
|
|
public string Extra{ get{ return m_Extra; } }
|
|
|
|
public DecorationEntrySeers( string line )
|
|
{
|
|
string x, y, z;
|
|
|
|
Pop( out x, ref line );
|
|
Pop( out y, ref line );
|
|
Pop( out z, ref line );
|
|
|
|
m_Location = new Point3D( Utility.ToInt32( x ), Utility.ToInt32( y ), Utility.ToInt32( z ) );
|
|
m_Extra = line;
|
|
}
|
|
|
|
public void Pop( out string v, ref string line )
|
|
{
|
|
int space = line.IndexOf( ' ' );
|
|
|
|
if ( space >= 0 )
|
|
{
|
|
v = line.Substring( 0, space++ );
|
|
line = line.Substring( space );
|
|
}
|
|
else
|
|
{
|
|
v = line;
|
|
line = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
public class RemOverseer
|
|
{
|
|
public static void Initialize()
|
|
{
|
|
CommandSystem.Register( "RemOverseers", AccessLevel.Administrator, new CommandEventHandler( RemOverseers_OnCommand ) );
|
|
CommandSystem.Register( "RemSeers", AccessLevel.Administrator, new CommandEventHandler( RemOverseers_OnCommand ) );
|
|
CommandSystem.Register( "RemOverseer", AccessLevel.Administrator, new CommandEventHandler( RemOverseers_OnCommand ) );
|
|
CommandSystem.Register( "RemSeer", AccessLevel.Administrator, new CommandEventHandler( RemOverseers_OnCommand ) );
|
|
}
|
|
|
|
[Usage( "RemSeers" )]
|
|
[Aliases( "RemSeer, RemOverseer, RemOverseers" )]
|
|
[Description( "Remove all Overseers in all facets." )]
|
|
public static void RemOverseers_OnCommand( CommandEventArgs e )
|
|
{
|
|
Mobile from = e.Mobile;
|
|
World.Broadcast( 0x35, true, "Overseers are being removed, please wait." );
|
|
DateTime startTime = DateTime.Now;
|
|
int count = 0;
|
|
List<Item> itemsremove = new List<Item>();
|
|
|
|
foreach ( Item itemremove in World.Items.Values )
|
|
{
|
|
if ( itemremove is SpawnsOverseer && itemremove.Parent == null )
|
|
{
|
|
itemsremove.Add( itemremove );
|
|
count +=1;
|
|
}
|
|
}
|
|
|
|
foreach ( Item itemremove2 in itemsremove )
|
|
{
|
|
itemremove2.Delete();
|
|
}
|
|
|
|
foreach ( Item premiums in World.Items.Values )
|
|
{
|
|
if ( premiums is PremiumSpawner && premiums.Parent == null && ((PremiumSpawner)premiums).Running == false )
|
|
{
|
|
((PremiumSpawner)premiums).Running = true;
|
|
((PremiumSpawner)premiums).NextSpawn = TimeSpan.FromSeconds( 1 );
|
|
}
|
|
}
|
|
|
|
DateTime endTime = DateTime.Now;
|
|
World.Broadcast( 0x35, true, "{0} Overseers has been removed in {1:F1} seconds.", count, (endTime - startTime).TotalSeconds );
|
|
}
|
|
}
|
|
}
|