diff --git a/include/blitz/components/PlayerRemove.h b/include/blitz/components/PlayerRemove.h new file mode 100644 index 0000000..e899bfa --- /dev/null +++ b/include/blitz/components/PlayerRemove.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace blitz { + +struct PlayerRemoveComponent {}; + +} // namespace blitz diff --git a/include/blitz/systems/RemovePlayersSystem.h b/include/blitz/systems/RemovePlayersSystem.h new file mode 100644 index 0000000..b4135e8 --- /dev/null +++ b/include/blitz/systems/RemovePlayersSystem.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +namespace blitz { + +class RemovePlayersSystem { + public: + RemovePlayersSystem(entt::registry&, EnttWorld& a_World); + + void Update(Nz::Time elapsedTime); + + private: + EnttWorld& m_World; +}; + +} // namespace blitz diff --git a/include/server/systems/DisconnectSystem.h b/include/server/systems/DisconnectSystem.h index da5c055..908a222 100644 --- a/include/server/systems/DisconnectSystem.h +++ b/include/server/systems/DisconnectSystem.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include namespace blitz { diff --git a/src/blitz/systems/RemovePlayersSystem.cpp b/src/blitz/systems/RemovePlayersSystem.cpp new file mode 100644 index 0000000..a3e6365 --- /dev/null +++ b/src/blitz/systems/RemovePlayersSystem.cpp @@ -0,0 +1,19 @@ +#include + +#include + +namespace blitz { + +RemovePlayersSystem::RemovePlayersSystem(entt::registry&, EnttWorld& a_World) : m_World(a_World) {} + +void RemovePlayersSystem::Update(Nz::Time /*elapsedTime*/) { + AtomicEnttWorld world = m_World; + + entt::registry& registry = world->GetRegistry(); + + auto invalidPlayers = registry.view(); + + registry.destroy(invalidPlayers.begin(), invalidPlayers.end()); +} + +} // namespace blitz diff --git a/src/client/handlers/PlayerLeaveHandler.cpp b/src/client/handlers/PlayerLeaveHandler.cpp index e0fe1c9..7ba5658 100644 --- a/src/client/handlers/PlayerLeaveHandler.cpp +++ b/src/client/handlers/PlayerLeaveHandler.cpp @@ -1,5 +1,7 @@ #include +#include + namespace blitz { namespace client { @@ -11,16 +13,12 @@ PlayerLeaveHandler::PlayerLeaveHandler(network::EnetConnection& a_Connection, En void PlayerLeaveHandler::Handle(const protocol::data::PlayerLeave& a_PlayerLeave) { AtomicEnttWorld world = m_World; - entt::entity playerLeft; - for (auto [player, playerInfo] : world->GetRegistry().view().each()) { if (playerInfo.m_PlayerId == a_PlayerLeave.m_PlayerId) { - playerLeft = player; + world->GetRegistry().emplace(player); break; } } - - world->GetRegistry().destroy(playerLeft); } PlayerLeaveHandler::~PlayerLeaveHandler() {} diff --git a/src/server/Server.cpp b/src/server/Server.cpp index 7c9fa39..63eab96 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -50,6 +51,7 @@ void Server::RegisterSystems() { AtomicEnttWorld world = m_World; world->AddSystem(m_World); world->AddSystem(m_World, *this); + world->AddSystem(m_World); auto counter = world->CreateEntity(); counter.emplace(0); diff --git a/src/server/systems/DisconnectSystem.cpp b/src/server/systems/DisconnectSystem.cpp index ab984fb..f85e2be 100644 --- a/src/server/systems/DisconnectSystem.cpp +++ b/src/server/systems/DisconnectSystem.cpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -38,7 +39,9 @@ void DisconectSystem::Update(Nz::Time elapsedTime) { }); // remove the entities - registry.destroy(disconnects.begin(), disconnects.end()); + for (auto entity : disconnects) { + registry.emplace(entity); + } } } // namespace server