Added rejections for incompatible servers
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
#include "lobby_menu.hpp"
|
#include "lobby_menu.hpp"
|
||||||
|
|
||||||
#include "channels.hpp"
|
#include "channels.hpp"
|
||||||
|
#include "utility.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
@@ -91,9 +92,13 @@ void LobbyMenu::FrameEnd() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LobbyMenu::Render(SDL_Surface* const screen) {
|
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);
|
search.DrawTo(screen);
|
||||||
join.DrawTo(screen);
|
join.DrawTo(screen);
|
||||||
back.DrawTo(screen);
|
back.DrawTo(screen);
|
||||||
|
|
||||||
|
//TODO: draw headers for the server list
|
||||||
for (int i = 0; i < serverInfo.size(); i++) {
|
for (int i = 0; i < serverInfo.size(); i++) {
|
||||||
//draw the selected server's highlight
|
//draw the selected server's highlight
|
||||||
if (selection == &serverInfo[i]) {
|
if (selection == &serverInfo[i]) {
|
||||||
@@ -104,6 +109,16 @@ void LobbyMenu::Render(SDL_Surface* const screen) {
|
|||||||
|
|
||||||
//draw the server name
|
//draw the server name
|
||||||
font.DrawStringTo(serverInfo[i].name, screen, listBox.x, listBox.y + i*listBox.h);
|
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;
|
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
|
//the vars
|
||||||
SerialPacket packet;
|
SerialPacket packet;
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
char buffer[PACKET_BUFFER_SIZE];
|
||||||
@@ -184,9 +199,18 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
|
|||||||
void LobbyMenu::HandlePacket(SerialPacket packet) {
|
void LobbyMenu::HandlePacket(SerialPacket packet) {
|
||||||
switch(packet.meta.type) {
|
switch(packet.meta.type) {
|
||||||
case SerialPacket::Type::BROADCAST_RESPONSE: {
|
case SerialPacket::Type::BROADCAST_RESPONSE: {
|
||||||
|
//extract the data
|
||||||
ServerInformation server;
|
ServerInformation server;
|
||||||
server.name = packet.serverInfo.name;
|
|
||||||
server.address = packet.meta.srcAddress;
|
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);
|
serverInfo.push_back(server);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -22,17 +22,24 @@
|
|||||||
#ifndef LOBBYMENU_HPP_
|
#ifndef LOBBYMENU_HPP_
|
||||||
#define LOBBYMENU_HPP_
|
#define LOBBYMENU_HPP_
|
||||||
|
|
||||||
#include "base_scene.hpp"
|
//graphics & utilities
|
||||||
|
|
||||||
#include "image.hpp"
|
#include "image.hpp"
|
||||||
#include "raster_font.hpp"
|
#include "raster_font.hpp"
|
||||||
#include "button.hpp"
|
#include "button.hpp"
|
||||||
|
|
||||||
#include "config_utility.hpp"
|
#include "config_utility.hpp"
|
||||||
|
|
||||||
|
//map
|
||||||
|
#include "region.hpp"
|
||||||
|
|
||||||
|
//network
|
||||||
#include "udp_network_utility.hpp"
|
#include "udp_network_utility.hpp"
|
||||||
#include "serial_packet.hpp"
|
#include "serial_packet.hpp"
|
||||||
#include "serial.hpp"
|
#include "serial.hpp"
|
||||||
|
|
||||||
|
//client
|
||||||
|
#include "base_scene.hpp"
|
||||||
|
|
||||||
|
//STL
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class LobbyMenu : public BaseScene {
|
class LobbyMenu : public BaseScene {
|
||||||
@@ -71,8 +78,11 @@ protected:
|
|||||||
|
|
||||||
//server list
|
//server list
|
||||||
struct ServerInformation {
|
struct ServerInformation {
|
||||||
std::string name;
|
|
||||||
IPaddress address;
|
IPaddress address;
|
||||||
|
//TODO: version info
|
||||||
|
std::string name;
|
||||||
|
int playerCount;
|
||||||
|
bool compatible;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<ServerInformation> serverInfo;
|
std::vector<ServerInformation> serverInfo;
|
||||||
|
|||||||
@@ -36,7 +36,20 @@ void serializeType(SerialPacket* packet, char* buffer) {
|
|||||||
void serializeServer(SerialPacket* packet, char* buffer) {
|
void serializeServer(SerialPacket* packet, char* buffer) {
|
||||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||||
buffer += sizeof(SerialPacket::Type);
|
buffer += sizeof(SerialPacket::Type);
|
||||||
|
|
||||||
|
//server info
|
||||||
|
//Note: version info serialization goes here
|
||||||
memcpy(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
|
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) {
|
void serializeClient(SerialPacket* packet, char* buffer) {
|
||||||
@@ -114,7 +127,20 @@ void deserializeType(SerialPacket* packet, char* buffer) {
|
|||||||
void deserializeServer(SerialPacket* packet, char* buffer) {
|
void deserializeServer(SerialPacket* packet, char* buffer) {
|
||||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::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);
|
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) {
|
void deserializeClient(SerialPacket* packet, char* buffer) {
|
||||||
|
|||||||
@@ -79,8 +79,12 @@ union SerialPacket {
|
|||||||
Metadata meta;
|
Metadata meta;
|
||||||
//TODO: version info
|
//TODO: version info
|
||||||
char name[PACKET_STRING_SIZE];
|
char name[PACKET_STRING_SIZE];
|
||||||
//TODO: player count
|
int playerCount;
|
||||||
//TODO: map format
|
|
||||||
|
//map format
|
||||||
|
int regionWidth;
|
||||||
|
int regionHeight;
|
||||||
|
int regionDepth;
|
||||||
}serverInfo;
|
}serverInfo;
|
||||||
|
|
||||||
//information about the client
|
//information about the client
|
||||||
|
|||||||
@@ -176,10 +176,16 @@ void ServerApplication::HandlePacket(SerialPacket packet) {
|
|||||||
void ServerApplication::HandleBroadcastRequest(SerialPacket packet) {
|
void ServerApplication::HandleBroadcastRequest(SerialPacket packet) {
|
||||||
//send back the server's metadata
|
//send back the server's metadata
|
||||||
packet.meta.type = SerialPacket::Type::BROADCAST_RESPONSE;
|
packet.meta.type = SerialPacket::Type::BROADCAST_RESPONSE;
|
||||||
|
|
||||||
|
//pack the data
|
||||||
//TODO: version info
|
//TODO: version info
|
||||||
snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str());
|
snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str());
|
||||||
//TODO: player count
|
packet.serverInfo.playerCount = playerMap.size();
|
||||||
//TODO: map format
|
packet.serverInfo.regionWidth = REGION_WIDTH;
|
||||||
|
packet.serverInfo.regionHeight = REGION_HEIGHT;
|
||||||
|
packet.serverInfo.regionDepth = REGION_DEPTH;
|
||||||
|
|
||||||
|
//send the data
|
||||||
char buffer[PACKET_BUFFER_SIZE];
|
char buffer[PACKET_BUFFER_SIZE];
|
||||||
serialize(&packet, buffer);
|
serialize(&packet, buffer);
|
||||||
network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);
|
network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);
|
||||||
|
|||||||
Reference in New Issue
Block a user