Allow resynchronize players list for battle mode before starting

This commit is contained in:
Benau 2019-04-16 14:32:32 +08:00
parent 54375ab682
commit 4db16ce701
3 changed files with 48 additions and 0 deletions

View File

@ -327,6 +327,12 @@ public:
unsigned int getCurrentNumPlayers() const { return m_num_players -
m_eliminated_players;}
// ------------------------------------------------------------------------
void resetElimination()
{
m_eliminated_karts = 0;
m_eliminated_players = 0;
}
// ------------------------------------------------------------------------
virtual void addReservedKart(int kart_id)
{
if (m_eliminated_karts > 0)

View File

@ -1169,6 +1169,40 @@ void ClientLobby::liveJoinAcknowledged(Event* event)
assert(nim);
nim->restoreCompleteState(data);
w->restoreCompleteState(data);
if (race_manager->supportsLiveJoining() && data.size() > 0)
{
// Get and update the players list 1 more time in case the was
// player connection or disconnection
std::vector<std::shared_ptr<NetworkPlayerProfile> > players =
decodePlayers(data);
w->resetElimination();
for (unsigned i = 0; i < players.size(); i++)
{
AbstractKart* k = w->getKart(i);
if (k->getController()->isLocalPlayerController())
continue;
k->reset();
// Only need to change non local player karts
RemoteKartInfo& rki = race_manager->getKartInfo(i);
rki.copyFrom(players[i], players[i]->getLocalPlayerId());
if (rki.isReserved())
{
World::getWorld()->eliminateKart(i,
false/*notify_of_elimination*/);
k->setPosition(
World::getWorld()->getCurrentNumKarts() + 1);
k->finishedRace(World::getWorld()->getTime(),
true/*from_server*/);
}
else
{
// Will be reset once again after live join is finished
addLiveJoiningKart(i, rki, 0/*live_join_util_ticks*/);
k->getNode()->setVisible(false);
}
}
}
} // liveJoinAcknowledged
//-----------------------------------------------------------------------------

View File

@ -1032,6 +1032,14 @@ void ServerLobby::finishedLoadingLiveJoinClient(Event* event)
nim->addLiveJoinPeer(peer);
w->saveCompleteState(ns);
if (race_manager->supportsLiveJoining())
{
// Only needed in non-racing mode as no need players can added after
// starting of race
std::vector<std::shared_ptr<NetworkPlayerProfile> > players =
getLivePlayers();
encodePlayers(ns, players);
}
m_peers_ready[peer] = false;
peer->setWaitingForGame(false);