From 3e18a8ced34aeaeeaa56069fa558b6d70c0966e4 Mon Sep 17 00:00:00 2001 From: Kli Kli Date: Sat, 15 Jun 2024 18:59:16 +0200 Subject: [PATCH] feat: Leaflets (#216) * feat: add leaflet mode to books * feat: add default item icon/model for leaflet * feat: allow linking to specific pages within leaflets * fix: add texture for leaflet to forge and neo resource folders datagen for those two loaders seems not to handle common content * fix: nullable network writing * feat: add leaflet datagen helpers and demo leaflet * fix: leaflet closing * feat: add demo leaflet to datagen for all platforms * fix: more issues with leaflet closing * fix: demo leaflet empty spaces * chore: demo leaflet margins * chore: run datagen * chore: re-establish reuse compliance --- .../api/datagen/BookSubProvider.java | 4 + .../api/datagen/CategoryProvider.java | 3 +- .../api/datagen/LeafletCategoryProvider.java | 45 ++++++++++ .../api/datagen/LeafletEntryProvider.java | 45 ++++++++++ .../api/datagen/LeafletSubProvider.java | 53 +++++++++++ .../api/datagen/SingleBookSubProvider.java | 2 +- .../api/datagen/book/BookModel.java | 84 ++++++++++++++++-- .../com/klikli_dev/modonomicon/book/Book.java | 44 +++++++-- .../client/gui/BookGuiManager.java | 23 +++++ .../client/gui/book/BookAddress.java | 8 ++ .../modonomicon/datagen/book/DemoLeaflet.java | 67 ++++++++++++++ .../datagen/book/demo/IndexModeCategory.java | 4 + .../book/demo/features/CommandEntry.java | 4 + .../features/ConditionAdvancementEntry.java | 4 + .../demo/features/ConditionLevel1Entry.java | 4 + .../demo/features/ConditionLevel2Entry.java | 4 + .../demo/features/ConditionRootEntry.java | 4 + .../book/demo/features/CustomIconEntry.java | 4 + .../book/demo/features/DemoRedirectEntry.java | 4 + .../book/demo/features/EmptyPageEntry.java | 4 + .../book/demo/features/EntityEntry.java | 4 + .../book/demo/features/MultiblockEntry.java | 4 + .../book/demo/features/RecipeEntry.java | 4 + .../book/demo/features/SpotlightEntry.java | 4 + .../book/demo/features/TwoParentEntry.java | 4 + .../formatting/AdvancedFormattingEntry.java | 4 + .../demo/formatting/AlwaysLockedEntry.java | 4 + .../demo/formatting/BasicFormattingEntry.java | 4 + .../demo/formatting/LinkFormattingEntry.java | 4 + .../book/demo/indexmode/Demo1IndexEntry.java | 4 + .../book/demo/indexmode/Demo2IndexEntry.java | 4 + .../modonomicon/registry/ItemRegistry.java | 10 ++- .../modonomicon/textures/item/leaflet.png | Bin 0 -> 292 bytes .../13ce76d12c64f3a9c0874320845bdcbe00b11956 | 7 +- .../3eecf17e0b3542fa44b02bae7aa93622bb4a80e9 | 4 +- .../e6530a5ab7a2c0d5d93ba510671319215bfabee3 | 3 +- .../fbe7fdca8a3d7d4724f001a760fe02aeb76403e5 | 2 +- .../assets/modonomicon/lang/en_us.json | 7 ++ .../modonomicon/models/item/leaflet.json | 6 ++ .../modonomicon/books/demo_leaflet/book.json | 62 +++++++++++++ .../demo_leaflet/categories/leaflet.json | 16 ++++ .../demo_leaflet/entries/leaflet/leaflet.json | 28 ++++++ .../modonomicon/datagen/DataGenerators.java | 4 +- .../datagen/ItemModelProvider.java | 1 + .../gui/FabricMultiLayerScreen.java | 6 ++ .../1a31259611d3b927433f60e0500eb1623e6ee72d | 5 +- .../4e3edd34b6c5246aeed9322e2916f3d9b1fb6f50 | 3 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../assets/modonomicon/lang/en_us.json | 7 ++ .../modonomicon/models/item/leaflet.json | 6 ++ .../modonomicon/books/demo_leaflet/book.json | 62 +++++++++++++ .../demo_leaflet/categories/leaflet.json | 16 ++++ .../demo_leaflet/entries/leaflet/leaflet.json | 28 ++++++ .../modonomicon/datagen/DataGenerators.java | 4 +- .../datagen/ItemModelProvider.java | 1 + .../modonomicon/textures/item/leaflet.png | Bin 0 -> 292 bytes .../1a31259611d3b927433f60e0500eb1623e6ee72d | 5 +- .../4e3edd34b6c5246aeed9322e2916f3d9b1fb6f50 | 3 +- .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 4 +- .../assets/modonomicon/lang/en_us.json | 7 ++ .../modonomicon/models/item/leaflet.json | 6 ++ .../modonomicon/books/demo_leaflet/book.json | 62 +++++++++++++ .../demo_leaflet/categories/leaflet.json | 16 ++++ .../demo_leaflet/entries/leaflet/leaflet.json | 28 ++++++ .../modonomicon/datagen/DataGenerators.java | 4 +- .../datagen/ItemModelProvider.java | 1 + .../modonomicon/textures/item/leaflet.png | Bin 0 -> 292 bytes 67 files changed, 845 insertions(+), 41 deletions(-) create mode 100644 common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletCategoryProvider.java create mode 100644 common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletEntryProvider.java create mode 100644 common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletSubProvider.java create mode 100644 common/src/main/java/com/klikli_dev/modonomicon/datagen/book/DemoLeaflet.java create mode 100644 common/src/main/resources/assets/modonomicon/textures/item/leaflet.png create mode 100644 fabric/src/generated/resources/assets/modonomicon/models/item/leaflet.json create mode 100644 fabric/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/book.json create mode 100644 fabric/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json create mode 100644 fabric/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json create mode 100644 forge/src/generated/resources/assets/modonomicon/models/item/leaflet.json create mode 100644 forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/book.json create mode 100644 forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json create mode 100644 forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json create mode 100644 forge/src/main/resources/assets/modonomicon/textures/item/leaflet.png create mode 100644 neo/src/generated/resources/assets/modonomicon/models/item/leaflet.json create mode 100644 neo/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/book.json create mode 100644 neo/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json create mode 100644 neo/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json create mode 100644 neo/src/main/resources/assets/modonomicon/textures/item/leaflet.png diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/BookSubProvider.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/BookSubProvider.java index 02a41f0b9..1f27c9a6b 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/BookSubProvider.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/BookSubProvider.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.api.datagen; import com.klikli_dev.modonomicon.api.datagen.book.BookModel; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/CategoryProvider.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/CategoryProvider.java index c0c30464d..cef4ce73c 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/CategoryProvider.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/CategoryProvider.java @@ -197,8 +197,7 @@ public BookCategoryModel generate() { var category = BookCategoryModel.create( this.modLoc(this.context().categoryId()), this.context().categoryName() - ) - .withIcon(this.categoryIcon()); + ); this.add(this.context().categoryName(), this.categoryName()); var categoryDescription = this.categoryDescription(); diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletCategoryProvider.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletCategoryProvider.java new file mode 100644 index 000000000..e3da03641 --- /dev/null +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletCategoryProvider.java @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.modonomicon.api.datagen; + +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import net.minecraft.world.item.Items; + +/** + * This is a one-size-fits all category provider for leaflets. + * There is no need for leaflets to actually implement category providers, they all use this "dummy one" + */ +class LeafletCategoryProvider extends CategoryProvider{ + public static final String ID = "leaflet"; + + public LeafletCategoryProvider(ModonomiconProviderBase parent) { + super(parent); + } + + @Override + protected String[] generateEntryMap() { + return new String[0]; + } + + @Override + protected void generateEntries() { + //entries are generated in the leaflet subprovider instead. + } + + @Override + protected String categoryName() { + return "Leaflet"; + } + + @Override + protected BookIconModel categoryIcon() { + return BookIconModel.create(Items.PAPER); + } + + @Override + protected String categoryId() { + return ID; + } +} diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletEntryProvider.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletEntryProvider.java new file mode 100644 index 000000000..1d4c9a2d0 --- /dev/null +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletEntryProvider.java @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.modonomicon.api.datagen; + +import com.klikli_dev.modonomicon.api.datagen.book.BookIconModel; +import com.mojang.datafixers.util.Pair; +import net.minecraft.world.item.Items; + +public abstract class LeafletEntryProvider extends EntryProvider { + public static final String ID = "leaflet"; + + public LeafletEntryProvider(CategoryProvider parent) { + super(parent); + } + + @Override + protected String entryName() { + //we assume people don't mess with leaflet provider structure + //If you do and you end up here with an error, just override this method and return an entry name safely :) + var book = (LeafletSubProvider) this.parent.parent; + return book.bookName(); + } + + @Override + protected String entryDescription() { + return ""; //Irrelevant, because it will never be rendered + } + + @Override + protected Pair entryBackground() { + return EntryBackground.DEFAULT; + } + + @Override + protected BookIconModel entryIcon() { + return BookIconModel.create(Items.PAPER); + } + + @Override + protected String entryId() { + return ID; + } +} diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletSubProvider.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletSubProvider.java new file mode 100644 index 000000000..cc25ec841 --- /dev/null +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/LeafletSubProvider.java @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + + +package com.klikli_dev.modonomicon.api.datagen; + +import com.klikli_dev.modonomicon.api.datagen.book.BookModel; +import com.klikli_dev.modonomicon.registry.ItemRegistry; + +import java.util.Map; + +/** + * An opinionated book leaflet sub provider with helper methods to generate a leaflet more easily. + */ +public abstract class LeafletSubProvider extends SingleBookSubProvider { + + public LeafletSubProvider(String bookId, String modId, ModonomiconLanguageProvider defaultLang, ModonomiconLanguageProvider... translations) { + super(bookId, modId, defaultLang, translations); + } + + public LeafletSubProvider(String bookId, String modId, ModonomiconLanguageProvider defaultLang, Map translations) { + super(bookId, modId, defaultLang, translations); + } + + @Override + protected void generateCategories() { + var leafletCategoryProvider = new LeafletCategoryProvider(this); + var leafletCategory = this.add(leafletCategoryProvider.generate()); + var entryProvider = this.createEntryProvider(leafletCategoryProvider); + leafletCategory.withEntry(entryProvider.generate()); + } + + @Override + protected final BookModel additionalSetup(BookModel book) { + return this.additionalLeafletSetup( + book.withLeafletEntry(this.modLoc(LeafletCategoryProvider.ID, LeafletEntryProvider.ID)) + .withModel(ItemRegistry.LEAFLET.getId()) + ); + } + + /** + * Implement this and modify the book as needed for additional config. + * Context already is set to this book. + */ + protected BookModel additionalLeafletSetup(BookModel book) { + return book; + } + + protected abstract LeafletEntryProvider createEntryProvider(CategoryProvider parent); +} diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/SingleBookSubProvider.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/SingleBookSubProvider.java index 188e4703c..9d576a780 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/SingleBookSubProvider.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/SingleBookSubProvider.java @@ -16,7 +16,7 @@ import java.util.function.BiConsumer; /** - * An opinionated book provider with helper methods to generate a single book more easily. + * An opinionated book sub provider with helper methods to generate a single book more easily. */ public abstract class SingleBookSubProvider extends ModonomiconProviderBase implements BookSubProvider { protected BookModel book; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/book/BookModel.java b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/book/BookModel.java index 6ca526588..36d7f4ea4 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/book/BookModel.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/api/datagen/book/BookModel.java @@ -22,18 +22,22 @@ public class BookModel { + /** + * The book ID, e.g. "modonomicon:demo". The ID must be unique (usually that is guaranteed by the mod ID). + */ protected ResourceLocation id; + /** + * The name of the book, should be a translation key/description id + */ protected String name; /** * The description to (optionally) display on the first page of the category. */ protected BookTextHolderModel description = new BookTextHolderModel(""); + /** + * The tooltip to optionally display on the book item on hover. + */ protected String tooltip = ""; - protected ResourceLocation creativeTab = ResourceLocation.parse("modonomicon:modonomicon"); - - protected ResourceLocation model = ResourceLocation.parse(Book.DEFAULT_MODEL); - protected ResourceLocation bookOverviewTexture = ResourceLocation.parse(Data.Book.DEFAULT_OVERVIEW_TEXTURE); - protected ResourceLocation font = ResourceLocation.parse(Book.DEFAULT_FONT); /** * The display mode - node based (thaumonomicon style) or index based (lexica botania / patchouli style) @@ -42,13 +46,52 @@ public class BookModel { */ protected BookDisplayMode displayMode = BookDisplayMode.NODE; + /** + * The creative tab to add the book to. + */ + protected ResourceLocation creativeTab = ResourceLocation.parse("modonomicon:modonomicon"); + + /** + * If true, automatically generates an item for this book and registers it with the creative tab. + */ + protected boolean generateBookItem = true; + + /** + * The item model to use for the book. Only used if generateBookItem = true. + */ + protected ResourceLocation model = ResourceLocation.parse(Book.DEFAULT_MODEL); + + /** + * If set, uses this item for the book. That means you need to implement all functionality to open the book yourself. + */ + @Nullable + protected ResourceLocation customBookItem = null; + + /** + * This texture contains buttons for the "node view" of the book. E.g. search button, category buttons, "read all" button. + */ + protected ResourceLocation bookOverviewTexture = ResourceLocation.parse(Data.Book.DEFAULT_OVERVIEW_TEXTURE); + + /** + * The font to use for the book text. + */ + protected ResourceLocation font = ResourceLocation.parse(Book.DEFAULT_FONT); + protected ResourceLocation frameTexture = ResourceLocation.parse(Book.DEFAULT_FRAME_TEXTURE); protected BookFrameOverlay topFrameOverlay = Data.Book.DEFAULT_TOP_FRAME_OVERLAY; protected BookFrameOverlay bottomFrameOverlay = Data.Book.DEFAULT_BOTTOM_FRAME_OVERLAY; protected BookFrameOverlay leftFrameOverlay = Data.Book.DEFAULT_LEFT_FRAME_OVERLAY; protected BookFrameOverlay rightFrameOverlay = Data.Book.DEFAULT_RIGHT_FRAME_OVERLAY; + + /** + * Contains textures for the entry view, as well as index views (book or category in index mode, as well as search screen). + * This includes the book "page" background and various navigation buttons. + */ protected ResourceLocation bookContentTexture = ResourceLocation.parse(Data.Book.DEFAULT_CONTENT_TEXTURE); + /** + * Contains textures for the crafting pages, such as crafting grids and result arrows. + */ protected ResourceLocation craftingTexture = ResourceLocation.parse(Book.DEFAULT_CRAFTING_TEXTURE); protected int defaultTitleColor = 0x00000; protected float categoryButtonIconScale = 1.0f; @@ -57,10 +100,7 @@ public class BookModel { protected List commands = new ArrayList<>(); protected boolean autoAddReadConditions = false; - protected boolean generateBookItem = true; - @Nullable - protected ResourceLocation customBookItem = null; /** * When rendering book text holders, add this offset to the x position (basically, create a left margin). @@ -79,13 +119,21 @@ public class BookModel { */ protected int bookTextOffsetWidth = 0; - protected int categoryButtonXOffset = 0; protected int categoryButtonYOffset = 0; protected int searchButtonXOffset = 0; protected int searchButtonYOffset = 0; protected int readAllButtonYOffset = 0; + /** + * If this entry is set the book will ignore all other content and just display this entry. + * Note that the entry still needs to be in a valid category, even if the category is not displayed. + * + * The book will be treated as a book in index mode (that means, no big "node view" background will be shown behind the entry). + */ + @Nullable + protected ResourceLocation leafletEntry; + protected BookModel(ResourceLocation id, String name) { this.id = id; this.name = name; @@ -188,6 +236,10 @@ public BookDisplayMode getDisplayMode() { return this.displayMode; } + public @Nullable ResourceLocation getLeafletEntry() { + return this.leafletEntry; + } + public JsonObject toJson(HolderLookup.Provider provider) { JsonObject json = new JsonObject(); json.addProperty("name", this.name); @@ -221,6 +273,11 @@ public JsonObject toJson(HolderLookup.Provider provider) { if (this.customBookItem != null) { json.addProperty("custom_book_item", this.customBookItem.toString()); } + + if (this.leafletEntry != null) { + json.addProperty("leaflet_entry", this.leafletEntry.toString()); + } + return json; } @@ -442,4 +499,13 @@ public BookModel withReadAllButtonYOffset(int readAllButtonYOffset) { this.readAllButtonYOffset = readAllButtonYOffset; return this; } + + /** + * If this entry is set the book will ignore all other content and just display this entry. + * Note that the entry still needs to be in a valid category, even if the category is not displayed. + */ + public BookModel withLeafletEntry(ResourceLocation leafletEntry) { + this.leafletEntry = leafletEntry; + return this; + } } diff --git a/common/src/main/java/com/klikli_dev/modonomicon/book/Book.java b/common/src/main/java/com/klikli_dev/modonomicon/book/Book.java index 2086bdd45..1756000b1 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/book/Book.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/book/Book.java @@ -10,9 +10,11 @@ import com.klikli_dev.modonomicon.api.ModonomiconConstants.Data; import com.klikli_dev.modonomicon.book.entries.BookEntry; import com.klikli_dev.modonomicon.book.error.BookErrorManager; +import com.klikli_dev.modonomicon.client.gui.book.BookAddress; import com.klikli_dev.modonomicon.client.gui.book.markdown.BookTextRenderer; import com.klikli_dev.modonomicon.util.BookGsonHelper; import net.minecraft.core.HolderLookup; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; @@ -88,12 +90,14 @@ public class Book { protected int searchButtonYOffset; protected int readAllButtonYOffset; + protected ResourceLocation leafletEntry; + public Book(ResourceLocation id, String name, BookTextHolder description, String tooltip, ResourceLocation model, BookDisplayMode displayMode, boolean generateBookItem, ResourceLocation customBookItem, String creativeTab, ResourceLocation font, ResourceLocation bookOverviewTexture, ResourceLocation frameTexture, BookFrameOverlay topFrameOverlay, BookFrameOverlay bottomFrameOverlay, BookFrameOverlay leftFrameOverlay, BookFrameOverlay rightFrameOverlay, ResourceLocation bookContentTexture, ResourceLocation craftingTexture, ResourceLocation turnPageSound, int defaultTitleColor, float categoryButtonIconScale, boolean autoAddReadConditions, int bookTextOffsetX, int bookTextOffsetY, int bookTextOffsetWidth, - int categoryButtonXOffset, int categoryButtonYOffset, int searchButtonXOffset, int searchButtonYOffset, int readAllButtonYOffset + int categoryButtonXOffset, int categoryButtonYOffset, int searchButtonXOffset, int searchButtonYOffset, int readAllButtonYOffset, ResourceLocation leafletEntry ) { this.id = id; this.name = name; @@ -129,6 +133,7 @@ public Book(ResourceLocation id, String name, BookTextHolder description, String this.searchButtonXOffset = searchButtonXOffset; this.searchButtonYOffset = searchButtonYOffset; this.readAllButtonYOffset = readAllButtonYOffset; + this.leafletEntry = leafletEntry; } public static Book fromJson(ResourceLocation id, JsonObject json, HolderLookup.Provider provider) { @@ -180,10 +185,14 @@ public static Book fromJson(ResourceLocation id, JsonObject json, HolderLookup.P var searchButtonYOffset = GsonHelper.getAsInt(json, "search_button_y_offset", 0); var readAllButtonYOffset = GsonHelper.getAsInt(json, "read_all_button_y_offset", 0); + var leafletEntry = json.has("leaflet_entry") ? + ResourceLocation.parse(GsonHelper.getAsString(json, "leaflet_entry")) : + null; + return new Book(id, name, description, tooltip, model, displayMode, generateBookItem, customBookItem, creativeTab, font, bookOverviewTexture, frameTexture, topFrameOverlay, bottomFrameOverlay, leftFrameOverlay, rightFrameOverlay, bookContentTexture, craftingTexture, turnPageSound, defaultTitleColor, categoryButtonIconScale, autoAddReadConditions, bookTextOffsetX, bookTextOffsetY, bookTextOffsetWidth, categoryButtonXOffset, categoryButtonYOffset, - searchButtonXOffset, searchButtonYOffset, readAllButtonYOffset); + searchButtonXOffset, searchButtonYOffset, readAllButtonYOffset, leafletEntry); } @@ -196,7 +205,7 @@ public static Book fromNetwork(ResourceLocation id, RegistryFriendlyByteBuf buff var displayMode = BookDisplayMode.byId(buffer.readByte()); var generateBookItem = buffer.readBoolean(); - var customBookItem = buffer.readBoolean() ? buffer.readResourceLocation() : null; + var customBookItem = buffer.readNullable(FriendlyByteBuf::readResourceLocation); var creativeTab = buffer.readUtf(); var font = buffer.readResourceLocation(); @@ -226,10 +235,12 @@ public static Book fromNetwork(ResourceLocation id, RegistryFriendlyByteBuf buff var searchButtonYOffset = (int) buffer.readShort(); var readAllButtonYOffset = (int) buffer.readShort(); + var leafletEntry = buffer.readNullable(FriendlyByteBuf::readResourceLocation); + return new Book(id, name, description, tooltip, model, displayMode, generateBookItem, customBookItem, creativeTab, font, bookOverviewTexture, frameTexture, topFrameOverlay, bottomFrameOverlay, leftFrameOverlay, rightFrameOverlay, bookContentTexture, craftingTexture, turnPageSound, defaultTitleColor, categoryButtonIconScale, autoAddReadConditions, bookTextOffsetX, bookTextOffsetY, bookTextOffsetWidth, categoryButtonXOffset, categoryButtonYOffset, - searchButtonXOffset, searchButtonYOffset, readAllButtonYOffset); + searchButtonXOffset, searchButtonYOffset, readAllButtonYOffset, leafletEntry); } /** @@ -279,10 +290,9 @@ public void toNetwork(RegistryFriendlyByteBuf buffer) { buffer.writeByte(this.displayMode.ordinal()); buffer.writeBoolean(this.generateBookItem); - buffer.writeBoolean(this.customBookItem != null); - if (this.customBookItem != null) { - buffer.writeResourceLocation(this.customBookItem); - } + + buffer.writeNullable(this.customBookItem, FriendlyByteBuf::writeResourceLocation); + buffer.writeUtf(this.creativeTab); buffer.writeResourceLocation(this.font); @@ -311,6 +321,8 @@ public void toNetwork(RegistryFriendlyByteBuf buffer) { buffer.writeShort(this.searchButtonXOffset); buffer.writeShort(this.searchButtonYOffset); buffer.writeShort(this.readAllButtonYOffset); + + buffer.writeNullable(this.leafletEntry, FriendlyByteBuf::writeResourceLocation); } public boolean autoAddReadConditions() { @@ -435,6 +447,9 @@ public ResourceLocation getModel() { } public BookDisplayMode getDisplayMode() { + if(this.isLeaflet()) { + return BookDisplayMode.INDEX; + } return this.displayMode; } @@ -473,4 +488,17 @@ public int getSearchButtonYOffset() { public int getReadAllButtonYOffset() { return this.readAllButtonYOffset; } + + public ResourceLocation getLeafletEntry() { + return this.leafletEntry; + } + + public boolean isLeaflet() { + return this.leafletEntry != null; + } + + public BookAddress getLeafletAddress() { + var leafletEntry = this.getEntry(this.leafletEntry); + return BookAddress.ignoreSavedAndOpen(leafletEntry); + } } diff --git a/common/src/main/java/com/klikli_dev/modonomicon/client/gui/BookGuiManager.java b/common/src/main/java/com/klikli_dev/modonomicon/client/gui/BookGuiManager.java index 73bf1f5d1..20db2f35b 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/client/gui/BookGuiManager.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/client/gui/BookGuiManager.java @@ -150,6 +150,12 @@ public void openBook(BookAddress address) { var book = BookDataManager.get().getBook(address.bookId()); + //if the book is a leaflet, ensure we have an address that directly opens the leaflet entry. + if(book.isLeaflet()){ + //if the address contains a specific page, preserve that. The leaflet might theoretically link within itself! + address = address.page() > -1 ? book.getLeafletAddress().withPage(address.page()) : book.getLeafletAddress(); + } + var displayMode = book.getDisplayMode(); if (displayMode == BookDisplayMode.INDEX) { this.openBookInIndexMode(book, address); @@ -423,6 +429,12 @@ public void closeEntryScreen(BookEntryScreen screen, boolean overrideStoreLastOp //for ESC closing we always save the page (see below #onEsc()) screen.saveState(state, overrideStoreLastOpenPageWhenClosingEntry || ClientServices.CLIENT_CONFIG.storeLastOpenPageWhenClosingEntry()); Services.NETWORK.sendToServer(new SaveEntryStateMessage(screen.getEntry(), state)); + + //leaflets should never show the category or book screen + //So we just hand the close down to the parent screen, with the instruction to close the remaining stack. + if(screen.getBook().isLeaflet()){ + this.closeScreenStack(this.openBookCategoryScreen); + } } /** @@ -465,6 +477,12 @@ public void closeScreenStack(BookParentScreen screen) { public void closeScreenStack(BookCategoryScreen screen) { this.closeCategoryScreen(screen); + //if previous screen alreadly cleaned up, we exit early + //this should not actually happen. + if(this.openBookParentScreen == null) + return; + + //set the open category on the book state, so that closeParentScreen sends it along. var bookState = BookVisualStateManager.get().getBookStateFor(this.player(), screen.getCategory().getBook()); bookState.openCategory = screen.getCategory().getId(); @@ -475,6 +493,11 @@ public void closeScreenStack(BookEntryScreen screen) { //close entry screen with forced saving of last page this.closeEntryScreen(screen, true); + //if previous screen alreadly cleaned up, we exit early + // -> this is the case for leaflets. That is also why it is safe to lose the "OpenEntry" state + if(this.openBookCategoryScreen == null) + return; + //set the open entry on the category state, so that closeCategoryScreen sends it along. var categoryState = BookVisualStateManager.get().getCategoryStateFor(this.player(), this.openBookCategoryScreen.getCategory()); categoryState.openEntry = screen.getEntry().getId(); diff --git a/common/src/main/java/com/klikli_dev/modonomicon/client/gui/book/BookAddress.java b/common/src/main/java/com/klikli_dev/modonomicon/client/gui/book/BookAddress.java index 3ccb8ed8f..f5ddb58d9 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/client/gui/book/BookAddress.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/client/gui/book/BookAddress.java @@ -21,6 +21,10 @@ public record BookAddress(@NotNull ResourceLocation bookId, ResourceLocation entryId, boolean ignoreSavedEntry, int page, boolean ignoreSavedPage ) { + public static BookAddress ignoreSavedAndOpen(@NotNull BookEntry entry) { + return ignoreSaved(entry.getBook().getId(), entry.getCategory().getId(), entry.getId(), -1); + } + public static BookAddress defaultFor(@NotNull BookCategory category) { return of(category.getBook().getId(), category.getId(), null, -1); } @@ -50,4 +54,8 @@ public static BookAddress ignoreSaved(@NotNull ResourceLocation bookId, int page) { return new BookAddress(bookId, categoryId, true, entryId, true, page, true); } + + public BookAddress withPage(int page) { + return new BookAddress(this.bookId, this.categoryId, this.ignoreSavedCategory, this.entryId, this.ignoreSavedEntry, page, this.ignoreSavedPage); + } } \ No newline at end of file diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/DemoLeaflet.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/DemoLeaflet.java new file mode 100644 index 000000000..86403c0a4 --- /dev/null +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/DemoLeaflet.java @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2024 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.modonomicon.datagen.book; + +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.LeafletEntryProvider; +import com.klikli_dev.modonomicon.api.datagen.LeafletSubProvider; +import com.klikli_dev.modonomicon.api.datagen.ModonomiconLanguageProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; + +public class DemoLeaflet extends LeafletSubProvider { + public static final String ID = "demo_leaflet"; + + public DemoLeaflet(String modId, ModonomiconLanguageProvider defaultLang, ModonomiconLanguageProvider... translations) { + super(ID, modId, defaultLang, translations); + } + + @Override + protected LeafletEntryProvider createEntryProvider(CategoryProvider parent) { + //To keep a leaflet neat, you can just use an anonymous entry provider here. + //alternatively you can of course create a separate class for it and instantiate it here. + return new LeafletEntryProvider(parent) { + @Override + protected void generatePages() { + this.page("intro", () -> BookTextPageModel.create() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + ); + this.pageTitle("Demo Leaflet"); + this.pageText(""" + This is a demo leaflet. It has some features: + 1. It's a leaflet. Yay. + 2. All page types modonomicon supports. + 3. No categories, no books, no mess. + 4. Fun! (If you like leaflets) + """); + } + }; + } + + @Override + protected BookModel additionalLeafletSetup(BookModel book) { + //e.g. set creative tab using .withCreativeTab() + return book.withBookTextOffsetWidth(-5) + .withBookTextOffsetX(5); + } + + @Override + protected void registerDefaultMacros() { + //Currently no macros + } + + @Override + protected String bookName() { + return "Demo Leaflet"; + } + + @Override + protected String bookTooltip() { + return "A simple leaflet to show how modonomicon handles those."; + } +} diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/IndexModeCategory.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/IndexModeCategory.java index 9a3aa1807..968df7f43 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/IndexModeCategory.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/IndexModeCategory.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CommandEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CommandEntry.java index 7e33ee3db..6fcb145d2 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CommandEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CommandEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionAdvancementEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionAdvancementEntry.java index bc10e24b8..3ec75959d 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionAdvancementEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionAdvancementEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel1Entry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel1Entry.java index 71b255c86..cd307c27e 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel1Entry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel1Entry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel2Entry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel2Entry.java index b4f751b60..d66fa68fd 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel2Entry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionLevel2Entry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionRootEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionRootEntry.java index 90e4d7707..9af494b18 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionRootEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/ConditionRootEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CustomIconEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CustomIconEntry.java index 7978eeadd..fe1e9156b 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CustomIconEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/CustomIconEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/DemoRedirectEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/DemoRedirectEntry.java index caa96224d..cd13e63a1 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/DemoRedirectEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/DemoRedirectEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EmptyPageEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EmptyPageEntry.java index f70b6a1d8..841192019 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EmptyPageEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EmptyPageEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EntityEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EntityEntry.java index 0a38383fc..e0daf8e72 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EntityEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/EntityEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/MultiblockEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/MultiblockEntry.java index da061f49b..c08e843ab 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/MultiblockEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/MultiblockEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/RecipeEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/RecipeEntry.java index 443e079d5..b65a81ed0 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/RecipeEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/RecipeEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/SpotlightEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/SpotlightEntry.java index fdf9b7055..1c917f915 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/SpotlightEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/SpotlightEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/TwoParentEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/TwoParentEntry.java index 345645220..dfa4eb70d 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/TwoParentEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/features/TwoParentEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.features; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AdvancedFormattingEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AdvancedFormattingEntry.java index ba1549a98..7ad6899c3 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AdvancedFormattingEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AdvancedFormattingEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.formatting; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AlwaysLockedEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AlwaysLockedEntry.java index 1fdd8c2ac..c5bf450f8 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AlwaysLockedEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/AlwaysLockedEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.formatting; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/BasicFormattingEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/BasicFormattingEntry.java index c7ad6e84e..0889aec4e 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/BasicFormattingEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/BasicFormattingEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.formatting; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/LinkFormattingEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/LinkFormattingEntry.java index 8bfd7cfba..cdcb2bcc0 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/LinkFormattingEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/formatting/LinkFormattingEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.formatting; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo1IndexEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo1IndexEntry.java index b01c52ee7..fecf9ad8e 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo1IndexEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo1IndexEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.indexmode; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo2IndexEntry.java b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo2IndexEntry.java index 3f7bc8bbf..fa38ce3e1 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo2IndexEntry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/datagen/book/demo/indexmode/Demo2IndexEntry.java @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 klikli-dev +// +// SPDX-License-Identifier: MIT + package com.klikli_dev.modonomicon.datagen.book.demo.indexmode; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; diff --git a/common/src/main/java/com/klikli_dev/modonomicon/registry/ItemRegistry.java b/common/src/main/java/com/klikli_dev/modonomicon/registry/ItemRegistry.java index 5f5c9571d..12090c877 100644 --- a/common/src/main/java/com/klikli_dev/modonomicon/registry/ItemRegistry.java +++ b/common/src/main/java/com/klikli_dev/modonomicon/registry/ItemRegistry.java @@ -19,13 +19,15 @@ public class ItemRegistry { //Dummy items for default models public static final RegistryObject MODONOMICON_BLUE = - ITEMS.register("modonomicon_blue", () -> new ModonomiconItem(new Item.Properties())); + ITEMS.register("modonomicon_blue", () -> new Item(new Item.Properties())); public static final RegistryObject MODONOMICON_GREEN = - ITEMS.register("modonomicon_green", () -> new ModonomiconItem(new Item.Properties())); + ITEMS.register("modonomicon_green", () -> new Item(new Item.Properties())); public static final RegistryObject MODONOMICON_PURPLE = - ITEMS.register("modonomicon_purple", () -> new ModonomiconItem(new Item.Properties())); + ITEMS.register("modonomicon_purple", () -> new Item(new Item.Properties())); public static final RegistryObject MODONOMICON_RED = - ITEMS.register("modonomicon_red", () -> new ModonomiconItem(new Item.Properties())); + ITEMS.register("modonomicon_red", () -> new Item(new Item.Properties())); + public static final RegistryObject LEAFLET = + ITEMS.register("leaflet", () -> new Item(new Item.Properties())); // Called in the mod initializer / constructor in order to make sure that items are registered public static void load() { diff --git a/common/src/main/resources/assets/modonomicon/textures/item/leaflet.png b/common/src/main/resources/assets/modonomicon/textures/item/leaflet.png new file mode 100644 index 0000000000000000000000000000000000000000..09add337fd849eb7aacdb2e7facb5a17918524ff GIT binary patch literal 292 zcmV+<0o(qGP)T!ot>SUnwstH>gDC%-rm{T+Stp>%eS|;v$M0Zva+YAr;Ln@i;Ii;ep4&}0004W zQchCo>2+_Lr&0{QwNj5D8NDmA=p{@M5(Z}FTpX!j@l= registriesFuture) -> new BookProvider(output, registriesFuture, Modonomicon.MOD_ID, List.of( //Add our demo book provider to the book provider - new DemoBook(Modonomicon.MOD_ID, enUsCache) + new DemoBook(Modonomicon.MOD_ID, enUsCache), + new DemoLeaflet(Modonomicon.MOD_ID, enUsCache) )) ); //Important: lang provider needs to be added after the book provider, so it can read the texts added by the book provider out of the cache diff --git a/fabric/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java b/fabric/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java index d0eaa927c..59654f908 100644 --- a/fabric/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java +++ b/fabric/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java @@ -39,5 +39,6 @@ public void generateItemModels(ItemModelGenerators itemModelGenerator) { this.registerItemFlat(ItemRegistry.MODONOMICON_GREEN.get(), "modonomicon_green", itemModelGenerator); this.registerItemFlat(ItemRegistry.MODONOMICON_PURPLE.get(), "modonomicon_purple", itemModelGenerator); this.registerItemFlat(ItemRegistry.MODONOMICON_RED.get(), "modonomicon_red", itemModelGenerator); + this.registerItemFlat(ItemRegistry.LEAFLET.get(), "leaflet", itemModelGenerator); } } diff --git a/fabric/src/main/java/com/klikli_dev/modonomicon/gui/FabricMultiLayerScreen.java b/fabric/src/main/java/com/klikli_dev/modonomicon/gui/FabricMultiLayerScreen.java index 95e17cb76..f80816fe9 100644 --- a/fabric/src/main/java/com/klikli_dev/modonomicon/gui/FabricMultiLayerScreen.java +++ b/fabric/src/main/java/com/klikli_dev/modonomicon/gui/FabricMultiLayerScreen.java @@ -1,3 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2024 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + package com.klikli_dev.modonomicon.gui; import net.minecraft.client.Minecraft; diff --git a/forge/src/generated/resources/.cache/1a31259611d3b927433f60e0500eb1623e6ee72d b/forge/src/generated/resources/.cache/1a31259611d3b927433f60e0500eb1623e6ee72d index 57b385356..dad447aaf 100644 --- a/forge/src/generated/resources/.cache/1a31259611d3b927433f60e0500eb1623e6ee72d +++ b/forge/src/generated/resources/.cache/1a31259611d3b927433f60e0500eb1623e6ee72d @@ -1,4 +1,4 @@ -// 1.21 2024-06-15T07:59:46.9760097 Books: modonomicon +// 1.21 2024-06-15T18:55:26.3494435 Books: modonomicon bc15203da550327ff9a6e6e0577763f328c044b8 data/modonomicon/modonomicon/books/demo/book.json e6a715f2cfd8e4506f0fc77153a77ee059476a73 data/modonomicon/modonomicon/books/demo/categories/conditional.json bb1c01567081f42f09dbbcb4485915f0cb23897b data/modonomicon/modonomicon/books/demo/categories/features.json @@ -27,3 +27,6 @@ ce1982da99d038c6b25ce04b87ea97ea9f71c2bb data/modonomicon/modonomicon/books/demo df0f65389e81935cede169200a76078be687f45f data/modonomicon/modonomicon/books/demo/entries/formatting/link.json 74b0b26d3953eb7221f2156b78a035c689ff9e48 data/modonomicon/modonomicon/books/demo/entries/index_mode/demo1.json 0692a83733a7baebf8cd86907bc271654cc6f0a8 data/modonomicon/modonomicon/books/demo/entries/index_mode/demo2.json +95ea7cd9849c9ef336662d5e616b680430305426 data/modonomicon/modonomicon/books/demo_leaflet/book.json +ca6aad8e1b20aaab7e1dce1b623644b18b9a7119 data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json +7bfc573f113a82cb58a300bea252f921d8b299a9 data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json diff --git a/forge/src/generated/resources/.cache/4e3edd34b6c5246aeed9322e2916f3d9b1fb6f50 b/forge/src/generated/resources/.cache/4e3edd34b6c5246aeed9322e2916f3d9b1fb6f50 index da1e2e3ac..9a1baaab7 100644 --- a/forge/src/generated/resources/.cache/4e3edd34b6c5246aeed9322e2916f3d9b1fb6f50 +++ b/forge/src/generated/resources/.cache/4e3edd34b6c5246aeed9322e2916f3d9b1fb6f50 @@ -1,4 +1,5 @@ -// 1.21 2024-06-14T11:00:01.347677 Item Models: modonomicon +// 1.21 2024-06-15T18:55:26.3514437 Item Models: modonomicon +9d681528515f3d6fd6fdd2940a280dcde6a53da0 assets/modonomicon/models/item/leaflet.json b02e0bc9f75e0fde6807935577e74b75348413fb assets/modonomicon/models/item/modonomicon_blue.json 83adea7fd65acd9581797454e1a6dc6122d8a826 assets/modonomicon/models/item/modonomicon_green.json 4b35646623b74487675fa8ec1bb375535100c336 assets/modonomicon/models/item/modonomicon_purple.json diff --git a/forge/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/forge/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index 9e36d1045..6167ea31a 100644 --- a/forge/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/forge/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.21 2024-06-15T07:59:46.9780058 Languages: en_us -a34308d973d291f4ef4e53a94aaf719d3f90e6eb assets/modonomicon/lang/en_us.json +// 1.21 2024-06-15T18:55:26.3514437 Languages: en_us +2de877c26a54e4dc4c7c03b84930336688b8507d assets/modonomicon/lang/en_us.json diff --git a/forge/src/generated/resources/assets/modonomicon/lang/en_us.json b/forge/src/generated/resources/assets/modonomicon/lang/en_us.json index 12d664a60..99df8e896 100644 --- a/forge/src/generated/resources/assets/modonomicon/lang/en_us.json +++ b/forge/src/generated/resources/assets/modonomicon/lang/en_us.json @@ -108,6 +108,13 @@ "book.modonomicon.demo.index_mode.name": "Index Mode Category", "book.modonomicon.demo.name": "Demo Book", "book.modonomicon.demo.tooltip": "A book to showcase & test Modonomicon features.", + "book.modonomicon.demo_leaflet.leaflet.leaflet.description": "", + "book.modonomicon.demo_leaflet.leaflet.leaflet.intro.text": "This is a demo leaflet. It has some features:\n1. It's a leaflet. Yay.\n2. All page types modonomicon supports.\n3. No categories, no books, no mess.\n4. Fun! (If you like leaflets)\n", + "book.modonomicon.demo_leaflet.leaflet.leaflet.intro.title": "Demo Leaflet", + "book.modonomicon.demo_leaflet.leaflet.leaflet.name": "Demo Leaflet", + "book.modonomicon.demo_leaflet.leaflet.name": "Leaflet", + "book.modonomicon.demo_leaflet.name": "Demo Leaflet", + "book.modonomicon.demo_leaflet.tooltip": "A simple leaflet to show how modonomicon handles those.", "item.modonomicon.modonomicon": "Modonomicon", "itemGroup.modonomicon": "Modonomicon", "modonomicon.command.error.load_progress": "Invalid unlock code!", diff --git a/forge/src/generated/resources/assets/modonomicon/models/item/leaflet.json b/forge/src/generated/resources/assets/modonomicon/models/item/leaflet.json new file mode 100644 index 000000000..20834d2f9 --- /dev/null +++ b/forge/src/generated/resources/assets/modonomicon/models/item/leaflet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "modonomicon:item/leaflet" + } +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/book.json b/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/book.json new file mode 100644 index 000000000..52d7d0e46 --- /dev/null +++ b/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/book.json @@ -0,0 +1,62 @@ +{ + "auto_add_read_conditions": false, + "book_content_texture": "modonomicon:textures/gui/book_content.png", + "book_overview_texture": "modonomicon:textures/gui/book_overview.png", + "book_text_offset_width": -5, + "book_text_offset_x": 5, + "book_text_offset_y": 0, + "bottom_frame_overlay": { + "frame_height": 8, + "frame_width": 72, + "frame_x_offset": 0, + "frame_y_offset": -4, + "texture": "modonomicon:textures/gui/book_frame_bottom_overlay.png", + "texture_height": 256, + "texture_width": 256 + }, + "category_button_icon_scale": 1.0, + "category_button_x_offset": 0, + "category_button_y_offset": 0, + "crafting_texture": "modonomicon:textures/gui/crafting_textures.png", + "creative_tab": "modonomicon:modonomicon", + "default_title_color": 0, + "description": "", + "display_mode": "node", + "font": "modonomicon:default", + "frame_texture": "modonomicon:textures/gui/book_frame.png", + "generate_book_item": true, + "leaflet_entry": "modonomicon:leaflet/leaflet", + "left_frame_overlay": { + "frame_height": 70, + "frame_width": 7, + "frame_x_offset": 3, + "frame_y_offset": 0, + "texture": "modonomicon:textures/gui/book_frame_left_overlay.png", + "texture_height": 256, + "texture_width": 256 + }, + "model": "modonomicon:leaflet", + "name": "book.modonomicon.demo_leaflet.name", + "read_all_button_y_offset": 0, + "right_frame_overlay": { + "frame_height": 70, + "frame_width": 8, + "frame_x_offset": -4, + "frame_y_offset": 0, + "texture": "modonomicon:textures/gui/book_frame_right_overlay.png", + "texture_height": 256, + "texture_width": 256 + }, + "search_button_x_offset": 0, + "search_button_y_offset": 0, + "tooltip": "", + "top_frame_overlay": { + "frame_height": 7, + "frame_width": 72, + "frame_x_offset": 0, + "frame_y_offset": 4, + "texture": "modonomicon:textures/gui/book_frame_top_overlay.png", + "texture_height": 256, + "texture_width": 256 + } +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json b/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json new file mode 100644 index 000000000..12f3a3775 --- /dev/null +++ b/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/categories/leaflet.json @@ -0,0 +1,16 @@ +{ + "background": "modonomicon:textures/gui/dark_slate_seamless.png", + "background_height": 512, + "background_parallax_layers": [], + "background_texture_zoom_multiplier": 1.0, + "background_width": 512, + "description": "", + "display_mode": "node", + "entry_textures": "modonomicon:textures/gui/entry_textures.png", + "icon": { + "item": "minecraft:paper" + }, + "name": "book.modonomicon.demo_leaflet.leaflet.name", + "show_category_button": true, + "sort_number": 0 +} \ No newline at end of file diff --git a/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json b/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json new file mode 100644 index 000000000..465e12376 --- /dev/null +++ b/forge/src/generated/resources/data/modonomicon/modonomicon/books/demo_leaflet/entries/leaflet/leaflet.json @@ -0,0 +1,28 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "modonomicon:leaflet", + "description": "book.modonomicon.demo_leaflet.leaflet.leaflet.description", + "hide_while_locked": false, + "icon": { + "item": "minecraft:paper" + }, + "name": "book.modonomicon.demo_leaflet.leaflet.leaflet.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "condition": { + "type": "modonomicon:none" + }, + "show_title_separator": true, + "text": "book.modonomicon.demo_leaflet.leaflet.leaflet.intro.text", + "title": "book.modonomicon.demo_leaflet.leaflet.leaflet.intro.title", + "use_markdown_in_title": false + } + ], + "show_when_any_parent_unlocked": false, + "sort_number": 0, + "x": 0, + "y": 0 +} \ No newline at end of file diff --git a/forge/src/main/java/com/klikli_dev/modonomicon/datagen/DataGenerators.java b/forge/src/main/java/com/klikli_dev/modonomicon/datagen/DataGenerators.java index 1568997c1..2b848fb6a 100644 --- a/forge/src/main/java/com/klikli_dev/modonomicon/datagen/DataGenerators.java +++ b/forge/src/main/java/com/klikli_dev/modonomicon/datagen/DataGenerators.java @@ -10,6 +10,7 @@ import com.klikli_dev.modonomicon.api.datagen.BookProvider; import com.klikli_dev.modonomicon.api.datagen.LanguageProviderCache; import com.klikli_dev.modonomicon.datagen.book.DemoBook; +import com.klikli_dev.modonomicon.datagen.book.DemoLeaflet; import net.minecraft.data.DataGenerator; import net.minecraftforge.data.event.GatherDataEvent; @@ -24,7 +25,8 @@ public static void gatherData(GatherDataEvent event) { var enUsCache = new LanguageProviderCache("en_us"); generator.addProvider(event.includeServer(), new BookProvider(generator.getPackOutput(), event.getLookupProvider(), Modonomicon.MOD_ID, List.of( //Add our demo book provider to the book provider - new DemoBook(Modonomicon.MOD_ID, enUsCache) + new DemoBook(Modonomicon.MOD_ID, enUsCache), + new DemoLeaflet(Modonomicon.MOD_ID, enUsCache) ))); //Important: lang provider needs to be added after the book provider, so it can read the texts added by the book provider out of the cache generator.addProvider(event.includeClient(), new EnUsProvider(generator.getPackOutput(), enUsCache)); diff --git a/forge/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java b/forge/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java index 0c90d05a0..eef2d0a27 100644 --- a/forge/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java +++ b/forge/src/main/java/com/klikli_dev/modonomicon/datagen/ItemModelProvider.java @@ -48,5 +48,6 @@ protected void registerModels() { this.registerItemGenerated(this.name(ItemRegistry.MODONOMICON_GREEN.get()), "modonomicon_green"); this.registerItemGenerated(this.name(ItemRegistry.MODONOMICON_PURPLE.get()), "modonomicon_purple"); this.registerItemGenerated(this.name(ItemRegistry.MODONOMICON_RED.get()), "modonomicon_red"); + this.registerItemGenerated(this.name(ItemRegistry.LEAFLET.get()), "leaflet"); } } diff --git a/forge/src/main/resources/assets/modonomicon/textures/item/leaflet.png b/forge/src/main/resources/assets/modonomicon/textures/item/leaflet.png new file mode 100644 index 0000000000000000000000000000000000000000..09add337fd849eb7aacdb2e7facb5a17918524ff GIT binary patch literal 292 zcmV+<0o(qGP)T!ot>SUnwstH>gDC%-rm{T+Stp>%eS|;v$M0Zva+YAr;Ln@i;Ii;ep4&}0004W zQchCo>2+_Lr&0{QwNj5D8NDmA=p{@M5(Z}FTpX!j@l=T!ot>SUnwstH>gDC%-rm{T+Stp>%eS|;v$M0Zva+YAr;Ln@i;Ii;ep4&}0004W zQchCo>2+_Lr&0{QwNj5D8NDmA=p{@M5(Z}FTpX!j@l=