diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-01-27 00:13:34 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-01-27 00:13:34 +0100 |
commit | d03e0d69353852636e12911a7f7149cb0bca40ef (patch) | |
tree | 40d27c133b50bf75a66218aa71e0c38f39d23371 /src/server/game | |
parent | 801b02bd529ab88bac8539bbcd0fc854b507f298 (diff) |
Core/Players: Fixed CharacterCache by-name storage holding data for deleted characters
Diffstat (limited to 'src/server/game')
-rw-r--r-- | src/server/game/Cache/CharacterCache.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Cache/CharacterCache.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 2 |
4 files changed, 12 insertions, 8 deletions
diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp index 20b0e1ffd9d..f424e5bd113 100644 --- a/src/server/game/Cache/CharacterCache.cpp +++ b/src/server/game/Cache/CharacterCache.cpp @@ -107,7 +107,8 @@ void CharacterCache::AddCharacterCacheEntry(ObjectGuid const& guid, uint32 accou data.IsDeleted = isDeleted; // Fill Name to Guid Store - _characterCacheByNameStore[name] = &data; + if (!isDeleted) + _characterCacheByNameStore[name] = &data; } void CharacterCache::DeleteCharacterCacheEntry(ObjectGuid const& guid, std::string const& name) @@ -186,16 +187,19 @@ void CharacterCache::UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 sl itr->second.ArenaTeamId[slot] = arenaTeamId; } -void CharacterCache::UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const* name /*=nullptr*/) +void CharacterCache::UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const& name /*=nullptr*/) { auto itr = _characterCacheStore.find(guid); if (itr == _characterCacheStore.end()) return; - itr->second.IsDeleted = deleted; + if (deleted) + _characterCacheByNameStore.erase(itr->second.Name); + else + _characterCacheByNameStore[name] = &itr->second; - if (name) - itr->second.Name = *name; + itr->second.Name = name; + itr->second.IsDeleted = deleted; } /* diff --git a/src/server/game/Cache/CharacterCache.h b/src/server/game/Cache/CharacterCache.h index 186ffa1474c..cd4b18bffb8 100644 --- a/src/server/game/Cache/CharacterCache.h +++ b/src/server/game/Cache/CharacterCache.h @@ -55,7 +55,7 @@ class TC_GAME_API CharacterCache void UpdateCharacterAccountId(ObjectGuid const& guid, uint32 accountId); void UpdateCharacterGuildId(ObjectGuid const& guid, ObjectGuid::LowType guildId); void UpdateCharacterArenaTeamId(ObjectGuid const& guid, uint8 slot, uint32 arenaTeamId); - void UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const* name = nullptr); + void UpdateCharacterInfoDeleted(ObjectGuid const& guid, bool deleted, std::string const& name); bool HasCharacterCacheEntry(ObjectGuid const& guid) const; CharacterCacheEntry const* GetCharacterCacheByGuid(ObjectGuid const& guid) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3300d0224ab..32e60333672 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4276,7 +4276,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO); stmt->setUInt64(0, guid); trans->Append(stmt); - sCharacterCache->UpdateCharacterInfoDeleted(playerguid, true); + sCharacterCache->UpdateCharacterInfoDeleted(playerguid, true, ""); break; } default: diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 767095bfd45..bc673388aac 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2797,7 +2797,7 @@ void WorldSession::HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCha loginStmt->setUInt32(0, GetBattlenetAccountId()); LoginDatabase.Execute(loginStmt); - sCharacterCache->UpdateCharacterInfoDeleted(undeleteInfo->CharacterGuid, false, &undeleteInfo->Name); + sCharacterCache->UpdateCharacterInfoDeleted(undeleteInfo->CharacterGuid, false, undeleteInfo->Name); SendUndeleteCharacterResponse(CHARACTER_UNDELETE_RESULT_OK, undeleteInfo.get()); })); |