diff --git a/cockatrice/src/game/game_event_handler.cpp b/cockatrice/src/game/game_event_handler.cpp index b338deaea..cff80a1ec 100644 --- a/cockatrice/src/game/game_event_handler.cpp +++ b/cockatrice/src/game/game_event_handler.cpp @@ -217,7 +217,20 @@ void GameEventHandler::handleArrowDeletion(int arrowId) { Command_DeleteArrow cmd; cmd.set_arrow_id(arrowId); - sendGameCommand(cmd); + + auto preparedCommand = prepareGameCommand(cmd); + + connect(preparedCommand, &PendingCommand::finished, this, + [arrowId, this](const Response &response) { handleArrowDeletionFinished(response, arrowId); }); + + sendGameCommand(preparedCommand); +} + +void GameEventHandler::handleArrowDeletionFinished(const Response &response, int arrowId) +{ + if (response.response_code() == Response::RespNameNotFound) { + emit arrowDeleted(arrowId); + } } void GameEventHandler::eventSpectatorSay(const Event_GameSay &event, diff --git a/cockatrice/src/game/game_event_handler.h b/cockatrice/src/game/game_event_handler.h index 7587ab46d..bc4812aa4 100644 --- a/cockatrice/src/game/game_event_handler.h +++ b/cockatrice/src/game/game_event_handler.h @@ -61,6 +61,7 @@ public: void handleGameLeft(); void handleChatMessageSent(const QString &chatMessage); void handleArrowDeletion(int arrowId); + void handleArrowDeletionFinished(const Response &response, int arrowId); void eventSpectatorSay(const Event_GameSay &event, int eventPlayerId, const GameEventContext &context); void eventSpectatorLeave(const Event_Leave &event, int eventPlayerId, const GameEventContext &context); @@ -112,6 +113,7 @@ signals: void containerProcessingStarted(GameEventContext context); void setContextJudgeName(QString judgeName); void containerProcessingDone(); + void arrowDeleted(int arrowId); void logSpectatorSay(ServerInfo_User userInfo, QString message); void logSpectatorLeave(QString name, QString reason); void logGameStart(); diff --git a/cockatrice/src/interface/widgets/tabs/tab_game.cpp b/cockatrice/src/interface/widgets/tabs/tab_game.cpp index 6b7b3539c..dd5df72a1 100644 --- a/cockatrice/src/interface/widgets/tabs/tab_game.cpp +++ b/cockatrice/src/interface/widgets/tabs/tab_game.cpp @@ -1147,6 +1147,7 @@ void TabGame::createPlayAreaWidget(bool bReplay) connect(game->getPlayerManager(), &PlayerManager::playerCountChanged, scene, &GameScene::rearrange); connect(scene, &GameScene::requestArrowDeletion, game->getGameEventHandler(), &GameEventHandler::handleArrowDeletion); + connect(game->getGameEventHandler(), &GameEventHandler::arrowDeleted, scene, &GameScene::onArrowDeleted); gameView = new GameView(scene); auto gamePlayAreaVBox = new QVBoxLayout; diff --git a/libcockatrice_network/libcockatrice/network/server/remote/game/server_abstract_player.cpp b/libcockatrice_network/libcockatrice/network/server/remote/game/server_abstract_player.cpp index 100a4ebc6..3e489233c 100644 --- a/libcockatrice_network/libcockatrice/network/server/remote/game/server_abstract_player.cpp +++ b/libcockatrice_network/libcockatrice/network/server/remote/game/server_abstract_player.cpp @@ -397,6 +397,9 @@ void Server_AbstractPlayer::processMoveCard(GameEventStorage &ges, } } for (int j : arrowsToDelete) { + Event_DeleteArrow event; + event.set_arrow_id(j); + ges.enqueueGameEvent(event, player->getPlayerId()); player->deleteArrow(j); } } @@ -1132,12 +1135,18 @@ Server_AbstractPlayer::cmdCreateToken(const Command_CreateToken &cmd, ResponseCo targetItem = card; } if (sendGameEvent) { - Event_CreateArrow _event; - ServerInfo_Arrow *arrowInfo = _event.mutable_arrow_info(); - changedArrowIds.append(arrow->getId()); - int id = player->newArrowId(); - arrow->setId(id); - arrowInfo->set_id(id); + const int oldId = arrow->getId(); + changedArrowIds.append(oldId); + + Event_DeleteArrow deleteEvent; + deleteEvent.set_arrow_id(oldId); + ges.enqueueGameEvent(deleteEvent, player->getPlayerId()); + + Event_CreateArrow createEvent; + ServerInfo_Arrow *arrowInfo = createEvent.mutable_arrow_info(); + const int newId = player->newArrowId(); + arrow->setId(newId); + arrowInfo->set_id(newId); arrowInfo->set_start_player_id(player->getPlayerId()); arrowInfo->set_start_zone(startCard->getZone()->getName().toStdString()); arrowInfo->set_start_card_id(startCard->getId()); @@ -1151,7 +1160,7 @@ Server_AbstractPlayer::cmdCreateToken(const Command_CreateToken &cmd, ResponseCo arrowInfo->set_target_card_id(arrowTargetCard->getId()); } arrowInfo->mutable_arrow_color()->CopyFrom(arrow->getColor()); - ges.enqueueGameEvent(_event, player->getPlayerId()); + ges.enqueueGameEvent(createEvent, player->getPlayerId()); } } for (int id : changedArrowIds) {