From 1f2bed2ef119094bdc156aa3a206b93dea5081d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 16 Jun 2016 02:20:23 +0200 Subject: NOISSUE implement direct java launch Just running the Java process and giving it params on the command line --- api/logic/minecraft/onesix/OneSixInstance.cpp | 284 ++++++++++++++++---------- api/logic/minecraft/onesix/OneSixInstance.h | 17 +- 2 files changed, 194 insertions(+), 107 deletions(-) (limited to 'api/logic/minecraft/onesix') diff --git a/api/logic/minecraft/onesix/OneSixInstance.cpp b/api/logic/minecraft/onesix/OneSixInstance.cpp index a96704c8..8b5491e2 100644 --- a/api/logic/minecraft/onesix/OneSixInstance.cpp +++ b/api/logic/minecraft/onesix/OneSixInstance.cpp @@ -14,6 +14,8 @@ */ #include +#include +#include #include #include "OneSixInstance.h" @@ -22,14 +24,7 @@ #include "minecraft/MinecraftProfile.h" #include "minecraft/VersionBuildError.h" -#include "launch/LaunchTask.h" -#include "launch/steps/PreLaunchCommand.h" -#include "launch/steps/Update.h" -#include "launch/steps/PostLaunchCommand.h" -#include "launch/steps/TextPrint.h" -#include "minecraft/launch/LaunchMinecraft.h" #include "minecraft/launch/ModMinecraftJar.h" -#include "java/launch/CheckJava.h" #include "MMCZip.h" #include "minecraft/AssetsUtils.h" @@ -94,7 +89,7 @@ QString replaceTokensIn(QString text, QMap with) return result; } -QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session) +QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session) const { QString args_pattern = m_profile->getMinecraftArguments(); for (auto tweaker : m_profile->getTweakers()) @@ -104,11 +99,16 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session) QMap token_mapping; // yggdrasil! - token_mapping["auth_username"] = session->username; - token_mapping["auth_session"] = session->session; - token_mapping["auth_access_token"] = session->access_token; - token_mapping["auth_player_name"] = session->player_name; - token_mapping["auth_uuid"] = session->uuid; + if(session) + { + token_mapping["auth_username"] = session->username; + token_mapping["auth_session"] = session->session; + token_mapping["auth_access_token"] = session->access_token; + token_mapping["auth_player_name"] = session->player_name; + token_mapping["auth_uuid"] = session->uuid; + token_mapping["user_properties"] = session->serializeUserProperties(); + token_mapping["user_type"] = session->user_type; + } // blatant self-promotion. token_mapping["profile_name"] = token_mapping["version_name"] = "MultiMC5"; @@ -127,9 +127,6 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session) auto assets = m_profile->getMinecraftAssets(); token_mapping["game_assets"] = AssetsUtils::reconstructAssets(assets->id).absolutePath(); - token_mapping["user_properties"] = session->serializeUserProperties(); - token_mapping["user_type"] = session->user_type; - // 1.7.3+ assets tokens token_mapping["assets_root"] = absAssetsDir; token_mapping["assets_index_name"] = assets->id; @@ -142,41 +139,34 @@ QStringList OneSixInstance::processMinecraftArgs(AuthSessionPtr session) return parts; } -QString OneSixInstance::createLaunchScript(AuthSessionPtr session) +QString OneSixInstance::getNativePath() const { - QString launchScript; - - if (!m_profile) - return nullptr; + QDir natives_dir(FS::PathCombine(instanceRoot(), "natives/")); + return natives_dir.absolutePath(); +} - for(auto & mod: loaderModList()->allMods()) +QString OneSixInstance::mainJarPath() const +{ + auto jarMods = getJarMods(); + if (!jarMods.isEmpty()) { - if(!mod.enabled()) - continue; - if(mod.type() == Mod::MOD_FOLDER) - continue; - // TODO: proper implementation would need to descend into folders. - - launchScript += "mod " + mod.filename().completeBaseName() + "\n";; + return QDir(instanceRoot()).absoluteFilePath("minecraft.jar"); } - - for(auto & coremod: coreModList()->allMods()) + else { - if(!coremod.enabled()) - continue; - if(coremod.type() == Mod::MOD_FOLDER) - continue; - // TODO: proper implementation would need to descend into folders. - - launchScript += "coremod " + coremod.filename().completeBaseName() + "\n";; + QString relpath = m_profile->getMinecraftVersion() + "/" + m_profile->getMinecraftVersion() + ".jar"; + return versionsPath().absoluteFilePath(relpath); } +} - for(auto & jarmod: m_profile->getJarMods()) - { - launchScript += "jarmod " + jarmod->originalName + " (" + jarmod->name + ")\n"; - } +QString OneSixInstance::createLaunchScript(AuthSessionPtr session) +{ + QString launchScript; - auto mainClass = m_profile->getMainClass(); + if (!m_profile) + return nullptr; + + auto mainClass = getMainClass(); if (!mainClass.isEmpty()) { launchScript += "mainClass " + mainClass + "\n"; @@ -207,6 +197,7 @@ QString OneSixInstance::createLaunchScript(AuthSessionPtr session) } // legacy auth + if(session) { launchScript += "userName " + session->player_name + "\n"; launchScript += "sessionId " + session->session + "\n"; @@ -214,44 +205,21 @@ QString OneSixInstance::createLaunchScript(AuthSessionPtr session) // libraries and class path. { - auto libs = m_profile->getLibraries(); - - QStringList jar, native, native32, native64; - for (auto lib : libs) - { - lib->getApplicableFiles(currentSystem, jar, native, native32, native64); - } - for(auto file: jar) + QStringList jars, nativeJars; + auto javaArchitecture = settings()->get("JavaArchitecture").toString(); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); + for(auto file: jars) { launchScript += "cp " + file + "\n"; } - for(auto file: native) + launchScript += "cp " + mainJarPath() + "\n"; + for(auto file: nativeJars) { launchScript += "ext " + file + "\n"; } - for(auto file: native32) - { - launchScript += "ext32 " + file + "\n"; - } - for(auto file: native64) - { - launchScript += "ext64 " + file + "\n"; - } - QDir natives_dir(FS::PathCombine(instanceRoot(), "natives/")); - launchScript += "natives " + natives_dir.absolutePath() + "\n"; - auto jarMods = getJarMods(); - if (!jarMods.isEmpty()) - { - launchScript += "cp " + QDir(instanceRoot()).absoluteFilePath("minecraft.jar") + "\n"; - } - else - { - QString relpath = m_profile->getMinecraftVersion() + "/" + m_profile->getMinecraftVersion() + ".jar"; - launchScript += "cp " + versionsPath().absoluteFilePath(relpath) + "\n"; - } + launchScript += "natives " + getNativePath() + "\n"; } - // traits. including legacyLaunch and others ;) for (auto trait : m_profile->getTraits()) { launchScript += "traits " + trait + "\n"; @@ -260,58 +228,139 @@ QString OneSixInstance::createLaunchScript(AuthSessionPtr session) return launchScript; } -std::shared_ptr OneSixInstance::createLaunchTask(AuthSessionPtr session) +QStringList OneSixInstance::verboseDescription(AuthSessionPtr session) { - auto process = LaunchTask::create(std::dynamic_pointer_cast(getSharedPtr())); - auto pptr = process.get(); + QStringList out; + out << "Main Class:" << " " + getMainClass() << ""; + out << "Native path:" << " " + getNativePath() << ""; - // print a header + + auto alltraits = traits(); + if(alltraits.size()) { - process->appendStep(std::make_shared(pptr, "Minecraft folder is:\n" + minecraftRoot() + "\n\n", MessageLevel::MultiMC)); + out << "Traits:"; + for (auto trait : alltraits) + { + out << "traits " + trait; + } + out << ""; + } + + // libraries and class path. + { + out << "Libraries:"; + QStringList jars, nativeJars; + auto javaArchitecture = settings()->get("JavaArchitecture").toString(); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); + auto printLibFile = [&](const QString & path) + { + QFileInfo info(path); + if(info.exists()) + { + out << " " + path; + } + else + { + out << " " + path + " (missing)"; + } + }; + for(auto file: jars) + { + printLibFile(file); + } + printLibFile(mainJarPath()); + for(auto file: nativeJars) + { + printLibFile(file); + } + out << ""; } + + if(loaderModList()->size()) { - auto step = std::make_shared(pptr); - process->appendStep(step); + out << "Mods:"; + for(auto & mod: loaderModList()->allMods()) + { + if(!mod.enabled()) + continue; + if(mod.type() == Mod::MOD_FOLDER) + continue; + // TODO: proper implementation would need to descend into folders. + + out << " " + mod.filename().completeBaseName(); + } + out << ""; } - // run pre-launch command if that's needed - if(getPreLaunchCommand().size()) + + if(coreModList()->size()) { - auto step = std::make_shared(pptr); - step->setWorkingDirectory(minecraftRoot()); - process->appendStep(step); + out << "Core Mods:"; + for(auto & coremod: coreModList()->allMods()) + { + if(!coremod.enabled()) + continue; + if(coremod.type() == Mod::MOD_FOLDER) + continue; + // TODO: proper implementation would need to descend into folders. + + out << " " + coremod.filename().completeBaseName(); + } + out << ""; } - // if we aren't in offline mode,. - if(session->status != AuthSession::PlayableOffline) + + auto & jarMods = m_profile->getJarMods(); + if(jarMods.size()) { - process->appendStep(std::make_shared(pptr)); + out << "Jar Mods:"; + for(auto & jarmod: jarMods) + { + out << " " + jarmod->originalName + " (" + jarmod->name + ")"; + } + out << ""; } - // if there are any jar mods - if(getJarMods().size()) + + auto params = processMinecraftArgs(nullptr); + out << "Params:"; + out << " " + params.join(' '); + out << ""; + + QString windowParams; + if (settings()->get("LaunchMaximized").toBool()) { - auto step = std::make_shared(pptr); - process->appendStep(step); + out << "Window size: max (if available)"; } - // actually launch the game + else { - auto step = std::make_shared(pptr); - step->setWorkingDirectory(minecraftRoot()); - step->setAuthSession(session); - process->appendStep(step); + auto width = settings()->get("MinecraftWinWidth").toInt(); + auto height = settings()->get("MinecraftWinHeight").toInt(); + out << "Window size: " + QString::number(width) + " x " + QString::number(height); } - // run post-exit command if that's needed - if(getPostExitCommand().size()) + out << ""; + return out; +} + + +std::shared_ptr OneSixInstance::createMainLaunchStep(LaunchTask * parent, AuthSessionPtr session) +{ + auto method = launchMethod(); + if(method == "LauncherPart") { - auto step = std::make_shared(pptr); + auto step = std::make_shared(parent); + step->setAuthSession(session); step->setWorkingDirectory(minecraftRoot()); - process->appendStep(step); + return step; } - if (session) + else if (method == "DirectJava") { - process->setCensorFilter(createCensorFilterFromSession(session)); + auto step = std::make_shared(parent); + step->setWorkingDirectory(minecraftRoot()); + step->setAuthSession(session); + return step; } - return process; + return nullptr; } + std::shared_ptr OneSixInstance::createJarModdingTask() { class JarModTask : public Task @@ -595,3 +644,30 @@ QString OneSixInstance::typeName() const { return tr("OneSix"); } + +QStringList OneSixInstance::validLaunchMethods() +{ + return {"LauncherPart", "DirectJava"}; +} + +QStringList OneSixInstance::getClassPath() const +{ + QStringList jars, nativeJars; + auto javaArchitecture = settings()->get("JavaArchitecture").toString(); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); + jars.append(mainJarPath()); + return jars; +} + +QString OneSixInstance::getMainClass() const +{ + return m_profile->getMainClass(); +} + +QStringList OneSixInstance::getNativeJars() const +{ + QStringList jars, nativeJars; + auto javaArchitecture = settings()->get("JavaArchitecture").toString(); + m_profile->getLibraryFiles(javaArchitecture, jars, nativeJars); + return nativeJars; +} diff --git a/api/logic/minecraft/onesix/OneSixInstance.h b/api/logic/minecraft/onesix/OneSixInstance.h index 2dfab48c..1a917e79 100644 --- a/api/logic/minecraft/onesix/OneSixInstance.h +++ b/api/logic/minecraft/onesix/OneSixInstance.h @@ -53,10 +53,9 @@ public: virtual QString instanceConfigFolder() const override; virtual std::shared_ptr createUpdateTask() override; - virtual std::shared_ptr createLaunchTask(AuthSessionPtr account) override; virtual std::shared_ptr createJarModdingTask() override; - virtual QString createLaunchScript(AuthSessionPtr session) override; + QStringList verboseDescription(AuthSessionPtr session) override; virtual void cleanupAfterRun() override; @@ -99,11 +98,23 @@ public: return true; } + QStringList getClassPath() const override; + QString getMainClass() const override; + + QStringList getNativeJars() const override; + QString getNativePath() const override; + + QStringList processMinecraftArgs(AuthSessionPtr account) const override; + +protected: + std::shared_ptr createMainLaunchStep(LaunchTask *parent, AuthSessionPtr session) override; + QStringList validLaunchMethods() override; + signals: void versionReloaded(); private: - QStringList processMinecraftArgs(AuthSessionPtr account); + QString mainJarPath() const; protected: std::shared_ptr m_profile; -- cgit v1.2.3