package ar.com.companeros.world; import java.util.*; import net.minecraft.server.level.ServerPlayer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.ForgeRegistries; /** Consulta recetas vigentes, incluidas máquinas de mods; no fabrica ni entrega materiales. */ public final class RecipeResearch { private RecipeResearch() { } public static List inspect(ServerPlayer player, String target) { ResourceLocation item = new ResourceLocation(target); if (!ForgeRegistries.ITEMS.containsKey(item)) throw new IllegalArgumentException("Item desconocido"); List report = new ArrayList<>(); int examined = 0; for (var recipe : player.serverLevel().getRecipeManager().getRecipes().stream() .sorted(Comparator.comparing(r -> r.getId().toString())).toList()) { if (++examined > 24_000 || report.size() >= 6) break; var result = recipe.getResultItem(player.serverLevel().registryAccess()); if (result.isEmpty() || !item.equals(ForgeRegistries.ITEMS.getKey(result.getItem()))) continue; List ingredients = new ArrayList<>(); for (var ingredient : recipe.getIngredients().stream().limit(12).toList()) { if (ingredient.isEmpty()) continue; ingredients.add(Arrays.stream(ingredient.getItems()).limit(4) .map(stack -> ForgeRegistries.ITEMS.getKey(stack.getItem()).toString()).distinct() .collect(java.util.stream.Collectors.joining("|"))); } String line = "recipe=" + recipe.getId() + " type=" + ForgeRegistries.RECIPE_TYPES.getKey(recipe.getType()) + " serializer=" + ForgeRegistries.RECIPE_SERIALIZERS.getKey(recipe.getSerializer()) + " output=" + result.getCount() + " " + item + " ingredients=" + ingredients; report.add(line.length() <= 1500 ? line : line.substring(0, 1500)); } if (report.isEmpty()) report.add("No se encontró receta con salida " + item + "; no implica que sea imposible obtenerlo. Loot, recetas dinámicas y mecanismos requieren otra comprobación."); return List.copyOf(report); } }