Skip to content

Commit c7d461b

Browse files
committed
add custom warp argument
1 parent e160e83 commit c7d461b

File tree

5 files changed

+62
-31
lines changed

5 files changed

+62
-31
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.uravgcode.modernessentials.argument;
2+
3+
import com.mojang.brigadier.StringReader;
4+
import com.mojang.brigadier.arguments.ArgumentType;
5+
import com.mojang.brigadier.arguments.StringArgumentType;
6+
import com.mojang.brigadier.context.CommandContext;
7+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
8+
import com.mojang.brigadier.suggestion.Suggestions;
9+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
10+
import com.uravgcode.modernessentials.module.WarpModule;
11+
import io.papermc.paper.command.brigadier.argument.CustomArgumentType;
12+
import org.jspecify.annotations.NullMarked;
13+
14+
import java.util.concurrent.CompletableFuture;
15+
16+
@NullMarked
17+
public class WarpArgument implements CustomArgumentType<String, String> {
18+
19+
@Override
20+
public String parse(StringReader reader) {
21+
throw new UnsupportedOperationException();
22+
}
23+
24+
@Override
25+
public <S> String parse(StringReader reader, S source) throws CommandSyntaxException {
26+
return reader.readString();
27+
}
28+
29+
@Override
30+
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
31+
final var remaining = builder.getRemainingLowerCase();
32+
for (final var warp : WarpModule.getWarps().tailMap(remaining).keySet()) {
33+
if (!warp.toLowerCase().startsWith(remaining)) break;
34+
builder.suggest(warp);
35+
}
36+
return builder.buildFuture();
37+
}
38+
39+
@Override
40+
public ArgumentType<String> getNativeType() {
41+
return StringArgumentType.word();
42+
}
43+
}

src/main/java/com/uravgcode/modernessentials/command/warp/DelWarpCommand.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.uravgcode.modernessentials.command.warp;
22

33
import com.mojang.brigadier.Command;
4-
import com.mojang.brigadier.arguments.StringArgumentType;
54
import com.mojang.brigadier.context.CommandContext;
65
import com.mojang.brigadier.tree.LiteralCommandNode;
6+
import com.uravgcode.modernessentials.argument.WarpArgument;
77
import com.uravgcode.modernessentials.command.CommandBuilder;
88
import com.uravgcode.modernessentials.event.warp.DelWarpEvent;
9-
import com.uravgcode.modernessentials.module.WarpModule;
109
import io.papermc.paper.command.brigadier.CommandSourceStack;
1110
import io.papermc.paper.command.brigadier.Commands;
1211

@@ -17,15 +16,14 @@ public final class DelWarpCommand implements CommandBuilder {
1716
public LiteralCommandNode<CommandSourceStack> build() {
1817
return Commands.literal("delwarp")
1918
.requires(permission("essentials.delwarp"))
20-
.then(Commands.argument("name", StringArgumentType.word())
21-
.suggests(WarpModule::suggestions)
19+
.then(Commands.argument("name", new WarpArgument())
2220
.executes(this::execute))
2321
.build();
2422
}
2523

2624
private int execute(CommandContext<CommandSourceStack> context) {
2725
final var sender = context.getSource().getSender();
28-
final var name = StringArgumentType.getString(context, "name");
26+
final var name = context.getArgument("name", String.class);
2927
sender.getServer().getPluginManager().callEvent(new DelWarpEvent(sender, name));
3028
return Command.SINGLE_SUCCESS;
3129
}

src/main/java/com/uravgcode/modernessentials/command/warp/SetWarpCommand.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.uravgcode.modernessentials.command.warp;
22

33
import com.mojang.brigadier.Command;
4-
import com.mojang.brigadier.arguments.StringArgumentType;
54
import com.mojang.brigadier.context.CommandContext;
65
import com.mojang.brigadier.tree.LiteralCommandNode;
6+
import com.uravgcode.modernessentials.argument.WarpArgument;
77
import com.uravgcode.modernessentials.command.CommandBuilder;
88
import com.uravgcode.modernessentials.event.warp.SetWarpEvent;
99
import com.uravgcode.modernessentials.exception.RequiresPlayerException;
10-
import com.uravgcode.modernessentials.module.WarpModule;
1110
import io.papermc.paper.command.brigadier.CommandSourceStack;
1211
import io.papermc.paper.command.brigadier.Commands;
1312

@@ -18,15 +17,14 @@ public final class SetWarpCommand implements CommandBuilder {
1817
public LiteralCommandNode<CommandSourceStack> build() {
1918
return Commands.literal("setwarp")
2019
.requires(permission("essentials.setwarp"))
21-
.then(Commands.argument("name", StringArgumentType.word())
22-
.suggests(WarpModule::suggestions)
20+
.then(Commands.argument("name", new WarpArgument())
2321
.executes(this::execute))
2422
.build();
2523
}
2624

2725
private int execute(CommandContext<CommandSourceStack> context) throws RequiresPlayerException {
2826
final var player = player(context);
29-
final var name = StringArgumentType.getString(context, "name");
27+
final var name = context.getArgument("name", String.class);
3028
player.getServer().getPluginManager().callEvent(new SetWarpEvent(player, name));
3129
return Command.SINGLE_SUCCESS;
3230
}

src/main/java/com/uravgcode/modernessentials/command/warp/WarpCommand.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.uravgcode.modernessentials.command.warp;
22

33
import com.mojang.brigadier.Command;
4-
import com.mojang.brigadier.arguments.StringArgumentType;
54
import com.mojang.brigadier.context.CommandContext;
65
import com.mojang.brigadier.tree.LiteralCommandNode;
6+
import com.uravgcode.modernessentials.argument.WarpArgument;
77
import com.uravgcode.modernessentials.command.CommandBuilder;
88
import com.uravgcode.modernessentials.event.warp.WarpEvent;
99
import com.uravgcode.modernessentials.exception.RequiresPlayerException;
10-
import com.uravgcode.modernessentials.module.WarpModule;
1110
import io.papermc.paper.command.brigadier.CommandSourceStack;
1211
import io.papermc.paper.command.brigadier.Commands;
1312

@@ -18,15 +17,14 @@ public final class WarpCommand implements CommandBuilder {
1817
public LiteralCommandNode<CommandSourceStack> build() {
1918
return Commands.literal("warp")
2019
.requires(permission("essentials.warp"))
21-
.then(Commands.argument("name", StringArgumentType.word())
22-
.suggests(WarpModule::suggestions)
20+
.then(Commands.argument("name", new WarpArgument())
2321
.executes(this::execute))
2422
.build();
2523
}
2624

2725
private int execute(CommandContext<CommandSourceStack> context) throws RequiresPlayerException {
2826
final var player = player(context);
29-
final var name = StringArgumentType.getString(context, "name");
27+
final var name = context.getArgument("name", String.class);
3028
player.getServer().getPluginManager().callEvent(new WarpEvent(player, name));
3129
return Command.SINGLE_SUCCESS;
3230
}

src/main/java/com/uravgcode/modernessentials/module/WarpModule.java

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package com.uravgcode.modernessentials.module;
22

3-
import com.mojang.brigadier.context.CommandContext;
4-
import com.mojang.brigadier.suggestion.Suggestions;
5-
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
63
import com.uravgcode.modernessentials.annotation.CommandModule;
74
import com.uravgcode.modernessentials.event.warp.DelWarpEvent;
85
import com.uravgcode.modernessentials.event.warp.SetWarpEvent;
96
import com.uravgcode.modernessentials.event.warp.WarpEvent;
10-
import io.papermc.paper.command.brigadier.CommandSourceStack;
117
import net.kyori.adventure.text.Component;
128
import net.kyori.adventure.text.format.NamedTextColor;
139
import org.bukkit.Location;
@@ -19,27 +15,25 @@
1915

2016
import java.io.File;
2117
import java.io.IOException;
18+
import java.util.Collections;
2219
import java.util.Map;
23-
import java.util.TreeMap;
20+
import java.util.NavigableMap;
2421
import java.util.concurrent.CompletableFuture;
22+
import java.util.concurrent.ConcurrentNavigableMap;
23+
import java.util.concurrent.ConcurrentSkipListMap;
2524

2625
@CommandModule(name = "warp")
2726
public final class WarpModule extends PluginModule {
28-
private static final TreeMap<String, Location> warps = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
27+
private static final ConcurrentNavigableMap<String, Location> warps = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER);
2928
private final File file;
3029

3130
public WarpModule(@NotNull JavaPlugin plugin) {
3231
super(plugin);
3332
this.file = plugin.getDataPath().resolve("warps.yml").toFile();
3433
}
3534

36-
public static CompletableFuture<Suggestions> suggestions(CommandContext<CommandSourceStack> ignored, SuggestionsBuilder builder) {
37-
final var remaining = builder.getRemainingLowerCase();
38-
for (final var warp : warps.tailMap(remaining).keySet()) {
39-
if (!warp.toLowerCase().startsWith(remaining)) break;
40-
builder.suggest(warp);
41-
}
42-
return builder.buildFuture();
35+
public static NavigableMap<String, Location> getWarps() {
36+
return Collections.unmodifiableNavigableMap(warps);
4337
}
4438

4539
@Override
@@ -60,7 +54,7 @@ public void reload() {
6054
}
6155
}
6256

63-
@EventHandler(priority = EventPriority.NORMAL)
57+
@EventHandler(priority = EventPriority.MONITOR)
6458
public void onWarp(WarpEvent event) {
6559
final var name = event.getName();
6660
final var player = event.getPlayer();
@@ -73,7 +67,7 @@ public void onWarp(WarpEvent event) {
7367
}
7468
}
7569

76-
@EventHandler(priority = EventPriority.NORMAL)
70+
@EventHandler(priority = EventPriority.MONITOR)
7771
public void onSetWarp(SetWarpEvent event) {
7872
final var name = event.getName();
7973
final var player = event.getPlayer();
@@ -88,7 +82,7 @@ public void onSetWarp(SetWarpEvent event) {
8882
saveWarps();
8983
}
9084

91-
@EventHandler(priority = EventPriority.NORMAL)
85+
@EventHandler(priority = EventPriority.MONITOR)
9286
public void onDelWarp(DelWarpEvent event) {
9387
final var name = event.getName();
9488
final var sender = event.getSender();

0 commit comments

Comments
 (0)