Skip to content

Commit af376db

Browse files
Mqriusgustovafing
authored andcommitted
Fix validation for item and fluid tags (#4699)
1 parent fe4006d commit af376db

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.gregtechceu.gtceu.api.recipe.ingredient;
22

3+
import com.gregtechceu.gtceu.GTCEu;
4+
import com.gregtechceu.gtceu.integration.kjs.recipe.KJSHelpers;
5+
36
import net.minecraft.core.Holder;
47
import net.minecraft.core.registries.BuiltInRegistries;
58
import net.minecraft.core.registries.Registries;
@@ -327,6 +330,10 @@ public record TagValue(TagKey<Fluid> tag) implements Value {
327330

328331
@Override
329332
public Collection<Fluid> getFluids() {
333+
if (GTCEu.Mods.isKubeJSLoaded()) {
334+
var resolved = KJSHelpers.getFluidsDuringLoad(this.tag);
335+
if (resolved != null) return resolved;
336+
}
330337
ArrayList<Fluid> list = Lists.newArrayList();
331338
for (Holder<Fluid> holder : BuiltInRegistries.FLUID.getTagOrEmpty(this.tag)) {
332339
list.add(holder.value());

src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour;
2525
import com.gregtechceu.gtceu.common.recipe.condition.*;
2626
import com.gregtechceu.gtceu.config.ConfigHolder;
27+
import com.gregtechceu.gtceu.core.mixins.IngredientAccessor;
28+
import com.gregtechceu.gtceu.core.mixins.TagValueAccessor;
2729
import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder;
2830
import com.gregtechceu.gtceu.integration.kjs.recipe.components.CapabilityMap;
2931
import com.gregtechceu.gtceu.integration.kjs.recipe.components.ExtendedOutputItem;
@@ -792,6 +794,15 @@ private void validateItems(@NotNull String type, InputItem... items) {
792794
if (stack == null || stack.isEmpty()) {
793795
throw new RecipeExceptionJS(String.format("Invalid or empty %s item (recipe ID: %s)", type, id));
794796
}
797+
if (stack.ingredient.getItems().length == 0) {
798+
String tagInfo = "";
799+
var values = ((IngredientAccessor) stack.ingredient).getValues();
800+
if (values.length == 1 && values[0] instanceof Ingredient.TagValue tagValue) {
801+
tagInfo = " (empty or unknown tag: #" + ((TagValueAccessor) tagValue).getTag().location() + ")";
802+
}
803+
throw new RecipeExceptionJS(
804+
String.format("Invalid or empty %s item (recipe ID: %s)%s", type, id, tagInfo));
805+
}
795806
}
796807
}
797808

@@ -839,6 +850,15 @@ private void validateFluids(@NotNull String type, GTRecipeComponents.FluidIngred
839850
String.format("Invalid or empty %s fluid (recipe ID: %s)", type, id));
840851
}
841852
}
853+
if (fluid.ingredient().getStacks().length == 0) {
854+
String tagInfo = "";
855+
var values = fluid.ingredient().values;
856+
if (values.length == 1 && values[0] instanceof FluidIngredient.TagValue tagValue) {
857+
tagInfo = " (empty or unknown tag: #" + tagValue.tag().location() + ")";
858+
}
859+
throw new RecipeExceptionJS(String.format(
860+
"Invalid or empty %s fluid (recipe ID: %s)%s", type, id, tagInfo));
861+
}
842862
}
843863
}
844864

src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/KJSHelpers.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,20 @@
33
import com.gregtechceu.gtceu.api.capability.recipe.IO;
44
import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack;
55

6+
import net.minecraft.core.Holder;
7+
import net.minecraft.tags.TagKey;
8+
import net.minecraft.world.level.material.Fluid;
9+
10+
import com.google.common.collect.Lists;
11+
import dev.latvian.mods.kubejs.item.ingredient.TagContext;
12+
import dev.latvian.mods.kubejs.recipe.RecipesEventJS;
613
import dev.latvian.mods.kubejs.util.MapJS;
714
import dev.latvian.mods.kubejs.util.UtilsJS;
815
import dev.latvian.mods.rhino.Wrapper;
916
import it.unimi.dsi.fastutil.longs.LongLongPair;
1017
import org.jetbrains.annotations.Nullable;
1118

19+
import java.util.ArrayList;
1220
import java.util.Map;
1321
import java.util.Set;
1422
import java.util.regex.Matcher;
@@ -104,4 +112,21 @@ public static EnergyStack parseEnergyStack(Object o) {
104112
}
105113
return LongLongPair.of(voltage, amperage);
106114
}
115+
116+
/**
117+
* Resolves a fluid tag using KubeJS's TagContext during recipe (re)loading, since the server registry
118+
* hasn't bound the tags yet. Returns null if a recipe event is not currently active.
119+
* Analogous to KubeJS' TagContext::patchIngredientTags for items.
120+
*/
121+
@Nullable
122+
public static ArrayList<Fluid> getFluidsDuringLoad(TagKey<Fluid> tag) {
123+
if (RecipesEventJS.instance == null) return null;
124+
125+
var holders = TagContext.INSTANCE.getValue().getTag(tag);
126+
ArrayList<Fluid> list = Lists.newArrayList();
127+
for (Holder<Fluid> holder : holders) {
128+
list.add(holder.value());
129+
}
130+
return list;
131+
}
107132
}

0 commit comments

Comments
 (0)