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

This commit is contained in:
Max-Wilhelm Bruker 2012-01-30 00:21:47 +01:00
parent eb06d6b4ea
commit 5692addf54
4 changed files with 45 additions and 14 deletions

View file

@ -108,7 +108,7 @@ void RemoteClient::readData()
ServerMessage newServerMessage; ServerMessage newServerMessage;
newServerMessage.ParseFromArray(inputBuffer.data(), messageLength); 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); inputBuffer.remove(0, messageLength);
messageInProgress = false; messageInProgress = false;

View file

@ -317,9 +317,13 @@ void Server_Game::removePlayer(Server_Player *player)
QMutexLocker locker(&gameMutex); QMutexLocker locker(&gameMutex);
players.remove(player->getPlayerId()); 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 playerActive = activePlayer == player->getPlayerId();
bool playerHost = hostId == player->getPlayerId(); bool playerHost = hostId == player->getPlayerId();
bool spectator = player->getSpectator(); bool spectator = player->getSpectator();
@ -350,7 +354,7 @@ void Server_Game::removePlayer(Server_Player *player)
room->broadcastGameListUpdate(this); room->broadcastGameListUpdate(this);
} }
void Server_Game::removeArrowsToPlayer(Server_Player *player) void Server_Game::removeArrowsToPlayer(GameEventStorage &ges, Server_Player *player)
{ {
QMutexLocker locker(&gameMutex); QMutexLocker locker(&gameMutex);
@ -372,13 +376,31 @@ void Server_Game::removeArrowsToPlayer(Server_Player *player)
for (int i = 0; i < toDelete.size(); ++i) { for (int i = 0; i < toDelete.size(); ++i) {
Event_DeleteArrow event; Event_DeleteArrow event;
event.set_arrow_id(toDelete[i]->getId()); event.set_arrow_id(toDelete[i]->getId());
sendGameEventContainer(prepareGameEvent(event, p->getPlayerId())); ges.enqueueGameEvent(event, p->getPlayerId());
p->deleteArrow(toDelete[i]->getId()); p->deleteArrow(toDelete[i]->getId());
} }
} }
} }
void Server_Game::unattachCards(GameEventStorage &ges, Server_Player *player)
{
QMutexLocker locker(&gameMutex);
QMapIterator<QString, Server_CardZone *> 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<Server_Card *> 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) bool Server_Game::kickPlayer(int playerId)
{ {
QMutexLocker roomLocker(&room->roomMutex); QMutexLocker roomLocker(&room->roomMutex);
@ -519,14 +541,21 @@ QList<ServerInfo_Player> Server_Game::getGameState(Server_Player *playerWhosAski
cardInfo->set_name(displayedName.toStdString()); cardInfo->set_name(displayedName.toStdString());
cardInfo->set_x(card->getX()); cardInfo->set_x(card->getX());
cardInfo->set_y(card->getY()); 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_tapped(card->getTapped());
cardInfo->set_attacking(card->getAttacking()); if (card->getAttacking())
cardInfo->set_color(card->getColor().toStdString()); cardInfo->set_attacking(true);
cardInfo->set_pt(card->getPT().toStdString()); if (!card->getColor().isEmpty())
cardInfo->set_annotation(card->getAnnotation().toStdString()); cardInfo->set_color(card->getColor().toStdString());
cardInfo->set_destroy_on_zone_change(card->getDestroyOnZoneChange()); if (!card->getPT().isEmpty())
cardInfo->set_doesnt_untap(card->getDoesntUntap()); 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<ServerInfo_CardCounter *> cardCounterList; QList<ServerInfo_CardCounter *> cardCounterList;
QMapIterator<int, int> cardCounterIterator(card->getCounters()); QMapIterator<int, int> cardCounterIterator(card->getCounters());

View file

@ -86,7 +86,8 @@ public:
bool containsUser(const QString &userName) const; bool containsUser(const QString &userName) const;
Server_Player *addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate = true); Server_Player *addPlayer(Server_ProtocolHandler *handler, bool spectator, bool broadcastUpdate = true);
void removePlayer(Server_Player *player); 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); bool kickPlayer(int playerId);
void startGameIfReady(); void startGameIfReady();
void stopGameIfFinished(); void stopGameIfFinished();

View file

@ -897,7 +897,8 @@ Response::ResponseCode Server_ProtocolHandler::cmdConcede(const Command_Concede
return Response::RespContextError; return Response::RespContextError;
player->setConceded(true); player->setConceded(true);
game->removeArrowsToPlayer(player); game->removeArrowsToPlayer(ges, player);
game->unattachCards(ges, player);
player->clearZones(); player->clearZones();
Event_PlayerPropertiesChanged event; Event_PlayerPropertiesChanged event;