From 60edc97ea570dda4ea739775ead9d7c574d9558c Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 21 Apr 2014 01:38:28 +1000 Subject: [PATCH] Added rejections for incompatible servers --- client/scenes/lobby_menu.cpp | 28 ++++++++++++++++++++++++++-- client/scenes/lobby_menu.hpp | 18 ++++++++++++++---- common/network/serial.cpp | 26 ++++++++++++++++++++++++++ common/network/serial_packet.hpp | 8 ++++++-- server/server_application.cpp | 10 ++++++++-- 5 files changed, 80 insertions(+), 10 deletions(-) diff --git a/client/scenes/lobby_menu.cpp b/client/scenes/lobby_menu.cpp index 2e738b4..24c5b5c 100644 --- a/client/scenes/lobby_menu.cpp +++ b/client/scenes/lobby_menu.cpp @@ -22,6 +22,7 @@ #include "lobby_menu.hpp" #include "channels.hpp" +#include "utility.hpp" #include @@ -91,9 +92,13 @@ void LobbyMenu::FrameEnd() { } void LobbyMenu::Render(SDL_Surface* const screen) { + //TODO: I need a proper UI system for the entire client and the editor + //UI search.DrawTo(screen); join.DrawTo(screen); back.DrawTo(screen); + + //TODO: draw headers for the server list for (int i = 0; i < serverInfo.size(); i++) { //draw the selected server's highlight if (selection == &serverInfo[i]) { @@ -104,6 +109,16 @@ void LobbyMenu::Render(SDL_Surface* const screen) { //draw the server name font.DrawStringTo(serverInfo[i].name, screen, listBox.x, listBox.y + i*listBox.h); + + //draw the player count + font.DrawStringTo(to_string_custom(serverInfo[i].playerCount), screen, listBox.x + listBox.w, listBox.y + i*listBox.h); + + //compatible? + if (!serverInfo[i].compatible) { + font.DrawStringTo("?", screen, listBox.x - font.GetCharW(), listBox.y + i*listBox.h); + } + + //TODO: ping? } } @@ -139,7 +154,7 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { selection = nullptr; } - else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr) { + else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) { //the vars SerialPacket packet; char buffer[PACKET_BUFFER_SIZE]; @@ -184,9 +199,18 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) { void LobbyMenu::HandlePacket(SerialPacket packet) { switch(packet.meta.type) { case SerialPacket::Type::BROADCAST_RESPONSE: { + //extract the data ServerInformation server; - server.name = packet.serverInfo.name; server.address = packet.meta.srcAddress; + server.name = packet.serverInfo.name; + server.playerCount = packet.serverInfo.playerCount; + + //NOTE: Check compatibility here + server.compatible = packet.serverInfo.regionWidth == REGION_WIDTH && + packet.serverInfo.regionHeight == REGION_HEIGHT && + packet.serverInfo.regionDepth == REGION_DEPTH; + + //push serverInfo.push_back(server); } break; diff --git a/client/scenes/lobby_menu.hpp b/client/scenes/lobby_menu.hpp index b231d16..53808bb 100644 --- a/client/scenes/lobby_menu.hpp +++ b/client/scenes/lobby_menu.hpp @@ -22,17 +22,24 @@ #ifndef LOBBYMENU_HPP_ #define LOBBYMENU_HPP_ -#include "base_scene.hpp" - +//graphics & utilities #include "image.hpp" #include "raster_font.hpp" #include "button.hpp" - #include "config_utility.hpp" + +//map +#include "region.hpp" + +//network #include "udp_network_utility.hpp" #include "serial_packet.hpp" #include "serial.hpp" +//client +#include "base_scene.hpp" + +//STL #include class LobbyMenu : public BaseScene { @@ -71,8 +78,11 @@ protected: //server list struct ServerInformation { - std::string name; IPaddress address; + //TODO: version info + std::string name; + int playerCount; + bool compatible; }; std::vector serverInfo; diff --git a/common/network/serial.cpp b/common/network/serial.cpp index 8ad8a89..ee88937 100644 --- a/common/network/serial.cpp +++ b/common/network/serial.cpp @@ -36,7 +36,20 @@ void serializeType(SerialPacket* packet, char* buffer) { void serializeServer(SerialPacket* packet, char* buffer) { memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type)); buffer += sizeof(SerialPacket::Type); + + //server info + //Note: version info serialization goes here memcpy(buffer, packet->serverInfo.name, PACKET_STRING_SIZE); + buffer += PACKET_STRING_SIZE; + memcpy(buffer, &packet->serverInfo.playerCount, sizeof(int)); + buffer += sizeof(int); + + //map format + memcpy(buffer, &packet->serverInfo.regionWidth, sizeof(int)); + buffer += sizeof(int); + memcpy(buffer, &packet->serverInfo.regionHeight, sizeof(int)); + buffer += sizeof(int); + memcpy(buffer, &packet->serverInfo.regionDepth, sizeof(int)); } void serializeClient(SerialPacket* packet, char* buffer) { @@ -114,7 +127,20 @@ void deserializeType(SerialPacket* packet, char* buffer) { void deserializeServer(SerialPacket* packet, char* buffer) { memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type)); buffer += sizeof(SerialPacket::Type); + + //server info + //Note: version info deserialization goes here memcpy(packet->serverInfo.name, buffer, PACKET_STRING_SIZE); + buffer += PACKET_STRING_SIZE; + memcpy(&packet->serverInfo.playerCount, buffer, sizeof(int)); + buffer += sizeof(int); + + //map format + memcpy(&packet->serverInfo.regionWidth, buffer, sizeof(int)); + buffer += sizeof(int); + memcpy(&packet->serverInfo.regionHeight, buffer, sizeof(int)); + buffer += sizeof(int); + memcpy(&packet->serverInfo.regionDepth, buffer, sizeof(int)); } void deserializeClient(SerialPacket* packet, char* buffer) { diff --git a/common/network/serial_packet.hpp b/common/network/serial_packet.hpp index 8c023d5..84f4a39 100644 --- a/common/network/serial_packet.hpp +++ b/common/network/serial_packet.hpp @@ -79,8 +79,12 @@ union SerialPacket { Metadata meta; //TODO: version info char name[PACKET_STRING_SIZE]; - //TODO: player count - //TODO: map format + int playerCount; + + //map format + int regionWidth; + int regionHeight; + int regionDepth; }serverInfo; //information about the client diff --git a/server/server_application.cpp b/server/server_application.cpp index 390a347..bba6c26 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -176,10 +176,16 @@ void ServerApplication::HandlePacket(SerialPacket packet) { void ServerApplication::HandleBroadcastRequest(SerialPacket packet) { //send back the server's metadata packet.meta.type = SerialPacket::Type::BROADCAST_RESPONSE; + + //pack the data //TODO: version info snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str()); - //TODO: player count - //TODO: map format + packet.serverInfo.playerCount = playerMap.size(); + packet.serverInfo.regionWidth = REGION_WIDTH; + packet.serverInfo.regionHeight = REGION_HEIGHT; + packet.serverInfo.regionDepth = REGION_DEPTH; + + //send the data char buffer[PACKET_BUFFER_SIZE]; serialize(&packet, buffer); network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);