Volver al índice

src/main/java/ar/com/companeros/world/RecipeResearch.java

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<String> inspect(ServerPlayer player, String target) {
        ResourceLocation item = new ResourceLocation(target);
        if (!ForgeRegistries.ITEMS.containsKey(item)) throw new IllegalArgumentException("Item desconocido");
        List<String> 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<String> 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);
    }
}