Changeset 20

Show
Ignore:
Timestamp:
09/20/09 20:13:24 (2 years ago)
Author:
valroft
Message:

- Reduced the memory overhead of achievements significantly.
- Changed the number of possibly criteria per achievement to be completely dependent on how many there actually are.
- To save memory, achievement counters will not be loaded for achievements that are already completed. This affects nothing in-game.
- Run the SQL update 2009_09_20_achievements.sql, or large achievements will not save!

Location:
trunk
Files:
1 added
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/hearthstone-shared/Database/DBCStores.h

    r15 r20  
    4646        //uint32 refAchievement; // 61 
    4747 
    48         uint32 AssociatedCriteria[32]; // Custom stuff 
     48        std::vector<uint32>* AssociatedCriteria; // Custom stuff 
    4949        uint32 AssociatedCriteriaCount; 
    5050}; 
  • trunk/src/hearthstone-world/AchievementInterface.cpp

    r7 r20  
    3434                for(; itr != m_achivementDataMap.end(); ++itr) 
    3535                { 
     36                        delete [] itr->second->counter; 
    3637                        delete itr->second; 
    3738                } 
     
    6061                ad->id = achievementid; 
    6162                ad->num_criterias = ae->AssociatedCriteriaCount; 
     63                if(  !completed ) // save us memory! don't allocate our counters unless we're actually still working. :D 
     64                { 
     65                        ad->counter = new uint32[ae->AssociatedCriteriaCount]; 
     66                        memset(ad->counter, 0, sizeof(uint32)*ae->AssociatedCriteriaCount); 
     67                } 
    6268                ad->completed = completed; 
    6369                ad->date = fields[3].GetUInt32(); 
     
    6773 
    6874                vector<string> Delim = StrSplit( criteriaprogress, "," ); 
    69                 for( uint32 i = 0; i < 32; ++i) 
     75                for( uint32 i = 0; !completed && i < ae->AssociatedCriteriaCount; ++i) 
    7076                { 
    7177                        if( i >= Delim.size() ) 
     
    149155                        for(uint32 i = 0; i < ae->AssociatedCriteriaCount; ++i) 
    150156                        { 
    151                                 *data << uint32( ae->AssociatedCriteria[i] ); 
     157                                *data << uint32( ae->AssociatedCriteria->at(i) ); 
    152158                                uint32 counterVar = itr->second->counter[i]; 
    153159                                FastGUIDPack( *data, counterVar ); 
     
    265271        ad->id = ae->ID; 
    266272        ad->num_criterias = ae->AssociatedCriteriaCount; 
     273        ad->counter = new uint32[ae->AssociatedCriteriaCount]; 
     274        memset(ad->counter, 0, sizeof(uint32)*ae->AssociatedCriteriaCount); 
    267275        ad->m_isDirty = true; 
    268276        m_achivementDataMap.insert( make_pair( ad->id, ad ) ); 
     
    286294        { 
    287295                bool thisFail = false; 
    288                 AchievementCriteriaEntry * ace = dbcAchivementCriteria.LookupEntry(ach->AssociatedCriteria[i]); 
     296                AchievementCriteriaEntry * ace = dbcAchivementCriteria.LookupEntry(ach->AssociatedCriteria->at(i)); 
    289297                uint32 ReqCount = ace->raw.field4 ? ace->raw.field4 : 1; 
    290298 
     
    340348        WorldPacket data(SMSG_CRITERIA_UPDATE, 50); 
    341349        AchievementEntry * ae = dbcAchievement.LookupEntry(ad->id); 
    342         data << uint32(ae->AssociatedCriteria[idx]); 
     350        data << uint32(ae->AssociatedCriteria->at(idx)); 
    343351        FastGUIDPack( data, (uint64)ad->counter[idx] ); 
    344352        data << m_player.GetNewGUID();    
     
    376384                for(uint32 i = 0; i < ad->num_criterias; ++i) 
    377385                { 
    378                         uint32 CriteriaID = ae->AssociatedCriteria[i]; 
     386                        uint32 CriteriaID = ae->AssociatedCriteria->at(i); 
    379387                        AchievementCriteriaEntry * ace = dbcAchivementCriteria.LookupEntry( CriteriaID ); 
    380388                        if( ad->counter[i] && ace->raw.additionalRequirement1_type & ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH ) 
     
    423431                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    424432                { 
    425                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     433                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    426434                        if( compareCriteria == ace ) 
    427435                        { 
     
    469477                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    470478                { 
    471                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     479                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    472480                        if( compareCriteria == ace ) 
    473481                        { 
     
    554562                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    555563                { 
    556                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     564                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    557565                        if( compareCriteria == ace ) 
    558566                        { 
     
    630638                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    631639                { 
    632                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     640                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    633641                        if( compareCriteria == ace ) 
    634642                        { 
     
    673681                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    674682                { 
    675                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     683                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    676684                        if( compareCriteria == ace ) 
    677685                        { 
     
    718726                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    719727                { 
    720                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     728                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    721729                        if( compareCriteria == ace ) 
    722730                        { 
     
    757765                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    758766                { 
    759                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     767                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    760768                        if( compareCriteria == ace ) 
    761769                        { 
     
    800808                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    801809                { 
    802                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     810                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    803811                        if( compareCriteria == ace ) 
    804812                        { 
     
    843851                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    844852                { 
    845                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     853                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    846854                        if( compareCriteria == ace ) 
    847855                        { 
     
    881889                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    882890                { 
    883                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     891                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    884892                        if( compareCriteria == ace ) 
    885893                        { 
     
    919927                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    920928                { 
    921                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     929                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    922930                        if( compareCriteria == ace ) 
    923931                        { 
     
    959967                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    960968                { 
    961                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     969                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    962970                        if( compareCriteria == ace ) 
    963971                        { 
     
    10061014                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    10071015                { 
    1008                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1016                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    10091017                        if( compareCriteria == ace ) 
    10101018                        { 
     
    10621070                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    10631071                { 
    1064                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1072                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    10651073                        if( compareCriteria == ace ) 
    10661074                        { 
     
    11041112                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    11051113                { 
    1106                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1114                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    11071115                        if( compareCriteria == ace ) 
    11081116                        { 
     
    11871195                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    11881196                { 
    1189                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1197                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    11901198                        if( compareCriteria == ace ) 
    11911199                        { 
     
    12301238                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    12311239                { 
    1232                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1240                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    12331241                        if( compareCriteria == ace ) 
    12341242                        { 
     
    12731281                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    12741282                { 
    1275                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1283                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    12761284                        if( compareCriteria == ace ) 
    12771285                        { 
     
    13121320                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    13131321                { 
    1314                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1322                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    13151323                        if( compareCriteria == ace ) 
    13161324                        { 
     
    13511359                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    13521360                { 
    1353                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1361                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    13541362                        if( compareCriteria == ace ) 
    13551363                        { 
     
    13931401                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    13941402                { 
    1395                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1403                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    13961404                        if( compareCriteria == ace ) 
    13971405                        { 
     
    14311439                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    14321440                { 
    1433                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1441                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    14341442                        if( compareCriteria == ace ) 
    14351443                        { 
     
    14691477                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    14701478                { 
    1471                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1479                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    14721480                        if( compareCriteria == ace ) 
    14731481                        { 
     
    15131521                for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) 
    15141522                { 
    1515                         compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] );                         
     1523                        compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria->at(i) );                     
    15161524                        if( compareCriteria == ace ) 
    15171525                        { 
  • trunk/src/hearthstone-world/AchievementInterface.h

    r7 r20  
    2626{ 
    2727        uint32 id; 
    28         uint32 counter[32]; 
     28        uint32* counter; 
    2929 
    3030        uint32 date; 
  • trunk/src/hearthstone-world/ObjectMgr.cpp

    r19 r20  
    189189                delete (itr->second); 
    190190 
    191         Log.Notice("ObjectMgr", "Deleting Achievement Quest Map..."); 
    192         for(map<uint32,set<Quest*>*>::iterator qitr = ZoneToQuestMap.begin(); qitr != ZoneToQuestMap.end(); ++qitr) 
    193                 delete qitr->second; 
     191        AchievementEntry* ae; 
     192        for(uint32 i = 0; i < dbcAchivementCriteria.GetNumRows(); ++i) 
     193        { 
     194                ae = dbcAchievement.LookupRow(i); 
     195                if( ae ) 
     196                { 
     197                        delete ae->AssociatedCriteria; 
     198                } 
     199        } 
    194200} 
    195201void ObjectMgr::LoadAchievements() 
     
    200206                if(ae) 
    201207                { 
     208                        ae->AssociatedCriteria = new vector<uint32>; 
    202209                        ae->AssociatedCriteriaCount = 0; 
    203210                } 
     
    227234                        if( ae ) 
    228235                        { 
    229                                 if(ae->AssociatedCriteriaCount >= 32) continue; 
    230                                 ae->AssociatedCriteria[ ae->AssociatedCriteriaCount ] = ace->ID; 
     236                                //if(ae->AssociatedCriteriaCount >= 32) continue; 
     237                                ae->AssociatedCriteria->push_back( ace->ID ); 
     238                                //ae->AssociatedCriteria[ ae->AssociatedCriteriaCount ] = ace->ID; 
    231239                                ae->AssociatedCriteriaCount++; 
    232240                        } 
    233                 } 
    234         } 
    235  
    236         // For Achievements: Complete Quest by Zone Id 
    237         StorageContainerIterator<Quest> * itr = QuestStorage.MakeIterator(); 
    238         for(; !itr->AtEnd(); itr->Inc() ) 
    239         { 
    240                 Quest * pQuest = itr->Get(); 
    241                 if(!pQuest) continue; 
    242  
    243                 uint32 QuestZone = pQuest->zone_id; 
    244                 map<uint32,set<Quest*>*>::iterator qitr = ZoneToQuestMap.find( QuestZone ); 
    245                 if( qitr == ZoneToQuestMap.end() ) 
    246                 { 
    247                         // We don't have any entries for this zone yet. 
    248                         set<Quest*>* mySet = new set<Quest*>; 
    249                         mySet->insert( pQuest ); 
    250                         ZoneToQuestMap.insert( make_pair( QuestZone, mySet ) ); 
    251                 } 
    252                 else 
    253                 { 
    254                         set<Quest*>* thisSet = qitr->second; 
    255                         thisSet->insert( pQuest ); 
    256241                } 
    257242        } 
  • trunk/src/hearthstone-world/ObjectMgr.h

    r19 r20  
    435435        Guild* GetGuildByGuildName(std::string guildName); 
    436436 
    437         map<uint32,set<Quest*>*> ZoneToQuestMap; 
    438437        void LoadAchievements(); 
    439438