Show message for back to lobby if needed

This commit is contained in:
Benau
2019-01-02 12:44:18 +08:00
parent 55430a31a2
commit 0e4424b3ea
5 changed files with 60 additions and 25 deletions

View File

@@ -148,7 +148,7 @@ bool ClientLobby::notifyEvent(Event* event)
case LE_START_SELECTION: startSelection(event); break;
case LE_LOAD_WORLD: addAllPlayers(event); break;
case LE_RACE_FINISHED: raceFinished(event); break;
case LE_EXIT_RESULT: exitResultScreen(event); break;
case LE_BACK_LOBBY: backToLobby(event); break;
case LE_UPDATE_PLAYER_LIST: updatePlayerList(event); break;
case LE_CHAT: handleChat(event); break;
case LE_CONNECTION_ACCEPTED: connectionAccepted(event); break;
@@ -937,7 +937,7 @@ void ClientLobby::raceFinished(Event* event)
/** Called when the server informs the clients to exit the race result screen.
* It exits the race, and goes back to the lobby.
*/
void ClientLobby::exitResultScreen(Event *event)
void ClientLobby::backToLobby(Event *event)
{
// In case the user opened a user info dialog
GUIEngine::ModalDialog::dismiss();
@@ -948,7 +948,32 @@ void ClientLobby::exitResultScreen(Event *event)
m_auto_started = false;
m_state.store(CONNECTED);
RaceResultGUI::getInstance()->backToLobby();
} // exitResultScreen
NetworkString &data = event->data();
core::stringw msg;
switch ((BackLobbyReason)data.getUInt8()) // the second byte
{
case BLR_NO_GAME_FOR_LIVE_JOIN:
// I18N: Error message shown if live join failed in network
msg = _("No more game is available for live join.");
break;
case BLR_NO_PLACE_FOR_LIVE_JOIN:
// I18N: Error message shown if live join failed in network
msg = _("No remaining place in the arena - live join disabled.");
break;
case BLR_ONE_PLAYER_IN_RANKED_MATCH:
// I18N: Error message shown if only 1 player remains in network
msg = _("Only 1 player remaining, returning to lobby.");
break;
default:
break;
}
if (!msg.empty())
{
SFXManager::get()->quickSound("anvil");
MessageQueue::add(MessageQueue::MT_ERROR, msg);
}
} // backToLobby
//-----------------------------------------------------------------------------
/** Callback when the world is loaded. The client will inform the server

View File

@@ -42,7 +42,7 @@ private:
void startGame(Event* event);
void startSelection(Event* event);
void raceFinished(Event* event);
void exitResultScreen(Event *event);
void backToLobby(Event *event);
// race votes
void receivePlayerVote(Event* event);
void updatePlayerList(Event* event);

View File

@@ -59,7 +59,7 @@ public:
LE_START_SELECTION, // inform client to start selection
LE_RACE_FINISHED, // race has finished, display result
LE_RACE_FINISHED_ACK, // client went back to lobby
LE_EXIT_RESULT, // Force clients to exit race result screen
LE_BACK_LOBBY, // Force clients to go back to lobby
LE_VOTE, // Track vote
LE_CHAT,
LE_SERVER_OWNERSHIP,
@@ -84,6 +84,14 @@ public:
RR_INVALID_PLAYER = 5
};
enum BackLobbyReason : uint8_t
{
BLR_NONE = 0,
BLR_NO_GAME_FOR_LIVE_JOIN = 1,
BLR_NO_PLACE_FOR_LIVE_JOIN = 2,
BLR_ONE_PLAYER_IN_RANKED_MATCH = 3
};
protected:
/** Vote from each peer. The host id is used as a key. Note that
* host ids can be non-consecutive, so we cannot use std::vector. */

View File

@@ -659,13 +659,14 @@ bool ServerLobby::canLiveJoinNow() const
} // canLiveJoinNow
//-----------------------------------------------------------------------------
/** \ref peer will be reset back to the lobby.
/** \ref STKPeer peer will be reset back to the lobby with reason
* \ref BackLobbyReason blr
*/
void ServerLobby::rejectLiveJoin(STKPeer* peer)
void ServerLobby::rejectLiveJoin(STKPeer* peer, BackLobbyReason blr)
{
NetworkString* reset = getNetworkString(1);
NetworkString* reset = getNetworkString(2);
reset->setSynchronous(true);
reset->addUInt8(LE_EXIT_RESULT);
reset->addUInt8(LE_BACK_LOBBY).addUInt8(blr);
peer->sendPacket(reset, /*reliable*/true);
delete reset;
updatePlayerList();
@@ -688,7 +689,7 @@ void ServerLobby::liveJoinRequest(Event* event)
if (!canLiveJoinNow())
{
rejectLiveJoin(peer);
rejectLiveJoin(peer, BLR_NO_GAME_FOR_LIVE_JOIN);
return;
}
setPlayerKarts(data, peer);
@@ -712,7 +713,7 @@ void ServerLobby::liveJoinRequest(Event* event)
}
Log::info("ServerLobby", "Too many players (%d) try to live join",
(int)peer->getPlayerProfiles().size());
rejectLiveJoin(peer);
rejectLiveJoin(peer, BLR_NO_PLACE_FOR_LIVE_JOIN);
return;
}
@@ -816,7 +817,7 @@ void ServerLobby::finishedLoadingLiveJoinClient(Event* event)
STKPeer* peer = event->getPeer();
if (!canLiveJoinNow())
{
rejectLiveJoin(peer);
rejectLiveJoin(peer, BLR_NO_GAME_FOR_LIVE_JOIN);
return;
}
bool live_joined_in_time = true;
@@ -833,7 +834,7 @@ void ServerLobby::finishedLoadingLiveJoinClient(Event* event)
{
Log::warn("ServerLobby", "%s can't live-join in time.",
peer->getAddress().toString().c_str());
rejectLiveJoin(peer);
rejectLiveJoin(peer, BLR_NO_GAME_FOR_LIVE_JOIN);
return;
}
World* w = World::getWorld();
@@ -951,11 +952,12 @@ void ServerLobby::update(int ticks)
m_state.load() == SELECTING &&
STKHost::get()->getPlayersInGame() == 1)
{
NetworkString* exit_result_screen = getNetworkString(1);
exit_result_screen->setSynchronous(true);
exit_result_screen->addUInt8(LE_EXIT_RESULT);
sendMessageToPeers(exit_result_screen, /*reliable*/true);
delete exit_result_screen;
NetworkString* back_lobby = getNetworkString(1);
back_lobby->setSynchronous(true);
back_lobby->addUInt8(LE_BACK_LOBBY)
.addUInt8(BLR_ONE_PLAYER_IN_RANKED_MATCH);
sendMessageToPeers(back_lobby, /*reliable*/true);
delete back_lobby;
std::lock_guard<std::mutex> lock(m_connection_mutex);
m_game_setup->stopGrandPrix();
resetServer();
@@ -1013,11 +1015,11 @@ void ServerLobby::update(int ticks)
{
// Send a notification to all clients to exit
// the race result screen
NetworkString *exit_result_screen = getNetworkString(1);
exit_result_screen->setSynchronous(true);
exit_result_screen->addUInt8(LE_EXIT_RESULT);
sendMessageToPeers(exit_result_screen, /*reliable*/true);
delete exit_result_screen;
NetworkString* back_to_lobby = getNetworkString(1);
back_to_lobby->setSynchronous(true);
back_to_lobby->addUInt8(LE_BACK_LOBBY).addUInt8(BLR_NONE);
sendMessageToPeers(back_to_lobby, /*reliable*/true);
delete back_to_lobby;
std::lock_guard<std::mutex> lock(m_connection_mutex);
resetServer();
}
@@ -3238,7 +3240,7 @@ void ServerLobby::addLiveJoinPlaceholder(
}
else
{
// CTF or soccer, reserve at least 7 players on each team
// CTF or soccer, reserve at most 7 players on each team
int red_count = 0;
int blue_count = 0;
for (unsigned i = 0; i < players.size(); i++)

View File

@@ -277,7 +277,7 @@ private:
std::vector<std::shared_ptr<NetworkPlayerProfile> >& players) const;
void setPlayerKarts(const NetworkString& ns, STKPeer* peer) const;
void liveJoinRequest(Event* event);
void rejectLiveJoin(STKPeer* peer);
void rejectLiveJoin(STKPeer* peer, BackLobbyReason blr);
bool canLiveJoinNow() const;
int getReservedId(std::shared_ptr<NetworkPlayerProfile>& p,
unsigned local_id) const;