private static void LoadGuilds(string path, GuildEntry[] entries) { using (FileStream bin = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (BinaryReader binReader = new BinaryReader(bin)) { BinaryFileReader reader = new BinaryFileReader(binReader); try { LoadGuilds(reader, entries); } finally { reader.Close(); } } } }
private static GuildEntry[] LoadGuildIndex(BinaryReader idxReader) { int count = idxReader.ReadInt32(), skipped = 0; GuildEntry[] entries = new GuildEntry[count]; CreateGuildEventArgs createEventArgs = new CreateGuildEventArgs(-1); for (int i = 0; i < count; ++i) { idxReader.ReadInt32();//no typeid for guilds int id = idxReader.ReadInt32(); long pos = idxReader.ReadInt64(); int length = idxReader.ReadInt32(); createEventArgs.Id = id; BaseGuild guild = EventSink.InvokeCreateGuild(createEventArgs); if (guild == null) { ++skipped; continue; } entries[i] = new GuildEntry(guild, pos, length); } if (skipped > 0) { log.WarnFormat("{0} guilds were skipped", skipped); m_LoadErrors += skipped; } return entries; }
private static void LoadGuilds(BinaryFileReader reader, GuildEntry[] entries) { for (int i = 0; i < entries.Length; ++i) { GuildEntry entry = entries[i]; BaseGuild guild = (BaseGuild)entry.Object; if (guild == null) continue; reader.Seek(entry.Position, SeekOrigin.Begin); try { guild.Deserialize(reader); } catch (Exception e) { log.Error(String.Format("failed to load guild", guild), e); BaseGuild.List.Remove(guild.Id); entries[i].Clear(); ++m_LoadErrors; continue; } if (reader.Position != entry.Position + entry.Length) { log.ErrorFormat("Bad deserialize on guild {0}, type {1}: position={2}, should be {3}", guild.Id, guild.GetType(), reader.Position, entry.Position + entry.Length); BaseGuild.List.Remove(guild.Id); entries[i].Clear(); ++m_LoadErrors; } } }
private static void LoadEntities() { ItemEntry[] itemEntries = null; MobileEntry[] mobileEntries = null; GuildEntry[] guildEntries = null; RegionEntry[] regionEntries = null; if ( File.Exists( mobIdxPath ) && File.Exists( mobTdbPath ) ) { log.Debug("loading mobile index"); EntityType[] types = LoadTypes(mobTdbPath); mobileEntries = LoadMobileIndex(mobIdxPath, types); } else { m_Mobiles = new Hashtable(); } if ( File.Exists( itemIdxPath ) && File.Exists( itemTdbPath ) ) { log.Debug("loading item index"); EntityType[] types = LoadTypes(itemTdbPath); itemEntries = LoadItemIndex(itemIdxPath, types); } else { m_Items = new Hashtable(); } if ( File.Exists( guildIdxPath ) ) { log.Debug("loading guild index"); using ( FileStream idx = new FileStream( guildIdxPath, FileMode.Open, FileAccess.Read, FileShare.Read ) ) { BinaryReader idxReader = new BinaryReader( idx ); int count = idxReader.ReadInt32(); guildEntries = new GuildEntry[count]; CreateGuildEventArgs createEventArgs = new CreateGuildEventArgs( -1 ); for ( int i = 0; i < count; ++i ) { idxReader.ReadInt32();//no typeid for guilds int id = idxReader.ReadInt32(); long pos = idxReader.ReadInt64(); int length = idxReader.ReadInt32(); createEventArgs.Id = id; BaseGuild guild = EventSink.InvokeCreateGuild( createEventArgs );//new Guild( id ); if ( guild != null ) guildEntries[i] = new GuildEntry( guild, pos, length ); } idxReader.Close(); } } if ( File.Exists( regionIdxPath ) ) { log.Debug("loading region index"); using ( FileStream idx = new FileStream( regionIdxPath, FileMode.Open, FileAccess.Read, FileShare.Read ) ) { BinaryReader idxReader = new BinaryReader( idx ); int count = idxReader.ReadInt32(); regionEntries = new RegionEntry[count]; for ( int i = 0; i < count; ++i ) { idxReader.ReadInt32(); /* typeID */ int serial = idxReader.ReadInt32(); long pos = idxReader.ReadInt64(); int length = idxReader.ReadInt32(); Region r = Region.FindByUId( serial ); if ( r != null ) { regionEntries[i] = new RegionEntry( r, pos, length ); Region.AddRegion( r ); } } idxReader.Close(); } } bool failedMobiles = false, failedItems = false, failedGuilds = false, failedRegions = false; Type failedType = null; Serial failedSerial = Serial.Zero; Exception failed = null; int failedTypeID = 0; if ( File.Exists( mobBinPath ) ) { log.Debug("loading mobiles"); using ( FileStream bin = new FileStream( mobBinPath, FileMode.Open, FileAccess.Read, FileShare.Read ) ) { BinaryFileReader reader = new BinaryFileReader( new BinaryReader( bin ) ); for ( int i = 0; i < mobileEntries.Length; ++i ) { MobileEntry entry = mobileEntries[i]; Mobile m = (Mobile)entry.Object; if ( m != null ) { reader.Seek( entry.Position, SeekOrigin.Begin ); try { m_LoadingType = entry.TypeName; m.Deserialize( reader ); if ( reader.Position != (entry.Position + entry.Length) ) throw new Exception( String.Format( "***** Bad serialize on {0} *****", m.GetType() ) ); } catch ( Exception e ) { log.Error("failed to load mobile", e); mobileEntries[i].Clear(); failed = e; failedMobiles = true; failedType = m.GetType(); failedTypeID = entry.TypeID; failedSerial = m.Serial; break; } } } reader.Close(); } if (!failedMobiles) mobileEntries = null; } if ( !failedMobiles && File.Exists( itemBinPath ) ) { log.Debug("loading items"); using ( FileStream bin = new FileStream( itemBinPath, FileMode.Open, FileAccess.Read, FileShare.Read ) ) { BinaryFileReader reader = new BinaryFileReader( new BinaryReader( bin ) ); for ( int i = 0; i < itemEntries.Length; ++i ) { ItemEntry entry = itemEntries[i]; Item item = (Item)entry.Object; if ( item != null ) { reader.Seek( entry.Position, SeekOrigin.Begin ); try { m_LoadingType = entry.TypeName; item.Deserialize( reader ); if ( reader.Position != (entry.Position + entry.Length) ) throw new Exception( String.Format( "***** Bad serialize on {0} *****", item.GetType() ) ); } catch ( Exception e ) { log.Fatal("failed to load item", e); itemEntries[i].Clear(); failed = e; failedItems = true; failedType = item.GetType(); failedTypeID = entry.TypeID; failedSerial = item.Serial; break; } } } reader.Close(); } if (!failedItems) itemEntries = null; } if ( !failedMobiles && !failedItems && File.Exists( guildBinPath ) ) { log.Debug("loading guilds"); using ( FileStream bin = new FileStream( guildBinPath, FileMode.Open, FileAccess.Read, FileShare.Read ) ) { BinaryFileReader reader = new BinaryFileReader( new BinaryReader( bin ) ); for ( int i = 0; i < guildEntries.Length; ++i ) { GuildEntry entry = guildEntries[i]; BaseGuild g = (BaseGuild)entry.Object; if ( g != null ) { reader.Seek( entry.Position, SeekOrigin.Begin ); try { g.Deserialize( reader ); if ( reader.Position != (entry.Position + entry.Length) ) throw new Exception( String.Format( "***** Bad serialize on Guild {0} *****", g.Id ) ); } catch ( Exception e ) { log.Fatal("failed to load guild", e); guildEntries[i].Clear(); failed = e; failedGuilds = true; failedType = typeof( BaseGuild ); failedTypeID = g.Id; failedSerial = g.Id; break; } } } reader.Close(); } if (!failedGuilds) guildEntries = null; } if ( !failedMobiles && !failedItems && File.Exists( regionBinPath ) ) { log.Debug("loading regions"); using ( FileStream bin = new FileStream( regionBinPath, FileMode.Open, FileAccess.Read, FileShare.Read ) ) { BinaryFileReader reader = new BinaryFileReader( new BinaryReader( bin ) ); for ( int i = 0; i < regionEntries.Length; ++i ) { RegionEntry entry = regionEntries[i]; Region r = (Region)entry.Object; if ( r != null ) { reader.Seek( entry.Position, SeekOrigin.Begin ); try { r.Deserialize( reader ); if ( reader.Position != (entry.Position + entry.Length) ) throw new Exception( String.Format( "***** Bad serialize on {0} *****", r.GetType() ) ); } catch ( Exception e ) { log.Fatal("failed to load region", e); regionEntries[i].Clear(); failed = e; failedRegions = true; failedType = r.GetType(); failedTypeID = entry.TypeID; failedSerial = r.UId; break; } } } reader.Close(); } if (!failedRegions) regionEntries = null; } if ( failedItems || failedMobiles || failedGuilds || failedRegions ) { Console.WriteLine( "An error was encountered while loading a saved object" ); Console.WriteLine( " - Type: {0}", failedType ); Console.WriteLine( " - Serial: {0}", failedSerial ); Console.WriteLine( "Delete the object? (y/n)" ); if ( Console.ReadLine() == "y" ) { if ( failedType != typeof( BaseGuild ) && !failedType.IsSubclassOf( typeof( Region ) ) ) { Console.WriteLine( "Delete all objects of that type? (y/n)" ); if ( Console.ReadLine() == "y" ) { if ( failedMobiles ) { for ( int i = 0; i < mobileEntries.Length; ++i) { if (mobileEntries[i].TypeID == failedTypeID) mobileEntries[i].Clear(); } } else if ( failedItems ) { for ( int i = 0; i < itemEntries.Length; ++i) { if (itemEntries[i].TypeID == failedTypeID) itemEntries[i].Clear(); } } } } if (mobileEntries != null) SaveIndex( mobileEntries, mobIdxPath ); if (itemEntries != null) SaveIndex( itemEntries, itemIdxPath ); if (guildEntries != null) SaveIndex( guildEntries, guildIdxPath ); if (regionEntries != null) SaveIndex( regionEntries, regionIdxPath ); } Console.WriteLine( "After pressing return an exception will be thrown and the server will terminate" ); Console.ReadLine(); throw new Exception( String.Format( "Load failed (items={0}, mobiles={1}, guilds={2}, regions={3}, type={4}, serial={5})", failedItems, failedMobiles, failedGuilds, failedRegions, failedType, failedSerial ), failed ); } }