Skip to content

Commit a22bbf9

Browse files
committed
[ServerConnectState] Now prints connection error messages instead of closing the client.
1 parent 9f09a0a commit a22bbf9

File tree

6 files changed

+58
-12
lines changed

6 files changed

+58
-12
lines changed

source/client/network/Client.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ void Client::connect(sf::IpAddress serverAddress, u16 serverPort) {
3737

3838
m_tcpSocket.reset(new sf::TcpSocket);
3939
if (serverAddress.toInteger() == 0 || m_tcpSocket->connect(serverAddress, serverPort, sf::seconds(5)) != sf::Socket::Done)
40-
throw EXCEPTION("Network error: Unable to connect to server", serverAddress.toString() + ":" + std::to_string(serverPort));
40+
throw ClientConnectException("Network error: Unable to connect to server " + serverAddress.toString() + ":" + std::to_string(serverPort));
4141

4242
if (m_socket.bind(0) != sf::Socket::Done)
43-
throw EXCEPTION("Network error: Bind failed");
43+
throw ClientConnectException("Network error: Bind failed");
4444

4545
sf::Packet packet;
4646
packet << Network::Command::ClientConnect << sf::IpAddress::getLocalAddress().toString() << m_socket.getLocalPort();
@@ -52,15 +52,15 @@ void Client::connect(sf::IpAddress serverAddress, u16 serverPort) {
5252
Network::Command command;
5353
answer >> command;
5454
if (command == Network::Command::ClientRefused)
55-
throw EXCEPTION("Server error: Connection refused. Server probably reached max player amount.");
55+
throw ClientConnectException("Server error: Connection refused. Server probably reached max player amount.");
5656

5757
bool isSingleplayer;
5858
if (command != Network::Command::ClientOk)
59-
throw EXCEPTION("Network error: Expected 'ClientOk' packet.");
59+
throw ClientConnectException("Network error: Expected 'ClientOk' packet.");
6060

6161
answer >> m_id >> isSingleplayer;
6262
if (m_isSingleplayer != isSingleplayer)
63-
throw EXCEPTION("Client error: The server is not valid");
63+
throw ClientConnectException("Client error: The server is not valid");
6464

6565
m_tcpSocket->setBlocking(false);
6666
m_socket.setBlocking(false);

source/client/network/Client.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@
3939

4040
#include "Network.hpp"
4141

42+
class ClientConnectException {
43+
public:
44+
ClientConnectException(const std::string &str)
45+
: m_str(str) {}
46+
47+
virtual const char *what() const noexcept {
48+
return m_str.c_str();
49+
}
50+
51+
private:
52+
std::string m_str;
53+
};
54+
4255
class Client {
4356
using CommandCallback = std::function<void(sf::Packet &packet)>;
4457

source/client/states/GameState.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@
4949
GameState::GameState()
5050
: m_textureAtlas(gk::ResourceHandler::getInstance().get<TextureAtlas>("atlas-blocks"))
5151
{
52-
gk::Mouse::setCursorVisible(false);
53-
gk::Mouse::setCursorGrabbed(true);
54-
5552
initShaders();
5653

5754
m_clientCommandHandler.setupCallbacks();
@@ -69,6 +66,9 @@ void GameState::init() {
6966
void GameState::connect(const std::string &host, int port) {
7067
m_client.connect(host, port);
7168
m_player.setClientID(m_client.id());
69+
70+
gk::Mouse::setCursorVisible(false);
71+
gk::Mouse::setCursorGrabbed(true);
7272
}
7373

7474
void GameState::onEvent(const SDL_Event &event) {

source/client/states/ServerConnectState.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,25 @@ ServerConnectState::ServerConnectState(gk::ApplicationState *parent) : Interface
5757
}
5858

5959
auto &game = m_stateStack->push<GameState>();
60-
game.connect(host, port);
6160

62-
auto &serverLoadingState = m_stateStack->push<ServerLoadingState>(game, true, this);
63-
serverLoadingState.setTexturePack(m_texturePack);
61+
try {
62+
game.connect(host, port);
63+
64+
auto &serverLoadingState = m_stateStack->push<ServerLoadingState>(game, true, this);
65+
serverLoadingState.setTexturePack(m_texturePack);
66+
}
67+
catch (ClientConnectException &e) {
68+
gkError() << e.what();
69+
70+
m_stateStack->pop();
71+
72+
m_errorText.setText(e.what());
73+
m_errorText.updateVertexBuffer();
74+
m_errorText.setPosition(
75+
Config::screenWidth / 2.0f - m_errorText.getSize().x * Config::guiScale / 2.0f,
76+
Config::screenHeight / 2.0f - 30 * Config::guiScale
77+
);
78+
}
6479
});
6580

6681
m_cancelButton.setText("Cancel");
@@ -69,6 +84,9 @@ ServerConnectState::ServerConnectState(gk::ApplicationState *parent) : Interface
6984
m_cancelButton.setCallback([this](TextButton &) {
7085
m_stateStack->pop();
7186
});
87+
88+
m_errorText.setColor(gk::Color::Red);
89+
m_errorText.setScale(Config::guiScale, Config::guiScale);
7290
}
7391

7492
void ServerConnectState::onEvent(const SDL_Event &event) {
@@ -80,6 +98,11 @@ void ServerConnectState::onEvent(const SDL_Event &event) {
8098

8199
m_connectButton.setPosition(Config::screenWidth / 2.0f - m_connectButton.getGlobalBounds().sizeX / 2, Config::screenHeight - 340);
82100
m_cancelButton.setPosition(Config::screenWidth / 2.0f - m_cancelButton.getGlobalBounds().sizeX / 2, Config::screenHeight - 261);
101+
102+
m_errorText.setPosition(
103+
Config::screenWidth / 2.0f - m_errorText.getSize().x * Config::guiScale / 2.0f,
104+
Config::screenHeight / 2.0f - 30 * Config::guiScale
105+
);
83106
}
84107

85108
if (!m_stateStack->empty() && &m_stateStack->top() == this) {
@@ -104,6 +127,9 @@ void ServerConnectState::draw(gk::RenderTarget &target, gk::RenderStates states)
104127

105128
target.draw(m_connectButton, states);
106129
target.draw(m_cancelButton, states);
130+
131+
if (!m_errorText.text().empty())
132+
target.draw(m_errorText, states);
107133
}
108134
}
109135

source/client/states/ServerConnectState.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class ServerConnectState : public InterfaceState {
4949
TextButton m_connectButton;
5050
TextButton m_cancelButton;
5151

52+
Text m_errorText;
53+
5254
std::string m_texturePack;
5355
};
5456

source/client/states/TitleScreenState.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,12 @@ void TitleScreenState::startSingleplayer(bool showLoadingState) {
118118

119119
void TitleScreenState::startMultiplayer(const std::string &host) {
120120
auto &game = m_stateStack->push<GameState>();
121-
game.connect(host, m_port);
121+
try {
122+
game.connect(host, m_port);
123+
}
124+
catch (ClientConnectException &e) {
125+
throw EXCEPTION(e.what());
126+
}
122127

123128
auto &serverLoadingState = m_stateStack->push<ServerLoadingState>(game, false, this);
124129
serverLoadingState.setTexturePack(m_texturePack);

0 commit comments

Comments
 (0)