/
ExCommandHandler.java
135 lines (127 loc) · 6.52 KB
/
ExCommandHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.denizenscript.denizen.utilities.command;
import com.denizenscript.denizen.objects.NPCTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.FormattedTextHelper;
import com.denizenscript.denizen.utilities.Settings;
import com.denizenscript.denizencore.utilities.CoreConfiguration;
import com.denizenscript.denizen.utilities.depends.Depends;
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
import com.denizenscript.denizencore.scripts.ScriptBuilder;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.commands.core.FlagCommand;
import com.denizenscript.denizencore.scripts.queues.core.InstantQueue;
import com.denizenscript.denizencore.utilities.ExCommandHelper;
import org.bukkit.ChatColor;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class ExCommandHandler implements CommandExecutor, TabCompleter {
public void enableFor(PluginCommand command) {
command.setExecutor(this);
command.setTabCompleter(this);
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String alias, String[] args) {
// <--[language]
// @name /ex command
// @group Console Commands
// @description
// The '/ex' command is an easy way to run a single denizen script command in-game.
// 'Ex' is short for 'Execute'.
// Its syntax, aside from '/ex' is exactly the same as any other Denizen script command.
// When running a command, some context is also supplied, such as '<player>' if being run by a player (versus the console),
// as well as '<npc>' if a NPC is selected by using the '/npc sel' command.
//
// By default, ex command debug output is sent to the player that ran the ex command (if the command was ran by a player).
// To avoid this, use '-q' at the start of the ex command.
// Like: /ex -q narrate "wow no output"
//
// The '/ex' command creates a new queue each time it's run,
// meaning for example '/ex define' would do nothing, as the definition will be lost immediately.
//
// If you need to sustain a queue between multiple executions, use '/exs' ("Execute Sustained").
// A sustained queue will use the same queue on every execution until the queue stops (normally due to '/exs stop').
// Be warned that waits will block the sustained queue - eg '/exs wait 10m' will make '/exs' effectively unusable for 10 minutes.
//
// Examples:
// /ex flag <player> test_flag:!
// /ex run npc_walk_script
//
// Need to '/ex' a command as a different player or NPC? Use <@link language The Player and NPC Arguments>.
//
// Examples:
// /ex narrate player:<[aplayer]> 'Your health is <player.health.formatted>.'
// /ex walk npc:<[some_npc]> <player.cursor_on>
//
// -->
if (cmd.getName().equalsIgnoreCase("ex")) {
List<Object> entries = new ArrayList<>();
String entry = String.join(" ", args);
boolean quiet = !Settings.showExDebug();
if (entry.length() > 3 && entry.startsWith("-q ")) {
quiet = !quiet;
entry = entry.substring("-q ".length());
}
if (entry.length() < 2) {
sender.sendMessage("/ex (-q) <denizen script command> (arguments)");
return true;
}
if (Settings.showExHelp()) {
if (CoreConfiguration.shouldShowDebug) {
if (quiet) {
sender.sendMessage(ChatColor.YELLOW + "Executing Denizen script command... check the console for full debug output!");
}
else {
//sender.sendMessage(ChatColor.YELLOW + "Executing Denizen script command...");
}
}
else {
sender.sendMessage(ChatColor.YELLOW + "Executing Denizen script command... to see debug, use /denizen debug");
}
}
entries.add(entry);
InstantQueue queue = new InstantQueue("EXCOMMAND");
NPCTag npc = null;
if (Depends.citizens != null && Depends.citizens.getNPCSelector().getSelected(sender) != null) {
npc = new NPCTag(Depends.citizens.getNPCSelector().getSelected(sender));
}
List<ScriptEntry> scriptEntries = ScriptBuilder.buildScriptEntries(entries, null,
new BukkitScriptEntryData(sender instanceof Player ? new PlayerTag((Player) sender) : null, npc));
queue.addEntries(scriptEntries);
if (!quiet && sender instanceof Player) {
final Player player = (Player) sender;
queue.debugOutput = (s) -> {
player.spigot().sendMessage(FormattedTextHelper.parse(s.replace("<FORCE_ALIGN>", ""), net.md_5.bungee.api.ChatColor.WHITE));
};
}
queue.start();
return true;
}
return false;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command cmd, String cmdName, String[] rawArgs) {
if ((!cmdName.equalsIgnoreCase("ex") && !cmdName.equalsIgnoreCase("exs")) || !sender.hasPermission("denizen.ex")) {
return null;
}
return ExCommandHelper.buildTabCompletions(rawArgs, (dcmd, completionsBuilder) -> {
if (dcmd instanceof FlagCommand) {
if (sender instanceof Player) {
for (String flagName : new PlayerTag((Player) sender).getFlagTracker().listAllFlags()) {
if (!flagName.startsWith("__")) {
completionsBuilder.add(flagName);
}
}
}
if (Depends.citizens != null && Depends.citizens.getNPCSelector().getSelected(sender) != null) {
for (String flagName : new NPCTag(Depends.citizens.getNPCSelector().getSelected(sender)).getFlagTracker().listAllFlags()) {
if (!flagName.startsWith("__")) {
completionsBuilder.add(flagName);
}
}
}
}
});
}
}