feat: added action dialog

This commit is contained in:
Andrey Terentev 2025-03-12 21:16:34 +07:00
parent c83768c366
commit f5696d6078
7 changed files with 59 additions and 25 deletions

View File

@ -7,15 +7,11 @@ import net.minestom.server.entity.GameMode;
import net.minestom.server.event.player.PlayerChatEvent; import net.minestom.server.event.player.PlayerChatEvent;
import ru.dragonestia.msb3.api.dialog.Dialog; import ru.dragonestia.msb3.api.dialog.Dialog;
import ru.dragonestia.msb3.api.dialog.DialogButton; 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.FlatWorldModule;
import ru.dragonestia.msb3.api.module.MotdModule; import ru.dragonestia.msb3.api.module.MotdModule;
import ru.dragonestia.msb3.api.module.PrometheusMetricsModule; import ru.dragonestia.msb3.api.module.PrometheusMetricsModule;
import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule; import ru.dragonestia.msb3.api.module.ResourcePackRepositoryModule;
import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber; import ru.dragonestia.msb3.api.util.MapBuilder;
import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer;
import ru.dragonestia.msb3.api.ui.dialogue.DialogueTheme;
import team.unnamed.creative.ResourcePack; import team.unnamed.creative.ResourcePack;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
@ -75,7 +71,7 @@ public class DefaultBootstrap extends ServerInitializer {
dialog.setRememberId(true); dialog.setRememberId(true);
var buttons = new ArrayList<DialogButton>(); var buttons = new ArrayList<DialogButton>();
buttons.add(new DialogButton(null, "Какая-то кнопочка", null, new HashMap<>(), new ArrayList<>())); buttons.add(new DialogButton(null, "Переход к диалогу следующему", "dialog", new MapBuilder<String, String>().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(Key.key("msb3", "test_button"), "2 Какая-то кнопочка", "aboba", new HashMap<>(), new ArrayList<>()));
buttons.add(new DialogButton(null, "Третья", "close", new HashMap<>(), new ArrayList<>())); buttons.add(new DialogButton(null, "Третья", "close", new HashMap<>(), new ArrayList<>()));
dialog.setButtons(buttons); dialog.setButtons(buttons);

View File

@ -10,6 +10,7 @@ import net.minestom.server.event.player.PlayerDisconnectEvent;
import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.event.player.PlayerSpawnEvent;
import ru.dragonestia.msb3.api.dialog.DialogRegistry; import ru.dragonestia.msb3.api.dialog.DialogRegistry;
import ru.dragonestia.msb3.api.dialog.action.CloseDialogActionHandler; 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.AlwaysDialogConditionHandler;
import ru.dragonestia.msb3.api.dialog.condition.NeverDialogConditionHandler; import ru.dragonestia.msb3.api.dialog.condition.NeverDialogConditionHandler;
import ru.dragonestia.msb3.api.entity.PickableItem; import ru.dragonestia.msb3.api.entity.PickableItem;
@ -197,6 +198,7 @@ public final class ServerBootstrap {
private void initDefaultDialogActionsAndConditions() { private void initDefaultDialogActionsAndConditions() {
DialogRegistry.registerActionHandler("close", new CloseDialogActionHandler()); DialogRegistry.registerActionHandler("close", new CloseDialogActionHandler());
DialogRegistry.registerActionHandler("dialog", new DialogDialogActionHandler());
DialogRegistry.registerConditionHandler("always", new AlwaysDialogConditionHandler()); DialogRegistry.registerConditionHandler("always", new AlwaysDialogConditionHandler());
DialogRegistry.registerConditionHandler("never", new NeverDialogConditionHandler()); DialogRegistry.registerConditionHandler("never", new NeverDialogConditionHandler());

View File

@ -26,8 +26,6 @@ import java.util.List;
@NoArgsConstructor @NoArgsConstructor
public class Dialog { public class Dialog {
private final static DialogueTheme DEFAULT_THEME = DialogueTheme.builder().build();
private Key id; private Key id;
private String text; private String text;
private boolean rememberId; private boolean rememberId;
@ -41,7 +39,7 @@ public class Dialog {
DebugMessage.send(player, "Идентификатор диалога %s был сохранен в список просмотренных диалогов".formatted(id.asString())); DebugMessage.send(player, "Идентификатор диалога %s был сохранен в список просмотренных диалогов".formatted(id.asString()));
} }
DialogueTheme theme = DEFAULT_THEME; DialogueTheme theme = DialogueTheme.builder().build();
if (themeId != null) { if (themeId != null) {
var themeOpt = TalksThemes.getDialogueTheme(themeId); var themeOpt = TalksThemes.getDialogueTheme(themeId);
if (themeOpt.isPresent()) { if (themeOpt.isPresent()) {
@ -66,10 +64,11 @@ public class Dialog {
button.onClick(click); button.onClick(click);
}); });
} }
renderer.rerender();
} }
public void open(Player player) { public synchronized void open(Player player) {
var renderer = new DialogueRenderer(player, DEFAULT_THEME); var renderer = DialogueRenderer.getRenderer(player).orElseGet(() -> new DialogueRenderer(player, DialogueTheme.builder().build()));
switchDialog(player, renderer); switchDialog(player, renderer);
renderer.show(); renderer.show();
} }

View File

@ -53,8 +53,8 @@ public class DialogButton {
boolean success; boolean success;
try { try {
action.get().handle(click, params);
DebugMessage.send(player, "Выполнение действия диалога actionId=%s params=%s".formatted(actionId, params)); DebugMessage.send(player, "Выполнение действия диалога actionId=%s params=%s".formatted(actionId, params));
action.get().handle(click, params);
success = true; success = true;
} catch (Exception ex) { } catch (Exception ex) {

View File

@ -5,12 +5,10 @@ import lombok.Setter;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.kyori.adventure.key.Key; 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.action.DialogActionHandler;
import ru.dragonestia.msb3.api.dialog.condition.DialogConditionHandler; import ru.dragonestia.msb3.api.dialog.condition.DialogConditionHandler;
import ru.dragonestia.msb3.api.dialog.data.VoidPlayerDataProvider; import ru.dragonestia.msb3.api.dialog.data.VoidPlayerDataProvider;
import ru.dragonestia.msb3.api.dialog.data.PlayerDataProvider; import ru.dragonestia.msb3.api.dialog.data.PlayerDataProvider;
import ru.dragonestia.msb3.api.util.DebugMessage;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -38,17 +36,6 @@ public class DialogRegistry {
return Optional.ofNullable(dialogs.get(key)); 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) { public void registerActionHandler(String id, DialogActionHandler handler) {
var prev = actionHandlers.put(id, handler); var prev = actionHandlers.put(id, handler);
if (prev != null) { if (prev != null) {

View File

@ -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<String, String> 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());
}
}

View File

@ -0,0 +1,18 @@
package ru.dragonestia.msb3.api.util;
import java.util.HashMap;
import java.util.Map;
public class MapBuilder<K, V> {
private final Map<K, V> map = new HashMap<>();
public MapBuilder<K, V> add(K key, V value) {
map.put(key, value);
return this;
}
public Map<K, V> build() {
return new HashMap<>(map);
}
}