From 577896e48b6c1f5b203fa3615d4d3102b2f3b92a Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Mon, 28 Apr 2025 17:58:52 +0700 Subject: [PATCH] feat: implemented InstantScript --- .../msb3/api/command/ScriptCommand.java | 26 ++++++--- .../msb3/api/dialog/DialogButton.java | 3 +- .../msb3/api/dialog/DialogCondition.java | 3 +- .../action/CloseDialogActionHandler.java | 3 +- .../dialog/action/DialogActionHandler.java | 5 +- .../action/DialogDialogActionHandler.java | 10 ++-- .../action/ScriptDialogActionHandler.java | 12 ++-- .../AlwaysDialogConditionHandler.java | 5 +- .../condition/DialogConditionHandler.java | 5 +- .../NeverDialogConditionHandler.java | 5 +- .../player/defaults/PlayerScriptContext.java | 46 +++++++++------ .../msb3/api/script/ContinuousScript.java | 35 ++++++++++++ .../msb3/api/script/InstantScript.java | 18 ++++++ .../dragonestia/msb3/api/script/Script.java | 30 ++-------- .../msb3/api/script/ScriptService.java | 13 +++-- .../api/script/defaults/HelloWorldScript.java | 12 ++-- .../ru/dragonestia/msb3/api/util/Params.java | 57 +++++++++++++++++++ 17 files changed, 198 insertions(+), 90 deletions(-) create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/script/ContinuousScript.java create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/script/InstantScript.java create mode 100644 api/src/main/java/ru/dragonestia/msb3/api/util/Params.java diff --git a/api/src/main/java/ru/dragonestia/msb3/api/command/ScriptCommand.java b/api/src/main/java/ru/dragonestia/msb3/api/command/ScriptCommand.java index ff0c5b4..032f064 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/command/ScriptCommand.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/command/ScriptCommand.java @@ -5,6 +5,8 @@ import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.Command; @@ -12,11 +14,13 @@ import net.minestom.server.command.builder.CommandContext; import net.minestom.server.command.builder.arguments.ArgumentString; import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.entity.Player; -import ru.dragonestia.msb3.api.script.Script; +import ru.dragonestia.msb3.api.script.ContinuousScript; import ru.dragonestia.msb3.api.script.ScriptRegistry; import ru.dragonestia.msb3.api.script.ScriptService; +import ru.dragonestia.msb3.api.util.Params; import java.util.Collection; +import java.util.HashMap; public class ScriptCommand extends Command { @@ -57,8 +61,8 @@ public class ScriptCommand extends Command { return; } - player.sendMessage(Component.text("Staring script '%s'...".formatted(scriptId), NamedTextColor.YELLOW)); - scriptService.start(script.get()); + player.sendMessage(Component.text("Staring script '%s'(%s)...".formatted(scriptId, script.get().getClass().getSimpleName()), NamedTextColor.YELLOW)); + scriptService.start(script.get(), Params.EMPTY); } private void executeStopScript(CommandSender sender, CommandContext ctx) { @@ -72,16 +76,16 @@ public class ScriptCommand extends Command { return; } - player.sendMessage(Component.text("Stopping script '%s'...".formatted(scriptId), NamedTextColor.YELLOW)); + player.sendMessage(Component.text("Stopping continuous script '%s'(%s)...".formatted(scriptId, script.get().getClass().getSimpleName()), NamedTextColor.YELLOW)); scriptService.stop(script.get()); } private void executeListActiveScripts(CommandSender sender, CommandContext ctx) { var player = (Player) sender; var scriptService = ScriptService.ofPlayer(player); - var scripts = scriptService.getActiveScripts().stream().map(Script::getId).toList(); + var scripts = scriptService.getActiveScripts().stream().map(ContinuousScript::getId).toList(); - player.sendMessage(Component.text("Active scripts(%s): ".formatted(scripts.size())) + player.sendMessage(Component.text("Active continuous scripts(%s): ".formatted(scripts.size())) .append(listScriptIds(scripts))); } @@ -97,8 +101,14 @@ public class ScriptCommand extends Command { return Component.join( JoinConfiguration.builder().separator(Component.text(", ")).build(), scriptIds.stream().map(id -> Component.text(id, NamedTextColor.GOLD) - .hoverEvent(HoverEvent.showText(Component.text("Click to copy"))) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, id))) + .hoverEvent(HoverEvent.showText( + Component.text() + .append(Component.text("Click to copy", Style.style().color(NamedTextColor.YELLOW).decoration(TextDecoration.UNDERLINED, true).build())) + .appendNewline() + .appendNewline() + .append(Component.text(ScriptRegistry.findAndCreateScript(id).orElseThrow().getClass().getName())) + .build() + )).clickEvent(ClickEvent.clickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, id))) .toList() ); } 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 46b6e4c..785cdaf 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 @@ -11,6 +11,7 @@ import ru.dragonestia.msb3.api.player.PlayerContext; import ru.dragonestia.msb3.api.player.defaults.TalksContext; import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer; import ru.dragonestia.msb3.api.debug.DebugMessage; +import ru.dragonestia.msb3.api.util.Params; import java.util.List; import java.util.Map; @@ -58,7 +59,7 @@ public class DialogButton { boolean success; try { DebugMessage.send(player, "Выполнение действия диалога actionId=%s params=%s".formatted(actionId, params)); - action.get().handle(click, params); + action.get().handle(click, Params.of(params)); success = true; } catch (Exception ex) { diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogCondition.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogCondition.java index e6d298c..3d0b4b0 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogCondition.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/DialogCondition.java @@ -8,6 +8,7 @@ import lombok.extern.log4j.Log4j2; import net.minestom.server.entity.Player; import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer; import ru.dragonestia.msb3.api.debug.DebugMessage; +import ru.dragonestia.msb3.api.util.Params; import java.util.Map; @@ -33,7 +34,7 @@ public class DialogCondition { } try { - return condition.get().check(player, dialog, button, renderer, params); + return condition.get().check(player, dialog, button, renderer, Params.of(params)); } catch (Exception ex) { log.error(ex.getMessage(), ex); DebugMessage.send(player, "Во время проверки условия для кнопки произошла ошибка conditionId=%s params=%s".formatted(conditionId, params)); diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/CloseDialogActionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/CloseDialogActionHandler.java index d1995ba..f71cc25 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/CloseDialogActionHandler.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/CloseDialogActionHandler.java @@ -1,13 +1,14 @@ package ru.dragonestia.msb3.api.dialog.action; import ru.dragonestia.msb3.api.dialog.DialogButtonClick; +import ru.dragonestia.msb3.api.util.Params; import java.util.Map; public class CloseDialogActionHandler implements DialogActionHandler { @Override - public void handle(DialogButtonClick click, Map params) { + public void handle(DialogButtonClick click, Params params) { click.renderer().close(false); } } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogActionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogActionHandler.java index 6d3eda0..b344abd 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogActionHandler.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/DialogActionHandler.java @@ -1,10 +1,9 @@ package ru.dragonestia.msb3.api.dialog.action; import ru.dragonestia.msb3.api.dialog.DialogButtonClick; - -import java.util.Map; +import ru.dragonestia.msb3.api.util.Params; public interface DialogActionHandler { - void handle(DialogButtonClick click, Map params); + void handle(DialogButtonClick click, Params params); } 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 index 22bd24f..e43b828 100644 --- 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 @@ -5,21 +5,21 @@ 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.debug.DebugMessage; - -import java.util.Map; +import ru.dragonestia.msb3.api.util.Params; @Log4j2 public class DialogDialogActionHandler implements DialogActionHandler { @Override - public void handle(DialogButtonClick click, Map params) { + public void handle(DialogButtonClick click, Params params) { var player = click.player(); - var dialogId = params.get("dialogId"); - if (dialogId == null) { + + if (params.contains("dialogId")) { DebugMessage.sendError(player, "Отсутствует обязательный параметр dialogId для команды dialog"); return; } + var dialogId = params.getString("dialogId"); var dialog = DialogRegistry.findDialog(Key.key(dialogId)); if (dialog.isEmpty()) { log.error("Dialog {} not found", dialogId); diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/ScriptDialogActionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/ScriptDialogActionHandler.java index e48e458..b93219a 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/ScriptDialogActionHandler.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/action/ScriptDialogActionHandler.java @@ -5,21 +5,21 @@ import ru.dragonestia.msb3.api.debug.DebugMessage; import ru.dragonestia.msb3.api.dialog.DialogButtonClick; import ru.dragonestia.msb3.api.script.ScriptRegistry; import ru.dragonestia.msb3.api.script.ScriptService; - -import java.util.Map; +import ru.dragonestia.msb3.api.util.Params; @Log4j2 public class ScriptDialogActionHandler implements DialogActionHandler { @Override - public void handle(DialogButtonClick click, Map params) { + public void handle(DialogButtonClick click, Params params) { var player = click.player(); - var scriptId = params.get("scriptId"); - if (scriptId == null) { + + if (params.contains("scriptId")) { DebugMessage.sendError(player, "Отсутствует обязательный параметр scriptId для команды script"); return; } + var scriptId = params.getString("scriptId"); var script = ScriptRegistry.findAndCreateScript(scriptId); if (script.isEmpty()) { log.error("Script {} not found", scriptId); @@ -27,6 +27,6 @@ public class ScriptDialogActionHandler implements DialogActionHandler { return; } - ScriptService.ofPlayer(player).start(script.get()); + ScriptService.ofPlayer(player).start(script.get(), params); } } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/AlwaysDialogConditionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/AlwaysDialogConditionHandler.java index be28e40..12ed5d1 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/AlwaysDialogConditionHandler.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/AlwaysDialogConditionHandler.java @@ -4,13 +4,12 @@ import net.minestom.server.entity.Player; import ru.dragonestia.msb3.api.dialog.Dialog; import ru.dragonestia.msb3.api.dialog.DialogButton; import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer; - -import java.util.Map; +import ru.dragonestia.msb3.api.util.Params; public class AlwaysDialogConditionHandler implements DialogConditionHandler { @Override - public boolean check(Player player, Dialog dialog, DialogButton button, DialogueRenderer renderer, Map params) { + public boolean check(Player player, Dialog dialog, DialogButton button, DialogueRenderer renderer, Params params) { return true; } } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/DialogConditionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/DialogConditionHandler.java index 107ab48..53a1c60 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/DialogConditionHandler.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/DialogConditionHandler.java @@ -4,10 +4,9 @@ import net.minestom.server.entity.Player; import ru.dragonestia.msb3.api.dialog.Dialog; import ru.dragonestia.msb3.api.dialog.DialogButton; import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer; - -import java.util.Map; +import ru.dragonestia.msb3.api.util.Params; public interface DialogConditionHandler { - boolean check(Player player, Dialog dialog, DialogButton button, DialogueRenderer renderer, Map params); + boolean check(Player player, Dialog dialog, DialogButton button, DialogueRenderer renderer, Params params); } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/NeverDialogConditionHandler.java b/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/NeverDialogConditionHandler.java index edb9d5f..a3c02ae 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/NeverDialogConditionHandler.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/dialog/condition/NeverDialogConditionHandler.java @@ -4,13 +4,12 @@ import net.minestom.server.entity.Player; import ru.dragonestia.msb3.api.dialog.Dialog; import ru.dragonestia.msb3.api.dialog.DialogButton; import ru.dragonestia.msb3.api.ui.dialogue.DialogueRenderer; - -import java.util.Map; +import ru.dragonestia.msb3.api.util.Params; public class NeverDialogConditionHandler implements DialogConditionHandler { @Override - public boolean check(Player player, Dialog dialog, DialogButton button, DialogueRenderer renderer, Map params) { + public boolean check(Player player, Dialog dialog, DialogButton button, DialogueRenderer renderer, Params params) { return false; } } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/PlayerScriptContext.java b/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/PlayerScriptContext.java index cc608b7..99746d3 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/PlayerScriptContext.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/player/defaults/PlayerScriptContext.java @@ -4,8 +4,10 @@ import lombok.extern.log4j.Log4j2; import ru.dragonestia.msb3.api.debug.DebugMessage; import ru.dragonestia.msb3.api.player.MsbPlayer; import ru.dragonestia.msb3.api.player.PlayerContext; +import ru.dragonestia.msb3.api.script.ContinuousScript; import ru.dragonestia.msb3.api.script.Script; import ru.dragonestia.msb3.api.script.ScriptService; +import ru.dragonestia.msb3.api.util.Params; import ru.dragonestia.msb3.api.util.UncheckedRunnable; import java.util.*; @@ -14,7 +16,7 @@ import java.util.concurrent.ConcurrentHashMap; @Log4j2 public class PlayerScriptContext extends PlayerContext implements ScriptService { - private final Map scripts = new ConcurrentHashMap<>(); + private final Map scripts = new ConcurrentHashMap<>(); public PlayerScriptContext(MsbPlayer player) { super(player); @@ -34,28 +36,36 @@ public class PlayerScriptContext extends PlayerContext implements ScriptService } @Override - public void start(Script script) { + public void start(Script script, Params params) { synchronized (this) { - var opt = findScript(script.getId()); - if (opt.isPresent()) { - DebugMessage.send(getPlayer(), "Script '%s' already started".formatted(script.getId())); - return; - } + if (script instanceof ContinuousScript continuousScript) startContinuousScript(continuousScript, params); + else startScript(script, params); + } + } - try { - script.start(getPlayer()); - DebugMessage.send(getPlayer(), "Script '%s' started!".formatted(script.getId())); - } catch (Exception ex) { - DebugMessage.sendError(getPlayer(), "Script '%s' started with error %s: %s".formatted(script.getId(), ex.getClass().getSimpleName(), ex.getMessage())); - log.error(ex.getMessage(), ex); - } + private void startContinuousScript(ContinuousScript script, Params params) { + var opt = findScript(script.getId()); + if (opt.isPresent()) { + DebugMessage.send(getPlayer(), "Script '%s' already running".formatted(script.getId())); + return; + } - scripts.put(script.getId(), script); + startScript(script, params); + scripts.put(script.getId(), script); + } + + private void startScript(Script script, Params params) { + try { + script.start(getPlayer(), params); + DebugMessage.send(getPlayer(), "Script '%s' was started!".formatted(script.getId())); + } catch (Exception ex) { + DebugMessage.sendError(getPlayer(), "Script '%s' was started with error %s: %s".formatted(script.getId(), ex.getClass().getSimpleName(), ex.getMessage())); + log.error(ex.getMessage(), ex); } } @Override - public void stop(Script script) { + public void stop(ContinuousScript script) { synchronized (this) { if (!scripts.containsKey(script.getId())) { DebugMessage.send(getPlayer(), "Script '%s' not started".formatted(script.getId())); @@ -75,12 +85,12 @@ public class PlayerScriptContext extends PlayerContext implements ScriptService } @Override - public Collection