Make recipe streams sequential

This commit is contained in:
DBotThePony 2022-11-09 18:29:13 +07:00
parent e56f27ee6b
commit ed027eecec
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -85,7 +85,7 @@ object RecipeResolverManager : SimpleJsonResourceReloadListener(GsonBuilder().se
fun interface Finder { fun interface Finder {
/** /**
* Returned stream should be thread safe (parallel) * Returned stream MUST be sequential
*/ */
fun find(server: MinecraftServer, json: JsonObject): Stream<ResolvedRecipe> fun find(server: MinecraftServer, json: JsonObject): Stream<ResolvedRecipe>
} }
@ -113,7 +113,7 @@ object RecipeResolverManager : SimpleJsonResourceReloadListener(GsonBuilder().se
val isCritical = data["is_critical"]?.asBoolean ?: true val isCritical = data["is_critical"]?.asBoolean ?: true
val ignoreDamageables = data["ignore_damageables"]?.asBoolean ?: false val ignoreDamageables = data["ignore_damageables"]?.asBoolean ?: false
server.recipeManager.byType(findRecipeType).values.parallelStream() server.recipeManager.byType(findRecipeType).values.stream()
.filter { !it.isIncomplete && !it.ingredients.stream().anyMatch { it.isActuallyEmpty } } // get rid of invalid recipes, second "isActuallyEmpty" is required because we do care about ingredients being "missing" .filter { !it.isIncomplete && !it.ingredients.stream().anyMatch { it.isActuallyEmpty } } // get rid of invalid recipes, second "isActuallyEmpty" is required because we do care about ingredients being "missing"
.filter { .filter {
!ignoreDamageables || it.ingredients.stream().flatMap { Arrays.stream(it.items) }.noneMatch { it.isDamageableItem } !ignoreDamageables || it.ingredients.stream().flatMap { Arrays.stream(it.items) }.noneMatch { it.isDamageableItem }
@ -401,7 +401,7 @@ object RecipeResolverManager : SimpleJsonResourceReloadListener(GsonBuilder().se
val stream = Streams.concat(*foundResolvers.map { val stream = Streams.concat(*foundResolvers.map {
try { try {
it.value.first.find(server, it.value.second).parallel() it.value.first.find(server, it.value.second).sequential()
} catch(err: Throwable) { } catch(err: Throwable) {
LOGGER.fatal("Recipe resolver ${it.key} experienced internal error", err) LOGGER.fatal("Recipe resolver ${it.key} experienced internal error", err)
throw RuntimeException("Recipe resolver ${it.key} experienced internal error", err) throw RuntimeException("Recipe resolver ${it.key} experienced internal error", err)