diff --git a/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java b/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java index 03c981fd564..9371ab9e284 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/api/codec/GTCodecUtils.java @@ -1,8 +1,12 @@ package com.gregtechceu.gtceu.api.codec; +import com.gregtechceu.gtceu.GTCEu; + +import com.google.gson.JsonParseException; import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; +import com.mojang.serialization.MapCodec; import java.util.function.Function; @@ -30,4 +34,26 @@ public static Codec longRange(long min, long max) { public static T unboxEither(Either either) { return either.map(Function.identity(), Function.identity()); } + + public static MapCodec quietExceptionCodec(Codec codec, String field, boolean isKubeLoaded) { + return codec.optionalFieldOf(field, null).flatXmap( + val -> { + if (val != null) return DataResult.success(val); + + String msg = "Recipe " + field + " field is invalid!"; + if (isKubeLoaded) { + throw quietException(msg); + } else { + GTCEu.LOGGER.error(msg); + } + return DataResult.error(() -> msg); + }, + DataResult::success); + } + + public static JsonParseException quietException(String msg) { + var ex = new JsonParseException(msg); + ex.setStackTrace(new StackTraceElement[0]); + return ex; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java index d785583a1ed..a385752da53 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java @@ -36,6 +36,8 @@ import java.util.*; import java.util.function.Function; +import static com.gregtechceu.gtceu.api.codec.GTCodecUtils.quietExceptionCodec; + @SuppressWarnings("DataFlowIssue") public class GTRecipeSerializer implements RecipeSerializer { @@ -262,7 +264,7 @@ private static MapCodec makeCodec(boolean isKubeLoaded) { CHANCE_LOGIC_MAP_CODEC.optionalFieldOf("tickOutputChanceLogics", Map.of()).forGetter(val -> val.tickOutputChanceLogics), RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), - ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), + quietExceptionCodec(ExtraCodecs.NON_NEGATIVE_INT,"duration",isKubeLoaded).forGetter(val -> val.duration), GTRegistries.RECIPE_CATEGORIES.byNameCodec().optionalFieldOf("category", GTRecipeCategory.DEFAULT).forGetter(val -> val.recipeCategory) ).apply(instance, GTRecipe::new)); } else { @@ -279,7 +281,7 @@ private static MapCodec makeCodec(boolean isKubeLoaded) { RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), IngredientActionHolder.CODEC.listOf().optionalFieldOf("kubejs:actions", List.of()).forGetter(val -> (List) val.ingredientActions), CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), - ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), + quietExceptionCodec(ExtraCodecs.NON_NEGATIVE_INT,"duration",isKubeLoaded).forGetter(val -> val.duration), GTRegistries.RECIPE_CATEGORIES.byNameCodec().optionalFieldOf("category", GTRecipeCategory.DEFAULT).forGetter(val -> val.recipeCategory) ).apply(instance, GTRecipe::new)); }