Allow re-enter password instantly for failed private server joining

This commit is contained in:
Benau 2020-04-30 07:43:14 +08:00
parent 1bd34e338e
commit cc9980f2a4
6 changed files with 33 additions and 2 deletions

View File

@ -39,14 +39,18 @@
#include "modes/profile_world.hpp"
#include "network/network_config.hpp"
#include "network/network_timer_synchronizer.hpp"
#include "network/protocols/client_lobby.hpp"
#include "network/protocols/game_protocol.hpp"
#include "network/protocol_manager.hpp"
#include "network/race_event_manager.hpp"
#include "network/rewind_manager.hpp"
#include "network/server.hpp"
#include "network/stk_host.hpp"
#include "online/request_manager.hpp"
#include "race/history.hpp"
#include "race/race_manager.hpp"
#include "states_screens/dialogs/server_info_dialog.hpp"
#include "states_screens/online/server_selection.hpp"
#include "states_screens/state_manager.hpp"
#include "utils/profiler.hpp"
#include "utils/string_utils.hpp"
@ -431,6 +435,10 @@ void MainLoop::run()
if ((STKHost::existHost() && STKHost::get()->requestedShutdown()) ||
m_request_abort)
{
bool was_lan = NetworkConfig::get()->isLAN();
std::shared_ptr<Server> rejoin_server;
if (auto cl = LobbyProtocol::get<ClientLobby>())
rejoin_server = cl->getJoinedServer();
bool exist_host = STKHost::existHost();
core::stringw msg = _("Server connection timed out.");
@ -481,7 +489,19 @@ void MainLoop::run()
NetworkConfig::get()->getResetScreens().data());
MessageQueue::add(MessageQueue::MT_ERROR, msg);
}
NetworkConfig::get()->unsetNetworking();
if (rejoin_server)
{
if (was_lan)
NetworkConfig::get()->setIsLAN();
else
NetworkConfig::get()->setIsWAN();
NetworkConfig::get()->setIsServer(false);
ServerSelection::getInstance()->push();
rejoin_server->setReconnectWhenQuitLobby(false);
new ServerInfoDialog(rejoin_server);
}
else
NetworkConfig::get()->unsetNetworking();
}
if (m_request_abort)

View File

@ -925,6 +925,7 @@ void ClientLobby::connectionRefused(Event* event)
break;
}
case RR_INCORRECT_PASSWORD:
m_server->setReconnectWhenQuitLobby(true);
STKHost::get()->setErrorMessage(
_("Connection refused: Server password is incorrect."));
break;

View File

@ -186,6 +186,7 @@ public:
void handleClientCommand(const std::string& cmd);
void updateAssetsToServer();
ClientState getCurrentState() const { return m_state.load(); }
std::shared_ptr<Server> getJoinedServer() const { return m_server; }
};
#endif // CLIENT_LOBBY_HPP

View File

@ -39,6 +39,7 @@ Server::Server(const XMLNode& server_info) : m_supports_encrytion(true)
const XMLNode& xml = *server_info.getNode("server-info");
m_address.reset(new SocketAddress());
m_reconnect_when_quit_lobby = false;
m_ipv6_connection = false;
m_name = "";
m_server_id = 0;

View File

@ -100,6 +100,8 @@ protected:
bool m_ipv6_connection;
bool m_reconnect_when_quit_lobby;
std::vector<std::tuple<
/*rank*/int, core::stringw, /*scores*/double, /*playing time*/float
> > m_players;
@ -199,6 +201,11 @@ public:
}
// ------------------------------------------------------------------------
virtual void saveServer() const {}
// ------------------------------------------------------------------------
bool reconnectWhenQuitLobby() const { return m_reconnect_when_quit_lobby; }
// ------------------------------------------------------------------------
void setReconnectWhenQuitLobby(bool val)
{ m_reconnect_when_quit_lobby = val; }
}; // Server
class UserDefinedServer : public Server

View File

@ -63,18 +63,19 @@ ServerInfoDialog::ServerInfoDialog(std::shared_ptr<Server> server)
assert(m_join_widget != NULL);
m_cancel_widget = getWidget<IconButtonWidget>("cancel");
assert(m_cancel_widget != NULL);
m_options_widget->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
if (m_server->isPasswordProtected())
{
m_password = getWidget<TextBoxWidget>("password");
m_password->setPasswordBox(true, L'*');
assert(m_password != NULL);
m_password->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
}
else
{
Widget* password_box = getWidget("password-box");
password_box->setCollapsed(true); // FIXME Doesn't reuse free space for other widgets
m_options_widget->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
}
core::stringw difficulty = RaceManager::get()->getDifficultyName(