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 0a3a19fc..eca6104b 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/dialogs/MapDialogs.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java new file mode 100644 index 00000000..ec628095 --- /dev/null +++ b/setup/src/main/java/net/onelitefeather/cygnus/setup/dialogs/MapDialogs.java @@ -0,0 +1,109 @@ +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; +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.Contract; +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 name 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) { + 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) { + + } + + 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(); + } +} 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 d6500b02..70ac19cc 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 d1b13f24..7fe855d0 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/listener/dialog/DialogPayloadListener.java b/setup/src/main/java/net/onelitefeather/cygnus/setup/listener/dialog/DialogPayloadListener.java new file mode 100644 index 00000000..5dbd2dad --- /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 00000000..83d7e8f2 --- /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); + } + } + } +} 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 00000000..45f75e2a --- /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 + ; +} 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 7b810de2..221fd27d 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 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 8b964242..15364eee 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");