diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 8a56e2e2..b8f0093b 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -47,10 +47,6 @@ public class Unicopia implements ModInitializer { return new Identifier(DEFAULT_NAMESPACE, name); } - public Unicopia() { - getConfig(); - } - @Override public void onInitialize() { Channel.bootstrap(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/IngredientWithSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/IngredientWithSpell.java index b00f56ac..797cbe6e 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/IngredientWithSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/IngredientWithSpell.java @@ -6,7 +6,8 @@ import java.util.function.Predicate; import org.jetbrains.annotations.Nullable; -import com.google.gson.JsonObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.item.GemstoneItem; @@ -15,8 +16,11 @@ import net.minecraft.network.PacketByteBuf; import net.minecraft.recipe.Ingredient; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; +import net.minecraft.util.collection.DefaultedList; public class IngredientWithSpell implements Predicate { + private static final Predicate INGREDIENT_IS_PRESENT = ((Predicate)(Ingredient::isEmpty)).negate(); + private Optional stack = Optional.empty(); private Optional> spell = Optional.empty(); @@ -43,45 +47,39 @@ public class IngredientWithSpell implements Predicate { return stacks; } + public boolean isEmpty() { + return stack.filter(INGREDIENT_IS_PRESENT).isEmpty() && spell.isEmpty(); + } + public void write(PacketByteBuf buf) { - stack.ifPresentOrElse(i -> { - buf.writeBoolean(true); - i.write(buf); - }, () -> buf.writeBoolean(false)); - spell.ifPresentOrElse(i -> { - buf.writeBoolean(true); - buf.writeIdentifier(i.getId()); - }, () -> buf.writeBoolean(false)); + buf.writeOptional(stack, (b, i) -> i.write(b)); + buf.writeOptional(spell.map(SpellType::getId), PacketByteBuf::writeIdentifier); } public static IngredientWithSpell fromPacket(PacketByteBuf buf) { IngredientWithSpell ingredient = new IngredientWithSpell(); + ingredient.stack = buf.readOptional(Ingredient::fromPacket); + ingredient.spell = buf.readOptional(PacketByteBuf::readIdentifier).flatMap(SpellType.REGISTRY::getOrEmpty); + return ingredient; + } - if (buf.readBoolean()) { - ingredient.stack = Optional.ofNullable(Ingredient.fromPacket(buf)); - } - if (buf.readBoolean()) { - ingredient.spell = SpellType.REGISTRY.getOrEmpty(buf.readIdentifier()); + public static IngredientWithSpell fromJson(JsonElement json) { + IngredientWithSpell ingredient = new IngredientWithSpell(); + ingredient.stack = Optional.ofNullable(Ingredient.fromJson(json)); + if (json.isJsonObject() && json.getAsJsonObject().has("spell")) { + ingredient.spell = SpellType.REGISTRY.getOrEmpty(Identifier.tryParse(JsonHelper.getString(json.getAsJsonObject(), "spell"))); } return ingredient; } - public static IngredientWithSpell fromJson(JsonObject json) { - - IngredientWithSpell ingredient = new IngredientWithSpell(); - - if (json.has("item") || json.has("spell")) { - if (json.has("item")) { - ingredient.stack = Optional.ofNullable(Ingredient.fromJson(JsonHelper.getObject(json, "item"))); - } - if (json.has("spell")) { - ingredient.spell = SpellType.REGISTRY.getOrEmpty(Identifier.tryParse(JsonHelper.getString(json, "spell"))); - } - } else { - ingredient.stack = Optional.ofNullable(Ingredient.fromJson(json)); + public static DefaultedList fromJson(JsonArray json) { + DefaultedList ingredients = DefaultedList.of(); + for (int i = 0; i < json.size(); i++) { + IngredientWithSpell ingredient = fromJson(json.get(i)); + if (ingredient.isEmpty()) continue; + ingredients.add(ingredient); } - - return ingredient; + return ingredients; } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitRequirementRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java similarity index 61% rename from src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitRequirementRecipe.java rename to src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java index e2f16862..a7577f79 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitRequirementRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.ability.magic.spell.crafting; +import java.util.List; + import com.google.gson.JsonObject; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; @@ -13,36 +15,63 @@ import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.ShapedRecipe; import net.minecraft.util.Identifier; import net.minecraft.util.JsonHelper; +import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; /** - * Recipe that requires an item and a certain number of traits to produce a result. + * A recipe for creating a new spell from input traits and items. */ -public class TraitRequirementRecipe implements SpellbookRecipe { +public class SpellCraftingRecipe implements SpellbookRecipe { private final Identifier id; - private final IngredientWithSpell requirement; + + /** + * The ingredient to modify + */ + private final IngredientWithSpell material; + + /** + * The required traits + */ private final TraitIngredient requiredTraits; + + /** + * Items required for crafting. + */ + private final List requiredItems; + + /** + * The resulting item + */ private final ItemStack output; - private TraitRequirementRecipe(Identifier id, IngredientWithSpell requirement, TraitIngredient requiredTraits, ItemStack output) { + private SpellCraftingRecipe(Identifier id, IngredientWithSpell material, TraitIngredient requiredTraits, List requiredItems, ItemStack output) { this.id = id; - this.requirement = requirement; + this.material = material; this.requiredTraits = requiredTraits; + this.requiredItems = requiredItems; this.output = output; } @Override public void buildCraftingTree(CraftingTreeBuilder builder) { - builder.input(requirement.getMatchingStacks()); + builder.input(material.getMatchingStacks()); + for (var ingredient : requiredItems) { + builder.input(ingredient.getMatchingStacks()); + } requiredTraits.min().ifPresent(min -> { min.forEach(e -> builder.input(e.getKey(), e.getValue())); }); builder.result(output); } + @Override + public int getPriority() { + return 0; + } + @Override public boolean matches(SpellbookInventory inventory, World world) { - return requirement.test(inventory.getItemToModify()) && requiredTraits.test(inventory.getTraits()); + return material.test(inventory.getItemToModify()) && requiredTraits.test(inventory.getTraits()); } @Override @@ -86,28 +115,31 @@ public class TraitRequirementRecipe implements SpellbookRecipe { return stack; } - public static class Serializer implements RecipeSerializer { + public static class Serializer implements RecipeSerializer { @Override - public TraitRequirementRecipe read(Identifier id, JsonObject json) { - return new TraitRequirementRecipe(id, - IngredientWithSpell.fromJson(JsonHelper.getObject(json, "material")), + public SpellCraftingRecipe read(Identifier id, JsonObject json) { + return new SpellCraftingRecipe(id, + IngredientWithSpell.fromJson(json.get("material")), TraitIngredient.fromJson(JsonHelper.getObject(json, "traits")), + IngredientWithSpell.fromJson(JsonHelper.asArray(json.get("ingredients"), "ingredients")), outputFromJson(JsonHelper.getObject(json, "result"))); } @Override - public TraitRequirementRecipe read(Identifier id, PacketByteBuf buf) { - return new TraitRequirementRecipe(id, + public SpellCraftingRecipe read(Identifier id, PacketByteBuf buf) { + return new SpellCraftingRecipe(id, IngredientWithSpell.fromPacket(buf), TraitIngredient.fromPacket(buf), + buf.readCollection(DefaultedList::ofSize, IngredientWithSpell::fromPacket), buf.readItemStack() ); } @Override - public void write(PacketByteBuf buf, TraitRequirementRecipe recipe) { - recipe.requirement.write(buf); + public void write(PacketByteBuf buf, SpellCraftingRecipe recipe) { + recipe.material.write(buf); recipe.requiredTraits.write(buf); + buf.writeCollection(recipe.requiredItems, (b, i) -> i.write(b)); buf.writeItemStack(recipe.output); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java new file mode 100644 index 00000000..c2ac5316 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java @@ -0,0 +1,86 @@ +package com.minelittlepony.unicopia.ability.magic.spell.crafting; + +import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; +import com.minelittlepony.unicopia.container.SpellbookScreenHandler.SpellbookInventory; +import com.minelittlepony.unicopia.item.*; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.util.Identifier; +import net.minecraft.world.World; + +/** + * Recipe for adding traits to an existing spell. + */ +public class SpellEnhancingRecipe implements SpellbookRecipe { + private final Identifier id; + + private final IngredientWithSpell material; + + private SpellEnhancingRecipe(Identifier id, IngredientWithSpell material) { + this.id = id; + this.material = material; + } + + @Override + public void buildCraftingTree(CraftingTreeBuilder builder) { + + } + + @Override + public int getPriority() { + return 1; + } + + @Override + public boolean matches(SpellbookInventory inventory, World world) { + ItemStack stack = inventory.getItemToModify(); + return !stack.isEmpty() && stack.getItem() == UItems.GEMSTONE && GemstoneItem.isEnchanted(stack); + } + + @Override + public ItemStack craft(SpellbookInventory inventory) { + return SpellTraits.of(inventory.getItemToModify()) + .add(inventory.getTraits()) + .applyTo(inventory.getItemToModify()); + } + + @Override + public boolean fits(int width, int height) { + return (width * height) > 0; + } + + @Override + public ItemStack getOutput() { + return UItems.GEMSTONE.getDefaultStack(); + } + + @Override + public Identifier getId() { + return id; + } + + @Override + public RecipeSerializer getSerializer() { + return URecipes.TRAIT_COMBINING; + } + + public static class Serializer implements RecipeSerializer { + @Override + public SpellEnhancingRecipe read(Identifier id, JsonObject json) { + return new SpellEnhancingRecipe(id, IngredientWithSpell.fromJson(json.get("material"))); + } + + @Override + public SpellEnhancingRecipe read(Identifier id, PacketByteBuf buf) { + return new SpellEnhancingRecipe(id, IngredientWithSpell.fromPacket(buf)); + } + + @Override + public void write(PacketByteBuf buf, SpellEnhancingRecipe recipe) { + recipe.material.write(buf); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java index 704c810d..95b3534e 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java @@ -27,6 +27,8 @@ public interface SpellbookRecipe extends Recipe { void buildCraftingTree(CraftingTreeBuilder builder); + int getPriority(); + interface CraftingTreeBuilder { void input(ItemStack...stack); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitIngredient.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitIngredient.java index ebdec176..eaf35933 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitIngredient.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/TraitIngredient.java @@ -12,7 +12,7 @@ import net.minecraft.util.JsonHelper; public record TraitIngredient ( Optional min, Optional max - ) implements Predicate { + ) implements Predicate { @Override public boolean test(SpellTraits t) { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java index f75b1943..9fd4dfc0 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/trait/SpellTraits.java @@ -56,6 +56,10 @@ public final class SpellTraits implements Iterable> { return amount == 0 ? this : map(v -> v + amount); } + public SpellTraits add(SpellTraits traits) { + return union(this, traits); + } + public SpellTraits map(Function function) { return map((k, v) -> function.apply(v)); } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index 85b78c21..2895f3ce 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -1,12 +1,13 @@ package com.minelittlepony.unicopia.container; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.item.URecipes; import com.minelittlepony.unicopia.util.InventoryUtil; import com.mojang.datafixers.util.Pair; @@ -147,10 +148,12 @@ public class SpellbookScreenHandler extends ScreenHandler { if (!world.isClient && !gemSlot.getStack().isEmpty()) { outputSlot.setStack( world.getServer().getRecipeManager() - .getFirstMatch(URecipes.SPELLBOOK, input, world) + .getAllMatches(URecipes.SPELLBOOK, input, world) + .stream().sorted(Comparator.comparing(SpellbookRecipe::getPriority)) + .findFirst() .filter(recipe -> result.shouldCraftRecipe(world, (ServerPlayerEntity)this.inventory.player, recipe)) .map(recipe -> recipe.craft(input)) - .orElse(ItemStack.EMPTY)); + .orElse(UItems.BOTCHED_GEM.getDefaultStack())); ((ServerPlayerEntity)this.inventory.player).networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(syncId, nextRevision(), outputSlot.id, outputSlot.getStack())); } @@ -431,7 +434,7 @@ public class SpellbookScreenHandler extends ScreenHandler { public void setStack(ItemStack stack) { super.setStack(stack); if (!stack.isEmpty()) { - player.playSound(USounds.GUI_SPELL_CRAFT_SUCCESS, SoundCategory.MASTER, 1, 0.3F); + player.playSound(stack.getItem() == UItems.BOTCHED_GEM ? USounds.GUI_ABILITY_FAIL : USounds.GUI_SPELL_CRAFT_SUCCESS, SoundCategory.MASTER, 1, 0.3F); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index c15a03f3..e3b87415 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -57,6 +57,7 @@ public interface UItems { Item CRYSTAL_SHARD = register("crystal_shard", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); Item GEMSTONE = register("gemstone", new GemstoneItem(new Item.Settings().group(ItemGroup.MATERIALS))); + Item BOTCHED_GEM = register("botched_gem", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); Item PEGASUS_FEATHER = register("pegasus_feather", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); Item GRYPHON_FEATHER = register("gryphon_feather", new Item(new Item.Settings().group(ItemGroup.MATERIALS))); diff --git a/src/main/java/com/minelittlepony/unicopia/item/URecipes.java b/src/main/java/com/minelittlepony/unicopia/item/URecipes.java index 60f79f19..e4e01c58 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/URecipes.java +++ b/src/main/java/com/minelittlepony/unicopia/item/URecipes.java @@ -3,8 +3,7 @@ package com.minelittlepony.unicopia.item; import java.util.List; import com.google.gson.JsonArray; -import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe; -import com.minelittlepony.unicopia.ability.magic.spell.crafting.TraitRequirementRecipe; +import com.minelittlepony.unicopia.ability.magic.spell.crafting.*; import net.fabricmc.fabric.api.loot.v2.LootTableEvents; import net.minecraft.loot.LootTable; @@ -22,7 +21,8 @@ public interface URecipes { RecipeSerializer ZAP_APPLE_SERIALIZER = RecipeSerializer.register("unicopia:crafting_zap_apple", new ZapAppleRecipe.Serializer()); RecipeSerializer GLOWING_SERIALIZER = RecipeSerializer.register("unicopia:crafting_glowing", new SpecialRecipeSerializer<>(GlowingRecipe::new)); RecipeSerializer JAR_INSERT_SERIALIZER = RecipeSerializer.register("unicopia:jar_insert", new SpecialRecipeSerializer<>(JarInsertRecipe::new)); - RecipeSerializer TRAIT_REQUIREMENT = RecipeSerializer.register("unicopia:spellbook/crafting", new TraitRequirementRecipe.Serializer()); + RecipeSerializer TRAIT_REQUIREMENT = RecipeSerializer.register("unicopia:spellbook/crafting", new SpellCraftingRecipe.Serializer()); + RecipeSerializer TRAIT_COMBINING = RecipeSerializer.register("unicopia:spellbook/combining", new SpellEnhancingRecipe.Serializer()); static DefaultedList getIngredients(JsonArray json) { DefaultedList defaultedList = DefaultedList.of(); diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 8a8c892c..c3f80296 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -39,6 +39,7 @@ "item.unicopia.gemstone": "Gemstone", "item.unicopia.gemstone.enchanted": "%s Gem", "item.unicopia.gemstone.obfuscated": "Mysterious Gem", + "item.unicopia.botched_gem": "Botched Gem", "item.unicopia.pegasus_feather": "Pegasus Feather", "item.unicopia.gryphon_feather": "Gryphon Feather", diff --git a/src/main/resources/assets/unicopia/models/item/botched_gem.json b/src/main/resources/assets/unicopia/models/item/botched_gem.json new file mode 100644 index 00000000..7c470b43 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/botched_gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/botched_gem" + } +} diff --git a/src/main/resources/assets/unicopia/textures/item/botched_gem.png b/src/main/resources/assets/unicopia/textures/item/botched_gem.png new file mode 100644 index 00000000..93ba5983 Binary files /dev/null and b/src/main/resources/assets/unicopia/textures/item/botched_gem.png differ diff --git a/src/main/resources/data/unicopia/recipes/alicorn_amulet.json b/src/main/resources/data/unicopia/recipes/alicorn_amulet.json index 5196047d..14db2133 100644 --- a/src/main/resources/data/unicopia/recipes/alicorn_amulet.json +++ b/src/main/resources/data/unicopia/recipes/alicorn_amulet.json @@ -1,12 +1,13 @@ { "type": "unicopia:spellbook/crafting", "material": { - "item": { "item": "unicopia:gemstone" }, + "item": "unicopia:gemstone", "spell": "unicopia:dark_vortex" }, "traits": { "darkness": 30, "power": 30, "blood": 30 }, + "ingredients": [], "result": { "item": "unicopia:alicorn_amulet" } diff --git a/src/main/resources/data/unicopia/recipes/spells/catapult.json b/src/main/resources/data/unicopia/recipes/spells/catapult.json index 6ef22313..d479f3ad 100644 --- a/src/main/resources/data/unicopia/recipes/spells/catapult.json +++ b/src/main/resources/data/unicopia/recipes/spells/catapult.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:flame" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "focus": 9, "air": 9 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:flame" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:catapult" diff --git a/src/main/resources/data/unicopia/recipes/spells/dark_vortex.json b/src/main/resources/data/unicopia/recipes/spells/dark_vortex.json index 77a28d0c..09c5d5d1 100644 --- a/src/main/resources/data/unicopia/recipes/spells/dark_vortex.json +++ b/src/main/resources/data/unicopia/recipes/spells/dark_vortex.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:vortex" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "strength": 10, "knowledge": 8, "darkness": 9, "chaos": 8 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:vortex" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:dark_vortex" diff --git a/src/main/resources/data/unicopia/recipes/spells/feather_fall.json b/src/main/resources/data/unicopia/recipes/spells/feather_fall.json index 7f23b502..0d3b161a 100644 --- a/src/main/resources/data/unicopia/recipes/spells/feather_fall.json +++ b/src/main/resources/data/unicopia/recipes/spells/feather_fall.json @@ -1,13 +1,13 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:shield" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "knowledge": 20, "life": 10, "chaos": 4, "generosity": 10 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:shield" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:feather_fall" diff --git a/src/main/resources/data/unicopia/recipes/spells/fire_bolt.json b/src/main/resources/data/unicopia/recipes/spells/fire_bolt.json index e34ea0b9..1de9ded3 100644 --- a/src/main/resources/data/unicopia/recipes/spells/fire_bolt.json +++ b/src/main/resources/data/unicopia/recipes/spells/fire_bolt.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:flame" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "focus": 9, "air": 9, "fire": 30 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:flame" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:fire_bolt" diff --git a/src/main/resources/data/unicopia/recipes/spells/flame.json b/src/main/resources/data/unicopia/recipes/spells/flame.json index 824dda2a..8b87e2d8 100644 --- a/src/main/resources/data/unicopia/recipes/spells/flame.json +++ b/src/main/resources/data/unicopia/recipes/spells/flame.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:scorch" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "fire": 20 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:scorch" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:flame" diff --git a/src/main/resources/data/unicopia/recipes/spells/frost.json b/src/main/resources/data/unicopia/recipes/spells/frost.json index 6fdb5866..e0af1c96 100644 --- a/src/main/resources/data/unicopia/recipes/spells/frost.json +++ b/src/main/resources/data/unicopia/recipes/spells/frost.json @@ -1,12 +1,10 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:none" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "ice": 1 }, + "ingredients": [], "result": { "item": "unicopia:gemstone", "spell": "unicopia:frost" diff --git a/src/main/resources/data/unicopia/recipes/spells/infernal.json b/src/main/resources/data/unicopia/recipes/spells/infernal.json index 5c90a94f..6fd8f130 100644 --- a/src/main/resources/data/unicopia/recipes/spells/infernal.json +++ b/src/main/resources/data/unicopia/recipes/spells/infernal.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:flame" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "fire": 50, "dark": 10 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:flame" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:infernal" diff --git a/src/main/resources/data/unicopia/recipes/spells/light.json b/src/main/resources/data/unicopia/recipes/spells/light.json index 69939df2..daee45cb 100644 --- a/src/main/resources/data/unicopia/recipes/spells/light.json +++ b/src/main/resources/data/unicopia/recipes/spells/light.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:fire_bolt" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "ice": 30, "life": 30, "focus": 10 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:fire_bolt" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:light" diff --git a/src/main/resources/data/unicopia/recipes/spells/necromancy.json b/src/main/resources/data/unicopia/recipes/spells/necromancy.json index 228e2b0f..bd106820 100644 --- a/src/main/resources/data/unicopia/recipes/spells/necromancy.json +++ b/src/main/resources/data/unicopia/recipes/spells/necromancy.json @@ -1,13 +1,13 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:siphoning" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "strength": 10, "knowledge": 8, "darkness": 19, "chaos": 8, "blood": 10, "poison": 9 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:siphoning" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:necromancy" diff --git a/src/main/resources/data/unicopia/recipes/spells/reveal.json b/src/main/resources/data/unicopia/recipes/spells/reveal.json index 8581934a..6b9f8c9c 100644 --- a/src/main/resources/data/unicopia/recipes/spells/reveal.json +++ b/src/main/resources/data/unicopia/recipes/spells/reveal.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:shield" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "knowledge": 18, "life": 1, "order": 4 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:shield" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:reveal" diff --git a/src/main/resources/data/unicopia/recipes/spells/scorch.json b/src/main/resources/data/unicopia/recipes/spells/scorch.json index ff2335bb..499bce01 100644 --- a/src/main/resources/data/unicopia/recipes/spells/scorch.json +++ b/src/main/resources/data/unicopia/recipes/spells/scorch.json @@ -1,12 +1,10 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:none" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "fire": 10 }, + "ingredients": [], "result": { "item": "unicopia:gemstone", "spell": "unicopia:scorch" diff --git a/src/main/resources/data/unicopia/recipes/spells/shield.json b/src/main/resources/data/unicopia/recipes/spells/shield.json index 6ce254d5..2b12b91f 100644 --- a/src/main/resources/data/unicopia/recipes/spells/shield.json +++ b/src/main/resources/data/unicopia/recipes/spells/shield.json @@ -1,12 +1,10 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:none" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "strength": 10, "focus": 6, "power": 10 }, + "ingredients": [], "result": { "item": "unicopia:gemstone", "spell": "unicopia:shield" diff --git a/src/main/resources/data/unicopia/recipes/spells/siphoning.json b/src/main/resources/data/unicopia/recipes/spells/siphoning.json index ee965202..7c01454d 100644 --- a/src/main/resources/data/unicopia/recipes/spells/siphoning.json +++ b/src/main/resources/data/unicopia/recipes/spells/siphoning.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:infernal" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "blood": 8, "poison": 10 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:infernal" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:siphoning" diff --git a/src/main/resources/data/unicopia/recipes/spells/transformation.json b/src/main/resources/data/unicopia/recipes/spells/transformation.json index cafb6a44..588cdcec 100644 --- a/src/main/resources/data/unicopia/recipes/spells/transformation.json +++ b/src/main/resources/data/unicopia/recipes/spells/transformation.json @@ -1,12 +1,10 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:none" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "knowledge": 18, "life": 10, "chaos": 4 }, + "ingredients": [], "result": { "item": "unicopia:gemstone", "spell": "unicopia:transformation" diff --git a/src/main/resources/data/unicopia/recipes/spells/vortex.json b/src/main/resources/data/unicopia/recipes/spells/vortex.json index 230a76ad..d664e8e9 100644 --- a/src/main/resources/data/unicopia/recipes/spells/vortex.json +++ b/src/main/resources/data/unicopia/recipes/spells/vortex.json @@ -1,12 +1,12 @@ { "type": "unicopia:spellbook/crafting", - "material": { - "item": { "item": "unicopia:gemstone" }, - "spell": "unicopia:shield" - }, + "material": { "item": "unicopia:gemstone", "spell": "unicopia:none" }, "traits": { "strength": 10, "knowledge": 8 }, + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:shield" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:vortex" diff --git a/src/main/resources/data/unicopia/recipes/trait_combining_botched_gemstone.json b/src/main/resources/data/unicopia/recipes/trait_combining_botched_gemstone.json new file mode 100644 index 00000000..9950b4dc --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/trait_combining_botched_gemstone.json @@ -0,0 +1,4 @@ +{ + "type": "unicopia:spellbook/combining", + "material": { "item": "unicopia:botched_gem" } +} \ No newline at end of file diff --git a/src/main/resources/data/unicopia/recipes/trait_combining_gemstone.json b/src/main/resources/data/unicopia/recipes/trait_combining_gemstone.json new file mode 100644 index 00000000..13ab2a9f --- /dev/null +++ b/src/main/resources/data/unicopia/recipes/trait_combining_gemstone.json @@ -0,0 +1,4 @@ +{ + "type": "unicopia:spellbook/combining", + "material": { "item": "unicopia:gemstone" } +} \ No newline at end of file