[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

@ -249,9 +249,10 @@ public class AlloyingRecipe implements Recipe<Container>, UnknownReceipBookCateg
BCLib.LOGGER.debug("Can't add Alloying recipe {}! Ingeredient or output not exists.", id);
return;
}
BCLRecipeManager.addRecipe(
BCLRecipeManager.addRecipeAndCreateAdvancement(
TYPE,
new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime)
new AlloyingRecipe(id, group, primaryInput, secondaryInput, output, experience, smeltTime),
false
);
}
}

View file

@ -350,9 +350,10 @@ public class AnvilRecipe implements Recipe<Container>, UnknownReceipBookCategory
BCLib.LOGGER.debug("Can't add Anvil recipe {}! Ingeredient or output not exists.", id);
return;
}
BCLRecipeManager.addRecipe(
BCLRecipeManager.addRecipeAndCreateAdvancement(
TYPE,
new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage)
new AnvilRecipe(id, input, output, inputCount, toolLevel, anvilLevel, damage),
false
);
}
}

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;

View file

@ -84,7 +84,7 @@ public class FurnaceRecipe {
xp,
time
);
BCLRecipeManager.addRecipe(RecipeType.SMELTING, recipe);
BCLRecipeManager.addRecipeAndCreateAdvancement(RecipeType.SMELTING, recipe, false);
if (blasting) {
BlastingRecipe recipe2 = new BlastingRecipe(
@ -95,7 +95,7 @@ public class FurnaceRecipe {
xp,
time / 2
);
BCLRecipeManager.addRecipe(RecipeType.BLASTING, recipe2);
BCLRecipeManager.addRecipeAndCreateAdvancement(RecipeType.BLASTING, recipe2, false);
}
if (campfire) {
@ -107,7 +107,7 @@ public class FurnaceRecipe {
xp,
time * 3
);
BCLRecipeManager.addRecipe(RecipeType.CAMPFIRE_COOKING, recipe2);
BCLRecipeManager.addRecipeAndCreateAdvancement(RecipeType.CAMPFIRE_COOKING, recipe2, false);
}
if (smoker) {
@ -119,7 +119,7 @@ public class FurnaceRecipe {
xp,
time / 2
);
BCLRecipeManager.addRecipe(RecipeType.SMOKING, recipe2);
BCLRecipeManager.addRecipeAndCreateAdvancement(RecipeType.SMOKING, recipe2, false);
}
}
}

View file

@ -145,6 +145,6 @@ public class GridRecipe {
result
) : new ShapelessRecipe(id, group, result, materials);
BCLRecipeManager.addRecipe(type, recipe);
BCLRecipeManager.addRecipeAndCreateAdvancement(type, recipe);
}
}

View file

@ -99,6 +99,6 @@ public class SmithingTableRecipe {
return;
}
BCLRecipeManager.addRecipe(TYPE, new UpgradeRecipe(id, base, addition, result));
BCLRecipeManager.addRecipeAndCreateAdvancement(TYPE, new UpgradeRecipe(id, base, addition, result));
}
}