/// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static bool LoadDBCFiles( string strDirectory )
        {
            ConsoleProgressBar consoleProgressBar = new ConsoleProgressBar( 40 );
            consoleProgressBar.BeginStep( string.Format( "开始读取文件 {0}\\*.dbc", strDirectory ) );

            string strFileName = strDirectory + "\\AreaTable.dbc";
            if ( s_AreaTableEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\AuctionHouse.dbc";
            if ( s_AuctionHouseEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\BankBagSlotPrices.dbc";
            if ( s_BankBagSlotPricesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\BattlemasterList.dbc";
            if ( s_BattlemasterListEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ChatChannels.dbc";
            if ( s_ChatChannelsEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ChrClasses.dbc";
            if ( s_ChrClassesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ChrRaces.dbc";
            if ( s_ChrRacesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\CreatureFamily.dbc";
            if ( s_CreatureFamilyEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\CreatureSpellData.dbc";
            if ( s_CreatureSpellDataEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\DurabilityCosts.dbc";
            if ( s_DurabilityCostsEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\DurabilityQuality.dbc";
            if ( s_DurabilityQualityEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\EmotesText.dbc";
            if ( s_EmotesTextEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Faction.dbc";
            if ( s_FactionEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\FactionTemplate.dbc";
            if ( s_FactionTemplateEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\GemProperties.dbc";
            if ( s_GemPropertiesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ItemExtendedCost.dbc";
            if ( s_ItemExtendedCostEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ItemRandomProperties.dbc";
            if ( s_ItemRandomPropertiesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ItemSet.dbc";
            if ( s_ItemSetEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Lock.dbc";
            if ( s_LockEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Map.dbc";
            if ( s_MapEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\NameGen.dbc";
            if ( s_NameGenEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SkillLineAbility.dbc";
            if ( s_SkillLineAbilityEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SkillLine.dbc";
            if ( s_SkillLineEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellCastTimes.dbc";
            if ( s_SpellCastTimesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellDuration.dbc";
            if ( s_SpellDurationEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Spell.dbc";
            if ( s_SpellEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellItemEnchantmentCondition.dbc";
            if ( s_SpellItemEnchantmentConditionEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellItemEnchantment.dbc";
            if ( s_SpellItemEnchantmentEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellRadius.dbc";
            if ( s_SpellRadiusEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellRange.dbc";
            if ( s_SpellRangeEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\StableSlotPrices.dbc";
            if ( s_StableSlotPricesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Talent.dbc";
            if ( s_TalentEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TalentTab.dbc";
            if ( s_TalentTabEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TaxiNodes.dbc";
            if ( s_TaxiNodesEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TaxiPath.dbc";
            if ( s_TaxiPathEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TaxiPathNode.dbc";
            if ( s_TaxiPathNodeEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TransportAnimation.dbc";
            if ( s_TransportAnimationEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\WorldMapArea.dbc";
            if ( s_WorldMapAreaEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\WorldMapOverlay.dbc";
            if ( s_WorldMapOverlayEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\WorldSafeLocs.dbc";
            if ( s_WorldSafeLocsEntry.LoadFile( strFileName ) == false )
            {
                LOGs.WriteLine( LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName );

                return false;
            }
            consoleProgressBar.Step();

            consoleProgressBar.EndStep( string.Format( "完成读取文件 {0}\\*.dbc", strDirectory ) );

            // must be after sAreaStore and sMapStore loading
            for ( uint iIndex = 0; iIndex < s_AreaTableEntry.Count; ++iIndex )
            {
                AreaTableEntry areaTableEntry = s_AreaTableEntry.LookupRowEntry( iIndex );

                if ( areaTableEntry != null )
                {
                    // fill AreaId->DBC records
                    s_AreaFlagByAreaID.Add( areaTableEntry.ID, areaTableEntry.m_ExplorationFlag );

                    // fill MapId->DBC records
                    if ( areaTableEntry.m_ZoneId == 0 )   // not sub-zone
                    {
                        MapEntry mapEntry = s_MapEntry.LookupIDEntry( areaTableEntry.m_MapId );
                        if ( mapEntry == null )
                            continue;

                        if ( mapEntry.m_MapType != 0 /*MAP_COMMON*/) // 有不用的值?
                            s_AreaFlagByMapID[areaTableEntry.m_MapId] = areaTableEntry.m_ExplorationFlag;
                    }
                }
            }

            for ( uint iIndex = 0; iIndex < s_SpellEntry.Count; ++iIndex )
            {
                SpellEntry spellEntry = s_SpellEntry.LookupRowEntry( iIndex );
                if ( spellEntry == null )
                    continue;

                if ( spellEntry.m_Category != 0 )
                    s_SpellCategory.Add( spellEntry.m_Category, iIndex );
            }

            // create telent spells set
            for ( uint iIndex = 0; iIndex < s_TalentEntry.Count; ++iIndex )
            {
                TalentEntry talentEntry = s_TalentEntry.LookupRowEntry( iIndex );
                if ( talentEntry == null )
                    continue;

                if ( talentEntry.m_RankID1 != 0 )
                {
                    s_TalentSpellCosts.Add( talentEntry.m_RankID1, 1 );
                }

                if ( talentEntry.m_RankID2 != 0 )
                {
                    s_TalentSpellCosts.Add( talentEntry.m_RankID2, 2 );
                }

                if ( talentEntry.m_RankID3 != 0 )
                {
                    s_TalentSpellCosts.Add( talentEntry.m_RankID3, 3 );
                }

                if ( talentEntry.m_RankID4 != 0 )
                {
                    s_TalentSpellCosts.Add( talentEntry.m_RankID4, 4 );
                }

                if ( talentEntry.m_RankID5 != 0 )
                {
                    s_TalentSpellCosts.Add( talentEntry.m_RankID5, 5 );
                }
            }

            // Initialize global taxinodes mask
            for ( uint iIndex = 0; iIndex < s_TalentEntry.Count; ++iIndex )
            {
                TalentEntry talentEntry = s_TalentEntry.LookupRowEntry( iIndex );
                if ( talentEntry != null )
                {
                    uint field = ( iIndex / 32 );
                    uint submask = (uint)( 1 << (int)( iIndex % 32 ) );
                    s_TaxiNodesMask[field] |= submask;
                }
            }

            for ( uint iIndex = 0; iIndex < s_TaxiPathEntry.Count; ++iIndex )
            {
                TaxiPathEntry taxiPathEntry = s_TaxiPathEntry.LookupRowEntry( iIndex );
                if ( taxiPathEntry == null )
                    continue;

                Dictionary<uint, TaxiPathBySourceAndDestination> taxiPathSetForSource = null;
                s_TaxiPathSetBySource.TryGetValue( taxiPathEntry.m_From, out taxiPathSetForSource );

                if ( taxiPathSetForSource == null )
                {
                    taxiPathSetForSource = new Dictionary<uint, TaxiPathBySourceAndDestination>();
                    TaxiPathBySourceAndDestination taxiPathBySourceAndDestination = new TaxiPathBySourceAndDestination();
                    taxiPathBySourceAndDestination.m_ID = taxiPathEntry.ID;
                    taxiPathBySourceAndDestination.m_Price = taxiPathEntry.m_Price;

                    taxiPathSetForSource.Add( taxiPathEntry.m_To, taxiPathBySourceAndDestination );

                    s_TaxiPathSetBySource.Add( taxiPathEntry.m_From, taxiPathSetForSource );
                }
                else
                {
                    TaxiPathBySourceAndDestination taxiPathBySourceAndDestination = new TaxiPathBySourceAndDestination();
                    taxiPathBySourceAndDestination.m_ID = taxiPathEntry.ID;
                    taxiPathBySourceAndDestination.m_Price = taxiPathEntry.m_Price;

                    taxiPathSetForSource.Add( taxiPathEntry.m_To, taxiPathBySourceAndDestination );
                }
            }

            for ( uint iIndex = 0; iIndex < s_TaxiPathNodeEntry.Count; ++iIndex )
            {
                TaxiPathNodeEntry taxiPathNodeEntry = s_TaxiPathNodeEntry.LookupRowEntry( iIndex );
                if ( taxiPathNodeEntry == null )
                    continue;

                Dictionary<uint, TaxiPathNode> taxiPathNodeSeq = null;
                s_TaxiPathNodesByPath.TryGetValue( taxiPathNodeEntry.m_Path, out taxiPathNodeSeq );

                if ( taxiPathNodeSeq == null )
                {
                    taxiPathNodeSeq = new Dictionary<uint, TaxiPathNode>();
                    TaxiPathNode taxiPathNode = new TaxiPathNode();
                    taxiPathNode.m_MapId = taxiPathNodeEntry.m_MapId;
                    taxiPathNode.m_X = taxiPathNodeEntry.m_X;
                    taxiPathNode.m_Y = taxiPathNodeEntry.m_Y;
                    taxiPathNode.m_Z = taxiPathNodeEntry.m_Z;
                    taxiPathNode.m_ActionFlag = taxiPathNodeEntry.m_ActionFlag;
                    taxiPathNode.m_WaitTime = taxiPathNodeEntry.m_WaitTime;

                    taxiPathNodeSeq.Add( taxiPathNodeEntry.m_Seq, taxiPathNode );

                    s_TaxiPathNodesByPath.Add( taxiPathNodeEntry.m_Path, taxiPathNodeSeq );
                }
                else
                {
                    TaxiPathNode taxiPathNode = new TaxiPathNode();
                    taxiPathNode.m_MapId = taxiPathNodeEntry.m_MapId;
                    taxiPathNode.m_X = taxiPathNodeEntry.m_X;
                    taxiPathNode.m_Y = taxiPathNodeEntry.m_Y;
                    taxiPathNode.m_Z = taxiPathNodeEntry.m_Z;
                    taxiPathNode.m_ActionFlag = taxiPathNodeEntry.m_ActionFlag;
                    taxiPathNode.m_WaitTime = taxiPathNodeEntry.m_WaitTime;

                    taxiPathNodeSeq.Add( taxiPathNodeEntry.m_Seq, taxiPathNode );
                }
            }

            return false;
        }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public static bool LoadDBCFiles(string strDirectory)
        {
            ConsoleProgressBar consoleProgressBar = new ConsoleProgressBar(40);

            consoleProgressBar.BeginStep(string.Format("开始读取文件 {0}\\*.dbc", strDirectory));

            string strFileName = strDirectory + "\\AreaTable.dbc";

            if (s_AreaTableEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\AuctionHouse.dbc";
            if (s_AuctionHouseEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\BankBagSlotPrices.dbc";
            if (s_BankBagSlotPricesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\BattlemasterList.dbc";
            if (s_BattlemasterListEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ChatChannels.dbc";
            if (s_ChatChannelsEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ChrClasses.dbc";
            if (s_ChrClassesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ChrRaces.dbc";
            if (s_ChrRacesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\CreatureFamily.dbc";
            if (s_CreatureFamilyEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\CreatureSpellData.dbc";
            if (s_CreatureSpellDataEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\DurabilityCosts.dbc";
            if (s_DurabilityCostsEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\DurabilityQuality.dbc";
            if (s_DurabilityQualityEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\EmotesText.dbc";
            if (s_EmotesTextEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Faction.dbc";
            if (s_FactionEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\FactionTemplate.dbc";
            if (s_FactionTemplateEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\GemProperties.dbc";
            if (s_GemPropertiesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ItemExtendedCost.dbc";
            if (s_ItemExtendedCostEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ItemRandomProperties.dbc";
            if (s_ItemRandomPropertiesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\ItemSet.dbc";
            if (s_ItemSetEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Lock.dbc";
            if (s_LockEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Map.dbc";
            if (s_MapEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\NameGen.dbc";
            if (s_NameGenEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SkillLineAbility.dbc";
            if (s_SkillLineAbilityEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SkillLine.dbc";
            if (s_SkillLineEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellCastTimes.dbc";
            if (s_SpellCastTimesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellDuration.dbc";
            if (s_SpellDurationEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Spell.dbc";
            if (s_SpellEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellItemEnchantmentCondition.dbc";
            if (s_SpellItemEnchantmentConditionEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellItemEnchantment.dbc";
            if (s_SpellItemEnchantmentEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellRadius.dbc";
            if (s_SpellRadiusEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\SpellRange.dbc";
            if (s_SpellRangeEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\StableSlotPrices.dbc";
            if (s_StableSlotPricesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\Talent.dbc";
            if (s_TalentEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TalentTab.dbc";
            if (s_TalentTabEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TaxiNodes.dbc";
            if (s_TaxiNodesEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TaxiPath.dbc";
            if (s_TaxiPathEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TaxiPathNode.dbc";
            if (s_TaxiPathNodeEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\TransportAnimation.dbc";
            if (s_TransportAnimationEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\WorldMapArea.dbc";
            if (s_WorldMapAreaEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\WorldMapOverlay.dbc";
            if (s_WorldMapOverlayEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            strFileName = strDirectory + "\\WorldSafeLocs.dbc";
            if (s_WorldSafeLocsEntry.LoadFile(strFileName) == false)
            {
                LOGs.WriteLine(LogMessageType.MSG_ERROR, "读取文件 {0} 失败!", strFileName);

                return(false);
            }
            consoleProgressBar.Step();

            consoleProgressBar.EndStep(string.Format("完成读取文件 {0}\\*.dbc", strDirectory));

            // must be after sAreaStore and sMapStore loading
            for (uint iIndex = 0; iIndex < s_AreaTableEntry.Count; ++iIndex)
            {
                AreaTableEntry areaTableEntry = s_AreaTableEntry.LookupRowEntry(iIndex);

                if (areaTableEntry != null)
                {
                    // fill AreaId->DBC records
                    s_AreaFlagByAreaID.Add(areaTableEntry.ID, areaTableEntry.m_ExplorationFlag);

                    // fill MapId->DBC records
                    if (areaTableEntry.m_ZoneId == 0)     // not sub-zone
                    {
                        MapEntry mapEntry = s_MapEntry.LookupIDEntry(areaTableEntry.m_MapId);
                        if (mapEntry == null)
                        {
                            continue;
                        }

                        if (mapEntry.m_MapType != 0 /*MAP_COMMON*/)  // 有不用的值?
                        {
                            s_AreaFlagByMapID[areaTableEntry.m_MapId] = areaTableEntry.m_ExplorationFlag;
                        }
                    }
                }
            }

            for (uint iIndex = 0; iIndex < s_SpellEntry.Count; ++iIndex)
            {
                SpellEntry spellEntry = s_SpellEntry.LookupRowEntry(iIndex);
                if (spellEntry == null)
                {
                    continue;
                }

                if (spellEntry.m_Category != 0)
                {
                    s_SpellCategory.Add(spellEntry.m_Category, iIndex);
                }
            }

            // create telent spells set
            for (uint iIndex = 0; iIndex < s_TalentEntry.Count; ++iIndex)
            {
                TalentEntry talentEntry = s_TalentEntry.LookupRowEntry(iIndex);
                if (talentEntry == null)
                {
                    continue;
                }

                if (talentEntry.m_RankID1 != 0)
                {
                    s_TalentSpellCosts.Add(talentEntry.m_RankID1, 1);
                }

                if (talentEntry.m_RankID2 != 0)
                {
                    s_TalentSpellCosts.Add(talentEntry.m_RankID2, 2);
                }

                if (talentEntry.m_RankID3 != 0)
                {
                    s_TalentSpellCosts.Add(talentEntry.m_RankID3, 3);
                }

                if (talentEntry.m_RankID4 != 0)
                {
                    s_TalentSpellCosts.Add(talentEntry.m_RankID4, 4);
                }

                if (talentEntry.m_RankID5 != 0)
                {
                    s_TalentSpellCosts.Add(talentEntry.m_RankID5, 5);
                }
            }

            // Initialize global taxinodes mask
            for (uint iIndex = 0; iIndex < s_TalentEntry.Count; ++iIndex)
            {
                TalentEntry talentEntry = s_TalentEntry.LookupRowEntry(iIndex);
                if (talentEntry != null)
                {
                    uint field   = (iIndex / 32);
                    uint submask = (uint)(1 << (int)(iIndex % 32));
                    s_TaxiNodesMask[field] |= submask;
                }
            }

            for (uint iIndex = 0; iIndex < s_TaxiPathEntry.Count; ++iIndex)
            {
                TaxiPathEntry taxiPathEntry = s_TaxiPathEntry.LookupRowEntry(iIndex);
                if (taxiPathEntry == null)
                {
                    continue;
                }

                Dictionary <uint, TaxiPathBySourceAndDestination> taxiPathSetForSource = null;
                s_TaxiPathSetBySource.TryGetValue(taxiPathEntry.m_From, out taxiPathSetForSource);

                if (taxiPathSetForSource == null)
                {
                    taxiPathSetForSource = new Dictionary <uint, TaxiPathBySourceAndDestination>();
                    TaxiPathBySourceAndDestination taxiPathBySourceAndDestination = new TaxiPathBySourceAndDestination();
                    taxiPathBySourceAndDestination.m_ID    = taxiPathEntry.ID;
                    taxiPathBySourceAndDestination.m_Price = taxiPathEntry.m_Price;

                    taxiPathSetForSource.Add(taxiPathEntry.m_To, taxiPathBySourceAndDestination);

                    s_TaxiPathSetBySource.Add(taxiPathEntry.m_From, taxiPathSetForSource);
                }
                else
                {
                    TaxiPathBySourceAndDestination taxiPathBySourceAndDestination = new TaxiPathBySourceAndDestination();
                    taxiPathBySourceAndDestination.m_ID    = taxiPathEntry.ID;
                    taxiPathBySourceAndDestination.m_Price = taxiPathEntry.m_Price;

                    taxiPathSetForSource.Add(taxiPathEntry.m_To, taxiPathBySourceAndDestination);
                }
            }

            for (uint iIndex = 0; iIndex < s_TaxiPathNodeEntry.Count; ++iIndex)
            {
                TaxiPathNodeEntry taxiPathNodeEntry = s_TaxiPathNodeEntry.LookupRowEntry(iIndex);
                if (taxiPathNodeEntry == null)
                {
                    continue;
                }

                Dictionary <uint, TaxiPathNode> taxiPathNodeSeq = null;
                s_TaxiPathNodesByPath.TryGetValue(taxiPathNodeEntry.m_Path, out taxiPathNodeSeq);

                if (taxiPathNodeSeq == null)
                {
                    taxiPathNodeSeq = new Dictionary <uint, TaxiPathNode>();
                    TaxiPathNode taxiPathNode = new TaxiPathNode();
                    taxiPathNode.m_MapId      = taxiPathNodeEntry.m_MapId;
                    taxiPathNode.m_X          = taxiPathNodeEntry.m_X;
                    taxiPathNode.m_Y          = taxiPathNodeEntry.m_Y;
                    taxiPathNode.m_Z          = taxiPathNodeEntry.m_Z;
                    taxiPathNode.m_ActionFlag = taxiPathNodeEntry.m_ActionFlag;
                    taxiPathNode.m_WaitTime   = taxiPathNodeEntry.m_WaitTime;

                    taxiPathNodeSeq.Add(taxiPathNodeEntry.m_Seq, taxiPathNode);

                    s_TaxiPathNodesByPath.Add(taxiPathNodeEntry.m_Path, taxiPathNodeSeq);
                }
                else
                {
                    TaxiPathNode taxiPathNode = new TaxiPathNode();
                    taxiPathNode.m_MapId      = taxiPathNodeEntry.m_MapId;
                    taxiPathNode.m_X          = taxiPathNodeEntry.m_X;
                    taxiPathNode.m_Y          = taxiPathNodeEntry.m_Y;
                    taxiPathNode.m_Z          = taxiPathNodeEntry.m_Z;
                    taxiPathNode.m_ActionFlag = taxiPathNodeEntry.m_ActionFlag;
                    taxiPathNode.m_WaitTime   = taxiPathNodeEntry.m_WaitTime;

                    taxiPathNodeSeq.Add(taxiPathNodeEntry.m_Seq, taxiPathNode);
                }
            }

            return(false);
        }