Changeset 88
- Timestamp:
- 11/19/08 13:33:06 (17 years ago)
- Location:
- trunk/src/game
- Files:
-
- 5 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/game/Guild.cpp
r44 r88 364 364 else 365 365 { 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 { 366 381 if(!objmgr.GetPlayerNameByGUID(guid, plName)) // player doesn't exist 367 382 return false; … … 387 402 delete result; 388 403 } 404 } 389 405 390 406 memslot->name = plName; -
trunk/src/game/ObjectMgr.cpp
r85 r88 168 168 delete (*itr); 169 169 170 for (CachePlayerInfoMap::iterator itr = m_mPlayerInfoMap.begin(); itr != m_mPlayerInfoMap.end(); ++itr) 171 delete itr->second; 172 170 173 for(ItemMap::iterator itr = mAitems.begin(); itr != mAitems.end(); ++itr) 171 174 delete itr->second; … … 176 179 for (CacheTrainerSpellMap::iterator itr = m_mCacheTrainerSpellMap.begin(); itr != m_mCacheTrainerSpellMap.end(); ++itr) 177 180 itr->second.Clear(); 181 } 182 183 void 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 228 PCachePlayerInfo 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; 178 236 } 179 237 … … 1259 1317 { 1260 1318 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(); 1261 1326 return true; 1262 1327 } -
trunk/src/game/ObjectMgr.h
r85 r88 210 210 #define MAX_CONDITION 11 // maximum value in ConditionType enum 211 211 212 //Player's info 213 typedef 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; 227 typedef HM_NAMESPACE::hash_map<uint32, PCachePlayerInfo> CachePlayerInfoMap; 228 212 229 struct PlayerCondition 213 230 { … … 569 586 uint32 GenerateItemTextID(); 570 587 uint32 GeneratePetNumber(); 588 589 void LoadPlayerInfoInCache(); 590 PCachePlayerInfo GetPlayerInfoFromCache(uint32 unPlayerGuid) const; 591 CachePlayerInfoMap m_mPlayerInfoMap; 571 592 572 593 uint32 CreateItemText(std::string text); -
trunk/src/game/Player.cpp
r78 r88 13627 13627 uint32 Player::GetUInt32ValueFromDB(uint16 index, uint64 guid) 13628 13628 { 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 } 13629 13663 Tokens data; 13630 13664 if(!LoadValuesArrayFromDB(data,guid)) … … 15220 15254 if(Pet* pet = GetPet()) 15221 15255 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 } 15222 15273 } 15223 15274 -
trunk/src/game/World.cpp
r85 r88 989 989 objmgr.LoadPageTexts(); 990 990 991 sLog.outString( "Loading Player info in cache..." ); 992 objmgr.LoadPlayerInfoInCache(); 993 991 994 sLog.outString( "Loading Game Object Templates..." ); // must be after LoadPageTexts 992 995 objmgr.LoadGameobjectInfo();