Make Snowy.annotatedButtons lazy
Fixes usage on neoforge Signed-off-by: Username404-59 <w.iron.zombie@gmail.com>
This commit is contained in:
parent
e647bfb286
commit
54dc2169fc
@ -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) {
|
||||||
|
|||||||
@ -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 {
|
||||||
it.findPath(FEATURE_PACKAGE.replace('.', '/')).getOrNull()
|
FabricLoader.getInstance().allMods.mapNotNull {
|
||||||
}.filter { it.exists() && it.isDirectory() }.flatMap { buttonsDirectory ->
|
it.findPath(FEATURE_PACKAGE.replace('.', '/')).getOrNull()
|
||||||
mutableSetOf<Class<out ButtonImpl>>().apply {
|
}.filter { it.exists() && it.isDirectory() }.flatMap { buttonsDirectory ->
|
||||||
buttonsDirectory.listDirectoryEntries("*.class").forEach { file ->
|
buttonsDirectory.listDirectoryEntries("*.class").mapNotNull { file ->
|
||||||
@Suppress("DEPRECATION") net.fabricmc.loader.launch.common.
|
@Suppress("DEPRECATION")
|
||||||
FabricLauncherBase.getClass(file.pathString.drop(1).replace('/', '.').removeSuffix(".class")).let { foundClass ->
|
FabricLauncherBase.getClass(
|
||||||
if (foundClass.isValidForButtonCollection()) add(foundClass.asSubclass(ButtonImpl::class.java))
|
file.pathString.drop(1)
|
||||||
|
.replace('/', '.').removeSuffix(".class")
|
||||||
|
).let { foundClass ->
|
||||||
|
if (foundClass.isValidForButtonCollection())
|
||||||
|
foundClass.asSubclass(ButtonImpl::class.java)
|
||||||
|
else null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}.toSet()
|
||||||
}.toSet()
|
}
|
||||||
}
|
}
|
||||||
@ -16,18 +16,20 @@ 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
|
||||||
.allScanData
|
ModList.get()
|
||||||
.flatMap { obj: ModFileScanData -> obj.classes }
|
.allScanData
|
||||||
.filter { data: ModFileScanData.ClassData? ->
|
.flatMap { obj: ModFileScanData -> obj.classes }
|
||||||
data!!.clazz.className.startsWith(FEATURE_PACKAGE)
|
.filter { data: ModFileScanData.ClassData? ->
|
||||||
}
|
data!!.clazz.className.startsWith(FEATURE_PACKAGE)
|
||||||
.mapNotNull {
|
}
|
||||||
Class.forName((it!!.clazz.className), false, this::class.java.classLoader).run {
|
.mapNotNull {
|
||||||
takeIf { isValidForButtonCollection() }
|
Class.forName((it!!.clazz.className), false, this::class.java.classLoader).run {
|
||||||
}?.asSubclass(ButtonImpl::class.java)
|
takeIf { isValidForButtonCollection() }
|
||||||
}
|
}?.asSubclass(ButtonImpl::class.java)
|
||||||
.toSet()
|
}
|
||||||
|
.toSet()
|
||||||
|
}
|
||||||
init {
|
init {
|
||||||
container.eventBus!!.run {
|
container.eventBus!!.run {
|
||||||
addListener(this@ForgeInit::initSetup)
|
addListener(this@ForgeInit::initSetup)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user