From e55d7cb95177dceb53f874d02cd2d4ee53229335 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 24 Oct 2022 12:24:23 -0300 Subject: [PATCH] fix(Core/ObjectAcessor): Fix crash caused by forced character renames (#13527) --- src/server/game/Globals/ObjectAccessor.cpp | 11 +++++++++++ src/server/game/Globals/ObjectAccessor.h | 2 ++ src/server/scripts/Commands/cs_character.cpp | 2 ++ 3 files changed, 15 insertions(+) diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index 3eebae4d8..0e3a67ac3 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -100,6 +100,11 @@ namespace PlayerNameMapHolder PlayerNameMap.erase(p->GetName()); } + void RemoveByName(std::string const& name) + { + PlayerNameMap.erase(name); + } + Player* Find(std::string const& name) { std::string charName(name); @@ -290,3 +295,9 @@ void ObjectAccessor::RemoveObject(Player* player) HashMapHolder::Remove(player); PlayerNameMapHolder::Remove(player); } + +void ObjectAccessor::UpdatePlayerNameMapReference(std::string oldname, Player* player) +{ + PlayerNameMapHolder::RemoveByName(oldname); + PlayerNameMapHolder::Insert(player); +} diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index 41c3e0171..dd39251f0 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -106,6 +106,8 @@ namespace ObjectAccessor template<> void RemoveObject(Player* player); + + void UpdatePlayerNameMapReference(std::string oldname, Player* player); } #endif diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 3305748df..e720cda0d 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -381,6 +381,8 @@ public: { target->SetName(newName); + ObjectAccessor::UpdatePlayerNameMapReference(player->GetName(), target); + if (WorldSession* session = target->GetSession()) session->KickPlayer("HandleCharacterRenameCommand GM Command renaming character"); }