Skip to content

Commit a432d6b

Browse files
Fix ranged item & fluid outputs with minimum 0, and fix SizedIngredient modifying recipe stack sizes in batched recipes. (#3594)
Co-authored-by: Ghostipedia <Ghostipedia@gmail.com> Co-authored-by: Ghostipedia / Caitlynn <46772882+Ghostipedia@users.noreply.github.com>
1 parent a8ccb02 commit a432d6b

File tree

9 files changed

+80
-38
lines changed

9 files changed

+80
-38
lines changed

src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,8 @@ public void applyWidgetInfo(@NotNull Widget widget,
403403
// Maps fluids to a FluidEntryList for XEI: either a FluidTagList or a FluidStackList
404404
public static FluidEntryList mapFluid(FluidIngredient ingredient) {
405405
int amount;
406-
if (ingredient instanceof IntProviderFluidIngredient provider) {
407-
amount = provider.getCountProvider().getMaxValue();
406+
if (ingredient instanceof IntProviderFluidIngredient) {
407+
amount = 1;
408408
} else {
409409
amount = ingredient.getAmount();
410410
}

src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import org.jetbrains.annotations.UnknownNullability;
5353

5454
import java.util.*;
55-
import java.util.function.UnaryOperator;
5655
import java.util.stream.Collectors;
5756

5857
import static com.gregtechceu.gtceu.api.recipe.RecipeHelper.addToRecipeHandlerMap;
@@ -498,24 +497,35 @@ private static ItemEntryList mapItem(final Ingredient ingredient) {
498497
final int amount = sizedIngredient.getAmount();
499498
var mapped = tryMapInner(sizedIngredient.getInner(), amount);
500499
if (mapped != null) return mapped;
500+
501+
if (sizedIngredient.getInner() instanceof IntProviderIngredient intProvider) {
502+
ItemStackList stackList = new ItemStackList();
503+
for (ItemStack i : intProvider.getInner().getItems()) {
504+
stackList.add(i);
505+
}
506+
return stackList;
507+
}
501508
} else if (ingredient instanceof IntProviderIngredient intProvider) {
502509
final int amount = 1;
503510
var mapped = tryMapInner(intProvider.getInner(), amount);
504511
if (mapped != null) return mapped;
512+
513+
ItemStackList stackList = new ItemStackList();
514+
for (ItemStack i : intProvider.getInner().getItems()) {
515+
stackList.add(i);
516+
}
517+
return stackList;
505518
} else if (ingredient instanceof IntersectionIngredient intersection) {
506519
return mapIntersection(intersection, -1);
507520
} else {
508521
var tagList = tryMapTag(ingredient, 1);
509522
if (tagList != null) return tagList;
510523
}
511-
ItemStackList stackList = new ItemStackList();
512-
boolean isIntProvider = ingredient instanceof IntProviderIngredient ||
513-
(ingredient instanceof SizedIngredient sized && sized.getInner() instanceof IntProviderIngredient);
514524

515-
UnaryOperator<ItemStack> setCount = stack -> isIntProvider ? stack.copyWithCount(1) : stack;
516-
Arrays.stream(ingredient.getItems())
517-
.map(setCount)
518-
.forEach(stackList::add);
525+
ItemStackList stackList = new ItemStackList();
526+
for (ItemStack i : ingredient.getItems()) {
527+
stackList.add(i);
528+
}
519529
return stackList;
520530
}
521531

src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,31 +118,24 @@ public List<FluidIngredient> handleRecipeInner(IO io, GTRecipe recipe, List<Flui
118118
}
119119

120120
FluidStack[] fluids;
121-
int amount;
122121

123122
if (io == IO.OUT && ingredient instanceof IntProviderFluidIngredient provider) {
124123
provider.setFluidStacks(null);
125124
provider.setSampledCount(-1);
126125

127126
if (simulate) {
128127
fluids = new FluidStack[] { provider.getMaxSizeStack() };
129-
amount = provider.getCountProvider().getMaxValue();
130128
} else {
131129
fluids = provider.getStacks();
132-
if (fluids.length == 0 || fluids[0].isEmpty()) {
133-
it.remove();
134-
continue;
135-
}
136-
amount = fluids[0].getAmount();
137130
}
138131
} else {
139132
fluids = ingredient.getStacks();
140-
if (fluids.length == 0 || fluids[0].isEmpty()) {
141-
it.remove();
142-
continue;
143-
}
144-
amount = ingredient.getAmount();
145133
}
134+
if (fluids.length == 0 || fluids[0].isEmpty()) {
135+
it.remove();
136+
continue;
137+
}
138+
int amount = fluids[0].getAmount();
146139

147140
if (io == IO.OUT && !allowSameFluids) {
148141
CustomFluidTank existing = null;

src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class FluidIngredient implements Predicate<FluidStack> {
3030
.xmap(FluidIngredient::fromJson, FluidIngredient::toJson);
3131

3232
public static final FluidIngredient EMPTY = new FluidIngredient(new Value[0], 0, null);
33+
public static final FluidStack[] EMPTY_STACK_ARRAY = new FluidStack[0];
3334
public FluidIngredient.Value[] values;
3435
@Nullable
3536
public FluidStack[] stacks;

src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredient.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,16 @@ public int getAmount() {
5454
@Override
5555
public FluidStack[] getStacks() {
5656
if (fluidStacks == null) {
57-
inner.setAmount(getSampledCount(GTValues.RNG));
58-
fluidStacks = inner.getStacks();
57+
int cachedAmount = getSampledCount(GTValues.RNG);
58+
if (cachedAmount == 0) {
59+
return EMPTY_STACK_ARRAY;
60+
}
61+
var innerStacks = inner.getStacks();
62+
this.fluidStacks = new FluidStack[innerStacks.length];
63+
for (int i = 0; i < fluidStacks.length; i++) {
64+
fluidStacks[i] = innerStacks[i].copy();
65+
fluidStacks[i].setAmount(cachedAmount);
66+
}
5967
}
6068
return fluidStacks;
6169
}

src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredient.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
public class IntProviderIngredient extends Ingredient {
3030

3131
public static final ResourceLocation TYPE = GTCEu.id("int_provider");
32+
public static final ItemStack[] EMPTY_STACK_ARRAY = new ItemStack[0];
3233

3334
@Getter
3435
protected final IntProvider countProvider;
@@ -64,9 +65,14 @@ public boolean test(@Nullable ItemStack stack) {
6465
@Override
6566
public ItemStack @NotNull [] getItems() {
6667
if (itemStacks == null) {
67-
itemStacks = inner.getItems();
68+
int cachedCount = getSampledCount(GTValues.RNG);
69+
if (cachedCount == 0) {
70+
return EMPTY_STACK_ARRAY;
71+
}
72+
var innerStacks = inner.getItems();
73+
this.itemStacks = new ItemStack[innerStacks.length];
6874
for (int i = 0; i < itemStacks.length; i++) {
69-
itemStacks[i] = itemStacks[i].copyWithCount(getSampledCount(GTValues.RNG));
75+
itemStacks[i] = innerStacks[i].copyWithCount(cachedCount);
7076
}
7177
}
7278
return itemStacks;

src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/SizedIngredient.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ public class SizedIngredient extends Ingredient {
3232
protected int amount;
3333
@Getter
3434
protected final Ingredient inner;
35+
/**
36+
* This array's elements must be treated as immutable.
37+
*/
3538
protected ItemStack[] itemStacks = null;
3639
private boolean changed = true;
3740
@Getter
@@ -136,9 +139,10 @@ public boolean test(@Nullable ItemStack stack) {
136139
return intProviderIngredient.getItems();
137140
}
138141
if (changed || itemStacks == null) {
139-
itemStacks = inner.getItems();
142+
var innerStacks = inner.getItems();
143+
this.itemStacks = new ItemStack[innerStacks.length];
140144
for (int i = 0; i < itemStacks.length; i++) {
141-
itemStacks[i] = itemStacks[i].copyWithCount(amount);
145+
itemStacks[i] = innerStacks[i].copyWithCount(amount);
142146
}
143147
changed = false;
144148
}

src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -177,21 +177,23 @@ private void addItemTooltips(ITooltip iTooltip, List<Ingredient> outputItems) {
177177
IElementHelper helper = iTooltip.getElementHelper();
178178
for (Ingredient itemOutput : outputItems) {
179179
if (itemOutput != null && !itemOutput.isEmpty()) {
180-
ItemStack item = itemOutput.getItems()[0];
181-
int count = item.getCount();
182-
item.setCount(1);
183-
iTooltip.add(helper.smallItem(item));
180+
ItemStack item;
184181
MutableComponent text = CommonComponents.space();
185182
if (itemOutput instanceof IntProviderIngredient provider) {
183+
item = provider.getInner().getItems()[0];
186184
text = text.append(Component.translatable("gtceu.gui.content.range",
187185
String.valueOf(provider.getCountProvider().getMinValue()),
188186
String.valueOf(provider.getCountProvider().getMaxValue())));
189187
} else {
190-
text.append(String.valueOf(count));
188+
item = itemOutput.getItems()[0];
189+
text.append(String.valueOf(item.getCount()));
190+
item.setCount(1);
191191
}
192192
text.append(Component.translatable("gtceu.gui.content.times_item",
193193
getItemName(item))
194194
.withStyle(ChatFormatting.WHITE));
195+
196+
iTooltip.add(helper.smallItem(item));
195197
iTooltip.append(text);
196198
}
197199
}
@@ -200,18 +202,22 @@ private void addItemTooltips(ITooltip iTooltip, List<Ingredient> outputItems) {
200202
private void addFluidTooltips(ITooltip iTooltip, List<FluidIngredient> outputFluids) {
201203
for (FluidIngredient fluidOutput : outputFluids) {
202204
if (fluidOutput != null && !fluidOutput.isEmpty()) {
203-
iTooltip.add(GTElementHelper.smallFluid(getFluid(fluidOutput.getStacks()[0])));
205+
FluidStack stack;
204206
MutableComponent text = CommonComponents.space();
205207
if (fluidOutput instanceof IntProviderFluidIngredient provider) {
208+
stack = provider.getInner().getStacks()[0];
206209
text.append(Component.translatable("gtceu.gui.content.range",
207210
FluidTextHelper.getUnicodeMillibuckets(provider.getCountProvider().getMinValue(), true),
208211
FluidTextHelper.getUnicodeMillibuckets(provider.getCountProvider().getMaxValue(), true)));
209212
} else {
210-
text.append(FluidTextHelper.getUnicodeMillibuckets(fluidOutput.getAmount(), true));
213+
stack = fluidOutput.getStacks()[0];
214+
text.append(FluidTextHelper.getUnicodeMillibuckets(stack.getAmount(), true));
211215
}
212216
text.append(CommonComponents.space())
213-
.append(getFluidName(fluidOutput.getStacks()[0]))
217+
.append(getFluidName(stack))
214218
.withStyle(ChatFormatting.WHITE);
219+
220+
iTooltip.add(GTElementHelper.smallFluid(getFluid(stack)));
215221
iTooltip.append(text);
216222
}
217223
}

src/main/java/com/gregtechceu/gtceu/integration/top/provider/RecipeOutputProvider.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
import net.minecraft.network.chat.Component;
1818
import net.minecraft.resources.ResourceLocation;
1919
import net.minecraft.world.entity.player.Player;
20+
import net.minecraft.world.item.ItemStack;
2021
import net.minecraft.world.item.crafting.Ingredient;
2122
import net.minecraft.world.level.Level;
2223
import net.minecraft.world.level.block.entity.BlockEntity;
24+
import net.minecraftforge.fluids.FluidStack;
2325

2426
import mcjty.theoneprobe.api.CompoundText;
2527
import mcjty.theoneprobe.api.ElementAlignment;
@@ -58,7 +60,13 @@ protected void addProbeInfo(RecipeLogic recipeLogic, IProbeInfo iProbeInfo, Play
5860

5961
List<Ingredient> itemOutputs = new ArrayList<>();
6062
for (var item : itemContents) {
61-
var stacks = ItemRecipeCapability.CAP.of(item.content).getItems();
63+
ItemStack[] stacks;
64+
Ingredient content = ItemRecipeCapability.CAP.of(item.content);
65+
if (content instanceof IntProviderIngredient provider) {
66+
stacks = provider.getInner().getItems();
67+
} else {
68+
stacks = content.getItems();
69+
}
6270
if (stacks.length == 0) continue;
6371
if (stacks[0].isEmpty()) continue;
6472
var stack = stacks[0].copy();
@@ -75,7 +83,13 @@ protected void addProbeInfo(RecipeLogic recipeLogic, IProbeInfo iProbeInfo, Play
7583

7684
List<FluidIngredient> fluidOutputs = new ArrayList<>();
7785
for (var fluid : fluidContents) {
78-
var stacks = FluidRecipeCapability.CAP.of(fluid.content).getStacks();
86+
FluidStack[] stacks;
87+
FluidIngredient content = FluidRecipeCapability.CAP.of(fluid.content);
88+
if (content instanceof IntProviderFluidIngredient provider) {
89+
stacks = provider.getInner().getStacks();
90+
} else {
91+
stacks = content.getStacks();
92+
}
7993
if (stacks.length == 0) continue;
8094
if (stacks[0].isEmpty()) continue;
8195
var stack = stacks[0].copy();

0 commit comments

Comments
 (0)