better removal of players
This commit is contained in:
9
include/blitz/components/PlayerRemove.h
Normal file
9
include/blitz/components/PlayerRemove.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <blitz/common/Types.h>
|
||||||
|
|
||||||
|
namespace blitz {
|
||||||
|
|
||||||
|
struct PlayerRemoveComponent {};
|
||||||
|
|
||||||
|
} // namespace blitz
|
||||||
18
include/blitz/systems/RemovePlayersSystem.h
Normal file
18
include/blitz/systems/RemovePlayersSystem.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Nazara/Core/Time.hpp>
|
||||||
|
#include <blitz/common/Types.h>
|
||||||
|
|
||||||
|
namespace blitz {
|
||||||
|
|
||||||
|
class RemovePlayersSystem {
|
||||||
|
public:
|
||||||
|
RemovePlayersSystem(entt::registry&, EnttWorld& a_World);
|
||||||
|
|
||||||
|
void Update(Nz::Time elapsedTime);
|
||||||
|
|
||||||
|
private:
|
||||||
|
EnttWorld& m_World;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace blitz
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Nazara/Core/Time.hpp>
|
#include <Nazara/Core/Time.hpp>
|
||||||
#include <entt/entity/registry.hpp>
|
|
||||||
#include <blitz/common/Types.h>
|
#include <blitz/common/Types.h>
|
||||||
|
|
||||||
namespace blitz {
|
namespace blitz {
|
||||||
|
|||||||
19
src/blitz/systems/RemovePlayersSystem.cpp
Normal file
19
src/blitz/systems/RemovePlayersSystem.cpp
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#include <blitz/systems/RemovePlayersSystem.h>
|
||||||
|
|
||||||
|
#include <blitz/components/PlayerRemove.h>
|
||||||
|
|
||||||
|
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<PlayerRemoveComponent>();
|
||||||
|
|
||||||
|
registry.destroy(invalidPlayers.begin(), invalidPlayers.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blitz
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#include <client/handlers/PlayerLeaveHandler.h>
|
#include <client/handlers/PlayerLeaveHandler.h>
|
||||||
|
|
||||||
|
#include <blitz/components/PlayerRemove.h>
|
||||||
|
|
||||||
namespace blitz {
|
namespace blitz {
|
||||||
namespace client {
|
namespace client {
|
||||||
|
|
||||||
@@ -11,16 +13,12 @@ PlayerLeaveHandler::PlayerLeaveHandler(network::EnetConnection& a_Connection, En
|
|||||||
void PlayerLeaveHandler::Handle(const protocol::data::PlayerLeave& a_PlayerLeave) {
|
void PlayerLeaveHandler::Handle(const protocol::data::PlayerLeave& a_PlayerLeave) {
|
||||||
AtomicEnttWorld world = m_World;
|
AtomicEnttWorld world = m_World;
|
||||||
|
|
||||||
entt::entity playerLeft;
|
|
||||||
|
|
||||||
for (auto [player, playerInfo] : world->GetRegistry().view<PlayerInfoComponent>().each()) {
|
for (auto [player, playerInfo] : world->GetRegistry().view<PlayerInfoComponent>().each()) {
|
||||||
if (playerInfo.m_PlayerId == a_PlayerLeave.m_PlayerId) {
|
if (playerInfo.m_PlayerId == a_PlayerLeave.m_PlayerId) {
|
||||||
playerLeft = player;
|
world->GetRegistry().emplace<PlayerRemoveComponent>(player);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
world->GetRegistry().destroy(playerLeft);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerLeaveHandler::~PlayerLeaveHandler() {}
|
PlayerLeaveHandler::~PlayerLeaveHandler() {}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <server/handlers/KeepAliveHandler.h>
|
#include <server/handlers/KeepAliveHandler.h>
|
||||||
#include <server/handlers/PlayerLoginHandler.h>
|
#include <server/handlers/PlayerLoginHandler.h>
|
||||||
|
|
||||||
|
#include <blitz/systems/RemovePlayersSystem.h>
|
||||||
#include <server/systems/DisconnectSystem.h>
|
#include <server/systems/DisconnectSystem.h>
|
||||||
#include <server/systems/KeepAliveSystem.h>
|
#include <server/systems/KeepAliveSystem.h>
|
||||||
|
|
||||||
@@ -50,6 +51,7 @@ void Server::RegisterSystems() {
|
|||||||
AtomicEnttWorld world = m_World;
|
AtomicEnttWorld world = m_World;
|
||||||
world->AddSystem<KeepAliveSystem>(m_World);
|
world->AddSystem<KeepAliveSystem>(m_World);
|
||||||
world->AddSystem<DisconectSystem>(m_World, *this);
|
world->AddSystem<DisconectSystem>(m_World, *this);
|
||||||
|
world->AddSystem<RemovePlayersSystem>(m_World);
|
||||||
|
|
||||||
auto counter = world->CreateEntity();
|
auto counter = world->CreateEntity();
|
||||||
counter.emplace<ServerIdCounterComponent>(0);
|
counter.emplace<ServerIdCounterComponent>(0);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <server/components/Disconnect.h>
|
#include <server/components/Disconnect.h>
|
||||||
#include <server/components/EnetConnection.h>
|
#include <server/components/EnetConnection.h>
|
||||||
|
#include <blitz/components/PlayerRemove.h>
|
||||||
|
|
||||||
#include <server/Server.h>
|
#include <server/Server.h>
|
||||||
|
|
||||||
@@ -38,7 +39,9 @@ void DisconectSystem::Update(Nz::Time elapsedTime) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// remove the entities
|
// remove the entities
|
||||||
registry.destroy(disconnects.begin(), disconnects.end());
|
for (auto entity : disconnects) {
|
||||||
|
registry.emplace<PlayerRemoveComponent>(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace server
|
} // namespace server
|
||||||
|
|||||||
Reference in New Issue
Block a user