mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-01 02:53:56 -07:00
move returning cards to server_game (#6561)
lock the game mutex instead of player mutex when returning cards
This commit is contained in:
parent
5b8897231d
commit
afdb385770
3 changed files with 47 additions and 44 deletions
|
|
@ -575,51 +575,8 @@ Server_AbstractPlayer::cmdConcede(const Command_Concede & /*cmd*/, ResponseConta
|
||||||
setConceded(true);
|
setConceded(true);
|
||||||
game->removeArrowsRelatedToPlayer(ges, this);
|
game->removeArrowsRelatedToPlayer(ges, this);
|
||||||
game->unattachCards(ges, this);
|
game->unattachCards(ges, this);
|
||||||
|
game->returnCardsFromPlayer(ges, this);
|
||||||
|
|
||||||
playerMutex.lock();
|
|
||||||
|
|
||||||
// Return cards to their rightful owners before conceding the game
|
|
||||||
static const QRegularExpression ownerRegex{"Owner: ?([^\n]+)"};
|
|
||||||
for (const auto &card : zones.value("table")->getCards()) {
|
|
||||||
if (card == nullptr) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto ®exResult = ownerRegex.match(card->getAnnotation());
|
|
||||||
if (!regexResult.hasMatch()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CardToMove cardToMove;
|
|
||||||
cardToMove.set_card_id(card->getId());
|
|
||||||
|
|
||||||
for (const auto *player : game->getPlayers()) {
|
|
||||||
if (player == nullptr || player->getUserInfo() == nullptr) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto &ownerToReturnTo = regexResult.captured(1);
|
|
||||||
const auto &correctOwner = QString::compare(QString::fromStdString(player->getUserInfo()->name()),
|
|
||||||
ownerToReturnTo, Qt::CaseInsensitive) == 0;
|
|
||||||
if (!correctOwner) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto &startZone = zones.value("table");
|
|
||||||
const auto &targetZone = player->getZones().value("table");
|
|
||||||
|
|
||||||
if (startZone == nullptr || targetZone == nullptr) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
moveCard(ges, startZone, QList<const CardToMove *>() << &cardToMove, targetZone, 0, 0, false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
playerMutex.unlock();
|
|
||||||
|
|
||||||
// All borrowed cards have been returned, can now continue cleanup process
|
|
||||||
clearZones();
|
clearZones();
|
||||||
|
|
||||||
Event_PlayerPropertiesChanged event;
|
Event_PlayerPropertiesChanged event;
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
#include "../server_database_interface.h"
|
#include "../server_database_interface.h"
|
||||||
#include "../server_protocolhandler.h"
|
#include "../server_protocolhandler.h"
|
||||||
#include "../server_room.h"
|
#include "../server_room.h"
|
||||||
|
#include "libcockatrice/protocol/pb/command_move_card.pb.h"
|
||||||
#include "server_abstract_player.h"
|
#include "server_abstract_player.h"
|
||||||
#include "server_arrow.h"
|
#include "server_arrow.h"
|
||||||
#include "server_card.h"
|
#include "server_card.h"
|
||||||
|
|
@ -31,6 +32,7 @@
|
||||||
#include "server_spectator.h"
|
#include "server_spectator.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QRegularExpression>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <google/protobuf/descriptor.h>
|
#include <google/protobuf/descriptor.h>
|
||||||
#include <libcockatrice/deck_list/deck_list.h>
|
#include <libcockatrice/deck_list/deck_list.h>
|
||||||
|
|
@ -824,3 +826,46 @@ void Server_Game::getInfo(ServerInfo_Game &result) const
|
||||||
result.set_start_time(startTime.toSecsSinceEpoch());
|
result.set_start_time(startTime.toSecsSinceEpoch());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server_Game::returnCardsFromPlayer(GameEventStorage &ges, Server_AbstractPlayer *player)
|
||||||
|
{
|
||||||
|
QMutexLocker locker(&gameMutex);
|
||||||
|
// Return cards to their rightful owners before conceding the game
|
||||||
|
static const QRegularExpression ownerRegex{"Owner: ?([^\n]+)"};
|
||||||
|
const auto &playerTable = player->getZones().value("table");
|
||||||
|
for (const auto &card : playerTable->getCards()) {
|
||||||
|
if (card == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto ®exResult = ownerRegex.match(card->getAnnotation());
|
||||||
|
if (!regexResult.hasMatch()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
CardToMove cardToMove;
|
||||||
|
cardToMove.set_card_id(card->getId());
|
||||||
|
|
||||||
|
for (const auto *otherPlayer : getPlayers()) {
|
||||||
|
if (otherPlayer == nullptr || otherPlayer->getUserInfo() == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &ownerToReturnTo = regexResult.captured(1);
|
||||||
|
const auto &correctOwner = QString::compare(QString::fromStdString(otherPlayer->getUserInfo()->name()),
|
||||||
|
ownerToReturnTo, Qt::CaseInsensitive) == 0;
|
||||||
|
if (!correctOwner) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &targetZone = otherPlayer->getZones().value("table");
|
||||||
|
|
||||||
|
if (playerTable == nullptr || targetZone == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
player->moveCard(ges, playerTable, QList<const CardToMove *>() << &cardToMove, targetZone, 0, 0, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -218,6 +218,7 @@ public:
|
||||||
GameEventStorageItem::EventRecipients recipients = GameEventStorageItem::SendToPrivate |
|
GameEventStorageItem::EventRecipients recipients = GameEventStorageItem::SendToPrivate |
|
||||||
GameEventStorageItem::SendToOthers,
|
GameEventStorageItem::SendToOthers,
|
||||||
int privatePlayerId = -1);
|
int privatePlayerId = -1);
|
||||||
|
void returnCardsFromPlayer(GameEventStorage &ges, Server_AbstractPlayer *player);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue