diff --git a/src/network/protocols/client_lobby.cpp b/src/network/protocols/client_lobby.cpp index 4c0804ccb..cabf7ac71 100644 --- a/src/network/protocols/client_lobby.cpp +++ b/src/network/protocols/client_lobby.cpp @@ -96,6 +96,7 @@ ClientLobby::ClientLobby(const TransportAddress& a, std::shared_ptr s) m_first_connect = true; m_spectator = false; m_server_live_joinable = false; + m_server_send_live_load_world = false; } // ClientLobby //----------------------------------------------------------------------------- @@ -116,6 +117,7 @@ ClientLobby::~ClientLobby() void ClientLobby::setup() { m_spectator = false; + m_server_send_live_load_world = false; m_auto_back_to_lobby_time = std::numeric_limits::max(); m_start_live_game_time = std::numeric_limits::max(); m_received_server_result = false; @@ -254,9 +256,12 @@ void ClientLobby::addAllPlayers(Event* event) std::shared_ptr peer = event->getPeerSP(); peer->cleanPlayerProfiles(); + m_server_send_live_load_world = data.getUInt8() == 1; + std::vector > players; unsigned player_count = data.getUInt8(); + bool is_specator = true; for (unsigned i = 0; i < player_count; i++) { core::stringw player_name; @@ -269,6 +274,8 @@ void ClientLobby::addAllPlayers(Event* event) KartTeam team = (KartTeam)data.getUInt8(); std::string country_id; data.decodeString(&country_id); + if (host_id == STKHost::get()->getMyHostId()) + is_specator = false; auto player = std::make_shared(peer, player_name, host_id, kart_color, online_id, ppd, local_id, team, country_id); std::string kart_name; @@ -276,6 +283,8 @@ void ClientLobby::addAllPlayers(Event* event) player->setKartName(kart_name); players.push_back(player); } + setSpectator(is_specator); + uint32_t random_seed = data.getUInt32(); ItemManager::updateRandomSeed(random_seed); if (race_manager->isBattleMode()) @@ -294,8 +303,7 @@ void ClientLobby::addAllPlayers(Event* event) // Disable until render gui during loading is bug free //StateManager::get()->enterGameState(); - // Live join or spectate if state is CONNECTED - if (m_state.load() == CONNECTED) + if (m_server_send_live_load_world) { World* w = World::getWorld(); w->setLiveJoinWorld(true); @@ -1110,8 +1118,7 @@ void ClientLobby::backToLobby(Event *event) void ClientLobby::finishedLoadingWorld() { NetworkString* ns = getNetworkString(1); - // Live join or spectate if state is CONNECTED - ns->setSynchronous(m_state.load() == CONNECTED); + ns->setSynchronous(m_server_send_live_load_world); ns->addUInt8(LE_CLIENT_LOADED_WORLD); sendToServer(ns, true); delete ns; diff --git a/src/network/protocols/client_lobby.hpp b/src/network/protocols/client_lobby.hpp index fe4615665..18561e065 100644 --- a/src/network/protocols/client_lobby.hpp +++ b/src/network/protocols/client_lobby.hpp @@ -101,6 +101,8 @@ private: bool m_server_live_joinable; + bool m_server_send_live_load_world; + uint64_t m_auto_back_to_lobby_time; uint64_t m_start_live_game_time; diff --git a/src/network/protocols/server_lobby.cpp b/src/network/protocols/server_lobby.cpp index 035f7e310..0d021a94f 100644 --- a/src/network/protocols/server_lobby.cpp +++ b/src/network/protocols/server_lobby.cpp @@ -601,7 +601,8 @@ void ServerLobby::asynchronousUpdate() // Add placeholder players for live join addLiveJoinPlaceholder(players); - NetworkString* load_world_message = getLoadWorldMessage(players); + NetworkString* load_world_message = getLoadWorldMessage(players, + false/*live_join*/); m_game_setup->setHitCaptureTime(m_battle_hit_capture_limit, m_battle_time_limit); uint16_t flag_return_time = (uint16_t)stk_config->time2Ticks( @@ -628,14 +629,16 @@ void ServerLobby::asynchronousUpdate() //----------------------------------------------------------------------------- NetworkString* ServerLobby::getLoadWorldMessage( - std::vector >& players) const + std::vector >& players, + bool live_join) const { NetworkString* load_world_message = getNetworkString(); load_world_message->setSynchronous(true); load_world_message->addUInt8(LE_LOAD_WORLD); load_world_message->addUInt32(m_winner_peer_id); m_default_vote->encode(load_world_message); - load_world_message->addUInt8((uint8_t)players.size()); + load_world_message->addUInt8(live_join ? 1 : 0). + addUInt8((uint8_t)players.size()); for (unsigned i = 0; i < players.size(); i++) { std::shared_ptr& player = players[i]; @@ -830,7 +833,8 @@ void ServerLobby::liveJoinRequest(Event* event) } players.push_back(player); } - NetworkString* load_world_message = getLoadWorldMessage(players); + NetworkString* load_world_message = getLoadWorldMessage(players, + true/*live_join*/); peer->sendPacket(load_world_message, true/*reliable*/); delete load_world_message; peer->updateLastActivity(); diff --git a/src/network/protocols/server_lobby.hpp b/src/network/protocols/server_lobby.hpp index 5a7b9953d..d33dbb28b 100644 --- a/src/network/protocols/server_lobby.hpp +++ b/src/network/protocols/server_lobby.hpp @@ -281,7 +281,8 @@ private: void addLiveJoinPlaceholder( std::vector >& players) const; NetworkString* getLoadWorldMessage( - std::vector >& players) const; + std::vector >& players, + bool live_join) const; void setPlayerKarts(const NetworkString& ns, STKPeer* peer) const; void liveJoinRequest(Event* event); void rejectLiveJoin(STKPeer* peer, BackLobbyReason blr); diff --git a/src/states_screens/online/networking_lobby.cpp b/src/states_screens/online/networking_lobby.cpp index 9fd156079..1ebfe1a91 100644 --- a/src/states_screens/online/networking_lobby.cpp +++ b/src/states_screens/online/networking_lobby.cpp @@ -584,7 +584,6 @@ void NetworkingLobby::eventCallback(Widget* widget, const std::string& name, auto cl = LobbyProtocol::get(); if (m_client_live_joinable && cl) { - cl->setSpectator(true); NetworkString start(PROTOCOL_LOBBY_ROOM); start.setSynchronous(true); start.addUInt8(LobbyProtocol::LE_LIVE_JOIN)