Skip to content

Commit

Permalink
clickable command: defmap
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed May 22, 2021
1 parent 292ad83 commit b3fffed
Showing 1 changed file with 31 additions and 17 deletions.
Expand Up @@ -8,37 +8,34 @@
import com.denizenscript.denizencore.exceptions.InvalidArgumentsException;
import com.denizenscript.denizencore.objects.Argument;
import com.denizenscript.denizencore.objects.ArgumentHelper;
import com.denizenscript.denizencore.objects.core.DurationTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.objects.core.ScriptTag;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.*;
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.ScriptRegistry;
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import com.denizenscript.denizencore.scripts.containers.ScriptContainer;
import com.denizenscript.denizencore.scripts.containers.core.TaskScriptContainer;
import com.denizenscript.denizencore.scripts.queues.ScriptQueue;
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.denizencore.utilities.ScriptUtilities;
import com.denizenscript.denizencore.utilities.text.StringHolder;
import org.bukkit.entity.Player;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.function.Consumer;

public class ClickableCommand extends AbstractCommand {

public ClickableCommand() {
setName("clickable");
setSyntax("clickable [<script>] (def:<element>|...) (usages:<#>) (for:<player>|...) (until:<duration>)");
setSyntax("clickable [<script>] (def:<element>|.../defmap:<map>/def.<name>:<value>) (usages:<#>) (for:<player>|...) (until:<duration>)");
setRequiredArguments(1, 5);
isProcedural = false;
}

// <--[command]
// @Name Clickable
// @Syntax clickable [<script>] (def:<element>|...) (usages:<#>) (for:<player>|...) (until:<duration>)
// @Syntax clickable [<script>] (def:<element>|.../defmap:<map>/def.<name>:<value>) (usages:<#>) (for:<player>|...) (until:<duration>)
// @Required 1
// @Maximum 5
// @Short Generates a clickable command for players.
Expand Down Expand Up @@ -87,6 +84,7 @@ public void addCustomTabCompletions(String arg, Consumer<String> addOne) {
public static class Clickable {
public HashSet<UUID> forPlayers;
public ListTag definitions;
public MapTag defMap;
public ScriptTag script;
public String path;
public NPCTag npc;
Expand Down Expand Up @@ -115,17 +113,29 @@ public static void runClickable(UUID id, Player player) {
clickables.remove(id);
}
}
Consumer<ScriptQueue> configure = (queue) -> {
if (clickable.defMap != null) {
for (Map.Entry<StringHolder, ObjectTag> val : clickable.defMap.map.entrySet()) {
queue.addDefinition(val.getKey().str, val.getValue());
}
}
};
ScriptUtilities.createAndStartQueue(clickable.script.getContainer(), clickable.path,
new BukkitScriptEntryData(new PlayerTag(player), clickable.npc), null, null, null, null, clickable.definitions, clickable.context);
new BukkitScriptEntryData(new PlayerTag(player), clickable.npc), null, configure, null, null, clickable.definitions, clickable.context);
}

@Override
public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {
MapTag defMap = new MapTag();
for (Argument arg : scriptEntry.getProcessedArgs()) {
if (!scriptEntry.hasObject("definitions")
&& arg.matchesPrefix("def")) {
scriptEntry.addObject("definitions", arg.asType(ListTag.class));
}
else if (arg.matchesPrefix("defmap")
&& arg.matchesArgumentType(MapTag.class)) {
defMap.map.putAll(arg.asType(MapTag.class).map);
}
else if (!scriptEntry.hasObject("usages")
&& arg.matchesPrefix("usages")
&& arg.matchesInteger()) {
Expand All @@ -141,6 +151,10 @@ else if (!scriptEntry.hasObject("for_players")
&& arg.matchesArgumentList(PlayerTag.class)) {
scriptEntry.addObject("for_players", arg.asType(ListTag.class).filter(PlayerTag.class, scriptEntry));
}
else if (arg.hasPrefix()
&& arg.getPrefix().getRawValue().startsWith("def.")) {
defMap.putObject(arg.getPrefix().getRawValue().substring("def.".length()), arg.object);
}
else if (!scriptEntry.hasObject("script")) {
String scriptName = arg.getRawValue();
int dotIndex = scriptName.indexOf('.');
Expand All @@ -163,6 +177,9 @@ else if (!scriptEntry.hasObject("script")) {
if (!scriptEntry.hasObject("script")) {
throw new InvalidArgumentsException("Missing script argument!");
}
if (!defMap.map.isEmpty()) {
scriptEntry.addObject("def_map", defMap);
}
}

@Override
Expand All @@ -173,13 +190,9 @@ public void execute(ScriptEntry scriptEntry) {
ElementTag usages = scriptEntry.getElement("usages");
ListTag definitions = scriptEntry.getObjectTag("definitions");
DurationTag until = scriptEntry.getObjectTag("until");
MapTag defMap = scriptEntry.getObjectTag("def_map");
if (scriptEntry.dbCallShouldDebug()) {
Debug.report(scriptEntry, getName(), script.debug()
+ (path == null ? "" : path.debug())
+ (usages == null ? "" : usages.debug())
+ (definitions == null ? "" : definitions.debug())
+ (until == null ? "" : until.debug())
+ (forPlayers == null ? "" : ArgumentHelper.debugList("for", forPlayers)));
Debug.report(scriptEntry, getName(), script, path, usages, definitions, defMap, until, (forPlayers == null ? "" : ArgumentHelper.debugList("for", forPlayers)));
}
UUID id = UUID.randomUUID();
Clickable newClickable = new Clickable();
Expand All @@ -190,6 +203,7 @@ public void execute(ScriptEntry scriptEntry) {
newClickable.until = until == null ? 0 : (System.currentTimeMillis() + until.getMillis());
newClickable.context = scriptEntry.context;
newClickable.npc = Utilities.getEntryNPC(scriptEntry);
newClickable.defMap = defMap;
if (forPlayers != null) {
newClickable.forPlayers = new HashSet<>(forPlayers.size());
for (PlayerTag player : forPlayers) {
Expand Down

0 comments on commit b3fffed

Please sign in to comment.