Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 4 additions & 2 deletions src/data/java/li/cil/oc/data/OCBlockTagsProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

import li.cil.oc.OpenComputers;
import li.cil.oc.common.init.OCBlocks;
import li.cil.oc.common.init.OCTags;
import li.cil.oc.common.openprinter.OpenPrinter;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.level.block.Blocks;
import net.neoforged.neoforge.common.Tags;
import net.neoforged.neoforge.common.data.BlockTagsProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
Expand Down Expand Up @@ -34,8 +36,8 @@ protected void addTags(HolderLookup.Provider provider) {
OpenPrinter.FILE_CABINET.get()
);

tag(BlockTags.BEACON_BASE_BLOCKS);

tag(Tags.Blocks.END_STONES).add(OCBlocks.Endstone().get());

tag(OCTags.Blocks.FROGLIGHTS).add(Blocks.OCHRE_FROGLIGHT, Blocks.PEARLESCENT_FROGLIGHT, Blocks.VERDANT_FROGLIGHT);
}
}
12 changes: 2 additions & 10 deletions src/data/java/li/cil/oc/data/OCItemTagsProvider.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package li.cil.oc.data;

import li.cil.oc.OpenComputers;
import li.cil.oc.common.recipe.ExtendedRecipe;
import li.cil.oc.common.init.OCTags;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.tags.ItemTagsProvider;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.common.Tags;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
Expand All @@ -25,13 +24,6 @@ public OCItemTagsProvider(
@Override
protected void addTags(HolderLookup.Provider provider) {
copy(Tags.Blocks.END_STONES, Tags.Items.END_STONES);

tag(ExtendedRecipe.beaconBlocks()).add(
Items.NETHERITE_BLOCK,
Items.EMERALD_BLOCK,
Items.DIAMOND_BLOCK,
Items.GOLD_BLOCK,
Items.IRON_BLOCK
);
copy(OCTags.Blocks.FROGLIGHTS, OCTags.Items.FROGLIGHTS);
}
}
293 changes: 292 additions & 1 deletion src/data/java/li/cil/oc/data/OCRecipeProvider.java

Large diffs are not rendered by default.

90 changes: 90 additions & 0 deletions src/data/java/li/cil/oc/data/recipe/AbstractRecipeBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package li.cil.oc.data.recipe;


import net.minecraft.advancements.AdvancementRequirements;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.Criterion;
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe;

import java.util.LinkedHashMap;
import java.util.Map;

/**
* An abstract base class for creating recipes, in the style of {@link RecipeBuilder}.
*
* @param <S> The type of this class.
* @param <O> The output of this builder.
*
*/
public abstract class AbstractRecipeBuilder<S extends AbstractRecipeBuilder<S, O>, O extends Recipe<?>> implements RecipeBuilder {
protected final RecipeCategory category;
protected final ItemStack result;
protected String group = "";
private final Map<String, Criterion<?>> criteria = new LinkedHashMap<>();

protected AbstractRecipeBuilder(RecipeCategory category, ItemStack result) {
this.category = category;
this.result = result;
}

@Override
public Item getResult() {
return result.getItem();
}

/**
* Set the group for this recipe.
*
* @param group The new group.
* @return This object, for chaining.
*/
@Override
public final S group(String group) {
this.group = group;
return self();
}

/**
* Add a criterion to this recipe.
*
* @param name The name of the criterion.
* @param criterion The criterion to add.
* @return This object, for chaining.
*/
@Override
public final S unlockedBy(String name, Criterion<?> criterion) {
criteria.put(name, criterion);
return self();
}

/**
* Convert this builder into the output ({@link O}) recipe.
*
* @return The built recipe.
*/
protected abstract O build();

@Override
public void save(RecipeOutput output, ResourceLocation id) {
if (criteria.isEmpty()) throw new IllegalStateException("No way of obtaining recipe " + id);
var advancement = output.advancement()
.addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(id))
.rewards(AdvancementRewards.Builder.recipe(id))
.requirements(AdvancementRequirements.Strategy.OR);
for (var entry : criteria.entrySet()) advancement.addCriterion(entry.getKey(), entry.getValue());

output.accept(id, build(), advancement.build(id.withPrefix("recipes/" + category.getFolderName() + "/")));
}

@SuppressWarnings("unchecked")
private S self() {
return (S) this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package li.cil.oc.data.recipe;

import li.cil.oc.common.recipe.TransformShapedRecipe;
import li.cil.oc.common.recipe.function.RecipeFunction;
import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.data.recipes.ShapedRecipeBuilder;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.ShapedRecipePattern;
import net.minecraft.world.level.ItemLike;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
* A builder for {@link TransformShapedRecipe}s, much like {@link ShapedRecipeBuilder}.
*/
public final class TransformShapedRecipeBuilder extends AbstractRecipeBuilder<TransformShapedRecipeBuilder, TransformShapedRecipe> {
private final List<String> rows = new ArrayList<>();
private final Map<Character, Ingredient> key = new LinkedHashMap<>();
private final List<RecipeFunction> functions = new ArrayList<>();

private TransformShapedRecipeBuilder(RecipeCategory category, ItemStack result) {
super(category, result);
}

public static TransformShapedRecipeBuilder of(RecipeCategory category, ItemStack result) {
return new TransformShapedRecipeBuilder(category, result);
}

public static TransformShapedRecipeBuilder of(RecipeCategory category, ItemLike result) {
return new TransformShapedRecipeBuilder(category, new ItemStack(result));
}

public TransformShapedRecipeBuilder define(char key, Ingredient ingredient) {
if (this.key.containsKey(key)) throw new IllegalArgumentException("Symbol '" + key + "' is already defined!");
if (key == ' ') throw new IllegalArgumentException("Symbol ' ' (whitespace) is reserved and cannot be defined");

this.key.put(key, ingredient);
return this;
}

public TransformShapedRecipeBuilder define(char key, TagKey<Item> tag) {
return this.define(key, Ingredient.of(tag));
}

public TransformShapedRecipeBuilder define(char key, ItemLike item) {
return define(key, Ingredient.of(item));
}

public TransformShapedRecipeBuilder pattern(String pattern) {
if (!rows.isEmpty() && pattern.length() != rows.getFirst().length()) {
throw new IllegalArgumentException("Pattern must be the same width on every line!");
} else {
rows.add(pattern);
return this;
}
}

public TransformShapedRecipeBuilder function(RecipeFunction function) {
functions.add(function);
return this;
}

@Override
protected TransformShapedRecipe build() {
if (functions.isEmpty()) throw new IllegalStateException("Must have at least one recipe function");
return new TransformShapedRecipe(group, RecipeBuilder.determineBookCategory(category), ShapedRecipePattern.of(key, rows), result, functions);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package li.cil.oc.data.recipe;

import li.cil.oc.common.recipe.TransformShapelessRecipe;
import li.cil.oc.common.recipe.function.RecipeFunction;
import net.minecraft.core.NonNullList;
import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.data.recipes.ShapelessRecipeBuilder;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike;

import java.util.ArrayList;
import java.util.List;

/**
* A builder for {@link TransformShapelessRecipe}s, much like {@link ShapelessRecipeBuilder}.
*/
public final class TransformShapelessRecipeBuilder extends AbstractRecipeBuilder<TransformShapelessRecipeBuilder, TransformShapelessRecipe> {
private final NonNullList<Ingredient> ingredients = NonNullList.create();
private final List<RecipeFunction> functions = new ArrayList<>();

private TransformShapelessRecipeBuilder(RecipeCategory category, ItemStack result) {
super(category, result);
}

public static TransformShapelessRecipeBuilder of(RecipeCategory category, ItemStack result) {
return new TransformShapelessRecipeBuilder(category, result);
}

public static TransformShapelessRecipeBuilder of(RecipeCategory category, ItemLike result) {
return new TransformShapelessRecipeBuilder(category, new ItemStack(result));
}

public TransformShapelessRecipeBuilder requires(Ingredient ingredient, int count) {
for (int i = 0; i < count; i++) ingredients.add(ingredient);
return this;
}

public TransformShapelessRecipeBuilder requires(Ingredient ingredient) {
return requires(ingredient, 1);
}

public TransformShapelessRecipeBuilder requires(ItemLike item) {
return requires(Ingredient.of(new ItemStack(item)));
}

public TransformShapelessRecipeBuilder requires(ItemLike item, int count) {
return requires(Ingredient.of(new ItemStack(item)), count);
}

public TransformShapelessRecipeBuilder requires(TagKey<Item> item) {
return requires(Ingredient.of(item));
}

public TransformShapelessRecipeBuilder function(RecipeFunction function) {
this.functions.add(function);
return this;
}

@Override
protected TransformShapelessRecipe build() {
if (functions.isEmpty()) throw new IllegalStateException("Must have at least one recipe function");
return new TransformShapelessRecipe(group, RecipeBuilder.determineBookCategory(category), result, ingredients, functions);
}
}
7 changes: 7 additions & 0 deletions src/main/generatedResources/data/c/tags/block/froglights.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

7 changes: 7 additions & 0 deletions src/main/generatedResources/data/c/tags/item/froglights.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading