Skip to content

Commit f80cbed

Browse files
authored
Turbine Energy Voiding (#4177)
1 parent e0604d8 commit f80cbed

File tree

7 files changed

+79
-51
lines changed

7 files changed

+79
-51
lines changed

src/generated/resources/assets/gtceu/lang/en_ud.json

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,6 +2336,7 @@
23362336
"gtceu.gui.adv_stocking_config.min_item_count": "buıןןnԀ pǝʇɐɯoʇnⱯ ɹoɟ ǝzıS ʞɔɐʇS ɯǝʇI ɯnɯıuıW",
23372337
"gtceu.gui.adv_stocking_config.ticks_per_cycle": "sǝʇɐpdn ʇsıן ɯǝʇı uǝǝʍʇǝq ʎɐןǝᗡ",
23382338
"gtceu.gui.adv_stocking_config.title": "buıʞɔoʇS ɔıʇɐɯoʇnⱯ ǝɹnbıɟuoƆ",
2339+
"gtceu.gui.all_voiding": "ןןⱯɔ§ buıpıoΛㄥ§",
23392340
"gtceu.gui.auto_output.name": "oʇnɐ",
23402341
"gtceu.gui.central_monitor.group": "%s :dnoɹ⅁",
23412342
"gtceu.gui.central_monitor.group_default_name": "%d# dnoɹ⅁",
@@ -2405,6 +2406,7 @@
24052406
"gtceu.gui.fluid_auto_output.tooltip.enabled": "pǝןqɐuƎ ʇndʇnO-oʇnⱯ pınןℲ",
24062407
"gtceu.gui.fluid_lock.tooltip.disabled": "pǝןqɐsıᗡ buıʞɔoꞀ pınןℲ",
24072408
"gtceu.gui.fluid_lock.tooltip.enabled": "pǝןqɐuƎ buıʞɔoꞀ pınןℲ",
2409+
"gtceu.gui.fluid_voiding": "spınןℲ6§ buıpıoΛㄥ§",
24082410
"gtceu.gui.fluid_voiding_partial.tooltip.disabled": "pǝןqɐsıᗡ buıpıoΛ pınןℲ",
24092411
"gtceu.gui.fluid_voiding_partial.tooltip.enabled": "pǝןqɐuƎ buıpıoΛ pınןℲ",
24102412
"gtceu.gui.fuel_amount": ":ʇunoɯⱯ ןǝnℲ",
@@ -2416,6 +2418,7 @@
24162418
"gtceu.gui.item_auto_output.tooltip.enabled": "pǝןqɐuƎ ʇndʇnO-oʇnⱯ ɯǝʇI",
24172419
"gtceu.gui.item_lock.tooltip.disabled": "pǝןqɐsıᗡ buıʞɔoꞀ ɯǝʇI",
24182420
"gtceu.gui.item_lock.tooltip.enabled": "pǝןqɐuƎ buıʞɔoꞀ ɯǝʇI",
2421+
"gtceu.gui.item_voiding": "sɯǝʇI9§ buıpıoΛㄥ§",
24192422
"gtceu.gui.item_voiding_partial.tooltip.disabled": "pǝןqɐsıᗡ buıpıoΛ ɯǝʇI",
24202423
"gtceu.gui.item_voiding_partial.tooltip.enabled": "pǝןqɐuƎ buıpıoΛ ɯǝʇI",
24212424
"gtceu.gui.machinemode": "%s :ǝpoW ǝuıɥɔɐW ǝʌıʇɔⱯ",
@@ -2424,14 +2427,8 @@
24242427
"gtceu.gui.me_bus.auto_pull_button": "ƎW ɯoɹɟ buıןןnd ɯǝʇı ɔıʇɐɯoʇnɐ ǝןbboʇ oʇ ʞɔıןƆ",
24252428
"gtceu.gui.me_network.offline": "ɹ§ǝuıןɟɟOㄣ§ :snʇɐʇS ʞɹoʍʇǝN",
24262429
"gtceu.gui.me_network.online": "ɹ§ǝuıןuOᄅ§ :snʇɐʇS ʞɹoʍʇǝN",
2427-
"gtceu.gui.multiblock_all_voiding.0": "ǝpoW buıpıoΛ",
2428-
"gtceu.gui.multiblock_all_voiding.1": "ןןⱯ buıpıoΛㄥ§",
2429-
"gtceu.gui.multiblock_fluid_voiding.0": "ǝpoW buıpıoΛ",
2430-
"gtceu.gui.multiblock_fluid_voiding.1": "spınןℲ6§ buıpıoΛㄥ§",
2431-
"gtceu.gui.multiblock_item_voiding.0": "ǝpoW buıpıoΛ",
2432-
"gtceu.gui.multiblock_item_voiding.1": "sɯǝʇI9§ buıpıoΛㄥ§",
2433-
"gtceu.gui.multiblock_no_voiding.0": "ǝpoW buıpıoΛ",
2434-
"gtceu.gui.multiblock_no_voiding.1": "buıɥʇoN buıpıoΛㄥ§",
2430+
"gtceu.gui.multiblock.voiding_mode": ":ǝpoW buıpıoΛ",
2431+
"gtceu.gui.no_voiding": "buıɥʇoN buıpıoΛㄥ§",
24352432
"gtceu.gui.output_setting.title": "sbuıʇʇǝS ʇndʇnO",
24362433
"gtceu.gui.output_setting.tooltips.0": "ʇndʇno oʇnɐ ɯǝʇı ǝɥʇ ǝunʇ oʇ ʞɔıןɔ-ʇɟǝן",
24372434
"gtceu.gui.output_setting.tooltips.1": "˙ʇndʇno oʇnɐ pınןɟ ǝɥʇ ǝunʇ oʇ ʞɔıןɔ-ʇɥbıɹ",

src/generated/resources/assets/gtceu/lang/en_us.json

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,6 +2336,7 @@
23362336
"gtceu.gui.adv_stocking_config.min_item_count": "Minimum Item Stack Size for Automated Pulling",
23372337
"gtceu.gui.adv_stocking_config.ticks_per_cycle": "Delay between item list updates",
23382338
"gtceu.gui.adv_stocking_config.title": "Configure Automatic Stocking",
2339+
"gtceu.gui.all_voiding": "§7Voiding §cAll",
23392340
"gtceu.gui.auto_output.name": "auto",
23402341
"gtceu.gui.central_monitor.group": "Group: %s",
23412342
"gtceu.gui.central_monitor.group_default_name": "Group #%d",
@@ -2405,6 +2406,7 @@
24052406
"gtceu.gui.fluid_auto_output.tooltip.enabled": "Fluid Auto-Output Enabled",
24062407
"gtceu.gui.fluid_lock.tooltip.disabled": "Fluid Locking Disabled",
24072408
"gtceu.gui.fluid_lock.tooltip.enabled": "Fluid Locking Enabled",
2409+
"gtceu.gui.fluid_voiding": "§7Voiding §9Fluids",
24082410
"gtceu.gui.fluid_voiding_partial.tooltip.disabled": "Fluid Voiding Disabled",
24092411
"gtceu.gui.fluid_voiding_partial.tooltip.enabled": "Fluid Voiding Enabled",
24102412
"gtceu.gui.fuel_amount": "Fuel Amount:",
@@ -2416,6 +2418,7 @@
24162418
"gtceu.gui.item_auto_output.tooltip.enabled": "Item Auto-Output Enabled",
24172419
"gtceu.gui.item_lock.tooltip.disabled": "Item Locking Disabled",
24182420
"gtceu.gui.item_lock.tooltip.enabled": "Item Locking Enabled",
2421+
"gtceu.gui.item_voiding": "§7Voiding §6Items",
24192422
"gtceu.gui.item_voiding_partial.tooltip.disabled": "Item Voiding Disabled",
24202423
"gtceu.gui.item_voiding_partial.tooltip.enabled": "Item Voiding Enabled",
24212424
"gtceu.gui.machinemode": "Active Machine Mode: %s",
@@ -2424,14 +2427,8 @@
24242427
"gtceu.gui.me_bus.auto_pull_button": "Click to toggle automatic item pulling from ME",
24252428
"gtceu.gui.me_network.offline": "Network Status: §4Offline§r",
24262429
"gtceu.gui.me_network.online": "Network Status: §2Online§r",
2427-
"gtceu.gui.multiblock_all_voiding.0": "Voiding Mode",
2428-
"gtceu.gui.multiblock_all_voiding.1": "§7Voiding All",
2429-
"gtceu.gui.multiblock_fluid_voiding.0": "Voiding Mode",
2430-
"gtceu.gui.multiblock_fluid_voiding.1": "§7Voiding §9Fluids",
2431-
"gtceu.gui.multiblock_item_voiding.0": "Voiding Mode",
2432-
"gtceu.gui.multiblock_item_voiding.1": "§7Voiding §6Items",
2433-
"gtceu.gui.multiblock_no_voiding.0": "Voiding Mode",
2434-
"gtceu.gui.multiblock_no_voiding.1": "§7Voiding Nothing",
2430+
"gtceu.gui.multiblock.voiding_mode": "Voiding Mode:",
2431+
"gtceu.gui.no_voiding": "§7Voiding Nothing",
24352432
"gtceu.gui.output_setting.title": "Output Settings",
24362433
"gtceu.gui.output_setting.tooltips.0": "left-click to tune the item auto output",
24372434
"gtceu.gui.output_setting.tooltips.1": "right-click to tune the fluid auto output.",

src/main/java/com/gregtechceu/gtceu/api/machine/feature/IVoidable.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel;
88
import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget;
99
import com.gregtechceu.gtceu.api.machine.fancyconfigurator.FancySelectorConfigurator;
10-
import com.gregtechceu.gtceu.data.lang.LangHandler;
1110

1211
import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture;
1312

13+
import net.minecraft.network.chat.Component;
1414
import net.minecraft.util.StringRepresentable;
1515

1616
import it.unimi.dsi.fastutil.objects.Reference2IntMap;
@@ -40,15 +40,18 @@ default VoidingMode getVoidingMode() {
4040
static void attachConfigurators(ConfiguratorPanel configuratorPanel, IVoidable controller) {
4141
configuratorPanel
4242
.attachConfigurators(new FancySelectorConfigurator<>(VoidingMode.VALUES, controller.getVoidingMode(),
43-
controller::setVoidingMode).setTooltip(m -> (List) LangHandler.getMultiLang(m.localeName)));
43+
controller::setVoidingMode)
44+
.setTooltip(m -> List.of(Component.translatable("gtceu.gui.multiblock.voiding_mode"),
45+
Component.translatable(m.localeName))));
4446
}
4547

4648
enum VoidingMode implements StringRepresentable, EnumSelectorWidget.SelectableEnum {
4749

48-
VOID_NONE("gtceu.gui.multiblock_no_voiding", cap -> false),
49-
VOID_ITEMS("gtceu.gui.multiblock_item_voiding", cap -> cap == ItemRecipeCapability.CAP),
50-
VOID_FLUIDS("gtceu.gui.multiblock_fluid_voiding", cap -> cap == FluidRecipeCapability.CAP),
51-
VOID_ALL("gtceu.gui.multiblock_all_voiding", cap -> true);
50+
VOID_NONE("gtceu.gui.no_voiding", cap -> false),
51+
VOID_ITEMS("gtceu.gui.item_voiding", cap -> cap == ItemRecipeCapability.CAP),
52+
VOID_FLUIDS("gtceu.gui.fluid_voiding", cap -> cap == FluidRecipeCapability.CAP),
53+
VOID_ITEMS_FLUIDS("gtceu.gui.all_voiding",
54+
cap -> cap == ItemRecipeCapability.CAP || cap == FluidRecipeCapability.CAP);
5255

5356
public static final VoidingMode[] VALUES = values();
5457

@@ -60,7 +63,7 @@ enum VoidingMode implements StringRepresentable, EnumSelectorWidget.SelectableEn
6063
VoidingMode(String name, Predicate<RecipeCapability<?>> canVoid) {
6164
this.localeName = name;
6265
this.canVoid = canVoid;
63-
this.icon = GuiTextures.BUTTON_VOID_MULTIBLOCK.getSubTexture(0, ordinal(), 1, 0.25);
66+
this.icon = GuiTextures.BUTTON_VOID_MULTIBLOCK.getSubTexture(0, ordinal() * 0.25, 1, 0.25);
6467
}
6568

6669
public boolean canVoid(RecipeCapability<?> capability) {

src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,21 +138,24 @@ private ActionResult handleContents() {
138138
if (res.isEmpty()) break;
139139
}
140140
}
141-
if (res.isEmpty()) {
142-
if (!simulated) {
143-
// Actually consume the contents of this handler and also all the bypassed handlers
144-
recipeContents = handler.handleRecipe(io, recipe, recipeContents, false);
145-
if (!recipeContents.isEmpty()) {
146-
for (RecipeHandlerList bypassHandler : handlerGroups.getOrDefault(BYPASS_DISTINCT,
147-
Collections.emptyList())) {
148-
recipeContents = bypassHandler.handleRecipe(io, recipe, recipeContents, false);
149-
if (recipeContents.isEmpty()) break;
150-
}
141+
if (io == IO.OUT) {
142+
if (hasAnyNonVoidingContents(res)) continue;
143+
} else if (io == IO.IN) {
144+
if (!res.isEmpty()) continue;
145+
}
146+
if (!simulated) {
147+
// Actually consume the contents of this handler and also all the bypassed handlers
148+
recipeContents = handler.handleRecipe(io, recipe, recipeContents, false);
149+
if (!recipeContents.isEmpty()) {
150+
for (RecipeHandlerList bypassHandler : handlerGroups.getOrDefault(BYPASS_DISTINCT,
151+
Collections.emptyList())) {
152+
recipeContents = bypassHandler.handleRecipe(io, recipe, recipeContents, false);
153+
if (recipeContents.isEmpty()) break;
151154
}
152155
}
153-
recipeContents.clear();
154-
return ActionResult.SUCCESS;
155156
}
157+
recipeContents.clear();
158+
return ActionResult.SUCCESS;
156159
}
157160

158161
// Check the other groups. For every group, try consuming the ingredients,
@@ -162,12 +165,10 @@ private ActionResult handleContents() {
162165

163166
// List to keep track of the remaining items for this RecipeHandlerGroup
164167
Map<RecipeCapability<?>, List<Object>> copiedRecipeContents = searchRecipeContents;
165-
boolean found = false;
166168

167169
for (RecipeHandlerList handler : handlerListEntry.getValue()) {
168170
copiedRecipeContents = handler.handleRecipe(io, recipe, copiedRecipeContents, true);
169171
if (copiedRecipeContents.isEmpty()) {
170-
found = true;
171172
break;
172173
}
173174
}
@@ -177,13 +178,16 @@ private ActionResult handleContents() {
177178
Collections.emptyList())) {
178179
copiedRecipeContents = bypassHandler.handleRecipe(io, recipe, copiedRecipeContents, true);
179180
if (copiedRecipeContents.isEmpty()) {
180-
found = true;
181181
break;
182182
}
183183
}
184184
}
185185

186-
if (!found) continue;
186+
if (io == IO.OUT) {
187+
if (hasAnyNonVoidingContents(copiedRecipeContents)) continue;
188+
} else if (io == IO.IN) {
189+
if (!copiedRecipeContents.isEmpty()) continue;
190+
}
187191
if (simulated) return ActionResult.SUCCESS;
188192
// Start actually removing items.
189193
// Keep track of the remaining items for this RecipeHandlerGroup
@@ -208,11 +212,37 @@ private ActionResult handleContents() {
208212
}
209213

210214
for (var entry : recipeContents.entrySet()) {
215+
// void excess real output contents if it can be voided
216+
if (!simulated && io == IO.OUT && this.outputVoid.test(entry.getKey())) {
217+
entry.getValue().clear();
218+
}
211219
if (entry.getValue() != null && !entry.getValue().isEmpty()) {
212220
return ActionResult.fail(null, entry.getKey(), io);
213221
}
214222
}
215223

224+
// if, post voiding, we don't have stuff, pass instead of fail
225+
boolean containsStuff = false;
226+
for (var entry : recipeContents.entrySet()) {
227+
if (!entry.getValue().isEmpty()) {
228+
containsStuff = true;
229+
break;
230+
}
231+
}
232+
if (!containsStuff) {
233+
return ActionResult.PASS_NO_CONTENTS;
234+
}
235+
216236
return ActionResult.FAIL_NO_REASON;
217237
}
238+
239+
private boolean hasAnyNonVoidingContents(Map<RecipeCapability<?>, List<Object>> contents) {
240+
for (var entry : contents.entrySet()) {
241+
if (outputVoid.test(entry.getKey())) continue;
242+
if (!(entry.getValue() == null || entry.getValue().isEmpty())) {
243+
return true;
244+
}
245+
}
246+
return false;
247+
}
218248
}

src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public int limitFluidParallel(GTRecipe recipe, int multiplier, boolean tick) {
151151

152152
while (minMultiplier != maxMultiplier) {
153153
GTRecipe copy = modifyOutputs(recipe, ContentModifier.multiplier(multiplier));
154-
boolean filled = getRecipeLogic().applyFluidOutputs(copy, FluidAction.SIMULATE);
154+
boolean filled = getRecipeLogic().applyFluidOutputs(copy, FluidAction.SIMULATE, getVoidingMode());
155155
int[] bin = ParallelLogic.adjustMultiplier(filled, minMultiplier, multiplier, maxMultiplier);
156156
minMultiplier = bin[0];
157157
multiplier = bin[1];
@@ -218,7 +218,7 @@ private ActionResult matchDTRecipe(GTRecipe recipe) {
218218
if (!result.isSuccess()) return result;
219219
}
220220

221-
if (!applyFluidOutputs(recipe, FluidAction.SIMULATE)) {
221+
if (!applyFluidOutputs(recipe, FluidAction.SIMULATE, machine.getVoidingMode())) {
222222
return ActionResult.fail(Component.translatable("gtceu.recipe_logic.insufficient_out")
223223
.append(": ")
224224
.append(FluidRecipeCapability.CAP.getName()), FluidRecipeCapability.CAP, IO.OUT);
@@ -261,7 +261,7 @@ protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) {
261261
RecipeHelper.handleRecipe(this.machine, recipe, io, out, chanceCaches, false, false);
262262
}
263263

264-
if (applyFluidOutputs(recipe, FluidAction.EXECUTE)) {
264+
if (applyFluidOutputs(recipe, FluidAction.EXECUTE, this.machine.getVoidingMode())) {
265265
workingRecipe = null;
266266
return ActionResult.SUCCESS;
267267
}
@@ -271,7 +271,7 @@ protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) {
271271
.append(FluidRecipeCapability.CAP.getName()), FluidRecipeCapability.CAP, IO.OUT);
272272
}
273273

274-
private boolean applyFluidOutputs(GTRecipe recipe, FluidAction action) {
274+
private boolean applyFluidOutputs(GTRecipe recipe, FluidAction action, VoidingMode voidMode) {
275275
var fluids = recipe.getOutputContents(FluidRecipeCapability.CAP)
276276
.stream()
277277
.map(Content::getContent)
@@ -297,7 +297,7 @@ private boolean applyFluidOutputs(GTRecipe recipe, FluidAction action) {
297297
int filled = (handler instanceof NotifiableFluidTank nft) ?
298298
nft.fillInternal(fluid, action) :
299299
handler.fill(fluid, action);
300-
if (filled != fluid.getAmount()) valid = false;
300+
if (filled != fluid.getAmount() && !voidMode.canVoid(FluidRecipeCapability.CAP)) valid = false;
301301
if (action.simulate() && !valid) break;
302302
}
303303
return valid;

src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.gregtechceu.gtceu.api.GTValues;
44
import com.gregtechceu.gtceu.api.capability.ITurbineMachine;
5-
import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability;
65
import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability;
76
import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity;
87
import com.gregtechceu.gtceu.api.machine.MetaMachine;
@@ -182,7 +181,8 @@ public boolean regressWhenWaiting() {
182181

183182
@Override
184183
public boolean canVoidRecipeOutputs(RecipeCapability<?> capability) {
185-
return capability != EURecipeCapability.CAP;
184+
// void both eu and fluid tick outputs
185+
return true;
186186
}
187187

188188
//////////////////////////////////////

src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,11 +1021,12 @@ public static void init(RegistrateLangProvider provider) {
10211021
"Chunk Mode Enabled: Click to Disable.\n§7Switching requires an idle machine.");
10221022
multilineLang(provider, "gtceu.gui.chunkmode.disabled",
10231023
"Chunk Mode Disabled: Click to Enable.\n§7Switching requires an idle machine.");
1024-
multilineLang(provider, "gtceu.gui.multiblock_item_voiding", "Voiding Mode\n§7Voiding §6Items");
1025-
multilineLang(provider, "gtceu.gui.multiblock_fluid_voiding", "Voiding Mode\n§7Voiding §9Fluids");
1026-
multilineLang(provider, "gtceu.gui.multiblock_all_voiding",
1027-
"Voiding Mode\n§7Voiding All");
1028-
multilineLang(provider, "gtceu.gui.multiblock_no_voiding", "Voiding Mode\n§7Voiding Nothing");
1024+
provider.add("gtceu.gui.multiblock.voiding_mode", "Voiding Mode:");
1025+
provider.add("gtceu.gui.item_voiding", "§7Voiding §6Items");
1026+
provider.add("gtceu.gui.fluid_voiding", "§7Voiding §9Fluids");
1027+
provider.add("gtceu.gui.all_voiding",
1028+
"§7Voiding §cAll");
1029+
provider.add("gtceu.gui.no_voiding", "§7Voiding Nothing");
10291030
multilineLang(provider, "gtceu.gui.fisher_mode.tooltip",
10301031
"Toggle junk items\nOff costs 2 string per operation");
10311032
provider.add("ore.spawnlocation.name", "Ore Spawn Information");

0 commit comments

Comments
 (0)