diff options
author | Linnea Gräf <nea@nea.moe> | 2025-03-11 12:44:59 +0100 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2025-03-11 12:44:59 +0100 |
commit | 17a855a4bdfcca00b29f85981d8fb86968d9038c (patch) | |
tree | 4ecde192607e1b6fea54fc264a6b79a197ae8619 /src/main/kotlin/util | |
parent | 0765c8aee181dda89b08f89c4a7deb301f00f656 (diff) | |
download | Firmament-17a855a4bdfcca00b29f85981d8fb86968d9038c.tar.gz Firmament-17a855a4bdfcca00b29f85981d8fb86968d9038c.tar.bz2 Firmament-17a855a4bdfcca00b29f85981d8fb86968d9038c.zip |
feat: add SBItemData implementation
Diffstat (limited to 'src/main/kotlin/util')
-rw-r--r-- | src/main/kotlin/util/MC.kt | 2 | ||||
-rw-r--r-- | src/main/kotlin/util/compatloader/CompatLoader.kt | 31 | ||||
-rw-r--r-- | src/main/kotlin/util/skyblock/Rarity.kt | 7 |
3 files changed, 32 insertions, 8 deletions
diff --git a/src/main/kotlin/util/MC.kt b/src/main/kotlin/util/MC.kt index a0d2fc0..ef03887 100644 --- a/src/main/kotlin/util/MC.kt +++ b/src/main/kotlin/util/MC.kt @@ -14,6 +14,7 @@ import net.minecraft.client.world.ClientWorld import net.minecraft.entity.Entity import net.minecraft.item.Item import net.minecraft.item.ItemStack +import net.minecraft.nbt.NbtOps import net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket import net.minecraft.registry.BuiltinRegistries import net.minecraft.registry.RegistryKeys @@ -112,6 +113,7 @@ object MC { inline val currentRegistries: RegistryWrapper.WrapperLookup? get() = world?.registryManager val defaultRegistries: RegistryWrapper.WrapperLookup by lazy { BuiltinRegistries.createWrapperLookup() } inline val currentOrDefaultRegistries get() = currentRegistries ?: defaultRegistries + inline val currentOrDefaultNbtOps get() = currentOrDefaultRegistries.getOps(NbtOps.INSTANCE) val defaultItems: RegistryWrapper.Impl<Item> by lazy { defaultRegistries.getOrThrow(RegistryKeys.ITEM) } var lastWorld: World? = null get() { diff --git a/src/main/kotlin/util/compatloader/CompatLoader.kt b/src/main/kotlin/util/compatloader/CompatLoader.kt index 6b60e87..c3cc19c 100644 --- a/src/main/kotlin/util/compatloader/CompatLoader.kt +++ b/src/main/kotlin/util/compatloader/CompatLoader.kt @@ -5,29 +5,44 @@ import net.fabricmc.loader.api.FabricLoader import kotlin.reflect.KClass import kotlin.streams.asSequence import moe.nea.firmament.Firmament +import moe.nea.firmament.util.ErrorUtil -abstract class CompatLoader<T : Any>(val kClass: Class<T>) { +open class CompatLoader<T : Any>(val kClass: Class<T>) { constructor(kClass: KClass<T>) : this(kClass.java) val loader: ServiceLoader<T> = ServiceLoader.load(kClass) val allValidInstances by lazy { - loader.reload() - loader.stream() + val resources = kClass.classLoader.getResources("META-INF/services/${kClass.name}") + val classes = resources .asSequence() - .filter { provider -> + .map { ErrorUtil.catch("Could not read service loader resource at $it") { it.readText() }.or { "" } } + .flatMap { it.lineSequence() } + .map { it.substringBefore('#').trim() } + .filter { it.isNotBlank() } + .mapNotNull { + ErrorUtil.catch("Could not load class named $it for $kClass") { + Class.forName(it, + false, + kClass.classLoader).asSubclass(kClass) + }.or { null } + } + .toList() + + classes.asSequence() + .filter { clazz -> runCatching { - shouldLoad(provider.type()) + shouldLoad(clazz) }.getOrElse { Firmament.logger.error("Could not determine whether to load a ${kClass.name} subclass", it) false } } - .mapNotNull { provider -> + .mapNotNull { clazz -> runCatching { - provider.get() + clazz.kotlin.objectInstance ?: clazz.getConstructor().newInstance() }.getOrElse { Firmament.logger.error( - "Could not load desired instance ${provider.type().name} for ${kClass.name}", + "Could not load desired instance ${clazz.name} for ${kClass.name}", it) null } diff --git a/src/main/kotlin/util/skyblock/Rarity.kt b/src/main/kotlin/util/skyblock/Rarity.kt index b19f371..f244ef6 100644 --- a/src/main/kotlin/util/skyblock/Rarity.kt +++ b/src/main/kotlin/util/skyblock/Rarity.kt @@ -15,6 +15,7 @@ import moe.nea.firmament.util.StringUtil.words import moe.nea.firmament.util.collections.lastNotNullOfOrNull import moe.nea.firmament.util.mc.loreAccordingToNbt import moe.nea.firmament.util.petData +import moe.nea.firmament.util.removeColorCodes import moe.nea.firmament.util.unformattedString typealias RepoRarity = io.github.moulberry.repo.data.Rarity @@ -87,6 +88,12 @@ enum class Rarity(vararg altNames: String) { fun fromPetItem(itemStack: ItemStack): Rarity? = itemStack.petData?.tier?.let(::fromNeuRepo) + fun fromStringLore(lore: List<String>): Rarity? { + return lore.lastNotNullOfOrNull { + it.removeColorCodes().words().firstNotNullOfOrNull(::fromString) + } + } + fun fromLore(lore: List<Text>): Rarity? = lore.lastNotNullOfOrNull { it.unformattedString.words() |