diff -r 2dcc64515346 -r 5119203470f3 QTfrontend/net/newnetclient.cpp --- a/QTfrontend/net/newnetclient.cpp Tue May 07 22:36:15 2019 +0200 +++ b/QTfrontend/net/newnetclient.cpp Fri May 10 22:51:43 2019 +0200 @@ -41,6 +41,7 @@ { m_private_game = false; m_nick_registered = false; + m_demo_data_pending = false; m_roomsListModel = new RoomsListModel(this); @@ -798,13 +799,35 @@ return; } - if(netClientState == InRoom || netClientState == InGame) + if(netClientState == InLobby && lst[0] == "REPLAY_START") + { + if(lst.size() < 2 || lst[1] != mynick) + { + qWarning("Net: Bad REPLAY_START message"); + return; + } + + for(int i = 1; i < lst.size(); ++i) + { + if (lst[i] == mynick) + { + netClientState = InRoom; + m_demo_data_pending = true; + emit EnteredGame(); + emit roomMaster(false); + } + } + return; + } + + if(netClientState == InRoom || netClientState == InGame || netClientState == InDemo) { if (lst[0] == "EM") { if(lst.size() < 2) { qWarning("Net: Bad EM message"); + m_demo_data_pending = false; return; } for(int i = 1; i < lst.size(); ++i) @@ -812,9 +835,13 @@ QByteArray em = QByteArray::fromBase64(lst[i].toLatin1()); emit FromNet(em); } + m_demo_data_pending = false; return; } + } + if(netClientState == InRoom || netClientState == InGame) + { if (lst[0] == "ROUND_FINISHED") { emit FromNet(QByteArray("\x01o")); @@ -856,8 +883,16 @@ if (lst[0] == "RUN_GAME") { - netClientState = InGame; - emit AskForRunGame(); + if(m_demo_data_pending) + { + netClientState = InDemo; + emit AskForOfficialServerDemo(); + } + else + { + netClientState = InGame; + emit AskForRunGame(); + } return; } @@ -1065,6 +1100,13 @@ netClientState = InRoom; RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimiter).arg(correctly ? "1" : "0")); } + else if (netClientState == InDemo) + { + netClientState = InLobby; + askRoomsList(); + emit LeftRoom(QString()); + m_playersModel->resetRoomFlags(); + } } void HWNewNet::banPlayer(const QString & nick)