Synchronization works

This commit is contained in:
Kayne Ruse
2013-06-24 21:46:11 +10:00
parent 42f9c5e1df
commit ebd8c5e6fc
6 changed files with 57 additions and 33 deletions
+20 -9
View File
@@ -39,12 +39,17 @@ InWorld::InWorld() {
//debugging //debugging
Packet::Packet p; Packet::Packet p;
p.meta.type = Packet::Type::PLAYER_NEW; p.meta.type = Packet::Type::PLAYER_NEW;
snprintf(p.playerNew.handle, PACKET_STRING_SIZE, "%s", configUtil->CString("handle")); snprintf(p.playerData.handle, PACKET_STRING_SIZE, "%s", configUtil->CString("handle"));
snprintf(p.playerNew.avatar, PACKET_STRING_SIZE, "%s", configUtil->CString("avatar")); snprintf(p.playerData.avatar, PACKET_STRING_SIZE, "%s", configUtil->CString("avatar"));
p.playerNew.position = {0, 50}; p.playerData.position = {0, 50};
p.playerNew.motion = {140, 0}; p.playerData.motion = {140, 0};
netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet::Packet)); netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet::Packet));
//request a sync
p.meta.type = Packet::Type::SYNCHRONIZE;
p.synchronize.clientIndex = infoMgr->GetClientIndex();
netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet::Packet));
} }
InWorld::~InWorld() { InWorld::~InWorld() {
@@ -182,13 +187,13 @@ int InWorld::HandlePacket(Packet::Packet p) {
// // // //
// break; // break;
case Packet::Type::PLAYER_NEW: case Packet::Type::PLAYER_NEW:
AddPlayer(p.playerNew); AddPlayer(p.playerData);
break; break;
case Packet::Type::PLAYER_DELETE: case Packet::Type::PLAYER_DELETE:
RemovePlayer(p.playerDelete); RemovePlayer(p.playerDelete);
break; break;
case Packet::Type::PLAYER_UPDATE: case Packet::Type::PLAYER_UPDATE:
UpdatePlayer(p.playerUpdate); UpdatePlayer(p.playerData);
break; break;
default: default:
throw(runtime_error("Failed to recognize the packet type: " + itos(int(p.meta.type)))); throw(runtime_error("Failed to recognize the packet type: " + itos(int(p.meta.type))));
@@ -222,7 +227,7 @@ void InWorld::HandleDisconnection(Packet::Disconnect& disconnect) {
cout << "You have been disconnected" << endl; cout << "You have been disconnected" << endl;
} }
void InWorld::AddPlayer(Packet::PlayerNew& p) { void InWorld::AddPlayer(Packet::PlayerData& p) {
//sprite //sprite
playerCharacters[p.playerIndex].GetSprite()->SetSurface(surfaceMgr->Get(p.avatar), 32, 48); playerCharacters[p.playerIndex].GetSprite()->SetSurface(surfaceMgr->Get(p.avatar), 32, 48);
@@ -238,6 +243,12 @@ void InWorld::RemovePlayer(Packet::PlayerDelete& p) {
// //
} }
void InWorld::UpdatePlayer(Packet::PlayerUpdate& p) { void InWorld::UpdatePlayer(Packet::PlayerData& p) {
// if (playerCharacters.find(p.playerIndex) == playerCharacters.end()) {
AddPlayer(p);
return;
}
playerCharacters[p.playerIndex].SetPosition(p.position);
playerCharacters[p.playerIndex].SetMotion(p.motion);
} }
+2 -2
View File
@@ -69,9 +69,9 @@ protected:
void HandleDisconnection(Packet::Disconnect&); void HandleDisconnection(Packet::Disconnect&);
void AddPlayer(Packet::PlayerNew&); void AddPlayer(Packet::PlayerData&);
void RemovePlayer(Packet::PlayerDelete&); void RemovePlayer(Packet::PlayerDelete&);
void UpdatePlayer(Packet::PlayerUpdate&); void UpdatePlayer(Packet::PlayerData&);
//services //services
ConfigUtility* configUtil = Singleton<ConfigUtility>::Get(); ConfigUtility* configUtil = Singleton<ConfigUtility>::Get();
+4 -12
View File
@@ -90,9 +90,10 @@ struct Disconnect {
struct Synchronize { struct Synchronize {
Metadata meta; Metadata meta;
int clientIndex;
}; };
struct PlayerNew { struct PlayerData {
Metadata meta; Metadata meta;
int playerIndex; int playerIndex;
int clientIndex; int clientIndex;
@@ -109,14 +110,6 @@ struct PlayerDelete {
int clientIndex; int clientIndex;
}; };
struct PlayerUpdate {
Metadata meta;
int playerIndex;
int clientIndex;
Vector2 position;
Vector2 motion;
};
union Packet { union Packet {
Packet() { Packet() {
meta.type = Type::NONE; meta.type = Type::NONE;
@@ -133,11 +126,10 @@ union Packet {
JoinResponse joinResponse; JoinResponse joinResponse;
Disconnect disconnect; Disconnect disconnect;
Synchronize sync; Synchronize synchronize;
PlayerNew playerNew; PlayerData playerData;
PlayerDelete playerDelete; PlayerDelete playerDelete;
PlayerUpdate playerUpdate;
#ifdef DEBUG #ifdef DEBUG
char buffer[1024]; char buffer[1024];
+1 -1
View File
@@ -16,5 +16,5 @@ interface = rsc/graphics/interface
#debugging #debugging
debug = true debug = true
avatar = elliot2.bmp avatar = elliot
handle = UserName handle = UserName
+26 -7
View File
@@ -174,11 +174,11 @@ int ServerApplication::HandlePacket(Packet::Packet p) {
case Packet::Type::DISCONNECT: case Packet::Type::DISCONNECT:
HandleDisconnection(p.disconnect); HandleDisconnection(p.disconnect);
break; break;
// case Packet::Type::SYNCHRONIZE: case Packet::Type::SYNCHRONIZE:
// // SynchronizeEverything(p.synchronize);
// break; break;
case Packet::Type::PLAYER_NEW: case Packet::Type::PLAYER_NEW:
AddPlayer(p.playerNew); AddPlayer(p.playerData);
RelayPacket(p); RelayPacket(p);
break; break;
case Packet::Type::PLAYER_DELETE: case Packet::Type::PLAYER_DELETE:
@@ -186,7 +186,7 @@ int ServerApplication::HandlePacket(Packet::Packet p) {
RelayPacket(p); RelayPacket(p);
break; break;
case Packet::Type::PLAYER_UPDATE: case Packet::Type::PLAYER_UPDATE:
UpdatePlayer(p.playerUpdate); UpdatePlayer(p.playerData);
RelayPacket(p); RelayPacket(p);
break; break;
default: default:
@@ -202,6 +202,25 @@ void ServerApplication::RelayPacket(Packet::Packet& p) {
} }
} }
void ServerApplication::SynchronizeEverything(Packet::Synchronize& sync) {
//send all known data to this client
//TODO multithreading?
//all players
Packet::Packet p;
p.meta.type = Packet::Type::PLAYER_UPDATE;
for (auto& it : players) {
p.playerData.playerIndex = it.second.index;
p.playerData.clientIndex = it.second.clientIndex;
snprintf(p.playerData.handle, PACKET_STRING_SIZE, "%s", it.second.handle.c_str());
snprintf(p.playerData.avatar, PACKET_STRING_SIZE, "%s", it.second.avatar.c_str());
p.playerData.position = it.second.position;
p.playerData.motion = it.second.motion;
netUtil->Send(&clients[sync.clientIndex].address, &p, sizeof(Packet::Packet));
}
}
void ServerApplication::HandleBroadcast(Packet::BroadcastRequest& bcast) { void ServerApplication::HandleBroadcast(Packet::BroadcastRequest& bcast) {
//respond to a broadcast request with the server's data //respond to a broadcast request with the server's data
Packet::Packet p; Packet::Packet p;
@@ -248,7 +267,7 @@ void ServerApplication::HandleDisconnection(Packet::Disconnect& disconnect) {
cout << "number of clients: " << clients.size() << endl; cout << "number of clients: " << clients.size() << endl;
} }
void ServerApplication::AddPlayer(Packet::PlayerNew& p) { void ServerApplication::AddPlayer(Packet::PlayerData& p) {
//add the player //add the player
PlayerEntry newPlayer = { PlayerEntry newPlayer = {
uniqueIndex++, uniqueIndex++,
@@ -273,6 +292,6 @@ void ServerApplication::RemovePlayer(Packet::PlayerDelete& p) {
//TODO remove a player //TODO remove a player
} }
void ServerApplication::UpdatePlayer(Packet::PlayerUpdate& p) { void ServerApplication::UpdatePlayer(Packet::PlayerData& p) {
//TODO update a player //TODO update a player
} }
+4 -2
View File
@@ -58,13 +58,15 @@ private:
int HandlePacket(Packet::Packet); int HandlePacket(Packet::Packet);
void RelayPacket(Packet::Packet&); void RelayPacket(Packet::Packet&);
void SynchronizeEverything(Packet::Synchronize&);
void HandleBroadcast(Packet::BroadcastRequest&); void HandleBroadcast(Packet::BroadcastRequest&);
void HandleConnection(Packet::JoinRequest&); void HandleConnection(Packet::JoinRequest&);
void HandleDisconnection(Packet::Disconnect&); void HandleDisconnection(Packet::Disconnect&);
void AddPlayer(Packet::PlayerNew&); void AddPlayer(Packet::PlayerData&);
void RemovePlayer(Packet::PlayerDelete&); void RemovePlayer(Packet::PlayerDelete&);
void UpdatePlayer(Packet::PlayerUpdate&); void UpdatePlayer(Packet::PlayerData&);
//services //services
ConfigUtility* configUtil = Singleton<ConfigUtility>::Get(); ConfigUtility* configUtil = Singleton<ConfigUtility>::Get();