refactor: add instance creation abstraction and move vanilla
This is so that 1. Code is more cleanly separated, and 2. Allows to more easily add instance updating :) Signed-off-by: flow <flowlnlnln@gmail.com>
This commit is contained in:
parent
ec9ddc4f22
commit
941d75824a
@ -297,6 +297,8 @@ set(MINECRAFT_SOURCES
|
|||||||
minecraft/Library.cpp
|
minecraft/Library.cpp
|
||||||
minecraft/Library.h
|
minecraft/Library.h
|
||||||
minecraft/MojangDownloadInfo.h
|
minecraft/MojangDownloadInfo.h
|
||||||
|
minecraft/VanillaInstanceCreationTask.cpp
|
||||||
|
minecraft/VanillaInstanceCreationTask.h
|
||||||
minecraft/VersionFile.cpp
|
minecraft/VersionFile.cpp
|
||||||
minecraft/VersionFile.h
|
minecraft/VersionFile.h
|
||||||
minecraft/VersionFilterData.h
|
minecraft/VersionFilterData.h
|
||||||
|
@ -1,40 +1,18 @@
|
|||||||
#include "InstanceCreationTask.h"
|
#include "InstanceCreationTask.h"
|
||||||
#include "settings/INISettingsObject.h"
|
|
||||||
#include "FileSystem.h"
|
|
||||||
|
|
||||||
//FIXME: remove this
|
#include <QDebug>
|
||||||
#include "minecraft/MinecraftInstance.h"
|
|
||||||
#include "minecraft/PackProfile.h"
|
|
||||||
|
|
||||||
InstanceCreationTask::InstanceCreationTask(BaseVersionPtr version)
|
InstanceCreationTask::InstanceCreationTask() {}
|
||||||
{
|
|
||||||
m_version = version;
|
|
||||||
m_usingLoader = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceCreationTask::InstanceCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loaderVersion)
|
|
||||||
{
|
|
||||||
m_version = version;
|
|
||||||
m_usingLoader = true;
|
|
||||||
m_loader = loader;
|
|
||||||
m_loaderVersion = loaderVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstanceCreationTask::executeTask()
|
void InstanceCreationTask::executeTask()
|
||||||
{
|
{
|
||||||
setStatus(tr("Creating instance from version %1").arg(m_version->name()));
|
if (updateInstance() || createInstance()) {
|
||||||
{
|
|
||||||
auto instanceSettings = std::make_shared<INISettingsObject>(FS::PathCombine(m_stagingPath, "instance.cfg"));
|
|
||||||
instanceSettings->suspendSave();
|
|
||||||
MinecraftInstance inst(m_globalSettings, instanceSettings, m_stagingPath);
|
|
||||||
auto components = inst.getPackProfile();
|
|
||||||
components->buildingFromScratch();
|
|
||||||
components->setComponentVersion("net.minecraft", m_version->descriptor(), true);
|
|
||||||
if(m_usingLoader)
|
|
||||||
components->setComponentVersion(m_loader, m_loaderVersion->descriptor());
|
|
||||||
inst.setName(m_instName);
|
|
||||||
inst.setIconKey(m_instIcon);
|
|
||||||
instanceSettings->resumeSave();
|
|
||||||
}
|
|
||||||
emitSucceeded();
|
emitSucceeded();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qWarning() << "Instance creation failed!";
|
||||||
|
if (!m_error_message.isEmpty())
|
||||||
|
qWarning() << "Reason: " << m_error_message;
|
||||||
|
emitFailed(tr("Error while creating new instance."));
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,39 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "tasks/Task.h"
|
|
||||||
#include "net/NetJob.h"
|
|
||||||
#include <QUrl>
|
|
||||||
#include "settings/SettingsObject.h"
|
|
||||||
#include "BaseVersion.h"
|
#include "BaseVersion.h"
|
||||||
#include "InstanceTask.h"
|
#include "InstanceTask.h"
|
||||||
|
|
||||||
class InstanceCreationTask : public InstanceTask
|
class InstanceCreationTask : public InstanceTask {
|
||||||
{
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit InstanceCreationTask(BaseVersionPtr version);
|
InstanceCreationTask();
|
||||||
explicit InstanceCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loaderVersion);
|
virtual ~InstanceCreationTask() = default;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Entry point for tasks.
|
void executeTask() final override;
|
||||||
virtual void executeTask() override;
|
|
||||||
|
|
||||||
private: /* data */
|
/**
|
||||||
BaseVersionPtr m_version;
|
* Tries to update an already existing instance.
|
||||||
bool m_usingLoader;
|
*
|
||||||
QString m_loader;
|
* This can be implemented by subclasses to provide a way of updating an already existing
|
||||||
BaseVersionPtr m_loaderVersion;
|
* instance, according to that implementation's concept of 'identity' (i.e. instances that
|
||||||
|
* are updates / downgrades of one another).
|
||||||
|
*
|
||||||
|
* If this returns true, createInstance() will not run, so you should do all update steps in here.
|
||||||
|
* Otherwise, createInstance() is run as normal.
|
||||||
|
*/
|
||||||
|
virtual bool updateInstance() { return false; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance.
|
||||||
|
*
|
||||||
|
* Returns whether the instance creation was successful (true) or not (false).
|
||||||
|
*/
|
||||||
|
virtual bool createInstance() { return false; };
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void setError(QString message) { m_error_message = message; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_error_message;
|
||||||
};
|
};
|
||||||
|
32
launcher/minecraft/VanillaInstanceCreationTask.cpp
Normal file
32
launcher/minecraft/VanillaInstanceCreationTask.cpp
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "VanillaInstanceCreationTask.h"
|
||||||
|
|
||||||
|
#include "FileSystem.h"
|
||||||
|
#include "settings/INISettingsObject.h"
|
||||||
|
#include "minecraft/MinecraftInstance.h"
|
||||||
|
#include "minecraft/PackProfile.h"
|
||||||
|
|
||||||
|
VanillaCreationTask::VanillaCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loader_version)
|
||||||
|
: InstanceCreationTask(), m_version(version), m_using_loader(true), m_loader(loader), m_loader_version(loader_version)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool VanillaCreationTask::createInstance()
|
||||||
|
{
|
||||||
|
setStatus(tr("Creating instance from version %1").arg(m_version->name()));
|
||||||
|
|
||||||
|
auto instance_settings = std::make_shared<INISettingsObject>(FS::PathCombine(m_stagingPath, "instance.cfg"));
|
||||||
|
instance_settings->suspendSave();
|
||||||
|
{
|
||||||
|
MinecraftInstance inst(m_globalSettings, instance_settings, m_stagingPath);
|
||||||
|
auto components = inst.getPackProfile();
|
||||||
|
components->buildingFromScratch();
|
||||||
|
components->setComponentVersion("net.minecraft", m_version->descriptor(), true);
|
||||||
|
if(m_using_loader)
|
||||||
|
components->setComponentVersion(m_loader, m_loader_version->descriptor());
|
||||||
|
|
||||||
|
inst.setName(m_instName);
|
||||||
|
inst.setIconKey(m_instIcon);
|
||||||
|
}
|
||||||
|
instance_settings->resumeSave();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
20
launcher/minecraft/VanillaInstanceCreationTask.h
Normal file
20
launcher/minecraft/VanillaInstanceCreationTask.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "InstanceCreationTask.h"
|
||||||
|
|
||||||
|
class VanillaCreationTask final : public InstanceCreationTask {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
VanillaCreationTask(BaseVersionPtr version) : InstanceCreationTask(), m_version(version) {}
|
||||||
|
VanillaCreationTask(BaseVersionPtr version, QString loader, BaseVersionPtr loader_version);
|
||||||
|
|
||||||
|
bool createInstance() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Version to update to / create of the instance.
|
||||||
|
BaseVersionPtr m_version;
|
||||||
|
|
||||||
|
bool m_using_loader = false;
|
||||||
|
QString m_loader;
|
||||||
|
BaseVersionPtr m_loader_version;
|
||||||
|
};
|
@ -39,12 +39,12 @@
|
|||||||
#include <QTabBar>
|
#include <QTabBar>
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
#include "Filter.h"
|
||||||
|
#include "Version.h"
|
||||||
#include "meta/Index.h"
|
#include "meta/Index.h"
|
||||||
#include "meta/VersionList.h"
|
#include "meta/VersionList.h"
|
||||||
|
#include "minecraft/VanillaInstanceCreationTask.h"
|
||||||
#include "ui/dialogs/NewInstanceDialog.h"
|
#include "ui/dialogs/NewInstanceDialog.h"
|
||||||
#include "Filter.h"
|
|
||||||
#include "InstanceCreationTask.h"
|
|
||||||
#include "Version.h"
|
|
||||||
|
|
||||||
VanillaPage::VanillaPage(NewInstanceDialog *dialog, QWidget *parent)
|
VanillaPage::VanillaPage(NewInstanceDialog *dialog, QWidget *parent)
|
||||||
: QWidget(parent), dialog(dialog), ui(new Ui::VanillaPage)
|
: QWidget(parent), dialog(dialog), ui(new Ui::VanillaPage)
|
||||||
@ -217,11 +217,11 @@ void VanillaPage::suggestCurrent()
|
|||||||
|
|
||||||
// There isn't a selected version if the version list is empty
|
// There isn't a selected version if the version list is empty
|
||||||
if(ui->loaderVersionList->selectedVersion() == nullptr)
|
if(ui->loaderVersionList->selectedVersion() == nullptr)
|
||||||
dialog->setSuggestedPack(m_selectedVersion->descriptor(), new InstanceCreationTask(m_selectedVersion));
|
dialog->setSuggestedPack(m_selectedVersion->descriptor(), new VanillaCreationTask(m_selectedVersion));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dialog->setSuggestedPack(m_selectedVersion->descriptor(),
|
dialog->setSuggestedPack(m_selectedVersion->descriptor(),
|
||||||
new InstanceCreationTask(m_selectedVersion, m_selectedLoader,
|
new VanillaCreationTask(m_selectedVersion, m_selectedLoader,
|
||||||
m_selectedLoaderVersion));
|
m_selectedLoaderVersion));
|
||||||
}
|
}
|
||||||
dialog->setSuggestedIcon("default");
|
dialog->setSuggestedIcon("default");
|
||||||
|
Loading…
Reference in New Issue
Block a user