diff --git a/src/server/game/Cache/CharacterCache.cpp b/src/server/game/Cache/CharacterCache.cpp index 1bc9a4905a8..da119fc6cba 100644 --- a/src/server/game/Cache/CharacterCache.cpp +++ b/src/server/game/Cache/CharacterCache.cpp @@ -29,7 +29,6 @@ namespace { std::unordered_map _characterCacheStore; std::unordered_map _characterCacheByNameStore; - std::unordered_set _characterCreationNameStore; } CharacterCache::CharacterCache() @@ -202,21 +201,6 @@ 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); diff --git a/src/server/game/Cache/CharacterCache.h b/src/server/game/Cache/CharacterCache.h index 151b6dcba9e..ed3239410c4 100644 --- a/src/server/game/Cache/CharacterCache.h +++ b/src/server/game/Cache/CharacterCache.h @@ -55,7 +55,7 @@ class TC_GAME_API CharacterCache bool HasCharacterCacheEntry(ObjectGuid const& guid) const; CharacterCacheEntry const* GetCharacterCacheByGuid(ObjectGuid const& guid) const; CharacterCacheEntry const* GetCharacterCacheByName(std::string const& name) const; - std::shared_ptr TryCreateCharacterWithName(std::string const& name) const; + ObjectGuid GetCharacterGuidByName(std::string const& name) const; bool GetCharacterNameByGuid(ObjectGuid guid, std::string& name) const; uint32 GetCharacterTeamByGuid(ObjectGuid guid) const; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 1560fe5e08c..5ad626e5d62 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -427,14 +427,6 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) } } - // Reserve the name for the duration of callback chain - createInfo->NameToken = sCharacterCache->TryCreateCharacterWithName(createInfo->Name); - if (!createInfo->NameToken) - { - SendCharCreate(CHAR_CREATE_NAME_IN_USE); - return; - } - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME); stmt->setString(0, createInfo->Name); @@ -586,6 +578,13 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) return; } + // Check name uniqueness in the same step as saving to database + if (sCharacterCache->GetCharacterCacheByName(createInfo->Name)) + { + SendCharCreate(CHAR_CREATE_NAME_IN_USE); + return; + } + Player newChar(this); newChar.GetMotionMaster()->Initialize(); if (!newChar.Create(sObjectMgr->GetGenerator().Generate(), createInfo.get())) diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1546a8011f5..042bbddd54b 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -234,7 +234,6 @@ class CharacterCreateInfo /// Server side data uint8 CharCount = 0; - std::shared_ptr NameToken; }; struct CharacterRenameInfo