aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-01-27 00:13:34 +0100
committerShauren <shauren.trinity@gmail.com>2024-01-27 00:13:34 +0100
commitd03e0d69353852636e12911a7f7149cb0bca40ef (patch)
tree40d27c133b50bf75a66218aa71e0c38f39d23371 /src/server
parent801b02bd529ab88bac8539bbcd0fc854b507f298 (diff)
Core/Players: Fixed CharacterCache by-name storage holding data for deleted characters
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Cache/CharacterCache.cpp14
-rw-r--r--src/server/game/Cache/CharacterCache.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp2
-rw-r--r--src/server/scripts/Commands/cs_character.cpp2
5 files changed, 13 insertions, 9 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());
}));
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp
index 030fc907d70..58f6d982f08 100644
--- a/src/server/scripts/Commands/cs_character.cpp
+++ b/src/server/scripts/Commands/cs_character.cpp
@@ -231,7 +231,7 @@ public:
stmt->setUInt64(2, delInfo.guid.GetCounter());
CharacterDatabase.Execute(stmt);
- sCharacterCache->UpdateCharacterInfoDeleted(delInfo.guid, false, &delInfo.name);
+ sCharacterCache->UpdateCharacterInfoDeleted(delInfo.guid, false, delInfo.name);
}
static bool HandleCharacterTitlesCommand(ChatHandler* handler, Optional<PlayerIdentifier> player)