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 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<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(null, "Третья", "close", new HashMap<>(), new ArrayList<>()));
|
||||
dialog.setButtons(buttons);
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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