1- // version: 1707682661
1+ // version: 1718246243
22/*
33 * DO NOT CHANGE THIS FILE!
44 * Also, you may replace this file at any time if there is an update available.
77 */
88
99import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
10+ import com.gtnewhorizons.retrofuturagradle.MinecraftExtension
11+ import com.gtnewhorizons.retrofuturagradle.mcp.MCPTasks
12+ import com.gtnewhorizons.retrofuturagradle.minecraft.MinecraftTasks
1013import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar
14+ import com.gtnewhorizons.retrofuturagradle.minecraft.RunMinecraftTask
15+ import com.gtnewhorizons.retrofuturagradle.util.Distribution
1116import com.modrinth.minotaur.dependencies.ModDependency
1217import com.modrinth.minotaur.dependencies.VersionDependency
18+ import de.undercouch.gradle.tasks.download.DownloadExtension
19+ import org.apache.commons.io.FileUtils
20+ import org.gradle.api.internal.artifacts.configurations.DefaultUnlockedConfiguration
1321import org.gradle.api.tasks.testing.logging.TestExceptionFormat
1422import org.gradle.api.tasks.testing.logging.TestLogEvent
1523import org.gradle.internal.logging.text.StyledTextOutputFactory
1624import org.jetbrains.gradle.ext.Gradle
1725
26+ import javax.inject.Inject
27+
1828import static org.gradle.internal.logging.text.StyledTextOutput.Style
1929
2030plugins {
@@ -33,6 +43,7 @@ plugins {
3343 id ' org.jetbrains.kotlin.jvm' version ' 1.8.0' apply false
3444 id ' org.jetbrains.kotlin.kapt' version ' 1.8.0' apply false
3545 id ' com.google.devtools.ksp' version ' 1.8.0-1.0.9' apply false
46+ id ' de.undercouch.download' version ' 5.6.0' apply false
3647}
3748
3849def out = services. get(StyledTextOutputFactory ). create(' an-output' )
@@ -58,6 +69,7 @@ propertyDefaultIfUnset("includeMCVersionJar", false)
5869propertyDefaultIfUnset(" autoUpdateBuildScript" , false )
5970propertyDefaultIfUnset(" modArchivesBaseName" , project. modId)
6071propertyDefaultIfUnsetWithEnvVar(" developmentEnvironmentUserName" , " Developer" , " DEV_USERNAME" )
72+ propertyDefaultIfUnset(" enableJava17RunTasks" , false )
6173propertyDefaultIfUnset(" generateGradleTokenClass" , " " )
6274propertyDefaultIfUnset(" gradleTokenModId" , " " )
6375propertyDefaultIfUnset(" gradleTokenModName" , " " )
@@ -369,6 +381,10 @@ minecraft {
369381 ' -Dlegacy.debugClassLoadingSave=true'
370382 ])
371383 }
384+
385+ if (enableJava17RunTasks. toBoolean()) {
386+ lwjgl3Version = " 3.3.2"
387+ }
372388}
373389
374390if (coreModClass) {
@@ -820,6 +836,218 @@ def getManifestAttributes() {
820836}
821837
822838
839+ // LWJGL3ify setup
840+ if (enableJava17RunTasks. toBoolean()) {
841+
842+ apply plugin : ' de.undercouch.download'
843+
844+ ext. java17Toolchain = (JavaToolchainSpec spec) -> {
845+ spec. languageVersion. set(JavaLanguageVersion . of(17 ))
846+ spec. vendor. set(JvmVendorSpec . matching(" jetbrains" ))
847+ }
848+ ext. java21Toolchain = (JavaToolchainSpec spec) -> {
849+ spec. languageVersion. set(JavaLanguageVersion . of(21 ))
850+ spec. vendor. set(JvmVendorSpec . matching(" jetbrains" ))
851+ }
852+
853+ ext. java17DependenciesCfg = (DefaultUnlockedConfiguration ) configurations. create(" java17Dependencies" ) {
854+ extendsFrom(configurations. getByName(" runtimeClasspath" )) // Ensure consistent transitive dependency resolution
855+ canBeConsumed = false
856+ }
857+ ext. java17PatchDependenciesCfg = (DefaultUnlockedConfiguration ) configurations. create(" java17PatchDependencies" ) {
858+ canBeConsumed = false
859+ }
860+
861+ dependencies {
862+ if (modId != ' lwjgl3ify' ) {
863+ java17Dependencies(" io.github.twilightflower:lwjgl3ify:1.0.0" )
864+ }
865+ java17PatchDependencies(" io.github.twilightflower:lwjgl3ify:1.0.0:forgePatches" ) {
866+ transitive = false
867+ }
868+ }
869+
870+ ext. java17JvmArgs = [
871+ " -Dfile.encoding=UTF-8" ,
872+ " -Djava.system.class.loader=com.gtnewhorizons.retrofuturabootstrap.RfbSystemClassLoader" ,
873+ " -Djava.security.manager=allow" ,
874+ " --add-opens" , " java.base/jdk.internal.loader=ALL-UNNAMED" ,
875+ " --add-opens" , " java.base/java.net=ALL-UNNAMED" ,
876+ " --add-opens" , " java.base/java.nio=ALL-UNNAMED" ,
877+ " --add-opens" , " java.base/java.io=ALL-UNNAMED" ,
878+ " --add-opens" , " java.base/java.lang=ALL-UNNAMED" ,
879+ " --add-opens" , " java.base/java.lang.reflect=ALL-UNNAMED" ,
880+ " --add-opens" , " java.base/java.text=ALL-UNNAMED" ,
881+ " --add-opens" , " java.base/java.util=ALL-UNNAMED" ,
882+ " --add-opens" , " java.base/jdk.internal.reflect=ALL-UNNAMED" ,
883+ " --add-opens" , " java.base/sun.nio.ch=ALL-UNNAMED" ,
884+ " --add-opens" , " jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED,java.naming" ,
885+ " --add-opens" , " java.desktop/sun.awt=ALL-UNNAMED" ,
886+ " --add-opens" , " java.desktop/sun.awt.image=ALL-UNNAMED" ,
887+ " --add-opens" , " java.desktop/com.sun.imageio.plugins.png=ALL-UNNAMED" ,
888+ " --add-opens" , " jdk.dynalink/jdk.dynalink.beans=ALL-UNNAMED" ,
889+ " --add-opens" , " java.sql.rowset/javax.sql.rowset.serial=ALL-UNNAMED"
890+ ]
891+
892+ ext. hotswapJvmArgs = [
893+ // DCEVM advanced hot reload
894+ " -XX:+AllowEnhancedClassRedefinition" ,
895+ " -XX:HotswapAgent=fatjar"
896+ ]
897+
898+ ext. setupHotswapAgent17 = tasks. register(" setupHotswapAgent17" , SetupHotswapAgentTask , t -> {
899+ t. setTargetForToolchain(java17Toolchain)
900+ })
901+
902+ ext. setupHotswapAgent21 = tasks. register(" setupHotswapAgent21" , SetupHotswapAgentTask , t -> {
903+ t. setTargetForToolchain(java21Toolchain)
904+ })
905+
906+ def runClient17Task = tasks. register(" runClient17" , RunHotswappableMinecraftTask , Distribution . CLIENT , " runClient" )
907+ runClient17Task. configure {
908+ dependsOn(setupHotswapAgent17)
909+ setup(project)
910+ javaLauncher = project. javaToolchains. launcherFor(project. java17Toolchain)
911+ }
912+
913+ def runServer17Task = tasks. register(" runServer17" , RunHotswappableMinecraftTask , Distribution . DEDICATED_SERVER , " runServer" )
914+ runServer17Task. configure {
915+ dependsOn(setupHotswapAgent17)
916+ setup(project)
917+ javaLauncher = project. javaToolchains. launcherFor(project. java17Toolchain)
918+ }
919+
920+ def runClient21Task = tasks. register(" runClient21" , RunHotswappableMinecraftTask , Distribution . CLIENT , " runClient" )
921+ runClient21Task. configure {
922+ dependsOn(setupHotswapAgent21)
923+ setup(project)
924+ javaLauncher = project. javaToolchains. launcherFor(project. java21Toolchain)
925+ }
926+
927+ def runServer21Task = tasks. register(" runServer21" , RunHotswappableMinecraftTask , Distribution . DEDICATED_SERVER , " runServer" )
928+ runServer21Task. configure {
929+ dependsOn(setupHotswapAgent21)
930+ setup(project)
931+ javaLauncher = project. javaToolchains. launcherFor(project. java21Toolchain)
932+ }
933+ }
934+
935+ abstract class RunHotswappableMinecraftTask extends RunMinecraftTask {
936+
937+ // IntelliJ doesn't seem to allow pre-set commandline arguments, so we also support an env variable
938+ private boolean enableHotswap = Boolean . valueOf(System . getenv(" HOTSWAP" ))
939+
940+ public final Distribution side
941+ public final String superTask
942+
943+ @Input
944+ boolean getEnableHotswap () {
945+ return enableHotswap
946+ }
947+
948+ @Option (option = " hotswap" , description = " Enables HotSwapAgent for enhanced class reloading under a debugger" )
949+ boolean setEnableHotswap (boolean enable ) {
950+ enableHotswap = enable
951+ }
952+
953+ @Inject
954+ RunHotswappableMinecraftTask (Distribution side , String superTask , org.gradle.api.invocation.Gradle gradle ) {
955+ super (side, gradle)
956+
957+ this . side = side
958+ this . superTask = superTask
959+ setGroup(" Modded Minecraft" )
960+ setDescription(" Runs the modded " + side. name(). toLowerCase(Locale . ROOT ) + " using modern Java and lwjgl3ify" )
961+ this . getLwjglVersion(). set(3 )
962+ }
963+
964+ void setup (Project project ) {
965+ final MinecraftExtension minecraft = project. getExtensions(). getByType(MinecraftExtension . class)
966+ final MCPTasks mcpTasks = project. getExtensions(). getByType(MCPTasks . class)
967+ final MinecraftTasks mcTasks = project. getExtensions(). getByType(MinecraftTasks . class)
968+
969+ this . getExtraJvmArgs(). addAll((List<String > ) project. property(" java17JvmArgs" ))
970+ if (getEnableHotswap()) {
971+ this . getExtraJvmArgs(). addAll((List<String > ) project. property(" hotswapJvmArgs" ))
972+ }
973+
974+ this . classpath(project. property(" java17PatchDependenciesCfg" ))
975+ this . classpath(mcpTasks. getTaskPackageMcLauncher())
976+ this . classpath(mcpTasks. getTaskPackagePatchedMc())
977+ this . classpath(mcpTasks. getPatchedConfiguration())
978+ this . classpath(project. getTasks(). named(" jar" ))
979+ this . classpath(project. property(" java17DependenciesCfg" ))
980+
981+ super . setup(project)
982+
983+ dependsOn(
984+ mcpTasks. getLauncherSources(). getClassesTaskName(),
985+ mcTasks. getTaskDownloadVanillaAssets(),
986+ mcpTasks. getTaskPackagePatchedMc(),
987+ " jar"
988+ )
989+
990+ getMainClass(). set((side == Distribution . CLIENT ) ? " GradleStart" : " GradleStartServer" )
991+ getUsername(). set(minecraft. getUsername())
992+ getUserUUID(). set(minecraft. getUserUUID())
993+ if (side == Distribution . DEDICATED_SERVER ) {
994+ getExtraArgs(). add(" nogui" )
995+ }
996+
997+ systemProperty(" gradlestart.bouncerClient" , " com.gtnewhorizons.retrofuturabootstrap.Main" )
998+ systemProperty(" gradlestart.bouncerServer" , " com.gtnewhorizons.retrofuturabootstrap.Main" )
999+
1000+ if (project. usesMixins. toBoolean()) {
1001+ this . extraJvmArgs. addAll(project. provider(() -> {
1002+ def mixinCfg = project. configurations. detachedConfiguration(project. dependencies. create(project. mixinProviderSpec))
1003+ mixinCfg. canBeConsumed = false
1004+ mixinCfg. canBeResolved = true
1005+ mixinCfg. transitive = false
1006+ enableHotswap ? [" -javaagent:" + mixinCfg. singleFile. absolutePath] : []
1007+ }))
1008+ }
1009+ }
1010+ }
1011+
1012+ abstract class SetupHotswapAgentTask extends DefaultTask {
1013+
1014+ @OutputFile
1015+ abstract RegularFileProperty getTargetFile ()
1016+
1017+ void setTargetForToolchain (Action<JavaToolchainSpec > spec ) {
1018+ getTargetFile(). set(project. javaToolchains. launcherFor(spec). map {
1019+ it. metadata. installationPath. file(" lib/hotswap/hotswap-agent.jar" )
1020+ })
1021+ }
1022+
1023+ @Inject
1024+ SetupHotswapAgentTask () {
1025+ setGroup(" GT Buildscript" )
1026+ setDescription(" Installs a recent version of HotSwapAgent into the Java runtime directory" )
1027+ onlyIf(" Run only if not already installed" , t -> ! ((SetupHotswapAgentTask ) t). getTargetFile(). getAsFile(). get(). exists())
1028+ }
1029+
1030+ @TaskAction
1031+ void installHSA () {
1032+ final String url = ' https://github.com/HotswapProjects/HotswapAgent/releases/download/1.4.2-SNAPSHOT/hotswap-agent-1.4.2-SNAPSHOT.jar'
1033+ final File target = getTargetFile(). getAsFile(). get()
1034+ final File parent = target. getParentFile()
1035+ FileUtils . forceMkdir(parent)
1036+ final DownloadExtension download = getProject(). getExtensions(). findByType(DownloadExtension . class)
1037+ download. run(ds -> {
1038+ try {
1039+ ds. src(url)
1040+ } catch (MalformedURLException e) {
1041+ throw new RuntimeException (e)
1042+ }
1043+ ds. dest(target)
1044+ ds. overwrite(false )
1045+ ds. tempAndMove(true )
1046+ })
1047+ }
1048+ }
1049+
1050+
8231051// IDE Configuration
8241052
8251053eclipse {
@@ -844,9 +1072,25 @@ idea {
8441072 ' 2. Run Client' (Gradle ) {
8451073 taskNames = [' runClient' ]
8461074 }
1075+ if (enableJava17RunTasks. toBoolean()) {
1076+ ' 2a. Run Client (Java 17)' (Gradle ) {
1077+ taskNames = [' runClient17' ]
1078+ }
1079+ ' 2b. Run Client (Java 21)' (Gradle ) {
1080+ taskNames = [' runClient21' ]
1081+ }
1082+ }
8471083 ' 3. Run Server' (Gradle ) {
8481084 taskNames = [' runServer' ]
8491085 }
1086+ if (enableJava17RunTasks. toBoolean()) {
1087+ ' 3a. Run Server (Java 17)' (Gradle ) {
1088+ taskNames = [' runServer17' ]
1089+ }
1090+ ' 3b. Run Server (Java 21)' (Gradle ) {
1091+ taskNames = [' runServer21' ]
1092+ }
1093+ }
8501094 ' 4. Run Obfuscated Client' (Gradle ) {
8511095 taskNames = [' runObfClient' ]
8521096 }
0 commit comments