From d670ed6bb054945d16a9d1ea2a32d469b524398a Mon Sep 17 00:00:00 2001 From: nea Date: Wed, 31 May 2023 01:05:17 +0200 Subject: Add option to auto rebuild resources before F3+T --- .../nea/firmament/mixins/devenv/MixinKeyboard.java | 18 +++++++ .../moe/nea/firmament/features/FeatureManager.kt | 3 ++ .../firmament/features/debug/DeveloperFeatures.kt | 56 ++++++++++++++++++++++ .../resources/assets/firmament/lang/en_us.json | 4 ++ 4 files changed, 81 insertions(+) create mode 100644 src/main/java/moe/nea/firmament/mixins/devenv/MixinKeyboard.java create mode 100644 src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt diff --git a/src/main/java/moe/nea/firmament/mixins/devenv/MixinKeyboard.java b/src/main/java/moe/nea/firmament/mixins/devenv/MixinKeyboard.java new file mode 100644 index 0000000..b52af9b --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/devenv/MixinKeyboard.java @@ -0,0 +1,18 @@ +package moe.nea.firmament.mixins.devenv; + +import moe.nea.firmament.features.debug.DeveloperFeatures; +import net.minecraft.client.Keyboard; +import net.minecraft.client.MinecraftClient; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.concurrent.CompletableFuture; + +@Mixin(Keyboard.class) +public class MixinKeyboard { + @Redirect(method = "processF3", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reloadResources()Ljava/util/concurrent/CompletableFuture;")) + public CompletableFuture redirectReloadResources(MinecraftClient instance) { + return DeveloperFeatures.hookOnBeforeResourceReload(instance); + } +} diff --git a/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt b/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt index 5f76c07..dfbb5ed 100644 --- a/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt +++ b/src/main/kotlin/moe/nea/firmament/features/FeatureManager.kt @@ -21,6 +21,7 @@ package moe.nea.firmament.features import kotlinx.serialization.Serializable import kotlinx.serialization.serializer import moe.nea.firmament.Firmament +import moe.nea.firmament.features.debug.DeveloperFeatures import moe.nea.firmament.features.fishing.FishingWarning import moe.nea.firmament.features.inventory.SlotLocking import moe.nea.firmament.features.world.FairySouls @@ -48,6 +49,8 @@ object FeatureManager : DataHolder(serializer(), "feature loadFeature(FairySouls) loadFeature(FishingWarning) loadFeature(SlotLocking) + if (Firmament.DEBUG) + loadFeature(DeveloperFeatures) hasAutoloaded = true } } diff --git a/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt b/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt new file mode 100644 index 0000000..ff69cd1 --- /dev/null +++ b/src/main/kotlin/moe/nea/firmament/features/debug/DeveloperFeatures.kt @@ -0,0 +1,56 @@ +package moe.nea.firmament.features.debug + +import java.nio.file.Path +import java.util.concurrent.CompletableFuture +import kotlin.io.path.absolute +import kotlin.io.path.exists +import net.minecraft.client.MinecraftClient +import net.minecraft.text.Text +import moe.nea.firmament.features.FirmamentFeature +import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.MC +import moe.nea.firmament.util.TimeMark +import moe.nea.firmament.util.iterate + +object DeveloperFeatures : FirmamentFeature { + override val name: String + get() = "developer" + override val identifier: String + get() = "developer" + override val config: TConfig + get() = TConfig + override val defaultEnabled: Boolean + get() = false + + val gradleDir by lazy { + Path.of(".").absolute() + .iterate { it.parent } + .find { it.resolve("settings.gradle.kts").exists() }!! + } + + object TConfig : ManagedConfig("developer") { + val autoRebuildResources by toggle("auto-rebuild") { false } + } + + @JvmStatic + fun hookOnBeforeResourceReload(client: MinecraftClient): CompletableFuture { + val reloadFuture = if (TConfig.autoRebuildResources && isEnabled) { + val builder = ProcessBuilder("./gradlew", ":processResources") + builder.directory(gradleDir.toFile()) + builder.inheritIO() + val process = builder.start() + MC.player?.sendMessage(Text.translatable("firmament.dev.resourcerebuild.start")) + val startTime = TimeMark.now() + process.toHandle().onExit().thenApply { + MC.player?.sendMessage(Text.translatable("firmament.dev.resourcerebuild.done", startTime.passedTime())) + Unit + } + } else { + CompletableFuture.completedFuture(Unit) + } + return reloadFuture.thenCompose { client.reloadResources() } + } + + override fun onLoad() { + } +} diff --git a/src/main/resources/assets/firmament/lang/en_us.json b/src/main/resources/assets/firmament/lang/en_us.json index db720a0..bd6c933 100644 --- a/src/main/resources/assets/firmament/lang/en_us.json +++ b/src/main/resources/assets/firmament/lang/en_us.json @@ -1,4 +1,8 @@ { + "firmament.dev.resourcerebuild.start": "Invoking gradle resource rebuild (./gradlew :processResources)", + "firmament.dev.resourcerebuild.done": "Gradle resource rebuild done in %s", + "firmament.config.developer": "Developer Settings", + "firmament.config.developer.auto-rebuild": "Automatically rebuild resources", "firmament.price": "Checking price for %s", "firmament.price.bazaar": "Bazaar stats:", "firmament.price.bazaar.productid": "Stock id: %s", -- cgit