summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZekerZhayard <trees1000@qq.com>2021-07-23 01:14:25 +0800
committerZekerZhayard <trees1000@qq.com>2021-07-23 01:39:13 +0800
commit3aeeada18f679232315b49044d9045a256749132 (patch)
treed3d88ef7443df121cd5ac9c598dd721cb69f3c0f
parent29f602904a3ee7c3e92c3ee2036cf42bc10addb4 (diff)
downloadProject-Tick-3aeeada18f679232315b49044d9045a256749132.tar.gz
Project-Tick-3aeeada18f679232315b49044d9045a256749132.zip
Fix crash on launch with forge-1.16.5-36.1.66.
Add GitHub Actions.
-rw-r--r--.github/workflows/build.yml25
-rw-r--r--.github/workflows/maven.bat13
-rw-r--r--.github/workflows/publication.yml54
-rw-r--r--build.gradle96
-rw-r--r--gradle.properties4
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin56177 -> 59536 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties3
-rw-r--r--gradlew55
-rw-r--r--gradlew.bat43
-rw-r--r--legacy/build.gradle17
-rw-r--r--legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/LegacyClientInstall4MultiMC.java24
-rw-r--r--legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/LegacyInstallerUtil.java11
-rw-r--r--settings.gradle11
-rw-r--r--src/main/java/io/github/zekerzhayard/forgewrapper/installer/ClientInstall4MultiMC.java7
-rw-r--r--src/main/java/io/github/zekerzhayard/forgewrapper/installer/Installer.java8
-rw-r--r--src/main/java/io/github/zekerzhayard/forgewrapper/installer/Main.java12
-rw-r--r--src/main/java/io/github/zekerzhayard/forgewrapper/installer/MainV2.java15
-rw-r--r--src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/InstallerUtil.java52
-rw-r--r--src/main/resources/META-INF/services/java.util.function.Consumer1
19 files changed, 375 insertions, 76 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000000..8d331b528b
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,25 @@
+name: Gradle Build
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build:
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: '8.0.302'
+ architecture: x64
+ - name: Build with Gradle
+ run: ./gradlew.bat build -iS
+ - uses: actions/upload-artifact@v2
+ with:
+ name: Package
+ path: build/libs
diff --git a/.github/workflows/maven.bat b/.github/workflows/maven.bat
new file mode 100644
index 0000000000..0d3f914a00
--- /dev/null
+++ b/.github/workflows/maven.bat
@@ -0,0 +1,13 @@
+@ECHO OFF
+
+git clone -b maven https://github.com/ZekerZhayard/ForgeWrapper.git .\maven
+
+xcopy ".\build\maven\" ".\maven\" /S /Y
+cd ".\maven\"
+
+git config --local user.name "GitHub Actions"
+git config --local user.email "actions@github.com"
+
+git add .
+git commit -m "%GITHUB_SHA%"
+git push https://${GITHUB_TOKEN}@github.com/ZekerZhayard/ForgeWrapper.git maven
diff --git a/.github/workflows/publication.yml b/.github/workflows/publication.yml
new file mode 100644
index 0000000000..0f6f0eb94e
--- /dev/null
+++ b/.github/workflows/publication.yml
@@ -0,0 +1,54 @@
+name: Publication
+
+on:
+ push:
+ tags:
+ - '*'
+
+jobs:
+ build:
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up JDK
+ uses: actions/setup-java@v1
+ with:
+ java-version: '8.0.302'
+ architecture: x64
+ - name: Build with Gradle
+ env:
+ IS_PUBLICATION: true
+ run: ./gradlew.bat publish -iS
+ - uses: actions/upload-artifact@v2
+ with:
+ name: Package
+ path: build/libs
+ - name: Get tag version
+ id: get_version
+ uses: olegtarasov/get-tag@v2.1
+ - uses: actions/upload-artifact@v2
+ with:
+ name: Package
+ path: build/libs
+ - name: Create Release
+ id: create_release
+ uses: actions/create-release@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ steps.get_version.outputs.tag }}
+ release_name: ${{ steps.get_version.outputs.tag }}
+ body: ''
+ draft: false
+ prerelease: false
+ - name: Upload release binaries
+ uses: alexellis/upload-assets@0.2.2
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ asset_paths: '["./build/libs/*"]'
+ - name: Upload to Maven
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: ./.github/workflows/maven.bat
diff --git a/build.gradle b/build.gradle
index 591fddd25c..36c64069a9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,39 +1,111 @@
-apply plugin: "base"
-apply plugin: "java"
-apply plugin: "eclipse"
-apply plugin: "idea"
+
+plugins {
+ id "java"
+ id "eclipse"
+ id "maven-publish"
+}
sourceCompatibility = targetCompatibility = 1.8
-version = "1.4.2"
+version = "${fw_version}${-> getVersionSuffix()}"
group = "io.github.zekerzhayard"
archivesBaseName = rootProject.name
+configurations {
+ provided {
+ compileOnly.extendsFrom provided
+ }
+}
+
repositories {
+ mavenCentral()
maven {
name = "forge"
- url = "https://files.minecraftforge.net/maven/"
+ url = "https://maven.minecraftforge.net/"
}
}
dependencies {
- compile "cpw.mods:modlauncher:4.1.0"
- compile "net.minecraftforge:forge:1.14.4-28.2.0:installer"
+ compileOnly "com.google.code.gson:gson:2.8.7"
+ compileOnly "cpw.mods:modlauncher:8.0.9"
+ compileOnly "net.minecraftforge:installer:2.1.4"
+ compileOnly "net.sf.jopt-simple:jopt-simple:5.0.4"
+
+ provided project(":legacy")
+}
+
+java {
+ withSourcesJar()
}
jar {
- manifest.attributes(
- "Main-Class": "io.github.zekerzhayard.forgewrapper.converter.Main"
- )
+ manifest.attributes([
+ "Specification-Title": "${project.name}",
+ "Specification-Vendor": "ZekerZhayard",
+ "Specification-Version": "${project.version}".split("-")[0],
+ "Implementation-Title": "${project.name}",
+ "Implementation-Version": "${project.version}",
+ "Implementation-Vendor" :"ZekerZhayard",
+ "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
+ "Automatic-Module-Name": "${project.group}.${project.archivesBaseName}".toString().toLowerCase(),
+ "Main-Class": "io.github.zekerzhayard.forgewrapper.converter.Main",
+ "GitCommit": String.valueOf(System.getenv("GITHUB_SHA"))
+ ])
+
+ from configurations.provided.files.collect {
+ zipTree(it)
+ }
+}
+
+/*task sourcesJar(type: Jar) {
+ manifest {
+ attributes(jar.manifest.attributes)
+ }
+ from sourceSets.main.allSource
+ archiveFileName = "${archivesBaseName}-${archiveVersion.get()}-sources.${archiveExtension.get()}"
}
+artifacts {
+ archives sourcesJar
+}*/
+
processResources {
inputs.property "version", project.version
from(sourceSets.main.resources.srcDirs) {
+ duplicatesStrategy = DuplicatesStrategy.INCLUDE
include "patches/net.minecraftforge.json"
expand "version": project.version
}
from(sourceSets.main.resources.srcDirs) {
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
exclude "patches/net.minecraftforge.json"
}
-} \ No newline at end of file
+}
+
+publishing {
+ publications {
+ maven(MavenPublication) {
+ groupId "${project.group}"
+ artifactId "${project.archivesBaseName}"
+ version "${project.version}"
+
+ from components.java
+ }
+ }
+ repositories {
+ maven {
+ url = layout.buildDirectory.dir("maven")
+ }
+ }
+
+}
+tasks.publish.dependsOn build
+
+static String getVersionSuffix() {
+ if (System.getenv("IS_PUBLICATION") != null) {
+ return ""
+ } else if (System.getenv("GITHUB_RUN_NUMBER") != null && System.getenv("GITHUB_SHA") != null) {
+ return "-s." + System.getenv("GITHUB_RUN_NUMBER") + "-" + System.getenv("GITHUB_SHA").substring(0, 7)
+ }
+ return "-LOCAL"
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000..38e35016b1
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,4 @@
+
+org.gradle.daemon = false
+
+fw_version = 1.5 \ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 94336fcae9..7454180f2a 100644
--- a/gradle/wrapper/gradle-wrapper.jar
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d193c615fa..af7be50b10 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Thu Mar 12 20:06:29 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-all.zip
diff --git a/gradlew b/gradlew
index cccdd3d517..744e882ed5 100644
--- a/gradlew
+++ b/gradlew
@@ -1,5 +1,21 @@
#!/usr/bin/env sh
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
##############################################################################
##
## Gradle start up script for UN*X
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
@@ -56,7 +72,7 @@ case "`uname`" in
Darwin* )
darwin=true
;;
- MINGW* )
+ MSYS* | MINGW* )
msys=true
;;
NONSTOP* )
@@ -66,6 +82,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -109,10 +126,11 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
@@ -138,19 +156,19 @@ if $cygwin ; then
else
eval `echo args$i`="\"$arg\""
fi
- i=$((i+1))
+ i=`expr $i + 1`
done
case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
@@ -159,14 +177,9 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
-APP_ARGS=$(save "$@")
+APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
- cd "$(dirname "$0")"
-fi
-
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index f9553162f1..107acd32c4 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,28 +64,14 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/legacy/build.gradle b/legacy/build.gradle
new file mode 100644
index 0000000000..5036489352
--- /dev/null
+++ b/legacy/build.gradle
@@ -0,0 +1,17 @@
+
+plugins {
+ id "java"
+ id "eclipse"
+}
+
+repositories {
+ mavenCentral()
+ maven {
+ name = "forge"
+ url = "https://maven.minecraftforge.net/"
+ }
+}
+
+dependencies {
+ compileOnly "net.minecraftforge:installer:2.0.24"
+} \ No newline at end of file
diff --git a/legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/LegacyClientInstall4MultiMC.java b/legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/LegacyClientInstall4MultiMC.java
new file mode 100644
index 0000000000..0804602087
--- /dev/null
+++ b/legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/LegacyClientInstall4MultiMC.java
@@ -0,0 +1,24 @@
+package io.github.zekerzhayard.forgewrapper.installer;
+
+import java.io.File;
+import java.util.function.Predicate;
+
+import net.minecraftforge.installer.actions.ClientInstall;
+import net.minecraftforge.installer.actions.ProgressCallback;
+import net.minecraftforge.installer.json.Install;
+
+public class LegacyClientInstall4MultiMC extends ClientInstall {
+ protected File libraryDir;
+ protected File minecraftJar;
+
+ public LegacyClientInstall4MultiMC(Install profile, ProgressCallback monitor, File libraryDir, File minecraftJar) {
+ super(profile, monitor);
+ this.libraryDir = libraryDir;
+ this.minecraftJar = minecraftJar;
+ }
+
+ @Override
+ public boolean run(File target, Predicate<String> optionals) {
+ return this.processors.process(this.libraryDir, this.minecraftJar);
+ }
+}
diff --git a/legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/LegacyInstallerUtil.java b/legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/LegacyInstallerUtil.java
new file mode 100644
index 0000000000..587b8c7834
--- /dev/null
+++ b/legacy/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/LegacyInstallerUtil.java
@@ -0,0 +1,11 @@
+package io.github.zekerzhayard.forgewrapper.installer.util;
+
+import net.minecraftforge.installer.json.Install;
+import net.minecraftforge.installer.json.Util;
+
+// to compatible with forge [1.13.2-25.0.9,1.16.5-36.1.65]
+public class LegacyInstallerUtil {
+ public static Install loadInstallProfile() {
+ return Util.loadInstallProfile();
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index 95689a11c3..c2cb153d92 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,10 +1,3 @@
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * The settings file is used to specify which projects to include in your build.
- *
- * Detailed information about configuring a multi-project build in Gradle can be found
- * in the user guide at https://docs.gradle.org/4.10.3/userguide/multi_project_builds.html
- */
-
rootProject.name = 'ForgeWrapper'
+
+include 'legacy' \ No newline at end of file
diff --git a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/ClientInstall4MultiMC.java b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/ClientInstall4MultiMC.java
index ea7256416c..6daa1e5371 100644
--- a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/ClientInstall4MultiMC.java
+++ b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/ClientInstall4MultiMC.java
@@ -6,19 +6,20 @@ import java.util.function.Predicate;
import net.minecraftforge.installer.actions.ClientInstall;
import net.minecraftforge.installer.actions.ProgressCallback;
import net.minecraftforge.installer.json.Install;
+import net.minecraftforge.installer.json.InstallV1;
public class ClientInstall4MultiMC extends ClientInstall {
protected File libraryDir;
protected File minecraftJar;
public ClientInstall4MultiMC(Install profile, ProgressCallback monitor, File libraryDir, File minecraftJar) {
- super(profile, monitor);
+ super(profile instanceof InstallV1 ? (InstallV1) profile : new InstallV1(profile), monitor);
this.libraryDir = libraryDir;
this.minecraftJar = minecraftJar;
}
@Override
- public boolean run(File target, Predicate<String> optionals) {
- return this.processors.process(this.libraryDir, this.minecraftJar);
+ public boolean run(File target, Predicate<String> optionals, File installer) {
+ return this.processors.process(this.libraryDir, this.minecraftJar, this.libraryDir.getParentFile(), installer);
}
}
diff --git a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Installer.java b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Installer.java
index 1a822ce06e..6294c77940 100644
--- a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Installer.java
+++ b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Installer.java
@@ -2,14 +2,14 @@ package io.github.zekerzhayard.forgewrapper.installer;
import java.io.File;
+import io.github.zekerzhayard.forgewrapper.installer.util.InstallerUtil;
import net.minecraftforge.installer.actions.ProgressCallback;
import net.minecraftforge.installer.json.Install;
-import net.minecraftforge.installer.json.Util;
public class Installer {
- public static boolean install(File libraryDir, File minecraftJar) {
+ public static boolean install(File libraryDir, File minecraftJar, File installerJar, String forgeVersion) {
ProgressCallback monitor = ProgressCallback.withOutputs(System.out);
- Install install = Util.loadInstallProfile();
+ Install install = InstallerUtil.loadInstallProfile(forgeVersion);
if (System.getProperty("java.net.preferIPv4Stack") == null) {
System.setProperty("java.net.preferIPv4Stack", "true");
}
@@ -18,6 +18,6 @@ public class Installer {
String jvmVersion = System.getProperty("java.vm.version", "missing jvm version");
monitor.message(String.format("JVM info: %s - %s - %s", vendor, javaVersion, jvmVersion));
monitor.message("java.net.preferIPv4Stack=" + System.getProperty("java.net.preferIPv4Stack"));
- return new ClientInstall4MultiMC(install, monitor, libraryDir, minecraftJar).run(null, input -> true);
+ return InstallerUtil.runClientInstall(forgeVersion, install, monitor, libraryDir, minecraftJar, installerJar);
}
}
diff --git a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Main.java b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Main.java
index c52c272493..78c2d5880c 100644
--- a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Main.java
+++ b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/Main.java
@@ -3,7 +3,6 @@ package io.github.zekerzhayard.forgewrapper.installer;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
-import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
@@ -17,7 +16,8 @@ public class Main {
public static void main(String[] args) throws Exception {
List<String> argsList = Stream.of(args).collect(Collectors.toList());
String mcVersion = argsList.get(argsList.indexOf("--fml.mcVersion") + 1);
- String forgeFullVersion = mcVersion + "-" + argsList.get(argsList.indexOf("--fml.forgeVersion") + 1);
+ String forgeVersion = argsList.get(argsList.indexOf("--fml.forgeVersion") + 1);
+ String forgeFullVersion = mcVersion + "-" + forgeVersion;
IFileDetector detector = DetectorLoader.loadDetector();
if (!detector.checkExtraFiles(forgeFullVersion)) {
@@ -26,13 +26,13 @@ public class Main {
// Check installer jar.
Path installerJar = detector.getInstallerJar(forgeFullVersion);
if (!IFileDetector.isFile(installerJar)) {
- throw new RuntimeException("Can't detect the forge installer!");
+ throw new RuntimeException("Unable to detect the forge installer!");
}
// Check vanilla Minecraft jar.
Path minecraftJar = detector.getMinecraftJar(mcVersion);
if (!IFileDetector.isFile(minecraftJar)) {
- throw new RuntimeException("Can't detect the Minecraft jar!");
+ throw new RuntimeException("Unable to detect the Minecraft jar!");
}
try (URLClassLoader ucl = URLClassLoader.newInstance(new URL[] {
@@ -41,13 +41,13 @@ public class Main {
installerJar.toUri().toURL()
}, getParentClassLoader())) {
Class<?> installer = ucl.loadClass("io.github.zekerzhayard.forgewrapper.installer.Installer");
- if (!(boolean) installer.getMethod("install", File.class, File.class).invoke(null, detector.getLibraryDir().toFile(), minecraftJar.toFile())) {
+ if (!(boolean) installer.getMethod("install", File.class, File.class, File.class, String.class).invoke(null, detector.getLibraryDir().toFile(), minecraftJar.toFile(), installerJar.toFile(), forgeVersion)) {
return;
}
}
}
- Launcher.main(args);
+ Launcher.main(args); // TODO: this will be broken in forge 1.17
}
// https://github.com/MinecraftForge/Installer/blob/fe18a164b5ebb15b5f8f33f6a149cc224f446dc2/src/main/java/net/minecraftforge/installer/actions/PostProcessors.java#L287-L303
diff --git a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/MainV2.java b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/MainV2.java
new file mode 100644
index 0000000000..230d9fbe28
--- /dev/null
+++ b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/MainV2.java
@@ -0,0 +1,15 @@
+package io.github.zekerzhayard.forgewrapper.installer;
+
+import java.util.function.Consumer;
+
+// to support forge 1.17 (bootstraplauncher)
+public class MainV2 implements Consumer<String[]> {
+ @Override
+ public void accept(String[] args) {
+ try {
+ Main.main(args);
+ } catch (Throwable t) {
+ throw new RuntimeException(t);
+ }
+ }
+}
diff --git a/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/InstallerUtil.java b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/InstallerUtil.java
new file mode 100644
index 0000000000..26f11ce583
--- /dev/null
+++ b/src/main/java/io/github/zekerzhayard/forgewrapper/installer/util/InstallerUtil.java
@@ -0,0 +1,52 @@
+package io.github.zekerzhayard.forgewrapper.installer.util;
+
+import java.io.File;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import io.github.zekerzhayard.forgewrapper.installer.ClientInstall4MultiMC;
+import io.github.zekerzhayard.forgewrapper.installer.LegacyClientInstall4MultiMC;
+import net.minecraftforge.installer.actions.ProgressCallback;
+import net.minecraftforge.installer.json.Install;
+import net.minecraftforge.installer.json.Util;
+
+public class InstallerUtil {
+ public static Install loadInstallProfile(String forgeVersion) {
+ if (isLegacyForge(forgeVersion, "36.1.65")) {
+ return LegacyInstallerUtil.loadInstallProfile();
+ } else {
+ // to prevent ClassNotFoundException
+ return new Object() {
+ public Install get() {
+ return Util.loadInstallProfile();
+ }
+ }.get();
+ }
+ }
+
+ public static boolean runClientInstall(String forgeVersion, Install profile, ProgressCallback monitor, File libraryDir, File minecraftJar, File installerJar) {
+ if (isLegacyForge(forgeVersion, "36.1.65")) {
+ return new LegacyClientInstall4MultiMC(profile, monitor, libraryDir, minecraftJar).run(null, input -> true);
+ } else {
+ return new ClientInstall4MultiMC(profile, monitor, libraryDir, minecraftJar).run(null, input -> true, installerJar);
+ }
+ }
+
+ private final static Pattern FORGE_VERSION_PATTERN = Pattern.compile("(?<major>\\d+)\\.(?<minor>\\d+)\\.(?<build>\\d+)");
+ private static boolean isLegacyForge(String forgeVersion, String legacyForgeVersion) {
+ Matcher m0 = FORGE_VERSION_PATTERN.matcher(forgeVersion);
+ Matcher m1 = FORGE_VERSION_PATTERN.matcher(legacyForgeVersion);
+ if (m0.find() && m1.find()) {
+ return compareVersion(m0, m1, 0, "major", "minor", "build");
+ }
+ throw new RuntimeException("Missing forge version!");
+ }
+
+ private static boolean compareVersion(Matcher m0, Matcher m1, int index, String... groups) {
+ if (index == groups.length) return true; // the same as the legacy version
+ int result = Integer.compare(Integer.parseInt(m0.group(groups[index])), Integer.parseInt(m1.group(groups[index])));
+ if (result < 0) return true; // less than the legacy version
+ if (result > 0) return false; // greater than the legacy version
+ return compareVersion(m0, m1, index + 1, groups);
+ }
+}
diff --git a/src/main/resources/META-INF/services/java.util.function.Consumer b/src/main/resources/META-INF/services/java.util.function.Consumer
new file mode 100644
index 0000000000..64cc969425
--- /dev/null
+++ b/src/main/resources/META-INF/services/java.util.function.Consumer
@@ -0,0 +1 @@
+io.github.zekerzhayard.forgewrapper.installer.MainV2 \ No newline at end of file