package moe.nea.firmament.features.texturepack import net.minecraft.server.packs.resources.ResourceManager import net.minecraft.server.packs.resources.SimplePreparableReloadListener import net.minecraft.network.chat.Component import net.minecraft.util.profiling.ProfilerFiller import moe.nea.firmament.Firmament import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.FinalizeResourceManagerEvent import moe.nea.firmament.util.ErrorUtil.intoCatch object CustomTextReplacements : SimplePreparableReloadListener>() { override fun prepare( manager: ResourceManager, profiler: ProfilerFiller ): List { return manager.listResources("overrides/texts") { it.namespace == "firmskyblock" && it.path.endsWith(".json") } .mapNotNull { Firmament.tryDecodeJsonFromStream(it.value.open()) .intoCatch("Failed to load text override from ${it.key}").orNull() } } var textReplacers: List = listOf() override fun apply( prepared: List, manager: ResourceManager, profiler: ProfilerFiller ) { this.textReplacers = prepared } @JvmStatic fun replaceTexts(texts: List): List { return texts.map { replaceText(it) } } @JvmStatic fun replaceText(text: Component): Component { // TODO: add a config option for this val rawText = text.string var text = text for (replacer in textReplacers) { if (!replacer.match.matches(rawText)) continue text = replacer.replaceText(text) } return text } @Subscribe fun onReloadStart(event: FinalizeResourceManagerEvent) { event.resourceManager.registerReloadListener(this) } }