From 56d02ad8d416dcc88178ba30aeb87f3428e46191 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 7 Mar 2014 22:09:50 +1100 Subject: [PATCH] Working on reimplementing the player characters I've also added EraseIf() to the manager classes. --- server/client_manager.cpp | 13 ++++++++++++- server/client_manager.hpp | 8 ++++---- server/player_manager.cpp | 13 ++++++++++++- server/player_manager.hpp | 8 ++++---- server/server_application.cpp | 29 ++++++++++++++++++----------- server/server_application.hpp | 10 ++++++---- 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/server/client_manager.cpp b/server/client_manager.cpp index a4d9800..bfcd0a5 100644 --- a/server/client_manager.cpp +++ b/server/client_manager.cpp @@ -38,12 +38,23 @@ int ClientManager::HandleDisconnection(int i) { return -1; } -void ClientManager::ForEach(Lambda fn) { +void ClientManager::ForEach(std::function fn) { for(Iterator it = clientMap.begin(); it != clientMap.end(); it++) { fn(it); } } +void ClientManager::EraseIf(std::function fn) { + for(Iterator it = clientMap.begin(); it != clientMap.end(); /* empty */) { + if(fn(it)) { + it = clientMap.erase(it); + } + else { + ++it; + } + } +} + ClientEntry* ClientManager::GetClient(int i) { for (auto& it : clientMap) { if (it.first == i) { diff --git a/server/client_manager.hpp b/server/client_manager.hpp index 946c946..6f189d4 100644 --- a/server/client_manager.hpp +++ b/server/client_manager.hpp @@ -34,16 +34,16 @@ struct ClientEntry { class ClientManager { public: //clarity typedefs - typedef std::map Container; - typedef Container::iterator Iterator; - typedef std::function Lambda; + typedef std::map Container; + typedef Container::iterator Iterator; //returns the internal index int HandleConnection(IPaddress); int HandleDisconnection(int i); //lambdas - void ForEach(Lambda); + void ForEach(std::function fn); + void EraseIf(std::function fn); //accessors ClientEntry* GetClient(int i); diff --git a/server/player_manager.cpp b/server/player_manager.cpp index d5bfebe..7b08374 100644 --- a/server/player_manager.cpp +++ b/server/player_manager.cpp @@ -37,12 +37,23 @@ int PlayerManager::HandlePlayerUnload(int uniqueID) { // } -void PlayerManager::ForEach(Lambda fn) { +void PlayerManager::ForEach(std::function fn) { for(Iterator it = playerMap.begin(); it != playerMap.end(); it++) { fn(it); } } +void PlayerManager::EraseIf(std::function fn) { + for(Iterator it = playerMap.begin(); it != playerMap.end(); /* empty */) { + if(fn(it)) { + it = playerMap.erase(it); + } + else { + ++it; + } + } +} + PlayerEntry* PlayerManager::GetPlayer(int uniqueID) { for (auto& it : playerMap) { if (it.first == uniqueID) { diff --git a/server/player_manager.hpp b/server/player_manager.hpp index d4051bd..82770af 100644 --- a/server/player_manager.hpp +++ b/server/player_manager.hpp @@ -40,9 +40,8 @@ struct PlayerEntry { class PlayerManager { public: //clarity typedefs - typedef std::map Container; - typedef Container::iterator Iterator; - typedef std::function Lambda; + typedef std::map Container; + typedef Container::iterator Iterator; //These functions interact with the database //*Deletion, *Load and *Unload returns: 0 success, -1 failure @@ -54,7 +53,8 @@ public: int HandlePlayerUnload (int uniqueID); //lambdas - void ForEach(Lambda); + void ForEach(std::function fn); + void EraseIf(std::function fn); //accessors PlayerEntry* GetPlayer(int uniqueID); diff --git a/server/server_application.cpp b/server/server_application.cpp index b7d7a00..7955ef3 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -209,23 +209,20 @@ void ServerApplication::HandleDisconnect(NetworkPacket packet) { network.Send(&clientMgr.GetClient(packet.clientInfo.index)->address, buffer, sizeof(NetworkPacket)); clientMgr.HandleDisconnection(packet.clientInfo.index); -/* //delete players - erase_if(playerMap, [&](pair it) -> bool { - if (it.second.clientIndex == packet.clientInfo.index) { - NetworkPacket delPacket; + //delete players from all clients + NetworkPacket delPacket; + delPacket.meta.type = NetworkPacket::Type::PLAYER_DELETE; - //data to delete one specific player - delPacket.meta.type = NetworkPacket::Type::PLAYER_DELETE; - delPacket.playerInfo.playerIndex = it.first; - - //send to all + playerMgr.EraseIf([&](PlayerManager::Iterator it) -> bool { + //find the internal players to delete + if (it->first == packet.clientInfo.index) { + delPacket.playerInfo.playerIndex = it->first; + //send the delete player command to all clients PumpPacket(delPacket); - return true; } return false; }); -*/ //finished this routine cout << "disconnect, total: " << clientMgr.Size() << endl; @@ -233,6 +230,7 @@ void ServerApplication::HandleDisconnect(NetworkPacket packet) { /* void ServerApplication::HandleSynchronize(NetworkPacket packet) { //send all the server's data to this client + //TODO: compensate for large distances NetworkPacket newPacket; char buffer[sizeof(NetworkPacket)]; @@ -322,3 +320,12 @@ void ServerApplication::HandlePlayerUpdate(NetworkPacket packet) { PumpPacket(packet); } */ + +void ServerApplication::PumpPacket(NetworkPacket packet) { + //I don't really like this, but it'll do for now + char buffer[sizeof(NetworkPacket)]; + serialize(&packet, buffer); + clientMgr.ForEach([&](ClientManager::Iterator it) { + network.Send(&it->second.address, buffer, sizeof(NetworkPacket)); + }); +} \ No newline at end of file diff --git a/server/server_application.hpp b/server/server_application.hpp index 2733623..d6983ab 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -62,11 +62,13 @@ private: void HandleBroadcastRequest(NetworkPacket); void HandleJoinRequest(NetworkPacket); void HandleDisconnect(NetworkPacket); -// void HandleSynchronize(NetworkPacket); + void HandleSynchronize(NetworkPacket); void HandleShutdown(NetworkPacket); -// void HandlePlayerNew(NetworkPacket); -// void HandlePlayerDelete(NetworkPacket); -// void HandlePlayerUpdate(NetworkPacket); + void HandlePlayerNew(NetworkPacket); + void HandlePlayerDelete(NetworkPacket); + void HandlePlayerUpdate(NetworkPacket); + + void PumpPacket(NetworkPacket); //networking UDPNetworkUtility network;