diff options
-rw-r--r-- | src/server/game/Globals/ObjectAccessor.cpp | 74 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectAccessor.h | 6 |
2 files changed, 51 insertions, 29 deletions
diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index 808b418876a..2fc726e3601 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -76,6 +76,32 @@ boost::shared_mutex* HashMapHolder<T>::GetLock() 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()) @@ -224,40 +250,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 NULL; + 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 NULL; + return PlayerNameMapHolder::Find(name); } HashMapHolder<Player>::MapType const& ObjectAccessor::GetPlayers() @@ -273,3 +275,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); +} diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h index b75179b2211..1dae898e832 100644 --- a/src/server/game/Globals/ObjectAccessor.h +++ b/src/server/game/Globals/ObjectAccessor.h @@ -107,6 +107,12 @@ namespace ObjectAccessor HashMapHolder<T>::Remove(object); } + template<> + void AddObject(Player* player); + + template<> + void RemoveObject(Player* player); + TC_GAME_API void SaveAllPlayers(); }; |