From b0405d3c04e222e99583e17914af07a5bf2c6e75 Mon Sep 17 00:00:00 2001 From: Kli Kli Date: Sat, 17 Aug 2024 10:43:58 +0200 Subject: [PATCH] fix: new bound book of binding recipes do not show up in recipe viewers Closes #1193 --- build.gradle | 4 +- gradle.properties | 4 +- .../getting_started/books_of_binding.json | 58 ++++++++++++-- .../recipe/BoundBookOfBindingRecipe.java | 4 +- .../datagen/OccultismBookProvider.java | 38 ++++++--- .../integration/BoundBookRecipeMaker.java | 33 ++++++++ .../emi/impl/OccultismEmiPlugin.java | 10 +++ .../integration/jei/impl/JeiPlugin.java | 9 +-- .../OccultismModonomiconConstants.java | 1 + .../integration/modonomicon/PageLoaders.java | 2 + .../modonomicon/PageRenderers.java | 4 + .../pages/BookBindingCraftingRecipePage.java | 77 +++++++++++++++++++ .../BookBindingCraftingRecipePageModel.java | 62 +++++++++++++++ ...BookBindingCraftingRecipePageRenderer.java | 69 +++++++++++++++++ .../pages/BookRitualRecipePageModel.java | 1 - 15 files changed, 347 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/klikli_dev/occultism/integration/BoundBookRecipeMaker.java create mode 100644 src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePage.java create mode 100644 src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageModel.java create mode 100644 src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageRenderer.java diff --git a/build.gradle b/build.gradle index ebff49ae3..92061e26c 100644 --- a/build.gradle +++ b/build.gradle @@ -169,8 +169,8 @@ dependencies { implementation "com.klikli_dev:modonomicon-${minecraft_version}-neoforge:${modonomicon_version}" //theurgy - compileOnly "com.klikli_dev:theurgy-${minecraft_version}-neoforge:${theurgy_version}" - runtimeOnly "com.klikli_dev:theurgy-${minecraft_version}-neoforge:${theurgy_version}" + compileOnly ("com.klikli_dev:theurgy-${minecraft_version}-neoforge:${theurgy_version}") {transitive=false} + runtimeOnly ("com.klikli_dev:theurgy-${minecraft_version}-neoforge:${theurgy_version}") {transitive=false} // emi compileOnly "dev.emi:emi-neoforge:${emi_version}:api" diff --git a/gradle.properties b/gradle.properties index a99d3ccec..f29465c6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,7 +24,7 @@ neogradle_version=7.0.158 # neo directly reads these properties # the version the mappings were created for, does not need to match the current mc version -neogradle.subsystems.parchment.minecraftVersion=1.21 +neogradle.subsystems.parchment.minecraftVersion=1.21.1 # the mapping version neogradle.subsystems.parchment.mappingsVersion=2024.06.23 @@ -49,7 +49,7 @@ smartbrainlib_version=1.14.5 smartbrainlib_version_range=[1.14.5,) almost_unified_version=0.5.0 almost_unified_version_range=[0.5.0,) -modonomicon_version=1.99.0 +modonomicon_version=1.99.1 modonomicon_version_range=[1.95.0,) theurgy_version=1.47.0 theurgy_version_range=[1.46.0,) diff --git a/src/generated/resources/data/occultism/modonomicon/books/dictionary_of_spirits/entries/getting_started/books_of_binding.json b/src/generated/resources/data/occultism/modonomicon/books/dictionary_of_spirits/entries/getting_started/books_of_binding.json index c1b93be5a..b59aef0a9 100644 --- a/src/generated/resources/data/occultism/modonomicon/books/dictionary_of_spirits/entries/getting_started/books_of_binding.json +++ b/src/generated/resources/data/occultism/modonomicon/books/dictionary_of_spirits/entries/getting_started/books_of_binding.json @@ -76,15 +76,19 @@ "title2": "" }, { - "type": "modonomicon:crafting_recipe", + "type": "occultism:book_binding_recipe", "anchor": "", "condition": { "type": "modonomicon:none" }, - "recipe_id_1": "occultism:crafting/book_of_binding_bound_foliot", + "recipe_id_1": "occultism:crafting/bound_book_of_binding", "text": "book.occultism.dictionary_of_spirits.getting_started.books_of_binding.book_of_binding_bound_foliot_recipe.text", "title1": "", - "title2": "" + "title2": "", + "unbound_book": { + "count": 1, + "id": "occultism:book_of_binding_foliot" + } }, { "type": "modonomicon:crafting_recipe", @@ -93,11 +97,25 @@ "type": "modonomicon:none" }, "recipe_id_1": "occultism:crafting/book_of_binding_djinni", - "recipe_id_2": "occultism:crafting/book_of_binding_bound_djinni", "text": "", "title1": "", "title2": "" }, + { + "type": "occultism:book_binding_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "occultism:crafting/bound_book_of_binding", + "text": "", + "title1": "", + "title2": "", + "unbound_book": { + "count": 1, + "id": "occultism:book_of_binding_djinni" + } + }, { "type": "modonomicon:crafting_recipe", "anchor": "", @@ -105,11 +123,25 @@ "type": "modonomicon:none" }, "recipe_id_1": "occultism:crafting/book_of_binding_afrit", - "recipe_id_2": "occultism:crafting/book_of_binding_bound_afrit", "text": "", "title1": "", "title2": "" }, + { + "type": "occultism:book_binding_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "occultism:crafting/bound_book_of_binding", + "text": "", + "title1": "", + "title2": "", + "unbound_book": { + "count": 1, + "id": "occultism:book_of_binding_afrit" + } + }, { "type": "modonomicon:crafting_recipe", "anchor": "", @@ -117,11 +149,25 @@ "type": "modonomicon:none" }, "recipe_id_1": "occultism:crafting/book_of_binding_marid", - "recipe_id_2": "occultism:crafting/book_of_binding_bound_marid", "text": "", "title1": "", "title2": "" }, + { + "type": "occultism:book_binding_recipe", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "recipe_id_1": "occultism:crafting/bound_book_of_binding", + "text": "", + "title1": "", + "title2": "", + "unbound_book": { + "count": 1, + "id": "occultism:book_of_binding_marid" + } + }, { "type": "occultism:spirit_fire_recipe", "anchor": "", diff --git a/src/main/java/com/klikli_dev/occultism/crafting/recipe/BoundBookOfBindingRecipe.java b/src/main/java/com/klikli_dev/occultism/crafting/recipe/BoundBookOfBindingRecipe.java index 77ba75325..012e5f930 100644 --- a/src/main/java/com/klikli_dev/occultism/crafting/recipe/BoundBookOfBindingRecipe.java +++ b/src/main/java/com/klikli_dev/occultism/crafting/recipe/BoundBookOfBindingRecipe.java @@ -78,7 +78,7 @@ public boolean matches(CraftingInput input, @NotNull Level level) { } } - var boundBook = this.getBoundBookFromBook(bookOfBinding); + var boundBook = getBoundBookFromBook(bookOfBinding); if (boundBook.isEmpty()) return ItemStack.EMPTY; @@ -92,7 +92,7 @@ public boolean matches(CraftingInput input, @NotNull Level level) { return boundBook; } - public ItemStack getBoundBookFromBook(ItemStack book) { + public static ItemStack getBoundBookFromBook(ItemStack book) { if (book.is(OccultismItems.BOOK_OF_BINDING_FOLIOT)) return new ItemStack(OccultismItems.BOOK_OF_BINDING_BOUND_FOLIOT.get()); diff --git a/src/main/java/com/klikli_dev/occultism/datagen/OccultismBookProvider.java b/src/main/java/com/klikli_dev/occultism/datagen/OccultismBookProvider.java index 251ee11aa..1a930f7c4 100644 --- a/src/main/java/com/klikli_dev/occultism/datagen/OccultismBookProvider.java +++ b/src/main/java/com/klikli_dev/occultism/datagen/OccultismBookProvider.java @@ -15,9 +15,7 @@ import com.klikli_dev.modonomicon.api.datagen.book.page.*; import com.klikli_dev.occultism.Occultism; import com.klikli_dev.occultism.datagen.book.FamiliarRitualsCategory; -import com.klikli_dev.occultism.integration.modonomicon.pages.BookRitualRecipePageModel; -import com.klikli_dev.occultism.integration.modonomicon.pages.BookSpiritFireRecipePageModel; -import com.klikli_dev.occultism.integration.modonomicon.pages.BookSpiritTradeRecipePageModel; +import com.klikli_dev.occultism.integration.modonomicon.pages.*; import com.klikli_dev.occultism.registry.OccultismBlocks; import com.klikli_dev.occultism.registry.OccultismItems; import com.klikli_dev.theurgy.registry.ItemRegistry; @@ -1060,8 +1058,9 @@ There is a type of book corresponding to each type (or tier) of spirit. """.formatted(COLOR_PURPLE)); this.context().page("book_of_binding_bound_foliot_recipe"); - var bookOfBindingBoundFoliotRecipe = BookCraftingRecipePageModel.create() - .withRecipeId1(this.modLoc("crafting/book_of_binding_bound_foliot")) + var bookOfBindingBoundFoliotRecipe = BookBindingCraftingRecipePageModel.create() + .withRecipeId1() + .withUnboundBook(OccultismItems.BOOK_OF_BINDING_FOLIOT.toStack()) .withText(this.context().pageText()); this.lang().add(this.context().pageText(), """ @@ -1070,20 +1069,34 @@ There is a type of book corresponding to each type (or tier) of spirit. this.context().page("book_of_binding_djinni_recipe"); var bookOfBindingDjinniRecipe = BookCraftingRecipePageModel.create() - .withRecipeId1(this.modLoc("crafting/book_of_binding_djinni")) - .withRecipeId2(this.modLoc("crafting/book_of_binding_bound_djinni")); + .withRecipeId1(this.modLoc("crafting/book_of_binding_djinni")); + + this.context().page("book_of_binding_bound_djinni_recipe"); + var bookOfBoundBindingDjinniRecipe = BookBindingCraftingRecipePageModel.create() + .withRecipeId1() + .withUnboundBook(OccultismItems.BOOK_OF_BINDING_DJINNI.toStack()); //no text this.context().page("book_of_binding_afrit_recipe"); var bookOfBindingAfritRecipe = BookCraftingRecipePageModel.create() - .withRecipeId1(this.modLoc("crafting/book_of_binding_afrit")) - .withRecipeId2(this.modLoc("crafting/book_of_binding_bound_afrit")); + .withRecipeId1(this.modLoc("crafting/book_of_binding_afrit")); + //no text + + this.context().page("book_of_binding_bound_afrit_recipe"); + var bookOfBoundBindingAfritRecipe = BookBindingCraftingRecipePageModel.create() + .withRecipeId1() + .withUnboundBook(OccultismItems.BOOK_OF_BINDING_AFRIT.toStack()); //no text this.context().page("book_of_binding_marid_recipe"); var bookOfBindingMaridRecipe = BookCraftingRecipePageModel.create() - .withRecipeId1(this.modLoc("crafting/book_of_binding_marid")) - .withRecipeId2(this.modLoc("crafting/book_of_binding_bound_marid")); + .withRecipeId1(this.modLoc("crafting/book_of_binding_marid")); + //no text + + this.context().page("book_of_binding_bound_marid_recipe"); + var bookOfBoundBindingMaridRecipe = BookBindingCraftingRecipePageModel.create() + .withRecipeId1() + .withUnboundBook(OccultismItems.BOOK_OF_BINDING_MARID.toStack()); //no text this.context().page("book_of_binding_empty"); @@ -1113,8 +1126,11 @@ There is a type of book corresponding to each type (or tier) of spirit. bookOfBindingFoliotRecipe, bookOfBindingBoundFoliotRecipe, bookOfBindingDjinniRecipe, + bookOfBoundBindingDjinniRecipe, bookOfBindingAfritRecipe, + bookOfBoundBindingAfritRecipe, bookOfBindingMaridRecipe, + bookOfBoundBindingMaridRecipe, alternativeBooks, bookOfBindingEmptyRecipe ); diff --git a/src/main/java/com/klikli_dev/occultism/integration/BoundBookRecipeMaker.java b/src/main/java/com/klikli_dev/occultism/integration/BoundBookRecipeMaker.java new file mode 100644 index 000000000..1266b701d --- /dev/null +++ b/src/main/java/com/klikli_dev/occultism/integration/BoundBookRecipeMaker.java @@ -0,0 +1,33 @@ +package com.klikli_dev.occultism.integration; + +import com.klikli_dev.occultism.Occultism; +import com.klikli_dev.occultism.crafting.recipe.BoundBookOfBindingRecipe; +import com.klikli_dev.occultism.registry.OccultismItems; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.*; + +import java.util.List; + +public class BoundBookRecipeMaker { + + public static List> createRecipes() { + return List.of( + makeRecipe(new ItemStack(OccultismItems.BOOK_OF_BINDING_FOLIOT.get())), + makeRecipe(new ItemStack(OccultismItems.BOOK_OF_BINDING_DJINNI.get())), + makeRecipe(new ItemStack(OccultismItems.BOOK_OF_BINDING_AFRIT.get())), + makeRecipe(new ItemStack(OccultismItems.BOOK_OF_BINDING_MARID.get())) + ); + } + + private static RecipeHolder makeRecipe(ItemStack bookOfBinding) { + String group = "occultism.bound_book_of_binding"; + var id = ResourceLocation.fromNamespaceAndPath(Occultism.MODID, group + bookOfBinding.getDescriptionId()); + var recipe = new ShapelessRecipe(group, CraftingBookCategory.MISC, + BoundBookOfBindingRecipe.getBoundBookFromBook(bookOfBinding), + NonNullList.of(Ingredient.EMPTY, Ingredient.of(OccultismItems.DICTIONARY_OF_SPIRITS), Ingredient.of(bookOfBinding))); + return new RecipeHolder<>(id, recipe); + } + +} diff --git a/src/main/java/com/klikli_dev/occultism/integration/emi/impl/OccultismEmiPlugin.java b/src/main/java/com/klikli_dev/occultism/integration/emi/impl/OccultismEmiPlugin.java index 566f8c491..2993d5ab2 100644 --- a/src/main/java/com/klikli_dev/occultism/integration/emi/impl/OccultismEmiPlugin.java +++ b/src/main/java/com/klikli_dev/occultism/integration/emi/impl/OccultismEmiPlugin.java @@ -6,6 +6,7 @@ import com.klikli_dev.occultism.crafting.recipe.MinerRecipe; import com.klikli_dev.occultism.crafting.recipe.RitualRecipe; import com.klikli_dev.occultism.crafting.recipe.SpiritFireRecipe; +import com.klikli_dev.occultism.integration.BoundBookRecipeMaker; import com.klikli_dev.occultism.integration.emi.impl.recipes.CrushingRecipeCategory; import com.klikli_dev.occultism.integration.emi.impl.recipes.MinerRecipeCategory; import com.klikli_dev.occultism.integration.emi.impl.recipes.RitualRecipeCategory; @@ -16,12 +17,16 @@ import dev.emi.emi.api.EmiInitRegistry; import dev.emi.emi.api.EmiPlugin; import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.recipe.EmiCraftingRecipe; import dev.emi.emi.api.recipe.EmiRecipeCategory; import dev.emi.emi.api.render.EmiTexture; +import dev.emi.emi.api.stack.EmiIngredient; import dev.emi.emi.api.stack.EmiStack; +import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeManager; @@ -85,5 +90,10 @@ public void register(EmiRegistry emiRegistry) { for(RecipeHolder recipe:manager.getAllRecipesFor(OccultismRecipes.RITUAL_TYPE.get())){ emiRegistry.addRecipe(new RitualRecipeCategory(recipe)); } + + for(RecipeHolder recipe: BoundBookRecipeMaker.createRecipes()){ + var ingredients = recipe.value().getIngredients().stream().map(EmiIngredient::of).toList(); + emiRegistry.addRecipe(new EmiCraftingRecipe(ingredients, EmiStack.of(recipe.value().getResultItem(RegistryAccess.EMPTY)), recipe.id(), true)); + } } } \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/occultism/integration/jei/impl/JeiPlugin.java b/src/main/java/com/klikli_dev/occultism/integration/jei/impl/JeiPlugin.java index 68e350739..21a6fa9d9 100644 --- a/src/main/java/com/klikli_dev/occultism/integration/jei/impl/JeiPlugin.java +++ b/src/main/java/com/klikli_dev/occultism/integration/jei/impl/JeiPlugin.java @@ -26,11 +26,8 @@ import com.klikli_dev.occultism.common.container.storage.StableWormholeContainer; import com.klikli_dev.occultism.common.container.storage.StorageControllerContainer; import com.klikli_dev.occultism.common.container.storage.StorageRemoteContainer; -import com.klikli_dev.occultism.integration.jei.JeiSettings; -import com.klikli_dev.occultism.integration.jei.impl.recipes.CrushingRecipeCategory; -import com.klikli_dev.occultism.integration.jei.impl.recipes.MinerRecipeCategory; -import com.klikli_dev.occultism.integration.jei.impl.recipes.RitualRecipeCategory; -import com.klikli_dev.occultism.integration.jei.impl.recipes.SpiritFireRecipeCategory; +import com.klikli_dev.occultism.integration.BoundBookRecipeMaker; +import com.klikli_dev.occultism.integration.jei.impl.recipes.*; import com.klikli_dev.occultism.registry.OccultismBlocks; import com.klikli_dev.occultism.registry.OccultismItems; import com.klikli_dev.occultism.registry.OccultismRecipes; @@ -80,6 +77,8 @@ public void registerRecipes(IRecipeRegistration registration) { ClientLevel level = Minecraft.getInstance().level; RecipeManager recipeManager = level.getRecipeManager(); + registration.addRecipes(RecipeTypes.CRAFTING, BoundBookRecipeMaker.createRecipes()); + var spiritFireRecipes = recipeManager.getAllRecipesFor(OccultismRecipes.SPIRIT_FIRE_TYPE.get()); registration.addRecipes(JeiRecipeTypes.SPIRIT_FIRE, spiritFireRecipes); diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/OccultismModonomiconConstants.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/OccultismModonomiconConstants.java index 7c7321bc8..5a290ebda 100644 --- a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/OccultismModonomiconConstants.java +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/OccultismModonomiconConstants.java @@ -8,6 +8,7 @@ public static class Page { public static final ResourceLocation SPIRIT_FIRE_RECIPE = ResourceLocation.fromNamespaceAndPath(Occultism.MODID, "spirit_fire_recipe"); public static final ResourceLocation SPIRIT_TRADE_RECIPE = ResourceLocation.fromNamespaceAndPath(Occultism.MODID, "spirit_trade_recipe"); public static final ResourceLocation RITUAL_RECIPE = ResourceLocation.fromNamespaceAndPath(Occultism.MODID, "ritual_recipe"); + public static final ResourceLocation BOOK_BINDING_RECIPE = ResourceLocation.fromNamespaceAndPath(Occultism.MODID, "book_binding_recipe"); } public static class I18n { diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageLoaders.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageLoaders.java index 2978161fb..b655e85c3 100644 --- a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageLoaders.java +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageLoaders.java @@ -1,6 +1,7 @@ package com.klikli_dev.occultism.integration.modonomicon; import com.klikli_dev.modonomicon.data.LoaderRegistry; +import com.klikli_dev.occultism.integration.modonomicon.pages.BookBindingCraftingRecipePage; import com.klikli_dev.occultism.integration.modonomicon.pages.BookRitualRecipePage; import com.klikli_dev.occultism.integration.modonomicon.pages.BookSpiritFireRecipePage; import com.klikli_dev.occultism.integration.modonomicon.pages.BookSpiritTradeRecipePage; @@ -12,6 +13,7 @@ public static void onCommonSetup(final FMLCommonSetupEvent event) { LoaderRegistry.registerPageLoader(OccultismModonomiconConstants.Page.SPIRIT_FIRE_RECIPE, BookSpiritFireRecipePage::fromJson, BookSpiritFireRecipePage::fromNetwork); LoaderRegistry.registerPageLoader(OccultismModonomiconConstants.Page.SPIRIT_TRADE_RECIPE, BookSpiritTradeRecipePage::fromJson, BookSpiritTradeRecipePage::fromNetwork); LoaderRegistry.registerPageLoader(OccultismModonomiconConstants.Page.RITUAL_RECIPE, BookRitualRecipePage::fromJson, BookRitualRecipePage::fromNetwork); + LoaderRegistry.registerPageLoader(OccultismModonomiconConstants.Page.BOOK_BINDING_RECIPE, BookBindingCraftingRecipePage::fromJson, BookBindingCraftingRecipePage::fromNetwork); } diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageRenderers.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageRenderers.java index 7cb8d966f..99a2397a9 100644 --- a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageRenderers.java +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/PageRenderers.java @@ -19,6 +19,10 @@ public static void onClientSetup(FMLClientSetupEvent event) { OccultismModonomiconConstants.Page.RITUAL_RECIPE, p -> new BookRitualRecipePageRenderer<>((BookRitualRecipePage) p) { }); + PageRendererRegistry.registerPageRenderer( + OccultismModonomiconConstants.Page.BOOK_BINDING_RECIPE, + p -> new BookBindingCraftingRecipePageRenderer((BookBindingCraftingRecipePage) p) { + }); } } diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePage.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePage.java new file mode 100644 index 000000000..56f835c25 --- /dev/null +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePage.java @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.occultism.integration.modonomicon.pages; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.book.BookTextHolder; +import com.klikli_dev.modonomicon.book.conditions.BookCondition; +import com.klikli_dev.modonomicon.book.conditions.BookNoneCondition; +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.occultism.crafting.recipe.BoundBookOfBindingRecipe; +import com.klikli_dev.occultism.crafting.recipe.RitualRecipe; +import com.klikli_dev.occultism.integration.modonomicon.OccultismModonomiconConstants; +import com.klikli_dev.occultism.registry.OccultismRecipes; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; + +public class BookBindingCraftingRecipePage extends BookRecipePage> { + ItemStack unboundBook; + + public BookBindingCraftingRecipePage(BookTextHolder title1, ResourceLocation recipeId1, BookTextHolder title2, ResourceLocation recipeId2, BookTextHolder text, String anchor, BookCondition condition, ItemStack unboundBook) { + super(RecipeType.CRAFTING, title1, recipeId1, title2, recipeId2, text, anchor, condition); + + this.unboundBook = unboundBook; + } + + public static BookBindingCraftingRecipePage fromJson(JsonObject json, HolderLookup.Provider provider) { + var common = BookRecipePage.commonFromJson(json, provider); + var anchor = GsonHelper.getAsString(json, "anchor", ""); + var condition = json.has("condition") + ? BookCondition.fromJson(json.getAsJsonObject("condition"), provider) + : new BookNoneCondition(); + + var unboundBook = ItemStack.STRICT_CODEC.parse(provider.createSerializationContext(JsonOps.INSTANCE), json.get("unbound_book")).result().get(); + + return new BookBindingCraftingRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor, condition, unboundBook); + } + + public static BookBindingCraftingRecipePage fromNetwork(RegistryFriendlyByteBuf buffer){ + var common = BookRecipePage.commonFromNetwork(buffer); + var anchor = buffer.readUtf(); + var condition = BookCondition.fromNetwork(buffer); + var unboundBook = ItemStack.STREAM_CODEC.decode(buffer); + return new BookBindingCraftingRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor, condition, unboundBook); + } + + @Override + public void toNetwork(RegistryFriendlyByteBuf buffer) { + super.toNetwork(buffer); + ItemStack.STREAM_CODEC.encode(buffer, this.unboundBook); + } + + @Override + public ResourceLocation getType() { + return OccultismModonomiconConstants.Page.BOOK_BINDING_RECIPE; + } + + @Override + protected ItemStack getRecipeOutput(Level level, RecipeHolder> recipe) { + if (recipe == null) { + return ItemStack.EMPTY; + } + + return BoundBookOfBindingRecipe.getBoundBookFromBook(this.unboundBook); + } +} diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageModel.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageModel.java new file mode 100644 index 000000000..c9193842e --- /dev/null +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageModel.java @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.occultism.integration.modonomicon.pages; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.occultism.integration.modonomicon.OccultismModonomiconConstants; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.HolderLookup; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; + +public class BookBindingCraftingRecipePageModel extends BookRecipePageModel { + + public static final String RECIPE_ID = "occultism:crafting/bound_book_of_binding"; + protected ItemStack unboundBook = ItemStack.EMPTY; + + protected BookBindingCraftingRecipePageModel() { + super(OccultismModonomiconConstants.Page.BOOK_BINDING_RECIPE); + } + + public static BookBindingCraftingRecipePageModel create() { + return new BookBindingCraftingRecipePageModel(); + } + + @Override + public JsonObject toJson(HolderLookup.Provider provider) { + var json = super.toJson(provider); + json.add("unbound_book", ItemStack.STRICT_CODEC + .encodeStart(provider.createSerializationContext(JsonOps.INSTANCE), this.unboundBook) + .getOrThrow() + ); + return json; + } + + public ItemStack getUnboundBook() { + return this.unboundBook; + } + + public BookBindingCraftingRecipePageModel withUnboundBook(ItemStack unboundBook) { + this.unboundBook = unboundBook; + return this; + } + + public BookBindingCraftingRecipePageModel withRecipeId1() { + this.recipeId1 = RECIPE_ID; + return this; + } + + + public BookBindingCraftingRecipePageModel withRecipeId2() { + this.recipeId2 = RECIPE_ID; + return this; + } +} diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageRenderer.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageRenderer.java new file mode 100644 index 000000000..80a4b8aa6 --- /dev/null +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookBindingCraftingRecipePageRenderer.java @@ -0,0 +1,69 @@ +package com.klikli_dev.occultism.integration.modonomicon.pages; + +import com.klikli_dev.modonomicon.api.ModonomiconConstants; +import com.klikli_dev.modonomicon.client.gui.book.entry.BookEntryScreen; +import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; +import com.klikli_dev.occultism.registry.OccultismItems; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.ShapedRecipe; + +public class BookBindingCraftingRecipePageRenderer extends BookRecipePageRenderer, BookBindingCraftingRecipePage> { + public BookBindingCraftingRecipePageRenderer(BookBindingCraftingRecipePage page) { + super(page); + } + + @Override + protected int getRecipeHeight() { + return 78; + } + + @Override + protected void drawRecipe(GuiGraphics guiGraphics, RecipeHolder> recipe, int recipeX, int recipeY, int mouseX, int mouseY, boolean second) { + //Copied from BookCraftingRecipePage renderer but adjusted to get the recipe result and ingredients + if (!second) { + if (!this.page.getTitle1().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle1(), false, BookEntryScreen.PAGE_WIDTH / 2, -5); + } + } else { + if (!this.page.getTitle2().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle2(), false, BookEntryScreen.PAGE_WIDTH / 2, + recipeY - (this.page.getTitle2().getString().isEmpty() ? 10 : 0) - 10); + } + } + + RenderSystem.enableBlend(); + guiGraphics.blit(this.page.getBook().getCraftingTexture(), recipeX - 2, recipeY - 2, 0, 0, 100, 62, 128, 256); + + boolean shaped = recipe.value() instanceof ShapedRecipe; + if (!shaped) { + int iconX = recipeX + 62; + int iconY = recipeY + 2; + guiGraphics.blit(this.page.getBook().getCraftingTexture(), iconX, iconY, 0, 64, 11, 11, 128, 256); + if (this.parentScreen.isMouseInRange(mouseX, mouseY, iconX, iconY, 11, 11)) { + this.parentScreen.setTooltip(Component.translatable(ModonomiconConstants.I18n.Tooltips.RECIPE_CRAFTING_SHAPELESS)); + } + } + + this.parentScreen.renderItemStack(guiGraphics, recipeX + 79, recipeY + 22, mouseX, mouseY, this.page.getRecipeOutput(Minecraft.getInstance().level, recipe)); + + NonNullList ingredients = NonNullList.of(Ingredient.EMPTY, Ingredient.of(OccultismItems.DICTIONARY_OF_SPIRITS), Ingredient.of(this.page.unboundBook)); + + int wrap = 3; + if (shaped) { + wrap = ((ShapedRecipe) recipe.value()).getWidth(); + } + + for (int i = 0; i < ingredients.size(); i++) { + this.parentScreen.renderIngredient(guiGraphics, recipeX + (i % wrap) * 19 + 3, recipeY + (i / wrap) * 19 + 3, mouseX, mouseY, ingredients.get(i)); + } + + this.parentScreen.renderItemStack(guiGraphics, recipeX + 79, recipeY + 41, mouseX, mouseY, recipe.value().getToastSymbol()); + } +} diff --git a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookRitualRecipePageModel.java b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookRitualRecipePageModel.java index 8c5e48039..9f8ed1224 100644 --- a/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookRitualRecipePageModel.java +++ b/src/main/java/com/klikli_dev/occultism/integration/modonomicon/pages/BookRitualRecipePageModel.java @@ -6,7 +6,6 @@ package com.klikli_dev.occultism.integration.modonomicon.pages; -import com.klikli_dev.modonomicon.api.datagen.book.condition.BookConditionModel; import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; import com.klikli_dev.occultism.integration.modonomicon.OccultismModonomiconConstants; import net.minecraft.network.chat.Component;