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 = protected fun Class<*>.isValidForButtonCollection(): Boolean =
!Modifier.isAbstract(modifiers) && declaredAnnotations.any { it is ButtonInfo && !it.ignored } !Modifier.isAbstract(modifiers) && declaredAnnotations.any { it is ButtonInfo && !it.ignored }
private val displayInitMessage: Boolean by Configuration private val displayInitMessage: Boolean by Configuration
abstract val annotatedButtons: Set<Class<out ButtonImpl>> abstract val annotatedButtons: Lazy<Set<Class<out ButtonImpl>>>
companion object { companion object {
val MissingComponent: Component = translatable("MISSING_COMPONENT") val MissingComponent: Component = translatable("MISSING_COMPONENT")
@Suppress("JVM_STATIC_ON_CONST_OR_JVM_FIELD") // See KT-39868 @Suppress("JVM_STATIC_ON_CONST_OR_JVM_FIELD") // See KT-39868
@ -25,7 +25,7 @@ abstract class Snowy {
@JvmField @JvmField
val logs: Logger = LogManager.getLogger() val logs: Logger = LogManager.getLogger()
} }
init { Companion.annotatedButtons = ::annotatedButtons::get } init { Companion.annotatedButtons = { annotatedButtons.value } }
private fun eventsInit() { private fun eventsInit() {
onEvent("EndTick") { onEvent("EndTick") {
for (key in AddKeyMaps.list.keys) { 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
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback.EVENT import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback.EVENT
import net.fabricmc.loader.api.FabricLoader import net.fabricmc.loader.api.FabricLoader
import net.fabricmc.loader.launch.common.FabricLauncherBase
import net.minecraft.client.DeltaTracker import net.minecraft.client.DeltaTracker
import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.gui.GuiGraphics
import kotlin.io.path.exists import kotlin.io.path.exists
@ -25,16 +26,21 @@ class FabricInit: Snowy(), ClientModInitializer {
} }
) )
} }
override val annotatedButtons = FabricLoader.getInstance().allMods.mapNotNull { override val annotatedButtons = lazy {
FabricLoader.getInstance().allMods.mapNotNull {
it.findPath(FEATURE_PACKAGE.replace('.', '/')).getOrNull() it.findPath(FEATURE_PACKAGE.replace('.', '/')).getOrNull()
}.filter { it.exists() && it.isDirectory() }.flatMap { buttonsDirectory -> }.filter { it.exists() && it.isDirectory() }.flatMap { buttonsDirectory ->
mutableSetOf<Class<out ButtonImpl>>().apply { buttonsDirectory.listDirectoryEntries("*.class").mapNotNull { file ->
buttonsDirectory.listDirectoryEntries("*.class").forEach { file -> @Suppress("DEPRECATION")
@Suppress("DEPRECATION") net.fabricmc.loader.launch.common. FabricLauncherBase.getClass(
FabricLauncherBase.getClass(file.pathString.drop(1).replace('/', '.').removeSuffix(".class")).let { foundClass -> file.pathString.drop(1)
if (foundClass.isValidForButtonCollection()) add(foundClass.asSubclass(ButtonImpl::class.java)) .replace('/', '.').removeSuffix(".class")
} ).let { foundClass ->
if (foundClass.isValidForButtonCollection())
foundClass.asSubclass(ButtonImpl::class.java)
else null
} }
} }
}.toSet() }.toSet()
}
} }

View File

@ -16,7 +16,8 @@ import net.neoforged.neoforgespi.language.ModFileScanData
@Suppress("UNUSED_PARAMETER") @Suppress("UNUSED_PARAMETER")
class ForgeInit(container: ModContainer): Snowy() { class ForgeInit(container: ModContainer): Snowy() {
private fun initSetup(event: FMLClientSetupEvent) = atInit() private fun initSetup(event: FMLClientSetupEvent) = atInit()
override val annotatedButtons = ModList.get() // Forge-specific reflection override val annotatedButtons = lazy { // Forge-specific reflection
ModList.get()
.allScanData .allScanData
.flatMap { obj: ModFileScanData -> obj.classes } .flatMap { obj: ModFileScanData -> obj.classes }
.filter { data: ModFileScanData.ClassData? -> .filter { data: ModFileScanData.ClassData? ->
@ -28,6 +29,7 @@ class ForgeInit(container: ModContainer): Snowy() {
}?.asSubclass(ButtonImpl::class.java) }?.asSubclass(ButtonImpl::class.java)
} }
.toSet() .toSet()
}
init { init {
container.eventBus!!.run { container.eventBus!!.run {
addListener(this@ForgeInit::initSetup) addListener(this@ForgeInit::initSetup)