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 d996db0b908..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,6 +183,10 @@ 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 && + !handler.getCapability().skipEmptyContentCheck()) { + 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..fc16f00611f 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);