aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Globals/ObjectAccessor.cpp74
-rw-r--r--src/server/game/Globals/ObjectAccessor.h6
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();
};