Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions dist/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,9 @@
<relocation>
<pattern>net.kyori.adventure.nbt</pattern>
<shadedPattern>com.denizenscript.shaded.net.adventure.nbt</shadedPattern>
<excludes>
<exclude>net.kyori.adventure.nbt.api.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,19 @@
import com.denizenscript.denizen.nms.interfaces.packets.PacketOutChat;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizen.paper.commands.DialogCommand;
import com.denizenscript.denizen.paper.datacomponents.ComponentAdaptersRegistry;
import com.denizenscript.denizen.paper.events.*;
import com.denizenscript.denizen.paper.properties.*;
import com.denizenscript.denizen.paper.scripts.containers.DialogScriptContainer;
import com.denizenscript.denizen.paper.tags.PaperTagBase;
import com.denizenscript.denizen.paper.utilities.PaperAPIToolsImpl;
import com.denizenscript.denizen.scripts.commands.BukkitCommandRegistry;
import com.denizenscript.denizen.utilities.FormattedTextHelper;
import com.denizenscript.denizen.utilities.PaperAPITools;
import com.denizenscript.denizencore.events.ScriptEvent;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
import com.denizenscript.denizencore.scripts.ScriptRegistry;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
Expand Down Expand Up @@ -111,6 +115,11 @@ public static void init() {
ScriptEvent.registerScriptEvent(WardenChangesAngerLevelScriptEvent.class);
}
ScriptEvent.registerScriptEvent(WorldGameRuleChangeScriptEvent.class);
if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21)) {
ScriptRegistry._registerType("dialog", DialogScriptContainer.class);
BukkitCommandRegistry.registerCommand(DialogCommand.class);
Denizen.getInstance().getServer().getPluginManager().registerEvents(new DialogScriptContainer.DialogEvents(), Denizen.getInstance());
}

// Properties
PropertyParser.registerProperty(EntityArmsRaised.class, EntityTag.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package com.denizenscript.denizen.paper.commands;

import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.paper.scripts.containers.DialogScriptContainer;
import com.denizenscript.denizen.tags.BukkitTagContext;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizencore.objects.core.ScriptTag;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import com.denizenscript.denizencore.scripts.commands.generator.*;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import io.papermc.paper.dialog.Dialog;

import java.util.List;

public class DialogCommand extends AbstractCommand {

public DialogCommand() {
setName("dialog");
setSyntax("dialog [show/close] (<script>) (targets:<player>|...) (per_player)");
setRequiredArguments(1, 4);
autoCompile();
isProcedural = false;
}

// <--[command]
// @Name Dialog
// @Syntax dialog [show/close] (<script>) (targets:<player>|...) (per_player)
// @Required 1
// @Maximum 4
// @Short Shows or closes a dialog for players.
// @Group player
// @Plugin Paper
//
// @Description
// Shows or closes a dialog for the specified players.
// Requires MC 1.21+.
//
// Use 'show' with a dialog script name to display the dialog to the target player(s).
// Use 'close' to close any dialog currently open for the target player(s).
//
// If no 'targets' are specified, defaults to the linked player.
//
// See <@link language Dialog Script Containers> for how to define dialog scripts.
//
// @Tags
// None
//
// @Usage
// Use to show a dialog script to the current player.
// - dialog show my_dialog
//
// @Usage
// Use to show the same dialog to all online players.
// - dialog show my_dialog targets:<server.online_players>
//
// @Usage
// Use to show a dialog script to all online players, per-player.
// - dialog show my_dialog targets:<server.online_players> per_player
//
// @Usage
// Use to close the dialog for the current player.
// - dialog close
// -->

public enum Action { SHOW, CLOSE }

public static void autoExecute(ScriptEntry scriptEntry,
@ArgName("action") Action action,
@ArgName("script") @ArgLinear @ArgDefaultNull ScriptTag dialogScript,
@ArgName("targets") @ArgPrefixed @ArgDefaultNull @ArgSubType(PlayerTag.class) List<PlayerTag> targets,
@ArgName("per_player") boolean perPlayer) {
if (targets == null) {
if (!Utilities.entryHasPlayer(scriptEntry)) {
Debug.echoError("Must specify target player(s).");
return;
}
targets = List.of(Utilities.getEntryPlayer(scriptEntry));
}
switch (action) {
case SHOW -> {
if (dialogScript == null) {
Debug.echoError("Must specify a dialog script name for 'show'.");
return;
}
if (!(dialogScript.getContainer() instanceof DialogScriptContainer container)) {
Debug.echoError("Script '" + dialogScript.getName() + "' is not a dialog script container.");
return;
}
Dialog dialog = null;
BukkitTagContext context = (BukkitTagContext) scriptEntry.getContext();
if (!perPlayer) {
dialog = container.buildDialog(context);
if (dialog == null) {
Debug.echoError("Failed to build dialog from script '" + dialogScript.getName() + "'.");
return;
}
}
for (PlayerTag playerTag : targets) {
if (!playerTag.isOnline()) {
Debug.echoError("Player '" + playerTag + "' is offline. Skipping...");
continue;
}
if (perPlayer) {
context.player = playerTag;
dialog = container.buildDialog(context);
if (dialog == null) {
Debug.echoError("Failed to build dialog from script '" + dialogScript.getName() + "' for player '" + playerTag + "'.");
continue;
}
}
playerTag.getPlayerEntity().showDialog(dialog);
}
}
case CLOSE -> {
for (PlayerTag playerTag : targets) {
if (!playerTag.isOnline()) {
Debug.echoError("Player '" + playerTag + "' is offline. Skipping...");
continue;
}
playerTag.getPlayerEntity().closeDialog();
}
}
}
}
}
Loading