From e3fd42f3d41cddd841d6d4e66f1e05a7887b9ed3 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 1 Jan 2024 09:57:57 -0300 Subject: [PATCH] =?UTF-8?q?feat(Core/World):=20Implement=20DoForAllPlayers?= =?UTF-8?q?()=20helper=20for=20all=20online=20p=E2=80=A6=20(#18060)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(Core/World): Implement DoForAllPlayers() helper for all online players * Update src/server/game/World/World.cpp Co-authored-by: Winfidonarleyan * Update src/server/game/World/World.cpp Co-authored-by: Winfidonarleyan * rename * Update WorldMock.h * Update WorldMock.h --------- Co-authored-by: Winfidonarleyan --- src/server/game/World/IWorld.h | 1 + src/server/game/World/World.cpp | 17 +++++++++++++++++ src/server/game/World/World.h | 2 ++ src/server/scripts/Commands/cs_reset.cpp | 7 +++---- src/test/mocks/WorldMock.h | 1 + 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index 3989daac7..227bba687 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -608,6 +608,7 @@ public: [[nodiscard]] virtual std::string const& GetRealmName() const = 0; virtual void SetRealmName(std::string name) = 0; virtual void RemoveOldCorpses() = 0; + virtual void DoForAllOnlinePlayers(std::function exec) = 0; }; #endif //AZEROTHCORE_IWORLD_H diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 4baf05a91..68a8e5075 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -3253,6 +3253,23 @@ void World::RemoveOldCorpses() _timers[WUPDATE_CORPSES].SetCurrent(_timers[WUPDATE_CORPSES].GetInterval()); } +void World::DoForAllOnlinePlayers(std::function exec) +{ + std::shared_lock lock(*HashMapHolder::GetLock()); + for (auto const& it : ObjectAccessor::GetPlayers()) + { + if (Player* player = it.second) + { + if (!player->IsInWorld()) + { + continue; + } + + exec(player); + } + } +} + bool World::IsPvPRealm() const { return getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP || getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_FFA_PVP; diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index eaf17a08e..375562a74 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -349,6 +349,8 @@ public: void RemoveOldCorpses() override; + void DoForAllOnlinePlayers(std::function exec) override; + protected: void _UpdateGameTime(); // callback for UpdateRealmCharacters diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index bd3ffeaa3..3a2ba01ac 100644 --- a/src/server/scripts/Commands/cs_reset.cpp +++ b/src/server/scripts/Commands/cs_reset.cpp @@ -290,10 +290,9 @@ public: stmt->SetData(0, uint16(atLogin)); CharacterDatabase.Execute(stmt); - std::shared_lock lock(*HashMapHolder::GetLock()); - HashMapHolder::MapType const& plist = ObjectAccessor::GetPlayers(); - for (auto itr = plist.begin(); itr != plist.end(); ++itr) - itr->second->SetAtLoginFlag(atLogin); + sWorld->DoForAllOnlinePlayers([&] (Player* player){ + player->SetAtLoginFlag(atLogin); + }); return true; } diff --git a/src/test/mocks/WorldMock.h b/src/test/mocks/WorldMock.h index acc3c1747..26a29463b 100644 --- a/src/test/mocks/WorldMock.h +++ b/src/test/mocks/WorldMock.h @@ -120,6 +120,7 @@ public: MOCK_METHOD(std::string const&, GetRealmName, (), (const)); MOCK_METHOD(void, SetRealmName, (std::string name), ()); MOCK_METHOD(void, RemoveOldCorpses, ()); + MOCK_METHOD(void, DoForAllOnlinePlayers, (std::function exec)); }; #pragma GCC diagnostic pop