Skip to content

Commit baf12dc

Browse files
Add Launcher
1 parent 57452ea commit baf12dc

File tree

19 files changed

+432
-150
lines changed

19 files changed

+432
-150
lines changed

api/.gitignore

Lines changed: 0 additions & 42 deletions
This file was deleted.

api/build.gradle.kts

Lines changed: 0 additions & 21 deletions
This file was deleted.

build-logic/settings.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ dependencyResolutionManagement {
55
}
66
}
77
}
8+
9+
rootProject.name = "weave-build-logic"

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ subprojects {
55
repositories {
66
mavenCentral()
77
maven("https://repo.weavemc.dev/releases")
8+
mavenLocal()
89
}
910
}

gradle-plugin/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,10 @@ gradlePlugin {
3131

3232
base {
3333
archivesName = "Weave-Gradle"
34+
}
35+
36+
tasks {
37+
processResources {
38+
expand("version" to version)
39+
}
3440
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
plugins {
2+
id("config-kotlin")
3+
id("config-publish")
4+
}
5+
6+
kotlin {
7+
jvmToolchain(8)
8+
}
9+
10+
dependencies {
11+
implementation(project(":internals"))
12+
runtimeOnly(libs.log4j.slf4j2.impl)
13+
runtimeOnly(libs.log4j.core)
14+
runtimeOnly(libs.terminalconsoleappender) {
15+
exclude(group = "org.apache.logging.log4j")
16+
}
17+
18+
runtimeOnly(libs.bundles.jline)
19+
}
20+
21+
publishing {
22+
publications {
23+
create<MavenPublication>("maven") {
24+
from(components["java"])
25+
groupId = "net.weavemc"
26+
artifactId = "weave-gradle-launcher"
27+
version = project.version.toString()
28+
}
29+
}
30+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package net.weavemc.gradle
2+
3+
import net.weavemc.internals.*
4+
import java.net.URL
5+
import java.net.URLClassLoader
6+
import java.nio.file.Path
7+
import kotlin.io.path.absolutePathString
8+
import kotlin.io.path.createDirectories
9+
import kotlin.io.path.exists
10+
11+
fun main(args: Array<String>) {
12+
System.setProperty("terminal.ansi", "true")
13+
14+
val version = args.firstOrNull() ?: error("Specify a version to launch!")
15+
val versionInfo = fetchVersionManifest()?.fetchVersion(version) ?: error("Could not fetch version $version!")
16+
17+
val gameDir = getMinecraftDir().also { it.createDirectories() }
18+
val gamePath = gameDir.resolve("versions").resolve(version).resolve("$version.jar")
19+
if (!gamePath.exists()) error("Minecraft JAR does not exist?")
20+
21+
val librariesDir = gameDir.resolve("libraries")
22+
val libraryPaths = mutableListOf<Path>(gamePath)
23+
24+
// TODO: extract to function?
25+
for (lib in versionInfo.relevantLibraries) for (download in lib.downloads.allDownloads) {
26+
val target = download.path.split('/').fold(librariesDir) { acc, curr -> acc.resolve(curr) }
27+
libraryPaths.add(target)
28+
if (!target.exists()) DownloadUtil.download(URL(download.url), target)
29+
}
30+
31+
val gameArgs = buildList {
32+
fun addArgument(name: String, value: String) {
33+
val prefix = "--$name"
34+
if (prefix !in this) {
35+
add(prefix)
36+
add(value)
37+
}
38+
}
39+
40+
addAll(args.drop(1))
41+
addArgument("accessToken", "0")
42+
addArgument("version", versionInfo.id)
43+
addArgument("assetIndex", versionInfo.assetIndex.id)
44+
addArgument("assetsDir", gameDir.resolve("assets").absolutePathString())
45+
}.toTypedArray()
46+
47+
val urls = libraryPaths.mapToArray { it.toUri().toURL() }
48+
DevLauncherClassLoader(urls).loadClass(versionInfo.mainClass)
49+
.getMethod("main", gameArgs::class.java)(null, gameArgs)
50+
}
51+
52+
class DevLauncherClassLoader(urls: Array<URL>) : URLClassLoader(urls) {
53+
private val disallowedReloading = listOf(
54+
"java.", "javax.", "org.xml.", "org.w3c.", "sun.", "jdk.", "com.sun.management.",
55+
"kotlin.", "kotlinx.", "org.slf4j."
56+
)
57+
58+
override fun loadClass(name: String, resolve: Boolean): Class<*> {
59+
findLoadedClass(name)?.let { return it }
60+
if (disallowedReloading.any { name.startsWith(it) }) return super.loadClass(name, resolve)
61+
62+
val clazz = findClass(name)
63+
if (resolve) resolveClass(clazz)
64+
return clazz
65+
}
66+
}
67+
68+
private inline fun <A, reified B> Collection<A>.mapToArray(block: (A) -> B): Array<B> {
69+
val iterator = iterator()
70+
return Array(size) { block(iterator.next()) }
71+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<Configuration status="WARN" packages="com.mojang.util,net.minecrell.terminalconsole.util">
3+
<Appenders>
4+
<Console name="SysOut" target="SYSTEM_OUT">
5+
<PatternLayout>
6+
<!-- Apparently if we remove the selector it breaks? -->
7+
<LoggerNamePatternSelector defaultPattern="%style{[%d{HH:mm:ss}]}{blue} %highlight{[%t/%level]}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=blue} %style{(%logger{1})}{cyan} %highlight{%msg%n}{FATAL=red, ERROR=red, WARN=normal, INFO=normal, DEBUG=normal, TRACE=normal}" />
8+
</PatternLayout>
9+
</Console>
10+
<RollingRandomAccessFile name="File" fileName="logs/latest.log" filePattern="logs/%d{yyyy-MM-dd}-%i.log.gz">
11+
<PatternLayout pattern="[%d{HH:mm:ss}] [%t/%level]: %msg{nolookups}%n" />
12+
<Policies>
13+
<TimeBasedTriggeringPolicy />
14+
<OnStartupTriggeringPolicy />
15+
</Policies>
16+
</RollingRandomAccessFile>
17+
</Appenders>
18+
<Loggers>
19+
<Root level="info">
20+
<filters>
21+
<MarkerFilter marker="NETWORK_PACKETS" onMatch="DENY" onMismatch="NEUTRAL" />
22+
</filters>
23+
<AppenderRef ref="SysOut"/>
24+
<AppenderRef ref="File"/>
25+
</Root>
26+
</Loggers>
27+
</Configuration>

gradle-plugin/src/main/kotlin/net/weavemc/gradle/util/Constants.kt renamed to gradle-plugin/src/main/kotlin/net/weavemc/gradle/Constants.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.weavemc.gradle.util
1+
package net.weavemc.gradle
22

33
import kotlinx.serialization.json.Json
44
import net.weavemc.internals.MinecraftVersion
@@ -23,11 +23,6 @@ object Constants {
2323
* The global JSON serializer
2424
*/
2525
val JSON = Json { ignoreUnknownKeys = true }
26-
27-
/**
28-
* The version manifest URL
29-
*/
30-
const val VERSION_MANIFEST = "https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"
3126
}
3227

3328
val MinecraftVersion.cacheDirectory get() = Constants.CACHE_DIR.resolve("cache-${versionName}").also { it.mkdirs() }

0 commit comments

Comments
 (0)