~williewillus/violet-moon

This thread contains a patchset. You're looking at the original emails, but you may wish to use the patch review UI. Review patch
2 2

[PATCH botania] Add reagent to runic altar recipe format

Details
Message ID
<20231101083228.12464-1-theArtemisSystem@gmail.com>
DKIM signature
missing
Download raw message
Patch: +125 -44
Not used yet, will be used in a future commit
---
Figured i'll just send these one by one, more commits incoming
 .../cc3f2b57729a50761cd506b810b841f2b4fbd4d1  | 34 ++++++-------
 .../data/botania/recipes/runic_altar/air.json |  3 ++
 .../botania/recipes/runic_altar/autumn.json   |  3 ++
 .../botania/recipes/runic_altar/earth.json    |  3 ++
 .../botania/recipes/runic_altar/envy.json     |  3 ++
 .../botania/recipes/runic_altar/fire.json     |  3 ++
 .../botania/recipes/runic_altar/gluttony.json |  3 ++
 .../botania/recipes/runic_altar/greed.json    |  3 ++
 .../botania/recipes/runic_altar/head.json     |  3 ++
 .../botania/recipes/runic_altar/lust.json     |  3 ++
 .../botania/recipes/runic_altar/mana.json     |  3 ++
 .../botania/recipes/runic_altar/pride.json    |  3 ++
 .../botania/recipes/runic_altar/sloth.json    |  3 ++
 .../botania/recipes/runic_altar/spring.json   |  3 ++
 .../botania/recipes/runic_altar/summer.json   |  3 ++
 .../botania/recipes/runic_altar/water.json    |  3 ++
 .../botania/recipes/runic_altar/winter.json   |  3 ++
 .../botania/recipes/runic_altar/wrath.json    |  3 ++
 .../botania/api/recipe/RunicAltarRecipe.java  |  7 +++
 .../common/crafting/RunicAltarRecipe.java     | 17 +++++--
 .../common/crafting/recipe/HeadRecipe.java    | 10 ++--
 .../data/recipes/RunicAltarProvider.java      | 50 +++++++++++--------
 22 files changed, 125 insertions(+), 44 deletions(-)

diff --git a/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1 b/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1
index abb0c51d5..4df5737e5 100644
--- a/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1
+++ b/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1
@@ -1,18 +1,18 @@
// 1.20.1	Botania/Botania runic altar recipes
d3e8d746a742c5d7dd5e193d509152c4f9f72579 data/botania/recipes/runic_altar/air.json
1e435d483560295df329b0492e273c96684ebc31 data/botania/recipes/runic_altar/autumn.json
c4d5f2f0463e30f027633f823206abdcbad51615 data/botania/recipes/runic_altar/earth.json
33e0e91504b99b4aa1b774ff15a09cd7784bc5a7 data/botania/recipes/runic_altar/envy.json
c338f61ea4e5a71f8a077f441d22876a3210d883 data/botania/recipes/runic_altar/fire.json
60c53a002299c3c09834ae064fea39f2b27d0b43 data/botania/recipes/runic_altar/gluttony.json
c1fc0e465c8841a957fd089ff03cc4016495d02d data/botania/recipes/runic_altar/greed.json
6b78f960968e8ecf702133fbe5eab7d2d69e0f90 data/botania/recipes/runic_altar/head.json
e3fbdc270b0f4683037339c343a66f4cd164a0f9 data/botania/recipes/runic_altar/lust.json
01f95a3f44dfe54a8decd884b59ae6eff1a9e630 data/botania/recipes/runic_altar/mana.json
afd58f8ffe62da670ae78440894df295a91abbf3 data/botania/recipes/runic_altar/pride.json
be172e445b8a4163dde39e9bda7d423c2969e432 data/botania/recipes/runic_altar/sloth.json
3ee7f564c4648730da8485ddd4c2b7d7e344fd97 data/botania/recipes/runic_altar/spring.json
c24445c4e8604d6ae389c44bcc31a8b5b4ca1a43 data/botania/recipes/runic_altar/summer.json
ff2aecc043e973846581df1e71b8f06bd0baec49 data/botania/recipes/runic_altar/water.json
ce03fd7559ca0b69ad015771dde3e0302a5b3fe1 data/botania/recipes/runic_altar/winter.json
6f42dd5896ea2edb2f2de1002f321fcac20af64e data/botania/recipes/runic_altar/wrath.json
d3324e594d2e5ed2895639902d32c83709d8e648 data/botania/recipes/runic_altar/air.json
325af549ac5c1cea1169867b71c8fc68eb836ccb data/botania/recipes/runic_altar/autumn.json
61f99973d60f283c8e3a256d3adc162d24dcfcf7 data/botania/recipes/runic_altar/earth.json
453248fc5f8692bfc6bfa0f2d63d6bcef29c7017 data/botania/recipes/runic_altar/envy.json
4cfa28ba8be3f462f36a8b1ac988c0e264827287 data/botania/recipes/runic_altar/fire.json
297764f3e04560bc86e8a138605512cceb866c3c data/botania/recipes/runic_altar/gluttony.json
a54174d121d45647852ea6435f07daebc2036061 data/botania/recipes/runic_altar/greed.json
d4eb2be08a9d31d11a3c593dbdf7dde2337c7114 data/botania/recipes/runic_altar/head.json
e491486adb868deb0db10007377cb84d689846db data/botania/recipes/runic_altar/lust.json
d029d639444bf99453bda243849a653fff3f7147 data/botania/recipes/runic_altar/mana.json
bc8be6b5f96851c757303754a33734a1fd84c723 data/botania/recipes/runic_altar/pride.json
cf532a1ce35acee3e362d898ae7a8ba020cca895 data/botania/recipes/runic_altar/sloth.json
315617047d505132e08a9bdc1008c1e526a97816 data/botania/recipes/runic_altar/spring.json
f1b003e65557d2bb8b29278238e4f29b59b82fcf data/botania/recipes/runic_altar/summer.json
692ce35000fcffa39049aaa85af8c017ab2f43aa data/botania/recipes/runic_altar/water.json
278b820df4d0b34df0e3102b5f31ff9819e206e1 data/botania/recipes/runic_altar/winter.json
1056f240a8335fb0a850ba7109a8c47956bd90f0 data/botania/recipes/runic_altar/wrath.json
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json
index 7526686d9..86796a3da 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json
@@ -21,5 +21,8 @@
  "output": {
    "count": 2,
    "item": "botania:rune_air"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json
index 70b08123b..2c97104d4 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json
@@ -23,5 +23,8 @@
  "mana": 8000,
  "output": {
    "item": "botania:rune_autumn"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json
index ff2ae9761..3b8bb7504 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json
@@ -26,5 +26,8 @@
  "output": {
    "count": 2,
    "item": "botania:rune_earth"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json
index 1ab9277e3..f985a4086 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_envy"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json
index 064ee0e09..1a6d6420e 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json
@@ -21,5 +21,8 @@
  "output": {
    "count": 2,
    "item": "botania:rune_fire"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json
index e1d408ce5..884768fcf 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_gluttony"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json
index 247c6a2a5..cfb8deb01 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_greed"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json
index 969dc2b3e..3469a370a 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json
@@ -20,5 +20,8 @@
  "mana": 22500,
  "output": {
    "item": "minecraft:player_head"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json
index c443c522e..252d79a41 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_lust"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json
index fabc17782..811547c0f 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json
@@ -23,5 +23,8 @@
  "mana": 8000,
  "output": {
    "item": "botania:rune_mana"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json
index 09e373285..fac43967e 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_pride"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json
index a763a5d92..630edde4d 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_sloth"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json
index e8de0ce3a..0fafd22e5 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json
@@ -23,5 +23,8 @@
  "mana": 8000,
  "output": {
    "item": "botania:rune_spring"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json
index cbc7c6f3d..20edae600 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json
@@ -23,5 +23,8 @@
  "mana": 8000,
  "output": {
    "item": "botania:rune_summer"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json
index 6becffcbc..c984cdcbf 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json
@@ -21,5 +21,8 @@
  "output": {
    "count": 2,
    "item": "botania:rune_water"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json
index fbe81fc12..6317f49b2 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json
@@ -23,5 +23,8 @@
  "mana": 8000,
  "output": {
    "item": "botania:rune_winter"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json
index 9e6c6edd9..e08340960 100644
--- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json
+++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json
@@ -17,5 +17,8 @@
  "mana": 12000,
  "output": {
    "item": "botania:rune_wrath"
  },
  "reagent": {
    "item": "botania:livingrock"
  }
}
\ No newline at end of file
diff --git a/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java b/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java
index fa9dfc033..18aab9501 100644
--- a/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java
+++ b/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java
@@ -11,6 +11,7 @@
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.Container;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeType;

@@ -23,6 +24,12 @@ public interface RunicAltarRecipe extends Recipe<Container> {

	int getManaUsage();

	/**
	 * @return Ingredient matching the final item that needs to be set on top of the
	 *         altar to perform a craft after a matching recipe has been supplied its mana.
	 */
	Ingredient getReagent();

	@NotNull
	@Override
	default RecipeType<?> getType() {
diff --git a/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java b/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java
index 793351d92..0ab1b7c27 100644
--- a/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java
+++ b/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java
@@ -36,13 +36,15 @@
public class RunicAltarRecipe implements vazkii.botania.api.recipe.RunicAltarRecipe {
	private final ResourceLocation id;
	private final ItemStack output;
	private final Ingredient reagent;
	private final NonNullList<Ingredient> inputs;
	private final int mana;

	public RunicAltarRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
	public RunicAltarRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
		Preconditions.checkArgument(inputs.length <= 16, "Cannot have more than 16 ingredients");
		this.id = id;
		this.output = output;
		this.reagent = reagent;
		this.inputs = NonNullList.of(Ingredient.EMPTY, inputs);
		this.mana = mana;
	}
@@ -64,6 +66,12 @@ public ItemStack assemble(@NotNull Container inv, @NotNull RegistryAccess regist
		return getResultItem(registries).copy();
	}

	@NotNull
	@Override
	public Ingredient getReagent() {
		return reagent;
	}

	@NotNull
	@Override
	public NonNullList<Ingredient> getIngredients() {
@@ -98,13 +106,14 @@ public static class Serializer implements RecipeSerializer<RunicAltarRecipe> {
		@Override
		public RunicAltarRecipe fromJson(@NotNull ResourceLocation id, @NotNull JsonObject json) {
			ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "output"));
			Ingredient reagent = Ingredient.fromJson(json.get("reagent"));
			int mana = GsonHelper.getAsInt(json, "mana");
			JsonArray ingrs = GsonHelper.getAsJsonArray(json, "ingredients");
			List<Ingredient> inputs = new ArrayList<>();
			for (JsonElement e : ingrs) {
				inputs.add(Ingredient.fromJson(e));
			}
			return new RunicAltarRecipe(id, output, mana, inputs.toArray(new Ingredient[0]));
			return new RunicAltarRecipe(id, output, mana, reagent, inputs.toArray(new Ingredient[0]));
		}

		@Override
@@ -113,9 +122,10 @@ public RunicAltarRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull Frien
			for (int i = 0; i < inputs.length; i++) {
				inputs[i] = Ingredient.fromNetwork(buf);
			}
			Ingredient reagent = Ingredient.fromNetwork(buf);
			ItemStack output = buf.readItem();
			int mana = buf.readVarInt();
			return new RunicAltarRecipe(id, output, mana, inputs);
			return new RunicAltarRecipe(id, output, mana, reagent, inputs);
		}

		@Override
@@ -124,6 +134,7 @@ public void toNetwork(@NotNull FriendlyByteBuf buf, @NotNull RunicAltarRecipe re
			for (Ingredient input : recipe.getIngredients()) {
				input.toNetwork(buf);
			}
			recipe.reagent.toNetwork(buf);
			buf.writeItem(recipe.output);
			buf.writeVarInt(recipe.getManaUsage());
		}
diff --git a/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java b/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java
index cb2b4853e..c7d56ae8f 100644
--- a/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java
+++ b/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java
@@ -36,8 +36,8 @@

public class HeadRecipe extends RunicAltarRecipe {

	public HeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
		super(id, output, mana, inputs);
	public HeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
		super(id, output, mana, reagent, inputs);
	}

	@Override
@@ -83,13 +83,14 @@ public static class Serializer implements RecipeSerializer<HeadRecipe> {
		@Override
		public HeadRecipe fromJson(@NotNull ResourceLocation id, @NotNull JsonObject json) {
			ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "output"));
			Ingredient reagent = Ingredient.fromJson(json.get("reagent"));
			int mana = GsonHelper.getAsInt(json, "mana");
			JsonArray ingrs = GsonHelper.getAsJsonArray(json, "ingredients");
			List<Ingredient> inputs = new ArrayList<>();
			for (JsonElement e : ingrs) {
				inputs.add(Ingredient.fromJson(e));
			}
			return new HeadRecipe(id, output, mana, inputs.toArray(new Ingredient[0]));
			return new HeadRecipe(id, output, mana, reagent, inputs.toArray(new Ingredient[0]));
		}

		@Override
@@ -98,9 +99,10 @@ public HeadRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull FriendlyByt
			for (int i = 0; i < inputs.length; i++) {
				inputs[i] = Ingredient.fromNetwork(buf);
			}
			Ingredient reagent = Ingredient.fromNetwork(buf);
			ItemStack output = buf.readItem();
			int mana = buf.readVarInt();
			return new HeadRecipe(id, output, mana, inputs);
			return new HeadRecipe(id, output, mana, reagent, inputs);
		}

		@Override
diff --git a/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java b/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java
index bca9373ca..268fce6f0 100644
--- a/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java
+++ b/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java
@@ -22,6 +22,7 @@

import org.jetbrains.annotations.Nullable;

import vazkii.botania.common.block.BotaniaBlocks;
import vazkii.botania.common.crafting.BotaniaRecipeTypes;
import vazkii.botania.common.helper.ItemNBTHelper;
import vazkii.botania.common.item.BotaniaItems;
@@ -32,6 +33,8 @@
import static vazkii.botania.common.lib.ResourceLocationHelper.prefix;

public class RunicAltarProvider extends BotaniaRecipeProvider {
	private static final Ingredient DEFAULT_REAGENT = Ingredient.of(BotaniaBlocks.livingrock.asItem());

	public RunicAltarProvider(PackOutput packOutput) {
		super(packOutput);
	}
@@ -50,14 +53,14 @@ public void buildRecipes(Consumer<net.minecraft.data.recipes.FinishedRecipe> con
		Ingredient manaSteel = Ingredient.of(BotaniaTags.Items.INGOTS_MANASTEEL);
		Ingredient manaDiamond = Ingredient.of(BotaniaTags.Items.GEMS_MANA_DIAMOND);
		Ingredient manaPowder = Ingredient.of(BotaniaTags.Items.DUSTS_MANA);
		consumer.accept(new FinishedRecipe(idFor("water"), new ItemStack(BotaniaItems.runeWater, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.BONE_MEAL), Ingredient.of(Blocks.SUGAR_CANE), Ingredient.of(Items.FISHING_ROD)));
		consumer.accept(new FinishedRecipe(idFor("fire"), new ItemStack(BotaniaItems.runeFire, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.NETHER_BRICK), Ingredient.of(Items.GUNPOWDER), Ingredient.of(Items.NETHER_WART)));
		consumer.accept(make("water", new ItemStack(BotaniaItems.runeWater, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.BONE_MEAL), Ingredient.of(Blocks.SUGAR_CANE), Ingredient.of(Items.FISHING_ROD)));
		consumer.accept(make("fire", new ItemStack(BotaniaItems.runeFire, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.NETHER_BRICK), Ingredient.of(Items.GUNPOWDER), Ingredient.of(Items.NETHER_WART)));

		Ingredient stone = Ingredient.of(Blocks.STONE);
		Ingredient coalBlock = Ingredient.of(Blocks.COAL_BLOCK);
		consumer.accept(new FinishedRecipe(idFor("earth"), new ItemStack(BotaniaItems.runeEarth, 2), costTier1, manaPowder, manaSteel, stone, coalBlock, Ingredient.of(Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM)));
		consumer.accept(make("earth", new ItemStack(BotaniaItems.runeEarth, 2), costTier1, manaPowder, manaSteel, stone, coalBlock, Ingredient.of(Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM)));

		consumer.accept(new FinishedRecipe(idFor("air"), new ItemStack(BotaniaItems.runeAir, 2), costTier1, manaPowder, manaSteel, Ingredient.of(ItemTags.WOOL_CARPETS), Ingredient.of(Items.FEATHER), Ingredient.of(Items.STRING)));
		consumer.accept(make("air", new ItemStack(BotaniaItems.runeAir, 2), costTier1, manaPowder, manaSteel, Ingredient.of(ItemTags.WOOL_CARPETS), Ingredient.of(Items.FEATHER), Ingredient.of(Items.STRING)));

		Ingredient fire = Ingredient.of(BotaniaItems.runeFire);
		Ingredient water = Ingredient.of(BotaniaItems.runeWater);
@@ -67,44 +70,50 @@ public void buildRecipes(Consumer<net.minecraft.data.recipes.FinishedRecipe> con
		Ingredient sapling = Ingredient.of(ItemTags.SAPLINGS);
		Ingredient leaves = Ingredient.of(ItemTags.LEAVES);
		Ingredient sand = Ingredient.of(ItemTags.SAND);
		consumer.accept(new FinishedRecipe(idFor("spring"), new ItemStack(BotaniaItems.runeSpring), costTier2, water, fire, sapling, sapling, sapling, Ingredient.of(Items.WHEAT)));
		consumer.accept(new FinishedRecipe(idFor("summer"), new ItemStack(BotaniaItems.runeSummer), costTier2, earth, air, sand, sand, Ingredient.of(Items.SLIME_BALL), Ingredient.of(Items.MELON_SLICE)));
		consumer.accept(new FinishedRecipe(idFor("autumn"), new ItemStack(BotaniaItems.runeAutumn), costTier2, fire, air, leaves, leaves, leaves, Ingredient.of(Items.SPIDER_EYE)));
		consumer.accept(make("spring", new ItemStack(BotaniaItems.runeSpring), costTier2, water, fire, sapling, sapling, sapling, Ingredient.of(Items.WHEAT)));
		consumer.accept(make("summer", new ItemStack(BotaniaItems.runeSummer), costTier2, earth, air, sand, sand, Ingredient.of(Items.SLIME_BALL), Ingredient.of(Items.MELON_SLICE)));
		consumer.accept(make("autumn", new ItemStack(BotaniaItems.runeAutumn), costTier2, fire, air, leaves, leaves, leaves, Ingredient.of(Items.SPIDER_EYE)));

		consumer.accept(new FinishedRecipe(idFor("winter"), new ItemStack(BotaniaItems.runeWinter), costTier2, water, earth, Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(ItemTags.WOOL), Ingredient.of(Blocks.CAKE)));
		consumer.accept(make("winter", new ItemStack(BotaniaItems.runeWinter), costTier2, water, earth, Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(ItemTags.WOOL), Ingredient.of(Blocks.CAKE)));

		Ingredient spring = Ingredient.of(BotaniaItems.runeSpring);
		Ingredient summer = Ingredient.of(BotaniaItems.runeSummer);
		Ingredient autumn = Ingredient.of(BotaniaItems.runeAutumn);
		Ingredient winter = Ingredient.of(BotaniaItems.runeWinter);

		consumer.accept(new FinishedRecipe(idFor("mana"), new ItemStack(BotaniaItems.runeMana), costTier2, manaSteel, manaSteel, manaSteel, manaSteel, manaSteel, Ingredient.of(BotaniaItems.manaPearl)));
		consumer.accept(make("mana", new ItemStack(BotaniaItems.runeMana), costTier2, manaSteel, manaSteel, manaSteel, manaSteel, manaSteel, Ingredient.of(BotaniaItems.manaPearl)));

		consumer.accept(new FinishedRecipe(idFor("lust"), new ItemStack(BotaniaItems.runeLust), costTier3, manaDiamond, manaDiamond, summer, air));
		consumer.accept(new FinishedRecipe(idFor("gluttony"), new ItemStack(BotaniaItems.runeGluttony), costTier3, manaDiamond, manaDiamond, winter, fire));
		consumer.accept(new FinishedRecipe(idFor("greed"), new ItemStack(BotaniaItems.runeGreed), costTier3, manaDiamond, manaDiamond, spring, water));
		consumer.accept(new FinishedRecipe(idFor("sloth"), new ItemStack(BotaniaItems.runeSloth), costTier3, manaDiamond, manaDiamond, autumn, air));
		consumer.accept(new FinishedRecipe(idFor("wrath"), new ItemStack(BotaniaItems.runeWrath), costTier3, manaDiamond, manaDiamond, winter, earth));
		consumer.accept(new FinishedRecipe(idFor("envy"), new ItemStack(BotaniaItems.runeEnvy), costTier3, manaDiamond, manaDiamond, winter, water));
		consumer.accept(new FinishedRecipe(idFor("pride"), new ItemStack(BotaniaItems.runePride), costTier3, manaDiamond, manaDiamond, summer, fire));
		consumer.accept(make("lust", new ItemStack(BotaniaItems.runeLust), costTier3, manaDiamond, manaDiamond, summer, air));
		consumer.accept(make("gluttony", new ItemStack(BotaniaItems.runeGluttony), costTier3, manaDiamond, manaDiamond, winter, fire));
		consumer.accept(make("greed", new ItemStack(BotaniaItems.runeGreed), costTier3, manaDiamond, manaDiamond, spring, water));
		consumer.accept(make("sloth", new ItemStack(BotaniaItems.runeSloth), costTier3, manaDiamond, manaDiamond, autumn, air));
		consumer.accept(make("wrath", new ItemStack(BotaniaItems.runeWrath), costTier3, manaDiamond, manaDiamond, winter, earth));
		consumer.accept(make("envy", new ItemStack(BotaniaItems.runeEnvy), costTier3, manaDiamond, manaDiamond, winter, water));
		consumer.accept(make("pride", new ItemStack(BotaniaItems.runePride), costTier3, manaDiamond, manaDiamond, summer, fire));

		consumer.accept(new FinishedHeadRecipe(idFor("head"), new ItemStack(Items.PLAYER_HEAD), 22500, Ingredient.of(Items.SKELETON_SKULL), Ingredient.of(BotaniaItems.pixieDust), Ingredient.of(Items.PRISMARINE_CRYSTALS), Ingredient.of(Items.NAME_TAG), Ingredient.of(Items.GOLDEN_APPLE)));
		consumer.accept(new FinishedHeadRecipe(idFor("head"), new ItemStack(Items.PLAYER_HEAD), 22500, DEFAULT_REAGENT, Ingredient.of(Items.SKELETON_SKULL), Ingredient.of(BotaniaItems.pixieDust), Ingredient.of(Items.PRISMARINE_CRYSTALS), Ingredient.of(Items.NAME_TAG), Ingredient.of(Items.GOLDEN_APPLE)));
	}

	private static ResourceLocation idFor(String s) {
		return prefix("runic_altar/" + s);
	}

	private static FinishedRecipe make(String id, ItemStack output, int mana, Ingredient... inputs) {
		return new FinishedRecipe(idFor(id), output, mana, DEFAULT_REAGENT, inputs);
	}

	protected static class FinishedRecipe implements net.minecraft.data.recipes.FinishedRecipe {
		private final ResourceLocation id;
		private final ItemStack output;
		private final int mana;
		private final Ingredient reagent;
		private final Ingredient[] inputs;

		protected FinishedRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
		protected FinishedRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
			this.id = id;
			this.output = output;
			this.mana = mana;
			this.reagent = reagent;
			this.inputs = inputs;
		}

@@ -116,6 +125,7 @@ public void serializeRecipeData(JsonObject json) {
				ingredients.add(ingr.toJson());
			}
			json.addProperty("mana", mana);
			json.add("reagent", reagent.toJson());
			json.add("ingredients", ingredients);
		}

@@ -143,8 +153,8 @@ public ResourceLocation getAdvancementId() {
	}

	private static class FinishedHeadRecipe extends FinishedRecipe {
		private FinishedHeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
			super(id, output, mana, inputs);
		private FinishedHeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
			super(id, output, mana, reagent, inputs);
		}

		@Override
-- 
2.39.3 (Apple Git-145)

[botania/patches/linux.yml] build success

builds.sr.ht <builds@sr.ht>
Details
Message ID
<CWNCLUZ3A8DF.12Q64JHHG8N9N@cirno2>
In-Reply-To
<20231101083228.12464-1-theArtemisSystem@gmail.com> (view parent)
DKIM signature
missing
Download raw message
botania/patches/linux.yml: SUCCESS in 21m36s

[Add reagent to runic altar recipe format][0] from [Artemis System][1]

[0]: https://lists.sr.ht/~williewillus/violet-moon/patches/46301
[1]: theartemissystem@gmail.com

✓ #1086224 SUCCESS botania/patches/linux.yml https://builds.sr.ht/~williewillus/job/1086224
Details
Message ID
<87a5rx9umk.fsf@vincent-lee.net>
In-Reply-To
<20231101083228.12464-1-theArtemisSystem@gmail.com> (view parent)
DKIM signature
missing
Download raw message
lgtm, but make sure to update the HUD render to render the right reagent
instead of livingrock now.

Artemis System <theartemissystem@gmail.com> writes:

> Not used yet, will be used in a future commit
> ---
> Figured i'll just send these one by one, more commits incoming
>  .../cc3f2b57729a50761cd506b810b841f2b4fbd4d1  | 34 ++++++-------
>  .../data/botania/recipes/runic_altar/air.json |  3 ++
>  .../botania/recipes/runic_altar/autumn.json   |  3 ++
>  .../botania/recipes/runic_altar/earth.json    |  3 ++
>  .../botania/recipes/runic_altar/envy.json     |  3 ++
>  .../botania/recipes/runic_altar/fire.json     |  3 ++
>  .../botania/recipes/runic_altar/gluttony.json |  3 ++
>  .../botania/recipes/runic_altar/greed.json    |  3 ++
>  .../botania/recipes/runic_altar/head.json     |  3 ++
>  .../botania/recipes/runic_altar/lust.json     |  3 ++
>  .../botania/recipes/runic_altar/mana.json     |  3 ++
>  .../botania/recipes/runic_altar/pride.json    |  3 ++
>  .../botania/recipes/runic_altar/sloth.json    |  3 ++
>  .../botania/recipes/runic_altar/spring.json   |  3 ++
>  .../botania/recipes/runic_altar/summer.json   |  3 ++
>  .../botania/recipes/runic_altar/water.json    |  3 ++
>  .../botania/recipes/runic_altar/winter.json   |  3 ++
>  .../botania/recipes/runic_altar/wrath.json    |  3 ++
>  .../botania/api/recipe/RunicAltarRecipe.java  |  7 +++
>  .../common/crafting/RunicAltarRecipe.java     | 17 +++++--
>  .../common/crafting/recipe/HeadRecipe.java    | 10 ++--
>  .../data/recipes/RunicAltarProvider.java      | 50 +++++++++++--------
>  22 files changed, 125 insertions(+), 44 deletions(-)
>
> diff --git a/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1 b/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1
> index abb0c51d5..4df5737e5 100644
> --- a/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1
> +++ b/Xplat/src/generated/resources/.cache/cc3f2b57729a50761cd506b810b841f2b4fbd4d1
> @@ -1,18 +1,18 @@
>  // 1.20.1	Botania/Botania runic altar recipes
> -d3e8d746a742c5d7dd5e193d509152c4f9f72579 data/botania/recipes/runic_altar/air.json
> -1e435d483560295df329b0492e273c96684ebc31 data/botania/recipes/runic_altar/autumn.json
> -c4d5f2f0463e30f027633f823206abdcbad51615 data/botania/recipes/runic_altar/earth.json
> -33e0e91504b99b4aa1b774ff15a09cd7784bc5a7 data/botania/recipes/runic_altar/envy.json
> -c338f61ea4e5a71f8a077f441d22876a3210d883 data/botania/recipes/runic_altar/fire.json
> -60c53a002299c3c09834ae064fea39f2b27d0b43 data/botania/recipes/runic_altar/gluttony.json
> -c1fc0e465c8841a957fd089ff03cc4016495d02d data/botania/recipes/runic_altar/greed.json
> -6b78f960968e8ecf702133fbe5eab7d2d69e0f90 data/botania/recipes/runic_altar/head.json
> -e3fbdc270b0f4683037339c343a66f4cd164a0f9 data/botania/recipes/runic_altar/lust.json
> -01f95a3f44dfe54a8decd884b59ae6eff1a9e630 data/botania/recipes/runic_altar/mana.json
> -afd58f8ffe62da670ae78440894df295a91abbf3 data/botania/recipes/runic_altar/pride.json
> -be172e445b8a4163dde39e9bda7d423c2969e432 data/botania/recipes/runic_altar/sloth.json
> -3ee7f564c4648730da8485ddd4c2b7d7e344fd97 data/botania/recipes/runic_altar/spring.json
> -c24445c4e8604d6ae389c44bcc31a8b5b4ca1a43 data/botania/recipes/runic_altar/summer.json
> -ff2aecc043e973846581df1e71b8f06bd0baec49 data/botania/recipes/runic_altar/water.json
> -ce03fd7559ca0b69ad015771dde3e0302a5b3fe1 data/botania/recipes/runic_altar/winter.json
> -6f42dd5896ea2edb2f2de1002f321fcac20af64e data/botania/recipes/runic_altar/wrath.json
> +d3324e594d2e5ed2895639902d32c83709d8e648 data/botania/recipes/runic_altar/air.json
> +325af549ac5c1cea1169867b71c8fc68eb836ccb data/botania/recipes/runic_altar/autumn.json
> +61f99973d60f283c8e3a256d3adc162d24dcfcf7 data/botania/recipes/runic_altar/earth.json
> +453248fc5f8692bfc6bfa0f2d63d6bcef29c7017 data/botania/recipes/runic_altar/envy.json
> +4cfa28ba8be3f462f36a8b1ac988c0e264827287 data/botania/recipes/runic_altar/fire.json
> +297764f3e04560bc86e8a138605512cceb866c3c data/botania/recipes/runic_altar/gluttony.json
> +a54174d121d45647852ea6435f07daebc2036061 data/botania/recipes/runic_altar/greed.json
> +d4eb2be08a9d31d11a3c593dbdf7dde2337c7114 data/botania/recipes/runic_altar/head.json
> +e491486adb868deb0db10007377cb84d689846db data/botania/recipes/runic_altar/lust.json
> +d029d639444bf99453bda243849a653fff3f7147 data/botania/recipes/runic_altar/mana.json
> +bc8be6b5f96851c757303754a33734a1fd84c723 data/botania/recipes/runic_altar/pride.json
> +cf532a1ce35acee3e362d898ae7a8ba020cca895 data/botania/recipes/runic_altar/sloth.json
> +315617047d505132e08a9bdc1008c1e526a97816 data/botania/recipes/runic_altar/spring.json
> +f1b003e65557d2bb8b29278238e4f29b59b82fcf data/botania/recipes/runic_altar/summer.json
> +692ce35000fcffa39049aaa85af8c017ab2f43aa data/botania/recipes/runic_altar/water.json
> +278b820df4d0b34df0e3102b5f31ff9819e206e1 data/botania/recipes/runic_altar/winter.json
> +1056f240a8335fb0a850ba7109a8c47956bd90f0 data/botania/recipes/runic_altar/wrath.json
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json
> index 7526686d9..86796a3da 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/air.json
> @@ -21,5 +21,8 @@
>    "output": {
>      "count": 2,
>      "item": "botania:rune_air"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json
> index 70b08123b..2c97104d4 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/autumn.json
> @@ -23,5 +23,8 @@
>    "mana": 8000,
>    "output": {
>      "item": "botania:rune_autumn"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json
> index ff2ae9761..3b8bb7504 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/earth.json
> @@ -26,5 +26,8 @@
>    "output": {
>      "count": 2,
>      "item": "botania:rune_earth"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json
> index 1ab9277e3..f985a4086 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/envy.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_envy"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json
> index 064ee0e09..1a6d6420e 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/fire.json
> @@ -21,5 +21,8 @@
>    "output": {
>      "count": 2,
>      "item": "botania:rune_fire"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json
> index e1d408ce5..884768fcf 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/gluttony.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_gluttony"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json
> index 247c6a2a5..cfb8deb01 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/greed.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_greed"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json
> index 969dc2b3e..3469a370a 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/head.json
> @@ -20,5 +20,8 @@
>    "mana": 22500,
>    "output": {
>      "item": "minecraft:player_head"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json
> index c443c522e..252d79a41 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/lust.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_lust"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json
> index fabc17782..811547c0f 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/mana.json
> @@ -23,5 +23,8 @@
>    "mana": 8000,
>    "output": {
>      "item": "botania:rune_mana"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json
> index 09e373285..fac43967e 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/pride.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_pride"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json
> index a763a5d92..630edde4d 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/sloth.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_sloth"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json
> index e8de0ce3a..0fafd22e5 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/spring.json
> @@ -23,5 +23,8 @@
>    "mana": 8000,
>    "output": {
>      "item": "botania:rune_spring"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json
> index cbc7c6f3d..20edae600 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/summer.json
> @@ -23,5 +23,8 @@
>    "mana": 8000,
>    "output": {
>      "item": "botania:rune_summer"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json
> index 6becffcbc..c984cdcbf 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/water.json
> @@ -21,5 +21,8 @@
>    "output": {
>      "count": 2,
>      "item": "botania:rune_water"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json
> index fbe81fc12..6317f49b2 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/winter.json
> @@ -23,5 +23,8 @@
>    "mana": 8000,
>    "output": {
>      "item": "botania:rune_winter"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json
> index 9e6c6edd9..e08340960 100644
> --- a/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json
> +++ b/Xplat/src/generated/resources/data/botania/recipes/runic_altar/wrath.json
> @@ -17,5 +17,8 @@
>    "mana": 12000,
>    "output": {
>      "item": "botania:rune_wrath"
> +  },
> +  "reagent": {
> +    "item": "botania:livingrock"
>    }
>  }
> \ No newline at end of file
> diff --git a/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java b/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java
> index fa9dfc033..18aab9501 100644
> --- a/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java
> +++ b/Xplat/src/main/java/vazkii/botania/api/recipe/RunicAltarRecipe.java
> @@ -11,6 +11,7 @@
>  import net.minecraft.core.registries.BuiltInRegistries;
>  import net.minecraft.resources.ResourceLocation;
>  import net.minecraft.world.Container;
> +import net.minecraft.world.item.crafting.Ingredient;
>  import net.minecraft.world.item.crafting.Recipe;
>  import net.minecraft.world.item.crafting.RecipeType;
>  
> @@ -23,6 +24,12 @@ public interface RunicAltarRecipe extends Recipe<Container> {
>  
>  	int getManaUsage();
>  
> +	/**
> +	 * @return Ingredient matching the final item that needs to be set on top of the
> +	 *         altar to perform a craft after a matching recipe has been supplied its mana.
> +	 */
> +	Ingredient getReagent();
> +
>  	@NotNull
>  	@Override
>  	default RecipeType<?> getType() {
> diff --git a/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java b/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java
> index 793351d92..0ab1b7c27 100644
> --- a/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java
> +++ b/Xplat/src/main/java/vazkii/botania/common/crafting/RunicAltarRecipe.java
> @@ -36,13 +36,15 @@
>  public class RunicAltarRecipe implements vazkii.botania.api.recipe.RunicAltarRecipe {
>  	private final ResourceLocation id;
>  	private final ItemStack output;
> +	private final Ingredient reagent;
>  	private final NonNullList<Ingredient> inputs;
>  	private final int mana;
>  
> -	public RunicAltarRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
> +	public RunicAltarRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
>  		Preconditions.checkArgument(inputs.length <= 16, "Cannot have more than 16 ingredients");
>  		this.id = id;
>  		this.output = output;
> +		this.reagent = reagent;
>  		this.inputs = NonNullList.of(Ingredient.EMPTY, inputs);
>  		this.mana = mana;
>  	}
> @@ -64,6 +66,12 @@ public ItemStack assemble(@NotNull Container inv, @NotNull RegistryAccess regist
>  		return getResultItem(registries).copy();
>  	}
>  
> +	@NotNull
> +	@Override
> +	public Ingredient getReagent() {
> +		return reagent;
> +	}
> +
>  	@NotNull
>  	@Override
>  	public NonNullList<Ingredient> getIngredients() {
> @@ -98,13 +106,14 @@ public static class Serializer implements RecipeSerializer<RunicAltarRecipe> {
>  		@Override
>  		public RunicAltarRecipe fromJson(@NotNull ResourceLocation id, @NotNull JsonObject json) {
>  			ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "output"));
> +			Ingredient reagent = Ingredient.fromJson(json.get("reagent"));
>  			int mana = GsonHelper.getAsInt(json, "mana");
>  			JsonArray ingrs = GsonHelper.getAsJsonArray(json, "ingredients");
>  			List<Ingredient> inputs = new ArrayList<>();
>  			for (JsonElement e : ingrs) {
>  				inputs.add(Ingredient.fromJson(e));
>  			}
> -			return new RunicAltarRecipe(id, output, mana, inputs.toArray(new Ingredient[0]));
> +			return new RunicAltarRecipe(id, output, mana, reagent, inputs.toArray(new Ingredient[0]));
>  		}
>  
>  		@Override
> @@ -113,9 +122,10 @@ public RunicAltarRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull Frien
>  			for (int i = 0; i < inputs.length; i++) {
>  				inputs[i] = Ingredient.fromNetwork(buf);
>  			}
> +			Ingredient reagent = Ingredient.fromNetwork(buf);
>  			ItemStack output = buf.readItem();
>  			int mana = buf.readVarInt();
> -			return new RunicAltarRecipe(id, output, mana, inputs);
> +			return new RunicAltarRecipe(id, output, mana, reagent, inputs);
>  		}
>  
>  		@Override
> @@ -124,6 +134,7 @@ public void toNetwork(@NotNull FriendlyByteBuf buf, @NotNull RunicAltarRecipe re
>  			for (Ingredient input : recipe.getIngredients()) {
>  				input.toNetwork(buf);
>  			}
> +			recipe.reagent.toNetwork(buf);
>  			buf.writeItem(recipe.output);
>  			buf.writeVarInt(recipe.getManaUsage());
>  		}
> diff --git a/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java b/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java
> index cb2b4853e..c7d56ae8f 100644
> --- a/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java
> +++ b/Xplat/src/main/java/vazkii/botania/common/crafting/recipe/HeadRecipe.java
> @@ -36,8 +36,8 @@
>  
>  public class HeadRecipe extends RunicAltarRecipe {
>  
> -	public HeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
> -		super(id, output, mana, inputs);
> +	public HeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
> +		super(id, output, mana, reagent, inputs);
>  	}
>  
>  	@Override
> @@ -83,13 +83,14 @@ public static class Serializer implements RecipeSerializer<HeadRecipe> {
>  		@Override
>  		public HeadRecipe fromJson(@NotNull ResourceLocation id, @NotNull JsonObject json) {
>  			ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(json, "output"));
> +			Ingredient reagent = Ingredient.fromJson(json.get("reagent"));
>  			int mana = GsonHelper.getAsInt(json, "mana");
>  			JsonArray ingrs = GsonHelper.getAsJsonArray(json, "ingredients");
>  			List<Ingredient> inputs = new ArrayList<>();
>  			for (JsonElement e : ingrs) {
>  				inputs.add(Ingredient.fromJson(e));
>  			}
> -			return new HeadRecipe(id, output, mana, inputs.toArray(new Ingredient[0]));
> +			return new HeadRecipe(id, output, mana, reagent, inputs.toArray(new Ingredient[0]));
>  		}
>  
>  		@Override
> @@ -98,9 +99,10 @@ public HeadRecipe fromNetwork(@NotNull ResourceLocation id, @NotNull FriendlyByt
>  			for (int i = 0; i < inputs.length; i++) {
>  				inputs[i] = Ingredient.fromNetwork(buf);
>  			}
> +			Ingredient reagent = Ingredient.fromNetwork(buf);
>  			ItemStack output = buf.readItem();
>  			int mana = buf.readVarInt();
> -			return new HeadRecipe(id, output, mana, inputs);
> +			return new HeadRecipe(id, output, mana, reagent, inputs);
>  		}
>  
>  		@Override
> diff --git a/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java b/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java
> index bca9373ca..268fce6f0 100644
> --- a/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java
> +++ b/Xplat/src/main/java/vazkii/botania/data/recipes/RunicAltarProvider.java
> @@ -22,6 +22,7 @@
>  
>  import org.jetbrains.annotations.Nullable;
>  
> +import vazkii.botania.common.block.BotaniaBlocks;
>  import vazkii.botania.common.crafting.BotaniaRecipeTypes;
>  import vazkii.botania.common.helper.ItemNBTHelper;
>  import vazkii.botania.common.item.BotaniaItems;
> @@ -32,6 +33,8 @@
>  import static vazkii.botania.common.lib.ResourceLocationHelper.prefix;
>  
>  public class RunicAltarProvider extends BotaniaRecipeProvider {
> +	private static final Ingredient DEFAULT_REAGENT = Ingredient.of(BotaniaBlocks.livingrock.asItem());
> +
>  	public RunicAltarProvider(PackOutput packOutput) {
>  		super(packOutput);
>  	}
> @@ -50,14 +53,14 @@ public void buildRecipes(Consumer<net.minecraft.data.recipes.FinishedRecipe> con
>  		Ingredient manaSteel = Ingredient.of(BotaniaTags.Items.INGOTS_MANASTEEL);
>  		Ingredient manaDiamond = Ingredient.of(BotaniaTags.Items.GEMS_MANA_DIAMOND);
>  		Ingredient manaPowder = Ingredient.of(BotaniaTags.Items.DUSTS_MANA);
> -		consumer.accept(new FinishedRecipe(idFor("water"), new ItemStack(BotaniaItems.runeWater, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.BONE_MEAL), Ingredient.of(Blocks.SUGAR_CANE), Ingredient.of(Items.FISHING_ROD)));
> -		consumer.accept(new FinishedRecipe(idFor("fire"), new ItemStack(BotaniaItems.runeFire, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.NETHER_BRICK), Ingredient.of(Items.GUNPOWDER), Ingredient.of(Items.NETHER_WART)));
> +		consumer.accept(make("water", new ItemStack(BotaniaItems.runeWater, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.BONE_MEAL), Ingredient.of(Blocks.SUGAR_CANE), Ingredient.of(Items.FISHING_ROD)));
> +		consumer.accept(make("fire", new ItemStack(BotaniaItems.runeFire, 2), costTier1, manaPowder, manaSteel, Ingredient.of(Items.NETHER_BRICK), Ingredient.of(Items.GUNPOWDER), Ingredient.of(Items.NETHER_WART)));
>  
>  		Ingredient stone = Ingredient.of(Blocks.STONE);
>  		Ingredient coalBlock = Ingredient.of(Blocks.COAL_BLOCK);
> -		consumer.accept(new FinishedRecipe(idFor("earth"), new ItemStack(BotaniaItems.runeEarth, 2), costTier1, manaPowder, manaSteel, stone, coalBlock, Ingredient.of(Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM)));
> +		consumer.accept(make("earth", new ItemStack(BotaniaItems.runeEarth, 2), costTier1, manaPowder, manaSteel, stone, coalBlock, Ingredient.of(Blocks.BROWN_MUSHROOM, Blocks.RED_MUSHROOM)));
>  
> -		consumer.accept(new FinishedRecipe(idFor("air"), new ItemStack(BotaniaItems.runeAir, 2), costTier1, manaPowder, manaSteel, Ingredient.of(ItemTags.WOOL_CARPETS), Ingredient.of(Items.FEATHER), Ingredient.of(Items.STRING)));
> +		consumer.accept(make("air", new ItemStack(BotaniaItems.runeAir, 2), costTier1, manaPowder, manaSteel, Ingredient.of(ItemTags.WOOL_CARPETS), Ingredient.of(Items.FEATHER), Ingredient.of(Items.STRING)));
>  
>  		Ingredient fire = Ingredient.of(BotaniaItems.runeFire);
>  		Ingredient water = Ingredient.of(BotaniaItems.runeWater);
> @@ -67,44 +70,50 @@ public void buildRecipes(Consumer<net.minecraft.data.recipes.FinishedRecipe> con
>  		Ingredient sapling = Ingredient.of(ItemTags.SAPLINGS);
>  		Ingredient leaves = Ingredient.of(ItemTags.LEAVES);
>  		Ingredient sand = Ingredient.of(ItemTags.SAND);
> -		consumer.accept(new FinishedRecipe(idFor("spring"), new ItemStack(BotaniaItems.runeSpring), costTier2, water, fire, sapling, sapling, sapling, Ingredient.of(Items.WHEAT)));
> -		consumer.accept(new FinishedRecipe(idFor("summer"), new ItemStack(BotaniaItems.runeSummer), costTier2, earth, air, sand, sand, Ingredient.of(Items.SLIME_BALL), Ingredient.of(Items.MELON_SLICE)));
> -		consumer.accept(new FinishedRecipe(idFor("autumn"), new ItemStack(BotaniaItems.runeAutumn), costTier2, fire, air, leaves, leaves, leaves, Ingredient.of(Items.SPIDER_EYE)));
> +		consumer.accept(make("spring", new ItemStack(BotaniaItems.runeSpring), costTier2, water, fire, sapling, sapling, sapling, Ingredient.of(Items.WHEAT)));
> +		consumer.accept(make("summer", new ItemStack(BotaniaItems.runeSummer), costTier2, earth, air, sand, sand, Ingredient.of(Items.SLIME_BALL), Ingredient.of(Items.MELON_SLICE)));
> +		consumer.accept(make("autumn", new ItemStack(BotaniaItems.runeAutumn), costTier2, fire, air, leaves, leaves, leaves, Ingredient.of(Items.SPIDER_EYE)));
>  
> -		consumer.accept(new FinishedRecipe(idFor("winter"), new ItemStack(BotaniaItems.runeWinter), costTier2, water, earth, Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(ItemTags.WOOL), Ingredient.of(Blocks.CAKE)));
> +		consumer.accept(make("winter", new ItemStack(BotaniaItems.runeWinter), costTier2, water, earth, Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(Blocks.SNOW_BLOCK), Ingredient.of(ItemTags.WOOL), Ingredient.of(Blocks.CAKE)));
>  
>  		Ingredient spring = Ingredient.of(BotaniaItems.runeSpring);
>  		Ingredient summer = Ingredient.of(BotaniaItems.runeSummer);
>  		Ingredient autumn = Ingredient.of(BotaniaItems.runeAutumn);
>  		Ingredient winter = Ingredient.of(BotaniaItems.runeWinter);
>  
> -		consumer.accept(new FinishedRecipe(idFor("mana"), new ItemStack(BotaniaItems.runeMana), costTier2, manaSteel, manaSteel, manaSteel, manaSteel, manaSteel, Ingredient.of(BotaniaItems.manaPearl)));
> +		consumer.accept(make("mana", new ItemStack(BotaniaItems.runeMana), costTier2, manaSteel, manaSteel, manaSteel, manaSteel, manaSteel, Ingredient.of(BotaniaItems.manaPearl)));
>  
> -		consumer.accept(new FinishedRecipe(idFor("lust"), new ItemStack(BotaniaItems.runeLust), costTier3, manaDiamond, manaDiamond, summer, air));
> -		consumer.accept(new FinishedRecipe(idFor("gluttony"), new ItemStack(BotaniaItems.runeGluttony), costTier3, manaDiamond, manaDiamond, winter, fire));
> -		consumer.accept(new FinishedRecipe(idFor("greed"), new ItemStack(BotaniaItems.runeGreed), costTier3, manaDiamond, manaDiamond, spring, water));
> -		consumer.accept(new FinishedRecipe(idFor("sloth"), new ItemStack(BotaniaItems.runeSloth), costTier3, manaDiamond, manaDiamond, autumn, air));
> -		consumer.accept(new FinishedRecipe(idFor("wrath"), new ItemStack(BotaniaItems.runeWrath), costTier3, manaDiamond, manaDiamond, winter, earth));
> -		consumer.accept(new FinishedRecipe(idFor("envy"), new ItemStack(BotaniaItems.runeEnvy), costTier3, manaDiamond, manaDiamond, winter, water));
> -		consumer.accept(new FinishedRecipe(idFor("pride"), new ItemStack(BotaniaItems.runePride), costTier3, manaDiamond, manaDiamond, summer, fire));
> +		consumer.accept(make("lust", new ItemStack(BotaniaItems.runeLust), costTier3, manaDiamond, manaDiamond, summer, air));
> +		consumer.accept(make("gluttony", new ItemStack(BotaniaItems.runeGluttony), costTier3, manaDiamond, manaDiamond, winter, fire));
> +		consumer.accept(make("greed", new ItemStack(BotaniaItems.runeGreed), costTier3, manaDiamond, manaDiamond, spring, water));
> +		consumer.accept(make("sloth", new ItemStack(BotaniaItems.runeSloth), costTier3, manaDiamond, manaDiamond, autumn, air));
> +		consumer.accept(make("wrath", new ItemStack(BotaniaItems.runeWrath), costTier3, manaDiamond, manaDiamond, winter, earth));
> +		consumer.accept(make("envy", new ItemStack(BotaniaItems.runeEnvy), costTier3, manaDiamond, manaDiamond, winter, water));
> +		consumer.accept(make("pride", new ItemStack(BotaniaItems.runePride), costTier3, manaDiamond, manaDiamond, summer, fire));
>  
> -		consumer.accept(new FinishedHeadRecipe(idFor("head"), new ItemStack(Items.PLAYER_HEAD), 22500, Ingredient.of(Items.SKELETON_SKULL), Ingredient.of(BotaniaItems.pixieDust), Ingredient.of(Items.PRISMARINE_CRYSTALS), Ingredient.of(Items.NAME_TAG), Ingredient.of(Items.GOLDEN_APPLE)));
> +		consumer.accept(new FinishedHeadRecipe(idFor("head"), new ItemStack(Items.PLAYER_HEAD), 22500, DEFAULT_REAGENT, Ingredient.of(Items.SKELETON_SKULL), Ingredient.of(BotaniaItems.pixieDust), Ingredient.of(Items.PRISMARINE_CRYSTALS), Ingredient.of(Items.NAME_TAG), Ingredient.of(Items.GOLDEN_APPLE)));
>  	}
>  
>  	private static ResourceLocation idFor(String s) {
>  		return prefix("runic_altar/" + s);
>  	}
>  
> +	private static FinishedRecipe make(String id, ItemStack output, int mana, Ingredient... inputs) {
> +		return new FinishedRecipe(idFor(id), output, mana, DEFAULT_REAGENT, inputs);
> +	}
> +
>  	protected static class FinishedRecipe implements net.minecraft.data.recipes.FinishedRecipe {
>  		private final ResourceLocation id;
>  		private final ItemStack output;
>  		private final int mana;
> +		private final Ingredient reagent;
>  		private final Ingredient[] inputs;
>  
> -		protected FinishedRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
> +		protected FinishedRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
>  			this.id = id;
>  			this.output = output;
>  			this.mana = mana;
> +			this.reagent = reagent;
>  			this.inputs = inputs;
>  		}
>  
> @@ -116,6 +125,7 @@ public void serializeRecipeData(JsonObject json) {
>  				ingredients.add(ingr.toJson());
>  			}
>  			json.addProperty("mana", mana);
> +			json.add("reagent", reagent.toJson());
>  			json.add("ingredients", ingredients);
>  		}
>  
> @@ -143,8 +153,8 @@ public ResourceLocation getAdvancementId() {
>  	}
>  
>  	private static class FinishedHeadRecipe extends FinishedRecipe {
> -		private FinishedHeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient... inputs) {
> -			super(id, output, mana, inputs);
> +		private FinishedHeadRecipe(ResourceLocation id, ItemStack output, int mana, Ingredient reagent, Ingredient... inputs) {
> +			super(id, output, mana, reagent, inputs);
>  		}
>  
>  		@Override
Reply to thread Export thread (mbox)