Client now responds to deleted entity and component in server
This commit is contained in:
@@ -79,6 +79,8 @@ private:
|
|||||||
void parsePing();
|
void parsePing();
|
||||||
void parseKick();
|
void parseKick();
|
||||||
void parsePlayersSpawned(Packet& packet);
|
void parsePlayersSpawned(Packet& packet);
|
||||||
|
void parseEntityDeletion(Packet& packet);
|
||||||
|
void parseComponentDeletion(Packet& packet);
|
||||||
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
||||||
void parseSnapshot(Packet& packet);
|
void parseSnapshot(Packet& packet);
|
||||||
void identifyPacketLoss();
|
void identifyPacketLoss();
|
||||||
@@ -92,6 +94,7 @@ private:
|
|||||||
// Returns if server EntityID exist in map
|
// Returns if server EntityID exist in map
|
||||||
bool serverClientMapsHasEntity(EntityID serverEntityID);
|
bool serverClientMapsHasEntity(EntityID serverEntityID);
|
||||||
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
||||||
|
void deleteFromServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ enum class MessageType
|
|||||||
PlayerConnected,
|
PlayerConnected,
|
||||||
BecomePlayer,
|
BecomePlayer,
|
||||||
Kick,
|
Kick,
|
||||||
OnPlayerSpawned
|
OnPlayerSpawned,
|
||||||
|
EntityDeleted,
|
||||||
|
ComponentDeleted
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
#include "Core/EPlayerDamage.h"
|
#include "Core/EPlayerDamage.h"
|
||||||
#include "Network/EPlayerDisconnected.h"
|
#include "Network/EPlayerDisconnected.h"
|
||||||
#include "Core/EPlayerSpawned.h"
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
#include "Core/EEntityDeleted.h"
|
||||||
|
#include "Core/EComponentDeleted.h"
|
||||||
|
|
||||||
class Server : public Network
|
class Server : public Network
|
||||||
{
|
{
|
||||||
@@ -83,6 +85,10 @@ private:
|
|||||||
bool OnInputCommand(const Events::InputCommand& e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
|
EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||||
|
EventRelay<Server, Events::EntityDeleted> m_EEntityDeleted;
|
||||||
|
bool OnEntityDeleted(const Events::EntityDeleted& e);
|
||||||
|
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
|
||||||
|
bool OnComponentDeleted(const Events::ComponentDeleted& e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -96,6 +96,12 @@ void Client::parseMessageType(Packet& packet)
|
|||||||
case MessageType::OnPlayerSpawned:
|
case MessageType::OnPlayerSpawned:
|
||||||
parsePlayersSpawned(packet);
|
parsePlayersSpawned(packet);
|
||||||
break;
|
break;
|
||||||
|
case MessageType::EntityDeleted:
|
||||||
|
parseEntityDeletion(packet);
|
||||||
|
break;
|
||||||
|
case MessageType::ComponentDeleted:
|
||||||
|
parseComponentDeletion(packet);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -142,6 +148,25 @@ void Client::parsePlayersSpawned(Packet& packet)
|
|||||||
m_EventBroker->Publish(e);
|
m_EventBroker->Publish(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::parseEntityDeletion(Packet & packet)
|
||||||
|
{
|
||||||
|
EntityID entityToDelete = packet.ReadPrimitive<EntityID>();
|
||||||
|
EntityID localEntity = m_ServerIDToClientID.at(entityToDelete);
|
||||||
|
if (m_World->ValidEntity(localEntity)) {
|
||||||
|
m_World->DeleteEntity(localEntity);
|
||||||
|
deleteFromServerClientMaps(entityToDelete, localEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::parseComponentDeletion(Packet & packet)
|
||||||
|
{
|
||||||
|
EntityID entity = packet.ReadPrimitive<EntityID>();
|
||||||
|
std::string componentType = packet.ReadString();
|
||||||
|
if (m_World->HasComponent(entity, componentType)) {
|
||||||
|
m_World->DeleteComponent(m_ServerIDToClientID.at(entity), componentType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Fields with strings will not work right now
|
// Fields with strings will not work right now
|
||||||
void Client::InterpolateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType)
|
void Client::InterpolateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType)
|
||||||
{
|
{
|
||||||
@@ -370,12 +395,26 @@ void Client::becomePlayer()
|
|||||||
|
|
||||||
bool Client::clientServerMapsHasEntity(EntityID clientEntityID)
|
bool Client::clientServerMapsHasEntity(EntityID clientEntityID)
|
||||||
{
|
{
|
||||||
return m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end();
|
if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) {
|
||||||
|
if (m_World->ValidEntity(clientEntityID)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
EntityID serverEntityID = m_ClientIDToServerID.at(clientEntityID);
|
||||||
|
deleteFromServerClientMaps(serverEntityID, clientEntityID);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Client::serverClientMapsHasEntity(EntityID serverEntityID)
|
bool Client::serverClientMapsHasEntity(EntityID serverEntityID)
|
||||||
{
|
{
|
||||||
return m_ServerIDToClientID.find(serverEntityID) != m_ServerIDToClientID.end();
|
if (m_ServerIDToClientID.find(serverEntityID) != m_ServerIDToClientID.end()) {
|
||||||
|
EntityID localEntityID = m_ServerIDToClientID.at(serverEntityID);
|
||||||
|
if (m_World->ValidEntity(localEntityID)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
deleteFromServerClientMaps(serverEntityID, localEntityID);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID)
|
void Client::insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID)
|
||||||
@@ -384,3 +423,9 @@ void Client::insertIntoServerClientMaps(EntityID serverEntityID, EntityID client
|
|||||||
m_ClientIDToServerID.insert(std::make_pair(clientEntityID, serverEntityID));
|
m_ClientIDToServerID.insert(std::make_pair(clientEntityID, serverEntityID));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::deleteFromServerClientMaps(EntityID serverEntityID, EntityID clientEntityID)
|
||||||
|
{
|
||||||
|
m_ServerIDToClientID.erase(serverEntityID);
|
||||||
|
m_ClientIDToServerID.erase(clientEntityID);
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ void Server::Start(World* world, EventBroker* eventBroker)
|
|||||||
// Subscribe to events
|
// Subscribe to events
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Server::OnInputCommand);
|
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Server::OnInputCommand);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &Server::OnPlayerSpawned);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &Server::OnPlayerSpawned);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &Server::OnEntityDeleted);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EComponentDeleted, &Server::OnComponentDeleted);
|
||||||
for (size_t i = 0; i < m_MaxConnections; i++) {
|
for (size_t i = 0; i < m_MaxConnections; i++) {
|
||||||
m_PlayerDefinitions[i].StopTime = std::clock();
|
m_PlayerDefinitions[i].StopTime = std::clock();
|
||||||
}
|
}
|
||||||
@@ -465,3 +467,24 @@ bool Server::OnPlayerSpawned(const Events::PlayerSpawned & e)
|
|||||||
send(e.PlayerID, packet);
|
send(e.PlayerID, packet);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Server::OnEntityDeleted(const Events::EntityDeleted & e)
|
||||||
|
{
|
||||||
|
if (!e.Cascaded) {
|
||||||
|
Packet packet = Packet(MessageType::EntityDeleted);
|
||||||
|
packet.WritePrimitive<EntityID>(e.DeletedEntity);
|
||||||
|
broadcast(packet);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Server::OnComponentDeleted(const Events::ComponentDeleted & e)
|
||||||
|
{
|
||||||
|
if (!e.Cascaded) {
|
||||||
|
Packet packet = Packet(MessageType::ComponentDeleted);
|
||||||
|
packet.WritePrimitive<EntityID>(e.Entity);
|
||||||
|
packet.WriteString(e.ComponentType);
|
||||||
|
broadcast(packet);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -77,7 +77,7 @@ Game::Game(int argc, char* argv[])
|
|||||||
// All systems with orderlevel 0 will be updated first.
|
// All systems with orderlevel 0 will be updated first.
|
||||||
unsigned int updateOrderLevel = 0;
|
unsigned int updateOrderLevel = 0;
|
||||||
m_SystemPipeline->AddSystem<RaptorCopterSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<RaptorCopterSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<HealthSystem>(updateOrderLevel);
|
//m_SystemPipeline->AddSystem<HealthSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<PlayerMovementSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<PlayerMovementSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<InterpolationSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<InterpolationSystem>(updateOrderLevel);
|
||||||
m_SystemPipeline->AddSystem<SpawnerSystem>(updateOrderLevel);
|
m_SystemPipeline->AddSystem<SpawnerSystem>(updateOrderLevel);
|
||||||
|
|||||||
Reference in New Issue
Block a user