Connections and disconnections are working across different clients

This commit is contained in:
Kayne Ruse
2013-12-07 01:33:27 +11:00
parent 1c032bfc47
commit 3b05476689
5 changed files with 78 additions and 7 deletions
+6 -2
View File
@@ -66,6 +66,10 @@ InWorld::InWorld(ConfigUtility* const arg1, UDPNetworkUtility* const arg2, int*
//send it //send it
network.Send(Channels::SERVER, &packet, sizeof(NetworkPacket)); network.Send(Channels::SERVER, &packet, sizeof(NetworkPacket));
//request a sync
packet.meta.type = NetworkPacket::Type::SYNCHRONIZE;
network.Send(Channels::SERVER, &packet, sizeof(NetworkPacket));
} }
InWorld::~InWorld() { InWorld::~InWorld() {
@@ -209,8 +213,8 @@ void InWorld::HandlePlayerDelete(NetworkPacket packet) {
void InWorld::HandlePlayerUpdate(NetworkPacket packet) { void InWorld::HandlePlayerUpdate(NetworkPacket packet) {
if (playerCharacters.find(packet.playerInfo.playerIndex) == playerCharacters.end()) { if (playerCharacters.find(packet.playerInfo.playerIndex) == playerCharacters.end()) {
//TODO: reroute to HandlePlayerNew() HandlePlayerNew(packet);
throw(std::runtime_error("Cannot update non-existant players")); return;
} }
playerCharacters[packet.playerInfo.playerIndex].SetPosition(packet.playerInfo.position); playerCharacters[packet.playerInfo.playerIndex].SetPosition(packet.playerInfo.position);
+13
View File
@@ -32,4 +32,17 @@ std::string to_string_custom(int i);
int to_integer_custom(std::string); int to_integer_custom(std::string);
//wow
template<typename ContainerT, typename PredicateT>
void erase_if(ContainerT& items, const PredicateT& predicate) {
for(auto it = items.begin(); it != items.end(); /* empty */) {
if(predicate(*it)) {
it = items.erase(it);
}
else {
++it;
}
}
};
#endif #endif
+4
View File
@@ -17,4 +17,8 @@ dir.tilesets = rsc/graphics/tilesets/
dir.interface = rsc/graphics/interface/ dir.interface = rsc/graphics/interface/
dir.scripts = rsc/scripts/ dir.scripts = rsc/scripts/
#player options
player.handle = username
player.avatar = elliot2.bmp
#debugging #debugging
+54 -5
View File
@@ -23,6 +23,8 @@
#include "network_packet.hpp" #include "network_packet.hpp"
#include "utility.hpp"
#include <stdexcept> #include <stdexcept>
#include <iostream> #include <iostream>
#include <string> #include <string>
@@ -136,6 +138,10 @@ void ServerApplication::HandlePacket(NetworkPacket packet) {
HandleDisconnect(packet); HandleDisconnect(packet);
break; break;
case NetworkPacket::Type::SYNCHRONIZE:
HandleSynchronize(packet);
break;
case NetworkPacket::Type::SHUTDOWN: case NetworkPacket::Type::SHUTDOWN:
HandleShutdown(packet); HandleShutdown(packet);
break; break;
@@ -191,11 +197,42 @@ void ServerApplication::HandleDisconnect(NetworkPacket packet) {
network.Send(&clientMap[packet.clientInfo.index].address, &packet, sizeof(NetworkPacket)); network.Send(&clientMap[packet.clientInfo.index].address, &packet, sizeof(NetworkPacket));
clientMap.erase(packet.clientInfo.index); clientMap.erase(packet.clientInfo.index);
//TODO: remove players //delete players
erase_if(playerMap, [&](pair<int, Player> it) -> bool {
if (it.second.clientIndex == packet.clientInfo.index) {
NetworkPacket delPacket;
//data to delete one specific player
delPacket.meta.type = NetworkPacket::Type::PLAYER_DELETE;
delPacket.playerInfo.playerIndex = it.first;
//send to all
PumpPacket(delPacket);
return true;
}
return false;
});
cout << "disconnect, total: " << clientMap.size() << endl; cout << "disconnect, total: " << clientMap.size() << endl;
} }
void ServerApplication::HandleSynchronize(NetworkPacket packet) {
//send all the server's data to this client
NetworkPacket newPacket;
//players
newPacket.meta.type = NetworkPacket::Type::PLAYER_UPDATE;
for (auto& it : playerMap) {
newPacket.playerInfo.playerIndex = it.first;
snprintf(newPacket.playerInfo.handle, PACKET_STRING_SIZE, "%s", it.second.handle.c_str());
snprintf(newPacket.playerInfo.avatar, PACKET_STRING_SIZE, "%s", it.second.avatar.c_str());
newPacket.playerInfo.position = it.second.position;
newPacket.playerInfo.motion = it.second.motion;
network.Send(&clientMap[packet.clientInfo.index].address, &newPacket, sizeof(NetworkPacket));
}
}
void ServerApplication::HandleShutdown(NetworkPacket packet) { void ServerApplication::HandleShutdown(NetworkPacket packet) {
//end the server //end the server
running = false; running = false;
@@ -213,7 +250,7 @@ void ServerApplication::HandlePlayerNew(NetworkPacket packet) {
newPlayer.clientIndex = packet.playerInfo.clientIndex; newPlayer.clientIndex = packet.playerInfo.clientIndex;
newPlayer.handle = packet.playerInfo.handle; newPlayer.handle = packet.playerInfo.handle;
newPlayer.avatar = packet.playerInfo.avatar; newPlayer.avatar = packet.playerInfo.avatar;
newPlayer.position = {0,0}; newPlayer.position = {(rand() % config.Int("screen.w")),(rand() % config.Int("screen.h"))};
newPlayer.motion = {0,0}; newPlayer.motion = {0,0};
//push this player //push this player
@@ -229,7 +266,6 @@ void ServerApplication::HandlePlayerNew(NetworkPacket packet) {
//finish this routine //finish this routine
Player::counter++; Player::counter++;
cout << "new player, total: " << playerMap.size() << endl;
} }
void ServerApplication::HandlePlayerDelete(NetworkPacket packet) { void ServerApplication::HandlePlayerDelete(NetworkPacket packet) {
@@ -237,9 +273,22 @@ void ServerApplication::HandlePlayerDelete(NetworkPacket packet) {
throw(std::runtime_error("Cannot delete a non-existant player")); throw(std::runtime_error("Cannot delete a non-existant player"));
} }
playerMap.erase(packet.playerInfo.playerIndex); //delete players
erase_if(playerMap, [&](pair<int, Player> it) -> bool {
if (it.first == packet.playerInfo.playerIndex) {
NetworkPacket delPacket;
PumpPacket(packet); //data to delete one specific player
delPacket.meta.type = NetworkPacket::Type::PLAYER_DELETE;
delPacket.playerInfo.playerIndex = it.first;
//send to all
PumpPacket(delPacket);
return true;
}
return false;
});
} }
void ServerApplication::HandlePlayerUpdate(NetworkPacket packet) { void ServerApplication::HandlePlayerUpdate(NetworkPacket packet) {
+1
View File
@@ -72,6 +72,7 @@ private:
void HandleBroadcastRequest(NetworkPacket); void HandleBroadcastRequest(NetworkPacket);
void HandleJoinRequest(NetworkPacket); void HandleJoinRequest(NetworkPacket);
void HandleDisconnect(NetworkPacket); void HandleDisconnect(NetworkPacket);
void HandleSynchronize(NetworkPacket);
void HandleShutdown(NetworkPacket); void HandleShutdown(NetworkPacket);
void HandlePlayerNew(NetworkPacket); void HandlePlayerNew(NetworkPacket);
void HandlePlayerDelete(NetworkPacket); void HandlePlayerDelete(NetworkPacket);