Determine live join by server

This commit is contained in:
Benau 2019-03-24 16:44:03 +08:00
parent 2aede6fa25
commit 366ee5caad
5 changed files with 23 additions and 10 deletions

View File

@ -96,6 +96,7 @@ ClientLobby::ClientLobby(const TransportAddress& a, std::shared_ptr<Server> 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<uint64_t>::max();
m_start_live_game_time = std::numeric_limits<uint64_t>::max();
m_received_server_result = false;
@ -254,9 +256,12 @@ void ClientLobby::addAllPlayers(Event* event)
std::shared_ptr<STKPeer> peer = event->getPeerSP();
peer->cleanPlayerProfiles();
m_server_send_live_load_world = data.getUInt8() == 1;
std::vector<std::shared_ptr<NetworkPlayerProfile> > 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<NetworkPlayerProfile>(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;

View File

@ -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;

View File

@ -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<std::shared_ptr<NetworkPlayerProfile> >& players) const
std::vector<std::shared_ptr<NetworkPlayerProfile> >& 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<NetworkPlayerProfile>& 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();

View File

@ -281,7 +281,8 @@ private:
void addLiveJoinPlaceholder(
std::vector<std::shared_ptr<NetworkPlayerProfile> >& players) const;
NetworkString* getLoadWorldMessage(
std::vector<std::shared_ptr<NetworkPlayerProfile> >& players) const;
std::vector<std::shared_ptr<NetworkPlayerProfile> >& players,
bool live_join) const;
void setPlayerKarts(const NetworkString& ns, STKPeer* peer) const;
void liveJoinRequest(Event* event);
void rejectLiveJoin(STKPeer* peer, BackLobbyReason blr);

View File

@ -584,7 +584,6 @@ void NetworkingLobby::eventCallback(Widget* widget, const std::string& name,
auto cl = LobbyProtocol::get<ClientLobby>();
if (m_client_live_joinable && cl)
{
cl->setSpectator(true);
NetworkString start(PROTOCOL_LOBBY_ROOM);
start.setSynchronous(true);
start.addUInt8(LobbyProtocol::LE_LIVE_JOIN)