[Features] (Recipe-) Advancement API

This commit is contained in:
Frank 2022-07-31 14:49:15 +02:00
parent e5da06a1e1
commit 18fffafb3a
10 changed files with 490 additions and 10 deletions

View file

@ -1,11 +1,16 @@
package org.betterx.bclib.recipes;
import org.betterx.bclib.api.v2.advancement.AdvancementManager;
import org.betterx.bclib.util.CollectionsUtil;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.Container;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TieredItem;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType;
@ -58,6 +63,48 @@ public class BCLRecipeManager {
list.put(recipe.getId(), recipe);
}
public static <C extends Container, T extends Recipe<C>> void addRecipeAndCreateAdvancement(
RecipeType<T> type,
T recipe
) {
addRecipe(type, recipe);
registerAndCreateAdvancement(recipe, recipe.getResultItem().getItem() instanceof TieredItem);
}
public static <C extends Container, T extends Recipe<C>> void addRecipeAndCreateAdvancement(
RecipeType<T> type,
T recipe,
boolean isTool
) {
addRecipe(type, recipe);
registerAndCreateAdvancement(recipe, isTool);
}
public static <C extends Container, T extends Recipe<C>> ResourceLocation registerAndCreateAdvancement(
T recipe,
boolean isTool
) {
AdvancementManager.Builder b = AdvancementManager.Builder.createRecipe(
recipe,
isTool
? AdvancementManager.AdvancementType.RECIPE_TOOL
: AdvancementManager.AdvancementType.RECIPE_DECORATIONS
);
int ct = 0;
for (Ingredient ingredient : recipe.getIngredients()) {
for (ItemStack stack : ingredient.getItems()) {
if (stack.is(Items.AIR)) continue;
final String name = "has_" + ct++;
Item item = stack.getItem();
b.addInventoryChangedCriterion(name, item);
}
}
return b.buildAndRegister();
}
public static <C extends Container, T extends Recipe<C>> T getRecipe(RecipeType<T> type, ResourceLocation id) {
Map<ResourceLocation, T> map = BCLRecipeManager.<C, T>RECIPES().get(type);
return map != null ? map.get(id) : null;