Skip to content

Commit 1543901

Browse files
committed
update buildscript
1 parent 790001b commit 1543901

File tree

1 file changed

+245
-1
lines changed

1 file changed

+245
-1
lines changed

build.gradle

Lines changed: 245 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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.
@@ -7,14 +7,24 @@
77
*/
88

99
import 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
1013
import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar
14+
import com.gtnewhorizons.retrofuturagradle.minecraft.RunMinecraftTask
15+
import com.gtnewhorizons.retrofuturagradle.util.Distribution
1116
import com.modrinth.minotaur.dependencies.ModDependency
1217
import 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
1321
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
1422
import org.gradle.api.tasks.testing.logging.TestLogEvent
1523
import org.gradle.internal.logging.text.StyledTextOutputFactory
1624
import org.jetbrains.gradle.ext.Gradle
1725

26+
import javax.inject.Inject
27+
1828
import static org.gradle.internal.logging.text.StyledTextOutput.Style
1929

2030
plugins {
@@ -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

3849
def out = services.get(StyledTextOutputFactory).create('an-output')
@@ -58,6 +69,7 @@ propertyDefaultIfUnset("includeMCVersionJar", false)
5869
propertyDefaultIfUnset("autoUpdateBuildScript", false)
5970
propertyDefaultIfUnset("modArchivesBaseName", project.modId)
6071
propertyDefaultIfUnsetWithEnvVar("developmentEnvironmentUserName", "Developer", "DEV_USERNAME")
72+
propertyDefaultIfUnset("enableJava17RunTasks", false)
6173
propertyDefaultIfUnset("generateGradleTokenClass", "")
6274
propertyDefaultIfUnset("gradleTokenModId", "")
6375
propertyDefaultIfUnset("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

374390
if (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

8251053
eclipse {
@@ -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

Comments
 (0)