From f5696d6078f48cd097aed0e7c9de778036aa3dd3 Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Wed, 12 Mar 2025 21:16:34 +0700 Subject: [PATCH] feat: added action `dialog` --- .../msb3/api/boot/DefaultBootstrap.java | 8 ++--- .../msb3/api/boot/ServerBootstrap.java | 2 ++ .../dragonestia/msb3/api/dialog/Dialog.java | 9 +++--- .../msb3/api/dialog/DialogButton.java | 2 +- .../msb3/api/dialog/DialogRegistry.java | 13 -------- .../action/DialogDialogActionHandler.java | 32 +++++++++++++++++++ .../dragonestia/msb3/api/util/MapBuilder.java | 18 +++++++++++ 7 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogDialogActionHandler.java create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/util/MapBuilder.java diff --git a/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java b/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java index 76b49ee..48477a2 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/boot/DefaultBootstrap.java @@ -7,15 +7,11 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.event.player.PlayerChatEvent; import ru.dragonestia.msb3.api.dialog.Dialog; import ru.dragonestia.msb3.api.dialog.DialogButton; -import ru.dragonestia.msb3.api.dialog.DialogCondition; -import ru.dragonestia.msb3.api.dialog.DialogRegistry; import ru.dragonestia.msb3.api.module.FlatWorldModule; import ru.dragonestia.msb3.api.module.MotdModule; import ru.dragonestia.msb3.api.module.PrometheusMetricsModule; import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule; -import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber; -import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer; -import ru.dragonestia.msb3.api.ui.dialogue.DialogueTheme; +import ru.dragonestia.msb3.api.util.MapBuilder; import team.unnamed.creative.ResourcePack; import java.net.InetSocketAddress; @@ -75,7 +71,7 @@ public class DefaultBootstrap extends ServerInitializer { dialog.setRememberId(true); var buttons = new ArrayList(); - buttons.add(new DialogButton(null, "Какая-то кнопочка", null, new HashMap<>(), new ArrayList<>())); + buttons.add(new DialogButton(null, "Переход к диалогу следующему", "dialog", new MapBuilder().add("dialogId", "msb3:test_dialog_2").build(), new ArrayList<>())); buttons.add(new DialogButton(Key.key("msb3", "test_button"), "2 Какая-то кнопочка", "aboba", new HashMap<>(), new ArrayList<>())); buttons.add(new DialogButton(null, "Третья", "close", new HashMap<>(), new ArrayList<>())); dialog.setButtons(buttons); diff --git a/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java b/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java index de92c1f..72220be 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/boot/ServerBootstrap.java @@ -10,6 +10,7 @@ import net.minestom.server.event.player.PlayerDisconnectEvent; import net.minestom.server.event.player.PlayerSpawnEvent; import ru.dragonestia.msb3.api.dialog.DialogRegistry; import ru.dragonestia.msb3.api.dialog.action.CloseDialogActionHandler; +import ru.dragonestia.msb3.api.dialog.action.DialogDialogActionHandler; import ru.dragonestia.msb3.api.dialog.condition.AlwaysDialogConditionHandler; import ru.dragonestia.msb3.api.dialog.condition.NeverDialogConditionHandler; import ru.dragonestia.msb3.api.entity.PickableItem; @@ -197,6 +198,7 @@ public final class ServerBootstrap { private void initDefaultDialogActionsAndConditions() { DialogRegistry.registerActionHandler("close", new CloseDialogActionHandler()); + DialogRegistry.registerActionHandler("dialog", new DialogDialogActionHandler()); DialogRegistry.registerConditionHandler("always", new AlwaysDialogConditionHandler()); DialogRegistry.registerConditionHandler("never", new NeverDialogConditionHandler()); diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/Dialog.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/Dialog.java index c485db6..c83b861 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/Dialog.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/Dialog.java @@ -26,8 +26,6 @@ import java.util.List; @NoArgsConstructor public class Dialog { - private final static DialogueTheme DEFAULT_THEME = DialogueTheme.builder().build(); - private Key id; private String text; private boolean rememberId; @@ -41,7 +39,7 @@ public class Dialog { DebugMessage.send(player, "Идентификатор диалога %s был сохранен в список просмотренных диалогов".formatted(id.asString())); } - DialogueTheme theme = DEFAULT_THEME; + DialogueTheme theme = DialogueTheme.builder().build(); if (themeId != null) { var themeOpt = TalksThemes.getDialogueTheme(themeId); if (themeOpt.isPresent()) { @@ -66,10 +64,11 @@ public class Dialog { button.onClick(click); }); } + renderer.rerender(); } - public void open(Player player) { - var renderer = new DialogueRenderer(player, DEFAULT_THEME); + public synchronized void open(Player player) { + var renderer = DialogueRenderer.getRenderer(player).orElseGet(() -> new DialogueRenderer(player, DialogueTheme.builder().build())); switchDialog(player, renderer); renderer.show(); } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogButton.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogButton.java index f13683c..b47dc51 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogButton.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogButton.java @@ -53,8 +53,8 @@ public class DialogButton { boolean success; try { - action.get().handle(click, params); DebugMessage.send(player, "Выполнение действия диалога actionId=%s params=%s".formatted(actionId, params)); + action.get().handle(click, params); success = true; } catch (Exception ex) { diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogRegistry.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogRegistry.java index 49a25ca..c1ae0d2 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogRegistry.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogRegistry.java @@ -5,12 +5,10 @@ import lombok.Setter; import lombok.experimental.UtilityClass; import lombok.extern.log4j.Log4j2; import net.kyori.adventure.key.Key; -import net.minestom.server.entity.Player; import ru.dragonestia.msb3.api.dialog.action.DialogActionHandler; import ru.dragonestia.msb3.api.dialog.condition.DialogConditionHandler; import ru.dragonestia.msb3.api.dialog.data.VoidPlayerDataProvider; import ru.dragonestia.msb3.api.dialog.data.PlayerDataProvider; -import ru.dragonestia.msb3.api.util.DebugMessage; import java.util.HashMap; import java.util.Map; @@ -38,17 +36,6 @@ public class DialogRegistry { return Optional.ofNullable(dialogs.get(key)); } - public void findDialogAndSend(Player player, Key key) { - var opt = findDialog(key); - if (opt.isEmpty()) { - log.error("Dialog {} not found", key.asString()); - DebugMessage.sendError(player, "Диалог с идентификатором %s не найден".formatted(key.asString())); - return; - } - - opt.get().open(player); - } - public void registerActionHandler(String id, DialogActionHandler handler) { var prev = actionHandlers.put(id, handler); if (prev != null) { diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogDialogActionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogDialogActionHandler.java new file mode 100644 index 0000000..8d11262 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogDialogActionHandler.java @@ -0,0 +1,32 @@ +package ru.dragonestia.msb3.api.dialog.action; + +import lombok.extern.log4j.Log4j2; +import net.kyori.adventure.key.Key; +import ru.dragonestia.msb3.api.dialog.DialogButtonClick; +import ru.dragonestia.msb3.api.dialog.DialogRegistry; +import ru.dragonestia.msb3.api.util.DebugMessage; + +import java.util.Map; + +@Log4j2 +public class DialogDialogActionHandler implements DialogActionHandler { + + @Override + public void handle(DialogButtonClick click, Map params) { + var player = click.player(); + var dialogId = params.get("dialogId"); + if (dialogId == null) { + DebugMessage.sendError(player, "Отсутствует обязательный параметр dialogId для команды dialog"); + return; + } + + var dialog = DialogRegistry.findDialog(Key.key(dialogId)); + if (dialog.isEmpty()) { + log.error("Dialog {} not found", dialogId); + DebugMessage.sendError(player, "Диалог с идентификатором %s не найден".formatted(dialogId)); + return; + } + + dialog.get().switchDialog(player, click.renderer()); + } +} diff --git a/api/src/main/java/ru/dragonestia/msb3/api/util/MapBuilder.java b/api/src/main/java/ru/dragonestia/msb3/api/util/MapBuilder.java new file mode 100644 index 0000000..18c8056 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/util/MapBuilder.java @@ -0,0 +1,18 @@ +package ru.dragonestia.msb3.api.util; + +import java.util.HashMap; +import java.util.Map; + +public class MapBuilder { + + private final Map map = new HashMap<>(); + + public MapBuilder add(K key, V value) { + map.put(key, value); + return this; + } + + public Map build() { + return new HashMap<>(map); + } +}