diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/FancyDialogsPlugin.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/FancyDialogsPlugin.java index 7f5c8f58..5ceb178b 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/FancyDialogsPlugin.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/FancyDialogsPlugin.java @@ -2,8 +2,10 @@ package com.fancyinnovations.fancydialogs; import com.fancyinnovations.fancydialogs.api.Dialog; import com.fancyinnovations.fancydialogs.api.data.DialogData; +import com.fancyinnovations.fancydialogs.commands.DialogCMD; import com.fancyinnovations.fancydialogs.commands.FancyDialogsCMD; import com.fancyinnovations.fancydialogs.commands.TutorialCMD; +import com.fancyinnovations.fancydialogs.commands.types.DialogCommandType; import com.fancyinnovations.fancydialogs.config.FDFeatureFlags; import com.fancyinnovations.fancydialogs.config.FancyDialogsConfig; import com.fancyinnovations.fancydialogs.dialog.DialogImpl; @@ -135,11 +137,7 @@ public class FancyDialogsPlugin extends JavaPlugin { registerListeners(); - Lamp lamp = BukkitLamp - .builder(this) - .build(); - lamp.register(FancyDialogsCMD.INSTANCE); - lamp.register(TutorialCMD.INSTANCE); + registerCommands(); // FancyNpcs actions new OpenDialogNpcAction().register(); @@ -160,6 +158,21 @@ public class FancyDialogsPlugin extends JavaPlugin { Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), this); } + private void registerCommands() { + Lamp.Builder lampBuilder = BukkitLamp + .builder(this); + + lampBuilder.parameterTypes(builder -> { + builder.addParameterType(Dialog.class, DialogCommandType.INSTANCE); + }); + + Lamp lamp = lampBuilder.build(); + + lamp.register(FancyDialogsCMD.INSTANCE); + lamp.register(DialogCMD.INSTANCE); + lamp.register(TutorialCMD.INSTANCE); + } + public ExtendedFancyLogger getFancyLogger() { return fancyLogger; } diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/DialogCMD.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/DialogCMD.java new file mode 100644 index 00000000..490d90f5 --- /dev/null +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/DialogCMD.java @@ -0,0 +1,43 @@ +package com.fancyinnovations.fancydialogs.commands; + +import com.fancyinnovations.fancydialogs.FancyDialogsPlugin; +import com.fancyinnovations.fancydialogs.api.Dialog; +import de.oliver.fancylib.translations.Translator; +import org.bukkit.entity.Player; +import revxrsal.commands.annotation.Command; +import revxrsal.commands.annotation.Description; +import revxrsal.commands.annotation.Optional; +import revxrsal.commands.bukkit.annotation.CommandPermission; + +public final class DialogCMD { + + public static final DialogCMD INSTANCE = new DialogCMD(); + + private final FancyDialogsPlugin plugin = FancyDialogsPlugin.get(); + private final Translator translator = FancyDialogsPlugin.get().getTranslator(); + + private DialogCMD() { + } + + @Command("dialog open ") + @Description("Opens a dialog (for a player) by its ID") + @CommandPermission("fancydialogs.commands.registry.unregister") + public void open( + Player actor, + Dialog dialog, + @Optional Player target + ) { + if (target == null) { + dialog.open(actor); + translator.translate("commands.dialog.open.self") + .replace("id", dialog.getId()) + .send(actor); + } else { + dialog.open(target); + translator.translate("commands.dialog.open.other") + .replace("id", dialog.getId()) + .replace("target", target.getName()) + .send(actor); + } + } +} diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java index 021914ce..084100fb 100644 --- a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/FancyDialogsCMD.java @@ -124,24 +124,16 @@ public final class FancyDialogsCMD { translator.translate("commands.fancydialogs.registry.clear.success").send(actor.sender()); } - @Command("fancydialogs registry unregister ") + @Command("fancydialogs registry unregister ") @Description("Unregisters a dialog by its ID") @CommandPermission("fancydialogs.commands.registry.unregister") public void registryUnregister( final BukkitCommandActor actor, - final String id + final Dialog dialog ) { - Dialog dialog = plugin.getDialogRegistry().get(id); - if (dialog == null) { - translator.translate("commands.fancydialogs.registry.unregister.not_found") - .replace("id", id) - .send(actor.sender()); - return; - } - - plugin.getDialogRegistry().unregister(id); + plugin.getDialogRegistry().unregister(dialog.getId()); translator.translate("commands.fancydialogs.registry.unregister.success") - .replace("id", id) + .replace("id", dialog.getId()) .send(actor.sender()); } } diff --git a/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/types/DialogCommandType.java b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/types/DialogCommandType.java new file mode 100644 index 00000000..59f7c76f --- /dev/null +++ b/plugins/fancydialogs/src/main/java/com/fancyinnovations/fancydialogs/commands/types/DialogCommandType.java @@ -0,0 +1,45 @@ +package com.fancyinnovations.fancydialogs.commands.types; + +import com.fancyinnovations.fancydialogs.FancyDialogsPlugin; +import com.fancyinnovations.fancydialogs.api.Dialog; +import com.fancyinnovations.fancydialogs.registry.DialogRegistry; +import org.jetbrains.annotations.NotNull; +import revxrsal.commands.autocomplete.SuggestionProvider; +import revxrsal.commands.bukkit.actor.BukkitCommandActor; +import revxrsal.commands.node.ExecutionContext; +import revxrsal.commands.parameter.ParameterType; +import revxrsal.commands.stream.MutableStringStream; + +public class DialogCommandType implements ParameterType { + + public static final DialogCommandType INSTANCE = new DialogCommandType(); + private static final DialogRegistry REGISTRY = FancyDialogsPlugin.get().getDialogRegistry(); + + private DialogCommandType() { + // Private constructor to prevent instantiation + } + + @Override + public Dialog parse(@NotNull MutableStringStream input, @NotNull ExecutionContext<@NotNull BukkitCommandActor> context) { + String id = input.readString(); + + Dialog dialog = REGISTRY.get(id); + if (dialog != null) { + return dialog; + } + + FancyDialogsPlugin.get().getTranslator() + .translate("dialog.not_found") + .replace("id", id) + .send(context.actor().sender()); + + return null; + } + + @Override + public @NotNull SuggestionProvider<@NotNull BukkitCommandActor> defaultSuggestions() { + return (ctx) -> REGISTRY.getAll().stream() + .map(Dialog::getId) + .toList(); + } +} diff --git a/plugins/fancydialogs/src/main/resources/languages/default.yml b/plugins/fancydialogs/src/main/resources/languages/default.yml index e4b47e98..e0142538 100644 --- a/plugins/fancydialogs/src/main/resources/languages/default.yml +++ b/plugins/fancydialogs/src/main/resources/languages/default.yml @@ -1,6 +1,12 @@ language_name: default messages: + dialog: + not_found: "Dialog {warningColor}{id} is not registered." commands: + dialog: + open: + self: "Opened dialog {warningColor}{id}." + other: "Opened dialog {warningColor}{id} for player {target}." fancydialogs: version: "You are running FancyDialogs {warningColor}{version}." storage: @@ -18,5 +24,4 @@ messages: clear: success: "Successfully cleared all registered dialogs." unregister: - success: "Successfully unregistered dialog {warningColor}{id}." - not_found: "Dialog {warningColor}{id} is not registered." \ No newline at end of file + success: "Successfully unregistered dialog {warningColor}{id}." \ No newline at end of file