protected void SaveMobiles(SaveMetrics metrics)
		{
			var mobiles = World.Mobiles;

			GenericWriter idx;
			GenericWriter tdb;
			GenericWriter bin;

			if (UseSequentialWriters)
			{
				idx = new BinaryFileWriter(World.MobileIndexPath, false);
				tdb = new BinaryFileWriter(World.MobileTypesPath, false);
				bin = new BinaryFileWriter(World.MobileDataPath, true);
			}
			else
			{
				idx = new AsyncWriter(World.MobileIndexPath, false);
				tdb = new AsyncWriter(World.MobileTypesPath, false);
				bin = new AsyncWriter(World.MobileDataPath, true);
			}

			idx.Write(mobiles.Count);
			foreach (Mobile m in mobiles.Values)
			{
				long start = bin.Position;

				idx.Write(m.m_TypeRef);
				idx.Write(m.Serial);
				idx.Write(start);

				m.Serialize(bin);

				if (metrics != null)
				{
					metrics.OnMobileSaved((int)(bin.Position - start));
				}

				idx.Write((int)(bin.Position - start));

				m.FreeCache();
			}

			tdb.Write(World.m_MobileTypes.Count);

			for (int i = 0; i < World.m_MobileTypes.Count; ++i)
			{
				tdb.Write(World.m_MobileTypes[i].FullName);
			}

			idx.Close();
			tdb.Close();
			bin.Close();
		}
 public WorkerThread( AsyncWriter owner )
 {
     m_Owner = owner;
 }
Exemple #3
0
        private static void SaveGuilds(string guildBase)
        {
            string guildIdxPath = Path.Combine(guildBase, "Guilds.idx");
            string guildBinPath = Path.Combine(guildBase, "Guilds.bin");

            GenericWriter idx;
            GenericWriter bin;

            if (!Directory.Exists(guildBase))
                Directory.CreateDirectory(guildBase);

            if ( SaveType == SaveOption.Normal )
            {
                idx = new BinaryFileWriter( guildIdxPath, false );
                bin = new BinaryFileWriter( guildBinPath, true );
            }
            else
            {
                idx = new AsyncWriter( guildIdxPath, false );
                bin = new AsyncWriter( guildBinPath, true );
            }

            idx.Write( (int) BaseGuild.List.Count );
            foreach ( BaseGuild guild in BaseGuild.List.Values )
            {
                long start = bin.Position;

                idx.Write( (int)0 );//guilds have no typeid
                idx.Write( (int)guild.Id );
                idx.Write( (long)start );

                guild.Serialize( bin );

                idx.Write( (int) (bin.Position - start) );
            }

            idx.Close();
            bin.Close();
        }
Exemple #4
0
        private static void SaveRegions(string regionBase)
        {
            string regionIdxPath = Path.Combine( regionBase, "Regions.idx" );
            string regionBinPath = Path.Combine( regionBase, "Regions.bin" );

            int count = 0;

            GenericWriter bin;

            if (!Directory.Exists(regionBase))
                Directory.CreateDirectory(regionBase);

            if ( SaveType == SaveOption.Normal )
                bin = new BinaryFileWriter( regionBinPath, true );
            else
                bin = new AsyncWriter( regionBinPath, true );

            MemoryStream mem = new MemoryStream( 4 + (20*Region.Regions.Count) );
            BinaryWriter memIdx = new BinaryWriter( mem );

            memIdx.Write( (int)0 );

            for ( int i = 0; i < Region.Regions.Count; ++i )
            {
                Region region = (Region)Region.Regions[i];

                if ( region.Saves )
                {
                    ++count;
                    long start = bin.Position;

                    memIdx.Write( (int)0 );//typeid
                    memIdx.Write( (int) region.UId );
                    memIdx.Write( (long) start );

                    region.Serialize( bin );

                    memIdx.Write( (int) (bin.Position - start) );
                }
            }

            bin.Close();

            memIdx.Seek( 0, SeekOrigin.Begin );
            memIdx.Write( (int)count );

            if ( SaveType == SaveOption.Threaded )
            {
                AsyncWriter asyncIdx = new AsyncWriter( regionIdxPath, false );
                asyncIdx.MemStream = mem;
                asyncIdx.Close();
            }
            else
            {
                FileStream fs = new FileStream( regionIdxPath, FileMode.Create, FileAccess.Write, FileShare.None );
                mem.WriteTo( fs );
                fs.Close();
                mem.Close();
            }

            // mem is closed only in non threaded saves, as its reference is copied to asyncIdx.MemStream
            memIdx.Close();
        }
Exemple #5
0
        private static void SaveMobiles(string mobileBase)
        {
            ArrayList restock = new ArrayList();

            GenericWriter idx;
            GenericWriter tdb;
            GenericWriter bin;

            if (!Directory.Exists(mobileBase))
                Directory.CreateDirectory(mobileBase);

            string mobIdxPath = Path.Combine(mobileBase, "Mobiles.idx");
            string mobTdbPath = Path.Combine(mobileBase, "Mobiles.tdb");
            string mobBinPath = Path.Combine(mobileBase, "Mobiles.bin");

            if ( SaveType == SaveOption.Normal )
            {
                idx = new BinaryFileWriter( mobIdxPath, false );
                tdb = new BinaryFileWriter( mobTdbPath, false );
                bin = new BinaryFileWriter( mobBinPath, true );
            }
            else
            {
                idx = new AsyncWriter( mobIdxPath, false );
                tdb = new AsyncWriter( mobTdbPath, false );
                bin = new AsyncWriter( mobBinPath, true );
            }

            idx.Write( (int) m_Mobiles.Count );
            foreach ( Mobile m in m_Mobiles.Values )
            {
                long start = bin.Position;

                idx.Write( (int) m.m_TypeRef );
                idx.Write( (int) m.Serial );
                idx.Write( (long) start );

                m.Serialize( bin );

                idx.Write( (int) (bin.Position - start) );

                if ( m is IVendor )
                {
                    if ( ((IVendor)m).LastRestock + ((IVendor)m).RestockDelay < DateTime.Now )
                        restock.Add( m );
                }

                m.FreeCache();
            }

            tdb.Write( (int) m_MobileTypes.Count );
            for ( int i = 0; i < m_MobileTypes.Count; ++i )
                tdb.Write( ((Type)m_MobileTypes[i]).FullName );

            for (int i=0;i<restock.Count;i++)
            {
                IVendor vend = (IVendor)restock[i];
                vend.Restock();
                vend.LastRestock = DateTime.Now;
            }

            idx.Close();
            tdb.Close();
            bin.Close();
        }
Exemple #6
0
        private static void SaveItems(string itemBase)
        {
            string itemIdxPath = Path.Combine( itemBase, "Items.idx" );
            string itemTdbPath = Path.Combine( itemBase, "Items.tdb" );
            string itemBinPath = Path.Combine( itemBase, "Items.bin" );

            ArrayList decaying = new ArrayList();

            GenericWriter idx;
            GenericWriter tdb;
            GenericWriter bin;

            if (!Directory.Exists(itemBase))
                Directory.CreateDirectory(itemBase);

            if ( SaveType == SaveOption.Normal )
            {
                idx = new BinaryFileWriter( itemIdxPath, false );
                tdb = new BinaryFileWriter( itemTdbPath, false );
                bin = new BinaryFileWriter( itemBinPath, true );
            }
            else
            {
                idx = new AsyncWriter( itemIdxPath, false );
                tdb = new AsyncWriter( itemTdbPath, false );
                bin = new AsyncWriter( itemBinPath, true );
            }

            idx.Write( (int) m_Items.Count );
            foreach ( Item item in m_Items.Values )
            {
                if ( item.Decays && item.Parent == null && item.Map != Map.Internal && (item.LastMoved + item.DecayTime) <= DateTime.Now )
                    decaying.Add( item );

                long start = bin.Position;

                idx.Write( (int) item.m_TypeRef );
                idx.Write( (int) item.Serial );
                idx.Write( (long) start );

                item.Serialize( bin );

                idx.Write( (int) (bin.Position - start) );

                item.FreeCache();
            }

            tdb.Write( (int) m_ItemTypes.Count );
            for ( int i = 0; i < m_ItemTypes.Count; ++i )
                tdb.Write( ((Type)m_ItemTypes[i]).FullName );

            idx.Close();
            tdb.Close();
            bin.Close();

            for ( int i = 0; i < decaying.Count; ++i )
            {
                Item item = (Item)decaying[i];

                if ( item.OnDecay() )
                    item.Delete();
            }
        }
        protected void SaveGuilds(SaveMetrics metrics)
        {
            GenericWriter idx;
            GenericWriter bin;

            if (UseSequentialWriters)
            {
                idx = new BinaryFileWriter( World.GuildIndexPath, false );
                bin = new BinaryFileWriter( World.GuildDataPath, true );
            } else {
                idx = new AsyncWriter( World.GuildIndexPath, false );
                bin = new AsyncWriter( World.GuildDataPath, true );
            }

            idx.Write( ( int ) BaseGuild.List.Count );
            foreach ( BaseGuild guild in BaseGuild.List.Values ) {
                long start = bin.Position;

                idx.Write( ( int ) 0 );//guilds have no typeid
                idx.Write( ( int ) guild.Id );
                idx.Write( ( long ) start );

                guild.Serialize( bin );

                if ( metrics != null ) {
                    metrics.OnGuildSaved( ( int ) ( bin.Position - start ) );
                }

                idx.Write( ( int ) ( bin.Position - start ) );
            }

            idx.Close();
            bin.Close();
        }
        protected void SaveItems(SaveMetrics metrics)
        {
            Dictionary<Serial, Item> items = World.Items;

            GenericWriter idx;
            GenericWriter tdb;
            GenericWriter bin;

            if (UseSequentialWriters)
            {
                idx = new BinaryFileWriter( World.ItemIndexPath, false );
                tdb = new BinaryFileWriter( World.ItemTypesPath, false );
                bin = new BinaryFileWriter( World.ItemDataPath, true );
            } else {
                idx = new AsyncWriter( World.ItemIndexPath, false );
                tdb = new AsyncWriter( World.ItemTypesPath, false );
                bin = new AsyncWriter( World.ItemDataPath, true );
            }

            idx.Write( ( int ) items.Count );
            foreach ( Item item in items.Values ) {
                if ( item.Decays && item.Parent == null && item.Map != Map.Internal && ( item.LastMoved + item.DecayTime ) <= DateTime.Now ) {
                    _decayQueue.Enqueue( item );
                }

                long start = bin.Position;

                idx.Write( ( int ) item.m_TypeRef );
                idx.Write( ( int ) item.Serial );
                idx.Write( ( long ) start );

                item.Serialize( bin );

                if ( metrics != null ) {
                    metrics.OnItemSaved( ( int ) ( bin.Position - start ) );
                }

                idx.Write( ( int ) ( bin.Position - start ) );

                item.FreeCache();
            }

            tdb.Write( ( int ) World.m_ItemTypes.Count );
            for ( int i = 0; i < World.m_ItemTypes.Count; ++i )
                tdb.Write( World.m_ItemTypes[i].FullName );

            idx.Close();
            tdb.Close();
            bin.Close();
        }
        protected void SaveData(SaveMetrics metrics)
        {
            Dictionary<CustomSerial, SaveData> data = World.Data;

            GenericWriter indexWriter;
            GenericWriter typeWriter;
            GenericWriter dataWriter;

            if (this.UseSequentialWriters)
            {
                indexWriter = new BinaryFileWriter(World.DataIndexPath, false);
                typeWriter = new BinaryFileWriter(World.DataTypesPath, false);
                dataWriter = new BinaryFileWriter(World.DataBinaryPath, true);
            }
            else
            {
                indexWriter = new AsyncWriter(World.DataIndexPath, false);
                typeWriter = new AsyncWriter(World.DataTypesPath, false);
                dataWriter = new AsyncWriter(World.DataBinaryPath, true);
            }

            indexWriter.Write(data.Count);

            foreach (SaveData saveData in data.Values)
            {
                long start = dataWriter.Position;

                indexWriter.Write(saveData._TypeID);
                indexWriter.Write((int)saveData.Serial);
                indexWriter.Write(start);

                saveData.Serialize(dataWriter);

                if (metrics != null)
                    metrics.OnDataSaved((int)(dataWriter.Position - start));

                indexWriter.Write((int)(dataWriter.Position - start));
            }

            typeWriter.Write(World._DataTypes.Count);

            for (int i = 0; i < World._DataTypes.Count; ++i)
                typeWriter.Write(World._DataTypes[i].FullName);

            indexWriter.Close();
            typeWriter.Close();
            dataWriter.Close();
        }
Exemple #10
0
		private static void ExportSystem( string filename )
		{
			string folder = Path.Combine( DataPath, "Export/" );

			string idxpath = Path.Combine( folder, filename + ".idx" );
			string tdbpath = Path.Combine( folder, filename + ".tdb" );
			string binpath = Path.Combine( folder, filename + ".bin" );

			EnsureDirectory( Directory.GetParent( binpath ).FullName );

			GenericWriter idx;
			GenericWriter tdb;
			GenericWriter bin;

			if ( World.SaveType == World.SaveOption.Normal )
			{
				idx = new BinaryFileWriter( idxpath, false );
				tdb = new BinaryFileWriter( tdbpath, false );
				bin = new BinaryFileWriter( binpath, true );
			}
			else
			{
				idx = new AsyncWriter( idxpath, false );
				tdb = new AsyncWriter( tdbpath, false );
				bin = new AsyncWriter( binpath, true );
			}

			ArrayList gates = new ArrayList();

			foreach ( Item item in World.Items.Values )
				if ( item is StargateAddon  || item is SymbolComponent )
					gates.Add( item );

			idx.Write( (int)gates.Count );

			foreach ( Item item in gates )
			{
				//Export the Addon
				long start = bin.Position;
				int ourType = m_SaveTypes.IndexOf( item.GetType() );

				if ( ourType == -1 )
					ourType = AddSaveType( item.GetType() );

				idx.Write( (int) ourType );
				idx.Write( (int) item.Serial );
				idx.Write( (long) start );

				item.Serialize( bin );

				idx.Write( (int) ( bin.Position - start ) );
			}

			tdb.Write( (int) m_SaveTypes.Count );
			for ( int i = 0; i < m_SaveTypes.Count; ++i )
				tdb.Write( m_SaveTypes[i].FullName );

			idx.Close();
			tdb.Close();
			bin.Close();
		}
Exemple #11
0
        private static void SaveGuilds()
        {
            GenericWriter idx;
            GenericWriter bin;

            if ( SaveType == SaveOption.Normal )
            {
                idx = new BinaryFileWriter( guildIdxPath, false );
                bin = new BinaryFileWriter( guildBinPath, true );
            }
            else
            {
                idx = new AsyncWriter( guildIdxPath, false );
                bin = new AsyncWriter( guildBinPath, true );
            }

            idx.Write( (int) BaseGuild.List.Count );
            foreach ( BaseGuild guild in BaseGuild.List.Values )
            {
                long start = bin.Position;

                idx.Write( (int)0 );//guilds have no typeid
                idx.Write( (int)guild.Id );
                idx.Write( (long)start );

                guild.Serialize( bin );

                idx.Write( (int) (bin.Position - start) );
            }

            idx.Close();
            bin.Close();
        }
		protected void SaveMaps( SaveMetrics metrics )
		{
			Dictionary<Serial, BaseInstanceMap> maps = World.Maps;

			GenericWriter idx;
			GenericWriter tdb;
			GenericWriter bin;

			if (UseSequentialWriters)
			{
				idx = new BinaryFileWriter( World.MapIndexPath, false );
				tdb = new BinaryFileWriter( World.MapTypesPath, false );
				bin = new BinaryFileWriter( World.MapDataPath, true );
			}
			else
			{
				idx = new AsyncWriter( World.MapIndexPath, false );
				tdb = new AsyncWriter( World.MapTypesPath, false );
				bin = new AsyncWriter( World.MapDataPath, true );
			}

			idx.Write( ( int ) maps.Count );

			foreach ( BaseInstanceMap map in maps.Values )
			{
				if ( map.Decays )
					_decayMapQueue.Enqueue( map );

				long start = bin.Position;

				idx.Write( ( int ) map.TypeReference );
				idx.Write( ( int ) map.Serial );
				idx.Write( ( long ) start );

				map.Serialize( bin );

				if ( metrics != null )
					metrics.OnMapSaved( ( int ) ( bin.Position - start ) );

				idx.Write( ( int ) ( bin.Position - start ) );
			}

			tdb.Write( ( int ) World.m_InstanceMapTypes.Count );
			for ( int i = 0; i < World.m_InstanceMapTypes.Count; ++i )
				tdb.Write( World.m_InstanceMapTypes[i].FullName );

			idx.Close();
			tdb.Close();
			bin.Close();
		}
Exemple #13
0
		private static void SaveItems()
		{
			//Pix: removed to heartbeat 11/18/05
			//ArrayList decaying = new ArrayList();

			GenericWriter idx;
			GenericWriter tdb;
			GenericWriter bin;

			if (SaveType == SaveOption.Normal)
			{
				idx = new BinaryFileWriter(itemIdxPath, false);
				tdb = new BinaryFileWriter(itemTdbPath, false);
				bin = new BinaryFileWriter(itemBinPath, true);
			}
			else
			{
				idx = new AsyncWriter(itemIdxPath, false);
				tdb = new AsyncWriter(itemTdbPath, false);
				bin = new AsyncWriter(itemBinPath, true);
			}

			idx.Write((int)m_Items.Count);
			foreach (Item item in m_Items.Values)
			{
				//Pix: removed to heartbeat 11/18/05
				//if ( item.Decays && item.Parent == null && item.Map != Map.Internal && (item.LastMoved + item.DecayTime) <= DateTime.Now )
				//	decaying.Add( item );

				long start = bin.Position;

				idx.Write((int)item.m_TypeRef);
				idx.Write((int)item.Serial);
				idx.Write((long)start);

				item.Serialize(bin);

				idx.Write((int)(bin.Position - start));

				item.FreeCache();
			}

			tdb.Write((int)m_ItemTypes.Count);
			for (int i = 0; i < m_ItemTypes.Count; ++i)
				tdb.Write(((Type)m_ItemTypes[i]).FullName);

			idx.Close();
			tdb.Close();
			bin.Close();

			//Pix: removed to heartbeat 11/18/05
			//for ( int i = 0; i < decaying.Count; ++i )
			//{
			//	Item item = (Item)decaying[i];
			//
			//	if ( item.OnDecay() )
			//		item.Delete();
			//}
		}
Exemple #14
0
		private static void SaveMobiles()
		{
			//Pix: 12/15/05 - moved to heartbeat
			//ArrayList restock = new ArrayList();

			GenericWriter idx;
			GenericWriter tdb;
			GenericWriter bin;

			if (SaveType == SaveOption.Normal)
			{
				idx = new BinaryFileWriter(mobIdxPath, false);
				tdb = new BinaryFileWriter(mobTdbPath, false);
				bin = new BinaryFileWriter(mobBinPath, true);
			}
			else
			{
				idx = new AsyncWriter(mobIdxPath, false);
				tdb = new AsyncWriter(mobTdbPath, false);
				bin = new AsyncWriter(mobBinPath, true);
			}

			idx.Write((int)m_Mobiles.Count);
			foreach (Mobile m in m_Mobiles.Values)
			{
				Type t = m.GetType();

				long start = bin.Position;

				idx.Write((int)m.m_TypeRef);
				idx.Write((int)m.Serial);
				idx.Write((long)start);

				m.Serialize(bin);

				idx.Write((int)(bin.Position - start));

				//Pix: 12/15/05 - moved to heartbeat
				//if ( m is IVendor )
				//{
				//	if ( ((IVendor)m).LastRestock + ((IVendor)m).RestockDelay < DateTime.Now )
				//		restock.Add( m );
				//}

				m.FreeCache();
			}

			tdb.Write((int)m_MobileTypes.Count);
			for (int i = 0; i < m_MobileTypes.Count; ++i)
				tdb.Write(((Type)m_MobileTypes[i]).FullName);

			//Pix: 12/15/05 - moved to heartbeat
			//for (int i=0;i<restock.Count;i++)
			//{
			//	IVendor vend = (IVendor)restock[i];
			//	vend.Restock();
			//	vend.LastRestock = DateTime.Now;
			//}

			idx.Close();
			tdb.Close();
			bin.Close();
		}
        protected void SaveServices(SaveMetrics metrics)
        {
            Dictionary<CustomSerial, BaseService> services = World.Services;

            GenericWriter indexWriter;
            GenericWriter typeWriter;
            GenericWriter dataWriter;

            if (this.UseSequentialWriters)
            {
                indexWriter = new BinaryFileWriter(World.ServiceIndexPath, false);
                typeWriter = new BinaryFileWriter(World.ServiceTypesPath, false);
                dataWriter = new BinaryFileWriter(World.ServicesDataPath, true);
            }
            else
            {
                indexWriter = new AsyncWriter(World.ServiceIndexPath, false);
                typeWriter = new AsyncWriter(World.ServiceTypesPath, false);
                dataWriter = new AsyncWriter(World.ServicesDataPath, true);
            }

            indexWriter.Write(services.Count);

            foreach (BaseService service in services.Values)
            {
                long start = dataWriter.Position;

                indexWriter.Write(service._TypeID);
                indexWriter.Write((int)service.Serial);
                indexWriter.Write(start);

                service.Serialize(dataWriter);

                if (metrics != null)
                    metrics.OnServiceSaved((int)(dataWriter.Position - start));

                indexWriter.Write((int)(dataWriter.Position - start));
            }

            typeWriter.Write(World._ServiceTypes.Count);

            for (int i = 0; i < World._ServiceTypes.Count; ++i)
                typeWriter.Write(World._ServiceTypes[i].FullName);

            indexWriter.Close();
            typeWriter.Close();
            dataWriter.Close();
        }