Changeset 88

Show
Ignore:
Timestamp:
11/19/08 13:33:06 (17 years ago)
Author:
yumileroy
Message:

[svn] * Added some player info cache to the core. Thanx to Rognar for patch, visaglis for testing and bugging me to add it.

Original author: KingPin?
Date: 2008-10-21 12:43:24-05:00

Location:
trunk/src/game
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/Guild.cpp

    r44 r88  
    364364    else 
    365365    { 
     366                PCachePlayerInfo pInfo = objmgr.GetPlayerInfoFromCache(GUID_LOPART(guid)); 
     367        if(pInfo) 
     368        { 
     369            plName = pInfo->sPlayerName; 
     370            plClass = pInfo->unClass; 
     371            if(plClass<CLASS_WARRIOR||plClass>=MAX_CLASSES)     // can be at broken `class` field 
     372            { 
     373                sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`class`.",GUID_LOPART(guid)); 
     374                return false; 
     375            } 
     376            plLevel = pInfo->unLevel; 
     377            plZone = Player::GetZoneIdFromDB(guid); 
     378        } 
     379        else 
     380        { 
    366381        if(!objmgr.GetPlayerNameByGUID(guid, plName))       // player doesn't exist 
    367382            return false; 
     
    387402        delete result; 
    388403    } 
     404        } 
    389405 
    390406    memslot->name = plName; 
  • trunk/src/game/ObjectMgr.cpp

    r85 r88  
    168168        delete (*itr); 
    169169 
     170    for (CachePlayerInfoMap::iterator itr = m_mPlayerInfoMap.begin(); itr != m_mPlayerInfoMap.end(); ++itr) 
     171        delete itr->second; 
     172 
    170173    for(ItemMap::iterator itr = mAitems.begin(); itr != mAitems.end(); ++itr) 
    171174        delete itr->second; 
     
    176179    for (CacheTrainerSpellMap::iterator itr = m_mCacheTrainerSpellMap.begin(); itr != m_mCacheTrainerSpellMap.end(); ++itr) 
    177180        itr->second.Clear(); 
     181} 
     182 
     183void ObjectMgr::LoadPlayerInfoInCache() 
     184{ 
     185    QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name, data, class  FROM characters"); 
     186    if(!result) 
     187    { 
     188        sLog.outError( "ROGNAR LoadPlayerCache"); 
     189        return; 
     190    } 
     191 
     192    PCachePlayerInfo pPPlayerInfo = NULL; 
     193    Field *fields = NULL; 
     194    Tokens tdata; 
     195    barGoLink bar( result->GetRowCount() ); 
     196    do 
     197    { 
     198        bar.step(); 
     199        fields = result->Fetch(); 
     200        pPPlayerInfo = new CachePlayerInfo(); 
     201 
     202        pPPlayerInfo->sPlayerName = fields[1].GetString(); 
     203 
     204        tdata.clear(); 
     205        tdata = StrSplit(fields[2].GetCppString(), " "); 
     206         
     207        pPPlayerInfo->unLevel = (uint32)atoi(tdata[UNIT_FIELD_LEVEL].c_str()); 
     208        pPPlayerInfo->unfield = (uint32)atoi(tdata[UNIT_FIELD_BYTES_0].c_str()); 
     209 
     210        pPPlayerInfo->unArenaInfoId0 = (uint32)atoi(tdata[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (0 * 6)].c_str()); 
     211        pPPlayerInfo->unArenaInfoId1 = (uint32)atoi(tdata[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (1 * 6)].c_str()); 
     212        pPPlayerInfo->unArenaInfoId2 = (uint32)atoi(tdata[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (2 * 6)].c_str()); 
     213 
     214        pPPlayerInfo->unArenaInfoSlot0 = (uint32)atoi(tdata[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 0 * 6 + 5].c_str()); 
     215        pPPlayerInfo->unArenaInfoSlot1 = (uint32)atoi(tdata[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 * 6 + 5].c_str()); 
     216        pPPlayerInfo->unArenaInfoSlot2 = (uint32)atoi(tdata[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 2 * 6 + 5].c_str()); 
     217     
     218        pPPlayerInfo->unClass = (uint32)fields[3].GetUInt32(); 
     219        m_mPlayerInfoMap[fields[0].GetUInt32()] = pPPlayerInfo; 
     220    } 
     221    while (result->NextRow()); 
     222    delete result; 
     223 
     224    sLog.outString(); 
     225    sLog.outString( ">> Loaded info about %d players", m_mPlayerInfoMap.size()); 
     226} 
     227 
     228PCachePlayerInfo ObjectMgr::GetPlayerInfoFromCache(uint32 unPlayerGuid) const 
     229{ 
     230    //Now m_mPlayerInfoMap is using only for search, but when dinamic inserting/removing 
     231    //will be implemented we should lock it to prevent simultaneous access. 
     232    //Inserting - when new created player is saving 
     233    //Removing - when player has been deleted 
     234    CachePlayerInfoMap::const_iterator ipos = m_mPlayerInfoMap.find(unPlayerGuid); 
     235    return ipos == m_mPlayerInfoMap.end() ? NULL : ipos->second; 
    178236} 
    179237 
     
    12591317    { 
    12601318        name = player->GetName(); 
     1319        return true; 
     1320    } 
     1321 
     1322    PCachePlayerInfo pInfo = GetPlayerInfoFromCache(GUID_LOPART(guid)); 
     1323    if(pInfo) 
     1324    { 
     1325        name = pInfo->sPlayerName.c_str(); 
    12611326        return true; 
    12621327    } 
  • trunk/src/game/ObjectMgr.h

    r85 r88  
    210210#define MAX_CONDITION                 11                    // maximum value in ConditionType enum 
    211211 
     212//Player's info 
     213typedef struct _tagCachePlayerInfo 
     214{ 
     215    std::string sPlayerName; 
     216    uint32 unfield; 
     217    uint32 unLevel; 
     218    uint8 unClass; 
     219//Arena 
     220    uint32 unArenaInfoId0; 
     221    uint32 unArenaInfoId1; 
     222    uint32 unArenaInfoId2; 
     223    uint32 unArenaInfoSlot0; 
     224    uint32 unArenaInfoSlot1; 
     225    uint32 unArenaInfoSlot2; 
     226}CachePlayerInfo, *PCachePlayerInfo; 
     227typedef HM_NAMESPACE::hash_map<uint32, PCachePlayerInfo> CachePlayerInfoMap; 
     228 
    212229struct PlayerCondition 
    213230{ 
     
    569586        uint32 GenerateItemTextID(); 
    570587        uint32 GeneratePetNumber(); 
     588         
     589        void LoadPlayerInfoInCache(); 
     590        PCachePlayerInfo GetPlayerInfoFromCache(uint32 unPlayerGuid) const; 
     591        CachePlayerInfoMap m_mPlayerInfoMap; 
    571592 
    572593        uint32 CreateItemText(std::string text); 
  • trunk/src/game/Player.cpp

    r78 r88  
    1362713627uint32 Player::GetUInt32ValueFromDB(uint16 index, uint64 guid) 
    1362813628{ 
     13629    //rognar optimization 
     13630    //must be improved!! "if" and "switch" - it's very not aesthetically :))) 
     13631    //but we should know whith data is cached 
     13632    //PLAYER_FIELD_ARENA_TEAM_INFO* very is often using with pvp&arena patch :) 
     13633    if(       index == PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 0 * 6 + 5 
     13634        || index == PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 * 6 + 5 
     13635        || index == PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 2 * 6 + 5 
     13636        || index == PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (0 * 6) 
     13637        || index == PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (1 * 6) 
     13638        || index == PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (2 * 6) 
     13639        || index == UNIT_FIELD_LEVEL) 
     13640    { 
     13641        CachePlayerInfoMap::iterator _iter = objmgr.m_mPlayerInfoMap.find(GUID_LOPART(guid)); 
     13642        if(_iter != objmgr.m_mPlayerInfoMap.end()) 
     13643        { 
     13644            switch(index) 
     13645            { 
     13646            case (PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 0 * 6 + 5): 
     13647                return _iter->second->unArenaInfoSlot0; 
     13648            case (PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 * 6 + 5): 
     13649                return _iter->second->unArenaInfoSlot1; 
     13650            case (PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 2 * 6 + 5): 
     13651                return _iter->second->unArenaInfoSlot2; 
     13652            case (PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (0 * 6)): 
     13653                return _iter->second->unArenaInfoId0; 
     13654            case (PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (1 * 6)): 
     13655                return _iter->second->unArenaInfoId1; 
     13656            case (PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (2 * 6)): 
     13657                return _iter->second->unArenaInfoId2; 
     13658            case (UNIT_FIELD_LEVEL): 
     13659                return _iter->second->unLevel; 
     13660            } 
     13661        } 
     13662    } 
    1362913663    Tokens data; 
    1363013664    if(!LoadValuesArrayFromDB(data,guid)) 
     
    1522015254    if(Pet* pet = GetPet()) 
    1522115255        pet->SavePetToDB(PET_SAVE_AS_CURRENT); 
     15256         
     15257    //to prevent access to DB we should cache some data, which is used very often 
     15258    CachePlayerInfoMap::iterator _iter = objmgr.m_mPlayerInfoMap.find(GetGUIDLow()); 
     15259    if(_iter != objmgr.m_mPlayerInfoMap.end())//skip new players 
     15260    { 
     15261        _iter->second->unLevel = getLevel(); 
     15262 
     15263        _iter->second->unArenaInfoSlot0 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 0 * 6 + 5); 
     15264        _iter->second->unArenaInfoSlot1 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 * 6 + 5); 
     15265        _iter->second->unArenaInfoSlot2 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 2 * 6 + 5); 
     15266 
     15267        _iter->second->unfield = GetUInt32Value(UNIT_FIELD_BYTES_0); 
     15268 
     15269        _iter->second->unArenaInfoId0 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (0 * 6)); 
     15270        _iter->second->unArenaInfoId1 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (1 * 6)); 
     15271        _iter->second->unArenaInfoId2 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (2 * 6)); 
     15272    } 
    1522215273} 
    1522315274 
  • trunk/src/game/World.cpp

    r85 r88  
    989989    objmgr.LoadPageTexts(); 
    990990 
     991    sLog.outString( "Loading Player info in cache..." ); 
     992    objmgr.LoadPlayerInfoInCache(); 
     993 
    991994    sLog.outString( "Loading Game Object Templates..." );   // must be after LoadPageTexts 
    992995    objmgr.LoadGameobjectInfo();