Compare commits

..

3 Commits

Author SHA1 Message Date
Petr Mrázek
3ad9ea507e NOISSUE update version number, changelog and credits in about dialog 2020-03-29 03:12:57 +02:00
Petr Mrázek
c9e851f12f GH-2544 enable Forge install button for >= 1.13 2020-03-28 15:55:12 +01:00
Petr Mrázek
0281845fc8 GH-2544 allow adding files to libraries without affecting classpath
This is done by adding library-like objects into the `mavenFiles`
list in version JSONs.
2020-03-27 02:23:15 +01:00
10 changed files with 78 additions and 16 deletions

View File

@@ -46,7 +46,7 @@ set(MultiMC_NEWS_RSS_URL "https://multimc.org/rss.xml" CACHE STRING "URL to fetc
######## Set version numbers ######## ######## Set version numbers ########
set(MultiMC_VERSION_MAJOR 0) set(MultiMC_VERSION_MAJOR 0)
set(MultiMC_VERSION_MINOR 6) set(MultiMC_VERSION_MINOR 6)
set(MultiMC_VERSION_HOTFIX 10) set(MultiMC_VERSION_HOTFIX 11)
# Build number # Build number
set(MultiMC_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.") set(MultiMC_VERSION_BUILD -1 CACHE STRING "Build number. -1 for no build number.")

View File

@@ -11,6 +11,7 @@ void LaunchProfile::clear()
m_mainClass.clear(); m_mainClass.clear();
m_appletClass.clear(); m_appletClass.clear();
m_libraries.clear(); m_libraries.clear();
m_mavenFiles.clear();
m_traits.clear(); m_traits.clear();
m_jarMods.clear(); m_jarMods.clear();
m_mainJar.reset(); m_mainJar.reset();
@@ -157,6 +158,22 @@ void LaunchProfile::applyLibrary(LibraryPtr library)
} }
} }
void LaunchProfile::applyMavenFile(LibraryPtr mavenFile)
{
if(!mavenFile->isActive())
{
return;
}
if(mavenFile->isNative())
{
return;
}
// unlike libraries, we do not keep only one version or try to dedupe them
m_mavenFiles.append(Library::limitedCopy(mavenFile));
}
const LibraryPtr LaunchProfile::getMainJar() const const LibraryPtr LaunchProfile::getMainJar() const
{ {
return m_mainJar; return m_mainJar;
@@ -253,6 +270,11 @@ const QList<LibraryPtr> & LaunchProfile::getNativeLibraries() const
return m_nativeLibraries; return m_nativeLibraries;
} }
const QList<LibraryPtr> & LaunchProfile::getMavenFiles() const
{
return m_mavenFiles;
}
void LaunchProfile::getLibraryFiles( void LaunchProfile::getLibraryFiles(
const QString& architecture, const QString& architecture,
QStringList& jars, QStringList& jars,

View File

@@ -20,6 +20,7 @@ public: /* application of profile variables from patches */
void applyJarMods(const QList<LibraryPtr> &jarMods); void applyJarMods(const QList<LibraryPtr> &jarMods);
void applyMods(const QList<LibraryPtr> &jarMods); void applyMods(const QList<LibraryPtr> &jarMods);
void applyLibrary(LibraryPtr library); void applyLibrary(LibraryPtr library);
void applyMavenFile(LibraryPtr library);
void applyMainJar(LibraryPtr jar); void applyMainJar(LibraryPtr jar);
void applyProblemSeverity(ProblemSeverity severity); void applyProblemSeverity(ProblemSeverity severity);
/// clear the profile /// clear the profile
@@ -37,6 +38,7 @@ public: /* getters for profile variables */
const QList<LibraryPtr> & getJarMods() const; const QList<LibraryPtr> & getJarMods() const;
const QList<LibraryPtr> & getLibraries() const; const QList<LibraryPtr> & getLibraries() const;
const QList<LibraryPtr> & getNativeLibraries() const; const QList<LibraryPtr> & getNativeLibraries() const;
const QList<LibraryPtr> & getMavenFiles() const;
const LibraryPtr getMainJar() const; const LibraryPtr getMainJar() const;
void getLibraryFiles( void getLibraryFiles(
const QString & architecture, const QString & architecture,
@@ -79,10 +81,13 @@ private:
/// the list of libraries /// the list of libraries
QList<LibraryPtr> m_libraries; QList<LibraryPtr> m_libraries;
/// the list of maven files to be placed in the libraries folder, but not acted upon
QList<LibraryPtr> m_mavenFiles;
/// the main jar /// the main jar
LibraryPtr m_mainJar; LibraryPtr m_mainJar;
/// the list of libraries /// the list of native libraries
QList<LibraryPtr> m_nativeLibraries; QList<LibraryPtr> m_nativeLibraries;
/// traits, collected from all the version files (version files can only add) /// traits, collected from all the version files (version files can only add)

View File

@@ -144,18 +144,14 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc
} }
} }
auto readLibs = [&](const char * which) auto readLibs = [&](const char * which, QList<LibraryPtr> & out)
{ {
for (auto libVal : requireArray(root.value(which))) for (auto libVal : requireArray(root.value(which)))
{ {
QJsonObject libObj = requireObject(libVal); QJsonObject libObj = requireObject(libVal);
// parse the library // parse the library
auto lib = libraryFromJson(libObj, filename); auto lib = libraryFromJson(libObj, filename);
if(lib->rawName().artifactId() == "ForgeWrapper") { out.append(lib);
out->mainClass.clear();
out->addProblem(ProblemSeverity::Error, QObject::tr("Forge workarounds have no place in MultiMC."));
}
out->libraries.append(lib);
} }
}; };
bool hasPlusLibs = root.contains("+libraries"); bool hasPlusLibs = root.contains("+libraries");
@@ -164,16 +160,20 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc
{ {
out->addProblem(ProblemSeverity::Warning, out->addProblem(ProblemSeverity::Warning,
QObject::tr("Version file has both '+libraries' and 'libraries'. This is no longer supported.")); QObject::tr("Version file has both '+libraries' and 'libraries'. This is no longer supported."));
readLibs("libraries"); readLibs("libraries", out->libraries);
readLibs("+libraries"); readLibs("+libraries", out->libraries);
} }
else if (hasLibs) else if (hasLibs)
{ {
readLibs("libraries"); readLibs("libraries", out->libraries);
} }
else if(hasPlusLibs) else if(hasPlusLibs)
{ {
readLibs("+libraries"); readLibs("+libraries", out->libraries);
}
if(root.contains("mavenFiles")) {
readLibs("mavenFiles", out->mavenFiles);
} }
// if we have mainJar, just use it // if we have mainJar, just use it
@@ -280,6 +280,15 @@ QJsonDocument OneSixVersionFormat::versionFileToJson(const VersionFilePtr &patch
} }
root.insert("libraries", array); root.insert("libraries", array);
} }
if (!patch->mavenFiles.isEmpty())
{
QJsonArray array;
for (auto value: patch->mavenFiles)
{
array.append(OneSixVersionFormat::libraryToJson(value.get()));
}
root.insert("mavenFiles", array);
}
if (!patch->jarMods.isEmpty()) if (!patch->jarMods.isEmpty())
{ {
QJsonArray array; QJsonArray array;

View File

@@ -41,6 +41,10 @@ void VersionFile::applyTo(LaunchProfile *profile)
{ {
profile->applyLibrary(library); profile->applyLibrary(library);
} }
for (auto mavenFile : mavenFiles)
{
profile->applyMavenFile(mavenFile);
}
profile->applyProblemSeverity(getProblemSeverity()); profile->applyProblemSeverity(getProblemSeverity());
} }

View File

@@ -75,6 +75,9 @@ public: /* data */
/// Mojang: list of libraries to add to the version /// Mojang: list of libraries to add to the version
QList<LibraryPtr> libraries; QList<LibraryPtr> libraries;
/// MultiMC: list of maven files to put in the libraries folder, but not in classpath
QList<LibraryPtr> mavenFiles;
/// The main jar (Minecraft version library, normally) /// The main jar (Minecraft version library, normally)
LibraryPtr mainJar; LibraryPtr mainJar;

View File

@@ -45,6 +45,7 @@ void LibrariesTask::executeTask()
QList<LibraryPtr> libArtifactPool; QList<LibraryPtr> libArtifactPool;
libArtifactPool.append(profile->getLibraries()); libArtifactPool.append(profile->getLibraries());
libArtifactPool.append(profile->getNativeLibraries()); libArtifactPool.append(profile->getNativeLibraries());
libArtifactPool.append(profile->getMavenFiles());
libArtifactPool.append(profile->getMainJar()); libArtifactPool.append(profile->getMainJar());
processArtifactPool(libArtifactPool, failedLocalLibraries, inst->getLocalLibraryPath()); processArtifactPool(libArtifactPool, failedLocalLibraries, inst->getLocalLibraryPath());

View File

@@ -46,6 +46,7 @@ QString getCreditsHtml(QStringList patrons)
stream << "<p>TakSuyu &lt;<a href='mailto:taksuyu@gmail.com'>taksuyu@gmail.com</a>&gt;</p>\n"; stream << "<p>TakSuyu &lt;<a href='mailto:taksuyu@gmail.com'>taksuyu@gmail.com</a>&gt;</p>\n";
stream << "<p>Kilobyte &lt;<a href='mailto:stiepen22@gmx.de'>stiepen22@gmx.de</a>&gt;</p>\n"; stream << "<p>Kilobyte &lt;<a href='mailto:stiepen22@gmx.de'>stiepen22@gmx.de</a>&gt;</p>\n";
stream << "<p>Rootbear75 &lt;<a href='https://twitter.com/rootbear75'>@rootbear75</a>&gt;</p>\n"; stream << "<p>Rootbear75 &lt;<a href='https://twitter.com/rootbear75'>@rootbear75</a>&gt;</p>\n";
stream << "<p>Zeker Zhayard &lt;<a href='https://twitter.com/zeker_zhayard'>@Zeker_Zhayard</a>&gt;</p>\n";
stream << "<br />\n"; stream << "<br />\n";
if(!patrons.isEmpty()) { if(!patrons.isEmpty()) {

View File

@@ -206,7 +206,7 @@ void VersionPage::updateVersionControls()
bool newCraft = controlsEnabled && (minecraftVersion >= Version("1.14")); bool newCraft = controlsEnabled && (minecraftVersion >= Version("1.14"));
bool oldCraft = controlsEnabled && (minecraftVersion <= Version("1.12.2")); bool oldCraft = controlsEnabled && (minecraftVersion <= Version("1.12.2"));
ui->actionInstall_Fabric->setEnabled(newCraft); ui->actionInstall_Fabric->setEnabled(newCraft);
ui->actionInstall_Forge->setEnabled(oldCraft); ui->actionInstall_Forge->setEnabled(true);
ui->actionInstall_LiteLoader->setEnabled(oldCraft); ui->actionInstall_LiteLoader->setEnabled(oldCraft);
ui->actionReload->setEnabled(true); ui->actionReload->setEnabled(true);
updateButtons(); updateButtons();

View File

@@ -1,4 +1,22 @@
# MultiMC 0.6.8 # MultiMC 0.6.11
This adds Forge 1.13+ support using [ForgeWrapper](https://github.com/ZekerZhayard/ForgeWrapper) by ZekerZhayard.
### New or changed features
- GH-2988: You can now import instances and curse modpacks from the command line with the `--import` option followed by either an URL or a local file path.
- GH-2544: MultiMC now supports downloading library files without including them on the Java classpath.
This is done by adding them to the `mavenFiles` list instead of the `libraries` list.
Such downloads are not deduplicated or version upgraded like libraries are.
This enables ForgeWrapper to work - MultiMC downloads all the files, and ForgeWrapper runs the Forge installer during instance start when needed.
# Previous releases
## MultiMC 0.6.8
This is mostly about removal of the 'curse URL' related features, because they were of low quality and generally unreliable. This is mostly about removal of the 'curse URL' related features, because they were of low quality and generally unreliable.
@@ -44,7 +62,6 @@ MultiMC also migrated to a new continuous deployment system, which makes everyth
- When a component is customized, the launcher will not try to update it in an infinite loop when something else requires a different version. - When a component is customized, the launcher will not try to update it in an infinite loop when something else requires a different version.
# Previous releases
## MultiMC 0.6.7 ## MultiMC 0.6.7