From 978d336b96129239a00abe4a6b9fad8f34b01ccc Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 31 Aug 2022 23:58:49 +0200 Subject: [PATCH] Add tabs with chapters and pages to the spellbook, add a profile page with character levels and mana, and contents for the introduction chapter --- .../unicopia/client/UnicopiaClient.java | 6 +- .../unicopia/client/gui/DrawableUtil.java | 21 +- .../unicopia/container/DynamicContent.java | 183 ++++++++++++++ .../container/ParagraphWrappingVisitor.java | 86 +++++++ .../container/SpellbookChapterList.java | 91 +++++++ .../container/SpellbookChapterLoader.java | 69 ++++++ .../SpellbookCraftingPageContent.java | 141 +++++++++++ .../unicopia/container/SpellbookPage.java | 8 - .../SpellbookProfilePageContent.java | 115 +++++++++ .../unicopia/container/SpellbookScreen.java | 227 +++++++++--------- .../container/SpellbookScreenHandler.java | 32 ++- .../unicopia/container/SpellbookTabBar.java | 71 ++++++ .../spellbook/chapters/air_magic.json | 5 + .../spellbook/chapters/crystal_heart.json | 5 + .../spellbook/chapters/dark_magic.json | 5 + .../spellbook/chapters/fire_magic.json | 5 + .../spellbook/chapters/ice_magic.json | 5 + .../spellbook/chapters/introduction.json | 113 +++++++++ .../spellbook/chapters/the_otherworldly.json | 5 + .../unicopia/textures/gui/container/book.png | Bin 41869 -> 52000 bytes .../gui/container/pages/air_magic.png | Bin 0 -> 791 bytes .../gui/container/pages/alicorn_amulet.png | Bin 0 -> 789 bytes .../textures/gui/container/pages/crafting.png | Bin 0 -> 780 bytes .../gui/container/pages/crystal_heart.png | Bin 0 -> 799 bytes .../gui/container/pages/dark_magic.png | Bin 0 -> 791 bytes .../gui/container/pages/fire_magic.png | Bin 0 -> 786 bytes .../gui/container/pages/ice_magic.png | Bin 0 -> 789 bytes .../gui/container/pages/introduction.png | Bin 0 -> 785 bytes .../gui/container/pages/pegasus_amulet.png | Bin 0 -> 783 bytes .../textures/gui/container/pages/profile.png | Bin 0 -> 789 bytes .../gui/container/pages/the_otherworldly.png | Bin 0 -> 821 bytes 31 files changed, 1048 insertions(+), 145 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/container/DynamicContent.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/ParagraphWrappingVisitor.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterList.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterLoader.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/SpellbookCraftingPageContent.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/SpellbookProfilePageContent.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/SpellbookTabBar.java create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/air_magic.json create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/crystal_heart.json create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/dark_magic.json create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/fire_magic.json create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/ice_magic.json create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/introduction.json create mode 100644 src/main/resources/assets/unicopia/spellbook/chapters/the_otherworldly.json create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/air_magic.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/alicorn_amulet.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/crafting.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/crystal_heart.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/dark_magic.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/fire_magic.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/ice_magic.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/introduction.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/pegasus_amulet.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/profile.png create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/pages/the_otherworldly.png diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index dac89058..61e9a004 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -11,19 +11,20 @@ import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.client.gui.LanSettingsScreen; import com.minelittlepony.unicopia.client.gui.UHud; import com.minelittlepony.unicopia.client.minelittlepony.MineLPConnector; -import com.minelittlepony.unicopia.container.SpellbookScreen; -import com.minelittlepony.unicopia.container.UScreenHandlers; +import com.minelittlepony.unicopia.container.*; import com.minelittlepony.unicopia.entity.player.PlayerCamera; import com.minelittlepony.unicopia.entity.player.Pony; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.OpenToLanScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreens; import net.minecraft.client.gui.screen.world.CreateWorldScreen; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.resource.ResourceType; import net.minecraft.text.Text; public class UnicopiaClient implements ClientModInitializer { @@ -63,6 +64,7 @@ public class UnicopiaClient implements ClientModInitializer { URenderers.bootstrap(); HandledScreens.register(UScreenHandlers.SPELL_BOOK, SpellbookScreen::new); + ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(SpellbookChapterLoader.INSTANCE); ClientTickEvents.END_CLIENT_TICK.register(this::onTick); ScreenInitCallback.EVENT.register(this::onScreenInit); diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/DrawableUtil.java b/src/main/java/com/minelittlepony/unicopia/client/gui/DrawableUtil.java index 637b6970..081d9628 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/gui/DrawableUtil.java +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/DrawableUtil.java @@ -14,14 +14,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Matrix4f; -public class DrawableUtil { - public static final double PI = Math.PI; - public static final double TAU = Math.PI * 2; - private static final double NUM_RINGS = 300; - private static final double INCREMENT = TAU / NUM_RINGS; +public interface DrawableUtil { + double PI = Math.PI; + double TAU = Math.PI * 2; + double NUM_RINGS = 300; + double INCREMENT = TAU / NUM_RINGS; - - public static void renderItemIcon(ItemStack stack, double x, double y, float scale) { + static void renderItemIcon(ItemStack stack, double x, double y, float scale) { MatrixStack modelStack = RenderSystem.getModelViewStack(); modelStack.push(); modelStack.translate(x, y, 0); @@ -36,7 +35,7 @@ public class DrawableUtil { RenderSystem.applyModelViewMatrix(); } - public static void drawLine(MatrixStack matrices, int x1, int y1, int x2, int y2, int color) { + static void drawLine(MatrixStack matrices, int x1, int y1, int x2, int y2, int color) { RenderSystem.enableBlend(); RenderSystem.disableTexture(); RenderSystem.defaultBlendFunc(); @@ -66,7 +65,7 @@ public class DrawableUtil { * * @param mirrorHorizontally Whether or not the arc must be mirrored across the horizontal plane. Will produce a bar that grows from the middle filling both sides. */ - public static void drawArc(MatrixStack matrices, double innerRadius, double outerRadius, double startAngle, double arcAngle, int color, boolean mirrorHorizontally) { + static void drawArc(MatrixStack matrices, double innerRadius, double outerRadius, double startAngle, double arcAngle, int color, boolean mirrorHorizontally) { float r = (color >> 24 & 255) / 255F; float g = (color >> 16 & 255) / 255F; float b = (color >> 8 & 255) / 255F; @@ -113,7 +112,7 @@ public class DrawableUtil { * * @param mirrorHorizontally Whether or not the arc must be mirrored across the horizontal plane. Will produce a bar that grows from the middle filling both sides. */ - public static void drawArc(MatrixStack matrices, double radius, double startAngle, double arcAngle, int color, boolean mirrorHorizontally) { + static void drawArc(MatrixStack matrices, double radius, double startAngle, double arcAngle, int color, boolean mirrorHorizontally) { drawCircle(matrices, radius, startAngle, arcAngle, color, mirrorHorizontally, VertexFormat.DrawMode.DEBUG_LINES); } @@ -122,7 +121,7 @@ public class DrawableUtil { * * @param mirrorHorizontally Whether or not the arc must be mirrored across the horizontal plane. Will produce a bar that grows from the middle filling both sides. */ - public static void drawCircle(MatrixStack matrices, double radius, double startAngle, double arcAngle, int color, boolean mirrorHorizontally) { + static void drawCircle(MatrixStack matrices, double radius, double startAngle, double arcAngle, int color, boolean mirrorHorizontally) { drawCircle(matrices, radius, startAngle, arcAngle, color, mirrorHorizontally, VertexFormat.DrawMode.QUADS); } diff --git a/src/main/java/com/minelittlepony/unicopia/container/DynamicContent.java b/src/main/java/com/minelittlepony/unicopia/container/DynamicContent.java new file mode 100644 index 00000000..68793e39 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/DynamicContent.java @@ -0,0 +1,183 @@ +package com.minelittlepony.unicopia.container; + +import java.util.*; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.minelittlepony.common.client.gui.dimension.Bounds; +import com.minelittlepony.unicopia.container.SpellbookChapterList.Content; +import com.minelittlepony.unicopia.container.SpellbookChapterList.Draw; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.*; +import net.minecraft.util.math.MathHelper; + +public class DynamicContent implements Content { + + private int offset = 0; + private final List pages = new ArrayList<>(); + + Bounds bounds = Bounds.empty(); + + public DynamicContent(JsonArray pages) { + pages.forEach(page -> this.pages.add(new Page(page.getAsJsonObject()))); + } + + @Override + public void draw(MatrixStack matrices, int mouseX, int mouseY) { + int pageIndex = offset * 2; + + getPage(pageIndex).ifPresent(page -> page.draw(matrices, mouseX, mouseY)); + + matrices.push(); + matrices.translate(bounds.width / 2 + 20, 0, 0); + getPage(pageIndex + 1).ifPresent(page -> page.draw(matrices, mouseX, mouseY)); + matrices.pop(); + } + + @Override + public void copyStateFrom(Content old) { + if (old instanceof DynamicContent o) { + offset = o.offset; + bounds = o.bounds; + } + } + + private Optional getPage(int index) { + if (index < 0 || index >= pages.size()) { + return Optional.empty(); + } + return Optional.of(pages.get(index)); + } + + @Override + public void init(SpellbookScreen screen) { + bounds = screen.getFrameBounds(); + pages.forEach(Page::reset); + screen.addPageButtons(187, 30, 350, incr -> { + offset = MathHelper.clamp(offset + incr, 0, (int)Math.ceil(pages.size() / 2F) - 1); + }); + } + + class Page implements Draw { + private final List paragraphs = new ArrayList<>(); + private final List images = new ArrayList<>(); + + private boolean compiled = false; + private final List wrappedText = new ArrayList<>(); + + private final Text title; + private final int level; + + public Page(JsonObject json) { + title = Text.Serializer.fromJson(json.get("title")); + level = JsonHelper.getInt(json, "level", 0); + int[] lineNumber = new int[1]; + JsonHelper.getArray(json, "elements", new JsonArray()).forEach(element -> { + if (element.isJsonPrimitive()) { + paragraphs.add(new Paragraph(lineNumber[0], Text.Serializer.fromJson(element))); + } else { + JsonObject image = JsonHelper.asObject(element, "element"); + if (image.has("texture")) { + images.add(new Image( + new Identifier(JsonHelper.getString(image, "texture")), + new Bounds( + JsonHelper.getInt(image, "y", 0), + JsonHelper.getInt(image, "x", 0), + JsonHelper.getInt(image, "width", 0), + JsonHelper.getInt(image, "height", 0) + ) + )); + } else { + paragraphs.add(new Paragraph(lineNumber[0], Text.Serializer.fromJson(element))); + } + } + + lineNumber[0]++; + }); + } + + public void compile() { + if (!compiled) { + compiled = true; + wrappedText.clear(); + ParagraphWrappingVisitor visitor = new ParagraphWrappingVisitor(this, yPosition -> { + return (bounds.width / 2 - 10) - images.stream() + .map(Image::bounds) + .filter(b -> b.contains(b.left + b.width / 2, yPosition)) + .mapToInt(b -> b.width) + .max() + .orElse(0); + }, wrappedText::add); + paragraphs.forEach(paragraph -> { + paragraph.text().visit(visitor, Style.EMPTY); + visitor.forceAdvance(); + }); + } + } + + public void reset() { + compiled = false; + } + + @Override + public void draw(MatrixStack matrices, int mouseX, int mouseY) { + + compile(); + TextRenderer font = MinecraftClient.getInstance().textRenderer; + boolean needsMoreXp = Pony.of(MinecraftClient.getInstance().player).getLevel().get() < level; + + matrices.push(); + matrices.translate(bounds.left, bounds.top - 10, mouseY); + matrices.scale(1.3F, 1.3F, 1); + font.draw(matrices, needsMoreXp ? Text.of("???") : title, 0, 0, mouseY); + matrices.pop(); + + matrices.push(); + matrices.translate(bounds.left, bounds.top - 10, mouseY); + matrices.translate(0, 12, 0); + matrices.scale(0.8F, 0.8F, 1); + font.draw(matrices, Text.literal("Level: " + (level + 1)).formatted(Formatting.DARK_GREEN), 0, 0, mouseY); + matrices.pop(); + + matrices.push(); + matrices.translate(0, 16, 0); + + for (int y = 0; y < wrappedText.size(); y++) { + Text line = wrappedText.get(y); + if (needsMoreXp) { + line = line.copy().formatted(Formatting.OBFUSCATED); + } + font.draw(matrices, line, + bounds.left, + bounds.top + (y * font.fontHeight), + 0 + ); + } + + matrices.translate(bounds.left, bounds.top, 0); + images.forEach(image -> image.draw(matrices, mouseX, mouseY)); + matrices.pop(); + } + + public record Paragraph(int y, Text text) {} + + public record Image( + Identifier texture, + Bounds bounds) implements Draw { + @Override + public void draw(MatrixStack matrices, int mouseX, int mouseY) { + RenderSystem.setShaderTexture(0, texture); + DrawableHelper.drawTexture(matrices, bounds().left, bounds().top, 0, 0, 0, bounds().width, bounds().height, bounds().width, bounds().height); + RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/container/ParagraphWrappingVisitor.java b/src/main/java/com/minelittlepony/unicopia/container/ParagraphWrappingVisitor.java new file mode 100644 index 00000000..e36ed11f --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/ParagraphWrappingVisitor.java @@ -0,0 +1,86 @@ +package com.minelittlepony.unicopia.container; + +import java.util.*; +import java.util.function.Consumer; + +import it.unimi.dsi.fastutil.ints.Int2IntFunction; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextHandler; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.text.*; +import net.minecraft.text.StringVisitable.StyledVisitor; + +class ParagraphWrappingVisitor implements StyledVisitor { + private int line = 0; + private int pageWidth; + + private final TextRenderer font = MinecraftClient.getInstance().textRenderer; + private final TextHandler handler = font.getTextHandler(); + + private float currentLineCollectedLength = 0; + private MutableText currentLine = Text.empty(); + private boolean progressedNonEmpty; + + private final Int2IntFunction widthSupplier; + private final Consumer lineConsumer; + + ParagraphWrappingVisitor(DynamicContent.Page page, Int2IntFunction widthSupplier, Consumer lineConsumer) { + this.widthSupplier = widthSupplier; + this.lineConsumer = lineConsumer; + pageWidth = widthSupplier.applyAsInt((line) * font.fontHeight); + } + + @Override + public Optional accept(Style style, String s) { + while (!s.isEmpty()) { + int trimmedLength = handler.getTrimmedLength(s, pageWidth, style); + + if (trimmedLength == 0) { + trimmedLength = s.length(); + } + + String wrappedFragment = s.substring(0, trimmedLength); + + int lastSpace = wrappedFragment.lastIndexOf(' '); + trimmedLength = lastSpace > 0 ? Math.min(lastSpace, trimmedLength) : trimmedLength; + + Text fragment = Text.literal(s.substring(0, trimmedLength).trim()).setStyle(style); + float grabbedWidth = handler.getWidth(fragment); + + if (currentLineCollectedLength + grabbedWidth > pageWidth) { + advance(); + } + + if (currentLineCollectedLength > 0) { + currentLine.append(" "); + } + currentLine.append(fragment); + currentLineCollectedLength += grabbedWidth; + + if (trimmedLength <= s.length()) { + s = s.substring(trimmedLength, s.length()); + } + } + + return Optional.empty(); + } + + public void forceAdvance() { + if (currentLineCollectedLength > 0) { + advance(); + } + advance(); + } + + public void advance() { + if (progressedNonEmpty || currentLineCollectedLength > 0) { + progressedNonEmpty = true; + lineConsumer.accept(currentLine); + } + pageWidth = widthSupplier.applyAsInt((++line) * font.fontHeight); + currentLine = Text.empty(); + currentLineCollectedLength = 0; + } + + record StyledString (String string, Style style) {} +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterList.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterList.java new file mode 100644 index 00000000..732c470c --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterList.java @@ -0,0 +1,91 @@ +package com.minelittlepony.unicopia.container; + +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Stream; + +import com.minelittlepony.unicopia.Unicopia; + +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; + +public class SpellbookChapterList { + public static final Identifier CRAFTING_ID = Unicopia.id("crafting"); + public static final Identifier PROFILE_ID = Unicopia.id("profile"); + + private final Chapter craftingChapter; + + private Optional currentChapter = Optional.empty(); + + private final Map chapters = new HashMap<>(); + + public SpellbookChapterList(Chapter craftingChapter, Chapter profileChapter) { + this.craftingChapter = craftingChapter; + SpellbookChapterLoader.INSTANCE.getChapters().forEach(chapter -> { + chapters.put(chapter.id(), chapter); + }); + chapters.put(craftingChapter.id(), craftingChapter); + chapters.put(profileChapter.id(), profileChapter); + } + + public Stream getTabs(TabSide side) { + return chapters.values().stream().filter(chapter -> chapter.side() == side); + } + + public Chapter getCurrentChapter() { + if (SpellbookChapterLoader.DEBUG) { + SpellbookChapterLoader.INSTANCE.getChapters().forEach(chapter -> { + Optional.ofNullable(chapters.get(chapter.id())).flatMap(Chapter::content).ifPresent(old -> { + chapter.content().ifPresent(neu -> neu.copyStateFrom(old)); + }); + chapters.put(chapter.id(), chapter); + }); + } + return currentChapter.map(chapters::get).orElse(craftingChapter); + } + + public void setCurrentChapter(Chapter chapter) { + currentChapter = Optional.of(chapter.id()); + } + + public record Chapter ( + Identifier id, + TabSide side, + int tabY, + int color, + Optional content) { + + public Identifier icon() { + return new Identifier(id().getNamespace(), "textures/gui/container/pages/" + id().getPath() + ".png"); + } + } + + public enum TabSide { + LEFT, + RIGHT + } + + public interface Content extends Draw { + void init(SpellbookScreen screen); + + default void copyStateFrom(Content old) {} + + static Optional of(Consumer init, Draw draw) { + return Optional.of(new Content() { + @Override + public void init(SpellbookScreen screen) { + init.accept(screen); + } + + @Override + public void draw(MatrixStack matrices, int mouseX, int mouseY) { + draw.draw(matrices, mouseX, mouseY); + } + }); + } + } + + public interface Draw { + void draw(MatrixStack matrices, int mouseX, int mouseY); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterLoader.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterLoader.java new file mode 100644 index 00000000..04c04602 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookChapterLoader.java @@ -0,0 +1,69 @@ +package com.minelittlepony.unicopia.container; + +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Collectors; + +import com.google.gson.*; +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.container.SpellbookChapterList.*; +import com.minelittlepony.unicopia.util.Resources; + +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.minecraft.client.MinecraftClient; +import net.minecraft.resource.JsonDataLoader; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.*; +import net.minecraft.util.profiler.Profiler; + +public class SpellbookChapterLoader extends JsonDataLoader implements IdentifiableResourceReloadListener { + + public static boolean DEBUG = true; + + private static final Identifier ID = Unicopia.id("spellbook/chapters"); + + public static final SpellbookChapterLoader INSTANCE = new SpellbookChapterLoader(); + + private Map chapters = new HashMap<>(); + + public SpellbookChapterLoader() { + super(Resources.GSON, ID.getPath()); + } + + @Override + public Identifier getFabricId() { + return ID; + } + + public Set getChapters() { + return new HashSet<>(chapters.values()); + } + + private static final Executor EXECUTOR = CompletableFuture.delayedExecutor(5, TimeUnit.SECONDS); + + @Override + protected void apply(Map data, ResourceManager manager, Profiler profiler) { + chapters = data.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> { + JsonObject json = JsonHelper.asObject(entry.getValue(), "root"); + + return new Chapter(entry.getKey(), + TabSide.valueOf(JsonHelper.getString(json, "side")), + JsonHelper.getInt(json, "y_position"), + JsonHelper.getInt(json, "color", 0), + loadContent(JsonHelper.getObject(json, "content", new JsonObject())) + ); + })); + + if (DEBUG) { + CompletableFuture.runAsync(() -> { + reload(CompletableFuture::completedFuture, manager, profiler, profiler, Util.getMainWorkerExecutor(), MinecraftClient.getInstance()); + }, EXECUTOR); + } + } + + private Optional loadContent(JsonObject json) { + return Optional.of(JsonHelper.getArray(json, "pages", new JsonArray())) + .filter(pages -> pages.size() > 0) + .map(DynamicContent::new); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookCraftingPageContent.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookCraftingPageContent.java new file mode 100644 index 00000000..54cec871 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookCraftingPageContent.java @@ -0,0 +1,141 @@ +package com.minelittlepony.unicopia.container; + +import com.minelittlepony.common.client.gui.IViewRoot; +import com.minelittlepony.common.client.gui.ScrollContainer; +import com.minelittlepony.common.client.gui.element.Label; +import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe; +import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; +import com.minelittlepony.unicopia.container.SpellbookScreen.TraitButton; +import com.minelittlepony.unicopia.item.URecipes; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; + +public class SpellbookCraftingPageContent extends ScrollContainer implements SpellbookChapterList.Content, RecipeBookProvider { + + + private final SpellbookScreen screen; + + private final RecipeBookWidget recipeBook = new RecipeBookWidget(); + + public SpellbookCraftingPageContent(SpellbookScreen screen) { + this.screen = screen; + backgroundColor = 0xFFf9efd3; + scrollbar.layoutToEnd = true; + } + + @Override + public void init(SpellbookScreen screen) { + screen.addPageButtons(187, 300, 350, SpellbookPage::swap); + refreshRecipeBook(); + screen.addDrawable(this); + ((IViewRoot)screen).getChildElements().add(this); + } + + @Override + public void draw(MatrixStack matrices, int mouseX, int mouseY) { + textRenderer.draw(matrices, screen.getTitle(), SpellbookScreen.TITLE_X, SpellbookScreen.TITLE_Y, SpellbookScreen.TITLE_COLOR); + textRenderer.draw(matrices, SpellbookPage.getCurrent().getLabel(), screen.getBackgroundWidth() / 2 + SpellbookScreen.TITLE_X, SpellbookScreen.TITLE_Y, SpellbookScreen.TITLE_COLOR); + + Text pageText = Text.translatable("%s/%s", SpellbookPage.getCurrent().ordinal() + 1, SpellbookPage.VALUES.length); + textRenderer.draw(matrices, pageText, 337 - textRenderer.getWidth(pageText) / 2F, 190, SpellbookScreen.TITLE_COLOR); + } + + @Override + public void refreshRecipeBook() { + init(this::initPageContent); + } + + @Override + public RecipeBookWidget getRecipeBookWidget() { + return recipeBook; + } + + private void initPageContent() { + getContentPadding().setVertical(10); + getContentPadding().bottom = 30; + + switch (SpellbookPage.getCurrent()) { + case DISCOVERIES: { + int i = 0; + int cols = 4; + + int top = 10; + int left = 25; + + for (Trait trait : Trait.all()) { + int x = i % cols; + int y = i / cols; + + addButton(new TraitButton(left + x * 32, top + y * 32, trait)); + i++; + } + break; + } + case INVENTORY: + // handled elsewhere + break; + case RECIPES: + int top = 0; + for (SpellbookRecipe recipe : this.client.world.getRecipeManager().listAllOfType(URecipes.SPELLBOOK)) { + if (client.player.getRecipeBook().contains(recipe)) { + IngredientTree tree = new IngredientTree(0, top, + width - scrollbar.getBounds().width + 2, + 20); + recipe.buildCraftingTree(tree); + top += tree.build(this); + } + } + if (top == 0) { + addButton(new Label(width / 2, 0).setCentered()).getStyle().setText("gui.unicopia.spellbook.page.recipes.empty"); + } + } + } + + @Override + public void init(Runnable contentInitializer) { + if (screen != null) { + margin.left = screen.getX() + screen.getBackgroundWidth() / 2 + 10; + margin.top = screen.getY() + 35; + margin.right = screen.width - screen.getBackgroundWidth() - screen.getX() + 30; + margin.bottom = screen.height - screen.getBackgroundHeight() - screen.getY() + 40; + } + super.init(contentInitializer); + } + + @Override + public void drawOverlays(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) { + matrices.push(); + matrices.translate(margin.left, margin.top, 0); + matrices.translate(-2, -2, 0); + RenderSystem.enableBlend(); + RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE); + int tileSize = 25; + + final int bottom = height - tileSize + 4; + final int right = width - tileSize + 9; + + drawTexture(matrices, 0, 0, 405, 62, tileSize, tileSize, 512, 256); + drawTexture(matrices, right, 0, 425, 62, tileSize, tileSize, 512, 256); + + drawTexture(matrices, 0, bottom, 405, 72, tileSize, tileSize, 512, 256); + drawTexture(matrices, right, bottom, 425, 72, tileSize, tileSize, 512, 256); + + for (int i = tileSize; i < right; i += tileSize) { + drawTexture(matrices, i, 0, 415, 62, tileSize, tileSize, 512, 256); + drawTexture(matrices, i, bottom, 415, 72, tileSize, tileSize, 512, 256); + } + + for (int i = tileSize; i < bottom; i += tileSize) { + drawTexture(matrices, 0, i, 405, 67, tileSize, tileSize, 512, 256); + drawTexture(matrices, right, i, 425, 67, tileSize, tileSize, 512, 256); + } + matrices.pop(); + screen.drawSlots(matrices, mouseX, mouseY, tickDelta); + + super.drawOverlays(matrices, mouseX, mouseY, tickDelta); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookPage.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookPage.java index e8e104d5..a91d319d 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookPage.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookPage.java @@ -17,14 +17,6 @@ public enum SpellbookPage { return label; } - public boolean isFirst() { - return ordinal() == 0; - } - - public boolean isLast() { - return ordinal() == VALUES.length - 1; - } - public static SpellbookPage getCurrent() { return VALUES[current]; } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookProfilePageContent.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookProfilePageContent.java new file mode 100644 index 00000000..d13d5013 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookProfilePageContent.java @@ -0,0 +1,115 @@ +package com.minelittlepony.unicopia.container; + +import com.minelittlepony.common.client.gui.dimension.Bounds; +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.client.gui.DrawableUtil; +import com.minelittlepony.unicopia.entity.player.MagicReserves; +import com.minelittlepony.unicopia.entity.player.Pony; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawableHelper; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; + +public class SpellbookProfilePageContent extends DrawableHelper implements SpellbookChapterList.Content { + private final MinecraftClient client = MinecraftClient.getInstance(); + private final Pony pony = Pony.of(client.player); + private final TextRenderer font = client.textRenderer; + + private final SpellbookScreen screen; + + public SpellbookProfilePageContent(SpellbookScreen screen) { + this.screen = screen; + } + + @Override + public void init(SpellbookScreen screen) { + + } + + @Override + public void draw(MatrixStack matrices, int mouseX, int mouseY) { + + int y = SpellbookScreen.TITLE_Y; + + float delta = pony.getEntity().age + client.getTickDelta(); + int currentLevel = pony.getLevel().get(); + + matrices.push(); + matrices.translate(SpellbookScreen.TITLE_X, y, 0); + matrices.scale(1.3F, 1.3F, 1); + font.draw(matrices, pony.getEntity().getName(), 0, 0, SpellbookScreen.TITLE_COLOR); + matrices.pop(); + matrices.push(); + matrices.translate(SpellbookScreen.TITLE_X, y + 13, 0); + matrices.scale(0.8F, 0.8F, 1); + font.draw(matrices, "Friendship Student", 0, 0, 0xAA0040FF); + matrices.pop(); + + MagicReserves reserves = pony.getMagicalReserves(); + + matrices.push(); + matrices.translate(screen.getBackgroundWidth() / 2 + SpellbookScreen.TITLE_X - 10, y, 0); + matrices.scale(1.3F, 1.3F, 1); + font.draw(matrices, SpellbookPage.INVENTORY.getLabel(), 0, 0, SpellbookScreen.TITLE_COLOR); + matrices.pop(); + + Bounds bounds = screen.getFrameBounds(); + + matrices.push(); + matrices.translate(bounds.left + bounds.width / 4 - 10, bounds.top + bounds.height / 2 + 20, 0); + + double growth = MathHelper.sin(delta / 9F) * 2; + + double radius = 40 + growth; + float xpPercentage = reserves.getXp().getPercentFill(); + float manaPercentage = reserves.getMana().getPercentFill(); + + float alphaF = (MathHelper.sin(delta / 9F) + 1) / 2F; + int alpha = (int)(alphaF * 0x10) & 0xFF; + int color = 0x10404000 | alpha; + int xpColor = 0xAA0040FF | ((int)(xpPercentage * 0xFF) & 0xFF) << 16; + + DrawableUtil.drawArc(matrices, 0, radius + 24, 0, DrawableUtil.TAU, color, false); + DrawableUtil.drawArc(matrices, radius / 3, radius + 6, 0, DrawableUtil.TAU, color, false); + DrawableUtil.drawArc(matrices, radius / 3, radius + 6, 0, xpPercentage * DrawableUtil.TAU, xpColor, false); + radius += 8; + DrawableUtil.drawArc(matrices, radius, radius + 6 + growth, 0, manaPercentage * DrawableUtil.TAU, 0xFF40F040, false); + + String manaString = (int)reserves.getMana().get() + "/" + (int)reserves.getMana().getMax(); + + y = 15; + font.draw(matrices, "Mana", -font.getWidth("Mana") / 2, y, SpellbookScreen.TITLE_COLOR); + font.draw(matrices, manaString, -font.getWidth(manaString) / 2, y += font.fontHeight, SpellbookScreen.TITLE_COLOR); + + matrices.push(); + matrices.scale(1.4F, 1.4F, 1); + RenderSystem.setShaderTexture(0, Unicopia.id("textures/gui/icons.png")); + drawTexture(matrices, -8, -8, 16 * 2, 0, 16, 16, 256, 256); + RenderSystem.setShaderTexture(0, SpellbookScreen.TEXTURE); + matrices.pop(); + + Text levelString = I18n.hasTranslation("enchantment.level." + (currentLevel + 1)) ? Text.translatable("enchantment.level." + (currentLevel + 1)) : Text.literal(currentLevel >= 999 ? ">999" : "" + (currentLevel + 1)); + + matrices.translate(-font.getWidth(levelString), -35, 0); + matrices.scale(2F, 2F, 1); + font.draw(matrices, levelString, 0, 0, SpellbookScreen.TITLE_COLOR); + matrices.pop(); + + matrices.push(); + matrices.translate(-screen.getX(), -screen.getY(), 0); + screen.drawSlots(matrices, mouseX, mouseY, 0); + matrices.pop(); + } + + static void drawBar(MatrixStack matrices, int x, int y, float value, int color) { + int barWidth = 40; + int midpoint = x + (int)(barWidth * value); + fill(matrices, x, y, midpoint, y + 5, 0xFFAAFFFF); + fill(matrices, midpoint, y, x + barWidth, y + 5, color); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java index cfcf997a..21a682b7 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreen.java @@ -1,28 +1,32 @@ package com.minelittlepony.unicopia.container; -import com.minelittlepony.common.client.gui.IViewRoot; -import com.minelittlepony.common.client.gui.ScrollContainer; +import java.util.Optional; +import java.util.function.IntConsumer; + +import com.minelittlepony.common.client.gui.GameGui; +import com.minelittlepony.common.client.gui.dimension.Bounds; import com.minelittlepony.common.client.gui.element.Button; -import com.minelittlepony.common.client.gui.element.Label; import com.minelittlepony.common.client.gui.sprite.TextureSprite; import com.minelittlepony.unicopia.Unicopia; -import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; import com.minelittlepony.unicopia.ability.magic.spell.trait.TraitDiscovery; -import com.minelittlepony.unicopia.container.SpellbookScreenHandler.InputSlot; -import com.minelittlepony.unicopia.container.SpellbookScreenHandler.SpellbookSlot; +import com.minelittlepony.unicopia.container.SpellbookChapterList.*; +import com.minelittlepony.unicopia.container.SpellbookScreenHandler.*; import com.minelittlepony.unicopia.entity.player.Pony; -import com.minelittlepony.unicopia.item.URecipes; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.Drawable; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.texture.NativeImage; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.screen.slot.Slot; +import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -31,82 +35,82 @@ public class SpellbookScreen extends HandledScreen imple public static final Identifier SLOT = Unicopia.id("textures/gui/container/slot.png"); public static final Identifier GEM = Unicopia.id("textures/item/gemstone.png"); - private final RecipeBookWidget recipeBook = new RecipeBookWidget(); + private static final int CONTENT_PADDING = 30; - private final ScrollContainer container = new ScrollContainer() { - { - backgroundColor = 0xFFf9efd3; - scrollbar.layoutToEnd = true; - } - @Override - public void init(Runnable contentInitializer) { - margin.left = SpellbookScreen.this.x + backgroundWidth / 2 + 10; - margin.top = SpellbookScreen.this.y + 35; - margin.right = SpellbookScreen.this.width - backgroundWidth - SpellbookScreen.this.x + 30; - margin.bottom = SpellbookScreen.this.height - backgroundHeight - SpellbookScreen.this.y + 40; - super.init(contentInitializer); - } + public static final int TITLE_X = 30; + public static final int TITLE_Y = 20; + public static final int TITLE_COLOR = 0xFF404040; - @Override - public void drawOverlays(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) { - matrices.push(); - matrices.translate(margin.left, margin.top, 0); - matrices.translate(-2, -2, 0); - RenderSystem.enableBlend(); - RenderSystem.setShaderTexture(0, TEXTURE); - int tileSize = 25; + private final SpellbookCraftingPageContent craftingPageWidget = new SpellbookCraftingPageContent(this); - final int bottom = height - tileSize + 4; - final int right = width - tileSize + 9; + private final Chapter craftingChapter = new Chapter(SpellbookChapterList.CRAFTING_ID, TabSide.LEFT, 0, 0, Optional.of(craftingPageWidget)); + private final Chapter profileChapter = new Chapter(SpellbookChapterList.PROFILE_ID, TabSide.LEFT, 1, 0, Optional.of(new SpellbookProfilePageContent(this))); - drawTexture(matrices, 0, 0, 405, 62, tileSize, tileSize, 512, 256); - drawTexture(matrices, right, 0, 425, 62, tileSize, tileSize, 512, 256); + private final SpellbookChapterList chapters = new SpellbookChapterList(craftingChapter, profileChapter); + private final SpellbookTabBar tabs = new SpellbookTabBar(this, chapters); - drawTexture(matrices, 0, bottom, 405, 72, tileSize, tileSize, 512, 256); - drawTexture(matrices, right, bottom, 425, 72, tileSize, tileSize, 512, 256); - - for (int i = tileSize; i < right; i += tileSize) { - drawTexture(matrices, i, 0, 415, 62, tileSize, tileSize, 512, 256); - drawTexture(matrices, i, bottom, 415, 72, tileSize, tileSize, 512, 256); - } - - for (int i = tileSize; i < bottom; i += tileSize) { - drawTexture(matrices, 0, i, 405, 67, tileSize, tileSize, 512, 256); - drawTexture(matrices, right, i, 425, 67, tileSize, tileSize, 512, 256); - } - matrices.pop(); - drawSlots(matrices, mouseX, mouseY, tickDelta); - - super.drawOverlays(matrices, mouseX, mouseY, tickDelta); - } - }; + private Bounds contentBounds = Bounds.empty(); public SpellbookScreen(SpellbookScreenHandler handler, PlayerInventory inventory, Text title) { super(handler, inventory, title); backgroundWidth = 405; backgroundHeight = 219; - titleX = 30; - titleY = 20; + contentBounds = new Bounds(CONTENT_PADDING, CONTENT_PADDING, backgroundWidth - CONTENT_PADDING * 2, backgroundHeight - CONTENT_PADDING * 3 - 2); + + handler.addSlotShowingCondition(slotType -> { + if (slotType == SlotType.INVENTORY) { + return chapters.getCurrentChapter() == profileChapter + || (chapters.getCurrentChapter() == craftingChapter && SpellbookPage.getCurrent() == SpellbookPage.INVENTORY); + } + return chapters.getCurrentChapter() == craftingChapter; + }); + } + + public void addPageButtons(int buttonY, int prevX, int nextX, IntConsumer pageAction) { + addDrawableChild(new PageButton(this, x + nextX, y + buttonY, 1, pageAction)); + addDrawableChild(new PageButton(this, x + prevX, y + buttonY, -1, pageAction)); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getBackgroundWidth() { + return backgroundWidth; + } + + public int getBackgroundHeight() { + return backgroundHeight; + } + + public Bounds getFrameBounds() { + return contentBounds; + } + + @Override + public T addDrawable(T drawable) { + return super.addDrawable(drawable); } @Override public void init() { super.init(); - addDrawableChild(new PageButton(x + 350, y + 187, 1)); - addDrawableChild(new PageButton(x + 300, y + 187, -1)); - container.init(this::initPageContent); - addDrawable(container); - ((IViewRoot)this).getChildElements().add(container); + tabs.init(); + chapters.getCurrentChapter().content().ifPresent(content -> content.init(this)); } @Override public void refreshRecipeBook() { - container.init(this::initPageContent); + craftingPageWidget.refreshRecipeBook(); } @Override public RecipeBookWidget getRecipeBookWidget() { - return recipeBook; + return craftingPageWidget.getRecipeBookWidget(); } @Override @@ -121,13 +125,34 @@ public class SpellbookScreen extends HandledScreen imple RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.setShaderTexture(0, TEXTURE); - int left = (width - backgroundWidth) / 2; - int top = (height - backgroundHeight) / 2; + drawTexture(matrices, x, y, 0, 0, backgroundWidth, backgroundHeight, 512, 256); - drawTexture(matrices, left, top, 0, 0, backgroundWidth, backgroundHeight, 512, 256); + tabs.getAllTabs().forEach(tab -> { + Bounds bounds = tab.bounds(); + chapters.getCurrentChapter(); + boolean hover = bounds.contains(mouseX, mouseY); + + int color = tab.chapter().color() & 0xFFFFFF; + + int v = 100 + (hover ? 24 : 0); + if (color == 0xFFFFFF || color == 0) { + v += 48; + } else { + RenderSystem.setShaderColor(NativeImage.getRed(color), NativeImage.getGreen(color), NativeImage.getBlue(color), 1); + } + + boolean isRight = tab.chapter().side() == TabSide.RIGHT; + + drawTexture(matrices, bounds.left, bounds.top, isRight ? 510 - bounds.width : 402, v, bounds.width, bounds.height, 512, 256); + RenderSystem.setShaderColor(1, 1, 1, 1); + + RenderSystem.setShaderTexture(0, tab.icon()); + drawTexture(matrices, isRight ? bounds.left + bounds.width - 16 - 10 : bounds.left + 10, bounds.top + (bounds.height - 16) / 2, 0, 0, 16, 16, 16, 16); + RenderSystem.setShaderTexture(0, TEXTURE); + }); } - protected void drawSlots(MatrixStack matrices, int mouseX, int mouseY, float delta) { + void drawSlots(MatrixStack matrices, int mouseX, int mouseY, float delta) { matrices.push(); matrices.translate(x, y, 0); RenderSystem.setShaderColor(1, 1, 1, 1); @@ -154,53 +179,22 @@ public class SpellbookScreen extends HandledScreen imple @Override protected void drawForeground(MatrixStack matrices, int mouseX, int mouseY) { - textRenderer.draw(matrices, title, titleX, titleY, 4210752); - textRenderer.draw(matrices, SpellbookPage.getCurrent().getLabel(), 220, this.titleY, 4210752); - - Text pageText = Text.translatable("%s/%s", SpellbookPage.getCurrent().ordinal() + 1, SpellbookPage.VALUES.length); - textRenderer.draw(matrices, pageText, - x + 325 - textRenderer.getWidth(pageText) / 2F, y + 188 - textRenderer.fontHeight, 4210752); + chapters.getCurrentChapter().content().ifPresent(content -> content.draw(matrices, mouseX, mouseY)); } - private void initPageContent() { - container.getContentPadding().setVertical(10); - container.getContentPadding().bottom = 30; + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + return tabs.getAllTabs().anyMatch(tab -> { - switch (SpellbookPage.getCurrent()) { - case DISCOVERIES: { - int i = 0; - int cols = 4; - - int top = 10; - int left = 25; - - for (Trait trait : Trait.all()) { - int x = i % cols; - int y = i / cols; - - container.addButton(new TraitButton(left + x * 32, top + y * 32, trait)); - i++; - } - break; + if (tab.bounds().contains(mouseX, mouseY) && chapters.getCurrentChapter() != tab.chapter()) { + chapters.setCurrentChapter(tab.chapter()); + GameGui.playSound(SoundEvents.ITEM_BOOK_PAGE_TURN); + clearAndInit(); + return true; } - case INVENTORY: - // handled elsewhere - break; - case RECIPES: - int top = 0; - for (SpellbookRecipe recipe : this.client.world.getRecipeManager().listAllOfType(URecipes.SPELLBOOK)) { - if (client.player.getRecipeBook().contains(recipe)) { - IngredientTree tree = new IngredientTree(0, top, - container.width - container.scrollbar.getBounds().width + 2, - 20); - recipe.buildCraftingTree(tree); - top += tree.build(container); - } - } - if (top == 0) { - container.addButton(new Label(container.width / 2, 0).setCentered()).getStyle().setText("gui.unicopia.spellbook.page.recipes.empty"); - } - } + + return false; + }) || super.mouseClicked(mouseX, mouseY, button); } @Override @@ -217,7 +211,7 @@ public class SpellbookScreen extends HandledScreen imple || super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); } - class PageButton extends ImageButton { + private static class PageButton extends ImageButton { private final int increment; private final TextureSprite sprite = new TextureSprite() .setSize(25, 13) @@ -225,21 +219,18 @@ public class SpellbookScreen extends HandledScreen imple .setTextureOffset(0, 479) .setTexture(TEXTURE); - public PageButton(int x, int y, int increment) { + public PageButton(SpellbookScreen screen, int x, int y, int increment, IntConsumer pageAction) { super(x, y, 25, 20); this.increment = increment; getStyle().setIcon(sprite); onClick(sender -> { - SpellbookPage.swap(increment); - init(client, SpellbookScreen.this.width, SpellbookScreen.this.height); + pageAction.accept(increment); + screen.clearAndInit(); }); } @Override public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) { - - setEnabled(increment < 0 ? !SpellbookPage.getCurrent().isFirst() : !SpellbookPage.getCurrent().isLast()); - if (!active) { return; } @@ -251,7 +242,7 @@ public class SpellbookScreen extends HandledScreen imple } } - class TraitButton extends ImageButton { + static class TraitButton extends ImageButton { private final Trait trait; public TraitButton(int x, int y, Trait trait) { @@ -263,12 +254,12 @@ public class SpellbookScreen extends HandledScreen imple .setTexture(trait.getSprite())); getStyle().setTooltip(trait.getTooltip()); - onClick(sender -> Pony.of(client.player).getDiscoveries().markRead(trait)); + onClick(sender -> Pony.of(MinecraftClient.getInstance().player).getDiscoveries().markRead(trait)); } @Override public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) { - TraitDiscovery discoveries = Pony.of(client.player).getDiscoveries(); + TraitDiscovery discoveries = Pony.of(MinecraftClient.getInstance().player).getDiscoveries(); setEnabled(discoveries.isKnown(trait)); RenderSystem.setShaderColor(1, 1, 1, 1); @@ -295,7 +286,7 @@ public class SpellbookScreen extends HandledScreen imple } } - class ImageButton extends Button { + static class ImageButton extends Button { public ImageButton(int x, int y) { super(x, y); diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index 948936d1..13fe334d 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -1,6 +1,7 @@ package com.minelittlepony.unicopia.container; import java.util.*; +import java.util.function.Predicate; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.USounds; @@ -56,6 +57,8 @@ public class SpellbookScreenHandler extends ScreenHandler { private final ScreenHandlerContext context; + private Predicate canShowSlots; + protected SpellbookScreenHandler(int syncId, PlayerInventory inv) { this(syncId, inv, ScreenHandlerContext.EMPTY); } @@ -133,6 +136,10 @@ public class SpellbookScreenHandler extends ScreenHandler { onContentChanged(input); } + public void addSlotShowingCondition(Predicate canShowSlots) { + this.canShowSlots = canShowSlots; + } + public int getOutputSlotId() { return outputSlot.id; } @@ -154,7 +161,10 @@ public class SpellbookScreenHandler extends ScreenHandler { .findFirst() .filter(recipe -> result.shouldCraftRecipe(world, (ServerPlayerEntity)this.inventory.player, recipe)) .map(recipe -> recipe.craft(input)) - .orElse(!input.hasIngredients() ? ItemStack.EMPTY : input.getTraits().applyTo(UItems.BOTCHED_GEM.getDefaultStack()))); + .orElse(!input.hasIngredients() || input.getItemToModify().getItem() != UItems.GEMSTONE + ? ItemStack.EMPTY + : input.getTraits().applyTo(UItems.BOTCHED_GEM.getDefaultStack())) + ); ((ServerPlayerEntity)this.inventory.player).networkHandler.sendPacket(new ScreenHandlerSlotUpdateS2CPacket(syncId, nextRevision(), outputSlot.id, outputSlot.getStack())); } @@ -363,7 +373,7 @@ public class SpellbookScreenHandler extends ScreenHandler { } } - public static class InventorySlot extends Slot implements SpellbookSlot { + public class InventorySlot extends Slot implements SpellbookSlot { public InventorySlot(Inventory inventory, int index, int x, int y) { super(inventory, index, x, y); } @@ -375,11 +385,11 @@ public class SpellbookScreenHandler extends ScreenHandler { @Override public boolean isEnabled() { - return SpellbookPage.getCurrent() == SpellbookPage.INVENTORY; + return canShowSlots.test(SlotType.INVENTORY); } } - public static class ModifierSlot extends Slot implements SpellbookSlot { + public class ModifierSlot extends Slot implements SpellbookSlot { private final int ring; public ModifierSlot(Inventory inventory, int index, int[] params) { @@ -401,6 +411,11 @@ public class SpellbookScreenHandler extends ScreenHandler { public int getRing() { return ring; } + + @Override + public boolean isEnabled() { + return canShowSlots.test(SlotType.CRAFTING) && super.isEnabled(); + } } public class InputSlot extends Slot implements SpellbookSlot { @@ -423,7 +438,7 @@ public class SpellbookScreenHandler extends ScreenHandler { @Override public boolean isEnabled() { - return !outputSlot.isEnabled(); + return canShowSlots.test(SlotType.CRAFTING) && !outputSlot.isEnabled(); } } @@ -457,7 +472,7 @@ public class SpellbookScreenHandler extends ScreenHandler { @Override public boolean isEnabled() { - return hasStack(); + return canShowSlots.test(SlotType.CRAFTING) && hasStack(); } @Override @@ -470,4 +485,9 @@ public class SpellbookScreenHandler extends ScreenHandler { super.onTakeItem(player, stack); } } + + public enum SlotType { + INVENTORY, + CRAFTING + } } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookTabBar.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookTabBar.java new file mode 100644 index 00000000..78670771 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookTabBar.java @@ -0,0 +1,71 @@ +package com.minelittlepony.unicopia.container; + +import java.util.*; +import java.util.stream.Stream; + +import com.minelittlepony.common.client.gui.dimension.Bounds; +import com.minelittlepony.unicopia.container.SpellbookChapterList.Chapter; +import com.minelittlepony.unicopia.container.SpellbookChapterList.TabSide; + +import net.minecraft.util.Identifier; + +public class SpellbookTabBar { + + private final SpellbookScreen screen; + private final SpellbookChapterList chapters; + + private final Map> bars = new EnumMap<>(TabSide.class); + + public SpellbookTabBar(SpellbookScreen screen, SpellbookChapterList chapters) { + this.screen = screen; + this.chapters = chapters; + } + + public void init() { + bars.clear(); + Stream.of(TabSide.values()).forEach(side -> { + bars.put(side, buildTabList(side)); + }); + } + + public Stream getAllTabs() { + return bars.values().stream().flatMap(l -> l.stream()); + } + + private List buildTabList(TabSide side) { + List tabs = new ArrayList<>(); + int backgroundHeight = screen.getBackgroundHeight(); + int backgroundWidth = screen.getBackgroundWidth(); + + int tabInset = 14; + + int top = (screen.height - backgroundHeight) / 2 + 20; + int left = (screen.width - backgroundWidth) / 2; + + List leftTabs = chapters.getTabs(side) + .sorted(Comparator.comparing(Chapter::tabY)) + .toList(); + + + int tabWidth = 35; + int tabHeight = 23; + + int totalTabs = leftTabs.size(); + float squashFactor = Math.min(1, (float)(backgroundHeight - 40) / ((tabHeight + 8) * leftTabs.size())); + + for (int i = 0; i < totalTabs; i++) { + int tabY = (int)((leftTabs.get(i).tabY() * tabHeight + (i * 5)) * squashFactor); + int width = tabWidth; + if (leftTabs.get(i) == chapters.getCurrentChapter()) { + width += 3; + } + int xPosition = side == TabSide.LEFT ? left - width + tabInset : left + backgroundWidth - tabInset; + + tabs.add(new Tab(leftTabs.get(i), new Bounds(top + tabY, xPosition, width, tabHeight), leftTabs.get(i).icon())); + } + + return tabs; + } + + record Tab (Chapter chapter, Bounds bounds, Identifier icon) {} +} diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/air_magic.json b/src/main/resources/assets/unicopia/spellbook/chapters/air_magic.json new file mode 100644 index 00000000..3caf30a8 --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/air_magic.json @@ -0,0 +1,5 @@ +{ + "side": "RIGHT", + "y_position": 4, + "color": 0 +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/crystal_heart.json b/src/main/resources/assets/unicopia/spellbook/chapters/crystal_heart.json new file mode 100644 index 00000000..1e96075a --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/crystal_heart.json @@ -0,0 +1,5 @@ +{ + "side": "RIGHT", + "y_position": 7, + "color": 0 +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/dark_magic.json b/src/main/resources/assets/unicopia/spellbook/chapters/dark_magic.json new file mode 100644 index 00000000..f5b55793 --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/dark_magic.json @@ -0,0 +1,5 @@ +{ + "side": "RIGHT", + "y_position": 5, + "color": 0 +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/fire_magic.json b/src/main/resources/assets/unicopia/spellbook/chapters/fire_magic.json new file mode 100644 index 00000000..ad53a6dd --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/fire_magic.json @@ -0,0 +1,5 @@ +{ + "side": "RIGHT", + "y_position": 3, + "color": 0 +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/ice_magic.json b/src/main/resources/assets/unicopia/spellbook/chapters/ice_magic.json new file mode 100644 index 00000000..10aab24e --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/ice_magic.json @@ -0,0 +1,5 @@ +{ + "side": "RIGHT", + "y_position": 2, + "color": 0 +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/introduction.json b/src/main/resources/assets/unicopia/spellbook/chapters/introduction.json new file mode 100644 index 00000000..332bf41c --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/introduction.json @@ -0,0 +1,113 @@ +{ + "side": "RIGHT", + "y_position": 0, + "color": 0, + "content": { + "pages": [ + { + "title": "Preface", + "level": 0, + "elements": [ + { + "text": "To whomever holds this tome, beware what you seek for you might not like what you find.", + "extra": [ + { "text": "Hither yonder equs.", "obfuscated": true } + ] + }, + "At the princess' behest", + "- Starswirl the Bearded" + ] + }, + { + "title": "Magic in Equestria", + "level": 0, + "elements": [ + { + "text": "Equestria is filled with magic of all different shapes and forms. Following recent events, however, it's has become plainly obvious that we do not fully understand all that there is about the world of Equestria. That is why the crown has tasked me with researching Magic in all of its forms, so we might utilise it and, I hope, save ourselves from the", + "extra": [ + { "text": "aaaaaaa", "obfuscated": "true" } + ] + }, + { "x": 125, "y": 0, "width": 32, "height": 32, "texture": "unicopia:textures/gui/container/pages/profile.png" } + ] + }, + { + "title": "1st Mare '12", + "level": 0, + "elements": [ + "Odd Rocks", + "These 'Gemstones' are a common material found around the world. Earth Ponies dig them up all the time and don't think any much of it, but these stones have a special trait I found that lets them hold magic.", + "What's odd is that they seem to have some magical properties I haven't seen before.", + { "x": 125, "y": 0, "width": 32, "height": 32, "texture": "unicopia:textures/item/gemstone.png" } + ] + }, + { + "title": "Gemstones", + "level": 0, + "elements": [ + { + "text": "My research is", + "extra": [ + { "text": "still incomplete", "obfuscated": true}, + { "text": "but I believe these may become useful for storing and applying complex spells, if I do so correctly..."} + ] + }, + { + "text": "Luna-wants", + "strikethrough": true, + "extra": [ + { "text": "I'm going to keep experimenting. Hooves-crossed, I'll update you tomorrow if I find anything.", "strikethrough": false} + ] + }, + "At the princess' behest", + "- Starswirl the Bearded" + ] + }, + { + "title": "2nd Mare '12", + "level": 0, + "elements": [ + { + "text": "It worked! Holy", + "extra": [ + { "text": "Celestia's ass-cheeks'", "obfuscated": true}, + { "text": "it actually worked." } + ] + }, + "This is amazing! These can do so much more than I could have ever imagined. Think of the advances I could bring to Equestria. Gem-powered lighting, heating, cooling, I'd no longer have to spend summer sitting on this-", + "I'm getting ahead of myself. Let me explain..." + ] + }, + { + "title": "Spellcrafting", + "level": 0, + "elements": [ + { "x": 125, "y": 0, "width": 32, "height": 32, "texture": "unicopia:textures/gui/container/pages/crafting.png" }, + "I drew a guide at the start of this book to help with the placement.", + "Put a raw gem-it mustn't have any spells already-in the middle and place materials around it in the slots I marked.", + "Each material gives different effects and putting them closer also enhances their influence on the gem." + ] + }, + { + "title": "3rd Mare '12", + "level": 0, + "elements": [ + "I'm going to start documenting spell combinations as I find them. Some of them are pretty obvious, like gem + fire = fire gem", + "But some are less clear. For instance, what traits would an egg add?", + "At the princess' behest", + "- Starswirl the Bearded" + ] + }, + { + "title": "Botched Gems", + "level": 1, + "elements": [ + { "x": 127, "y": 1, "width": 32, "height": 32, "texture": "unicopia:textures/item/botched_gem.png" }, + "Okay, I guess not every combination works. That's dissapointing, and now I have all these useless stones piling up in my chambers.", + "I don't know what to do with them. They're not edible, I don't think.", + "They do still have the traits I gave them, so maybe I can find a use other than building a rock-fort with little Luna..." + ] + } + ] + } +} diff --git a/src/main/resources/assets/unicopia/spellbook/chapters/the_otherworldly.json b/src/main/resources/assets/unicopia/spellbook/chapters/the_otherworldly.json new file mode 100644 index 00000000..066c2508 --- /dev/null +++ b/src/main/resources/assets/unicopia/spellbook/chapters/the_otherworldly.json @@ -0,0 +1,5 @@ +{ + "side": "RIGHT", + "y_position": 6, + "color": 0 +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/textures/gui/container/book.png b/src/main/resources/assets/unicopia/textures/gui/container/book.png index 509c651f83434308eb74b0c9df05a8efad2d9c88..a02b0421c297bddf3a2fb9b46abd4562ec6856e3 100644 GIT binary patch literal 52000 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 T6O= zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002NqL_t(I%VS^|XuycX{!f8k6a)UF8HUYZ zxEK>LCgTH4M5_Bgpkcs(kIzJ`>6C^6{nG&hCFy`JUSMPxGyniJY7+wD&Zk@e0000< KMNUMnLSTXllWzY2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/container/pages/crystal_heart.png b/src/main/resources/assets/unicopia/textures/gui/container/pages/crystal_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..38d50e2c0ea4364356007071bdc08f93fb81c476 GIT binary patch literal 799 zcmV+)1K|9LP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002`-L_t(I%gvI(4geqsLe>BO=hwB`5;~Qq zR7SvzcwITYX?BtTvp*8k%-Hq|wuC~Iof7tB4mE)>GD9iA$mZ$?ZWSo zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002u#L_t(I%gs zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002fwL_t(I%gs{B4FE6*68GPkE?|rCNXl1H zK+P7wVy#Bv{s*22kDcxEoOleug@{Z@k!;wPIHg7z^$X_k Qx&QzG07*qoM6N<$f-pUH3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/container/pages/ice_magic.png b/src/main/resources/assets/unicopia/textures/gui/container/pages/ice_magic.png new file mode 100644 index 0000000000000000000000000000000000000000..e83745215b0c821dbe6b4fca481027403322ab81 GIT binary patch literal 789 zcmV+w1M2*VP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002ozL_t(I%VS^|1&lbv|C6DID9sr1OhmX6 zuYpWNdh zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002cvL_t(I%VS`m5HMm9`%i`*q7A^1V zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002WtL_t(I%VS^|1;l{=_#|1#(S!_`D0Lna zCAOn`0j7}=k3r~a5DXG*XT-@N!VpG+0(cBzWFS@$iy@3ONkoGK0052V3k=Skvf}^% N002ovPDHLkV1mP-Z6*K! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/container/pages/profile.png b/src/main/resources/assets/unicopia/textures/gui/container/pages/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..ad4ed08241d55fb2b00a15373862df20d2000411 GIT binary patch literal 789 zcmV+w1M2*VP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1002ozL_t(I%VS^|1&mn4{u8O^KQ{gU(b&is zmm0znc;x@%((s=Mul;9WU|?XPMnL|jzzcXKhzUdnMl8|spNyy{sEMSo7-9eb`WzwW THY?O-00000NkvXXu0mjf80&Xd literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/gui/container/pages/the_otherworldly.png b/src/main/resources/assets/unicopia/textures/gui/container/pages/the_otherworldly.png new file mode 100644 index 0000000000000000000000000000000000000000..622e330abb65f17f972420cf2dd285416cd2818c GIT binary patch literal 821 zcmV-51Iqk~P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=KFjvOHjhTl0wj(|68jzh6Xxj~MfpX#ojtraQD zOQbHV2IMinjXx;Or1|6fO5gC1S59gkrIwQMXw}LMlgMw+ypJ{KwdabL?ml`%QTp(U zYeukVe#R&m<>q|klPx6g7L>%A{HTS_y!A}iDUf&&BAFmYSaDjqCVy*Bh1Tl3 zMTFg7y+U2g8w2ew%KnKc0HJlABRd;>+2;pfA)<)dZ4PX(<>MxC7`>e>NhfGQpkdV8 zVjp(_v$xnko&fR831#*T5NSCZ=Xq%q^^1D^j#rDaFgai_OK=&5OH-S8pMqVNt>(qDD)V ztKhC$E!At(T3bWX2IYp;EgBpLA9CnnM>+h6qaLl}_;l^oOZOhV_Lc?@89Ho~;Uh*J zZPLV1nmTQk=`&`XZQ-abS-NbMVcF1003!8L_t(I%f*vX3cxT3LmTn_SI)i$on00S zh51#id1`3K_&YG2De^Tq*Mx!I0;-xYVwIx;aC7Yk00lxZet*0d=%P(=!EVDe`&v(O z!@LTHGSLb7wF1mUOOp_Ebe}!c8*iA2Bfs$iI58L;*!mw~00000NkvXXu0mjfIPZe; literal 0 HcmV?d00001