Skip to content

Commit a4843b2

Browse files
committed
loading mod from jar
1 parent ebcf08d commit a4843b2

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed
Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package building
22

3+
import core.thing.item.ItemResource
4+
import kotlinx.coroutines.runBlocking
35
import java.io.File
46
import java.net.URL
57
import java.net.URLClassLoader
@@ -17,20 +19,22 @@ Resolve load order conflicts
1719
actual object ModManager {
1820
actual fun applyMods() {
1921
val manifestFile = File("./mods/manifest.txt")
20-
val manifest = if (manifestFile.exists()){
22+
val manifest = if (manifestFile.exists()) {
2123
manifestFile.readLines()
2224
} else listOf()
2325
println("Found ${manifest.size} mods.")
2426

25-
manifest.mapNotNull { fileName ->
26-
val jarFile = File("./mods/$fileName.jar")
27-
if (jarFile.exists()) jarFile else null
28-
}.forEach { loadJar(it) }
29-
27+
runBlocking {
28+
manifest.mapNotNull { fileName ->
29+
val jarFile = File("./mods/$fileName.jar")
30+
if (jarFile.exists()) jarFile else null
31+
}.forEach { loadJar(it) }
32+
}
3033
if (manifest.isNotEmpty()) println("Loaded Mods")
3134
}
3235

33-
private fun loadJar(jarFile: File) {
36+
@Suppress("UNCHECKED_CAST")
37+
private suspend fun loadJar(jarFile: File) {
3438
val jar = JarFile(jarFile)
3539

3640
val e = jar.entries()
@@ -40,14 +44,18 @@ actual object ModManager {
4044
while (e.hasMoreElements()) {
4145
val je = e.nextElement() as JarEntry
4246

43-
if (je.isDirectory || !je.name.endsWith(".class")) {
44-
continue
45-
}
46-
47-
// -6 because of .class
48-
val className = je.name.substring(0, je.name.length - 6).replace('/', '.')
49-
47+
if (je.isDirectory || !je.name.endsWith(".class")) continue
48+
val className = je.name.substring(0, je.name.length - ".class".length).replace('/', '.')
5049
val c: Class<*> = cl.loadClass(className)
50+
51+
when {
52+
c.interfaces.contains(ItemResource::class.java) -> process(c as Class<ItemResource>)
53+
}
5154
}
5255
}
56+
}
57+
58+
private suspend fun process(c: Class<ItemResource>) {
59+
val items = c.getDeclaredConstructor().newInstance().values()
60+
println("Found ${items.size} items")
5361
}

0 commit comments

Comments
 (0)