From eb7f213899b5556a833351fa064a7b34d2c27f1d Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 12:17:24 +0200 Subject: [PATCH 01/20] feat(setup): add page-resource variable and methods --- .../cygnus/setup/player/SetupPlayer.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java index 313d945..e215cb7 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java @@ -4,6 +4,7 @@ import net.minestom.server.entity.Player; import net.minestom.server.network.player.GameProfile; import net.minestom.server.network.player.PlayerConnection; +import net.onelitefeather.cygnus.common.page.PageResource; import net.onelitefeather.cygnus.common.player.InstanceSwitchChunkPlayer; import org.jetbrains.annotations.Nullable; @@ -18,6 +19,7 @@ public final class SetupPlayer extends InstanceSwitchChunkPlayer { private @Nullable Point survivorToDelete; private @Nullable Point pageToDelete; + private @Nullable PageResource pageResource; /** * {@inheritDoc} @@ -44,6 +46,15 @@ public void setPageToDelete(@Nullable Point page) { this.pageToDelete = page; } + /** + * Sets the page resource which should be used deleted. + * + * @param pageResource the page resource to set + */ + public void setPageResource(@Nullable PageResource pageResource) { + this.pageResource = pageResource; + } + /** * Returns the survivor marked for deletion. * @@ -61,4 +72,13 @@ public void setPageToDelete(@Nullable Point page) { public @Nullable Point getPageToDelete() { return pageToDelete; } + + /** + * Returns the page resource which should be used deleted. + * + * @return the page resource to delete + */ + public @Nullable PageResource getPageResource() { + return pageResource; + } } From 3a20d118e6b2ded6b82d7267fc81782eadc46026 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 12:17:38 +0200 Subject: [PATCH 02/20] feat(setup): add header formatter --- .../setup/inventory/page/PageHeaderFormatter.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java new file mode 100644 index 0000000..e6b3503 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java @@ -0,0 +1,14 @@ +package net.onelitefeather.cygnus.setup.inventory.page; + +import net.kyori.adventure.text.Component; + +public final class PageHeaderFormatter { + + public static Component format(int current, int max) { + return Component.text("Page " + current + " of " + max); + } + + private PageHeaderFormatter() { + + } +} From 837b35791c57c07413418c24b4a1cf45d043c9f9 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 12:17:48 +0200 Subject: [PATCH 03/20] chore(setup): add page inventory --- .../cygnus/setup/data/GameData.java | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java index c2fb3cd..1ee0ac1 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java @@ -5,12 +5,16 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; +import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Player; import net.minestom.server.instance.anvil.AnvilLoader; import net.minestom.server.world.DimensionType; +import net.minestom.server.inventory.InventoryType; import net.onelitefeather.cygnus.common.map.GameMap; import net.onelitefeather.cygnus.common.map.GameMapBuilder; import net.onelitefeather.cygnus.common.util.GsonHelper; +import net.onelitefeather.cygnus.setup.inventory.page.PageHeaderFormatter; +import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; import net.onelitefeather.cygnus.setup.inventory.view.InventoryMode; import net.onelitefeather.cygnus.setup.inventory.view.MapDataOverviewInventory; import net.onelitefeather.cygnus.setup.inventory.view.SurvivorViewInventory; @@ -18,15 +22,23 @@ import net.onelitefeather.cygnus.setup.item.SetupItems; import net.onelitefeather.cygnus.setup.map.MapDataCategory; import net.onelitefeather.cygnus.setup.util.SetupMessages; +import net.theevilreaper.aves.inventory.InventoryLayout; +import net.theevilreaper.aves.inventory.pageable.PageableInventory; +import net.theevilreaper.aves.inventory.pageable.TitleData; +import net.theevilreaper.aves.inventory.slot.ISlot; +import net.theevilreaper.aves.inventory.util.LayoutCalculator; import net.theevilreaper.aves.map.BaseMapBuilder; import net.theevilreaper.aves.map.MapEntry; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; public class GameData extends InstanceSetupData { private final MapDataOverviewInventory inventory; private final SurvivorViewInventory survivorInventory; + private final PageableInventory pageInventory; private GameMapBuilder gameMapBuilder; private boolean pageMode; private boolean survivorMode; @@ -43,6 +55,30 @@ public GameData(Player player, MapEntry mapEntry) { this.inventory = new MapDataOverviewInventory(player, this.gameMapBuilder, InventoryMode.GAME); this.survivorInventory = new SurvivorViewInventory(player, this.gameMapBuilder); + this.pageInventory = PageableInventory + .builder() + .titleData( + TitleData + .builder() + .pageMapper(PageHeaderFormatter::format) + .showPageNumbers(true) + .build() + ) + .player(player) + .type(InventoryType.CHEST_6_ROW) + .slotRange(LayoutCalculator.quad(InventoryType.CHEST_1_ROW.getSize(), InventoryType.CHEST_5_ROW.getSize() - 1)) + .layout(InventoryLayout.fromType(InventoryType.CHEST_6_ROW)) + .values(getPageSlots()) + .build(); + } + + private List getPageSlots() { + if (this.gameMapBuilder.getPageFaces().isEmpty()) return List.of(); + List pageSlots = new ArrayList<>(this.gameMapBuilder.getPageFaces().size()); + this.gameMapBuilder.getPageFaces().forEach(pageFace -> { + pageSlots.add(new PositionSlot(MapDataCategory.PAGE, ((Pos) pageFace.position()))); + }); + return pageSlots; } /** @@ -64,9 +100,7 @@ public void openInventory(InventoryTarget target) { switch (target) { case GENERAL -> this.inventory.open(); case SURVIVOR -> this.survivorInventory.open(); - case PAGE -> { - - } + case PAGE -> this.pageInventory.open(); } } @@ -78,9 +112,7 @@ public void triggerUpdate(InventoryTarget target) { switch (target) { case GENERAL -> this.inventory.invalidateDataLayout(); case SURVIVOR -> this.survivorInventory.invalidateDataLayout(); - case PAGE -> { - // Nothing to do here - } + case PAGE -> this.pageInventory.open(); } } @@ -228,6 +260,7 @@ public void reset() { super.reset(); this.survivorInventory.unregister(); this.inventory.unregister(); + this.pageInventory.unregister(); } /** From 84d38d8a4f378ecc1689e0e046b79c65caf3a003 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 12:20:43 +0200 Subject: [PATCH 04/20] chore(setup): cleanup imports --- .../net/onelitefeather/cygnus/setup/player/SetupPlayer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java index e215cb7..1e9697f 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/player/SetupPlayer.java @@ -12,7 +12,7 @@ * Custom {@link Player} implementation to add additional context related to the setup flow. * * @author theEvilReaper - * @version 1.0.0 + * @version 1.2.0 * @since 2.0.0 */ public final class SetupPlayer extends InstanceSwitchChunkPlayer { From d512daab1f68df4080caccbf1987b1606f53acd3 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 14:05:53 +0200 Subject: [PATCH 05/20] chore(setup): improve formatter class --- .../inventory/page/PageHeaderFormatter.java | 17 ++++++++++++++- .../page/PageHeaderFormatterTest.java | 21 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 setup/src/test/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatterTest.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java index e6b3503..5b36f45 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatter.java @@ -1,14 +1,29 @@ package net.onelitefeather.cygnus.setup.inventory.page; import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.Contract; +/** + * Small helper class to format the current number of pages and the total ones to a {@link Component}. + * + * @author theEvilReaper + * @since 2.6.0 + * @version 1.0.0 + */ public final class PageHeaderFormatter { + /** + * Returns a {@link Component} that contains the current page and the total numbers of pages. + * @param current page count + * @param max page count + * @return the created component + */ + @Contract(value = "_, _ -> new", pure = true) public static Component format(int current, int max) { return Component.text("Page " + current + " of " + max); } private PageHeaderFormatter() { - + // Nothing to do here } } diff --git a/setup/src/test/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatterTest.java b/setup/src/test/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatterTest.java new file mode 100644 index 0000000..3df33e6 --- /dev/null +++ b/setup/src/test/java/net/onelitefeather/cygnus/setup/inventory/page/PageHeaderFormatterTest.java @@ -0,0 +1,21 @@ +package net.onelitefeather.cygnus.setup.inventory.page; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PageHeaderFormatterTest { + + @Test + void testFormatter() { + Component component = PageHeaderFormatter.format(1, 2); + assertNotNull(component); + + String componentText = PlainTextComponentSerializer.plainText().serialize(component); + + assertNotNull(componentText); + assertEquals("Page 1 of 2", componentText); + } +} From 7611cab5e5c926c503066588285ad1fcbabbe300 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 14:07:30 +0200 Subject: [PATCH 06/20] feat(setup): add new context implementation --- .../setup/event/dialog/DialogContext.java | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogContext.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogContext.java index c24979e..ef9e3b0 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogContext.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogContext.java @@ -1,20 +1,22 @@ package net.onelitefeather.cygnus.setup.event.dialog; import net.minestom.server.coordinate.Point; +import net.onelitefeather.cygnus.common.page.PageResource; /** * Represents the context for a dialog event which contains all necessary data * to open the correct dialog for a specific {@link DialogTarget}. * * @author Joltra - * @version 1.0.0 + * @version 1.5.0 * @see DialogTarget * @since 0.1.0 */ public sealed interface DialogContext permits DialogContext.NameContext, DialogContext.PositionContent, - DialogContext.AuthorAmount { + DialogContext.AuthorAmount, + DialogContext.PageContent { /** * Specific context for the update or deletion of a name. @@ -34,5 +36,21 @@ record PositionContent(Point point) implements DialogContext { } - record AuthorAmount(float amount) implements DialogContext {} + /** + * Specific context to indicate how many authors a map should have. + * + * @param amount of author + */ + record AuthorAmount(float amount) implements DialogContext { + + } + + /** + * Context implementation to bind a {@link PageResource} to a dialog. + * + * @param resource to bind + */ + record PageContent(PageResource resource) implements DialogContext { + + } } From f9be8e634d2b2302cf4d4f5e3a6ca542fece0091 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 14:10:04 +0200 Subject: [PATCH 07/20] chore(setup): add PositionSlot and improve format share --- .../cygnus/setup/inventory/slot/PageSlot.java | 65 +++++++++++++++++++ .../setup/inventory/slot/PositionSlot.java | 13 +--- .../cygnus/setup/util/PositionFormat.java | 28 ++++++++ 3 files changed, 94 insertions(+), 12 deletions(-) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/util/PositionFormat.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java new file mode 100644 index 0000000..76a5f11 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java @@ -0,0 +1,65 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.common.page.PageResource; +import net.onelitefeather.cygnus.setup.event.PlayerRemoveDataEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogContext; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import net.theevilreaper.aves.util.Components; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import static net.onelitefeather.cygnus.setup.util.PositionFormat.DECIMAL_FORMAT; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.TELEPORT_CLICK; + +public class PageSlot extends AbstractDataSlot { + + private final PageResource pageResource; + + public PageSlot(PageResource pageResource) { + super(MapDataCategory.PAGE); + this.pageResource = pageResource; + } + + @Override + public ItemStack getItem() { + ItemStack.Builder overviewItem = ItemStack.builder(type.getMaterial()) + .customName(Component.text("Page", type.getColor())); + List lore = new ArrayList<>(); + lore.add(Component.empty()); + lore.add(Component.text("Face: ").append(Component.text(pageResource.face().name(), type.getColor()))); + lore.addAll(Components.pointToLore(MiniMessage.miniMessage(), pageResource.position(), DECIMAL_FORMAT)); + lore.add(Component.empty()); + lore.add(TELEPORT_CLICK); + lore.add(DELETE_CLICK); + lore.add(Component.empty()); + + return overviewItem.lore(lore).build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + + switch (click) { + case Click.Left _ -> { + player.closeInventory(); + //TODO: Teleport one block in front + player.teleport(this.pageResource.position().asPos()); + } + case Click.Right _ -> + EventDispatcher.call(new PlayerRemoveDataEvent(player, type, new DialogContext.PageContent(this.pageResource))); + default -> { + } + } + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java index 7bf07ea..888929a 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java @@ -15,27 +15,16 @@ import net.theevilreaper.aves.util.Components; import org.jetbrains.annotations.Nullable; -import java.math.RoundingMode; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.function.Consumer; +import static net.onelitefeather.cygnus.setup.util.PositionFormat.DECIMAL_FORMAT; import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; import static net.onelitefeather.cygnus.setup.util.SetupMessages.TELEPORT_CLICK; public class PositionSlot extends AbstractDataSlot { - private static final DecimalFormat DECIMAL_FORMAT; - - static { - DECIMAL_FORMAT = new DecimalFormat("#.##"); - DECIMAL_FORMAT.setRoundingMode(RoundingMode.CEILING); - DECIMAL_FORMAT.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ROOT)); - } - private final @Nullable Pos position; public PositionSlot(MapDataCategory category, @Nullable Pos position) { diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/PositionFormat.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/PositionFormat.java new file mode 100644 index 0000000..31f744c --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/PositionFormat.java @@ -0,0 +1,28 @@ +package net.onelitefeather.cygnus.setup.util; + +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +/** + * Helper class to share the same decimal format for all positions. + * + * @author theEvilReaper + * @version 1.0.0 + * @since 2.6.0 + */ +public final class PositionFormat { + + public static final DecimalFormat DECIMAL_FORMAT; + + static { + DECIMAL_FORMAT = new DecimalFormat("#.##"); + DECIMAL_FORMAT.setRoundingMode(RoundingMode.CEILING); + DECIMAL_FORMAT.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ROOT)); + } + + private PositionFormat() { + // Nothing to do here + } +} From 0a43483fc9511749b5a57375cdeee948cbf1ef60 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 14:10:19 +0200 Subject: [PATCH 08/20] chore(setup): improve remove data listener --- .../data/PlayerRemoveDataListener.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java index ce9011a..e5ea841 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java @@ -10,6 +10,7 @@ import java.util.function.Consumer; public final class PlayerRemoveDataListener implements Consumer { + @Override public void accept(PlayerRemoveDataEvent event) { final Player player = event.getPlayer(); @@ -22,21 +23,14 @@ public void accept(PlayerRemoveDataEvent event) { DialogContext context = event.getContext(); - - if (!(context instanceof DialogContext.PositionContent positionContent)) { - player.sendMessage(""); - return; - } - SetupPlayer setupPlayer = (SetupPlayer) player; + if (context instanceof DialogContext.PositionContent positionContent) { + setupPlayer.setSurvivorToDelete(positionContent.point()); + } - switch (category) { - case SURVIVOR -> setupPlayer.setSurvivorToDelete(positionContent.point()); - case PAGE -> setupPlayer.setPageToDelete(positionContent.point()); - default -> { - - } + if (context instanceof DialogContext.PageContent pageContent) { + setupPlayer.setPageResource(pageContent.resource()); } MapDialogs.openDeleteDialog(player, category, context); From 1150a2a10a834e355efd8232a98be149801d6541 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 14:11:05 +0200 Subject: [PATCH 09/20] chore(setup): add page inventory --- .../net/onelitefeather/cygnus/setup/data/GameData.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java index 1ee0ac1..15527f5 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java @@ -1,11 +1,9 @@ package net.onelitefeather.cygnus.setup.data; import net.kyori.adventure.bossbar.BossBar; -import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; -import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Player; import net.minestom.server.instance.anvil.AnvilLoader; import net.minestom.server.world.DimensionType; @@ -14,7 +12,7 @@ import net.onelitefeather.cygnus.common.map.GameMapBuilder; import net.onelitefeather.cygnus.common.util.GsonHelper; import net.onelitefeather.cygnus.setup.inventory.page.PageHeaderFormatter; -import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; +import net.onelitefeather.cygnus.setup.inventory.slot.PageSlot; import net.onelitefeather.cygnus.setup.inventory.view.InventoryMode; import net.onelitefeather.cygnus.setup.inventory.view.MapDataOverviewInventory; import net.onelitefeather.cygnus.setup.inventory.view.SurvivorViewInventory; @@ -75,9 +73,7 @@ public GameData(Player player, MapEntry mapEntry) { private List getPageSlots() { if (this.gameMapBuilder.getPageFaces().isEmpty()) return List.of(); List pageSlots = new ArrayList<>(this.gameMapBuilder.getPageFaces().size()); - this.gameMapBuilder.getPageFaces().forEach(pageFace -> { - pageSlots.add(new PositionSlot(MapDataCategory.PAGE, ((Pos) pageFace.position()))); - }); + this.gameMapBuilder.getPageFaces().forEach(pageFace -> pageSlots.add(new PageSlot(pageFace))); return pageSlots; } From ab48a8e4f2734e54dd0a620cd634668983ccfd4d Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Tue, 30 Jun 2026 14:14:32 +0200 Subject: [PATCH 10/20] chore(setup): improve switch pattern --- .../data/PlayerRemoveDataListener.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java index e5ea841..0b04b05 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java @@ -1,38 +1,42 @@ package net.onelitefeather.cygnus.setup.listener.data; +import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Player; -import net.onelitefeather.cygnus.setup.dialog.MapDialogs; +import net.onelitefeather.cygnus.common.page.PageResource; +import net.onelitefeather.cygnus.setup.dialogs.MapDialogs; import net.onelitefeather.cygnus.setup.event.PlayerRemoveDataEvent; import net.onelitefeather.cygnus.setup.event.dialog.DialogContext; import net.onelitefeather.cygnus.setup.map.MapDataCategory; import net.onelitefeather.cygnus.setup.player.SetupPlayer; +import java.util.EnumSet; +import java.util.Set; import java.util.function.Consumer; public final class PlayerRemoveDataListener implements Consumer { + private static final Set CONTEXT_AWARE_CATEGORIES = + EnumSet.of(MapDataCategory.SURVIVOR, MapDataCategory.PAGE); + @Override public void accept(PlayerRemoveDataEvent event) { final Player player = event.getPlayer(); final MapDataCategory category = event.getMapDataCategory(); + final DialogContext context = event.getContext(); - if (event.getContext() == null || (!(category == MapDataCategory.SURVIVOR || category == MapDataCategory.PAGE))) { + if (context == null || !CONTEXT_AWARE_CATEGORIES.contains(category)) { MapDialogs.openDeleteDialog(player, category); return; } + final SetupPlayer setupPlayer = (SetupPlayer) player; - DialogContext context = event.getContext(); - SetupPlayer setupPlayer = (SetupPlayer) player; - - if (context instanceof DialogContext.PositionContent positionContent) { - setupPlayer.setSurvivorToDelete(positionContent.point()); - } - - if (context instanceof DialogContext.PageContent pageContent) { - setupPlayer.setPageResource(pageContent.resource()); + switch (context) { + case DialogContext.PositionContent(Point point) -> setupPlayer.setSurvivorToDelete(point); + case DialogContext.PageContent(PageResource resource) -> setupPlayer.setPageResource(resource); + default -> { } } MapDialogs.openDeleteDialog(player, category, context); } -} +} \ No newline at end of file From f226f8b5a1c82f4b9cee50314e6676e1fc778e83 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 4 Jul 2026 15:57:21 +0200 Subject: [PATCH 11/20] chore(setup): add page view item and call logic --- .../cygnus/setup/data/GameData.java | 7 +++++- .../cygnus/setup/item/SetupItemId.java | 9 ++++---- .../cygnus/setup/item/SetupItems.java | 23 ++++++++++++++----- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java index 15527f5..d0aef71 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java @@ -1,6 +1,7 @@ package net.onelitefeather.cygnus.setup.data; import net.kyori.adventure.bossbar.BossBar; +import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; @@ -117,7 +118,6 @@ public void triggerUpdate(InventoryTarget target) { */ @Override public void updateTitle() { - System.out.println("TItle is " + (title == null)); if (getMapBuilder().getName().equalsIgnoreCase("Map")) { this.title = null; super.updateTitle(); @@ -196,6 +196,11 @@ public void handleItemInteraction(Player player, byte tagValue) { return; } + if (SetupItemId.PAGES == tagValue) { + this.openInventory(InventoryTarget.PAGE); + return; + } + super.handleItemInteraction(player, tagValue); } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItemId.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItemId.java index 8ff8a0b..16737e4 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItemId.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItemId.java @@ -13,10 +13,11 @@ public final class SetupItemId { public static final byte SAVE_DATA = (byte) 0x01; public static final byte DATA = (byte) 0x02; public static final byte PAGE = (byte) 0x03; - public static final byte LEAVE_PAGE = (byte) 0x04; - public static final byte SURVIVOR = (byte) 0x05; - public static final byte SPAWNS = (byte) 0x06; - public static final byte LEAVE_MODE = (byte) 0x07; + public static final byte PAGES = (byte) 0x04; + public static final byte LEAVE_PAGE = (byte) 0x05; + public static final byte SURVIVOR = (byte) 0x06; + public static final byte SPAWNS = (byte) 0x07; + public static final byte LEAVE_MODE = (byte) 0x08; private SetupItemId() { // Nothing to do here diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java index 625d98d..a24fc43 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/item/SetupItems.java @@ -96,6 +96,17 @@ public final class SetupItems { gameSetupLayout.set(7, saveItem); pageLayout = new HotBarLayout(); + pageLayout.set(2, ItemStack.builder(Material.COMPASS) + .customName(Component.text("Pages", NamedTextColor.YELLOW)) + .lore( + getLore(SPACE_SEPARATOR + .append(Component.text("View all available ", NamedTextColor.WHITE)) + .append(Component.text("Pages", NamedTextColor.YELLOW)) + ) + ) + .set(Tags.ITEM_TAG, SetupItemId.PAGES) + .build() + ); pageLayout.set(4, ItemStack.builder(Material.BARRIER) .customName(Component.text("Leave mode", NamedTextColor.RED)) .lore( @@ -111,12 +122,12 @@ public final class SetupItems { survivorSpawnLayout = new HotBarLayout(); survivorSpawnLayout.set(2, ItemStack.builder(Material.CHEST) - .customName(Component.text("Spawns", NamedTextColor.AQUA)) - .lore( - getLore(SPACE_SEPARATOR - .append(Component.text("View all available ", NamedTextColor.WHITE)) - .append(Component.text("Survivor ", NamedTextColor.GREEN)) - .append(Component.text("spawns", NamedTextColor.WHITE))) + .customName(Component.text("Spawns", NamedTextColor.AQUA)) + .lore( + getLore(SPACE_SEPARATOR + .append(Component.text("View all available ", NamedTextColor.WHITE)) + .append(Component.text("Survivor ", NamedTextColor.GREEN)) + .append(Component.text("spawns", NamedTextColor.WHITE))) ) .set(Tags.ITEM_TAG, SetupItemId.SPAWNS) .build() From f8cd39c75381f0d6fe88cdb41b68204ee850babe Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 15:07:27 +0200 Subject: [PATCH 12/20] chore(data): migrate import --- .../java/net/onelitefeather/cygnus/setup/data/GameData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java index d0aef71..9215960 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java @@ -21,7 +21,7 @@ import net.onelitefeather.cygnus.setup.item.SetupItems; import net.onelitefeather.cygnus.setup.map.MapDataCategory; import net.onelitefeather.cygnus.setup.util.SetupMessages; -import net.theevilreaper.aves.inventory.InventoryLayout; +import net.theevilreaper.aves.inventory.layout.InventoryLayout; import net.theevilreaper.aves.inventory.pageable.PageableInventory; import net.theevilreaper.aves.inventory.pageable.TitleData; import net.theevilreaper.aves.inventory.slot.ISlot; From 6378f9e9180ad91bc0d3bfe8ea4c972cd4480358 Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 15:07:44 +0200 Subject: [PATCH 13/20] chore(dialog): update import statement --- .../cygnus/setup/listener/data/PlayerRemoveDataListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java index 0b04b05..8c6ae4b 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java @@ -3,7 +3,7 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.entity.Player; import net.onelitefeather.cygnus.common.page.PageResource; -import net.onelitefeather.cygnus.setup.dialogs.MapDialogs; +import net.onelitefeather.cygnus.setup.dialog.MapDialogs; import net.onelitefeather.cygnus.setup.event.PlayerRemoveDataEvent; import net.onelitefeather.cygnus.setup.event.dialog.DialogContext; import net.onelitefeather.cygnus.setup.map.MapDataCategory; From 97f4f9311a5377292960a7f4eec518da9a5032ef Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 22:48:47 +0200 Subject: [PATCH 14/20] test(item): improve assertItem calls --- .../net/onelitefeather/cygnus/setup/item/SetupItemsTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup/src/test/java/net/onelitefeather/cygnus/setup/item/SetupItemsTest.java b/setup/src/test/java/net/onelitefeather/cygnus/setup/item/SetupItemsTest.java index 9ebd8df..fd686bb 100644 --- a/setup/src/test/java/net/onelitefeather/cygnus/setup/item/SetupItemsTest.java +++ b/setup/src/test/java/net/onelitefeather/cygnus/setup/item/SetupItemsTest.java @@ -48,7 +48,8 @@ void testPageItemSet(@NotNull Env env) { Player player = env.createPlayer(instance); SetupItems.setPageItems(player); - assertItem(player, 4, (byte) 0x04); + assertItem(player, 2, SetupItemId.PAGES); + assertItem(player, 4, SetupItemId.LEAVE_PAGE); env.destroyInstance(instance, true); } From e0f892fd525465ff445390cf5a45aaa4e206186a Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 22:50:10 +0200 Subject: [PATCH 15/20] chore(slot): add missing equals and hashcode --- .../cygnus/setup/inventory/slot/PageSlot.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java index 76a5f11..6835a6e 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PageSlot.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; import static net.onelitefeather.cygnus.setup.util.PositionFormat.DECIMAL_FORMAT; @@ -62,4 +63,17 @@ protected void click(Player player, int slot, Click click, ItemStack stack, Cons } } } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PageSlot pageSlot = (PageSlot) o; + return Objects.equals(pageResource, pageSlot.pageResource); + } + + @Override + public int hashCode() { + return Objects.hash(pageResource); + } } From 76eb33efbc4a5b8974aeb10e2d9b52377ec4c3f4 Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 22:53:22 +0200 Subject: [PATCH 16/20] chore(data): improve page resource handling --- .../cygnus/setup/dialog/handler/DynamicDataHandler.java | 3 ++- .../cygnus/setup/listener/PageCreationListener.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/handler/DynamicDataHandler.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/handler/DynamicDataHandler.java index 3bfedbe..6d7bd57 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/handler/DynamicDataHandler.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/handler/DynamicDataHandler.java @@ -34,7 +34,7 @@ public void handle(PlayerCustomClickEvent event, CompoundBinaryTag payload) { point = player.getSurvivorToDelete(); } if (category == MapDataCategory.PAGE) { - point = player.getPageToDelete(); + point = player.getPageToDelete() != null ? player.getPageToDelete() : (player.getPageResource() != null ? player.getPageResource().position() : null); } ((InstanceSetupData)data).handleDataContextDelete(category, point); if (category == MapDataCategory.SURVIVOR) { @@ -42,6 +42,7 @@ public void handle(PlayerCustomClickEvent event, CompoundBinaryTag payload) { } if (category == MapDataCategory.PAGE) { player.setPageToDelete(null); + player.setPageResource(null); } }); diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PageCreationListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PageCreationListener.java index 276e15d..479bbf0 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PageCreationListener.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/PageCreationListener.java @@ -55,7 +55,7 @@ public void accept(PlayerBlockBreakEvent event) { } Vec position = event.getBlockPosition().asVec(); - ((GameMapBuilder) gameData.getMapBuilder()).addPage(position, direction); + gameData.addPage(position, direction); Component component = Component.text("Created page at: ", NamedTextColor.GRAY) .append(Components.convertPoint(position).style(Style.style(NamedTextColor.GOLD))) From 876305ae362145040ff2d8ca9eac36f182af1dbf Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 22:53:39 +0200 Subject: [PATCH 17/20] chore(map): add remove page method --- .../cygnus/common/map/GameMapBuilder.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/common/src/main/java/net/onelitefeather/cygnus/common/map/GameMapBuilder.java b/common/src/main/java/net/onelitefeather/cygnus/common/map/GameMapBuilder.java index e2375a8..60c3a38 100644 --- a/common/src/main/java/net/onelitefeather/cygnus/common/map/GameMapBuilder.java +++ b/common/src/main/java/net/onelitefeather/cygnus/common/map/GameMapBuilder.java @@ -100,6 +100,16 @@ public void addPage(Vec pos, Direction face) { this.pageFaces.add(new PageResource(pos, face)); } + /** + * Removes a page from the map. + * + * @param pageResource the page resource to remove + * @return true if the page was removed + */ + public boolean removePage(PageResource pageResource) { + return this.pageFaces.remove(pageResource); + } + /** * Returns the {@link Set} of {@link PageResource} which are used for the game. * From 7eb2739bd2d069125a86a63e30e2b416a1bd4022 Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 22:55:11 +0200 Subject: [PATCH 18/20] chore(dialog): add page removal context --- .../cygnus/setup/dialog/MapDialogs.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/MapDialogs.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/MapDialogs.java index c10eae3..8a38584 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/MapDialogs.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialog/MapDialogs.java @@ -7,6 +7,8 @@ import net.minestom.server.dialog.DialogAction; import net.minestom.server.dialog.DialogAfterAction; import net.minestom.server.entity.Player; +import net.minestom.server.coordinate.Point; +import net.onelitefeather.cygnus.common.page.PageResource; import net.onelitefeather.cygnus.setup.event.dialog.DialogContext; import net.onelitefeather.cygnus.setup.map.MapDataCategory; import net.onelitefeather.cygnus.setup.util.DialogBase; @@ -27,7 +29,6 @@ public final class MapDialogs extends DialogBase { public static final Key NON_DYNAMIC_DELETE_KEY = create("non_dynamic_delete_dialog"); public static final Key DYNAMIC_DELETE_KEY = create("dynamic_delete_dialog"); - /** * Opens the dialog to allow the input of a name. * @@ -97,7 +98,11 @@ public static void openDeleteDialog(Player player, MapDataCategory mapDataCatego } public static void openDeleteDialog(Player player, MapDataCategory mapDataCategory, @Nullable DialogContext context) { - DialogContext.PositionContent positionContent = (DialogContext.PositionContent) context; + Point point = switch (context) { + case DialogContext.PositionContent(Point p) -> p; + case DialogContext.PageContent(PageResource resource) -> resource.position(); + default -> null; + }; DialogTemplate dialogTemplate = DialogType.confirm(DYNAMIC_DELETE_KEY) .meta(dialogMeta -> { dialogMeta.closeWithEscape(false); @@ -109,16 +114,18 @@ public static void openDeleteDialog(Player player, MapDataCategory mapDataCatego template.contents(Component.text("Do you want to delete the following data?"))); dialogMeta.emptyMessage(); dialogMeta.messageBody(template -> template.contents(Component.text("Category: ").append(Component.text(mapDataCategory.getName())))); - dialogMeta.emptyMessage(); - dialogMeta.messageBody(componentTemplate -> { - componentTemplate.contents(Component.text("x: ", NamedTextColor.WHITE).append(Component.text(positionContent.point().x()))); - }); - dialogMeta.messageBody(componentTemplate -> { - componentTemplate.contents(Component.text("y: ", NamedTextColor.WHITE).append(Component.text(positionContent.point().y()))); - }); - dialogMeta.messageBody(componentTemplate -> { - componentTemplate.contents(Component.text("z: ", NamedTextColor.WHITE).append(Component.text(positionContent.point().z()))); - }); + if (point != null) { + dialogMeta.emptyMessage(); + dialogMeta.messageBody(componentTemplate -> { + componentTemplate.contents(Component.text("x: ", NamedTextColor.WHITE).append(Component.text(point.x()))); + }); + dialogMeta.messageBody(componentTemplate -> { + componentTemplate.contents(Component.text("y: ", NamedTextColor.WHITE).append(Component.text(point.y()))); + }); + dialogMeta.messageBody(componentTemplate -> { + componentTemplate.contents(Component.text("z: ", NamedTextColor.WHITE).append(Component.text(point.z()))); + }); + } }) .yesButton(button -> button.width(101).label(Component.text("Save")) .action(new DialogAction.DynamicCustom(DYNAMIC_DELETE_KEY, getCategoryPayload(mapDataCategory.ordinal()))) From 00c60bfbbc05d38cc04dd775c9e4dd4504cbaa27 Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 23:00:25 +0200 Subject: [PATCH 19/20] test(data): add GameData test --- .../cygnus/setup/data/GameDataTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 setup/src/test/java/net/onelitefeather/cygnus/setup/data/GameDataTest.java diff --git a/setup/src/test/java/net/onelitefeather/cygnus/setup/data/GameDataTest.java b/setup/src/test/java/net/onelitefeather/cygnus/setup/data/GameDataTest.java new file mode 100644 index 0000000..ec10303 --- /dev/null +++ b/setup/src/test/java/net/onelitefeather/cygnus/setup/data/GameDataTest.java @@ -0,0 +1,46 @@ +package net.onelitefeather.cygnus.setup.data; + +import net.minestom.server.coordinate.Vec; +import net.minestom.server.entity.Player; +import net.minestom.server.instance.Instance; +import net.minestom.server.utils.Direction; +import net.minestom.testing.Env; +import net.minestom.testing.extension.MicrotusExtension; +import net.theevilreaper.aves.map.MapEntry; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.nio.file.Paths; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@ExtendWith(MicrotusExtension.class) +class GameDataTest { + + @Test + void testGameDataCreation(Env env) { + Instance instance = env.createFlatInstance(); + Player player = env.createPlayer(instance); + MapEntry mapEntry = MapEntry.of(Paths.get("")); + + GameData gameData = new GameData(player, mapEntry); + + assertNotNull(gameData); + + env.destroyInstance(instance, true); + } + + @Test + void testAddAndRemovePage(Env env) { + Instance instance = env.createFlatInstance(); + Player player = env.createPlayer(instance); + MapEntry mapEntry = MapEntry.of(Paths.get("")); + + GameData gameData = new GameData(player, mapEntry); + + gameData.addPage(Vec.ZERO, Direction.NORTH); + assertNotNull(gameData); + + env.destroyInstance(instance, true); + } +} From 5e4242180eb1cd86d9874cead9410eeee2fb620f Mon Sep 17 00:00:00 2001 From: Joltras Date: Mon, 3 Aug 2026 23:09:07 +0200 Subject: [PATCH 20/20] chore(data): improve inventory handling --- .../cygnus/setup/data/GameData.java | 66 +++++++++++++++++-- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java index 9215960..319609a 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/GameData.java @@ -5,8 +5,10 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; +import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Player; import net.minestom.server.instance.anvil.AnvilLoader; +import net.minestom.server.utils.Direction; import net.minestom.server.world.DimensionType; import net.minestom.server.inventory.InventoryType; import net.onelitefeather.cygnus.common.map.GameMap; @@ -20,6 +22,8 @@ import net.onelitefeather.cygnus.setup.item.SetupItemId; import net.onelitefeather.cygnus.setup.item.SetupItems; import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.onelitefeather.cygnus.common.page.PageResource; +import net.onelitefeather.cygnus.setup.player.SetupPlayer; import net.onelitefeather.cygnus.setup.util.SetupMessages; import net.theevilreaper.aves.inventory.layout.InventoryLayout; import net.theevilreaper.aves.inventory.pageable.PageableInventory; @@ -54,25 +58,56 @@ public GameData(Player player, MapEntry mapEntry) { this.inventory = new MapDataOverviewInventory(player, this.gameMapBuilder, InventoryMode.GAME); this.survivorInventory = new SurvivorViewInventory(player, this.gameMapBuilder); - this.pageInventory = PageableInventory + this.pageInventory = createPageInventory(player); + } + + /** + * Creates the [{@link PageableInventory} to display the given {@link PageResource}s. + * + * @param player who owns the inventory + * @return the created inventory + */ + private PageableInventory createPageInventory(Player player) { + InventoryLayout layout = InventoryLayout.fromType(InventoryType.CHEST_6_ROW); + layout.setItems(LayoutCalculator.fillRow(InventoryType.CHEST_1_ROW), SetupItems.DECORATION_PANE); + layout.setItems(LayoutCalculator.fillRow(InventoryType.CHEST_6_ROW), SetupItems.DECORATION_PANE); + + return PageableInventory .builder() .titleData( TitleData .builder() + .title(Component.text("Page positions - ")) .pageMapper(PageHeaderFormatter::format) .showPageNumbers(true) .build() ) .player(player) - .type(InventoryType.CHEST_6_ROW) .slotRange(LayoutCalculator.quad(InventoryType.CHEST_1_ROW.getSize(), InventoryType.CHEST_5_ROW.getSize() - 1)) - .layout(InventoryLayout.fromType(InventoryType.CHEST_6_ROW)) + .layout(layout) .values(getPageSlots()) .build(); } + /** + * Adds a new {@link PageResource} to the builder and inventory + * + * @param pos of the resource + * @param face of the resource + */ + public void addPage(Vec pos, Direction face) { + PageResource pageResource = new PageResource(pos, face); + this.gameMapBuilder.addPage(pos, face); + this.pageInventory.add(new PageSlot(pageResource)); + } + + /** + * Returns the list of slots for the given {@link PageResource}s + * + * @return the created list + */ private List getPageSlots() { - if (this.gameMapBuilder.getPageFaces().isEmpty()) return List.of(); + if (this.gameMapBuilder.getPageFaces().isEmpty()) return new ArrayList<>(); List pageSlots = new ArrayList<>(this.gameMapBuilder.getPageFaces().size()); this.gameMapBuilder.getPageFaces().forEach(pageFace -> pageSlots.add(new PageSlot(pageFace))); return pageSlots; @@ -85,6 +120,9 @@ public void swapPageMode() { this.pageMode = !this.pageMode; } + /** + * Swaps to the survivor mode. + */ public void swapSurvivorMode() { this.survivorMode = !this.survivorMode; } @@ -109,7 +147,8 @@ public void triggerUpdate(InventoryTarget target) { switch (target) { case GENERAL -> this.inventory.invalidateDataLayout(); case SURVIVOR -> this.survivorInventory.invalidateDataLayout(); - case PAGE -> this.pageInventory.open(); + case PAGE -> { + } } } @@ -227,9 +266,19 @@ public void handleDataDelete(MapDataCategory category) { */ @Override public void handleDataContextDelete(MapDataCategory category, Point point) { - if (point instanceof Pos pos) { + if (category == MapDataCategory.SURVIVOR && point instanceof Pos pos) { this.gameMapBuilder.removeSurvivorSpawn(pos); this.triggerUpdate(InventoryTarget.SURVIVOR); + } else if (category == MapDataCategory.PAGE) { + Player player = MinecraftServer.getConnectionManager().getOnlinePlayerByUuid(this.uuid); + PageResource pageResource = null; + if (player instanceof SetupPlayer setupPlayer) { + pageResource = setupPlayer.getPageResource(); + } + if (pageResource != null) { + this.gameMapBuilder.removePage(pageResource); + this.pageInventory.remove(new PageSlot(pageResource)); + } } } @@ -296,6 +345,11 @@ public boolean hasPageMode() { return pageMode; } + /** + * Returns an indication if the survivor mode is active or not. + * + * @return true for yes otherwise false + */ public boolean hasSurvivorMode() { return this.survivorMode; }