From a9ed9782f5dc074ad1f7da7b3261b006e2656ac7 Mon Sep 17 00:00:00 2001 From: Joltras Date: Fri, 26 Jun 2026 18:00:56 +0200 Subject: [PATCH 1/6] feat(setup): add dialog listener --- .../dialog/DialogPayloadListener.java | 42 +++++++++++++++++ .../dialog/DialogRequestListener.java | 45 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogPayloadListener.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogRequestListener.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogPayloadListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogPayloadListener.java new file mode 100644 index 0000000..5dbd2da --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogPayloadListener.java @@ -0,0 +1,42 @@ +package net.onelitefeather.cygnus.setup.listener.dialog; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.nbt.BinaryTag; +import net.kyori.adventure.nbt.CompoundBinaryTag; +import net.kyori.adventure.nbt.StringBinaryTag; +import net.minestom.server.event.player.PlayerCustomClickEvent; +import net.onelitefeather.cygnus.setup.dialogs.MapDialogs; +import net.onelitefeather.cygnus.setup.util.SetupData; + +import java.util.function.Consumer; + +public class DialogPayloadListener implements Consumer { + + private final SetupData setupData; + + public DialogPayloadListener(SetupData setupData) { + this.setupData = setupData; + } + + @Override + public void accept(PlayerCustomClickEvent event) { + Key key = event.getKey(); + BinaryTag payload = event.getPayload(); + + if (payload == null) return; + + CompoundBinaryTag castedPayload = (CompoundBinaryTag) payload; + + if (key.equals(MapDialogs.MAP_KEY)) { + StringBinaryTag nameBinary = (StringBinaryTag) castedPayload.get("name"); + String nameEntry = nameBinary.value(); + + if (nameEntry.trim().isBlank()) { + return; + } + + + this.setupData.getBaseMapBuilder().name(nameEntry); + } + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogRequestListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogRequestListener.java new file mode 100644 index 0000000..83d7e8f --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogRequestListener.java @@ -0,0 +1,45 @@ +package net.onelitefeather.cygnus.setup.listener.dialog; + +import net.minestom.server.entity.Player; +import net.onelitefeather.cygnus.setup.dialogs.MapDialogs; +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 java.util.Map; +import java.util.function.Consumer; + +public class DialogRequestListener implements Consumer { + + private static final Map DELETE_TARGETS = Map.of( + DialogTarget.DELETE_SPAWN, MapDataCategory.SPAWN, + DialogTarget.DELETE_SURVIVOR_SPAWN, MapDataCategory.SURVIVOR, + DialogTarget.DELETE_SLENDER, MapDataCategory.SLENDER, + DialogTarget.DELETE_NAME, MapDataCategory.NAME + ); + + @Override + public void accept(DialogRequestEvent event) { + DialogTarget target = event.getTarget(); + Player player = event.getPlayer(); + DialogContext context = event.getContext(); + + switch (target) { + case CREATE_NAME -> MapDialogs.openNameCreateDialog(player); + case UPDATE_NAME -> { + if (context == null) return; + MapDialogs.openNameUpdateDialog(player, ((DialogContext.NameContext) context).name()); + } + case DELETE_PAGE_FACE -> { + if (context == null) return; + MapDialogs.openDeleteDialog(player, MapDataCategory.PAGE, context); + } + default -> { + MapDataCategory category = DELETE_TARGETS.get(target); + if (category == null || context == null) return; + MapDialogs.openDeleteDialog(player, category); + } + } + } +} From 01d2ccdb817a8ee05e6c8bd5f5e8acde02443b8e Mon Sep 17 00:00:00 2001 From: Joltras Date: Fri, 26 Jun 2026 18:01:11 +0200 Subject: [PATCH 2/6] chore(setup): improve dialog base classes --- .../cygnus/setup/event/dialog/DialogContext.java | 14 +++++++++++++- .../cygnus/setup/event/dialog/DialogTarget.java | 2 +- .../cygnus/setup/util/DialogBase.java | 10 ++++++++++ 3 files changed, 24 insertions(+), 2 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 d6500b0..70ac19c 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,5 +1,7 @@ package net.onelitefeather.cygnus.setup.event.dialog; +import net.minestom.server.coordinate.Point; + /** * Represents the context for a dialog event which contains all necessary data * to open the correct dialog for a specific {@link DialogTarget}. @@ -10,7 +12,8 @@ * @since 0.1.0 */ public sealed interface DialogContext permits - DialogContext.NameContext { + DialogContext.NameContext, + DialogContext.PositionContent { /** * Specific context for the update or deletion of a name. @@ -20,4 +23,13 @@ public sealed interface DialogContext permits record NameContext(String name) implements DialogContext { } + + /** + * Specific context to delete a position from the map. + * + * @param point to which should be deleted + */ + record PositionContent(Point point) implements DialogContext { + + } } 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 d1b13f2..7fe855d 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 @@ -9,12 +9,12 @@ */ public enum DialogTarget { - CREATE_NAME, UPDATE_NAME, DELETE_NAME, CREATE_SPAWN, DELETE_SPAWN, + DELETE_SLENDER, DELETE_PAGE_FACE, DELETE_SURVIVOR_SPAWN } diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/DialogBase.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/DialogBase.java index 7b810de..221fd27 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/DialogBase.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/DialogBase.java @@ -1,5 +1,6 @@ package net.onelitefeather.cygnus.setup.util; +import net.kyori.adventure.key.Key; import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.text.Component; import org.jetbrains.annotations.Contract; @@ -8,6 +9,15 @@ public abstract class DialogBase { protected static final Component NO_COMPONENT = Component.text("No"); + /** + * Creates a new instance of a {@link Key}. + * + * @param value the value of the key + * @return the created instance + */ + protected static Key create(String value) { + return Key.key("cygnus", value); + } /** * Creates a new {@link CompoundBinaryTag} with no data for the dialog From dc428bc0bcdec77e2b063a6c8fdb152d78076959 Mon Sep 17 00:00:00 2001 From: Joltras Date: Fri, 26 Jun 2026 18:01:23 +0200 Subject: [PATCH 3/6] chore(setup): add new listener and tag --- .../net/onelitefeather/cygnus/setup/SetupExtension.java | 8 ++++++++ .../net/onelitefeather/cygnus/setup/util/SetupTags.java | 3 +++ 2 files changed, 11 insertions(+) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java index 0a3a19f..eca6104 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java @@ -7,6 +7,7 @@ import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; import net.minestom.server.event.player.PlayerBlockBreakEvent; +import net.minestom.server.event.player.PlayerCustomClickEvent; import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.event.player.PlayerUseItemEvent; import net.onelitefeather.cygnus.common.ListenerHandling; @@ -14,6 +15,7 @@ import net.onelitefeather.cygnus.setup.command.SetupCommand; import net.onelitefeather.cygnus.setup.event.MapSetupSaveEvent; import net.onelitefeather.cygnus.setup.event.MapSetupSelectEvent; +import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; import net.onelitefeather.cygnus.setup.inventory.MapSetupInventory; import net.onelitefeather.cygnus.setup.listener.InstanceAddListener; import net.onelitefeather.cygnus.setup.listener.InstanceRemoveListener; @@ -21,6 +23,8 @@ import net.onelitefeather.cygnus.setup.listener.PageCreationListener; import net.onelitefeather.cygnus.setup.listener.PlayerSpawnListener; import net.onelitefeather.cygnus.setup.listener.SetupItemListener; +import net.onelitefeather.cygnus.setup.listener.dialog.DialogPayloadListener; +import net.onelitefeather.cygnus.setup.listener.dialog.DialogRequestListener; import net.onelitefeather.cygnus.setup.listener.map.MapSetupSaveListener; import net.onelitefeather.cygnus.setup.map.SetupMapProvider; import net.onelitefeather.cygnus.setup.util.SetupData; @@ -68,6 +72,10 @@ private void registerSetupComponents() { manager.addListener(AddEntityToInstanceEvent.class, new InstanceAddListener(instanceUUID)); manager.addListener(RemoveEntityFromInstanceEvent.class, new InstanceRemoveListener(instanceUUID)); registerCancelListener(manager); + + //Dialog listener + manager.addListener(DialogRequestEvent.class, new DialogRequestListener()); + manager.addListener(PlayerCustomClickEvent.class, new DialogPayloadListener(setupData)); } /** diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupTags.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupTags.java index 8b96424..15364ee 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupTags.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/util/SetupTags.java @@ -1,6 +1,7 @@ package net.onelitefeather.cygnus.setup.util; import net.minestom.server.tag.Tag; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; /** * The {@link SetupTags} class is a utility class that contains all the tags used by the setup system. @@ -12,6 +13,8 @@ public final class SetupTags { public static final Tag SETUP_ID_TAG = Tag.Integer("setup_id").defaultValue(-1); + public static final Tag MAP_DATA_CATEGORY_TAG = Tag.String("category_tag") + .map(MapDataCategory::valueOf, MapDataCategory::name); private SetupTags() { throw new UnsupportedOperationException("This class cannot be instantiated"); From 9ffeb3d10c9e6c4530876927950576707a5f4137 Mon Sep 17 00:00:00 2001 From: Joltras Date: Fri, 26 Jun 2026 18:01:36 +0200 Subject: [PATCH 4/6] feat(setup): add dialog class --- .../cygnus/setup/dialogs/MapDialogs.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java new file mode 100644 index 0000000..f452279 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java @@ -0,0 +1,79 @@ +package net.onelitefeather.cygnus.setup.dialogs; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.minestom.server.dialog.DialogAction; +import net.minestom.server.dialog.DialogAfterAction; +import net.minestom.server.entity.Player; +import net.onelitefeather.cygnus.setup.event.dialog.DialogContext; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; +import net.onelitefeather.cygnus.setup.util.DialogBase; +import net.onelitefeather.pica.dialog.DialogTemplate; +import net.onelitefeather.pica.dialog.type.DialogType; +import org.jetbrains.annotations.Nullable; + +/** + * + */ +public final class MapDialogs extends DialogBase { + + public static final Key MAP_KEY = create("map_name"); + + /** + * Opens the dialog to allow the input of a name. + * + * @param player who should see the dialog + */ + public static void openNameCreateDialog(Player player) { + DialogTemplate dialogTemplate = DialogType.confirm(MAP_KEY) + .meta(dialogMeta -> { + dialogMeta.closeWithEscape(false); + dialogMeta.pause(false); + dialogMeta.afterAction(DialogAfterAction.CLOSE); + dialogMeta.title(Component.text("Map setup")); + dialogMeta.emptyMessage(); + dialogMeta.messageBody(template -> + template.contents(Component.text("Enter the name of the map"))); + dialogMeta.text("name", textInputTemplate -> + textInputTemplate.maxLength(100).initial("")); + }) + .yesButton(button -> button.width(101).label(Component.text("Save")) + .action(new DialogAction.DynamicCustom(MAP_KEY, getEmptyPayload())) + ) + .noButton(button -> button.width(101).label(NO_COMPONENT)) + .build(); + dialogTemplate.open(player); + } + + public static void openNameUpdateDialog(Player player, String name) { + DialogTemplate dialogTemplate = DialogType.confirm(MAP_KEY) + .meta(dialogMeta -> { + dialogMeta.closeWithEscape(false); + dialogMeta.pause(false); + dialogMeta.afterAction(DialogAfterAction.CLOSE); + dialogMeta.title(Component.text("Map setup")); + dialogMeta.emptyMessage(); + dialogMeta.messageBody(template -> + template.contents(Component.text("Update namer of the map"))); + dialogMeta.text("name", textInputTemplate -> + textInputTemplate.maxLength(100).initial(name)); + }) + .yesButton(button -> button.width(101).label(Component.text("Save")) + .action(new DialogAction.DynamicCustom(MAP_KEY, getEmptyPayload())) + ) + .noButton(button -> button.width(101).label(NO_COMPONENT)) + .build(); + dialogTemplate.open(player); + } + + public static void openDeleteDialog(Player player, MapDataCategory mapDataCategory) { + + } + + public static void openDeleteDialog(Player player, MapDataCategory mapDataCategory, @Nullable DialogContext context) { + + } + + private MapDialogs() { + } +} From 3a7e3a7f87a68707318f1579cbbdac83758c05aa Mon Sep 17 00:00:00 2001 From: Joltras Date: Fri, 26 Jun 2026 18:01:51 +0200 Subject: [PATCH 5/6] feat(setup): add category enumeration --- .../cygnus/setup/map/MapDataCategory.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java 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 new file mode 100644 index 0000000..45f75e2 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/map/MapDataCategory.java @@ -0,0 +1,12 @@ +package net.onelitefeather.cygnus.setup.map; + +public enum MapDataCategory { + + NAME, + AUTHOR, + SPAWN, + SLENDER, + SURVIVOR, + PAGE + ; +} From f98395f54034e046214fbaa0d7ff08168bb80bfc Mon Sep 17 00:00:00 2001 From: Joltras Date: Fri, 26 Jun 2026 18:04:43 +0200 Subject: [PATCH 6/6] chore(setup): implement generic delete dialog --- .../cygnus/setup/dialogs/MapDialogs.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java index f452279..ec62809 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java @@ -1,6 +1,7 @@ package net.onelitefeather.cygnus.setup.dialogs; import net.kyori.adventure.key.Key; +import net.kyori.adventure.nbt.CompoundBinaryTag; import net.kyori.adventure.text.Component; import net.minestom.server.dialog.DialogAction; import net.minestom.server.dialog.DialogAfterAction; @@ -10,6 +11,7 @@ import net.onelitefeather.cygnus.setup.util.DialogBase; import net.onelitefeather.pica.dialog.DialogTemplate; import net.onelitefeather.pica.dialog.type.DialogType; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; /** @@ -54,7 +56,7 @@ public static void openNameUpdateDialog(Player player, String name) { dialogMeta.title(Component.text("Map setup")); dialogMeta.emptyMessage(); dialogMeta.messageBody(template -> - template.contents(Component.text("Update namer of the map"))); + template.contents(Component.text("Update name of the map"))); dialogMeta.text("name", textInputTemplate -> textInputTemplate.maxLength(100).initial(name)); }) @@ -67,7 +69,24 @@ public static void openNameUpdateDialog(Player player, String name) { } public static void openDeleteDialog(Player player, MapDataCategory mapDataCategory) { - + DialogTemplate dialogTemplate = DialogType.confirm(MAP_KEY) + .meta(dialogMeta -> { + dialogMeta.closeWithEscape(false); + dialogMeta.pause(false); + dialogMeta.afterAction(DialogAfterAction.CLOSE); + dialogMeta.title(Component.text("Map setup")); + dialogMeta.emptyMessage(); + dialogMeta.messageBody(template -> + template.contents(Component.text("Do you want to delete the following map data?"))); + dialogMeta.emptyMessage(); + dialogMeta.messageBody(template -> template.contents(Component.text(mapDataCategory.name()))); + }) + .yesButton(button -> button.width(101).label(Component.text("Save")) + .action(new DialogAction.DynamicCustom(MAP_KEY, getCategoryPayload(mapDataCategory.ordinal()))) + ) + .noButton(button -> button.width(101).label(NO_COMPONENT)) + .build(); + dialogTemplate.open(player); } public static void openDeleteDialog(Player player, MapDataCategory mapDataCategory, @Nullable DialogContext context) { @@ -76,4 +95,15 @@ public static void openDeleteDialog(Player player, MapDataCategory mapDataCatego private MapDialogs() { } + + /** + * Returns a payload that contains the id of the frame to update. + * + * @param id the id of the frame + * @return a payload + */ + @Contract(pure = true) + private static CompoundBinaryTag getCategoryPayload(int id) { + return CompoundBinaryTag.builder().putInt("category_id", id).build(); + } }