mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 16:38:42 +01:00
Core/ObjectAccessor: optimize FindPlayerByName by saving a map of player names to Player
This commit is contained in:
@@ -81,6 +81,32 @@ HashMapHolder<Player>::MapType const& ObjectAccessor::GetPlayers()
|
||||
template class TC_GAME_API HashMapHolder<Player>;
|
||||
template class TC_GAME_API HashMapHolder<Transport>;
|
||||
|
||||
namespace PlayerNameMapHolder
|
||||
{
|
||||
typedef std::unordered_map<std::string, Player*> MapType;
|
||||
static MapType PlayerNameMap;
|
||||
|
||||
void Insert(Player* p)
|
||||
{
|
||||
PlayerNameMap[p->GetName()] = p;
|
||||
}
|
||||
|
||||
void Remove(Player* p)
|
||||
{
|
||||
PlayerNameMap.erase(p->GetName());
|
||||
}
|
||||
|
||||
Player* Find(std::string const& name)
|
||||
{
|
||||
std::string charName(name);
|
||||
if (!normalizePlayerName(charName))
|
||||
return nullptr;
|
||||
|
||||
auto itr = PlayerNameMap.find(charName);
|
||||
return (itr != PlayerNameMap.end()) ? itr->second : nullptr;
|
||||
}
|
||||
} // namespace PlayerNameMapHolder
|
||||
|
||||
WorldObject* ObjectAccessor::GetWorldObject(WorldObject const& p, ObjectGuid const& guid)
|
||||
{
|
||||
switch (guid.GetHigh())
|
||||
@@ -226,40 +252,16 @@ Player* ObjectAccessor::FindConnectedPlayer(ObjectGuid const& guid)
|
||||
|
||||
Player* ObjectAccessor::FindPlayerByName(std::string const& name)
|
||||
{
|
||||
boost::shared_lock<boost::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
|
||||
Player* player = PlayerNameMapHolder::Find(name);
|
||||
if (!player || !player->IsInWorld())
|
||||
return nullptr;
|
||||
|
||||
std::string nameStr = name;
|
||||
std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower);
|
||||
HashMapHolder<Player>::MapType const& m = GetPlayers();
|
||||
for (HashMapHolder<Player>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
|
||||
{
|
||||
if (!iter->second->IsInWorld())
|
||||
continue;
|
||||
std::string currentName = iter->second->GetName();
|
||||
std::transform(currentName.begin(), currentName.end(), currentName.begin(), ::tolower);
|
||||
if (nameStr.compare(currentName) == 0)
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return player;
|
||||
}
|
||||
|
||||
Player* ObjectAccessor::FindConnectedPlayerByName(std::string const& name)
|
||||
{
|
||||
boost::shared_lock<boost::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
|
||||
|
||||
std::string nameStr = name;
|
||||
std::transform(nameStr.begin(), nameStr.end(), nameStr.begin(), ::tolower);
|
||||
HashMapHolder<Player>::MapType const& m = GetPlayers();
|
||||
for (HashMapHolder<Player>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
|
||||
{
|
||||
std::string currentName = iter->second->GetName();
|
||||
std::transform(currentName.begin(), currentName.end(), currentName.begin(), ::tolower);
|
||||
if (nameStr.compare(currentName) == 0)
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return PlayerNameMapHolder::Find(name);
|
||||
}
|
||||
|
||||
void ObjectAccessor::SaveAllPlayers()
|
||||
@@ -270,3 +272,17 @@ void ObjectAccessor::SaveAllPlayers()
|
||||
for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
|
||||
itr->second->SaveToDB();
|
||||
}
|
||||
|
||||
template<>
|
||||
void ObjectAccessor::AddObject(Player* player)
|
||||
{
|
||||
HashMapHolder<Player>::Insert(player);
|
||||
PlayerNameMapHolder::Insert(player);
|
||||
}
|
||||
|
||||
template<>
|
||||
void ObjectAccessor::RemoveObject(Player* player)
|
||||
{
|
||||
HashMapHolder<Player>::Remove(player);
|
||||
PlayerNameMapHolder::Remove(player);
|
||||
}
|
||||
|
||||
@@ -106,6 +106,12 @@ namespace ObjectAccessor
|
||||
HashMapHolder<T>::Remove(object);
|
||||
}
|
||||
|
||||
template<>
|
||||
void AddObject(Player* player);
|
||||
|
||||
template<>
|
||||
void RemoveObject(Player* player);
|
||||
|
||||
TC_GAME_API void SaveAllPlayers();
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user