From 47630708f07b726cf8090c84cfa1d87b634609a0 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 10 Apr 2018 20:57:34 +0200 Subject: Core/Players: Prevent creating characters with duplicate name by reserving name early in the process Closes #21656 Closes #21809 (cherry picked from commit fdb2b90685ebc3852740c424170101a196c29ebb) --- src/server/game/Cache/CharacterCache.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/server/game/Cache/CharacterCache.cpp') diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp index a078c502e40..27b5dab47b6 100644 --- a/src/server/game/Cache/CharacterCache.cpp +++ b/src/server/game/Cache/CharacterCache.cpp @@ -30,6 +30,7 @@ namespace { std::unordered_map _characterCacheStore; std::unordered_map _characterCacheByNameStore; + std::unordered_set _characterCreationNameStore; } CharacterCache::CharacterCache() @@ -225,6 +226,21 @@ CharacterCacheEntry const* CharacterCache::GetCharacterCacheByName(std::string c return nullptr; } +std::shared_ptr CharacterCache::TryCreateCharacterWithName(std::string const& name) const +{ + auto itr = _characterCacheByNameStore.find(name); + if (itr != _characterCacheByNameStore.end()) + return nullptr; + + auto insertResult = _characterCreationNameStore.insert(name); + if (!insertResult.second) + return nullptr; + + // shared_ptr with custom deleter that erases its held value from _characterCreationNameStore instead of deleting it (points to value inside the container) + return std::shared_ptr(&(*insertResult.first), + [this](std::string const* storedName) { _characterCreationNameStore.erase(*storedName); }); +} + ObjectGuid CharacterCache::GetCharacterGuidByName(std::string const& name) const { auto itr = _characterCacheByNameStore.find(name); -- cgit v1.2.3