aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-03-11 12:44:59 +0100
committerLinnea Gräf <nea@nea.moe>2025-03-11 12:44:59 +0100
commit17a855a4bdfcca00b29f85981d8fb86968d9038c (patch)
tree4ecde192607e1b6fea54fc264a6b79a197ae8619 /src/main/kotlin/util
parent0765c8aee181dda89b08f89c4a7deb301f00f656 (diff)
downloadFirmament-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.kt2
-rw-r--r--src/main/kotlin/util/compatloader/CompatLoader.kt31
-rw-r--r--src/main/kotlin/util/skyblock/Rarity.kt7
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()