|
@@ -7,8 +7,9 @@
|
|
|
#include <QDate>
|
|
|
#include <QTime>
|
|
|
|
|
|
-LotroManager::LotroManager(QObject *parent) : QObject(parent){
|
|
|
- dat_files_.resize(5);
|
|
|
+LotroManager::LotroManager(QObject *parent) : QObject(parent),
|
|
|
+ dat_files_(std::vector<LOTRO_DAT::DatFile>(5)),
|
|
|
+ database_(LOTRO_DAT::Database()) {
|
|
|
busy_ = false;
|
|
|
|
|
|
connect(this, SIGNAL(dat_operation_started(QString)), this, SLOT(on_dat_operation_started(QString)));
|
|
@@ -16,25 +17,53 @@ LotroManager::LotroManager(QObject *parent) : QObject(parent){
|
|
|
}
|
|
|
|
|
|
bool LotroManager::execute(QString command, QString args, QString name) {
|
|
|
- qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Вызываем execute() команды ", command.toLocal8Bit().data());
|
|
|
+ qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Вызываем execute() команды ", command.toUtf8().data());
|
|
|
|
|
|
if (busy_) {
|
|
|
qWarning("%s:%i: %s", __FILE__, __LINE__, "Ошибка! Уже выполняется другой процесс с данными!");
|
|
|
+ emit dat_operation_finished(command, args, name, "error");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (std::find(available_operations_.begin(), available_operations_.end(), command)
|
|
|
== available_operations_.end()) {
|
|
|
|
|
|
- qWarning("%s:%i: %s%s%s", __FILE__, __LINE__, "Ошибка! Операция ", command.toLocal8Bit().data(), " не найдена в списке доступных!");
|
|
|
+ qWarning("%s:%i: %s%s%s", __FILE__, __LINE__, "Ошибка! Операция ", command.toUtf8().data(), " не найдена в списке доступных!");
|
|
|
+ emit dat_operation_finished(command, args, name, "error");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ App* app = &App::getInstance();
|
|
|
+ QString filename = app->config->getValue("Local", "folder") + "/" + app->config->getValue("Local", "file");
|
|
|
+ QString execpath = app->config->getValue("Local", "folder") + "/" + "TurbineLauncher.exe";
|
|
|
+
|
|
|
+ if (!FileSystem::fileExists(filename) && FileSystem::fileExists(execpath) && command != "StartGame") {
|
|
|
+ qWarning("%s:%i: %s\n", __FILE__, __LINE__, "Файл данных не найден, но папка верная");
|
|
|
+ QString text = "Не найден файл ресурсов";
|
|
|
+ QString msg = "Файла ресурсов " + filename + ", похоже, не существует. Запустить лаунчер игры для "
|
|
|
+ "начала автоматического скачивания?<p>При запуске "
|
|
|
+ "лаунчера игры проверьте, что язык, выбранный в лаунчере и язык, "
|
|
|
+ "выбранный в Наследии, совпадают.<br>Язык в Наследии: <b>"
|
|
|
+ + app->config->getValue("Local", "lang") + "</b></p>";
|
|
|
+ app->helper->myDialogBox(text, msg, "OK", "Отмена", "gandalf.png", "loaddatfile", "", 420, 205, true, true, true);
|
|
|
+ emit dat_operation_finished(command, args, name, "error");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!FileSystem::fileExists(execpath)) {
|
|
|
+ QString text = "Не найдены файлы игры!";
|
|
|
+ QString msg = "Похоже, папка с игрой указана неверно. Укажите, пожалуйста, путь к папке с игрой. "
|
|
|
+ "Опознать папку с игрой можно по наличию папок 3rdparty, backup, bindat, de, en, forward и т.п.";
|
|
|
+ app->helper->myDialogBox(text, msg, "OK", "Выход", "gandalf.png", "choosedatpath", "exit", 400, 170, true, true, true);
|
|
|
+ emit dat_operation_finished(command, args, name, "error");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
if (command == "StartGame") {
|
|
|
QtConcurrent::run([=]() {
|
|
|
emit dat_operation_started(command, args, name);
|
|
|
- startGame();
|
|
|
- emit dat_operation_finished(command, args, name);
|
|
|
+ bool result = startGame();
|
|
|
+ emit dat_operation_finished(command, args, name, result ? "" : "error");
|
|
|
});
|
|
|
return true;
|
|
|
}
|
|
@@ -124,16 +153,16 @@ bool LotroManager::isBusy() {
|
|
|
}
|
|
|
|
|
|
void LotroManager::on_dat_operation_started(QString command, QString, QString name) {
|
|
|
- qInfo("%s:%i: %s%s %s %s", __FILE__, __LINE__, "Получен сигнал начала операции ", command.toLocal8Bit().data()
|
|
|
- , "с именем", name.toLocal8Bit().data());
|
|
|
+ qInfo("%s:%i: %s%s %s %s", __FILE__, __LINE__, "Получен сигнал начала операции ", command.toUtf8().data()
|
|
|
+ , "с именем", name.toUtf8().data());
|
|
|
busy_ = true;
|
|
|
}
|
|
|
|
|
|
void LotroManager::on_dat_operation_finished(QString command, QString, QString name, QString result) {
|
|
|
qInfo("%s:%i: %s%s %s %s %s %s", __FILE__, __LINE__
|
|
|
- , "Получен сигнал завершения операции ", command.toLocal8Bit().data()
|
|
|
- , "с именем", name.toLocal8Bit().data()
|
|
|
- , "с результатом", result.toLocal8Bit().data());
|
|
|
+ , "Получен сигнал завершения операции ", command.toUtf8().data()
|
|
|
+ , "с именем", name.toUtf8().data()
|
|
|
+ , "с результатом", result.toUtf8().data());
|
|
|
busy_ = false;
|
|
|
}
|
|
|
|
|
@@ -142,7 +171,7 @@ void LotroManager::saveDatFiles() {
|
|
|
dat_file.CloseDatFile();
|
|
|
}
|
|
|
|
|
|
-void LotroManager::startGame(){
|
|
|
+bool LotroManager::startGame(){
|
|
|
App *app = &App::getInstance();
|
|
|
|
|
|
for (auto &dat_file : dat_files_)
|
|
@@ -172,13 +201,13 @@ void LotroManager::startGame(){
|
|
|
if(f.fileName().contains(" ")) f.setFileName("\"" + f.fileName() + "\"");
|
|
|
process.startDetached(f.fileName(), args);
|
|
|
process.waitForFinished(-1);
|
|
|
- process.deleteLater();
|
|
|
- QApplication::quit();
|
|
|
+ return true;
|
|
|
} else {
|
|
|
QString text = "Запуск не удался";
|
|
|
QString info = "Не удалось запустить игру. Не найден файл TurbineLauncher.exe или невозможно получить к нему доступ. "
|
|
|
"Проверьте в разделе 'Настройки', что у вас указан верный путь к игре, закрыт лаунчер игры и повторите попытку запуска.";
|
|
|
- app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 160, true, false);
|
|
|
+ app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 160, true, true);
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -199,27 +228,8 @@ bool LotroManager::openDatFile(int id) {
|
|
|
QString filename = app->config->getValue("Local", "folder") + "/" + dat_files_name_list[id];
|
|
|
QString execpath = app->config->getValue("Local", "folder") + "/" + "TurbineLauncher.exe";
|
|
|
|
|
|
- if (!FileSystem::fileExists(filename) && FileSystem::fileExists(execpath)) {
|
|
|
- qWarning("%s:%i: %s\n", __FILE__, __LINE__, "Файл данных не найден, но папка верная");
|
|
|
- QString text = "Не найден файл ресурсов";
|
|
|
- QString msg = "Файла ресурсов " + filename + ", похоже, не существует. Запустить лаунчер игры для "
|
|
|
- "начала автоматического скачивания?";
|
|
|
- app->helper->myDialogBox(text, msg, "OK", "Отмена", "gandalf.png", "loaddatfile", "", 400, 180, true, true);
|
|
|
- app->helper->setState("free");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!FileSystem::fileExists(filename) && !FileSystem::fileExists(execpath)) {
|
|
|
- QString text = "Не найдены файлы игры!";
|
|
|
- QString msg = "Похоже, папка с игрой указана неверно. Укажите, пожалуйста, путь к папке с игрой. "
|
|
|
- "Опознать папку с игрой можно по наличию папок 3rdparty, backup, bindat, de, en, forward и т.п.";
|
|
|
- app->helper->myDialogBox(text, msg, "OK", "Выход", "gandalf.png", "choosedatpath", "exit", 400, 170, true, true);
|
|
|
- app->helper->setState("free");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Инициализация dat-файла. Открываем файл ", filename.toLocal8Bit().toStdString().c_str());
|
|
|
- int dat_state = dat_files_[id].InitDatFile(filename.toLocal8Bit().toStdString(), id);
|
|
|
+ qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Инициализация dat-файла. Открываем файл ", filename.toUtf8().toStdString().c_str());
|
|
|
+ int dat_state = dat_files_[id].InitDatFile(filename.toUtf8().toStdString(), id);
|
|
|
qDebug("%s:%i: %s%d", __FILE__, __LINE__, "Состояние dat-файла: ", dat_state);
|
|
|
|
|
|
if(dat_state > 0) {
|
|
@@ -228,7 +238,6 @@ bool LotroManager::openDatFile(int id) {
|
|
|
QString text = "Нет доступа к файлам игры";
|
|
|
QString info = "Возможно в данный момент запущены клиент или лаунчер игры либо попытка доступа блокируется настройкой прав, антивирусом или другими приложениями. Завершите все процессы, использующие файлы игры и повторите попытку.";
|
|
|
app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 200, true, false);
|
|
|
- app->helper->setState("free");
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
@@ -236,6 +245,9 @@ bool LotroManager::openDatFile(int id) {
|
|
|
}
|
|
|
|
|
|
void LotroManager::applyPatch(QString name) {
|
|
|
+ if (!correctPatchName(name))
|
|
|
+ return;
|
|
|
+
|
|
|
if (name == "loadscreens") {
|
|
|
applyLoadscreens();
|
|
|
return;
|
|
@@ -248,7 +260,7 @@ void LotroManager::applyPatch(QString name) {
|
|
|
App *app = &App::getInstance();
|
|
|
emit changeHint("Применение патчей", "Ожидайте. Идёт применение выбранных патчей");
|
|
|
|
|
|
- qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Начинаем применение патча ", name.toLocal8Bit().data());
|
|
|
+ qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Начинаем применение патча ", name.toUtf8().data());
|
|
|
|
|
|
QDir dir(QApplication::applicationDirPath() + "/data");
|
|
|
if (!dir.exists()) {
|
|
@@ -257,7 +269,7 @@ void LotroManager::applyPatch(QString name) {
|
|
|
}
|
|
|
|
|
|
QStringList paths = dir.entryList(QStringList(name + "*"));
|
|
|
- qInfo("%s:%i: %s%s%s%s", __FILE__, __LINE__, "Для патча ", name.toLocal8Bit().data(), " найдены пути:", QString(paths.join(',')).toLocal8Bit().data());
|
|
|
+ qInfo("%s:%i: %s%s%s%s", __FILE__, __LINE__, "Для патча ", name.toUtf8().data(), " найдены пути:", QString(paths.join(',')).toUtf8().data());
|
|
|
|
|
|
if (paths.empty()) {
|
|
|
emit changePatchStatus(name, "Не найден");
|
|
@@ -265,10 +277,10 @@ void LotroManager::applyPatch(QString name) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- qDebug() << QString("data/" + paths.first()).toLocal8Bit().data();
|
|
|
- qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Инициализируем базу данных: ", QString("data/" + paths.first()).toLocal8Bit().data());
|
|
|
+ qDebug() << QString("data/" + paths.first()).toUtf8().data();
|
|
|
+ qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Инициализируем базу данных: ", QString("data/" + paths.first()).toUtf8().data());
|
|
|
|
|
|
- if (!database_.InitDatabase(QString("data/" + paths.first()).toLocal8Bit().data())) {
|
|
|
+ if (!database_.InitDatabase(QString("data/" + paths.first()).toUtf8().data())) {
|
|
|
emit changePatchStatus(name, "Ошибка патча!");
|
|
|
emit changeHint("Применение патча завершено", "Патч " + patchTitleFromName(name) + " НЕ установлен (ошибка чтения патча)");
|
|
|
return;
|
|
@@ -284,16 +296,12 @@ void LotroManager::applyPatch(QString name) {
|
|
|
for(int i = 0; i < indb; i++) {
|
|
|
qint64 current_timestamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
|
|
|
|
|
|
- QString elapsed_time;
|
|
|
if (current_timestamp - start_time < 1000)
|
|
|
elapsed_time = " высчитывается...";
|
|
|
- else
|
|
|
- elapsed_time = app->helper->countFormattedElapsedTime(indb - i, double(i * 1000.0) / double(current_timestamp - start_time));
|
|
|
-
|
|
|
- if (current_timestamp - last_second_time >= 1000) {
|
|
|
+ else if (current_timestamp - last_second_time >= 1000) {
|
|
|
last_second_time = current_timestamp;
|
|
|
- current_elapsed_time = elapsed_time;
|
|
|
last_second_files_count = i;
|
|
|
+ elapsed_time = app->helper->countFormattedElapsedTime(indb - i, double(i * 1000.0) / double(current_timestamp - start_time));
|
|
|
}
|
|
|
|
|
|
processFile();
|
|
@@ -302,7 +310,7 @@ void LotroManager::applyPatch(QString name) {
|
|
|
+ QString("%"));
|
|
|
emit changeHint("Применение патча " + patchTitleFromName(name)
|
|
|
, "Завершено " + QString::fromLatin1("%1").arg(i*100.0/indb, 3, 'f', 1)
|
|
|
- + "% Осталось примерно " + current_elapsed_time);
|
|
|
+ + "% Оставшееся время: " + elapsed_time);
|
|
|
|
|
|
}
|
|
|
|
|
@@ -357,7 +365,7 @@ void LotroManager::applyMicroPatch(){
|
|
|
app->window->ui->hintLabel->setText("Установка последних обновлений");
|
|
|
app->window->ui->exthintLabel->setText("Подождите пока закончится применение обновлений");
|
|
|
|
|
|
- database_.InitDatabase(app->network->micropatch.toLocal8Bit().data());
|
|
|
+ database_.InitDatabase(app->network->micropatch.toUtf8().data());
|
|
|
int indb = database_.CountRows();
|
|
|
qInfo("%s:%i: %s%d", __FILE__, __LINE__, "Файлов в обновлении: ", indb);
|
|
|
|
|
@@ -377,58 +385,59 @@ void LotroManager::applyMicroPatch(){
|
|
|
void LotroManager::applyLoadscreens(){
|
|
|
App *app = &App::getInstance();
|
|
|
app->logSectionStart("Установка заставочных экранов");
|
|
|
- app->helper->setState("busy");
|
|
|
|
|
|
QString datafolder = QApplication::applicationDirPath() + "/data";
|
|
|
QDir dir(datafolder);
|
|
|
- if (!dir.exists())
|
|
|
+ if (!dir.exists()) {
|
|
|
+ emit changePatchStatus("loadscreens", "Не найден!");
|
|
|
return;
|
|
|
+ }
|
|
|
QStringList paths = dir.entryList(QStringList("loadscreens*"));
|
|
|
|
|
|
- if(!paths.empty()){
|
|
|
+ if(paths.empty()){
|
|
|
+ emit changePatchStatus("loadscreens", "Не найден!");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if(paths.first() == app->config->getValue("Applied", "screens")){
|
|
|
- app->helper->setState("free");
|
|
|
- return;
|
|
|
- }
|
|
|
+ if (paths.first() == app->config->getValue("Applied", "screens")){
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- QString lang = app->config->getValue("Local", "lang");
|
|
|
+ QString lang = app->config->getValue("Local", "lang");
|
|
|
|
|
|
- if (lang == "-1") {
|
|
|
- app->config->setValue("Local", "lang", "en");
|
|
|
- lang = "en";
|
|
|
- }
|
|
|
+ if (lang == "-1") {
|
|
|
+ app->config->setValue("Local", "lang", "en");
|
|
|
+ lang = "en";
|
|
|
+ }
|
|
|
|
|
|
- QString folder = app->config->getValue("Local", "folder") + "raw/" + lang + "/logo/";
|
|
|
- SubfileData subfile;
|
|
|
- QStringList filenames;
|
|
|
- QString mainscreen = lang == "en" ? "lotro_ad_pregame.jpg" : "lotro_ad_pregame_" + lang + ".jpg";
|
|
|
- filenames << mainscreen << "lotro_generic_teleport_screen_01.jpg" << "lotro_generic_teleport_screen_02.jpg"
|
|
|
- << "lotro_generic_teleport_screen_03.jpg" << "lotro_generic_teleport_screen_04.jpg" << "lotro_generic_teleport_screen_05.jpg"
|
|
|
- << "lotro_generic_teleport_screen_06.jpg" << "lotro_generic_teleport_screen_07.jpg" << "lotro_generic_teleport_screen_08.jpg"
|
|
|
- << "lotro_generic_teleport_screen_09.jpg" << "lotro_generic_teleport_screen_10.jpg";
|
|
|
-
|
|
|
- QString basename = datafolder + "/" + paths.first();
|
|
|
- database_.InitDatabase(basename.toStdString());
|
|
|
- int indb = database_.CountRows();
|
|
|
- qInfo("%s:%i: %s%d", __FILE__, __LINE__, "Файлы загрузочных экранов: ", indb);
|
|
|
- for(int i = 0; i<indb; i++){
|
|
|
- subfile = database_.GetNextFile();
|
|
|
- qDebug() << i;
|
|
|
- if (!subfile.Empty()){
|
|
|
- qInfo("%s:%i: %s", __FILE__, __LINE__, (folder + filenames[i]).toLocal8Bit().data());
|
|
|
- QFile::remove(folder + filenames[i]);
|
|
|
- subfile.binary_data.WriteToFile((folder + filenames[i]).toStdString());
|
|
|
- }
|
|
|
+ QString folder = app->config->getValue("Local", "folder") + "raw/" + lang + "/logo/";
|
|
|
+ SubfileData subfile;
|
|
|
+ QStringList filenames;
|
|
|
+ QString mainscreen = lang == "en" ? "lotro_ad_pregame.jpg" : "lotro_ad_pregame_" + lang + ".jpg";
|
|
|
+ filenames << mainscreen << "lotro_generic_teleport_screen_01.jpg" << "lotro_generic_teleport_screen_02.jpg"
|
|
|
+ << "lotro_generic_teleport_screen_03.jpg" << "lotro_generic_teleport_screen_04.jpg" << "lotro_generic_teleport_screen_05.jpg"
|
|
|
+ << "lotro_generic_teleport_screen_06.jpg" << "lotro_generic_teleport_screen_07.jpg" << "lotro_generic_teleport_screen_08.jpg"
|
|
|
+ << "lotro_generic_teleport_screen_09.jpg" << "lotro_generic_teleport_screen_10.jpg";
|
|
|
+
|
|
|
+ QString basename = datafolder + "/" + paths.first();
|
|
|
+ database_.InitDatabase(basename.toStdString());
|
|
|
+ int indb = database_.CountRows();
|
|
|
+ qInfo("%s:%i: %s%d", __FILE__, __LINE__, "Файлы загрузочных экранов: ", indb);
|
|
|
+ for(int i = 0; i<indb; i++){
|
|
|
+ subfile = database_.GetNextFile();
|
|
|
+ qDebug() << i;
|
|
|
+ if (!subfile.Empty()){
|
|
|
+ qInfo("%s:%i: %s", __FILE__, __LINE__, (folder + filenames[i]).toUtf8().data());
|
|
|
+ QFile::remove(folder + filenames[i]);
|
|
|
+ subfile.binary_data.WriteToFile((folder + filenames[i]).toStdString());
|
|
|
}
|
|
|
- database_.CloseDatabase();
|
|
|
-
|
|
|
}
|
|
|
- app->helper->setState("free");
|
|
|
- app->window->ui->loadscreensStatus->setText("Готово");
|
|
|
+ database_.CloseDatabase();
|
|
|
app->config->setValue("Applied", "screens", paths.first());
|
|
|
+ emit changePatchStatus("loadscreens", "Готово");
|
|
|
qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
|
|
|
app->logSectionEnd();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
void LotroManager::processFile(){
|
|
@@ -491,7 +500,7 @@ void LotroManager::prepareMicroPatch(){
|
|
|
qInfo("%s:%i: %s", __FILE__, __LINE__, "Опция активна. Начинаем загрузку обновлений");
|
|
|
app->network->micropatch = QApplication::applicationDirPath() + "/data/micro/" + QString::number(timestamp) + ".db";
|
|
|
if(!FileSystem::fileExists(app->network->micropatch)){
|
|
|
- qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Файл патча: ", app->network->micropatch.toLocal8Bit().data());
|
|
|
+ qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Файл патча: ", app->network->micropatch.toUtf8().data());
|
|
|
app->network->micropatch = app->network->getMicroPath(timestamp);
|
|
|
}
|
|
|
app->window->ui->hintLabel->setText("Загрузка завершена");
|