Fix critical failure to cleanup teams list after rejoining game after a force-quit. Fixes
bug #597
--- a/ChangeLog.txt Tue Aug 21 23:56:49 2018 +0200
+++ b/ChangeLog.txt Wed Aug 22 15:00:04 2018 +0200
@@ -34,6 +34,7 @@
Frontend:
+ Add setting to disable audio dampening when losing window focus
* Fix rare crash when aborting video encoding in progress
+ * Fix critical failure to cleanup teams list after rejoining game under certain conditions
* Controllers are detected again
* Fix failure to shutdown game window properly after player got kicked
* No longer allow having schemes with equal names (case-insensitive)
--- a/QTfrontend/hwform.cpp Tue Aug 21 23:56:49 2018 +0200
+++ b/QTfrontend/hwform.cpp Wed Aug 22 15:00:04 2018 +0200
@@ -1746,7 +1746,15 @@
Music(ui.pageOptions->CBFrontendMusic->isChecked());
if (wBackground) wBackground->startAnimation();
GoToPage(ID_PAGE_GAMESTATS);
- if (hwnet && (!game || !game->netSuspend)) hwnet->gameFinished(true);
+ if (hwnet)
+ {
+ if (!game || !game->netSuspend)
+ hwnet->gameFinished(true);
+ // After a game, the local player might have pseudo-teams left
+ // when rejoining a previously left game. This makes sure the
+ // teams list is in a consistent state.
+ ui.pageNetGame->cleanupFakeNetTeams();
+ }
if (game) game->netSuspend = false;
break;
}
--- a/QTfrontend/ui/page/pagenetgame.cpp Tue Aug 21 23:56:49 2018 +0200
+++ b/QTfrontend/ui/page/pagenetgame.cpp Wed Aug 22 15:00:04 2018 +0200
@@ -218,6 +218,10 @@
chatWidget->displayWarning(message);
}
+void PageNetGame::cleanupFakeNetTeams()
+{
+ pNetTeamsWidget->cleanupFakeNetTeams();
+}
void PageNetGame::setReadyStatus(bool isReady)
{
@@ -280,6 +284,7 @@
void PageNetGame::setUser(const QString & nickname)
{
+ pNetTeamsWidget->setUser(nickname);
chatWidget->setUser(nickname);
}
--- a/QTfrontend/ui/page/pagenetgame.h Tue Aug 21 23:56:49 2018 +0200
+++ b/QTfrontend/ui/page/pagenetgame.h Wed Aug 22 15:00:04 2018 +0200
@@ -40,6 +40,7 @@
void displayError(const QString & message);
void displayNotice(const QString & message);
void displayWarning(const QString & message);
+ void cleanupFakeNetTeams();
QPushButton *BtnGo;
QPushButton *BtnMaster;
--- a/QTfrontend/ui/widget/teamselect.cpp Tue Aug 21 23:56:49 2018 +0200
+++ b/QTfrontend/ui/widget/teamselect.cpp Wed Aug 22 15:00:04 2018 +0200
@@ -74,6 +74,11 @@
framePlaying->setInteractivity(interactive);
}
+void TeamSelWidget::setUser(const QString& nickname)
+{
+ m_curUser = nickname;
+}
+
void TeamSelWidget::hhNumChanged(const HWTeam& team)
{
QList<HWTeam>::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team);
@@ -152,6 +157,37 @@
emit setEnabledGameStart(curPlayingTeams.size()>1);
}
+// Removes teams classified as net teams but which are owned by the local user.
+// Those teams don't make sense and might be leftovers from a finished game
+// after rejoining. See also: Bugzilla bug 597.
+void TeamSelWidget::cleanupFakeNetTeams()
+{
+ // m_curUser is not set for offline games. No cleanup is needed when offline.
+ if(m_curUser.isNull())
+ return;
+
+ QList<HWTeam>::iterator itPlay = curPlayingTeams.begin();
+ while(itPlay != curPlayingTeams.end())
+ {
+ if(itPlay->isNetTeam() && itPlay->owner() == m_curUser)
+ {
+ qDebug() << QString("cleanupFakeNetTeams: team '%1' removed").arg(itPlay->name());
+ QObject::disconnect(framePlaying->getTeamWidget(*itPlay), SIGNAL(teamStatusChanged(HWTeam)));
+ framePlaying->removeTeam(*itPlay);
+ itPlay = curPlayingTeams.erase(itPlay);
+ }
+ else
+ itPlay++;
+ }
+
+ // Show team notice if less than two teams.
+ if (curPlayingTeams.size() < 2)
+ {
+ numTeamNotice->show();
+ }
+ emit setEnabledGameStart(curPlayingTeams.size()>1);
+}
+
void TeamSelWidget::changeTeamStatus(HWTeam team)
{
QList<HWTeam>::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team);
--- a/QTfrontend/ui/widget/teamselect.h Tue Aug 21 23:56:49 2018 +0200
+++ b/QTfrontend/ui/widget/teamselect.h Wed Aug 22 15:00:04 2018 +0200
@@ -49,6 +49,8 @@
QList<HWTeam> getNotPlayingTeams() const;
unsigned short getNumHedgehogs() const;
void setInteractivity(bool interactive);
+ void setUser(const QString& nickname);
+ void cleanupFakeNetTeams();
public slots:
void addTeam(HWTeam team);
@@ -78,6 +80,7 @@
QLabel *numTeamNotice;
bool m_acceptOuter;
void repaint();
+ QString m_curUser;
QList<HWTeam> curPlayingTeams;
QList<HWTeam> m_curNotPlayingTeams;