Allow going back to lobby in selecting karts or tracks phase
It allows player to be spectator later
This commit is contained in:
parent
0355922116
commit
4e2b843f71
@ -303,7 +303,7 @@ bool ServerLobby::notifyEvent(Event* event)
|
|||||||
case LE_LIVE_JOIN: liveJoinRequest(event); break;
|
case LE_LIVE_JOIN: liveJoinRequest(event); break;
|
||||||
case LE_CLIENT_LOADED_WORLD: finishedLoadingLiveJoinClient(event); break;
|
case LE_CLIENT_LOADED_WORLD: finishedLoadingLiveJoinClient(event); break;
|
||||||
case LE_KART_INFO: handleKartInfo(event); break;
|
case LE_KART_INFO: handleKartInfo(event); break;
|
||||||
case LE_CLIENT_BACK_LOBBY: clientWantsToBackLobby(event); break;
|
case LE_CLIENT_BACK_LOBBY: clientInGameWantsToBackLobby(event); break;
|
||||||
default: Log::error("ServerLobby", "Unknown message type %d - ignored.",
|
default: Log::error("ServerLobby", "Unknown message type %d - ignored.",
|
||||||
message_type);
|
message_type);
|
||||||
break;
|
break;
|
||||||
@ -409,6 +409,8 @@ bool ServerLobby::notifyEventAsynchronous(Event* event)
|
|||||||
case LE_CHAT: handleChat(event); break;
|
case LE_CHAT: handleChat(event); break;
|
||||||
case LE_CONFIG_SERVER: handleServerConfiguration(event); break;
|
case LE_CONFIG_SERVER: handleServerConfiguration(event); break;
|
||||||
case LE_CHANGE_HANDICAP: changeHandicap(event); break;
|
case LE_CHANGE_HANDICAP: changeHandicap(event); break;
|
||||||
|
case LE_CLIENT_BACK_LOBBY:
|
||||||
|
clientSelectingAssetsWantsToBackLobby(event); break;
|
||||||
default: break;
|
default: break;
|
||||||
} // switch
|
} // switch
|
||||||
} // if (event->getType() == EVENT_TYPE_MESSAGE)
|
} // if (event->getType() == EVENT_TYPE_MESSAGE)
|
||||||
@ -3466,7 +3468,7 @@ void ServerLobby::handleKartInfo(Event* event)
|
|||||||
/** Client if currently in-game (including spectator) wants to go back to
|
/** Client if currently in-game (including spectator) wants to go back to
|
||||||
* lobby.
|
* lobby.
|
||||||
*/
|
*/
|
||||||
void ServerLobby::clientWantsToBackLobby(Event* event)
|
void ServerLobby::clientInGameWantsToBackLobby(Event* event)
|
||||||
{
|
{
|
||||||
World* w = World::getWorld();
|
World* w = World::getWorld();
|
||||||
std::shared_ptr<STKPeer> peer = event->getPeerSP();
|
std::shared_ptr<STKPeer> peer = event->getPeerSP();
|
||||||
@ -3513,4 +3515,36 @@ void ServerLobby::clientWantsToBackLobby(Event* event)
|
|||||||
m_game_setup->addServerInfo(server_info);
|
m_game_setup->addServerInfo(server_info);
|
||||||
peer->sendPacket(server_info, /*reliable*/true);
|
peer->sendPacket(server_info, /*reliable*/true);
|
||||||
delete server_info;
|
delete server_info;
|
||||||
} // clientWantsToBackLobby
|
} // clientInGameWantsToBackLobby
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
/** Client if currently select assets wants to go back to lobby.
|
||||||
|
*/
|
||||||
|
void ServerLobby::clientSelectingAssetsWantsToBackLobby(Event* event)
|
||||||
|
{
|
||||||
|
std::shared_ptr<STKPeer> peer = event->getPeerSP();
|
||||||
|
|
||||||
|
if (m_state.load() != SELECTING || peer->isWaitingForGame())
|
||||||
|
{
|
||||||
|
Log::warn("ServerLobby",
|
||||||
|
"%s try to leave selecting assets at wrong time.",
|
||||||
|
peer->getAddress().toString().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_peers_ready.erase(peer);
|
||||||
|
peer->setWaitingForGame(true);
|
||||||
|
|
||||||
|
NetworkString* reset = getNetworkString(2);
|
||||||
|
reset->setSynchronous(true);
|
||||||
|
reset->addUInt8(LE_BACK_LOBBY).addUInt8(BLR_NONE);
|
||||||
|
peer->sendPacket(reset, /*reliable*/true);
|
||||||
|
delete reset;
|
||||||
|
updatePlayerList();
|
||||||
|
NetworkString* server_info = getNetworkString();
|
||||||
|
server_info->setSynchronous(true);
|
||||||
|
server_info->addUInt8(LE_SERVER_INFO);
|
||||||
|
m_game_setup->addServerInfo(server_info);
|
||||||
|
peer->sendPacket(server_info, /*reliable*/true);
|
||||||
|
delete server_info;
|
||||||
|
} // clientSelectingAssetsWantsToBackLobby
|
||||||
|
@ -286,7 +286,8 @@ private:
|
|||||||
int getReservedId(std::shared_ptr<NetworkPlayerProfile>& p,
|
int getReservedId(std::shared_ptr<NetworkPlayerProfile>& p,
|
||||||
unsigned local_id) const;
|
unsigned local_id) const;
|
||||||
void handleKartInfo(Event* event);
|
void handleKartInfo(Event* event);
|
||||||
void clientWantsToBackLobby(Event* event);
|
void clientInGameWantsToBackLobby(Event* event);
|
||||||
|
void clientSelectingAssetsWantsToBackLobby(Event* event);
|
||||||
public:
|
public:
|
||||||
ServerLobby();
|
ServerLobby();
|
||||||
virtual ~ServerLobby();
|
virtual ~ServerLobby();
|
||||||
|
@ -45,10 +45,6 @@ void NetworkKartSelectionScreen::init()
|
|||||||
updateProgressBarText();
|
updateProgressBarText();
|
||||||
}
|
}
|
||||||
|
|
||||||
// change the back button image (because it makes the game quit)
|
|
||||||
IconButtonWidget* back_button = getWidget<IconButtonWidget>("back");
|
|
||||||
back_button->setImage("gui/icons/main_quit.png");
|
|
||||||
|
|
||||||
DynamicRibbonWidget* w = getWidget<DynamicRibbonWidget>("karts");
|
DynamicRibbonWidget* w = getWidget<DynamicRibbonWidget>("karts");
|
||||||
assert(w != NULL);
|
assert(w != NULL);
|
||||||
for (auto& p : NetworkConfig::get()->getNetworkPlayers())
|
for (auto& p : NetworkConfig::get()->getNetworkPlayers())
|
||||||
@ -66,6 +62,7 @@ void NetworkKartSelectionScreen::init()
|
|||||||
w->setSelection(0, 0, true);
|
w->setSelection(0, 0, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_exit_timeout = std::numeric_limits<uint64_t>::max();
|
||||||
} // init
|
} // init
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -74,6 +71,16 @@ void NetworkKartSelectionScreen::init()
|
|||||||
*/
|
*/
|
||||||
void NetworkKartSelectionScreen::onUpdate(float dt)
|
void NetworkKartSelectionScreen::onUpdate(float dt)
|
||||||
{
|
{
|
||||||
|
if (StkTime::getRealTimeMs() > m_exit_timeout)
|
||||||
|
{
|
||||||
|
// Reset the screen to networking menu if failed to back to lobby
|
||||||
|
STKHost::get()->shutdown();
|
||||||
|
StateManager::get()->resetAndSetStack(
|
||||||
|
NetworkConfig::get()->getResetScreens().data());
|
||||||
|
NetworkConfig::get()->unsetNetworking();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
KartSelectionScreen::onUpdate(dt);
|
KartSelectionScreen::onUpdate(dt);
|
||||||
updateProgressBarText();
|
updateProgressBarText();
|
||||||
} // onUpdate
|
} // onUpdate
|
||||||
@ -131,9 +138,19 @@ void NetworkKartSelectionScreen::allPlayersDone()
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
bool NetworkKartSelectionScreen::onEscapePressed()
|
bool NetworkKartSelectionScreen::onEscapePressed()
|
||||||
{
|
{
|
||||||
// then remove the lobby screen (you left the server)
|
if (!m_live_join)
|
||||||
StateManager::get()->popMenu();
|
{
|
||||||
STKHost::get()->shutdown();
|
if (m_exit_timeout == std::numeric_limits<uint64_t>::max())
|
||||||
|
{
|
||||||
|
// Send go back lobby event to server with an exit timeout, so if
|
||||||
|
// server doesn't react in time we exit the server
|
||||||
|
m_exit_timeout = StkTime::getRealTimeMs() + 5000;
|
||||||
|
NetworkString back(PROTOCOL_LOBBY_ROOM);
|
||||||
|
back.addUInt8(LobbyProtocol::LE_CLIENT_BACK_LOBBY);
|
||||||
|
STKHost::get()->sendToServer(&back, true);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true; // remove the screen
|
return true; // remove the screen
|
||||||
} // onEscapePressed
|
} // onEscapePressed
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ private:
|
|||||||
|
|
||||||
bool m_live_join;
|
bool m_live_join;
|
||||||
|
|
||||||
|
uint64_t m_exit_timeout;
|
||||||
protected:
|
protected:
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
NetworkKartSelectionScreen()
|
NetworkKartSelectionScreen()
|
||||||
|
Loading…
Reference in New Issue
Block a user