Synchronization works
This commit is contained in:
+20
-9
@@ -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
@@ -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
@@ -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
@@ -16,5 +16,5 @@ interface = rsc/graphics/interface
|
|||||||
|
|
||||||
#debugging
|
#debugging
|
||||||
debug = true
|
debug = true
|
||||||
avatar = elliot2.bmp
|
avatar = elliot
|
||||||
handle = UserName
|
handle = UserName
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user