mirror of
https://github.com/PrismLauncher/PrismLauncher.git
synced 2025-05-14 21:37:16 +02:00
Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into filters
This commit is contained in:
commit
a0eba1ace6
2
.github/workflows/backport.yml
vendored
2
.github/workflows/backport.yml
vendored
@ -25,7 +25,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Create backport PRs
|
- name: Create backport PRs
|
||||||
uses: korthout/backport-action@v2.4.1
|
uses: korthout/backport-action@v2.5.0
|
||||||
with:
|
with:
|
||||||
# Config README: https://github.com/korthout/backport-action#backport-action
|
# Config README: https://github.com/korthout/backport-action#backport-action
|
||||||
pull_description: |-
|
pull_description: |-
|
||||||
|
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@ -496,7 +496,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_DIR }}
|
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_DIR }}
|
||||||
for l in $(find ${{ env.INSTALL_DIR }} -type f); do l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_DIR }}/}; l=${l#./}; echo $l; done > ${{ env.INSTALL_DIR }}/manifest.txt
|
for l in $(find ${{ env.INSTALL_DIR }} -type f); do l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_DIR }}/}; l=${l#./}; echo $l; done > ${{ env.INSTALL_DIR }}/manifest.txt
|
||||||
|
|
||||||
cd ${{ env.INSTALL_DIR }}
|
cd ${{ env.INSTALL_DIR }}
|
||||||
tar --owner root --group root -czf ../PrismLauncher.tar.gz *
|
tar --owner root --group root -czf ../PrismLauncher.tar.gz *
|
||||||
|
|
||||||
@ -505,9 +504,12 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }}
|
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }}
|
||||||
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable
|
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable
|
||||||
|
|
||||||
|
# workaround to make portable installs to work on fedora
|
||||||
|
mkdir ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
|
cp /lib/x86_64-linux-gnu/libbz2.so.1.0 ${{ env.INSTALL_PORTABLE_DIR }}/lib
|
||||||
|
|
||||||
for l in $(find ${{ env.INSTALL_PORTABLE_DIR }} -type f); do l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_PORTABLE_DIR }}/}; l=${l#./}; echo $l; done > ${{ env.INSTALL_PORTABLE_DIR }}/manifest.txt
|
for l in $(find ${{ env.INSTALL_PORTABLE_DIR }} -type f); do l=${l#$(pwd)/}; l=${l#${{ env.INSTALL_PORTABLE_DIR }}/}; l=${l#./}; echo $l; done > ${{ env.INSTALL_PORTABLE_DIR }}/manifest.txt
|
||||||
|
|
||||||
|
|
||||||
cd ${{ env.INSTALL_PORTABLE_DIR }}
|
cd ${{ env.INSTALL_PORTABLE_DIR }}
|
||||||
tar -czf ../PrismLauncher-portable.tar.gz *
|
tar -czf ../PrismLauncher-portable.tar.gz *
|
||||||
|
|
||||||
|
24
flake.lock
generated
24
flake.lock
generated
@ -41,11 +41,11 @@
|
|||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1701680307,
|
"lastModified": 1710146030,
|
||||||
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -62,11 +62,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1703887061,
|
"lastModified": 1709087332,
|
||||||
"narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=",
|
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5",
|
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -93,11 +93,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1710534455,
|
"lastModified": 1711715736,
|
||||||
"narHash": "sha256-huQT4Xs0y4EeFKn2BTBVYgEwJSv8SDlm82uWgMnCMmI=",
|
"narHash": "sha256-9slQ609YqT9bT/MNX9+5k5jltL9zgpn36DpFB7TkttM=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "9af9c1c87ed3e3ed271934cb896e0cdd33dae212",
|
"rev": "807c549feabce7eddbf259dbdcec9e0600a0660d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -122,11 +122,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1708018599,
|
"lastModified": 1711760932,
|
||||||
"narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=",
|
"narHash": "sha256-DqUTQ2iAAqSDwMhKBqvi24v0Oc7pD3LCK/0FCG//TdA=",
|
||||||
"owner": "cachix",
|
"owner": "cachix",
|
||||||
"repo": "pre-commit-hooks.nix",
|
"repo": "pre-commit-hooks.nix",
|
||||||
"rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431",
|
"rev": "c11e43aed6f17336c25cd120eac886b96c455731",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -308,7 +308,11 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv)
|
|||||||
adjustedBy = "Persistent data path";
|
adjustedBy = "Persistent data path";
|
||||||
|
|
||||||
#ifndef Q_OS_MACOS
|
#ifndef Q_OS_MACOS
|
||||||
if (QFile::exists(FS::PathCombine(m_rootPath, "portable.txt"))) {
|
if (auto portableUserData = FS::PathCombine(m_rootPath, "UserData"); QDir(portableUserData).exists()) {
|
||||||
|
dataPath = portableUserData;
|
||||||
|
adjustedBy = "Portable user data path";
|
||||||
|
m_portable = true;
|
||||||
|
} else if (QFile::exists(FS::PathCombine(m_rootPath, "portable.txt"))) {
|
||||||
dataPath = m_rootPath;
|
dataPath = m_rootPath;
|
||||||
adjustedBy = "Portable data path";
|
adjustedBy = "Portable data path";
|
||||||
m_portable = true;
|
m_portable = true;
|
||||||
|
@ -665,8 +665,12 @@ QStringList MinecraftInstance::processMinecraftArgs(AuthSessionPtr session, Mine
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (serverToJoin && !serverToJoin->address.isEmpty()) {
|
if (serverToJoin && !serverToJoin->address.isEmpty()) {
|
||||||
args_pattern += " --server " + serverToJoin->address;
|
if (profile->hasTrait("feature:is_quick_play_multiplayer")) {
|
||||||
args_pattern += " --port " + QString::number(serverToJoin->port);
|
args_pattern += " --quickPlayMultiplayer " + serverToJoin->address + ':' + QString::number(serverToJoin->port);
|
||||||
|
} else {
|
||||||
|
args_pattern += " --server " + serverToJoin->address;
|
||||||
|
args_pattern += " --port " + QString::number(serverToJoin->port);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QMap<QString, QString> token_mapping;
|
QMap<QString, QString> token_mapping;
|
||||||
|
@ -126,7 +126,35 @@ bool XboxAuthorizationStep::processSTSError(QNetworkReply::NetworkError error, Q
|
|||||||
emit finished(
|
emit finished(
|
||||||
AccountTaskState::STATE_FAILED_SOFT,
|
AccountTaskState::STATE_FAILED_SOFT,
|
||||||
tr("This Microsoft account is underaged and is not linked to a family.\n\nPlease set up your account according to %1.")
|
tr("This Microsoft account is underaged and is not linked to a family.\n\nPlease set up your account according to %1.")
|
||||||
.arg("<a href=\"https://help.minecraft.net/hc/en-us/articles/4403181904525\">help.minecraft.net</a>"));
|
.arg("<a href=\"https://help.minecraft.net/hc/en-us/articles/4408968616077\">help.minecraft.net</a>"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// the following codes where copied from: https://github.com/PrismarineJS/prismarine-auth/pull/44
|
||||||
|
case 2148916236: {
|
||||||
|
emit finished(AccountTaskState::STATE_FAILED_SOFT,
|
||||||
|
tr("This Microsoft account requires proof of age to play. Please login to %1 to provide proof of age.")
|
||||||
|
.arg("<a href=\"https://login.live.com/login.srf\">login.live.com</a>"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case 2148916237:
|
||||||
|
emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("This Microsoft account has reached its limit for playtime. This "
|
||||||
|
"Microsoft account has been blocked from logging in."));
|
||||||
|
return true;
|
||||||
|
case 2148916227: {
|
||||||
|
emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("This Microsoft account was banned by Xbox for violating one or more "
|
||||||
|
"Community Standards for Xbox and is unable to be used."));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case 2148916229: {
|
||||||
|
emit finished(AccountTaskState::STATE_FAILED_SOFT,
|
||||||
|
tr("This Microsoft account is currently restricted and your guardian has not given you permission to play "
|
||||||
|
"online. Login to %1 and have your guardian change your permissions.")
|
||||||
|
.arg("<a href=\"https://account.microsoft.com/family/\">account.microsoft.com</a>"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case 2148916234: {
|
||||||
|
emit finished(AccountTaskState::STATE_FAILED_SOFT,
|
||||||
|
tr("This Microsoft account has not accepted Xbox's Terms of Service. Please login and accept them."));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
|
@ -66,9 +66,11 @@ GetModDependenciesTask::GetModDependenciesTask(QObject* parent,
|
|||||||
, m_version(mcVersion(instance))
|
, m_version(mcVersion(instance))
|
||||||
, m_loaderType(mcLoaders(instance))
|
, m_loaderType(mcLoaders(instance))
|
||||||
{
|
{
|
||||||
for (auto mod : folder->allMods())
|
for (auto mod : folder->allMods()) {
|
||||||
|
m_mods_file_names << mod->fileinfo().fileName();
|
||||||
if (auto meta = mod->metadata(); meta)
|
if (auto meta = mod->metadata(); meta)
|
||||||
m_mods.append(meta);
|
m_mods.append(meta);
|
||||||
|
}
|
||||||
prepare();
|
prepare();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,8 +243,13 @@ Task::Ptr GetModDependenciesTask::prepareDependencyTask(const ModPlatform::Depen
|
|||||||
if (dep_.addonId != pDep->version.addonId) {
|
if (dep_.addonId != pDep->version.addonId) {
|
||||||
removePack(pDep->version.addonId);
|
removePack(pDep->version.addonId);
|
||||||
addTask(prepareDependencyTask(dep_, provider.name, level));
|
addTask(prepareDependencyTask(dep_, provider.name, level));
|
||||||
} else
|
} else {
|
||||||
addTask(getProjectInfoTask(pDep));
|
addTask(getProjectInfoTask(pDep));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isLocalyInstalled(pDep)) {
|
||||||
|
removePack(pDep->version.addonId);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
for (auto dep_ : getDependenciesForVersion(pDep->version, provider.name)) {
|
for (auto dep_ : getDependenciesForVersion(pDep->version, provider.name)) {
|
||||||
addTask(prepareDependencyTask(dep_, provider.name, level - 1));
|
addTask(prepareDependencyTask(dep_, provider.name, level - 1));
|
||||||
@ -268,9 +275,9 @@ void GetModDependenciesTask::removePack(const QVariant& addonId)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<QString, QStringList> GetModDependenciesTask::getRequiredBy()
|
auto GetModDependenciesTask::getExtraInfo() -> QHash<QString, PackDependencyExtraInfo>
|
||||||
{
|
{
|
||||||
QHash<QString, QStringList> rby;
|
QHash<QString, PackDependencyExtraInfo> rby;
|
||||||
auto fullList = m_selected + m_pack_dependencies;
|
auto fullList = m_selected + m_pack_dependencies;
|
||||||
for (auto& mod : fullList) {
|
for (auto& mod : fullList) {
|
||||||
auto addonId = mod->pack->addonId;
|
auto addonId = mod->pack->addonId;
|
||||||
@ -292,7 +299,61 @@ QHash<QString, QStringList> GetModDependenciesTask::getRequiredBy()
|
|||||||
req.append(smod->pack->name);
|
req.append(smod->pack->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rby[addonId.toString()] = req;
|
rby[addonId.toString()] = { maybeInstalled(mod), req };
|
||||||
}
|
}
|
||||||
return rby;
|
return rby;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// super lax compare (but not fuzzy)
|
||||||
|
// convert to lowercase
|
||||||
|
// convert all speratores to whitespace
|
||||||
|
// simplify sequence of internal whitespace to a single space
|
||||||
|
// efectivly compare two strings ignoring all separators and case
|
||||||
|
auto laxCompare = [](QString fsfilename, QString metadataFilename, bool excludeDigits = false) {
|
||||||
|
// allowed character seperators
|
||||||
|
QList<QChar> allowedSeperators = { '-', '+', '.', '_' };
|
||||||
|
if (excludeDigits)
|
||||||
|
allowedSeperators.append({ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });
|
||||||
|
|
||||||
|
// copy in lowercase
|
||||||
|
auto fsName = fsfilename.toLower();
|
||||||
|
auto metaName = metadataFilename.toLower();
|
||||||
|
|
||||||
|
// replace all potential allowed seperatores with whitespace
|
||||||
|
for (auto sep : allowedSeperators) {
|
||||||
|
fsName = fsName.replace(sep, ' ');
|
||||||
|
metaName = metaName.replace(sep, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove extraneous whitespace
|
||||||
|
fsName = fsName.simplified();
|
||||||
|
metaName = metaName.simplified();
|
||||||
|
|
||||||
|
return fsName.compare(metaName) == 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool GetModDependenciesTask::isLocalyInstalled(std::shared_ptr<PackDependency> pDep)
|
||||||
|
{
|
||||||
|
return pDep->version.fileName.isEmpty() ||
|
||||||
|
|
||||||
|
std::find_if(m_selected.begin(), m_selected.end(),
|
||||||
|
[pDep](std::shared_ptr<PackDependency> i) {
|
||||||
|
return !i->version.fileName.isEmpty() && laxCompare(i->version.fileName, pDep->version.fileName);
|
||||||
|
}) != m_selected.end() || // check the selected versions
|
||||||
|
|
||||||
|
std::find_if(m_mods_file_names.begin(), m_mods_file_names.end(),
|
||||||
|
[pDep](QString i) { return !i.isEmpty() && laxCompare(i, pDep->version.fileName); }) !=
|
||||||
|
m_mods_file_names.end() || // check the existing mods
|
||||||
|
|
||||||
|
std::find_if(m_pack_dependencies.begin(), m_pack_dependencies.end(), [pDep](std::shared_ptr<PackDependency> i) {
|
||||||
|
return pDep->pack->addonId != i->pack->addonId && !i->version.fileName.isEmpty() &&
|
||||||
|
laxCompare(pDep->version.fileName, i->version.fileName);
|
||||||
|
}) != m_pack_dependencies.end(); // check loaded dependencies
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetModDependenciesTask::maybeInstalled(std::shared_ptr<PackDependency> pDep)
|
||||||
|
{
|
||||||
|
return std::find_if(m_mods_file_names.begin(), m_mods_file_names.end(), [pDep](QString i) {
|
||||||
|
return !i.isEmpty() && laxCompare(i, pDep->version.fileName, true);
|
||||||
|
}) != m_mods_file_names.end(); // check the existing mods
|
||||||
|
}
|
||||||
|
@ -50,6 +50,11 @@ class GetModDependenciesTask : public SequentialTask {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PackDependencyExtraInfo {
|
||||||
|
bool maybe_installed;
|
||||||
|
QStringList required_by;
|
||||||
|
};
|
||||||
|
|
||||||
struct Provider {
|
struct Provider {
|
||||||
ModPlatform::ResourceProvider name;
|
ModPlatform::ResourceProvider name;
|
||||||
std::shared_ptr<ResourceDownload::ModModel> mod;
|
std::shared_ptr<ResourceDownload::ModModel> mod;
|
||||||
@ -62,7 +67,7 @@ class GetModDependenciesTask : public SequentialTask {
|
|||||||
QList<std::shared_ptr<PackDependency>> selected);
|
QList<std::shared_ptr<PackDependency>> selected);
|
||||||
|
|
||||||
auto getDependecies() const -> QList<std::shared_ptr<PackDependency>> { return m_pack_dependencies; }
|
auto getDependecies() const -> QList<std::shared_ptr<PackDependency>> { return m_pack_dependencies; }
|
||||||
QHash<QString, QStringList> getRequiredBy();
|
QHash<QString, PackDependencyExtraInfo> getExtraInfo();
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
Task::Ptr prepareDependencyTask(const ModPlatform::Dependency&, ModPlatform::ResourceProvider, int);
|
Task::Ptr prepareDependencyTask(const ModPlatform::Dependency&, ModPlatform::ResourceProvider, int);
|
||||||
@ -73,10 +78,14 @@ class GetModDependenciesTask : public SequentialTask {
|
|||||||
ModPlatform::Dependency getOverride(const ModPlatform::Dependency&, ModPlatform::ResourceProvider providerName);
|
ModPlatform::Dependency getOverride(const ModPlatform::Dependency&, ModPlatform::ResourceProvider providerName);
|
||||||
void removePack(const QVariant& addonId);
|
void removePack(const QVariant& addonId);
|
||||||
|
|
||||||
|
bool isLocalyInstalled(std::shared_ptr<PackDependency> pDep);
|
||||||
|
bool maybeInstalled(std::shared_ptr<PackDependency> pDep);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QList<std::shared_ptr<PackDependency>> m_pack_dependencies;
|
QList<std::shared_ptr<PackDependency>> m_pack_dependencies;
|
||||||
QList<std::shared_ptr<Metadata::ModStruct>> m_mods;
|
QList<std::shared_ptr<Metadata::ModStruct>> m_mods;
|
||||||
QList<std::shared_ptr<PackDependency>> m_selected;
|
QList<std::shared_ptr<PackDependency>> m_selected;
|
||||||
|
QStringList m_mods_file_names;
|
||||||
Provider m_flame_provider;
|
Provider m_flame_provider;
|
||||||
Provider m_modrinth_provider;
|
Provider m_modrinth_provider;
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ class CheckUpdateTask : public Task {
|
|||||||
QString changelog;
|
QString changelog;
|
||||||
ModPlatform::ResourceProvider provider;
|
ModPlatform::ResourceProvider provider;
|
||||||
shared_qobject_ptr<ResourceDownloadTask> download;
|
shared_qobject_ptr<ResourceDownloadTask> download;
|
||||||
|
bool enabled = true;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UpdatableMod(QString name,
|
UpdatableMod(QString name,
|
||||||
@ -37,7 +38,8 @@ class CheckUpdateTask : public Task {
|
|||||||
std::optional<ModPlatform::IndexedVersionType> new_v_type,
|
std::optional<ModPlatform::IndexedVersionType> new_v_type,
|
||||||
QString changelog,
|
QString changelog,
|
||||||
ModPlatform::ResourceProvider p,
|
ModPlatform::ResourceProvider p,
|
||||||
shared_qobject_ptr<ResourceDownloadTask> t)
|
shared_qobject_ptr<ResourceDownloadTask> t,
|
||||||
|
bool enabled = true)
|
||||||
: name(name)
|
: name(name)
|
||||||
, old_hash(old_h)
|
, old_hash(old_h)
|
||||||
, old_version(old_v)
|
, old_version(old_v)
|
||||||
@ -46,6 +48,7 @@ class CheckUpdateTask : public Task {
|
|||||||
, changelog(changelog)
|
, changelog(changelog)
|
||||||
, provider(p)
|
, provider(p)
|
||||||
, download(t)
|
, download(t)
|
||||||
|
, enabled(enabled)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -393,16 +393,16 @@ QByteArray FlamePackExportTask::generateIndex()
|
|||||||
version["version"] = minecraft->m_version;
|
version["version"] = minecraft->m_version;
|
||||||
QString id;
|
QString id;
|
||||||
if (quilt != nullptr)
|
if (quilt != nullptr)
|
||||||
id = "quilt-" + quilt->getVersion();
|
id = "quilt-" + quilt->m_version;
|
||||||
else if (fabric != nullptr)
|
else if (fabric != nullptr)
|
||||||
id = "fabric-" + fabric->getVersion();
|
id = "fabric-" + fabric->m_version;
|
||||||
else if (forge != nullptr)
|
else if (forge != nullptr)
|
||||||
id = "forge-" + forge->getVersion();
|
id = "forge-" + forge->m_version;
|
||||||
else if (neoforge != nullptr) {
|
else if (neoforge != nullptr) {
|
||||||
id = "neoforge-";
|
id = "neoforge-";
|
||||||
if (minecraft->m_version == "1.20.1")
|
if (minecraft->m_version == "1.20.1")
|
||||||
id += "1.20.1-";
|
id += "1.20.1-";
|
||||||
id += neoforge->getVersion();
|
id += neoforge->m_version;
|
||||||
}
|
}
|
||||||
version["modLoaders"] = QJsonArray();
|
version["modLoaders"] = QJsonArray();
|
||||||
if (!id.isEmpty()) {
|
if (!id.isEmpty()) {
|
||||||
|
@ -43,6 +43,7 @@ Modpack parseDirectory(QString path)
|
|||||||
modpack.version = Json::requireString(root, "version", "version");
|
modpack.version = Json::requireString(root, "version", "version");
|
||||||
modpack.mcVersion = Json::requireString(root, "mcVersion", "mcVersion");
|
modpack.mcVersion = Json::requireString(root, "mcVersion", "mcVersion");
|
||||||
modpack.jvmArgs = Json::ensureVariant(root, "jvmArgs", {}, "jvmArgs");
|
modpack.jvmArgs = Json::ensureVariant(root, "jvmArgs", {}, "jvmArgs");
|
||||||
|
modpack.totalPlayTime = Json::requireInteger(root, "totalPlayTime", "totalPlayTime");
|
||||||
} catch (const Exception& e) {
|
} catch (const Exception& e) {
|
||||||
qDebug() << "Couldn't load ftb instance json: " << e.cause();
|
qDebug() << "Couldn't load ftb instance json: " << e.cause();
|
||||||
return {};
|
return {};
|
||||||
|
@ -36,6 +36,7 @@ struct Modpack {
|
|||||||
QString name;
|
QString name;
|
||||||
QString version;
|
QString version;
|
||||||
QString mcVersion;
|
QString mcVersion;
|
||||||
|
int totalPlayTime;
|
||||||
// not needed for instance creation
|
// not needed for instance creation
|
||||||
QVariant jvmArgs;
|
QVariant jvmArgs;
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ void PackInstallTask::copySettings()
|
|||||||
instanceSettings->suspendSave();
|
instanceSettings->suspendSave();
|
||||||
MinecraftInstance instance(m_globalSettings, instanceSettings, m_stagingPath);
|
MinecraftInstance instance(m_globalSettings, instanceSettings, m_stagingPath);
|
||||||
instance.settings()->set("InstanceType", "OneSix");
|
instance.settings()->set("InstanceType", "OneSix");
|
||||||
|
instance.settings()->set("totalTimePlayed", m_pack.totalPlayTime / 1000);
|
||||||
|
|
||||||
if (m_pack.jvmArgs.isValid() && !m_pack.jvmArgs.toString().isEmpty()) {
|
if (m_pack.jvmArgs.isValid() && !m_pack.jvmArgs.toString().isEmpty()) {
|
||||||
instance.settings()->set("OverrideJavaArgs", true);
|
instance.settings()->set("OverrideJavaArgs", true);
|
||||||
|
@ -214,19 +214,25 @@ void ModUpdateDialog::checkCandidates()
|
|||||||
}
|
}
|
||||||
static FlameAPI api;
|
static FlameAPI api;
|
||||||
|
|
||||||
auto getRequiredBy = depTask->getRequiredBy();
|
auto dependencyExtraInfo = depTask->getExtraInfo();
|
||||||
|
|
||||||
for (auto dep : depTask->getDependecies()) {
|
for (auto dep : depTask->getDependecies()) {
|
||||||
auto changelog = dep->version.changelog;
|
auto changelog = dep->version.changelog;
|
||||||
if (dep->pack->provider == ModPlatform::ResourceProvider::FLAME)
|
if (dep->pack->provider == ModPlatform::ResourceProvider::FLAME)
|
||||||
changelog = api.getModFileChangelog(dep->version.addonId.toInt(), dep->version.fileId.toInt());
|
changelog = api.getModFileChangelog(dep->version.addonId.toInt(), dep->version.fileId.toInt());
|
||||||
auto download_task = makeShared<ResourceDownloadTask>(dep->pack, dep->version, m_mod_model);
|
auto download_task = makeShared<ResourceDownloadTask>(dep->pack, dep->version, m_mod_model);
|
||||||
CheckUpdateTask::UpdatableMod updatable = {
|
auto extraInfo = dependencyExtraInfo.value(dep->version.addonId.toString());
|
||||||
dep->pack->name, dep->version.hash, "", dep->version.version, dep->version.version_type,
|
CheckUpdateTask::UpdatableMod updatable = { dep->pack->name,
|
||||||
changelog, dep->pack->provider, download_task
|
dep->version.hash,
|
||||||
};
|
"",
|
||||||
|
dep->version.version,
|
||||||
|
dep->version.version_type,
|
||||||
|
changelog,
|
||||||
|
dep->pack->provider,
|
||||||
|
download_task,
|
||||||
|
!extraInfo.maybe_installed };
|
||||||
|
|
||||||
appendMod(updatable, getRequiredBy.value(dep->version.addonId.toString()));
|
appendMod(updatable, extraInfo.required_by);
|
||||||
m_tasks.insert(updatable.name, updatable.download);
|
m_tasks.insert(updatable.name, updatable.download);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -412,7 +418,10 @@ void ModUpdateDialog::onMetadataFailed(Mod* mod, bool try_others, ModPlatform::R
|
|||||||
void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info, QStringList requiredBy)
|
void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info, QStringList requiredBy)
|
||||||
{
|
{
|
||||||
auto item_top = new QTreeWidgetItem(ui->modTreeWidget);
|
auto item_top = new QTreeWidgetItem(ui->modTreeWidget);
|
||||||
item_top->setCheckState(0, Qt::CheckState::Checked);
|
item_top->setCheckState(0, info.enabled ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
|
||||||
|
if (!info.enabled) {
|
||||||
|
item_top->setToolTip(0, tr("Mod was disabled as it may be already instaled."));
|
||||||
|
}
|
||||||
item_top->setText(0, info.name);
|
item_top->setText(0, info.name);
|
||||||
item_top->setExpanded(true);
|
item_top->setExpanded(true);
|
||||||
|
|
||||||
|
@ -97,6 +97,9 @@ NewInstanceDialog::NewInstanceDialog(const QString& initialGroup,
|
|||||||
ui->verticalLayout->insertWidget(2, m_container);
|
ui->verticalLayout->insertWidget(2, m_container);
|
||||||
|
|
||||||
m_container->addButtons(m_buttons);
|
m_container->addButtons(m_buttons);
|
||||||
|
connect(m_container, &PageContainer::selectedPageChanged, this, [this](BasePage* previous, BasePage* selected) {
|
||||||
|
m_buttons->button(QDialogButtonBox::Ok)->setEnabled(creationTask && !instName().isEmpty());
|
||||||
|
});
|
||||||
|
|
||||||
// Bonk Qt over its stupid head and make sure it understands which button is the default one...
|
// Bonk Qt over its stupid head and make sure it understands which button is the default one...
|
||||||
// See: https://stackoverflow.com/questions/24556831/qbuttonbox-set-default-button
|
// See: https://stackoverflow.com/questions/24556831/qbuttonbox-set-default-button
|
||||||
|
@ -133,7 +133,7 @@ void ResourceDownloadDialog::confirm()
|
|||||||
auto confirm_dialog = ReviewMessageBox::create(this, tr("Confirm %1 to download").arg(resourcesString()));
|
auto confirm_dialog = ReviewMessageBox::create(this, tr("Confirm %1 to download").arg(resourcesString()));
|
||||||
confirm_dialog->retranslateUi(resourcesString());
|
confirm_dialog->retranslateUi(resourcesString());
|
||||||
|
|
||||||
QHash<QString, QStringList> getRequiredBy;
|
QHash<QString, GetModDependenciesTask::PackDependencyExtraInfo> dependencyExtraInfo;
|
||||||
if (auto task = getModDependenciesTask(); task) {
|
if (auto task = getModDependenciesTask(); task) {
|
||||||
connect(task.get(), &Task::failed, this,
|
connect(task.get(), &Task::failed, this,
|
||||||
[&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); });
|
[&](QString reason) { CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->exec(); });
|
||||||
@ -158,7 +158,7 @@ void ResourceDownloadDialog::confirm()
|
|||||||
} else {
|
} else {
|
||||||
for (auto dep : task->getDependecies())
|
for (auto dep : task->getDependecies())
|
||||||
addResource(dep->pack, dep->version);
|
addResource(dep->pack, dep->version);
|
||||||
getRequiredBy = task->getRequiredBy();
|
dependencyExtraInfo = task->getExtraInfo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,9 +167,10 @@ void ResourceDownloadDialog::confirm()
|
|||||||
return QString::compare(a->getName(), b->getName(), Qt::CaseInsensitive) < 0;
|
return QString::compare(a->getName(), b->getName(), Qt::CaseInsensitive) < 0;
|
||||||
});
|
});
|
||||||
for (auto& task : selected) {
|
for (auto& task : selected) {
|
||||||
|
auto extraInfo = dependencyExtraInfo.value(task->getPack()->addonId.toString());
|
||||||
confirm_dialog->appendResource({ task->getName(), task->getFilename(), task->getCustomPath(),
|
confirm_dialog->appendResource({ task->getName(), task->getFilename(), task->getCustomPath(),
|
||||||
ProviderCaps.name(task->getProvider()), getRequiredBy.value(task->getPack()->addonId.toString()),
|
ProviderCaps.name(task->getProvider()), extraInfo.required_by,
|
||||||
task->getVersion().version_type.toString() });
|
task->getVersion().version_type.toString(), !extraInfo.maybe_installed });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (confirm_dialog->exec()) {
|
if (confirm_dialog->exec()) {
|
||||||
|
@ -35,8 +35,11 @@ auto ReviewMessageBox::create(QWidget* parent, QString&& title, QString&& icon)
|
|||||||
void ReviewMessageBox::appendResource(ResourceInformation&& info)
|
void ReviewMessageBox::appendResource(ResourceInformation&& info)
|
||||||
{
|
{
|
||||||
auto itemTop = new QTreeWidgetItem(ui->modTreeWidget);
|
auto itemTop = new QTreeWidgetItem(ui->modTreeWidget);
|
||||||
itemTop->setCheckState(0, Qt::CheckState::Checked);
|
itemTop->setCheckState(0, info.enabled ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
|
||||||
itemTop->setText(0, info.name);
|
itemTop->setText(0, info.name);
|
||||||
|
if (!info.enabled) {
|
||||||
|
itemTop->setToolTip(0, tr("Mod was disabled as it may be already instaled."));
|
||||||
|
}
|
||||||
|
|
||||||
auto filenameItem = new QTreeWidgetItem(itemTop);
|
auto filenameItem = new QTreeWidgetItem(itemTop);
|
||||||
filenameItem->setText(0, tr("Filename: %1").arg(info.filename));
|
filenameItem->setText(0, tr("Filename: %1").arg(info.filename));
|
||||||
|
@ -20,6 +20,7 @@ class ReviewMessageBox : public QDialog {
|
|||||||
QString provider;
|
QString provider;
|
||||||
QStringList required_by;
|
QStringList required_by;
|
||||||
QString version_type;
|
QString version_type;
|
||||||
|
bool enabled = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
void appendResource(ResourceInformation&& info);
|
void appendResource(ResourceInformation&& info);
|
||||||
|
@ -465,7 +465,7 @@ void InstanceView::paintEvent([[maybe_unused]] QPaintEvent* event)
|
|||||||
widWidth = m_catPixmap.width();
|
widWidth = m_catPixmap.width();
|
||||||
if (m_catPixmap.height() < widHeight)
|
if (m_catPixmap.height() < widHeight)
|
||||||
widHeight = m_catPixmap.height();
|
widHeight = m_catPixmap.height();
|
||||||
auto pixmap = m_catPixmap.scaled(widWidth, widHeight, Qt::KeepAspectRatio);
|
auto pixmap = m_catPixmap.scaled(widWidth, widHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
QRect rectOfPixmap = pixmap.rect();
|
QRect rectOfPixmap = pixmap.rect();
|
||||||
rectOfPixmap.moveBottomRight(this->viewport()->rect().bottomRight());
|
rectOfPixmap.moveBottomRight(this->viewport()->rect().bottomRight());
|
||||||
painter.drawPixmap(rectOfPixmap.topLeft(), pixmap);
|
painter.drawPixmap(rectOfPixmap.topLeft(), pixmap);
|
||||||
|
@ -93,6 +93,7 @@ void ModPage::triggerSearch()
|
|||||||
{
|
{
|
||||||
auto changed = m_filter_widget->changed();
|
auto changed = m_filter_widget->changed();
|
||||||
m_filter = m_filter_widget->getFilter();
|
m_filter = m_filter_widget->getFilter();
|
||||||
|
m_ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect);
|
||||||
m_ui->packView->clearSelection();
|
m_ui->packView->clearSelection();
|
||||||
m_ui->packDescription->clear();
|
m_ui->packDescription->clear();
|
||||||
m_ui->versionSelectionBox->clear();
|
m_ui->versionSelectionBox->clear();
|
||||||
|
@ -23,6 +23,7 @@ ResourcePackResourcePage::ResourcePackResourcePage(ResourceDownloadDialog* dialo
|
|||||||
|
|
||||||
void ResourcePackResourcePage::triggerSearch()
|
void ResourcePackResourcePage::triggerSearch()
|
||||||
{
|
{
|
||||||
|
m_ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect);
|
||||||
m_ui->packView->clearSelection();
|
m_ui->packView->clearSelection();
|
||||||
m_ui->packDescription->clear();
|
m_ui->packDescription->clear();
|
||||||
m_ui->versionSelectionBox->clear();
|
m_ui->versionSelectionBox->clear();
|
||||||
|
@ -24,6 +24,7 @@ ShaderPackResourcePage::ShaderPackResourcePage(ShaderPackDownloadDialog* dialog,
|
|||||||
|
|
||||||
void ShaderPackResourcePage::triggerSearch()
|
void ShaderPackResourcePage::triggerSearch()
|
||||||
{
|
{
|
||||||
|
m_ui->packView->selectionModel()->setCurrentIndex({}, QItemSelectionModel::SelectionFlag::ClearAndSelect);
|
||||||
m_ui->packView->clearSelection();
|
m_ui->packView->clearSelection();
|
||||||
m_ui->packDescription->clear();
|
m_ui->packDescription->clear();
|
||||||
m_ui->versionSelectionBox->clear();
|
m_ui->versionSelectionBox->clear();
|
||||||
|
@ -104,6 +104,7 @@ void ModrinthPage::retranslate()
|
|||||||
void ModrinthPage::openedImpl()
|
void ModrinthPage::openedImpl()
|
||||||
{
|
{
|
||||||
BasePage::openedImpl();
|
BasePage::openedImpl();
|
||||||
|
suggestCurrent();
|
||||||
triggerSearch();
|
triggerSearch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,10 @@
|
|||||||
#include "ui/themes/CatPack.h"
|
#include "ui/themes/CatPack.h"
|
||||||
#include <QDate>
|
#include <QDate>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QDirIterator>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
#include <QImageReader>
|
||||||
|
#include <QRandomGenerator>
|
||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
|
|
||||||
@ -79,7 +82,7 @@ JsonCatPack::JsonCatPack(QFileInfo& manifestInfo) : BasicCatPack(manifestInfo.di
|
|||||||
auto doc = Json::requireDocument(manifestInfo.absoluteFilePath(), "CatPack JSON file");
|
auto doc = Json::requireDocument(manifestInfo.absoluteFilePath(), "CatPack JSON file");
|
||||||
const auto root = doc.object();
|
const auto root = doc.object();
|
||||||
m_name = Json::requireString(root, "name", "Catpack name");
|
m_name = Json::requireString(root, "name", "Catpack name");
|
||||||
m_defaultPath = FS::PathCombine(path, Json::requireString(root, "default", "Default Cat"));
|
m_default_path = FS::PathCombine(path, Json::requireString(root, "default", "Default Cat"));
|
||||||
auto variants = Json::ensureArray(root, "variants", QJsonArray(), "Catpack Variants");
|
auto variants = Json::ensureArray(root, "variants", QJsonArray(), "Catpack Variants");
|
||||||
for (auto v : variants) {
|
for (auto v : variants) {
|
||||||
auto variant = Json::ensureObject(v, QJsonObject(), "Cat variant");
|
auto variant = Json::ensureObject(v, QJsonObject(), "Cat variant");
|
||||||
@ -117,5 +120,21 @@ QString JsonCatPack::path(QDate now)
|
|||||||
if (startDate <= now && now <= endDate)
|
if (startDate <= now && now <= endDate)
|
||||||
return var.path;
|
return var.path;
|
||||||
}
|
}
|
||||||
return m_defaultPath;
|
auto dInfo = QFileInfo(m_default_path);
|
||||||
|
if (!dInfo.isDir())
|
||||||
|
return m_default_path;
|
||||||
|
|
||||||
|
QStringList supportedImageFormats;
|
||||||
|
for (auto format : QImageReader::supportedImageFormats()) {
|
||||||
|
supportedImageFormats.append("*." + format);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto files = QDir(m_default_path).entryInfoList(supportedImageFormats, QDir::Files, QDir::Name);
|
||||||
|
if (files.length() == 0)
|
||||||
|
return "";
|
||||||
|
auto idx = (now.dayOfYear() - 1) % files.length();
|
||||||
|
auto isRandom = dInfo.fileName().compare("random", Qt::CaseInsensitive) == 0;
|
||||||
|
if (isRandom)
|
||||||
|
idx = QRandomGenerator::global()->bounded(0, files.length());
|
||||||
|
return files[idx].absoluteFilePath();
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,6 @@ class JsonCatPack : public BasicCatPack {
|
|||||||
QString path(QDate now);
|
QString path(QDate now);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_defaultPath;
|
QString m_default_path;
|
||||||
QList<Variant> m_variants;
|
QList<Variant> m_variants;
|
||||||
};
|
};
|
||||||
|
@ -178,8 +178,8 @@ QList<ITheme*> ThemeManager::getValidApplicationThemes()
|
|||||||
QList<CatPack*> ThemeManager::getValidCatPacks()
|
QList<CatPack*> ThemeManager::getValidCatPacks()
|
||||||
{
|
{
|
||||||
QList<CatPack*> ret;
|
QList<CatPack*> ret;
|
||||||
ret.reserve(m_catPacks.size());
|
ret.reserve(m_cat_packs.size());
|
||||||
for (auto&& [id, theme] : m_catPacks) {
|
for (auto&& [id, theme] : m_cat_packs) {
|
||||||
ret.append(theme.get());
|
ret.append(theme.get());
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -244,8 +244,8 @@ void ThemeManager::applyCurrentlySelectedTheme(bool initial)
|
|||||||
|
|
||||||
QString ThemeManager::getCatPack(QString catName)
|
QString ThemeManager::getCatPack(QString catName)
|
||||||
{
|
{
|
||||||
auto catIter = m_catPacks.find(!catName.isEmpty() ? catName : APPLICATION->settings()->get("BackgroundCat").toString());
|
auto catIter = m_cat_packs.find(!catName.isEmpty() ? catName : APPLICATION->settings()->get("BackgroundCat").toString());
|
||||||
if (catIter != m_catPacks.end()) {
|
if (catIter != m_cat_packs.end()) {
|
||||||
auto& catPack = catIter->second;
|
auto& catPack = catIter->second;
|
||||||
themeDebugLog() << "applying catpack" << catPack->id();
|
themeDebugLog() << "applying catpack" << catPack->id();
|
||||||
return catPack->path();
|
return catPack->path();
|
||||||
@ -253,14 +253,14 @@ QString ThemeManager::getCatPack(QString catName)
|
|||||||
themeWarningLog() << "Tried to get invalid catPack:" << catName;
|
themeWarningLog() << "Tried to get invalid catPack:" << catName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_catPacks.begin()->second->path();
|
return m_cat_packs.begin()->second->path();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ThemeManager::addCatPack(std::unique_ptr<CatPack> catPack)
|
QString ThemeManager::addCatPack(std::unique_ptr<CatPack> catPack)
|
||||||
{
|
{
|
||||||
QString id = catPack->id();
|
QString id = catPack->id();
|
||||||
if (m_catPacks.find(id) == m_catPacks.end())
|
if (m_cat_packs.find(id) == m_cat_packs.end())
|
||||||
m_catPacks.emplace(id, std::move(catPack));
|
m_cat_packs.emplace(id, std::move(catPack));
|
||||||
else
|
else
|
||||||
themeWarningLog() << "CatPack(" << id << ") not added to prevent id duplication";
|
themeWarningLog() << "CatPack(" << id << ") not added to prevent id duplication";
|
||||||
return id;
|
return id;
|
||||||
|
@ -61,7 +61,7 @@ class ThemeManager {
|
|||||||
QDir m_iconThemeFolder{ "iconthemes" };
|
QDir m_iconThemeFolder{ "iconthemes" };
|
||||||
QDir m_applicationThemeFolder{ "themes" };
|
QDir m_applicationThemeFolder{ "themes" };
|
||||||
QDir m_catPacksFolder{ "catpacks" };
|
QDir m_catPacksFolder{ "catpacks" };
|
||||||
std::map<QString, std::unique_ptr<CatPack>> m_catPacks;
|
std::map<QString, std::unique_ptr<CatPack>> m_cat_packs;
|
||||||
|
|
||||||
void initializeThemes();
|
void initializeThemes();
|
||||||
void initializeCatPacks();
|
void initializeCatPacks();
|
||||||
|
@ -58,10 +58,17 @@ import org.prismlauncher.utils.Parameters;
|
|||||||
import org.prismlauncher.utils.ReflectionUtils;
|
import org.prismlauncher.utils.ReflectionUtils;
|
||||||
|
|
||||||
import java.lang.invoke.MethodHandle;
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public final class StandardLauncher extends AbstractLauncher {
|
public final class StandardLauncher extends AbstractLauncher {
|
||||||
|
private final boolean quickPlaySupported;
|
||||||
|
|
||||||
public StandardLauncher(Parameters params) {
|
public StandardLauncher(Parameters params) {
|
||||||
super(params);
|
super(params);
|
||||||
|
|
||||||
|
List<String> traits = params.getList("traits", Collections.<String>emptyList());
|
||||||
|
quickPlaySupported = traits.contains("feature:is_quick_play_multiplayer");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -76,10 +83,16 @@ public final class StandardLauncher extends AbstractLauncher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (serverAddress != null) {
|
if (serverAddress != null) {
|
||||||
gameArgs.add("--server");
|
if (quickPlaySupported) {
|
||||||
gameArgs.add(serverAddress);
|
// as of 23w14a
|
||||||
gameArgs.add("--port");
|
gameArgs.add("--quickPlayMultiplayer");
|
||||||
gameArgs.add(serverPort);
|
gameArgs.add(serverAddress + ':' + serverPort);
|
||||||
|
} else {
|
||||||
|
gameArgs.add("--server");
|
||||||
|
gameArgs.add(serverAddress);
|
||||||
|
gameArgs.add("--port");
|
||||||
|
gameArgs.add(serverPort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// find and invoke the main method
|
// find and invoke the main method
|
||||||
|
Loading…
x
Reference in New Issue
Block a user