fix: Accidental hard dependency on sodium in mixins

This commit is contained in:
Linnea Gräf
2025-04-12 14:49:41 +02:00
parent a3b3ec6490
commit c3bf4a82a2
11 changed files with 256 additions and 109 deletions

View File

@@ -3,6 +3,10 @@ package moe.nea.firmament.features.debug
import java.io.File
import java.nio.file.Path
import java.util.concurrent.CompletableFuture
import org.objectweb.asm.ClassReader
import org.objectweb.asm.Type
import org.objectweb.asm.tree.ClassNode
import org.spongepowered.asm.mixin.Mixin
import kotlinx.serialization.json.encodeToStream
import kotlin.io.path.absolute
import kotlin.io.path.exists
@@ -10,11 +14,14 @@ import net.minecraft.client.MinecraftClient
import net.minecraft.text.Text
import moe.nea.firmament.Firmament
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.DebugInstantiateEvent
import moe.nea.firmament.events.TickEvent
import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.init.MixinPlugin
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.TimeMark
import moe.nea.firmament.util.asm.AsmAnnotationUtil
import moe.nea.firmament.util.iterate
object DeveloperFeatures : FirmamentFeature {
@@ -41,6 +48,42 @@ object DeveloperFeatures : FirmamentFeature {
this.missingTranslations = missingTranslations
}
@Subscribe
fun loadAllMixinClasses(event: DebugInstantiateEvent) {
val allMixinClasses = mutableSetOf<String>()
MixinPlugin.instances.forEach { plugin ->
val prefix = plugin.mixinPackage + "."
val classes = plugin.mixins.map { prefix + it }
allMixinClasses.addAll(classes)
for (cls in classes) {
val targets = javaClass.classLoader.getResourceAsStream("${cls.replace(".", "/")}.class").use {
val node = ClassNode()
ClassReader(it).accept(node, 0)
val mixins = mutableListOf<Mixin>()
(node.visibleAnnotations.orEmpty() + node.invisibleAnnotations.orEmpty()).forEach {
val annotationType = Type.getType(it.desc)
val mixinType = Type.getType(Mixin::class.java)
if (mixinType == annotationType) {
mixins.add(AsmAnnotationUtil.createProxy(Mixin::class.java, it))
}
}
mixins.flatMap { it.targets.toList() } + mixins.flatMap { it.value.map { it.java.name } }
}
for (target in targets)
try {
Firmament.logger.debug("Loading ${target} to force instantiate ${cls}")
Class.forName(target, true, javaClass.classLoader)
} catch (ex: Throwable) {
Firmament.logger.error("Could not load class ${target} that has been mixind by $cls", ex)
}
}
}
Firmament.logger.info("Forceloaded all Firmament mixins:")
val applied = MixinPlugin.instances.flatMap { it.appliedMixins }.toSet()
applied.forEach { Firmament.logger.info(" - ${it}") }
require(allMixinClasses == applied)
}
@Subscribe
fun dumpMissingTranslations(tickEvent: TickEvent) {
val toDump = missingTranslations ?: return