feat: added action dialog
This commit is contained in:
parent
c83768c366
commit
f5696d6078
@ -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);
|
||||||
|
|||||||
@ -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());
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user