[Change] Refactored Recipe-Advancement API to prevent #29

This commit is contained in:
Frank 2022-08-01 18:35:32 +02:00
parent 8061049949
commit 35c023692c
10 changed files with 187 additions and 39 deletions

View file

@ -0,0 +1,107 @@
package org.betterx.bclib.recipes;
import org.betterx.bclib.api.v2.advancement.AdvancementManager;
import net.minecraft.advancements.RequirementsStrategy;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TieredItem;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Block;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class AbstractAdvancementRecipe {
protected AdvancementManager.Builder advancement;
boolean hasUnlockTrigger = false;
boolean generateAdvancement = false;
protected void createAdvancement(ResourceLocation id, boolean isTool) {
hasUnlockTrigger = false;
generateAdvancement = true;
advancement = AdvancementManager.Builder.create(
id,
isTool
? AdvancementManager.AdvancementType.RECIPE_TOOL
: AdvancementManager.AdvancementType.RECIPE_DECORATIONS
);
}
protected void createAdvancement(ResourceLocation id, ItemLike output) {
createAdvancement(id, (output.asItem() instanceof TieredItem || output.asItem() instanceof ArmorItem));
}
private int nameCounter = 0;
public void unlockedBy(ItemStack... stacks) {
List<ItemLike> items = Arrays.stream(stacks)
.filter(stack -> stack.getCount() > 0)
.map(stack -> (ItemLike) stack.getItem())
.toList();
unlockedBy((ItemLike[]) items.toArray());
}
public void unlockedBy(ItemLike... items) {
String name = "has_" + (nameCounter++) + "_" +
Arrays.stream(items)
.map(block -> (block instanceof Block)
? Registry.BLOCK.getKey((Block) block)
: Registry.ITEM.getKey((Item) block))
.filter(id -> id != null)
.map(id -> id.getPath())
.collect(Collectors.joining("_"));
if (name.length() > 45) name = name.substring(0, 42);
unlockedBy(name, items);
}
public void unlockedBy(TagKey<Item> tag) {
ResourceLocation id = tag.location();
if (id != null) {
unlockedBy("has_tag_" + id.getPath(), tag);
}
}
public void unlockedBy(String name, ItemLike... items) {
hasUnlockTrigger = true;
advancement.addInventoryChangedCriterion(name, items);
}
public void unlockedBy(String name, TagKey<Item> tag) {
hasUnlockTrigger = true;
advancement.addInventoryChangedCriterion(name, tag);
}
public void noAdvancement() {
generateAdvancement = false;
}
public void clearAdvancementCriteria() {
if (advancement != null)
advancement = AdvancementManager.Builder.createEmptyCopy(advancement);
}
protected void registerAdvancement(Recipe<?> recipe) {
if (hasUnlockTrigger && generateAdvancement) {
advancement
.startDisplay(recipe.getResultItem().getItem())
.hideFromChat()
.hideToast()
.endDisplay()
.addRecipeUnlockCriterion("has_the_recipe", recipe)
.startReward()
.addRecipe(recipe.getId())
.endReward()
.requirements(RequirementsStrategy.OR);
advancement.buildAndRegister();
}
}
}