Skip to content

Commit

Permalink
Shutdown and replay recorder work
Browse files Browse the repository at this point in the history
made shutdown more reliable
added json entry for replays
  • Loading branch information
Robosturm committed Dec 6, 2023
1 parent 040f348 commit 4ef325f
Showing 7 changed files with 101 additions and 5 deletions.
13 changes: 10 additions & 3 deletions coreengine/mainapp.cpp
Original file line number Diff line number Diff line change
@@ -859,6 +859,7 @@ void Mainapp::createBaseDirs()

void Mainapp::onQuit()
{
const qint64 waitTime = 120;
QCoreApplication::processEvents();
if (m_Worker != nullptr)
{
@@ -867,8 +868,10 @@ void Mainapp::onQuit()
}
if (m_Workerthread->isRunning())
{
auto curTimte = QDateTime::currentSecsSinceEpoch();
m_Workerthread->quit();
while (!m_Workerthread->wait(1))
while (!m_Workerthread->wait(1) &&
QDateTime::currentSecsSinceEpoch() - curTimte < waitTime)
{
QCoreApplication::processEvents();
}
@@ -883,8 +886,10 @@ void Mainapp::onQuit()
}
if (m_audioThread->isRunning())
{
auto curTimte = QDateTime::currentSecsSinceEpoch();
m_audioThread->quit();
while (!m_audioThread->wait(1))
while (!m_audioThread->wait(1) &&
QDateTime::currentSecsSinceEpoch() - curTimte < waitTime)
{
QCoreApplication::processEvents();
}
@@ -894,7 +899,9 @@ void Mainapp::onQuit()
if (m_Networkthread->isRunning())
{
m_Networkthread->quit();
while (!m_Networkthread->wait(1))
auto curTimte = QDateTime::currentSecsSinceEpoch();
while (!m_Networkthread->wait(1) &&
QDateTime::currentSecsSinceEpoch() - curTimte < waitTime)
{
QCoreApplication::processEvents();
}
60 changes: 60 additions & 0 deletions game/gamerecording/replayrecorder.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
#include <QByteArray>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonObject>

#include "network/JsonKeys.h"
#include "game/gamerecording/replayrecorder.h"

#include "game/gamemap.h"
#include "game/gameaction.h"
#include "objects/minimap.h"

#include "coreengine/settings.h"
#include "coreengine/interpreter.h"
#include "coreengine/filesupport.h"
#include "coreengine/gameconsole.h"
#include "coreengine/mainapp.h"

#include "gameinput/basegameinputif.h"

@@ -56,6 +61,7 @@ void ReplayRecorder::startRecording(const QString & file)
m_recordFile.open(QIODevice::WriteOnly);
m_stream << VERSION;
m_stream << QString(RECORD_INFO_MARKER);
m_stream << createRecordJson();
qint64 streamStartPos = m_recordFile.pos();
m_stream << m_streamStart;
m_stream << static_cast<qint32>(data.size());
@@ -195,6 +201,10 @@ bool ReplayRecorder::validRecord(QByteArray & envData)
bool success = marker == RECORD_INFO_MARKER;
if (success)
{
if (version > 1)
{
m_stream >> m_recordJson;
}
m_stream >> m_streamStart;
qint32 size = 0;
m_stream >> size;
@@ -258,6 +268,11 @@ ReplayRecorder::HeaderInfo ReplayRecorder::seekToNextType(Type type, bool & succ
return info;
}

QString ReplayRecorder::getRecordJson() const
{
return m_recordJson;
}

void ReplayRecorder::seekToDay(qint32 day)
{
if (day <= 1)
@@ -353,3 +368,48 @@ qint32 ReplayRecorder::getDayFromPosition(qint32 count)
m_recordFile.seek(curPos);
return rDay;
}

QString ReplayRecorder::createRecordJson() const
{
if (m_pMap != nullptr)
{
QJsonObject data;
data.insert(JsonKeys::JSONKEY_MAPNAME, m_pMap->getMapName());
data.insert(JsonKeys::JSONKEY_MAPAUTHOR, m_pMap->getMapAuthor());
data.insert(JsonKeys::JSONKEY_MAPDESCRIPTION, m_pMap->getMapDescription());
data.insert(JsonKeys::JSONKEY_MAPWIDTH, m_pMap->getMapWidth());
data.insert(JsonKeys::JSONKEY_MAPHEIGHT, m_pMap->getMapHeight());
QJsonArray playerData;
for (qint32 i = 0; i < m_pMap->getPlayerCount(); ++i)
{
QJsonObject obj;
auto* pPlayer = m_pMap->getPlayer(i);
obj.insert(JsonKeys::JSONKEY_USERNAME, pPlayer->getPlayerNameId());
QJsonArray coData;
for (qint32 i = 0; i < pPlayer->getCoCount(); ++i)
{
auto* pCO = pPlayer->getCO(i);
if (pCO != nullptr)
{
coData.append(pCO->getCOName());
}
}
obj.insert(JsonKeys::JSONKEY_COS, coData);
playerData.append(obj);
}
data.insert(JsonKeys::JSONKEY_PLAYERDATA, playerData);
Minimap minimap;
minimap.updateMinimap(m_pMap);
QImage image;
Mainapp::getInstance()->saveMapAsImage(&minimap, &image);
QByteArray imageArray;
QBuffer buffer(&imageArray);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG");
buffer.close();
data.insert(JsonKeys::JSONKEY_MINIMAPDATA, GlobalUtils::toJsonArray(imageArray));
QJsonDocument doc(data);
return doc.toJson(QJsonDocument::Compact);
}
return "";
}
7 changes: 6 additions & 1 deletion game/gamerecording/replayrecorder.h
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@ class ReplayRecorder final : public QObject
Type m_type{Type::Action};
qint64 m_nextSeekPos{0};
};
static const qint32 VERSION = 1;
static const qint32 VERSION = 2;
public:
explicit ReplayRecorder(GameMap* pMap);
virtual ~ReplayRecorder();
@@ -107,15 +107,20 @@ class ReplayRecorder final : public QObject
void seekToDay(qint32 day);
qint32 getCount() const;


QString getRecordJson() const;

private:
bool validRecord(QByteArray & envData);
void writeAction(const spGameAction & action);
void writeMapState();
ReplayRecorder::HeaderInfo seekToNextType(Type type, bool & success);
QString createRecordJson() const;
private:
QFile m_recordFile;
QDataStream m_stream{&m_recordFile};
QStringList m_mods;
QString m_recordJson;
qint32 m_count = 0;
qint32 m_progress = 0;
qint64 m_countPos = 0;
2 changes: 2 additions & 0 deletions network/JsonKeys.h
Original file line number Diff line number Diff line change
@@ -70,8 +70,10 @@ namespace JsonKeys
const char* const JSONKEY_MMR = "mmr";
const char* const JSONKEY_RESULT = "result";
// map filter
const char* const JSONKEY_PLAYERDATA = "mapPlayerData";
const char* const JSONKEY_MAPNAME = "mapName";
const char* const JSONKEY_MAPAUTHOR = "mapAuthor";
const char* const JSONKEY_MAPDESCRIPTION = "mapDescription";
const char* const JSONKEY_MINPLAYERS = "minPlayers";
const char* const JSONKEY_MINWIDTH = "minWidth";
const char* const JSONKEY_MAXWIDTH = "maxWidth";
22 changes: 21 additions & 1 deletion network/mapfileserver.cpp
Original file line number Diff line number Diff line change
@@ -138,7 +138,6 @@ void MapFileServer::onRequestFilteredMaps(quint64 socketID, const QJsonObject &
MainServer::SQL_MAPWIDTH + ", " +
MainServer::SQL_MAPHEIGHT + ", " +
MainServer::SQL_MAPFLAGS + ", " +
MainServer::SQL_MAPPATH + ", " +
MainServer::SQL_MAPIMAGEPATH +
" from " + MainServer::SQL_TABLE_DOWNLOADMAPINFO +
" WHERE ";
@@ -327,3 +326,24 @@ void MapFileServer::onRequestDownloadMap(quint64 socketID, const QJsonObject & o
CONSOLE_PRINT("Sending command " + doc.object().value(JsonKeys::JSONKEY_COMMAND).toString() + " to socket " + QString::number(socketID), GameConsole::eDEBUG);
emit pServer->sig_sendData(socketID, doc.toJson(QJsonDocument::Compact), NetworkInterface::NetworkSerives::ServerHostingJson, false);
}

void MapFileServer::removeMapFromServer(const QString & sqlFilter)
{
QString filterCommand = QString("SELECT ") + MainServer::SQL_MAPPATH + ", " +
MainServer::SQL_MAPIMAGEPATH +
" from " + MainServer::SQL_TABLE_DOWNLOADMAPINFO +
" WHERE " + sqlFilter + ";";
QSqlQuery query = m_mainServer->getDatabase().exec(filterCommand);
bool success = !MainServer::sqlQueryFailed(query);
if (success)
{
do
{
QFile::remove(query.value(MainServer::SQL_MAPPATH).toString());
QFile::remove(query.value(MainServer::SQL_MAPIMAGEPATH).toString());
} while (query.next());
QString command = QString("DELETE FROM ") + MainServer::SQL_TABLE_PLAYERS + " WHERE " + sqlFilter + ";";
query = m_mainServer->getDatabase().exec(command);
MainServer::sqlQueryFailed(query);
}
}
1 change: 1 addition & 0 deletions network/mapfileserver.h
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@ class MapFileServer : public QObject
void onMapUpload(quint64 socketID, const QJsonObject & objData);
void onRequestFilteredMaps(quint64 socketID, const QJsonObject & objData);
void onRequestDownloadMap(quint64 socketID, const QJsonObject & objData);
Q_INVOKABLE void removeMapFromServer(const QString & sqlFilter);
private:
bool sameUploader(const QJsonObject & objData);
void addFilterOption(QString & filterCommand, qint32 value, qint32 & filterCount, const char* const item, const char* const opCommand);
1 change: 1 addition & 0 deletions network/networkgame.cpp
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@ NetworkGame::NetworkGame(QObject* pParent, const QString & serverName)
NetworkGame::~NetworkGame()
{
CONSOLE_PRINT("Deleting NetworkGame " + m_serverName, GameConsole::eDEBUG);

}

void NetworkGame::startCloseTimer()

0 comments on commit 4ef325f

Please sign in to comment.