diff --git a/src/main/java/org/betterx/bclib/recipes/AbstractSimpleRecipe.java b/src/main/java/org/betterx/bclib/recipes/AbstractSimpleRecipe.java new file mode 100644 index 00000000..4e41506a --- /dev/null +++ b/src/main/java/org/betterx/bclib/recipes/AbstractSimpleRecipe.java @@ -0,0 +1,92 @@ +package org.betterx.bclib.recipes; + +import org.betterx.bclib.BCLib; +import org.betterx.bclib.config.PathConfig; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.Container; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; + +public abstract class AbstractSimpleRecipe> extends AbstractAdvancementRecipe { + public final ResourceLocation id; + protected String group; + protected Ingredient input; + protected ItemLike output; + protected final String category; + protected final RecipeType type; + protected int count; + protected boolean exist; + + + protected AbstractSimpleRecipe(ResourceLocation id, RecipeType type, ItemLike output) { + this(id, type, type.toString(), output); + } + + protected AbstractSimpleRecipe(ResourceLocation id, RecipeType type, String category, ItemLike output) { + this.id = id; + this.group = ""; + this.exist = true; + this.count = 1; + this.output = output; + + this.category = category; + this.type = type; + } + + + protected T setInput(ItemLike in) { + this.input = Ingredient.of(in); + unlockedBy(in); + return (T) this; + } + + protected T setInput(TagKey in) { + this.input = Ingredient.of(in); + unlockedBy(in); + return (T) this; + } + + public T setGroup(String group) { + this.group = group; + return (T) this; + } + + public T setOutputCount(int count) { + this.count = count; + return (T) this; + } + + public T checkConfig(PathConfig config) { + exist &= config.getBoolean(category, id.getPath(), true); + return (T) this; + } + + protected abstract R buildRecipe(); + + protected boolean hasErrors() { + return false; + } + + public final void build() { + if (!exist) { + BCLib.LOGGER.warning("Unable to build Recipe " + id); + return; + } + + if (input == null || input.isEmpty()) { + BCLib.LOGGER.warning("Unable to build Recipe " + id + ": No Input Material"); + return; + } + + if (hasErrors()) return; + + R recipe = buildRecipe(); + BCLRecipeManager.addRecipe(type, recipe); + registerAdvancement(recipe); + } +} diff --git a/src/main/java/org/betterx/bclib/recipes/BlastFurnaceRecipe.java b/src/main/java/org/betterx/bclib/recipes/BlastFurnaceRecipe.java new file mode 100644 index 00000000..16ecc71f --- /dev/null +++ b/src/main/java/org/betterx/bclib/recipes/BlastFurnaceRecipe.java @@ -0,0 +1,29 @@ +package org.betterx.bclib.recipes; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.BlastingRecipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; + +public class BlastFurnaceRecipe extends CookingRecipe { + BlastFurnaceRecipe(ResourceLocation id, ItemLike output) { + super(id, RecipeType.BLASTING, output); + } + + public static BlastFurnaceRecipe make(String modID, String name, ItemLike output) { + return make(new ResourceLocation(modID, name), output); + } + + public static BlastFurnaceRecipe make(ResourceLocation id, ItemLike output) { + BlastFurnaceRecipe res = new BlastFurnaceRecipe(id, output); + res.createAdvancement(id, false); + return res; + } + + @Override + protected BlastingRecipe buildRecipe() { + return new BlastingRecipe(id, group, input, new ItemStack(output, count), experience, cookingTime); + } +} diff --git a/src/main/java/org/betterx/bclib/recipes/CookingRecipe.java b/src/main/java/org/betterx/bclib/recipes/CookingRecipe.java new file mode 100644 index 00000000..7799715c --- /dev/null +++ b/src/main/java/org/betterx/bclib/recipes/CookingRecipe.java @@ -0,0 +1,42 @@ +package org.betterx.bclib.recipes; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.Container; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.ItemLike; + +public abstract class CookingRecipe> extends AbstractSimpleRecipe { + protected float experience; + protected int cookingTime; + + CookingRecipe(ResourceLocation id, RecipeType type, ItemLike output) { + this(id, type, type.toString(), output); + } + + CookingRecipe(ResourceLocation id, RecipeType type, String category, ItemLike output) { + super(id, type, category, output); + cookingTime = 1000; + experience = 0; + } + + public T setInput(ItemLike in) { + return super.setInput(in); + } + + public T setInput(TagKey in) { + return super.setInput(in); + } + + public T setExperience(float xp) { + experience = xp; + return (T) this; + } + + public T setCookingTime(int time) { + cookingTime = time; + return (T) this; + } +} diff --git a/src/main/java/org/betterx/bclib/recipes/SmelterRecipe.java b/src/main/java/org/betterx/bclib/recipes/SmelterRecipe.java new file mode 100644 index 00000000..4becd7eb --- /dev/null +++ b/src/main/java/org/betterx/bclib/recipes/SmelterRecipe.java @@ -0,0 +1,31 @@ +package org.betterx.bclib.recipes; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.level.ItemLike; + +public class SmelterRecipe extends CookingRecipe { + SmelterRecipe( + ResourceLocation id, ItemLike output + ) { + super(id, RecipeType.SMELTING, output); + } + + public static SmelterRecipe make(String modID, String name, ItemLike output) { + return make(new ResourceLocation(modID, name), output); + } + + public static SmelterRecipe make(ResourceLocation id, ItemLike output) { + SmelterRecipe res = new SmelterRecipe(id, output); + res.createAdvancement(id, false); + return res; + } + + @Override + protected SmeltingRecipe buildRecipe() { + return new SmeltingRecipe(id, group, input, new ItemStack(output, count), experience, cookingTime); + } +} diff --git a/src/main/java/org/betterx/bclib/recipes/SmithingRecipe.java b/src/main/java/org/betterx/bclib/recipes/SmithingRecipe.java new file mode 100644 index 00000000..067e6a50 --- /dev/null +++ b/src/main/java/org/betterx/bclib/recipes/SmithingRecipe.java @@ -0,0 +1,56 @@ +package org.betterx.bclib.recipes; + +import org.betterx.bclib.BCLib; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.Container; +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.RecipeType; +import net.minecraft.world.item.crafting.UpgradeRecipe; +import net.minecraft.world.level.ItemLike; + +public class SmithingRecipe extends AbstractSimpleRecipe { + protected Ingredient addon; + + protected SmithingRecipe(ResourceLocation id, ItemLike output) { + super(id, RecipeType.SMITHING, output); + } + + + public SmithingRecipe setBase(ItemLike in) { + return super.setInput(in); + } + + public SmithingRecipe setBase(TagKey in) { + return super.setInput(in); + } + + public SmithingRecipe setAddon(ItemLike in) { + this.addon = Ingredient.of(in); + unlockedBy(in); + return this; + } + + public SmithingRecipe setAddon(TagKey in) { + this.addon = Ingredient.of(in); + unlockedBy(in); + return this; + } + + @Override + protected boolean hasErrors() { + if (addon == null || addon.isEmpty()) { + BCLib.LOGGER.warning("Unable to build Recipe " + id + ": No Addon Ingredient"); + return true; + } + return super.hasErrors(); + } + + @Override + protected UpgradeRecipe buildRecipe() { + return new UpgradeRecipe(id, input, addon, new ItemStack(output, count)); + } +} diff --git a/src/main/java/org/betterx/bclib/recipes/StoneCutterRecipe.java b/src/main/java/org/betterx/bclib/recipes/StoneCutterRecipe.java index 226cee12..4a9722ed 100644 --- a/src/main/java/org/betterx/bclib/recipes/StoneCutterRecipe.java +++ b/src/main/java/org/betterx/bclib/recipes/StoneCutterRecipe.java @@ -1,32 +1,17 @@ package org.betterx.bclib.recipes; -import org.betterx.bclib.BCLib; -import org.betterx.bclib.config.PathConfig; - import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; +import net.minecraft.world.Container; 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.RecipeType; import net.minecraft.world.item.crafting.StonecutterRecipe; import net.minecraft.world.level.ItemLike; -public class StoneCutterRecipe extends AbstractAdvancementRecipe { - private final ResourceLocation id; - String group; - Ingredient input; - ItemLike output; - int count; - boolean exist; - - +public class StoneCutterRecipe extends AbstractSimpleRecipe { StoneCutterRecipe(ResourceLocation id, ItemLike output) { - this.id = id; - this.group = ""; - this.exist = true; - this.count = 1; - this.output = output; + super(id, RecipeType.STONECUTTING, "stonecutting", output); } public static StoneCutterRecipe make(String modID, String name, ItemLike output) { @@ -40,44 +25,15 @@ public class StoneCutterRecipe extends AbstractAdvancementRecipe { } public StoneCutterRecipe setInput(ItemLike in) { - this.input = Ingredient.of(in); - unlockedBy(in); - return this; + return super.setInput(in); } public StoneCutterRecipe setInput(TagKey in) { - this.input = Ingredient.of(in); - unlockedBy(in); - return this; + return super.setInput(in); } - public StoneCutterRecipe setGroup(String group) { - this.group = group; - return this; - } - - public StoneCutterRecipe setOutputCount(int count) { - this.count = count; - return this; - } - - public StoneCutterRecipe checkConfig(PathConfig config) { - exist &= config.getBoolean("stonecutting", id.getPath(), true); - return this; - } - - public void build() { - if (!exist) { - BCLib.LOGGER.warning("Unable to build Recipe " + id); - return; - } - - if (input == null || input.isEmpty()) { - BCLib.LOGGER.warning("Unable to build Recipe " + id + ": Empty Material List"); - return; - } - StonecutterRecipe recipe = new StonecutterRecipe(id, group, input, new ItemStack(output, count)); - BCLRecipeManager.addRecipe(RecipeType.STONECUTTING, recipe); - registerAdvancement(recipe); + @Override + protected StonecutterRecipe buildRecipe() { + return new StonecutterRecipe(id, group, input, new ItemStack(output, count)); } }