diff --git a/cockatrice/src/client/tabs/tab_game.cpp b/cockatrice/src/client/tabs/tab_game.cpp index 8b29d8c52..e55375708 100644 --- a/cockatrice/src/client/tabs/tab_game.cpp +++ b/cockatrice/src/client/tabs/tab_game.cpp @@ -566,7 +566,7 @@ void TabGame::actCompleterChanged() Player *TabGame::addPlayer(int playerId, const ServerInfo_User &info) { - bool local = ((clients.size() > 1) || (playerId == localPlayerId)); + bool local = clients.size() > 1 || playerId == localPlayerId; auto *newPlayer = new Player(info, playerId, local, judge, this); connect(newPlayer, SIGNAL(openDeckEditor(const DeckLoader *)), this, SIGNAL(openDeckEditor(const DeckLoader *))); QString newPlayerName = "@" + newPlayer->getName(); @@ -850,6 +850,44 @@ void TabGame::eventGameStateChanged(const Event_GameStateChanged &event, const GameEventContext & /*context*/) { const int playerListSize = event.player_list_size(); + + // Always process the local player first so we have an established deckViewcontainer + + for (int i = 0; i < playerListSize; ++i) { + const ServerInfo_Player &playerInfo = event.player_list(i); + const ServerInfo_PlayerProperties &prop = playerInfo.properties(); + const int playerId = prop.player_id(); + QString playerName = "@" + QString::fromStdString(prop.user_info().name()); + if (sayEdit && !autocompleteUserList.contains(playerName)) { + autocompleteUserList << playerName; + sayEdit->setCompletionList(autocompleteUserList); + } + if (!prop.spectator()) { + Player *player = players.value(playerId, 0); + if (!player) { + if (clients.size() > 1 || playerId == localPlayerId) { + player = addPlayer(playerId, prop.user_info()); + playerListWidget->addPlayer(prop); + player->processPlayerInfo(playerInfo); + if (player->getLocal()) { + TabbedDeckViewContainer *deckViewContainer = deckViewContainers.value(playerId); + if (playerInfo.has_deck_list()) { + DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); + PictureLoader::cacheCardPixmaps( + CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList())); + deckViewContainer->playerDeckView->setDeck(newDeck); + player->setDeck(newDeck); + } + deckViewContainer->playerDeckView->setReadyStart(prop.ready_start()); + deckViewContainer->playerDeckView->setSideboardLocked(prop.sideboard_locked()); + } + } + } + } + } + + // then process every non-local player. + for (int i = 0; i < playerListSize; ++i) { const ServerInfo_Player &playerInfo = event.player_list(i); const ServerInfo_PlayerProperties &prop = playerInfo.properties(); @@ -872,24 +910,14 @@ void TabGame::eventGameStateChanged(const Event_GameStateChanged &event, } player->processPlayerInfo(playerInfo); if (player->getLocal()) { - TabbedDeckViewContainer *deckViewContainer = deckViewContainers.value(playerId); - if (playerInfo.has_deck_list()) { - DeckLoader newDeck(QString::fromStdString(playerInfo.deck_list())); - PictureLoader::cacheCardPixmaps( - CardDatabaseManager::getInstance()->getCards(newDeck.getCardRefList())); - deckViewContainer->playerDeckView->setDeck(newDeck); - player->setDeck(newDeck); - } - deckViewContainer->playerDeckView->setReadyStart(prop.ready_start()); - deckViewContainer->playerDeckView->setSideboardLocked(prop.sideboard_locked()); - } else { - DeckList loader; - loader.loadFromString_Native(QString::fromStdString(playerInfo.deck_list())); - QMapIterator i(deckViewContainers); - while (i.hasNext()) { - i.next(); - i.value()->addOpponentDeckView(loader, playerId, player->getName()); - } + continue; + } + DeckList loader; + loader.loadFromString_Native(QString::fromStdString(playerInfo.deck_list())); + QMapIterator i(deckViewContainers); + while (i.hasNext()) { + i.next(); + i.value()->addOpponentDeckView(loader, playerId, player->getName()); } } } diff --git a/common/server_game.cpp b/common/server_game.cpp index 415d55f9e..95d97f1da 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -513,21 +513,6 @@ void Server_Game::addPlayer(Server_AbstractUserInterface *userInterface, userInterface->playerAddedToGame(gameId, room->getId(), newPlayer->getPlayerId()); createGameJoinedEvent(newPlayer, rc, false); - - Event_PlayerPropertiesChanged event; - GameEventStorage ges; - - if (getShareDecklistsOnLoad()) { - for (const auto &player : players) { - Context_DeckSelect context; - if (player->getDeckList() != nullptr) { - context.set_deck_list(player->getDeckList()->writeToString_Native().toStdString()); - ges.setGameEventContext(context); - ges.enqueueGameEvent(event, player->getPlayerId()); - ges.sendToGame(this); - } - } - } } void Server_Game::removePlayer(Server_Player *player, Event_Leave::LeaveReason reason)