示例#1
0
        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();
                    }
                }
            }
        }
示例#2
0
        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;
        }
示例#3
0
        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;
                }
            }
        }
示例#4
0
        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 );
            }
        }