diff --git a/SQCSim-common/netprotocol.cpp b/SQCSim-common/netprotocol.cpp index c6c25dd..ad1a24b 100644 --- a/SQCSim-common/netprotocol.cpp +++ b/SQCSim-common/netprotocol.cpp @@ -1024,6 +1024,82 @@ std::vector netprot::recvPacks(SOCKET sock, Buffer* buf, Buffer* outbuf) } } +std::vector netprot::recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* outbuf) { + std::vector lsPck; + int len = buf->tmp ? buf->tmp - buf->ptr : 0, + end = 0; + char* cursor = buf->tmp ? buf->tmp : nullptr, + * next = buf->tmp ? buf->tmp + 1 : buf->ptr, + * last = buf->tmp ? buf->tmp : buf->ptr; + bool ended = true; + struct pollfd fds[1]; + sockaddr_in sockad = from; + addrlen_t socklen = sizeof(sockad); + + fds[0].fd = sock; + fds[0].events = POLLIN; + + while (true) { + if (!poll(fds, 1, 0)) { + if (ended) + buf->tmp = nullptr; + return lsPck; + } + + int bytes = recvfrom(sock, &buf->ptr[len], buf->len - len, 0, (sockaddr*)&sockad, &socklen); + if (bytes <= 0) { // si recv() retourne -1 ou 0; ça veut dire qu'il y a plus rien a lire qui n'a pas déjà été traité. + if (ended) + buf->tmp = nullptr; + return lsPck; + } + len += bytes; + end = len; + + ended = false; + + while (true) { + int cmp = 0; + + if (cursor) + end -= (cursor - buf->ptr); + + if (end < 0) + break; + + cursor = (char*)memchr(next, '\r', end); + + if (cursor) { + next = cursor; + cursor--; + + cmp = memcmp(cursor, Footer, sizeof(uint32_t)); + if (cmp == 0) { + if (!outbuf) { + lsPck.push_back(last); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + else { + memcpy(&outbuf->ptr[cursor - last], last, cursor - last); + lsPck.push_back(&outbuf->ptr[cursor - last]); + cursor += sizeof(uint32_t); + last = cursor; + next = cursor + 1; + } + } + } + else { + if (!outbuf) + buf->tmp = last; + cursor = &buf->ptr[len]; + next = cursor + 1; + break; + }; + } + } +} + template <> void netprot::sendPack(SOCKET sock, Packet* pack, Buffer* buf) { switch (pack->type) { diff --git a/SQCSim-common/netprotocol.h b/SQCSim-common/netprotocol.h index 432e31d..74fd929 100644 --- a/SQCSim-common/netprotocol.h +++ b/SQCSim-common/netprotocol.h @@ -173,6 +173,7 @@ namespace netprot { template void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad); std::vector recvPacks(SOCKET sock, Buffer* buf, Buffer* oufbuf = nullptr); + std::vector recvPacksFrom(SOCKET sock, Buffer* buf, sockaddr_in from, Buffer* oufbuf = nullptr); /* Templates */ diff --git a/SQCSim-common/player.cpp b/SQCSim-common/player.cpp index 790507f..faedf2f 100644 --- a/SQCSim-common/player.cpp +++ b/SQCSim-common/player.cpp @@ -192,6 +192,8 @@ void Player::ApplyTransformation(Transformation& transformation, bool rel) const if (rel) transformation.ApplyTranslation(-GetPOV()); } +void Player::SetDirection(Vector3f dir) { m_direction = dir; } + Vector3f Player::GetPosition() const { return Vector3f(m_position.x + CHUNK_SIZE_X * WORLD_SIZE_X / 2, m_position.y, m_position.z + CHUNK_SIZE_Z * WORLD_SIZE_Y / 2); } Vector3f Player::GetVelocity() const { return m_velocity; } diff --git a/SQCSim-common/player.h b/SQCSim-common/player.h index eedbf74..9730c58 100644 --- a/SQCSim-common/player.h +++ b/SQCSim-common/player.h @@ -20,6 +20,7 @@ public: Sound ApplyPhysics(Vector3f input, World* world, float elapsedTime); void ApplyTransformation(Transformation& transformation, bool rel = true) const; + void SetDirection(Vector3f dir); Vector3f GetPosition() const; Vector3f GetDirection() const; Vector3f GetVelocity() const; diff --git a/SQCSim-srv/connection.cpp b/SQCSim-srv/connection.cpp index 079b0fb..c721255 100644 --- a/SQCSim-srv/connection.cpp +++ b/SQCSim-srv/connection.cpp @@ -47,6 +47,50 @@ PlayerInfo* Connection::getInfo() const { return (PlayerInfo*)&m_playinfo; } sockaddr_in* Connection::getAddr() const { return (sockaddr_in*)&m_addr; } +void Connection::getPacks() { + std::vector lsPck; + Input in; + while (true) { + lsPck = recvPacksFrom(m_sock, m_buf, m_addr); + + for (auto& pck : lsPck) { + uint32_t bsize = m_buf->len - (pck - m_buf->ptr); + switch (netprot::getType(pck, 1)) { + using enum netprot::PACKET_TYPE; + case INPUT: + if (Deserialize(&in, pck, &bsize)) + m_input_manifest.insert({ in.timestamp, in }); + break; + default: break; + } + } + lsPck.clear(); + } +} + +std::thread Connection::Start(){ return std::thread(getPacks); } + +void Connection::Run(World* world) { + Input in, last; + Output out; + float el; + + if (m_input_manifest.size() < 2) + return; + + in = m_input_manifest.at(m_input_manifest.size()); + last = m_input_manifest.at(m_input_manifest.size() - 1); + + el = (float)(in.timestamp - last.timestamp) / 1000.; + + player.get()->SetDirection(in.direction); + player.get()->ApplyPhysics(player.get()->GetInput(in.keys.forward, in.keys.backward, in.keys.left, in.keys.right, in.keys.jump, false, el), world, el); + + out.position = player.get()->GetPosition(); + out.direction = in.direction; + out.timestamp = in.timestamp; +} + void Connection::CleanInputManifest(Timestamp time) { auto wat = m_input_manifest.find(time); diff --git a/SQCSim-srv/connection.h b/SQCSim-srv/connection.h index 9233273..0d96bba 100644 --- a/SQCSim-srv/connection.h +++ b/SQCSim-srv/connection.h @@ -6,6 +6,7 @@ #include "../SQCSim-common/player.h" #include "../SQCSim-common/vector3.h" #include "../SQCSim-common/netprotocol.h" +#include "../SQCSim-common/world.h" #include "define.h" using namespace netprot; @@ -32,6 +33,12 @@ public: PlayerInfo* getInfo() const; sockaddr_in* getAddr() const; + void getPacks(); + + std::thread Start(); + + void Run(World* world); + void CleanInputManifest(Timestamp time); private: std::unordered_map m_input_manifest; @@ -43,5 +50,6 @@ private: LoginInfo m_loginfo; PlayerInfo m_playinfo; + Buffer* m_buf; }; #endif diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index fc2184e..72d53b4 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -175,17 +175,24 @@ int Server::Ready() { } void Server::Run() { + bool endgame = false; Input in; sockaddr_in sockad; addrlen_t socklen = sizeof(sockad); Log("Debut de la partie...", false, false); + int players = m_players.size(); + std::thread* getPacksThreads = new std::thread[players]; + m_world = std::make_unique(); m_world->SetSeed(m_game.seed); m_world->GetChunks().Reset(nullptr); m_world->BuildWorld(); + for (int x = 0; x < players; ++x) + getPacksThreads[x] = m_players[x].get()->start(); + for (auto& [key, conn] : m_players) { // Creation des instances de joueurs et premier sync. conn->player = std::make_unique(Vector3f(8.5f, CHUNK_SIZE_Y + 1.8f, 8.5f)); Sync sync; @@ -198,32 +205,39 @@ void Server::Run() { sendPack(conn->getSock(), &sync, &m_buf); } - while (true) { - if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { - Packet pck = getPack(&m_buf); - switch (pck.type) { - using enum netprot::PACKET_TYPE; - case ERR: std::puts("ERROR!"); break; - case INPUT: std::puts("INPUT!"); break; - case OUTPUT: std::puts("OUTPUT!"); break; - case SYNC: std::puts("SYNC!"); break; - case TEAMINF: std::puts("TEAMINF!"); break; - case SELFINF: std::puts("SELFINF!"); break; - case PLAYINF: std::puts("PLAYINF!"); break; - case LOGINF: std::puts("LOGINF!"); break; - case CHUNKMOD: std::puts("CHUNKMOD!"); break; - case PLAYERMOD: std::puts("PLAYERMOD!"); break; - case PICKUPMOD: std::puts("PICKUPMOD!"); break; - case GAMEINFO: std::puts("GAMEINFO!"); break; - case ENDINFO: std::puts("ENDINFO!"); break; - case CHAT: std::puts("CHAT!"); break; - case ERRLOG: std::puts("ERRLOG!"); break; - case LAST_PACK: [[falltrough]]; - default: std::puts("wtf?!"); break; - } - netprot::emptyPack(pck); - } + while (!endgame) { + for (auto& [key, conn] : m_players) { + conn->player->GetInput + } } + + //while (true) { + // if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { + // Packet pck = getPack(&m_buf); + // switch (pck.type) { + // using enum netprot::PACKET_TYPE; + // case ERR: std::puts("ERROR!"); break; + // case INPUT: std::puts("INPUT!"); break; + // case OUTPUT: std::puts("OUTPUT!"); break; + // case SYNC: std::puts("SYNC!"); break; + // case TEAMINF: std::puts("TEAMINF!"); break; + // case SELFINF: std::puts("SELFINF!"); break; + // case PLAYINF: std::puts("PLAYINF!"); break; + // case LOGINF: std::puts("LOGINF!"); break; + // case CHUNKMOD: std::puts("CHUNKMOD!"); break; + // case PLAYERMOD: std::puts("PLAYERMOD!"); break; + // case PICKUPMOD: std::puts("PICKUPMOD!"); break; + // case GAMEINFO: std::puts("GAMEINFO!"); break; + // case ENDINFO: std::puts("ENDINFO!"); break; + // case CHAT: std::puts("CHAT!"); break; + // case ERRLOG: std::puts("ERRLOG!"); break; + // case LAST_PACK: [[falltrough]]; + // default: std::puts("wtf?!"); break; + // } + // netprot::emptyPack(pck); + // } + //} + } inline std::string Server::LogTimestamp() { diff --git a/SQCSim2021/engine.cpp b/SQCSim2021/engine.cpp index 1e7ea27..b5d02ad 100644 --- a/SQCSim2021/engine.cpp +++ b/SQCSim2021/engine.cpp @@ -305,6 +305,10 @@ void Engine::Init() { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_SUBTRACT); + if (m_istarted) + return; + else m_istarted = true; + // // Objet de skybox avec sa propre texture et son propre shader! m_skybox.Init(0.2f); diff --git a/SQCSim2021/engine.h b/SQCSim2021/engine.h index 41b8a4f..72f7986 100644 --- a/SQCSim2021/engine.h +++ b/SQCSim2021/engine.h @@ -126,7 +126,7 @@ private: bool m_resetcountdown = false; bool m_soloMultiChoiceMade = false; bool m_stopcountdown = false; - + bool m_keyK = false; bool m_keyL = false; bool m_keyW = false; diff --git a/SQCSim2021/mesh.cpp b/SQCSim2021/mesh.cpp index 04294af..c6f6b9b 100644 --- a/SQCSim2021/mesh.cpp +++ b/SQCSim2021/mesh.cpp @@ -9,7 +9,7 @@ Mesh::~Mesh() { void Mesh::FlushMeshToVBO() { m_vertexBuffer.SetMeshData(m_vd, m_vcount); m_vcount = 0; - //delete[] m_vd; + delete[] m_vd; } void Mesh::FlushVBO() { diff --git a/SQCSim2021/openglcontext.cpp b/SQCSim2021/openglcontext.cpp index 7a61b07..6284446 100644 --- a/SQCSim2021/openglcontext.cpp +++ b/SQCSim2021/openglcontext.cpp @@ -15,7 +15,7 @@ bool OpenglContext::Start(const std::string& title, int width, int height, bool m_title = title; m_fullscreen = fullscreen; InitWindow(width, height); - + Init(); LoadResource(); diff --git a/SQCSim2021/openglcontext.h b/SQCSim2021/openglcontext.h index 3825b26..2718540 100644 --- a/SQCSim2021/openglcontext.h +++ b/SQCSim2021/openglcontext.h @@ -52,6 +52,8 @@ protected: void HideCursor(); void ShowCrossCursor() const; + bool m_istarted = false; + private: void InitWindow(int width, int height); MOUSE_BUTTON ConvertMouseButton(sf::Mouse::Button button) const;