From c9c25b61560e6fb4e1ba2dfb1d5cc61b0ec9ddab Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Wed, 30 Oct 2024 16:35:19 +0100 Subject: Add warning for missing REI --- .../features/inventory/REIDependencyWarner.kt | 83 ++++++++++++++++++++++ src/main/kotlin/repo/RepoManager.kt | 2 +- src/main/kotlin/util/render/DrawContextExt.kt | 1 + src/main/kotlin/util/textutil.kt | 26 ++++++- 4 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/features/inventory/REIDependencyWarner.kt (limited to 'src/main/kotlin') diff --git a/src/main/kotlin/features/inventory/REIDependencyWarner.kt b/src/main/kotlin/features/inventory/REIDependencyWarner.kt new file mode 100644 index 0000000..1e9b1b8 --- /dev/null +++ b/src/main/kotlin/features/inventory/REIDependencyWarner.kt @@ -0,0 +1,83 @@ +package moe.nea.firmament.features.inventory + +import net.fabricmc.loader.api.FabricLoader +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlin.time.Duration.Companion.seconds +import net.minecraft.SharedConstants +import net.minecraft.text.ClickEvent +import net.minecraft.text.Text +import moe.nea.firmament.Firmament +import moe.nea.firmament.annotations.Subscribe +import moe.nea.firmament.commands.thenExecute +import moe.nea.firmament.events.CommandEvent +import moe.nea.firmament.events.SkyblockServerUpdateEvent +import moe.nea.firmament.repo.RepoManager +import moe.nea.firmament.util.MC +import moe.nea.firmament.util.SBData +import moe.nea.firmament.util.aqua +import moe.nea.firmament.util.bold +import moe.nea.firmament.util.clickCommand +import moe.nea.firmament.util.grey +import moe.nea.firmament.util.lime +import moe.nea.firmament.util.red +import moe.nea.firmament.util.white +import moe.nea.firmament.util.yellow + +object REIDependencyWarner { + val reiModId = "roughlyenoughitems" + val hasREI = FabricLoader.getInstance().isModLoaded(reiModId) + var sentWarning = false + + fun modrinthLink(slug: String) = + "https://modrinth.com/mod/$slug/versions?g=${SharedConstants.getGameVersion().name}&l=fabric" + + fun downloadButton(modName: String, modId: String, slug: String): Text { + val alreadyDownloaded = FabricLoader.getInstance().isModLoaded(modId) + return Text.literal(" - ") + .white() + .append(Text.literal("[").aqua()) + .append(Text.translatable("firmament.download", modName) + .styled { it.withClickEvent(ClickEvent(ClickEvent.Action.OPEN_URL, modrinthLink(slug))) } + .yellow() + .also { + if (alreadyDownloaded) + it.append(Text.translatable("firmament.download.already", modName) + .lime()) + }) + .append(Text.literal("]").aqua()) + } + + @Subscribe + fun checkREIDependency(event: SkyblockServerUpdateEvent) { + if (!SBData.isOnSkyblock) return + if (hasREI) return + if (sentWarning) return + sentWarning = true + Firmament.coroutineScope.launch { + delay(2.seconds) + // TODO: should we offer an automatic install that actually downloads the JARs and places them into the mod folder? + MC.sendChat( + Text.translatable("firmament.reiwarning").red().bold().append("\n") + .append(downloadButton("RoughlyEnoughItems", reiModId, "rei")).append("\n") + .append(downloadButton("Architectury API", "architectury", "architectury-api")).append("\n") + .append(downloadButton("Cloth Config API", "cloth-config", "cloth-config")).append("\n") + .append(Text.translatable("firmament.reiwarning.disable") + .clickCommand("/firm disablereiwarning") + .grey()) + ) + } + } + + @Subscribe + fun onSubcommand(event: CommandEvent.SubCommand) { + if (hasREI) return + event.subcommand("disablereiwarning") { + thenExecute { + RepoManager.Config.warnForMissingItemListMod = false + RepoManager.Config.save() + MC.sendChat(Text.translatable("firmament.reiwarning.disabled").yellow()) + } + } + } +} diff --git a/src/main/kotlin/repo/RepoManager.kt b/src/main/kotlin/repo/RepoManager.kt index b586548..9f8f422 100644 --- a/src/main/kotlin/repo/RepoManager.kt +++ b/src/main/kotlin/repo/RepoManager.kt @@ -40,7 +40,7 @@ object RepoManager { RepoManager.launchAsyncUpdate(true) } val alwaysSuperCraft by toggle("enable-super-craft") { true } - + var warnForMissingItemListMod by toggle("warn-for-missing-item-list-mod") { true } } val currentDownloadedSha by RepoDownloadManager::latestSavedVersionHash diff --git a/src/main/kotlin/util/render/DrawContextExt.kt b/src/main/kotlin/util/render/DrawContextExt.kt index 3e086b8..fc38aa6 100644 --- a/src/main/kotlin/util/render/DrawContextExt.kt +++ b/src/main/kotlin/util/render/DrawContextExt.kt @@ -12,6 +12,7 @@ fun DrawContext.isUntranslatedGuiDrawContext(): Boolean { fun DrawContext.drawLine(fromX: Int, fromY: Int, toX: Int, toY: Int, color: Color) { // TODO: push scissors + // TODO: use matrix translations and a different render layer if (toY < fromY) { drawLine(toX, toY, fromX, fromY, color) return diff --git a/src/main/kotlin/util/textutil.kt b/src/main/kotlin/util/textutil.kt index 252f708..a6a7e87 100644 --- a/src/main/kotlin/util/textutil.kt +++ b/src/main/kotlin/util/textutil.kt @@ -1,5 +1,6 @@ package moe.nea.firmament.util +import net.minecraft.text.ClickEvent import net.minecraft.text.MutableText import net.minecraft.text.PlainTextContent import net.minecraft.text.Text @@ -119,7 +120,30 @@ fun Text.iterator(): Sequence { fun Text.allSiblings(): List = listOf(this) + siblings.flatMap { it.allSiblings() } -fun MutableText.withColor(formatting: Formatting) = this.styled { it.withColor(formatting).withItalic(false) } +fun MutableText.withColor(formatting: Formatting): MutableText = this.styled { + it.withColor(formatting) + .withItalic(false) + .withBold(false) +} + +fun MutableText.blue() = withColor(Formatting.BLUE) +fun MutableText.aqua() = withColor(Formatting.AQUA) +fun MutableText.lime() = withColor(Formatting.GREEN) +fun MutableText.darkGreen() = withColor(Formatting.DARK_GREEN) +fun MutableText.yellow() = withColor(Formatting.YELLOW) +fun MutableText.grey() = withColor(Formatting.GRAY) +fun MutableText.red() = withColor(Formatting.RED) +fun MutableText.white() = withColor(Formatting.WHITE) +fun MutableText.bold(): MutableText = styled { it.withBold(true) } + + +fun MutableText.clickCommand(command: String): MutableText { + require(command.startsWith("/")) + return this.styled { + it.withClickEvent(ClickEvent(ClickEvent.Action.RUN_COMMAND, + "/firm disablereiwarning")) + } +} fun Text.transformEachRecursively(function: (Text) -> Text): Text { val c = this.content -- cgit