aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Cache/CharacterCache.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-04-10 20:57:34 +0200
committerShauren <shauren.trinity@gmail.com>2018-04-10 20:57:34 +0200
commitfdb2b90685ebc3852740c424170101a196c29ebb (patch)
treeb99fb1fa315ffc4e9d4bcd46262de685491a79dc /src/server/game/Cache/CharacterCache.cpp
parent4fa4b6df567eee2bef072f4faeb874d99faeef75 (diff)
Core/Players: Prevent creating characters with duplicate name by reserving name early in the process
Closes #21656 Closes #21809
Diffstat (limited to 'src/server/game/Cache/CharacterCache.cpp')
-rw-r--r--src/server/game/Cache/CharacterCache.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp
index da119fc6cba..1bc9a4905a8 100644
--- a/src/server/game/Cache/CharacterCache.cpp
+++ b/src/server/game/Cache/CharacterCache.cpp
@@ -29,6 +29,7 @@ namespace
{
std::unordered_map<ObjectGuid, CharacterCacheEntry> _characterCacheStore;
std::unordered_map<std::string, CharacterCacheEntry*> _characterCacheByNameStore;
+ std::unordered_set<std::string> _characterCreationNameStore;
}
CharacterCache::CharacterCache()
@@ -201,6 +202,21 @@ CharacterCacheEntry const* CharacterCache::GetCharacterCacheByName(std::string c
return nullptr;
}
+std::shared_ptr<std::string const> 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<std::string const>(&(*insertResult.first),
+ [this](std::string const* storedName) { _characterCreationNameStore.erase(*storedName); });
+}
+
ObjectGuid CharacterCache::GetCharacterGuidByName(std::string const& name) const
{
auto itr = _characterCacheByNameStore.find(name);