diff --git a/Entities/player.cpp b/Entities/player.cpp index c6070fd..5af2f1b 100644 --- a/Entities/player.cpp +++ b/Entities/player.cpp @@ -167,7 +167,7 @@ void Player::drawEnergyBar(SDL_Renderer* renderer) { SDL_RenderFillRect(renderer, &energyBarForeground); } -int Player::getPlayerId() { +int Player::getPlayerId() const { return playerId; } diff --git a/Entities/player.h b/Entities/player.h index eaef6b1..03ab00b 100644 --- a/Entities/player.h +++ b/Entities/player.h @@ -73,7 +73,7 @@ class Player { void handlePlayerMovement(int ENV_WIDTH, int ENV_HEIGHT, int windowWidth, int windowHeight); void drawEnergyBar(SDL_Renderer* renderer); bool checkCollision(SDL_Rect fishRect); - int getPlayerId(); + int getPlayerId() const; void setPlayerPos(int x, int y); void handleClientMessages(); void updatePosition(int x, int y); diff --git a/Network/networking.cpp b/Network/networking.cpp index c59bdcd..eab9b88 100644 --- a/Network/networking.cpp +++ b/Network/networking.cpp @@ -3,6 +3,7 @@ // #include "networking.h" +#include "../Entities/player.h" std::unordered_map> playerPositions; std::unordered_map> lastKeepAlive; @@ -231,4 +232,26 @@ std::string processReceivedData(const std::string& data) { } } return filteredData; +} + +std::vector getAllPlayers() { + std::vector playersInfo; + for (const auto& player : players_server) { + auto [x, y] = player.getPlayerPos(); + playersInfo.push_back({player.getPlayerId(), x, y}); + } + return playersInfo; +} + +void sendPlayerListToNewClient(int clientSocket) { + std::vector players = getAllPlayers(); + + int playerCount = players.size(); + std::string message = "playerList;" + std::to_string(playerCount) + ";"; + sendMessage(server, message); + + for (const auto& player : players) { + std::string playerInfo = std::to_string(player.id) + "," + std::to_string(player.x) + "," + std::to_string(player.y) + ";"; + sendMessage(server, playerInfo); + } } \ No newline at end of file diff --git a/Network/networking.h b/Network/networking.h index e780a1c..4dd3213 100644 --- a/Network/networking.h +++ b/Network/networking.h @@ -26,5 +26,12 @@ void closeServer(); void handleServerMessages(); void sendSharkPosition(TCPsocket socket, int sharkId, int x, int y); std::string processReceivedData(const std::string& data); +struct PlayerInfo { + int id; + int x; + int y; +}; +std::vector getAllPlayers(); +void sendPlayerListToNewClient(int clientSocket); #endif //NETWORKING_H \ No newline at end of file diff --git a/Network/networking_client.cpp b/Network/networking_client.cpp index d911419..cd6aabb 100644 --- a/Network/networking_client.cpp +++ b/Network/networking_client.cpp @@ -145,3 +145,54 @@ void startKeepAlive(TCPsocket serverSocket) { }).detach(); } +void receivePlayerListFromServer(TCPsocket serverSocket) { + // Exemple de structure de données pour un joueur + struct PlayerInfo { + int id; + int x; + int y; + }; + + // Recevoir le message contenant la liste des joueurs + std::string message = receiveMessage(serverSocket); + if (message.empty()) { + std::cerr << "Failed to receive player list" << std::endl; + return; + } + + std::istringstream iss(message); + std::string token; + std::getline(iss, token, ';'); // Lire "playerList" + if (token != "playerList") { + std::cerr << "Invalid message format" << std::endl; + return; + } + + // Lire le nombre de joueurs + std::getline(iss, token, ';'); + int playerCount = std::stoi(token); + + // Lire les informations de chaque joueur + for (int i = 0; i < playerCount; ++i) { + std::getline(iss, token, ';'); + int playerId, x, y; + sscanf(token.c_str(), "%d,%d,%d", &playerId, &x, &y); + // Mettre à jour l'état du client avec les informations du joueur + addPlayerToGame(playerId, x, y); + } +} + +void addPlayerToGame(int playerId, int x, int y) { + // Vérifiez si le joueur existe déjà + auto it = std::find_if(players.begin(), players.end(), [playerId](const Player& player) { + return player.getPlayerId() == playerId; + }); + + if (it != players.end()) { + // Si le joueur existe déjà, mettez à jour sa position + it->updatePosition(x, y); + } else { + // Sinon, ajoutez un nouveau joueur + players.emplace_back(Player(x, y, 5, renderer, playerId)); + } +} \ No newline at end of file diff --git a/Network/networking_client.h b/Network/networking_client.h index 9322db8..dc6f249 100644 --- a/Network/networking_client.h +++ b/Network/networking_client.h @@ -23,5 +23,6 @@ std::string receiveMessage(TCPsocket socket); void handleClientMessage(Player& player); void sendKeepAlive(TCPsocket serverSocket); void startKeepAlive(TCPsocket serverSocket); - +void receivePlayerListFromServer(int serverSocket); +void addPlayerToGame(int playerId, int x, int y); #endif //NETWORKING_CLIENT_H diff --git a/Utility/utility.cpp b/Utility/utility.cpp index e52744c..0a9bab4 100644 --- a/Utility/utility.cpp +++ b/Utility/utility.cpp @@ -231,6 +231,10 @@ void renderScene(std::vector& players, const std::vector& kelps, c player.draw(renderer); } + if (isPlayingOnline) { + displayNearbyPlayers(renderer, font, players[0], players_server, 500); + } + shark.draw(renderer); if (displayFPSFlag) { diff --git a/Utility/utility.h b/Utility/utility.h index ce8872b..4660c07 100644 --- a/Utility/utility.h +++ b/Utility/utility.h @@ -20,6 +20,7 @@ #include "../Entities/player.h" #include "../Entities/shark.h" #include "../Game/decors.h" +#include "../Utility/display.h" extern std::mutex mtx;