From 61629b3c8e7edad0e9a60682b1b901058fb80ba8 Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Fri, 27 Oct 2023 14:37:53 -0400 Subject: [PATCH] RemotePlayer --- SQCSim-srv/server.cpp | 2 +- SQCSim2021/connector.cpp | 22 +++++++++++++++++----- SQCSim2021/connector.h | 5 ++++- SQCSim2021/engine.cpp | 7 +++++-- SQCSim2021/remoteplayer.cpp | 2 +- SQCSim2021/remoteplayer.h | 3 ++- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index a0c2a5e..342a139 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -180,7 +180,7 @@ void Server::Run() { Log("Debut de la partie...", false, false); for (auto& [key, conn]: m_players) { // Creation des instances de joueurs et premier sync. - conn->player = new Player(Vector3f(64., 128., 64.)); + conn->player = new Player(Vector3f(32.5f, CHUNK_SIZE_Y + 1.8f, 32.5f)); Player *player = conn->player; Sync sync; sync.position = player->GetPosition(); diff --git a/SQCSim2021/connector.cpp b/SQCSim2021/connector.cpp index 7709a76..e5cecd6 100644 --- a/SQCSim2021/connector.cpp +++ b/SQCSim2021/connector.cpp @@ -68,9 +68,10 @@ int Connector::Connect(const char* srv_addr, std::string name) { delete[] buf; buf = new char[150] {0}; buflen = 150; - int rpack = 0; + bool ready = false; int errors = 0; - while (rpack < 2) { + netprot::PlayerInfo pinfo{}; + while (!ready) { recv(m_sock_tcp, buf, buflen, 0); switch (netprot::getType(buf, buflen)) { @@ -79,17 +80,26 @@ int Connector::Connect(const char* srv_addr, std::string name) { std::cout << "Packet LoginInfo invalide." << std::endl; return 2; } - ++rpack; break; case netprot::PACKET_TYPE::GAMEINFO: if (!netprot::Deserialize(&m_gameinfo, buf, buflen)) { std::cout << "Packet GameInfo invalide." << std::endl; return 3; } - ++rpack; break; case netprot::PACKET_TYPE::PLAYINF: - // TODO: Populer un remotePlayer avec ça. + if (!netprot::Deserialize(&pinfo, buf, buflen)) { + std::cout << "Packet PlayerInfo invalide." << std::endl; + return 3; + } + m_players[pinfo.id] = pinfo; + break; + case netprot::PACKET_TYPE::SYNC: + if (!netprot::Deserialize(&m_origin, buf, buflen)) { + std::cout << "Packet Sync invalide." << std::endl; + return 3; + } + ready = true; break; default: ++errors; @@ -105,3 +115,5 @@ int Connector::Connect(const char* srv_addr, std::string name) { uint64_t Connector::getId() const { return m_loginfo.sid; } unsigned int Connector::getSeed() const { return m_gameinfo.seed; } + +netprot::Sync Connector::getOrigin() const { return m_origin; } diff --git a/SQCSim2021/connector.h b/SQCSim2021/connector.h index 5dd6db4..4fd883e 100644 --- a/SQCSim2021/connector.h +++ b/SQCSim2021/connector.h @@ -14,6 +14,8 @@ public: int Connect(const char* srv_addr, std::string name); uint64_t getId() const; unsigned int getSeed() const; + netprot::Sync getOrigin() const; + //void SendInput(); //int Sync(); @@ -24,16 +26,17 @@ public: // void updateRemotePlayers(std::map rplayers); + std::map m_players; private: #ifdef _WIN32 WSADATA m_wsaData; #endif std::map m_inputmanifest; - std::map m_players; std::map m_teams; netprot::LoginInfo m_loginfo; netprot::GameInfo m_gameinfo; + netprot::Sync m_origin; }; #endif diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 5fdc85e..ae6b4b4 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -265,7 +265,6 @@ void Engine::Init() { m_whoosh[x] = nullptr; } - if (true) { std::cout << "Jouer en ligne? [o/N] "; std::cin >> ch; std::cout << std::endl; @@ -284,6 +283,11 @@ void Engine::Init() { // setup jeu en reseau. std::cout << "ID recu du serveur: " << std::to_string(m_conn.getId()) << "!" << std::endl; std::cout << "Seed recu du serveur: " << std::to_string(m_conn.getSeed()) << "!" << std::endl; + m_player = Player(m_conn.getOrigin().position); + + for (auto& [key, player] : m_conn.m_players) + m_players[key] = new RemotePlayer(player); + seed = m_conn.getSeed(); m_networkgame = true; } @@ -291,7 +295,6 @@ void Engine::Init() { } else std::cout << "Erreur de creation de socket." << std::endl; } - } m_world.SetSeed(seed); diff --git a/SQCSim2021/remoteplayer.cpp b/SQCSim2021/remoteplayer.cpp index 1d2de20..7769ddc 100644 --- a/SQCSim2021/remoteplayer.cpp +++ b/SQCSim2021/remoteplayer.cpp @@ -3,7 +3,7 @@ #include -RemotePlayer::RemotePlayer() : Player(Vector3f(0, 0, 0), 0, 0), m_aminacc(0.0f), m_animstate(Anim::STILL), m_team_id(0), current(), previous() { +RemotePlayer::RemotePlayer(netprot::PlayerInfo pinfo) : Player(Vector3f(0, 0, 0), 0, 0), m_pinfo(pinfo), m_aminacc(0.0f), m_animstate(Anim::STILL), m_team_id(0), current(), previous() { } diff --git a/SQCSim2021/remoteplayer.h b/SQCSim2021/remoteplayer.h index 70b585b..e8fb8a5 100644 --- a/SQCSim2021/remoteplayer.h +++ b/SQCSim2021/remoteplayer.h @@ -10,13 +10,14 @@ class RemotePlayer : public Player { public: enum Anim { STILL = 1, RUNNING = 2, JUMPING = 4, SHOOTING = 8, POWERUP = 16, DEAD = 32 }; - RemotePlayer(); + RemotePlayer(netprot::PlayerInfo pinfo); void Init(); void Feed(const netprot::Output out); private: netprot::Output current, previous; + netprot::PlayerInfo m_pinfo; float m_aminacc; Anim m_animstate; uint64_t m_team_id;