From 84f898dfa5c0f075c842334482d9059c0e208a85 Mon Sep 17 00:00:00 2001 From: Joltras Date: Sun, 28 Jun 2026 19:11:49 +0200 Subject: [PATCH 1/5] feat(setup): add remove event and listener for it --- .../setup/event/PlayerRemoveDataEvent.java | 46 +++++++++++++++++++ .../data/PlayerRemoveDataListener.java | 18 ++++++++ .../setup/listener/data/package-info.java | 4 ++ 3 files changed, 68 insertions(+) create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/event/PlayerRemoveDataEvent.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java create mode 100644 setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/package-info.java diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/event/PlayerRemoveDataEvent.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/PlayerRemoveDataEvent.java new file mode 100644 index 0000000..eb44864 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/event/PlayerRemoveDataEvent.java @@ -0,0 +1,46 @@ +package net.onelitefeather.cygnus.setup.event; + +import net.minestom.server.entity.Player; +import net.minestom.server.event.trait.PlayerEvent; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; + +/** + * Event will be fired during the setup when a player wants to delete data from a map. + * + * @author Joltra + * @version 1.0.0 + * @since 2.5.1 + */ +public final class PlayerRemoveDataEvent implements PlayerEvent { + + private final Player player; + private final MapDataCategory mapDataCategory; + + /** + * Creates a new instance of the event with the given values from the constructor + * + * @param player which is involved + * @param mapDataCategory which data should be deleted + */ + public PlayerRemoveDataEvent(Player player, MapDataCategory mapDataCategory) { + this.player = player; + this.mapDataCategory = mapDataCategory; + } + + /** + * {@inheritDoc} + */ + @Override + public Player getPlayer() { + return this.player; + } + + /** + * Returns the involved category. + * + * @return the given category + */ + public MapDataCategory getMapDataCategory() { + return mapDataCategory; + } +} 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 new file mode 100644 index 0000000..be0e396 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/PlayerRemoveDataListener.java @@ -0,0 +1,18 @@ +package net.onelitefeather.cygnus.setup.listener.data; + +import net.minestom.server.entity.Player; +import net.onelitefeather.cygnus.setup.dialogs.MapDialogs; +import net.onelitefeather.cygnus.setup.event.PlayerRemoveDataEvent; +import net.onelitefeather.cygnus.setup.map.MapDataCategory; + +import java.util.function.Consumer; + +public final class PlayerRemoveDataListener implements Consumer { + @Override + public void accept(PlayerRemoveDataEvent event) { + final Player player = event.getPlayer(); + final MapDataCategory category = event.getMapDataCategory(); + + MapDialogs.openDeleteDialog(player, category); + } +} diff --git a/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/package-info.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/package-info.java new file mode 100644 index 0000000..13c1f49 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/data/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package net.onelitefeather.cygnus.setup.listener.data; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file From 6e8091a86218c046373de64db5ce88310c8162ce Mon Sep 17 00:00:00 2001 From: Joltras Date: Sun, 28 Jun 2026 19:12:14 +0200 Subject: [PATCH 2/5] chore(setup): update custom event calls --- .../cygnus/setup/inventory/slot/MultiStringSlot.java | 4 ++-- .../cygnus/setup/inventory/slot/PositionSlot.java | 7 ++----- .../cygnus/setup/inventory/slot/StringSlot.java | 3 ++- 3 files changed, 6 insertions(+), 8 deletions(-) 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 b31b7df..86a6820 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 @@ -5,11 +5,11 @@ 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.PlayerRemoveDataEvent; 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.List; import java.util.function.Consumer; @@ -58,7 +58,7 @@ protected void click(Player player, int slot, Click click, ItemStack stack, Cons } if (click instanceof Click.Right) { - // EventDispatcher.call(new PlayerDeletePromptEvent(player, type)); + EventDispatcher.call(new PlayerRemoveDataEvent(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 index 886e668..83708a3 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 @@ -7,10 +7,8 @@ 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.PlayerRemoveDataEvent; import net.onelitefeather.cygnus.setup.event.PositionSetEvent; -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; @@ -78,8 +76,7 @@ protected void click(Player player, int slot, Click click, ItemStack stack, Cons } if (click instanceof Click.Right) { - EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.DELETE_SPAWN, new DialogContext.PositionContent(position))); - + EventDispatcher.call(new PlayerRemoveDataEvent(player, type)); } } } 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 index 1f35b72..04a07de 100644 --- 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 @@ -5,6 +5,7 @@ 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.PlayerRemoveDataEvent; import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; import net.onelitefeather.cygnus.setup.event.dialog.DialogTarget; import net.onelitefeather.cygnus.setup.map.MapDataCategory; @@ -49,7 +50,7 @@ protected void click(Player player, int slot, Click click, ItemStack stack, Cons } if (click instanceof Click.Right) { - EventDispatcher.call(new DialogRequestEvent(player, DialogTarget.DELETE_NAME)); + EventDispatcher.call(new PlayerRemoveDataEvent(player, type)); } } } From 77611cd870f2cecd4c4e50ea31e9c15970f7e874 Mon Sep 17 00:00:00 2001 From: Joltras Date: Sun, 28 Jun 2026 19:12:31 +0200 Subject: [PATCH 3/5] chore(setup): add data removal logic --- .../cygnus/setup/data/GameData.java | 15 +++++++++++++++ .../cygnus/setup/data/InstanceSetupData.java | 2 ++ .../cygnus/setup/data/LobbyData.java | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) 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 ca241e5..b63af59 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 @@ -155,6 +155,21 @@ public void handleItemInteraction(Player player, byte tagValue) { super.handleItemInteraction(player, tagValue); } + /** + * {@inheritDoc} + */ + @Override + public void handleDataDelete(MapDataCategory category) { + switch (category) { + case SPAWN -> gameMapBuilder.spawn(null); + case NAME -> gameMapBuilder.name(null); + case AUTHOR -> gameMapBuilder.builders(""); + case SLENDER -> gameMapBuilder.setSlenderSpawn(null); + default -> throw new IllegalArgumentException("Unknown inventory category: " + category); + } + this.triggerUpdate(InventoryTarget.GENERAL); + } + /** * {@inheritDoc} */ 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 0842913..9d657c5 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 @@ -102,6 +102,8 @@ public void handleItemInteraction(Player player, byte tagValue) { openInventory(InventoryTarget.GENERAL); } + public abstract void handleDataDelete(MapDataCategory category); + /** * Checks whether a map file is available for this setup. * 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 991b397..bc0d8ba 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 @@ -15,6 +15,7 @@ import net.theevilreaper.aves.map.MapEntry; import java.nio.file.Files; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -62,6 +63,21 @@ public void triggerUpdate(InventoryTarget target) { this.viewInventory.invalidateDataLayout(); } + + /** + * {@inheritDoc} + */ + @Override + public void handleDataDelete(MapDataCategory category) { + switch (category) { + case SPAWN -> mapBuilder.spawn(null); + case NAME -> mapBuilder.name(null); + case AUTHOR -> mapBuilder.builders(""); + default -> throw new IllegalArgumentException("Unknown inventory category: " + category); + } + this.triggerUpdate(InventoryTarget.GENERAL); + } + /** * {@inheritDoc} */ From 2e01a7fa1d823c84e0cf41ede68a73b4c950988f Mon Sep 17 00:00:00 2001 From: Joltras Date: Sun, 28 Jun 2026 19:12:55 +0200 Subject: [PATCH 4/5] chore(setup): update several parts to support data deletion --- .../cygnus/setup/dialogs/MapDialogs.java | 5 +++-- .../cygnus/setup/event/dialog/DialogTarget.java | 5 ----- .../listener/dialog/DialogPayloadListener.java | 12 ++++++++++++ .../listener/dialog/DialogRequestListener.java | 17 +---------------- .../cygnus/setup/map/MapDataCategory.java | 7 +++++++ 5 files changed, 23 insertions(+), 23 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 afcb30e..ecd2f89 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 @@ -23,6 +23,7 @@ public final class MapDialogs extends DialogBase { public static final Key MAP_KEY = create("map_name"); public static final Key AUTHOR_AMOUNT_KEY = create("author_amount_dialog"); public static final Key AUTHOR_INPUT_ENTRY_KEY = create("author_input_dialog"); + public static final Key NON_DYNAMIC_DELETE_KEY = create("non_dynamic_delete_dialog"); /** @@ -73,7 +74,7 @@ public static void openNameUpdateDialog(Player player, String name) { } public static void openDeleteDialog(Player player, MapDataCategory mapDataCategory) { - DialogTemplate dialogTemplate = DialogType.confirm(MAP_KEY) + DialogTemplate dialogTemplate = DialogType.confirm(NON_DYNAMIC_DELETE_KEY) .meta(dialogMeta -> { dialogMeta.closeWithEscape(false); dialogMeta.pause(false); @@ -86,7 +87,7 @@ public static void openDeleteDialog(Player player, MapDataCategory mapDataCatego 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()))) + .action(new DialogAction.DynamicCustom(NON_DYNAMIC_DELETE_KEY, getCategoryPayload(mapDataCategory.ordinal()))) ) .noButton(button -> button.width(101).label(NO_COMPONENT)) .build(); 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 32fe448..77555a5 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 @@ -13,9 +13,4 @@ public enum DialogTarget { CREATE_AUTHORS, AUTHOR_INPUT, UPDATE_NAME, - DELETE_NAME, - DELETE_SPAWN, - DELETE_SLENDER, - DELETE_PAGE_FACE, - DELETE_SURVIVOR_SPAWN } 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 index c9a12c1..cfaf962 100644 --- 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 @@ -13,6 +13,7 @@ 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.onelitefeather.guira.SetupDataService; import java.util.ArrayList; @@ -76,5 +77,16 @@ public void accept(PlayerCustomClickEvent event) { instanceSetupData.triggerUpdate(InstanceSetupData.InventoryTarget.GENERAL); }); } + + if (key.equals(MapDialogs.NON_DYNAMIC_DELETE_KEY)) { + IntBinaryTag idTag = (IntBinaryTag) castedPayload.get("category_id"); + if (idTag == null) return; + int categoryId = idTag.value(); + MapDataCategory category = MapDataCategory.byId(categoryId); + + dataService.get(event.getPlayer().getUuid()).ifPresent(data -> { + ((InstanceSetupData)data).handleDataDelete(category); + }); + } } } 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 index 58653fc..d4c7bf0 100644 --- 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 @@ -6,20 +6,11 @@ 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(); @@ -32,19 +23,13 @@ public void accept(DialogRequestEvent event) { 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); - } case CREATE_AUTHORS -> AuthorDialogs.openAuthorRequestDialog(player); case AUTHOR_INPUT -> { if (context == null) return; AuthorDialogs.openAuthorInput(player, ((DialogContext.AuthorAmount)context).amount()); } default -> { - MapDataCategory category = DELETE_TARGETS.get(target); - if (category == null || context == null) return; - MapDialogs.openDeleteDialog(player, category); + // Nothing to do here } } } 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 7858074..75c944d 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 @@ -60,4 +60,11 @@ public static ItemStack getDefaultItem(MapDataCategory category) { .set(SetupTags.MAP_DATA_CATEGORY_TAG, category) .build()); } + + public static MapDataCategory byId(int id) { + if (id < 0 || id >= VALUES.length) { + throw new IllegalArgumentException("Invalid map data category ID: " + id); + } + return VALUES[id]; + } } From e4d8bb36047315b99c8de343e6640eb16657e47d Mon Sep 17 00:00:00 2001 From: Joltras Date: Sun, 28 Jun 2026 19:13:11 +0200 Subject: [PATCH 5/5] chore(setup): register new listener --- .../java/net/onelitefeather/cygnus/setup/SetupExtension.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 3cedec1..41f0932 100644 --- a/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/SetupExtension.java @@ -16,6 +16,7 @@ import net.minestom.server.instance.Instance; import net.onelitefeather.cygnus.setup.event.MapSetupSaveEvent; import net.onelitefeather.cygnus.setup.event.MapSetupSelectEvent; +import net.onelitefeather.cygnus.setup.event.PlayerRemoveDataEvent; import net.onelitefeather.cygnus.setup.event.PositionSetEvent; import net.onelitefeather.cygnus.setup.event.dialog.DialogRequestEvent; import net.onelitefeather.cygnus.setup.inventory.MapSetupInventory; @@ -26,6 +27,7 @@ import net.onelitefeather.cygnus.setup.listener.PlayerSpawnListener; import net.onelitefeather.cygnus.setup.listener.SetupItemListener; import net.onelitefeather.cygnus.setup.listener.SpawnCreationListener; +import net.onelitefeather.cygnus.setup.listener.data.PlayerRemoveDataListener; import net.onelitefeather.cygnus.setup.listener.dialog.DialogPayloadListener; import net.onelitefeather.cygnus.setup.listener.dialog.DialogRequestListener; import net.onelitefeather.cygnus.setup.listener.map.MapSetupSaveListener; @@ -55,7 +57,6 @@ public SetupExtension() { private void registerSetupComponents() { var manager = MinecraftServer.getGlobalEventHandler(); - var commandManager = MinecraftServer.getCommandManager(); var spawnPos = new Pos(0, 150, 0); Supplier instanceSupplier = this.mapProvider.getActiveInstance(); @@ -84,6 +85,7 @@ private void registerSetupComponents() { manager.addListener(PlayerCustomClickEvent.class, new DialogPayloadListener(this.dataService)); manager.addListener(PositionSetEvent.class, new PositionSetListener(this.dataService)); + manager.addListener(PlayerRemoveDataEvent.class, new PlayerRemoveDataListener()); } /**