aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.envrc1
-rw-r--r--.github/workflows/build.yml27
-rw-r--r--.gitignore6
-rw-r--r--BUILD.md52
-rw-r--r--CMakeLists.txt5
-rw-r--r--flake.lock110
-rw-r--r--flake.nix100
-rw-r--r--flatpak/org.prismlauncher.PrismLauncher.yml1
-rw-r--r--launcher/Application.cpp16
-rw-r--r--launcher/Application.h2
-rw-r--r--launcher/CMakeLists.txt1
-rw-r--r--launcher/InstancePageProvider.h3
-rw-r--r--launcher/MMCZip.cpp2
-rw-r--r--launcher/minecraft/MinecraftInstance.cpp17
-rw-r--r--launcher/minecraft/MinecraftInstance.h3
-rw-r--r--launcher/minecraft/launch/ScanModFolders.cpp14
-rw-r--r--launcher/minecraft/launch/ScanModFolders.h2
-rw-r--r--launcher/minecraft/mod/ModFolderModel.cpp2
-rw-r--r--launcher/minecraft/mod/ModFolderModel.h2
-rw-r--r--launcher/minecraft/mod/Resource.cpp3
-rw-r--r--launcher/minecraft/mod/ResourceFolderModel.cpp6
-rw-r--r--launcher/minecraft/mod/ResourceFolderModel.h2
-rw-r--r--launcher/minecraft/mod/tasks/LocalModParseTask.cpp53
-rw-r--r--launcher/modplatform/helpers/HashUtils.cpp2
-rw-r--r--launcher/net/Download.cpp14
-rw-r--r--launcher/net/Upload.cpp13
-rw-r--r--launcher/ui/dialogs/BlockedModsDialog.cpp2
-rw-r--r--launcher/ui/pages/global/APIPage.cpp7
-rw-r--r--launcher/ui/pages/global/APIPage.ui51
-rw-r--r--launcher/ui/pages/global/LauncherPage.cpp18
-rw-r--r--launcher/ui/pages/global/LauncherPage.h1
-rw-r--r--launcher/ui/pages/global/LauncherPage.ui66
-rw-r--r--launcher/ui/pages/instance/ModFolderPage.cpp9
-rw-r--r--launcher/ui/pages/instance/ModFolderPage.h13
-rw-r--r--libraries/README.md8
m---------libraries/filesystem0
-rw-r--r--libraries/katabasis/acknowledgements.md12
-rw-r--r--libraries/qdcss/CMakeLists.txt18
-rw-r--r--libraries/qdcss/LICENSE72
-rw-r--r--libraries/qdcss/include/qdcss.h25
-rw-r--r--libraries/qdcss/src/qdcss.cpp53
m---------libraries/tomlplusplus0
-rw-r--r--nix/default.nix129
-rw-r--r--nix/flake-compat.nix2
-rw-r--r--program_info/win_install.nsi.in99
-rw-r--r--snap/snapcraft.yaml55
46 files changed, 775 insertions, 324 deletions
diff --git a/.envrc b/.envrc
new file mode 100644
index 00000000..3550a30f
--- /dev/null
+++ b/.envrc
@@ -0,0 +1 @@
+use flake
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 41eb5eb7..9337f3c7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -158,7 +158,7 @@ jobs:
- name: Retrieve ccache cache (Windows MinGW-w64)
if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug'
- uses: actions/cache@v3.2.6
+ uses: actions/cache@v3.3.1
with:
path: '${{ github.workspace }}\.ccache'
key: ${{ matrix.os }}-mingw-w64-ccache-${{ github.run_id }}
@@ -550,31 +550,6 @@ jobs:
run: |
ccache -s
- snap:
- runs-on: ubuntu-20.04
- steps:
- - name: Checkout
- if: inputs.build_type == 'Debug'
- uses: actions/checkout@v3
- with:
- submodules: 'true'
- - name: Set short version
- shell: bash
- if: inputs.build_type == 'Debug'
- run: |
- ver_short=`git rev-parse --short HEAD`
- echo "VERSION=$ver_short" >> $GITHUB_ENV
- - name: Package Snap (Linux)
- id: snapcraft
- if: inputs.build_type == 'Debug'
- uses: snapcore/action-build@v1
- - name: Upload Snap (Linux)
- if: inputs.build_type == 'Debug'
- uses: actions/upload-artifact@v3
- with:
- name: prismlauncher_${{ env.VERSION }}_amd64.snap
- path: ${{ steps.snapcraft.outputs.snap }}
-
flatpak:
runs-on: ubuntu-latest
container:
diff --git a/.gitignore b/.gitignore
index 010bc323..3340670b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,10 +11,12 @@ html/
*.pro.user
CMakeLists.txt.user
CMakeLists.txt.user.*
+CMakeSettings.json
/.project
/.settings
/.idea
/.vscode
+/.vs
cmake-build-*/
Debug
@@ -22,6 +24,10 @@ Debug
build
/build-*
+# direnv / Nix
+.direnv/
+.pre-commit-config.yaml
+
# Install dirs
install
/install-*
diff --git a/BUILD.md b/BUILD.md
index 2443ac56..a139039d 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -1,53 +1,3 @@
# Build Instructions
-Full build instructions will be available on [the website](https://prismlauncher.org/wiki/development/build-instructions/).
-
-If you would like to contribute or fix an issue with the Build instructions you will be able to do so [here](https://github.com/PrismLauncher/website/blob/master/src/wiki/development/build-instructions.md).
-
-## Getting the source
-
-Clone the source code using git, and grab all the submodules. This is generic for all platforms you want to build on.
-```
-git clone --recursive https://github.com/PrismLauncher/PrismLauncher
-cd PrismLauncher
-```
-
-## Linux
-
-This guide will mostly mention dependant packages by their Debian naming and commands are done by a user in the sudoers file.
-### Dependencies
-
-- A C++ compiler capable of building C++17 code (can be found in the package `build-essential`).
-- Qt Development tools 5.12 or newer (on Debian 11 or Debian-based distributions, `qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5`).
-- `cmake` 3.15 or newer.
-- `extra-cmake-modules`.
-- zlib (`zlib1g-dev` on Debian 11 or Debian-based distributions).
-- Java Development Kit (Java JDK) (`openjdk-17-jdk` on Debian 11 or Debian-based distributions).
-- Mesa GL headers (`libgl1-mesa-dev` on Debian 11 or Debian-based distributions).
-- (Optional) `scdoc` to generate man pages.
-
-In conclusion, to check if all you need is installed (including optional):
-
-```
-sudo apt install build-essential qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5 cmake extra-cmake-modules zlib1g-dev openjdk-17-jdk libgl1-mesa-dev scdoc
-```
-
-### Compiling
-#### Building and installing on the system
-This is usually the suggested way to build the client.
-
-```
-cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="/usr" -DENABLE_LTO=ON
-cmake --build build -j$(nproc)
-sudo cmake --install build
-```
-
-#### Building a portable binary
-
-```
-cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
-cmake --build build -j$(nproc)
-cmake --install build
-cmake --install build --component portable
-```
-
+Full build instructions are available on [the website](https://prismlauncher.org/wiki/development/build-instructions/).
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 37bb49ba..05c69c89 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -174,7 +174,7 @@ set(Launcher_SUBREDDIT_URL "https://www.reddit.com/r/PrismLauncher/" CACHE STRIN
# Builds
set(Launcher_FORCE_BUNDLED_LIBS OFF CACHE BOOL "Prevent using system libraries, if they are available as submodules")
-set(Launcher_QT_VERSION_MAJOR "5" CACHE STRING "Major Qt version to build against")
+set(Launcher_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against")
# API Keys
# NOTE: These API keys are here for convenience. If you rebrand this software or intend to break the terms of service
@@ -442,12 +442,11 @@ add_subdirectory(libraries/gamemode)
add_subdirectory(libraries/murmur2) # Hash for usage with the CurseForge API
if (NOT ghc_filesystem_FOUND)
message(STATUS "Using bundled ghc_filesystem")
- set(GHC_FILESYSTEM_WITH_INSTALL OFF) # Workaround ghc::filesystem bug
add_subdirectory(libraries/filesystem) # Implementation of std::filesystem for old C++, for usage in old macOS
- add_library(ghcFilesystem::ghc_filesystem ALIAS ghc_filesystem)
else()
message(STATUS "Using system ghc_filesystem")
endif()
+add_subdirectory(libraries/qdcss) # css parser
############################### Built Artifacts ###############################
diff --git a/flake.lock b/flake.lock
index 051e1664..ad9196a9 100644
--- a/flake.lock
+++ b/flake.lock
@@ -3,11 +3,11 @@
"flake-compat": {
"flake": false,
"locked": {
- "lastModified": 1668681692,
- "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=",
+ "lastModified": 1673956053,
+ "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "009399224d5e398d03b22badca40a37ac85412a1",
+ "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
@@ -16,6 +16,58 @@
"type": "github"
}
},
+ "flake-compat_2": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1673956053,
+ "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "edolstra",
+ "repo": "flake-compat",
+ "type": "github"
+ }
+ },
+ "flake-utils": {
+ "locked": {
+ "lastModified": 1676283394,
+ "narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "gitignore": {
+ "inputs": {
+ "nixpkgs": [
+ "pre-commit-hooks",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1660459072,
+ "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "gitignore.nix",
+ "type": "github"
+ }
+ },
"libnbtplusplus": {
"flake": false,
"locked": {
@@ -34,11 +86,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1671417167,
- "narHash": "sha256-JkHam6WQOwZN1t2C2sbp1TqMv3TVRjzrdoejqfefwrM=",
+ "lastModified": 1678693419,
+ "narHash": "sha256-bbSv5yqZAW6dz+3f3f3pOUZbxpPN+3OgCljgn7P+nnQ=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "bb31220cca6d044baa6dc2715b07497a2a7c4bc7",
+ "rev": "8e3fad82be64c06fbfb9fd43993aec9ef4623936",
"type": "github"
},
"original": {
@@ -48,11 +100,55 @@
"type": "github"
}
},
+ "nixpkgs-stable": {
+ "locked": {
+ "lastModified": 1673800717,
+ "narHash": "sha256-SFHraUqLSu5cC6IxTprex/nTsI81ZQAtDvlBvGDWfnA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "2f9fd351ec37f5d479556cd48be4ca340da59b8f",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-22.11",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "pre-commit-hooks": {
+ "inputs": {
+ "flake-compat": "flake-compat_2",
+ "flake-utils": [
+ "flake-utils"
+ ],
+ "gitignore": "gitignore",
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "nixpkgs-stable": "nixpkgs-stable"
+ },
+ "locked": {
+ "lastModified": 1678376203,
+ "narHash": "sha256-3tyYGyC8h7fBwncLZy5nCUjTJPrHbmNwp47LlNLOHSM=",
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "rev": "1a20b9708962096ec2481eeb2ddca29ed747770a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "cachix",
+ "repo": "pre-commit-hooks.nix",
+ "type": "github"
+ }
+ },
"root": {
"inputs": {
"flake-compat": "flake-compat",
+ "flake-utils": "flake-utils",
"libnbtplusplus": "libnbtplusplus",
- "nixpkgs": "nixpkgs"
+ "nixpkgs": "nixpkgs",
+ "pre-commit-hooks": "pre-commit-hooks"
}
}
},
diff --git a/flake.nix b/flake.nix
index 5615a758..f656703c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -3,35 +3,89 @@
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
- flake-compat = { url = "github:edolstra/flake-compat"; flake = false; };
- libnbtplusplus = { url = "github:PrismLauncher/libnbtplusplus"; flake = false; };
+ flake-utils.url = "github:numtide/flake-utils";
+ pre-commit-hooks = {
+ url = "github:cachix/pre-commit-hooks.nix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ inputs.flake-utils.follows = "flake-utils";
+ };
+ flake-compat = {
+ url = "github:edolstra/flake-compat";
+ flake = false;
+ };
+ libnbtplusplus = {
+ url = "github:PrismLauncher/libnbtplusplus";
+ flake = false;
+ };
};
- outputs = { self, nixpkgs, libnbtplusplus, ... }:
- let
- # User-friendly version number.
- version = builtins.substring 0 8 self.lastModifiedDate;
+ outputs = {
+ self,
+ nixpkgs,
+ flake-utils,
+ pre-commit-hooks,
+ libnbtplusplus,
+ ...
+ }: let
+ # User-friendly version number.
+ version = builtins.substring 0 8 self.lastModifiedDate;
+
+ # Supported systems (qtbase is currently broken for "aarch64-darwin")
+ supportedSystems = with flake-utils.lib.system; [
+ x86_64-linux
+ x86_64-darwin
+ aarch64-linux
+ ];
+
+ packagesFn = pkgs: {
+ prismlauncher-qt5 = pkgs.libsForQt5.callPackage ./nix {
+ inherit version self libnbtplusplus;
+ };
+ prismlauncher = pkgs.qt6Packages.callPackage ./nix {
+ inherit version self libnbtplusplus;
+ };
+ };
+ in
+ flake-utils.lib.eachSystem supportedSystems (system: let
+ pkgs = nixpkgs.legacyPackages.${system};
+ in {
+ checks = {
+ pre-commit-check = pre-commit-hooks.lib.${system}.run {
+ src = ./.;
+ hooks = {
+ markdownlint.enable = true;
- # Supported systems (qtbase is currently broken for "aarch64-darwin")
- supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" ];
+ alejandra.enable = true;
+ deadnix.enable = true;
+
+ clang-format = {
+ enable =
+ false; # As most of the codebase is **not** formatted, we don't want clang-format yet
+ types_or = ["c" "c++"];
+ };
+ };
+ };
+ };
- # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'.
- forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
+ packages = let
+ packages = packagesFn pkgs;
+ in
+ packages // {default = packages.prismlauncher;};
- # Nixpkgs instantiated for supported systems.
- pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system});
+ devShells.default = pkgs.mkShell {
+ inherit (self.checks.${system}.pre-commit-check) shellHook;
+ packages = with pkgs; [
+ nodePackages.markdownlint-cli
+ alejandra
+ deadnix
+ clang-tools
+ ];
- packagesFn = pkgs: rec {
- prismlauncher-qt5 = pkgs.libsForQt5.callPackage ./nix { inherit version self libnbtplusplus; };
- prismlauncher = pkgs.qt6Packages.callPackage ./nix { inherit version self libnbtplusplus; };
+ inputsFrom = [self.packages.${system}.default];
+ buildInputs = with pkgs; [ccache ninja];
};
- in
- {
- packages = forAllSystems (system:
- let packages = packagesFn pkgs.${system}; in
- packages // { default = packages.prismlauncher; }
- );
-
- overlay = final: packagesFn;
+ })
+ // {
+ overlays.default = final: _: (packagesFn final);
};
}
diff --git a/flatpak/org.prismlauncher.PrismLauncher.yml b/flatpak/org.prismlauncher.PrismLauncher.yml
index 071772c6..0524946f 100644
--- a/flatpak/org.prismlauncher.PrismLauncher.yml
+++ b/flatpak/org.prismlauncher.PrismLauncher.yml
@@ -32,6 +32,7 @@ modules:
config-opts:
- -DLauncher_BUILD_PLATFORM=flatpak
- -DCMAKE_BUILD_TYPE=Debug
+ - -DLauncher_QT_VERSION_MAJOR=5
build-options:
env:
JAVA_HOME: /usr/lib/sdk/openjdk17/jvm/openjdk-17
diff --git a/launcher/Application.cpp b/launcher/Application.cpp
index aed862dc..879af535 100644
--- a/launcher/Application.cpp
+++ b/launcher/Application.cpp
@@ -7,6 +7,7 @@
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
* Copyright (C) 2022 Lenny McLennington <lenny@sneed.church>
* Copyright (C) 2022 Tayou <tayou@gmx.net>
+ * Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -225,7 +226,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
m_serverToJoin = parser.value("server");
m_profileToUse = parser.value("profile");
m_liveCheck = parser.isSet("alive");
-
+
m_instanceIdToShowWindowOf = parser.value("show");
for (auto zip_path : parser.values("import")){
@@ -346,7 +347,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
import.command = "import";
import.args.insert("path", zip_url.toString());
m_peerInstance->sendMessage(import.serialize(), timeout);
- }
+ }
}
}
else
@@ -515,6 +516,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
m_settings->registerSetting("InstanceDir", "instances");
m_settings->registerSetting({"CentralModsDir", "ModsDir"}, "mods");
m_settings->registerSetting("IconsDir", "icons");
+ m_settings->registerSetting("DownloadsDir", QStandardPaths::writableLocation(QStandardPaths::DownloadLocation));
// Editors
m_settings->registerSetting("JsonEditor", QString());
@@ -660,6 +662,7 @@ Application::Application(int &argc, char **argv) : QApplication(argc, argv)
m_settings->set("FlameKeyOverride", flameKey);
m_settings->reset("CFKeyOverride");
}
+ m_settings->registerSetting("ModrinthToken", "");
m_settings->registerSetting("UserAgentOverride", "");
// Init page provider
@@ -1548,6 +1551,15 @@ QString Application::getFlameAPIKey()
return BuildConfig.FLAME_API_KEY;
}
+QString Application::getModrinthAPIToken()
+{
+ QString tokenOverride = m_settings->get("ModrinthToken").toString();
+ if (!tokenOverride.isEmpty())
+ return tokenOverride;
+
+ return QString();
+}
+
QString Application::getUserAgent()
{
QString uaOverride = m_settings->get("UserAgentOverride").toString();
diff --git a/launcher/Application.h b/launcher/Application.h
index 1b3dc499..91c5fc63 100644
--- a/launcher/Application.h
+++ b/launcher/Application.h
@@ -3,6 +3,7 @@
* Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
* Copyright (C) 2022 Tayou <tayou@gmx.net>
+ * Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -177,6 +178,7 @@ public:
QString getMSAClientID();
QString getFlameAPIKey();
+ QString getModrinthAPIToken();
QString getUserAgent();
QString getUserAgentUncached();
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
index 66099c4e..c475773d 100644
--- a/launcher/CMakeLists.txt
+++ b/launcher/CMakeLists.txt
@@ -1045,6 +1045,7 @@ target_link_libraries(Launcher_logic
nbt++
${ZLIB_LIBRARIES}
tomlplusplus::tomlplusplus
+ qdcss
BuildConfig
Katabasis
Qt${QT_VERSION_MAJOR}::Widgets
diff --git a/launcher/InstancePageProvider.h b/launcher/InstancePageProvider.h
index 5d8beca9..b4b6e739 100644
--- a/launcher/InstancePageProvider.h
+++ b/launcher/InstancePageProvider.h
@@ -36,9 +36,10 @@ public:
values.append(new VersionPage(onesix.get()));
values.append(ManagedPackPage::createPage(onesix.get()));
auto modsPage = new ModFolderPage(onesix.get(), onesix->loaderModList());
- modsPage->setFilter("%1 (*.zip *.jar *.litemod)");
+ modsPage->setFilter("%1 (*.zip *.jar *.litemod *.nilmod)");
values.append(modsPage);
values.append(new CoreModFolderPage(onesix.get(), onesix->coreModList()));
+ values.append(new NilModFolderPage(onesix.get(), onesix->nilModList()));
values.append(new ResourcePackPage(onesix.get(), onesix->resourcePackList()));
values.append(new TexturePackPage(onesix.get(), onesix->texturePackList()));
values.append(new ShaderPackPage(onesix.get(), onesix->shaderPackList()));
diff --git a/launcher/MMCZip.cpp b/launcher/MMCZip.cpp
index c6d56543..1eda43fe 100644
--- a/launcher/MMCZip.cpp
+++ b/launcher/MMCZip.cpp
@@ -320,7 +320,7 @@ std::optional<QStringList> MMCZip::extractSubDir(QuaZip *zip, const QString & su
if (relative_file_name.isEmpty()) {
target_file_path = target + '/';
} else {
- target_file_path = FS::PathCombine(target_top_dir.path(), sub_path, relative_file_name);
+ target_file_path = FS::PathCombine(target_top_dir.toLocalFile(), sub_path, relative_file_name);
if (relative_file_name.endsWith('/') && !target_file_path.endsWith('/'))
target_file_path += '/';
}
diff --git a/launcher/minecraft/MinecraftInstance.cpp b/launcher/minecraft/MinecraftInstance.cpp
index 4fe234c4..af4da5d0 100644
--- a/launcher/minecraft/MinecraftInstance.cpp
+++ b/launcher/minecraft/MinecraftInstance.cpp
@@ -290,6 +290,11 @@ QString MinecraftInstance::coreModsDir() const
return FS::PathCombine(gameRoot(), "coremods");
}
+QString MinecraftInstance::nilModsDir() const
+{
+ return FS::PathCombine(gameRoot(), "nilmods");
+}
+
QString MinecraftInstance::resourcePacksDir() const
{
return FS::PathCombine(gameRoot(), "resourcepacks");
@@ -1125,6 +1130,18 @@ std::shared_ptr<ModFolderModel> MinecraftInstance::coreModList() const
return m_core_mod_list;
}
+std::shared_ptr<ModFolderModel> MinecraftInstance::nilModList() const
+{
+ if (!m_nil_mod_list)
+ {
+ bool is_indexed = !APPLICATION->settings()->get("ModMetadataDisabled").toBool();
+ m_nil_mod_list.reset(new ModFolderModel(nilModsDir(), is_indexed, false));
+ m_nil_mod_list->disableInteraction(isRunning());
+ connect(this, &BaseInstance::runningStatusChanged, m_nil_mod_list.get(), &ModFolderModel::disableInteraction);
+ }
+ return m_nil_mod_list;
+}
+
std::shared_ptr<ResourcePackFolderModel> MinecraftInstance::resourcePackList() const
{
if (!m_resource_pack_list)
diff --git a/launcher/minecraft/MinecraftInstance.h b/launcher/minecraft/MinecraftInstance.h
index 1bbd7b83..a75fa481 100644
--- a/launcher/minecraft/MinecraftInstance.h
+++ b/launcher/minecraft/MinecraftInstance.h
@@ -84,6 +84,7 @@ public:
QString shaderPacksDir() const;
QString modsRoot() const override;
QString coreModsDir() const;
+ QString nilModsDir() const;
QString modsCacheLocation() const;
QString libDir() const;
QString worldDir() const;
@@ -116,6 +117,7 @@ public:
////// Mod Lists //////
std::shared_ptr<ModFolderModel> loaderModList() const;
std::shared_ptr<ModFolderModel> coreModList() const;
+ std::shared_ptr<ModFolderModel> nilModList() const;
std::shared_ptr<ResourcePackFolderModel> resourcePackList() const;
std::shared_ptr<TexturePackFolderModel> texturePackList() const;
std::shared_ptr<ShaderPackFolderModel> shaderPackList() const;
@@ -170,6 +172,7 @@ protected: // data
std::shared_ptr<PackProfile> m_components;
mutable std::shared_ptr<ModFolderModel> m_loader_mod_list;
mutable std::shared_ptr<ModFolderModel> m_core_mod_list;
+ mutable std::shared_ptr<ModFolderModel> m_nil_mod_list;
mutable std::shared_ptr<ResourcePackFolderModel> m_resource_pack_list;
mutable std::shared_ptr<ShaderPackFolderModel> m_shader_pack_list;
mutable std::shared_ptr<TexturePackFolderModel> m_texture_pack_list;
diff --git a/launcher/minecraft/launch/ScanModFolders.cpp b/launcher/minecraft/launch/ScanModFolders.cpp
index bdffeadd..71e7638c 100644
--- a/launcher/minecraft/launch/ScanModFolders.cpp
+++ b/launcher/minecraft/launch/ScanModFolders.cpp
@@ -55,6 +55,12 @@ void ScanModFolders::executeTask()
if(!cores->update()) {
m_coreModsDone = true;
}
+
+ auto nils = m_inst->nilModList();
+ connect(nils.get(), &ModFolderModel::updateFinished, this, &ScanModFolders::nilModsDone);
+ if(!nils->update()) {
+ m_nilModsDone = true;
+ }
checkDone();
}
@@ -70,9 +76,15 @@ void ScanModFolders::coreModsDone()
checkDone();
}
+void ScanModFolders::nilModsDone()
+{
+ m_nilModsDone = true;
+ checkDone();
+}
+
void ScanModFolders::checkDone()
{
- if(m_modsDone && m_coreModsDone) {
+ if(m_modsDone && m_coreModsDone && m_nilModsDone) {
emitSucceeded();
}
}
diff --git a/launcher/minecraft/launch/ScanModFolders.h b/launcher/minecraft/launch/ScanModFolders.h
index d5989170..111a5850 100644
--- a/