Show message for back to lobby if needed
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user