From efc2712ae60b20051202abe726f455acee6d31d2 Mon Sep 17 00:00:00 2001 From: GilbertzRivii Date: Fri, 5 Jun 2026 04:26:51 +0200 Subject: [PATCH 1/4] reduce GC by skipping empty handlers in recipe handling --- .../gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java | 3 +++ .../java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java index d996db0b908..72460b87afd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java @@ -183,6 +183,9 @@ public Map, List> handleRecipe(IO io, GTRecipe recip var entry = it.next(); var handlerList = getCapability(entry.getKey()); for (var handler : handlerList) { + if (io == IO.IN && handler.getTotalContentAmount() == 0) { + continue; + } var left = handler.handleRecipe(io, recipe, entry.getValue(), simulate); if (left == null) { it.remove(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index fb84163e48e..5ebd7289aa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -219,6 +219,9 @@ public static ActionResult handleRecipe(IRecipeCapabilityHolder holder, GTRecipe Map, List> contents, Map, Object2IntMap> chanceCaches, boolean isTick, boolean simulated) { + if (contents.isEmpty()) { + return ActionResult.PASS_NO_CONTENTS; + }; RecipeRunner runner = new RecipeRunner(recipe, io, isTick, holder, chanceCaches, simulated); var result = runner.handle(contents); From 99c381581d912e3d867b49d08dc469bf18464660 Mon Sep 17 00:00:00 2001 From: GilbertzRivii Date: Fri, 5 Jun 2026 08:10:42 +0200 Subject: [PATCH 2/4] spotless --- .../java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index 5ebd7289aa3..ec6068b2271 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -221,7 +221,7 @@ public static ActionResult handleRecipe(IRecipeCapabilityHolder holder, GTRecipe boolean isTick, boolean simulated) { if (contents.isEmpty()) { return ActionResult.PASS_NO_CONTENTS; - }; + } ; RecipeRunner runner = new RecipeRunner(recipe, io, isTick, holder, chanceCaches, simulated); var result = runner.handle(contents); From 9e72367be70afc265ccfa8efd7ca9b0dc560b2d2 Mon Sep 17 00:00:00 2001 From: GilbertzRivii Date: Wed, 10 Jun 2026 21:19:10 +0200 Subject: [PATCH 3/4] remove typo --- .../java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index ec6068b2271..fc16f00611f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -221,7 +221,7 @@ public static ActionResult handleRecipe(IRecipeCapabilityHolder holder, GTRecipe boolean isTick, boolean simulated) { if (contents.isEmpty()) { return ActionResult.PASS_NO_CONTENTS; - } ; + } RecipeRunner runner = new RecipeRunner(recipe, io, isTick, holder, chanceCaches, simulated); var result = runner.handle(contents); From d682f851825cec938ba9412a8f0d44774dc59b63 Mon Sep 17 00:00:00 2001 From: GilbertzRivii Date: Sat, 13 Jun 2026 18:34:25 +0200 Subject: [PATCH 4/4] added a check so cwu wont break --- .../gtceu/api/capability/recipe/CWURecipeCapability.java | 5 +++++ .../gtceu/api/capability/recipe/RecipeCapability.java | 9 +++++++++ .../gtceu/api/machine/trait/RecipeHandlerList.java | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java index a5409ab7742..b3cb6396fcf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java @@ -32,6 +32,11 @@ public Integer copyWithModifier(Integer content, ContentModifier modifier) { return modifier.apply(content); } + @Override + public boolean skipEmptyContentCheck() { + return true; + } + @Override public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, boolean isInput, MutableInt yOffset) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java index 6d2a54badc1..a3d77f027ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java @@ -223,4 +223,13 @@ public boolean isTickSlot(int index, IO io, GTRecipe recipe) { public boolean shouldBypassDistinct() { return true; } + + /** + * Should handlers of this capability be tried even when {@link IRecipeHandler#getTotalContentAmount()} is zero? + * E.g. should this capability bypass the empty handler optimization for rate-based capabilities. + * for example: CWU, where stored amount is zero but the handler can still provide computation. + */ + public boolean skipEmptyContentCheck() { + return false; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java index 72460b87afd..3a64c998182 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java @@ -183,7 +183,8 @@ public Map, List> handleRecipe(IO io, GTRecipe recip var entry = it.next(); var handlerList = getCapability(entry.getKey()); for (var handler : handlerList) { - if (io == IO.IN && handler.getTotalContentAmount() == 0) { + if (io == IO.IN && handler.getTotalContentAmount() == 0 && + !handler.getCapability().skipEmptyContentCheck()) { continue; } var left = handler.handleRecipe(io, recipe, entry.getValue(), simulate);