From 5692addf54a6a02c5e666a3cc08f5f4489039473 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Mon, 30 Jan 2012 00:21:47 +0100 Subject: [PATCH] don't send useless information in getGameState; fixed bug that caused an attached card to have undefined coordinates when its parent card was destroyed by conceding or leaving --- cockatrice/src/remoteclient.cpp | 2 +- common/server_game.cpp | 51 ++++++++++++++++++++++++------- common/server_game.h | 3 +- common/server_protocolhandler.cpp | 3 +- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/cockatrice/src/remoteclient.cpp b/cockatrice/src/remoteclient.cpp index 2cb9d0b1..59516dd1 100644 --- a/cockatrice/src/remoteclient.cpp +++ b/cockatrice/src/remoteclient.cpp @@ -108,7 +108,7 @@ void RemoteClient::readData() ServerMessage newServerMessage; newServerMessage.ParseFromArray(inputBuffer.data(), messageLength); - qDebug((QString::number(messageLength) + ": " + QString::fromStdString(newServerMessage.ShortDebugString())).toUtf8()); + qDebug((QString::number(messageLength) + ": " + QString::fromStdString(newServerMessage.DebugString())).toUtf8()); inputBuffer.remove(0, messageLength); messageInProgress = false; diff --git a/common/server_game.cpp b/common/server_game.cpp index f751043d..faacc9bf 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -317,9 +317,13 @@ void Server_Game::removePlayer(Server_Player *player) QMutexLocker locker(&gameMutex); players.remove(player->getPlayerId()); - removeArrowsToPlayer(player); - sendGameEventContainer(prepareGameEvent(Event_Leave(), player->getPlayerId())); + GameEventStorage ges; + removeArrowsToPlayer(ges, player); + unattachCards(ges, player); + ges.enqueueGameEvent(Event_Leave(), player->getPlayerId()); + ges.sendToGame(this); + bool playerActive = activePlayer == player->getPlayerId(); bool playerHost = hostId == player->getPlayerId(); bool spectator = player->getSpectator(); @@ -350,7 +354,7 @@ void Server_Game::removePlayer(Server_Player *player) room->broadcastGameListUpdate(this); } -void Server_Game::removeArrowsToPlayer(Server_Player *player) +void Server_Game::removeArrowsToPlayer(GameEventStorage &ges, Server_Player *player) { QMutexLocker locker(&gameMutex); @@ -372,13 +376,31 @@ void Server_Game::removeArrowsToPlayer(Server_Player *player) for (int i = 0; i < toDelete.size(); ++i) { Event_DeleteArrow event; event.set_arrow_id(toDelete[i]->getId()); - sendGameEventContainer(prepareGameEvent(event, p->getPlayerId())); + ges.enqueueGameEvent(event, p->getPlayerId()); p->deleteArrow(toDelete[i]->getId()); } } } +void Server_Game::unattachCards(GameEventStorage &ges, Server_Player *player) +{ + QMutexLocker locker(&gameMutex); + + QMapIterator zoneIterator(player->getZones()); + while (zoneIterator.hasNext()) { + Server_CardZone *zone = zoneIterator.next().value(); + for (int i = 0; i < zone->cards.size(); ++i) { + Server_Card *card = zone->cards.at(i); + + // Make a copy of the list because the original one gets modified during the loop + QList attachedCards = card->getAttachedCards(); + for (int i = 0; i < attachedCards.size(); ++i) + attachedCards[i]->getZone()->getPlayer()->unattachCard(ges, attachedCards[i]); + } + } +} + bool Server_Game::kickPlayer(int playerId) { QMutexLocker roomLocker(&room->roomMutex); @@ -519,14 +541,21 @@ QList Server_Game::getGameState(Server_Player *playerWhosAski cardInfo->set_name(displayedName.toStdString()); cardInfo->set_x(card->getX()); cardInfo->set_y(card->getY()); - cardInfo->set_face_down(card->getFaceDown()); + if (card->getFaceDown()) + cardInfo->set_face_down(true); cardInfo->set_tapped(card->getTapped()); - cardInfo->set_attacking(card->getAttacking()); - cardInfo->set_color(card->getColor().toStdString()); - cardInfo->set_pt(card->getPT().toStdString()); - cardInfo->set_annotation(card->getAnnotation().toStdString()); - cardInfo->set_destroy_on_zone_change(card->getDestroyOnZoneChange()); - cardInfo->set_doesnt_untap(card->getDoesntUntap()); + if (card->getAttacking()) + cardInfo->set_attacking(true); + if (!card->getColor().isEmpty()) + cardInfo->set_color(card->getColor().toStdString()); + if (!card->getPT().isEmpty()) + cardInfo->set_pt(card->getPT().toStdString()); + if (!card->getAnnotation().isEmpty()) + cardInfo->set_annotation(card->getAnnotation().toStdString()); + if (card->getDestroyOnZoneChange()) + cardInfo->set_destroy_on_zone_change(true); + if (card->getDoesntUntap()) + cardInfo->set_doesnt_untap(true); QList cardCounterList; QMapIterator cardCounterIterator(card->getCounters()); diff --git a/common/server_game.h b/common/server_game.h index 72c442e7..0fefe940 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -86,7 +86,8 @@ public: bool containsUser(const QString &userName) const; Server_Player *addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate = true); void removePlayer(Server_Player *player); - void removeArrowsToPlayer(Server_Player *player); + void removeArrowsToPlayer(GameEventStorage &ges, Server_Player *player); + void unattachCards(GameEventStorage &ges, Server_Player *player); bool kickPlayer(int playerId); void startGameIfReady(); void stopGameIfFinished(); diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 0c0375be..5fe83adb 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -897,7 +897,8 @@ Response::ResponseCode Server_ProtocolHandler::cmdConcede(const Command_Concede return Response::RespContextError; player->setConceded(true); - game->removeArrowsToPlayer(player); + game->removeArrowsToPlayer(ges, player); + game->unattachCards(ges, player); player->clearZones(); Event_PlayerPropertiesChanged event;