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; }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); //} }
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(); }