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);
}
}