From e564d448e95302b3859cc338de28e9d85eddd8c6 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:07:54 +0200 Subject: [PATCH 01/15] feat(setup): add data overview inventory for the lobby setup --- .../view/LobbyOverviewInventory.java | 44 +++++++++++++++++++ .../setup/inventory/view/package-info.java | 4 ++ 2 files changed, 48 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java new file mode 100644 index 00000000..442c9b7c --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java @@ -0,0 +1,44 @@ +package net.onelitefeather.cygnus.setup.inventory.view; + +import net.kyori.adventure.text.Component; +import net.minestom.server.entity.Player; +import net.minestom.server.inventory.InventoryType; +import net.onelitefeather.cygnus.setup.item.SetupItems; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.InventoryLayout; +import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; +import net.theevilreaper.aves.inventory.util.LayoutCalculator; +import net.theevilreaper.aves.map.BaseMapBuilder; +import net.theevilreaper.aves.util.exception.ThrowingException; +import net.theevilreaper.aves.util.functional.ThrowingFunction; +import org.jetbrains.annotations.NotNull; + +public class LobbyOverviewInventory extends PersonalInventoryBuilder { + + private static final int[] DATA_SLOT = LayoutCalculator.from(10, 12, 14); + + public LobbyOverviewInventory(Player player, BaseMapBuilder builder) { + super(Component.text("Lobby data"), InventoryType.CHEST_3_ROW, player); + + InventoryLayout backGround = InventoryLayout.fromType(getType()); + + backGround.setItems(LayoutCalculator.quad(0, getType().getSize() - 1), SetupItems.DECORATION_PANE); + + setLayout(backGround); + + this.setDataLayoutFunction(dataLayoutFunction -> { + InventoryLayout dataLayout = dataLayoutFunction == null ? InventoryLayout.fromType(getType()) : dataLayoutFunction; + dataLayout.blank(DATA_SLOT); + + MapDataCategory[] categories = MapDataCategory.getValues(); + + for (int i = 0; i < categories.length && i < DATA_SLOT.length; i++) { + MapDataCategory currentType = categories[i]; + dataLayout.setItem(DATA_SLOT[i], getOverViewItem(currentType)); + } + return dataLayout; + }); + + register(); + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java new file mode 100644 index 00000000..62ee9177 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package net.onelitefeather.cygnus.setup.inventory.view; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file From 60148a68515fb1f1134e775a26caaa3575e929f4 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:08:05 +0200 Subject: [PATCH 02/15] chore(setup): improve setup data --- .../onelitefeather/cygnus/setup/data/GameData.java | 2 +- .../cygnus/setup/data/InstanceSetupData.java | 3 +-- .../onelitefeather/cygnus/setup/data/LobbyData.java | 13 +++++++++---- 3 files changed, 11 insertions(+), 7 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 ebc1d2f4..2631a92a 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 @@ -52,7 +52,7 @@ public void swapAreaMode() { * {@inheritDoc} */ @Override - public void openInventory(Player player) { + public void openInventory() { //player.openInventory(this.inventory.getInventory()); } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java index a288d183..3fd2366d 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java @@ -72,9 +72,8 @@ public void teleport(Player player) { /** * Opens the setup inventory for the given player. * - * @param player target player */ - public abstract void openInventory(Player player); + public abstract void openInventory(); /** * Triggers an update of the setup state and related visual feedback. diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java index 1afd89c3..6d41049d 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java @@ -5,7 +5,10 @@ import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; import net.minestom.server.instance.anvil.AnvilLoader; +import net.onelitefeather.cygnus.setup.inventory.view.LobbyOverviewInventory; import net.theevilreaper.aves.file.FileHandler; +import net.theevilreaper.aves.inventory.InventoryBuilder; +import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; import net.theevilreaper.aves.map.BaseMap; import net.theevilreaper.aves.map.BaseMapBuilder; import net.theevilreaper.aves.map.MapEntry; @@ -18,7 +21,7 @@ public final class LobbyData extends InstanceSetupData { private final FileHandler fileHandler; - private Objects viewInventory; + private PersonalInventoryBuilder viewInventory; private BaseMapBuilder mapBuilder; public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { @@ -30,16 +33,18 @@ public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { if (player == null) { throw new IllegalArgumentException("Player with UUID " + uuid + " is not online."); } + + this.viewInventory = new LobbyOverviewInventory(player, this.mapBuilder); } @Override - public void openInventory(Player player) { - //player.openInventory(this.viewInventory.getInventory()); + public void openInventory() { + this.viewInventory.open(); } @Override public void triggerUpdate() { - // this.viewInventory.invalidateDataLayout(); + this.viewInventory.invalidateDataLayout(); } @Override From 8838bd690371b2f168ab3f3a448c2af802562223 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:08:14 +0200 Subject: [PATCH 03/15] chore(setup): add DECORATION_PANE item --- .../java/net/onelitefeather/cygnus/setup/item/SetupItems.java | 2 ++ 1 file changed, 2 insertions(+) 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 99bbce95..e16e0fea 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 @@ -18,6 +18,7 @@ @SuppressWarnings("java:S3252") public final class SetupItems { + public static final ItemStack DECORATION_PANE; public static final byte ZERO_INDEX = (byte) 0x00; public static final byte FOURTH_INDEX = (byte) 0x04; @@ -26,6 +27,7 @@ public final class SetupItems { private static final HotBarLayout pageLayout; static { + DECORATION_PANE = ItemStack.builder(Material.BLACK_STAINED_GLASS_PANE).customName(Component.empty()).build(); selectionLayout = new HotBarLayout(); selectionLayout.set(FOURTH_INDEX, ItemStack.builder(Material.CHEST) .customName(Component.text("Map selection", NamedTextColor.GREEN)) From 294ae40e547adfc463108b35e9f4d2295a6e824f Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:37:16 +0200 Subject: [PATCH 04/15] feat(setup): add custom slot implementations --- .../inventory/slot/AbstractDataSlot.java | 44 +++++++++++ .../setup/inventory/slot/MultiStringSlot.java | 65 ++++++++++++++++ .../setup/inventory/slot/PositionSlot.java | 75 +++++++++++++++++++ .../setup/inventory/slot/StringSlot.java | 58 ++++++++++++++ .../setup/inventory/slot/package-info.java | 4 + 5 files changed, 246 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java new file mode 100644 index 00000000..05e31e87 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/AbstractDataSlot.java @@ -0,0 +1,44 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.minestom.server.component.DataComponents; +import net.minestom.server.entity.Player; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import net.theevilreaper.aves.inventory.slot.Slot; + +import java.util.function.Consumer; + +public abstract class AbstractDataSlot extends Slot { + + protected final MapDataCategory type; + + protected AbstractDataSlot(MapDataCategory type) { + this.type = type; + this.setClick(this::click); + } + + protected abstract void click( + Player player, + int slot, + Click clickType, + ItemStack stack, + Consumer result + ); + + /** + * Converts the given ItemStack to a builder, allowing for modifications + * without altering the original stack. + * + * @param stack the ItemStack to convert + * @return a new ItemStack.Builder with the same material and custom name + */ + protected ItemStack.Builder asBuilder(ItemStack stack) { + ItemStack.Builder builder = ItemStack.builder(stack.material()); + if (stack.has(DataComponents.CUSTOM_NAME)) { + builder.customName(stack.get(DataComponents.CUSTOM_NAME)); + } + return builder; + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java new file mode 100644 index 00000000..cdb8368f --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java @@ -0,0 +1,65 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +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.setup.event.dialog.DialogRequestEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import net.theevilreaper.bounce.setup.dialog.event.PlayerDialogRequestEvent; +import net.theevilreaper.bounce.setup.event.map.PlayerDeletePromptEvent; +import net.theevilreaper.bounce.setup.inventory.overview.OverviewType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Consumer; + +import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.NO_SPACE_SEPARATOR; +import static net.theevilreaper.bounce.setup.util.SetupMessages.DELETE_CLICK; +import static net.theevilreaper.bounce.setup.util.SetupMessages.NO_SPACE_SEPARATOR; + +public class MultiStringSlot extends AbstractDataSlot { + + private final List data; + + public MultiStringSlot(MapDataCategory category, @Nullable List data) { + super(category); + this.data = data; + } + + @Override + public ItemStack getItem() { + ItemStack overviewItem = MapDataCategory.getDefaultItem(type); + + if (data == null || data.isEmpty()) { + return overviewItem; + } + return asBuilder(overviewItem).lore( + Component.empty(), + NO_SPACE_SEPARATOR.append(Component.space()).append(Component.text(String.join(", ", data), type.getColor())), + Component.empty(), + DELETE_CLICK, + Component.empty() + ) + .build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + + if (data == null || data.isEmpty()) { +// EventDispatcher.call(new PlayerDialogRequestEvent(player, PlayerDialogRequestEvent.Target.SETUP_REQUEST_AUTHOR)); + return; + } + + if (click instanceof Click.Right) { + // EventDispatcher.call(new PlayerDeletePromptEvent(player, type)); + } + } +} 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 new file mode 100644 index 00000000..934c6942 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/PositionSlot.java @@ -0,0 +1,75 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.minestom.server.coordinate.Pos; +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.setup.event.dialog.DialogContext; +import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +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.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 Pos position; + + public PositionSlot(MapDataCategory category, @Nullable Pos position) { + super(category); + this.position = position; + } + + @Override + public ItemStack getItem() { + ItemStack overviewItem = MapDataCategory.getDefaultItem(type); + + if (position == null) { + return overviewItem; + } + List lore = new ArrayList<>(); + lore.add(Component.empty()); + lore.addAll(Components.pointToLore(MiniMessage.miniMessage(), position, DECIMAL_FORMAT)); + lore.add(Component.empty()); + lore.add(TELEPORT_CLICK); + lore.add(DELETE_CLICK); + lore.add(Component.empty()); + + return asBuilder(overviewItem).lore(lore).build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + if ((!(click instanceof Click.Left || click instanceof Click.Right)) || position == null) return; + if (click instanceof Click.Left) { + player.closeInventory(); + player.teleport(position); + return; + } + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.DELETE_SPAWN, new DialogContext.PositionContent(position))); + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java new file mode 100644 index 00000000..b4d26df1 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/StringSlot.java @@ -0,0 +1,58 @@ +package net.onelitefeather.cygnus.setup.inventory.slot; + +import net.kyori.adventure.text.Component; +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.setup.event.dialog.DialogRequestEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.theevilreaper.aves.inventory.click.ClickHolder; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; +import static net.onelitefeather.cygnus.setup.util.SetupMessages.NO_SPACE_SEPARATOR; + +public class StringSlot extends AbstractDataSlot { + + private final String data; + + public StringSlot(MapDataCategory category, @Nullable String data) { + super(category); + this.data = data; + } + + @Override + public ItemStack getItem() { + ItemStack overviewItem = MapDataCategory.getDefaultItem(type); + + if (data == null) { + return overviewItem; + } + return asBuilder(overviewItem).lore( + Component.empty(), + NO_SPACE_SEPARATOR.append(Component.space()).append(Component.text(data, type.getColor())), + Component.empty(), + DELETE_CLICK, + Component.empty() + ) + .build(); + } + + @Override + protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { + result.accept(ClickHolder.cancelClick()); + + if (data == null || data.isEmpty()) { + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.CREATE_NAME)); + return; + } + + if (click instanceof Click.Right) { + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.DELETE_NAME)); + } + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java new file mode 100644 index 00000000..5d442d68 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package net.onelitefeather.cygnus.setup.inventory.slot; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file From c92d4c298d3011a7e822fcf68dc14afb4907e99a Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:37:27 +0200 Subject: [PATCH 05/15] chore(setup): add new message constraints --- .../cygnus/setup/util/SetupMessages.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java index 134a1b2d..fce4ac4b 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupMessages.java @@ -15,12 +15,35 @@ public final class SetupMessages { public static final Component MISSING_MAP_SELECTION; public static final Component DISABLED_PAGE_MODE; - + public static final Component NO_SPACE_SEPARATOR; + public static final Component TELEPORT_CLICK; + public static final Component DELETE_CLICK; public static final Component PAGE_MODE_ENABLED; public static final Component PAGE_MODE_DISABLED; public static final Component PAGE_MODE_INFORM; static { + NO_SPACE_SEPARATOR = Component.text("ยป", NamedTextColor.GRAY); + + TELEPORT_CLICK = NO_SPACE_SEPARATOR + .append(Component.space()) + .append(Component.text("Left", NamedTextColor.GREEN)) + .append(Component.space()) + .append(Component.text("click", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("->", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("teleport", NamedTextColor.GREEN)); + + DELETE_CLICK = NO_SPACE_SEPARATOR + .append(Component.space()) + .append(Component.text("Right", NamedTextColor.RED)) + .append(Component.space()) + .append(Component.text("click", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("->", NamedTextColor.GRAY)) + .append(Component.space()) + .append(Component.text("delete", NamedTextColor.RED)); EMPTY_NAME = Messages.withPrefix(Component.text("An empty name is not allowed", NamedTextColor.RED)); MISSING_MAP_SELECTION = Messages.withPrefix( Component.text("Please select a map to setup and try the command again", NamedTextColor.RED) From b1b169bdc574106e9bb5f58670cfa63fbda80e31 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:37:51 +0200 Subject: [PATCH 06/15] chore(setup): improve data enum --- .../cygnus/setup/map/MapDataCategory.java | 63 ++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java index 45f75e2a..e8229fc9 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java @@ -1,12 +1,61 @@ package net.onelitefeather.cygnus.setup.map; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.onelitefeather.cygnus.setup.util.SetupTags; + +import java.util.EnumMap; +import java.util.Map; + public enum MapDataCategory { - NAME, - AUTHOR, - SPAWN, - SLENDER, - SURVIVOR, - PAGE - ; + NAME("Name", Material.ACACIA_SIGN, NamedTextColor.YELLOW), + AUTHOR("Builder", Material.DARK_OAK_DOOR, NamedTextColor.AQUA), + SPAWN("Spawn", Material.COMPASS, NamedTextColor.RED), + SLENDER("Slender", Material.ENDER_EYE, NamedTextColor.DARK_PURPLE), + SURVIVOR("Surivior", Material.CLOCK, NamedTextColor.GREEN), + PAGE("Page", Material.PAPER, NamedTextColor.WHITE); + + private static final MapDataCategory[] VALUES = values(); + private static final Map DEFAULT_CACHE = new EnumMap<>(MapDataCategory.class); + + private final String name; + private final Material material; + private final NamedTextColor color; + + MapDataCategory(String name, Material material, NamedTextColor color) { + this.name = name; + this.material = material; + this.color = color; + } + + public String getName() { + return name; + } + + public Material getMaterial() { + return material; + } + + public NamedTextColor getColor() { + return color; + } + + public static MapDataCategory[] getValues() { + return VALUES; + } + + /** + * Returns a default {@link ItemStack} with lore when no data is given. + * + * @param category to get the pre-cached item + * @return the cached item + */ + public static ItemStack getDefaultItem(MapDataCategory category) { + return DEFAULT_CACHE.computeIfPresent(category, (mapDataCategory, _) -> + ItemStack.builder(mapDataCategory.getMaterial()) + .set(SetupTags.MAP_DATA_CATEGORY_TAG, category) + .build()); + } } From c9c228fb400d3354755f13b3126f161ac773020b Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:38:06 +0200 Subject: [PATCH 07/15] chore(setup): add builder usage to the inventory --- .../view/LobbyOverviewInventory.java | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java index 442c9b7c..84854270 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java @@ -3,22 +3,28 @@ import net.kyori.adventure.text.Component; import net.minestom.server.entity.Player; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.inventory.click.Click; +import net.minestom.server.item.ItemStack; import net.onelitefeather.cygnus.setup.item.SetupItems; import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.onelitefeather.cygnus.setup.util.SetupTags; import net.theevilreaper.aves.inventory.InventoryLayout; import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; +import net.theevilreaper.aves.inventory.click.ClickHolder; import net.theevilreaper.aves.inventory.util.LayoutCalculator; import net.theevilreaper.aves.map.BaseMapBuilder; -import net.theevilreaper.aves.util.exception.ThrowingException; -import net.theevilreaper.aves.util.functional.ThrowingFunction; -import org.jetbrains.annotations.NotNull; + +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; public class LobbyOverviewInventory extends PersonalInventoryBuilder { private static final int[] DATA_SLOT = LayoutCalculator.from(10, 12, 14); + private final BaseMapBuilder mapBuilder; public LobbyOverviewInventory(Player player, BaseMapBuilder builder) { super(Component.text("Lobby data"), InventoryType.CHEST_3_ROW, player); + this.mapBuilder = builder; InventoryLayout backGround = InventoryLayout.fromType(getType()); @@ -34,11 +40,47 @@ public LobbyOverviewInventory(Player player, BaseMapBuilder builder) { for (int i = 0; i < categories.length && i < DATA_SLOT.length; i++) { MapDataCategory currentType = categories[i]; - dataLayout.setItem(DATA_SLOT[i], getOverViewItem(currentType)); + dataLayout.setItem(DATA_SLOT[i], getDataItem(currentType), this::handleClick); } return dataLayout; }); register(); } + + private void handleClick(Player player, int slot, Click click, ItemStack stack, Consumer consumer) { + consumer.accept(ClickHolder.cancelClick()); + + MapDataCategory category = stack.getTag(SetupTags.MAP_DATA_CATEGORY_TAG); + + if (click instanceof Click.Left) { + + } + } + + /** + * Returns the {@link ItemStack} for the given category. + * + * @param category the category to get the stack for + * @return the stack for the given category + */ + private ItemStack getDataItem(MapDataCategory category) { + return switch (category) { + case NAME -> resolveItem(category, () -> this.mapBuilder.getName().equals("Map")); + case AUTHOR -> resolveItem(category, () -> this.mapBuilder.getBuilders().isEmpty()); + case SPAWN -> resolveItem(category, () -> this.mapBuilder.getSpawn() == null); + default -> ItemStack.AIR; + }; + } + + /** + * Resolves the item for the given category based on the given condition. + * + * @param category which category to resolve + * @param condition the condition to check + * @return the item for the given category + */ + private ItemStack resolveItem(MapDataCategory category, BooleanSupplier condition) { + return condition.getAsBoolean() ? MapDataCategory.getDefaultItem(category) : ItemStack.AIR; + } } From bf77bfea242b33ec55679bcab563c0c5aa8bf779 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:42:19 +0200 Subject: [PATCH 08/15] chore(setup): update slot handling --- .../view/LobbyOverviewInventory.java | 48 +++++-------------- 1 file changed, 13 insertions(+), 35 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java index 84854270..4ef62170 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java @@ -3,18 +3,17 @@ import net.kyori.adventure.text.Component; import net.minestom.server.entity.Player; import net.minestom.server.inventory.InventoryType; -import net.minestom.server.inventory.click.Click; -import net.minestom.server.item.ItemStack; +import net.onelitefeather.cygnus.setup.inventory.slot.MultiStringSlot; +import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; +import net.onelitefeather.cygnus.setup.inventory.slot.StringSlot; import net.onelitefeather.cygnus.setup.item.SetupItems; import net.onelitefeather.cygnus.setup.map.MapDataCategory; -import net.onelitefeather.cygnus.setup.util.SetupTags; import net.theevilreaper.aves.inventory.InventoryLayout; import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; -import net.theevilreaper.aves.inventory.click.ClickHolder; +import net.theevilreaper.aves.inventory.slot.ISlot; import net.theevilreaper.aves.inventory.util.LayoutCalculator; import net.theevilreaper.aves.map.BaseMapBuilder; -import java.util.function.BooleanSupplier; import java.util.function.Consumer; public class LobbyOverviewInventory extends PersonalInventoryBuilder { @@ -40,7 +39,7 @@ public LobbyOverviewInventory(Player player, BaseMapBuilder builder) { for (int i = 0; i < categories.length && i < DATA_SLOT.length; i++) { MapDataCategory currentType = categories[i]; - dataLayout.setItem(DATA_SLOT[i], getDataItem(currentType), this::handleClick); + dataLayout.setItem(DATA_SLOT[i], getDataSlot(currentType)); } return dataLayout; }); @@ -48,39 +47,18 @@ public LobbyOverviewInventory(Player player, BaseMapBuilder builder) { register(); } - private void handleClick(Player player, int slot, Click click, ItemStack stack, Consumer consumer) { - consumer.accept(ClickHolder.cancelClick()); - - MapDataCategory category = stack.getTag(SetupTags.MAP_DATA_CATEGORY_TAG); - - if (click instanceof Click.Left) { - - } - } - /** - * Returns the {@link ItemStack} for the given category. + * Returns the slot for the given category. * - * @param category the category to get the stack for - * @return the stack for the given category + * @param category to get the slot for + * @return the slot for the given category */ - private ItemStack getDataItem(MapDataCategory category) { + private ISlot getDataSlot(MapDataCategory category) { return switch (category) { - case NAME -> resolveItem(category, () -> this.mapBuilder.getName().equals("Map")); - case AUTHOR -> resolveItem(category, () -> this.mapBuilder.getBuilders().isEmpty()); - case SPAWN -> resolveItem(category, () -> this.mapBuilder.getSpawn() == null); - default -> ItemStack.AIR; + case NAME -> new StringSlot(MapDataCategory.NAME, mapBuilder.getName()); + case AUTHOR -> new MultiStringSlot(MapDataCategory.AUTHOR, mapBuilder.getBuilders()); + case SPAWN -> new PositionSlot(MapDataCategory.SPAWN, mapBuilder.getSpawn()); + default -> throw new IllegalStateException("Unknown category: " + category); }; } - - /** - * Resolves the item for the given category based on the given condition. - * - * @param category which category to resolve - * @param condition the condition to check - * @return the item for the given category - */ - private ItemStack resolveItem(MapDataCategory category, BooleanSupplier condition) { - return condition.getAsBoolean() ? MapDataCategory.getDefaultItem(category) : ItemStack.AIR; - } } From a78c40e4d1a9faf04f1092b8c44cb4a20452bc5b Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 07:44:18 +0200 Subject: [PATCH 09/15] chore(setup): rename inventory class --- .../net/onelitefeather/cygnus/setup/data/LobbyData.java | 6 ++---- ...rviewInventory.java => GeneralMapOverviewInventory.java} | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) rename setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/{LobbyOverviewInventory.java => GeneralMapOverviewInventory.java} (93%) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java index 6d41049d..ba07311b 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java @@ -5,16 +5,14 @@ import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; import net.minestom.server.instance.anvil.AnvilLoader; -import net.onelitefeather.cygnus.setup.inventory.view.LobbyOverviewInventory; +import net.onelitefeather.cygnus.setup.inventory.view.GeneralMapOverviewInventory; import net.theevilreaper.aves.file.FileHandler; -import net.theevilreaper.aves.inventory.InventoryBuilder; import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; import net.theevilreaper.aves.map.BaseMap; import net.theevilreaper.aves.map.BaseMapBuilder; import net.theevilreaper.aves.map.MapEntry; import java.nio.file.Files; -import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -34,7 +32,7 @@ public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { throw new IllegalArgumentException("Player with UUID " + uuid + " is not online."); } - this.viewInventory = new LobbyOverviewInventory(player, this.mapBuilder); + this.viewInventory = new GeneralMapOverviewInventory(player, this.mapBuilder); } @Override diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/GeneralMapOverviewInventory.java similarity index 93% rename from setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java rename to setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/GeneralMapOverviewInventory.java index 4ef62170..906a6f9d 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/LobbyOverviewInventory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/GeneralMapOverviewInventory.java @@ -14,14 +14,12 @@ import net.theevilreaper.aves.inventory.util.LayoutCalculator; import net.theevilreaper.aves.map.BaseMapBuilder; -import java.util.function.Consumer; - -public class LobbyOverviewInventory extends PersonalInventoryBuilder { +public class GeneralMapOverviewInventory extends PersonalInventoryBuilder { private static final int[] DATA_SLOT = LayoutCalculator.from(10, 12, 14); private final BaseMapBuilder mapBuilder; - public LobbyOverviewInventory(Player player, BaseMapBuilder builder) { + public GeneralMapOverviewInventory(Player player, BaseMapBuilder builder) { super(Component.text("Lobby data"), InventoryType.CHEST_3_ROW, player); this.mapBuilder = builder; From 381dbae1ab85ca616a4da6348ad297b5bca153ad Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sat, 27 Jun 2026 10:49:50 +0200 Subject: [PATCH 10/15] feat(setup): add survivor view inventory --- .../inventory/view/SurvivorViewInventory.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java new file mode 100644 index 00000000..f6b08612 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java @@ -0,0 +1,30 @@ +package net.onelitefeather.cygnus.setup.inventory.view; + +import net.kyori.adventure.text.Component; +import net.minestom.server.entity.Player; +import net.minestom.server.inventory.InventoryType; +import net.onelitefeather.cygnus.common.map.GameMapBuilder; +import net.onelitefeather.cygnus.setup.item.SetupItems; +import net.theevilreaper.aves.inventory.InventoryLayout; +import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; +import net.theevilreaper.aves.inventory.util.LayoutCalculator; + +public class SurvivorViewInventory extends PersonalInventoryBuilder { + + /** + * Creates a new instance from the {@link PersonalInventoryBuilder} with the given values. + * + * @param player The player who owns the inventory + */ + public SurvivorViewInventory(Player player, GameMapBuilder gameMapBuilder) { + super(Component.text("Survivor positions"), InventoryType.CHEST_6_ROW, player); + + InventoryLayout layout = InventoryLayout.fromType(getType()); + layout.setItems(LayoutCalculator.fillRow(InventoryType.CHEST_1_ROW), SetupItems.DECORATION_PANE); + layout.setItems(LayoutCalculator.fillRow(getType()), SetupItems.DECORATION_PANE); + + setLayout(layout); + + register(); + } +} From d102d63ba244c4627f029e2edd43a0c0850ad836 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sun, 28 Jun 2026 11:42:30 +0200 Subject: [PATCH 11/15] chore(setup): add inventory layout --- .../inventory/view/SurvivorViewInventory.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java index f6b08612..09b51fa9 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java @@ -1,23 +1,36 @@ package net.onelitefeather.cygnus.setup.inventory.view; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Player; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; import net.onelitefeather.cygnus.common.map.GameMapBuilder; +import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; import net.onelitefeather.cygnus.setup.item.SetupItems; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; import net.theevilreaper.aves.inventory.InventoryLayout; import net.theevilreaper.aves.inventory.PersonalInventoryBuilder; import net.theevilreaper.aves.inventory.util.LayoutCalculator; +import java.util.Iterator; + public class SurvivorViewInventory extends PersonalInventoryBuilder { + private static final int[] SLOTS = LayoutCalculator.quad(InventoryType.CHEST_1_ROW.getSize() + 1, InventoryType.CHEST_5_ROW.getSize()); + private final GameMapBuilder mapBuilder; + /** * Creates a new instance from the {@link PersonalInventoryBuilder} with the given values. * * @param player The player who owns the inventory */ - public SurvivorViewInventory(Player player, GameMapBuilder gameMapBuilder) { + public SurvivorViewInventory(Player player, GameMapBuilder mapBuilder) { super(Component.text("Survivor positions"), InventoryType.CHEST_6_ROW, player); + this.mapBuilder = mapBuilder; InventoryLayout layout = InventoryLayout.fromType(getType()); layout.setItems(LayoutCalculator.fillRow(InventoryType.CHEST_1_ROW), SetupItems.DECORATION_PANE); @@ -25,6 +38,20 @@ public SurvivorViewInventory(Player player, GameMapBuilder gameMapBuilder) { setLayout(layout); + this.setDataLayoutFunction(dataLayout -> { + dataLayout = dataLayout != null ? dataLayout : InventoryLayout.fromType(getType()); + + if (this.mapBuilder.getSurvivorSpawns().isEmpty()) return dataLayout; + + Iterator iterator = mapBuilder.getSurvivorSpawns().iterator(); + + for (int i = 0; i < SLOTS.length && iterator.hasNext(); i++) { + Pos pos = iterator.next(); + dataLayout.setItem(SLOTS[i], new PositionSlot(MapDataCategory.SPAWN, pos)); + } + return dataLayout; + }); + register(); } } From 70e3f9ae38eef7d7e7aee3b96fb72849dd783053 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sun, 28 Jun 2026 11:42:38 +0200 Subject: [PATCH 12/15] chore(setup): improve null handling --- .../cygnus/setup/inventory/slot/PositionSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 934c6942..e6700ee8 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 @@ -36,7 +36,7 @@ public class PositionSlot extends AbstractDataSlot { DECIMAL_FORMAT.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ROOT)); } - private final Pos position; + private final @Nullable Pos position; public PositionSlot(MapDataCategory category, @Nullable Pos position) { super(category); From feb888877fcc54ac1e33b4b56f43c2c22a6dd087 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sun, 28 Jun 2026 11:43:02 +0200 Subject: [PATCH 13/15] chore(setup): remove unused imports --- .../cygnus/setup/inventory/view/SurvivorViewInventory.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java index 09b51fa9..04b1a9cd 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/view/SurvivorViewInventory.java @@ -1,13 +1,9 @@ package net.onelitefeather.cygnus.setup.inventory.view; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import net.minestom.server.coordinate.Pos; -import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Player; import net.minestom.server.inventory.InventoryType; -import net.minestom.server.item.ItemStack; -import net.minestom.server.item.Material; import net.onelitefeather.cygnus.common.map.GameMapBuilder; import net.onelitefeather.cygnus.setup.inventory.slot.PositionSlot; import net.onelitefeather.cygnus.setup.item.SetupItems; From 5019eade51f2c9e765a7aaa505660b3c90888e72 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sun, 28 Jun 2026 11:49:05 +0200 Subject: [PATCH 14/15] chore(setup): improve inventory handling --- .../cygnus/setup/data/GameData.java | 31 +++++++++++++++---- .../cygnus/setup/data/InstanceSetupData.java | 12 +++++-- .../cygnus/setup/data/LobbyData.java | 10 +++--- 3 files changed, 39 insertions(+), 14 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 2631a92a..1c8c4bab 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 @@ -8,6 +8,8 @@ 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.view.GeneralMapOverviewInventory; +import net.onelitefeather.cygnus.setup.inventory.view.SurvivorViewInventory; import net.theevilreaper.aves.file.FileHandler; import net.theevilreaper.aves.map.BaseMapBuilder; import net.theevilreaper.aves.map.MapEntry; @@ -19,8 +21,8 @@ public class GameData extends InstanceSetupData { private final FileHandler fileHandler; - //TODO: Implement inventory - private Object inventory; + private final GeneralMapOverviewInventory inventory; + private final SurvivorViewInventory survivorInventory; private GameMapBuilder gameMapBuilder; private boolean areaMode; @@ -39,6 +41,9 @@ public GameData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { if (player == null) { throw new IllegalArgumentException("Player with UUID " + uuid + " is not online."); } + + this.inventory = new GeneralMapOverviewInventory(player, this.gameMapBuilder); + this.survivorInventory = new SurvivorViewInventory(player, this.gameMapBuilder); } /** @@ -52,16 +57,28 @@ public void swapAreaMode() { * {@inheritDoc} */ @Override - public void openInventory() { - //player.openInventory(this.inventory.getInventory()); + public void openInventory(InventoryTarget target) { + switch (target) { + case GENERAL -> this.inventory.open(); + case SURVIVOR -> this.survivorInventory.open(); + case PAGE -> { + + } + } } /** * {@inheritDoc} */ @Override - public void triggerUpdate() { - // this.inventory.invalidateDataLayout(); + public void triggerUpdate(InventoryTarget target) { + switch (target) { + case GENERAL -> this.inventory.invalidateDataLayout(); + case SURVIVOR -> this.survivorInventory.invalidateDataLayout(); + case PAGE -> { + // Nothing to do here + } + } } /** @@ -90,6 +107,8 @@ public void teleport(Player player) { @Override public void reset() { super.reset(); + this.survivorInventory.unregister(); + this.inventory.unregister(); // this.inventory.unregister(); } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java index 3fd2366d..29529643 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/InstanceSetupData.java @@ -73,12 +73,12 @@ public void teleport(Player player) { * Opens the setup inventory for the given player. * */ - public abstract void openInventory(); + public abstract void openInventory(InventoryTarget target); /** * Triggers an update of the setup state and related visual feedback. */ - public abstract void triggerUpdate(); + public abstract void triggerUpdate(InventoryTarget target); /** * Checks whether a map file is available for this setup. @@ -114,4 +114,12 @@ public UUID getId() { * @return associated map builder */ public abstract BaseMapBuilder getMapBuilder(); + + public enum InventoryTarget { + + GENERAL, + SURVIVOR, + PAGE + + } } \ No newline at end of file diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java index ba07311b..1e20fcdc 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/data/LobbyData.java @@ -19,7 +19,7 @@ public final class LobbyData extends InstanceSetupData { private final FileHandler fileHandler; - private PersonalInventoryBuilder viewInventory; + private final PersonalInventoryBuilder viewInventory; private BaseMapBuilder mapBuilder; public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { @@ -36,12 +36,12 @@ public LobbyData(UUID uuid, MapEntry mapEntry, FileHandler fileHandler) { } @Override - public void openInventory() { + public void openInventory(InventoryTarget target) { this.viewInventory.open(); } @Override - public void triggerUpdate() { + public void triggerUpdate(InventoryTarget target) { this.viewInventory.invalidateDataLayout(); } @@ -65,7 +65,7 @@ public void teleport(Player player) { @Override public void reset() { super.reset(); - //this.viewInventory.unregister(); + this.viewInventory.unregister(); } @Override @@ -80,8 +80,6 @@ public void loadData() { }, () -> this.mapBuilder = BaseMap.builder()); } - //this.viewInventory = new LobbyViewInventory(this.mapBuilder); - this.instance = MinecraftServer.getInstanceManager().createInstanceContainer(); AnvilLoader anvilLoader = new AnvilLoader(this.mapEntry.getDirectoryRoot()); this.instance.setChunkLoader(anvilLoader); From 1d354333fb16d250dd773149a035af0e29d535a8 Mon Sep 17 00:00:00 2001 From: theEvilReaper Date: Sun, 28 Jun 2026 11:57:08 +0200 Subject: [PATCH 15/15] chore(setup): improve multi-string slot handling --- .../cygnus/setup/event/dialog/DialogTarget.java | 2 +- .../setup/inventory/slot/MultiStringSlot.java | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java index 7fe855d0..0e41ac28 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/dialog/DialogTarget.java @@ -10,9 +10,9 @@ public enum DialogTarget { CREATE_NAME, + CREATE_AUTHORS, UPDATE_NAME, DELETE_NAME, - CREATE_SPAWN, DELETE_SPAWN, DELETE_SLENDER, DELETE_PAGE_FACE, diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java index cdb8368f..b31b7df7 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/inventory/slot/MultiStringSlot.java @@ -9,10 +9,6 @@ import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; import net.onelitefeather.cygnus.setup.map.MapDataCategory; import net.theevilreaper.aves.inventory.click.ClickHolder; -import net.theevilreaper.bounce.setup.dialog.event.PlayerDialogRequestEvent; -import net.theevilreaper.bounce.setup.event.map.PlayerDeletePromptEvent; -import net.theevilreaper.bounce.setup.inventory.overview.OverviewType; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -20,18 +16,21 @@ import static net.onelitefeather.cygnus.setup.util.SetupMessages.DELETE_CLICK; import static net.onelitefeather.cygnus.setup.util.SetupMessages.NO_SPACE_SEPARATOR; -import static net.theevilreaper.bounce.setup.util.SetupMessages.DELETE_CLICK; -import static net.theevilreaper.bounce.setup.util.SetupMessages.NO_SPACE_SEPARATOR; public class MultiStringSlot extends AbstractDataSlot { private final List data; - public MultiStringSlot(MapDataCategory category, @Nullable List data) { + public MultiStringSlot(MapDataCategory category, List data) { super(category); this.data = data; } + public MultiStringSlot(MapDataCategory category) { + super(category); + this.data = List.of(); + } + @Override public ItemStack getItem() { ItemStack overviewItem = MapDataCategory.getDefaultItem(type); @@ -53,8 +52,8 @@ public ItemStack getItem() { protected void click(Player player, int slot, Click click, ItemStack stack, Consumer result) { result.accept(ClickHolder.cancelClick()); - if (data == null || data.isEmpty()) { -// EventDispatcher.call(new PlayerDialogRequestEvent(player, PlayerDialogRequestEvent.Target.SETUP_REQUEST_AUTHOR)); + if (data.isEmpty()) { + EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.CREATE_AUTHORS)); return; }