Connections and disconnections are working across different clients
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user