Make Snowy.annotatedButtons lazy

Fixes usage on neoforge

Signed-off-by: Username404-59 <w.iron.zombie@gmail.com>
This commit is contained in:
Username404-59 2026-02-21 22:15:59 +01:00
parent e647bfb286
commit 54dc2169fc
Signed by: Username404-59
GPG Key ID: 7AB361FBB257A5D1
3 changed files with 32 additions and 24 deletions

View File

@ -14,7 +14,7 @@ abstract class Snowy {
protected fun Class<*>.isValidForButtonCollection(): Boolean =
!Modifier.isAbstract(modifiers) && declaredAnnotations.any { it is ButtonInfo && !it.ignored }
private val displayInitMessage: Boolean by Configuration
abstract val annotatedButtons: Set<Class<out ButtonImpl>>
abstract val annotatedButtons: Lazy<Set<Class<out ButtonImpl>>>
companion object {
val MissingComponent: Component = translatable("MISSING_COMPONENT")
@Suppress("JVM_STATIC_ON_CONST_OR_JVM_FIELD") // See KT-39868
@ -25,7 +25,7 @@ abstract class Snowy {
@JvmField
val logs: Logger = LogManager.getLogger()
}
init { Companion.annotatedButtons = ::annotatedButtons::get }
init { Companion.annotatedButtons = { annotatedButtons.value } }
private fun eventsInit() {
onEvent("EndTick") {
for (key in AddKeyMaps.list.keys) {

View File

@ -7,6 +7,7 @@ import net.fabricmc.api.ClientModInitializer
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback.EVENT
import net.fabricmc.loader.api.FabricLoader
import net.fabricmc.loader.launch.common.FabricLauncherBase
import net.minecraft.client.DeltaTracker
import net.minecraft.client.gui.GuiGraphics
import kotlin.io.path.exists
@ -25,16 +26,21 @@ class FabricInit: Snowy(), ClientModInitializer {
}
)
}
override val annotatedButtons = FabricLoader.getInstance().allMods.mapNotNull {
it.findPath(FEATURE_PACKAGE.replace('.', '/')).getOrNull()
}.filter { it.exists() && it.isDirectory() }.flatMap { buttonsDirectory ->
mutableSetOf<Class<out ButtonImpl>>().apply {
buttonsDirectory.listDirectoryEntries("*.class").forEach { file ->
@Suppress("DEPRECATION") net.fabricmc.loader.launch.common.
FabricLauncherBase.getClass(file.pathString.drop(1).replace('/', '.').removeSuffix(".class")).let { foundClass ->
if (foundClass.isValidForButtonCollection()) add(foundClass.asSubclass(ButtonImpl::class.java))
override val annotatedButtons = lazy {
FabricLoader.getInstance().allMods.mapNotNull {
it.findPath(FEATURE_PACKAGE.replace('.', '/')).getOrNull()
}.filter { it.exists() && it.isDirectory() }.flatMap { buttonsDirectory ->
buttonsDirectory.listDirectoryEntries("*.class").mapNotNull { file ->
@Suppress("DEPRECATION")
FabricLauncherBase.getClass(
file.pathString.drop(1)
.replace('/', '.').removeSuffix(".class")
).let { foundClass ->
if (foundClass.isValidForButtonCollection())
foundClass.asSubclass(ButtonImpl::class.java)
else null
}
}
}
}.toSet()
}.toSet()
}
}

View File

@ -16,18 +16,20 @@ import net.neoforged.neoforgespi.language.ModFileScanData
@Suppress("UNUSED_PARAMETER")
class ForgeInit(container: ModContainer): Snowy() {
private fun initSetup(event: FMLClientSetupEvent) = atInit()
override val annotatedButtons = ModList.get() // Forge-specific reflection
.allScanData
.flatMap { obj: ModFileScanData -> obj.classes }
.filter { data: ModFileScanData.ClassData? ->
data!!.clazz.className.startsWith(FEATURE_PACKAGE)
}
.mapNotNull {
Class.forName((it!!.clazz.className), false, this::class.java.classLoader).run {
takeIf { isValidForButtonCollection() }
}?.asSubclass(ButtonImpl::class.java)
}
.toSet()
override val annotatedButtons = lazy { // Forge-specific reflection
ModList.get()
.allScanData
.flatMap { obj: ModFileScanData -> obj.classes }
.filter { data: ModFileScanData.ClassData? ->
data!!.clazz.className.startsWith(FEATURE_PACKAGE)
}
.mapNotNull {
Class.forName((it!!.clazz.className), false, this::class.java.classLoader).run {
takeIf { isValidForButtonCollection() }
}?.asSubclass(ButtonImpl::class.java)
}
.toSet()
}
init {
container.eventBus!!.run {
addListener(this@ForgeInit::initSetup)