From 6b7d3fba94b5f932b4ec3684da9c131213133be5 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Mon, 19 Jan 2026 20:28:06 +0200 Subject: [PATCH 1/3] Add a hook for running `./gradlew processResources` when F3+T is pressed --- .../gtceu/config/ConfigHolder.java | 4 ++ .../dev/client/KeyboardHandlerMixin.java | 25 +++++++ .../gtceu/data/lang/LangHandler.java | 3 + .../utils/dev/ResourceReloadDetector.java | 65 +++++++++++++++++++ src/main/resources/gtceu.mixins.json | 1 + 5 files changed, 98 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 0956ffa83be..dff83c36350 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -850,6 +850,10 @@ public static class DeveloperConfigs { @Configurable @Configurable.Comment({ "Dump all registered GT models/blockstates/etc?", "Default: false" }) public boolean dumpAssets = false; + @Configurable + @Configurable.Comment({ "Executes ./gradlew :processResources when F3+T is pressed", + "Only works in a development environment", "Default: false" }) + public boolean autoRebuildResources = false; } public static class RendererConfigs { diff --git a/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java new file mode 100644 index 00000000000..e06b0e59053 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/core/mixins/dev/client/KeyboardHandlerMixin.java @@ -0,0 +1,25 @@ +package com.gregtechceu.gtceu.core.mixins.dev.client; + +import com.gregtechceu.gtceu.utils.dev.ResourceReloadDetector; + +import net.minecraft.client.KeyboardHandler; +import net.minecraft.client.Minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.concurrent.CompletableFuture; + +@Mixin(KeyboardHandler.class) +public abstract class KeyboardHandlerMixin { + + @WrapOperation(method = "handleDebugKeys", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/Minecraft;reloadResourcePacks()Ljava/util/concurrent/CompletableFuture;")) + private CompletableFuture gtceu$hookResourceReload(Minecraft instance, + Operation> original) { + return ResourceReloadDetector.regenerateResourcesOnReload(() -> original.call(instance)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 610acc56226..327b864f12d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -1233,6 +1233,9 @@ public static void init(RegistrateLangProvider provider) { provider.add("gtceu.key.enable_step_assist", "Enable StepAssist"); provider.add("gtceu.debug.f3_h.enabled", "GregTech has modified the debug info! For Developers: enable the misc:debug config option in the GregTech config file to see more"); + provider.add("gtceu.debug.resource_rebuild.done", "Gradle resource rebuild done in %s"); + provider.add("gtceu.debug.resource_rebuild.start", + "Invoking gradle resource rebuild (./gradlew :processResources)"); provider.add("config.jade.plugin_gtceu.controllable_provider", "[GTCEu] Controllable"); provider.add("config.jade.plugin_gtceu.workable_provider", "[GTCEu] Workable"); provider.add("config.jade.plugin_gtceu.battery_info", "[GTCEu] Battery info"); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java new file mode 100644 index 00000000000..66d75c84979 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java @@ -0,0 +1,65 @@ +package com.gregtechceu.gtceu.utils.dev; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; + +import com.sun.jna.platform.win32.*; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class ResourceReloadDetector { + + private static final Path gradleDir = findGradleDir(); + + public static CompletableFuture regenerateResourcesOnReload(Supplier> reloadFuture) { + if (!ConfigHolder.INSTANCE.dev.autoRebuildResources || !GTCEu.isDev() || gradleDir == null) { + return reloadFuture.get(); + } + ProcessBuilder builder = switch (Util.getPlatform()) { + case WINDOWS -> new ProcessBuilder("cmd.exe", "/c", "gradlew.bat", ":processResources"); + default -> new ProcessBuilder("./gradlew", ":processResources"); + }; + builder.directory(gradleDir.toFile()); + builder.inheritIO(); + Process process; + try { + process = builder.start(); + } catch (IOException exception) { + GTCEu.LOGGER.error("Cound not run ./gradlew :processResources", exception); + GTCEu.LOGGER.error("Message the GTCEu developers about this!"); + return reloadFuture.get(); + } + Minecraft.getInstance().player.sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.start")); + Instant start = Instant.now(); + // wait for the resource reload to finish, then send chat message, then let MC actually reload resources + return process.toHandle().onExit() + .thenRun(() -> Minecraft.getInstance().player + .sendSystemMessage(Component.translatable("gtceu.debug.resource_rebuild.done", + Duration.between(start, Instant.now())))) + .thenCompose($ -> reloadFuture.get()); + } + + private static @Nullable Path findGradleDir() { + Path path = Path.of(".").toAbsolutePath(); + do { + if (Files.isRegularFile(path.resolve("settings.gradle")) || + Files.isRegularFile(path.resolve("settings.gradle.kts"))) { + return path; + } + path = path.getParent(); + } while (path.getParent() != null); + + return null; + } +} diff --git a/src/main/resources/gtceu.mixins.json b/src/main/resources/gtceu.mixins.json index 3ade6f7cca3..0e1923c87a9 100644 --- a/src/main/resources/gtceu.mixins.json +++ b/src/main/resources/gtceu.mixins.json @@ -21,6 +21,7 @@ "client.MultiPlayerGameModeMixin", "client.PlayerInfoAccessor", "client.VariantDeserializerMixin", + "dev.client.KeyboardHandlerMixin", "ftbchunks.FTBChunksClientMixin", "ftbchunks.LargeMapScreenMixin", "ftbchunks.RegionMapPanelMixin", From c194e85d4cc13969ea7c59e5a4efc61232908182 Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Wed, 21 Jan 2026 10:34:03 +0100 Subject: [PATCH 2/3] Add check to not cache invalid recipes (#4486) --- .../com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index 2b97ff75302..1483937c722 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -344,6 +344,10 @@ protected void handleSearchingRecipes(@NotNull Iterator matches) { if (checkMatchedRecipeAvailable(match)) return; + if (!matchRecipe(match).isSuccess()) { + continue; + } + // cache matching recipes. if (lastFailedMatches == null) { lastFailedMatches = new ArrayList<>(); From 91a1a90d89e2a52ff02f11b33eecb8e826ae8e22 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Sat, 24 Jan 2026 15:49:14 +0200 Subject: [PATCH 3/3] Add `@ApiStatus.Internal` annotation to ResourceReloadDetector --- .../gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java index 66d75c84979..64baf26b5a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/dev/ResourceReloadDetector.java @@ -8,6 +8,7 @@ import net.minecraft.network.chat.Component; import com.sun.jna.platform.win32.*; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -18,10 +19,12 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; +@ApiStatus.Internal public class ResourceReloadDetector { private static final Path gradleDir = findGradleDir(); + @ApiStatus.Internal public static CompletableFuture regenerateResourcesOnReload(Supplier> reloadFuture) { if (!ConfigHolder.INSTANCE.dev.autoRebuildResources || !GTCEu.isDev() || gradleDir == null) { return reloadFuture.get();