Skip to content

Commit a0a4c3f

Browse files
Add additional native argument types
1 parent 7ea6a1b commit a0a4c3f

3 files changed

Lines changed: 43 additions & 4 deletions

File tree

src/main/java/org/skriptlang/skript/bukkit/command/custom/ScriptArgumentType.java

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.skriptlang.skript.bukkit.command.custom;
22

33
import ch.njol.skript.Skript;
4+
import ch.njol.skript.classes.ClassInfo;
5+
import ch.njol.skript.classes.registry.RegistryClassInfo;
46
import ch.njol.skript.lang.Literal;
57
import ch.njol.skript.lang.ParseContext;
68
import ch.njol.skript.lang.SkriptParser;
@@ -20,14 +22,22 @@
2022
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
2123
import io.papermc.paper.command.brigadier.argument.ArgumentTypes;
2224
import io.papermc.paper.command.brigadier.argument.CustomArgumentType;
25+
import io.papermc.paper.registry.RegistryKey;
26+
import org.bukkit.GameMode;
27+
import org.bukkit.World;
28+
import org.bukkit.block.BlockState;
29+
import org.bukkit.block.data.BlockData;
2330
import org.bukkit.entity.Entity;
2431
import org.bukkit.entity.Player;
32+
import org.bukkit.inventory.ItemStack;
2533
import org.jetbrains.annotations.ApiStatus;
2634
import org.jetbrains.annotations.NotNull;
35+
import org.jetbrains.annotations.Nullable;
2736

2837
import java.util.Iterator;
2938
import java.util.Locale;
3039
import java.util.Map;
40+
import java.util.UUID;
3141
import java.util.concurrent.CompletableFuture;
3242
import java.util.function.Function;
3343
import java.util.function.Supplier;
@@ -69,7 +79,7 @@ public NativeArgumentData(Function<ArgumentData<?>, ArgumentType<?>> mapper) {
6979
/**
7080
* Pre-defined mappings of types that are acceptable to map to other native argument types.
7181
*/
72-
public static final Map<Class<?>, NativeArgumentData> ARGUMENT_TYPE_MAPPINGS = Map.of(
82+
private static final Map<Class<?>, NativeArgumentData> ARGUMENT_TYPE_MAPPINGS = Map.of(
7383
Boolean.class, new NativeArgumentData(ignored -> BoolArgumentType.bool()),
7484
Long.class, new NativeArgumentData(false, true, data -> {
7585
Long min = (Long) data.min();
@@ -100,9 +110,38 @@ Number.class, new NativeArgumentData(false, true, data -> {
100110
Player.class, new NativeArgumentData(true, false, data ->
101111
data.isSingle() ? ArgumentTypes.player() : ArgumentTypes.players()),
102112
Entity.class, new NativeArgumentData(true, false, data ->
103-
data.isSingle() ? ArgumentTypes.entity() : ArgumentTypes.entities())
113+
data.isSingle() ? ArgumentTypes.entity() : ArgumentTypes.entities()),
114+
GameMode.class, new NativeArgumentData(ignored -> ArgumentTypes.gameMode()),
115+
World.class, new NativeArgumentData(ignored -> ArgumentTypes.world()),
116+
UUID.class, new NativeArgumentData(ignored -> ArgumentTypes.uuid()),
117+
BlockData.class, new NativeArgumentData(ignored -> new Converted<BlockData, BlockState>() {
118+
@Override
119+
public @NotNull ArgumentType<BlockState> getNativeType() {
120+
return ArgumentTypes.blockState();
121+
}
122+
@Override
123+
public @NotNull BlockData convert(@NotNull BlockState blockState) {
124+
return blockState.getBlockData();
125+
}
126+
}),
127+
ItemStack.class, new NativeArgumentData(ignored -> ArgumentTypes.itemStack())
104128
);
105129

130+
public static @Nullable NativeArgumentData getNativeData(ClassInfo<?> classInfo) {
131+
NativeArgumentData nativeArgumentData = ARGUMENT_TYPE_MAPPINGS.get(classInfo.getC());
132+
if (nativeArgumentData != null) {
133+
return nativeArgumentData;
134+
}
135+
if (classInfo instanceof RegistryClassInfo<?> registryClassInfo) {
136+
// TODO need to map RegistryClassInfo to RegistryKey
137+
RegistryKey<?> key = null;
138+
if (key != null) {
139+
return new NativeArgumentData(ignored -> ArgumentTypes.resource(key));
140+
}
141+
}
142+
return null;
143+
}
144+
106145
private static final DynamicCommandExceptionType ERROR_PARSER_ERROR = new DynamicCommandExceptionType(
107146
input -> new LiteralMessage((String) input));
108147

src/main/java/org/skriptlang/skript/bukkit/command/elements/structures/util/CommandCompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ private static List<LiteralCommandElement> appendToLiterals(Collection<LiteralCo
406406
}
407407
}
408408
// type validation
409-
NativeArgumentData nativeMapping = ScriptArgumentType.ARGUMENT_TYPE_MAPPINGS.get(type.getC());
409+
NativeArgumentData nativeMapping = ScriptArgumentType.getNativeData(type);
410410
if (min != null || max != null) {
411411
if (nativeMapping == null || !nativeMapping.supportsRange()) {
412412
String typeName = plural.plural() ? type.getName().getPlural() : type.getName().getSingular();

src/main/java/org/skriptlang/skript/bukkit/command/elements/structures/util/SubCommandEntryData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ public boolean canCreateWith(Node node) {
382382
ArgumentData<?> data = ((ArgumentCommandElement) commandElement).argument();
383383

384384
ArgumentType<?> nativeType = null;
385-
NativeArgumentData nativeMapping = ScriptArgumentType.ARGUMENT_TYPE_MAPPINGS.get(data.type().getC());
385+
NativeArgumentData nativeMapping = ScriptArgumentType.getNativeData(data.type());
386386
if (nativeMapping != null) { // native argument type may be available
387387
nativeType = nativeMapping.mapper().apply(data);
388388
}

0 commit comments

Comments
 (0)