Skip to content

Commit 989234c

Browse files
committed
add tpa command
1 parent 85099b8 commit 989234c

File tree

4 files changed

+152
-0
lines changed

4 files changed

+152
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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.exception.BadSourceException;
11+
import com.uravgcode.modernessentials.exception.CannotTargetSelfException;
12+
import com.uravgcode.modernessentials.exception.NoPlayerFoundException;
13+
import io.papermc.paper.command.brigadier.CommandSourceStack;
14+
import io.papermc.paper.command.brigadier.argument.CustomArgumentType;
15+
import org.bukkit.entity.Player;
16+
import org.jspecify.annotations.NullMarked;
17+
18+
import java.util.concurrent.CompletableFuture;
19+
20+
@NullMarked
21+
public final class TargetPlayerArgument implements CustomArgumentType<Player, String> {
22+
23+
@Override
24+
public Player parse(StringReader reader) {
25+
throw new UnsupportedOperationException();
26+
}
27+
28+
@Override
29+
public <S> Player parse(StringReader reader, S source) throws CommandSyntaxException {
30+
if (!(source instanceof CommandSourceStack stack)) throw new BadSourceException();
31+
32+
final var name = reader.readString();
33+
final var sender = stack.getSender();
34+
final var player = sender.getServer().getPlayerExact(name);
35+
36+
if (player == null) throw new NoPlayerFoundException();
37+
if (player.equals(sender)) throw new CannotTargetSelfException();
38+
39+
return player;
40+
}
41+
42+
@Override
43+
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
44+
if (context.getSource() instanceof CommandSourceStack stack) {
45+
final var sender = stack.getSender();
46+
final var remaining = builder.getRemainingLowerCase();
47+
for (final var player : sender.getServer().getOnlinePlayers()) {
48+
final var name = player.getName();
49+
if (!name.toLowerCase().startsWith(remaining) || player.equals(sender)) continue;
50+
builder.suggest(name);
51+
}
52+
}
53+
return builder.buildFuture();
54+
}
55+
56+
@Override
57+
public ArgumentType<String> getNativeType() {
58+
return StringArgumentType.string();
59+
}
60+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.uravgcode.modernessentials.command;
2+
3+
import com.mojang.brigadier.Command;
4+
import com.mojang.brigadier.context.CommandContext;
5+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
6+
import com.mojang.brigadier.tree.LiteralCommandNode;
7+
import com.uravgcode.modernessentials.argument.TargetPlayerArgument;
8+
import io.papermc.paper.command.brigadier.CommandSourceStack;
9+
import io.papermc.paper.command.brigadier.Commands;
10+
import net.kyori.adventure.text.Component;
11+
import net.kyori.adventure.text.event.ClickCallback;
12+
import net.kyori.adventure.text.event.ClickEvent;
13+
import net.kyori.adventure.text.format.NamedTextColor;
14+
import org.bukkit.entity.Player;
15+
16+
import java.time.Duration;
17+
18+
@SuppressWarnings("unused")
19+
public final class TpaCommand implements CommandBuilder {
20+
21+
@Override
22+
public LiteralCommandNode<CommandSourceStack> build() {
23+
return Commands.literal("tpa")
24+
.requires(permission("essentials.tpa"))
25+
.then(Commands.argument("target", new TargetPlayerArgument())
26+
.executes(this::execute))
27+
.build();
28+
}
29+
30+
private int execute(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
31+
final var player = player(context);
32+
final var target = context.getArgument("target", Player.class);
33+
34+
final var options = ClickCallback.Options.builder()
35+
.lifetime(Duration.ofSeconds(60))
36+
.uses(1)
37+
.build();
38+
39+
final var message = Component.textOfChildren(
40+
player.name(),
41+
Component.text(" has requested to teleport to you "),
42+
Component.text("[Accept]", NamedTextColor.GREEN)
43+
.clickEvent(ClickEvent.callback(audience -> {
44+
final var teleportMessage = Component.translatable("commands.teleport.success.entity.single", player.name(), target.name());
45+
player.teleport(target);
46+
player.sendMessage(teleportMessage);
47+
target.sendMessage(teleportMessage);
48+
}, options))
49+
.hoverEvent(Component.translatable("Click to accept")),
50+
Component.newline(),
51+
Component.text("This request will expire in 60 seconds", NamedTextColor.GRAY)
52+
);
53+
54+
target.sendMessage(message);
55+
player.sendMessage(Component.text("Teleport request sent to ").append(target.name()));
56+
return Command.SINGLE_SUCCESS;
57+
}
58+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.uravgcode.modernessentials.exception;
2+
3+
import com.mojang.brigadier.Message;
4+
import com.mojang.brigadier.exceptions.CommandExceptionType;
5+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
6+
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
7+
import io.papermc.paper.command.brigadier.MessageComponentSerializer;
8+
import net.kyori.adventure.text.Component;
9+
10+
public final class BadSourceException extends CommandSyntaxException {
11+
private static final Message message = MessageComponentSerializer.message().serialize(Component.text("The source needs to be a command source stack"));
12+
private static final CommandExceptionType type = new SimpleCommandExceptionType(message);
13+
14+
public BadSourceException() {
15+
super(type, message);
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.uravgcode.modernessentials.exception;
2+
3+
import com.mojang.brigadier.Message;
4+
import com.mojang.brigadier.exceptions.CommandExceptionType;
5+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
6+
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
7+
import io.papermc.paper.command.brigadier.MessageComponentSerializer;
8+
import net.kyori.adventure.text.Component;
9+
10+
public final class CannotTargetSelfException extends CommandSyntaxException {
11+
private static final Message message = MessageComponentSerializer.message().serialize(Component.text("You cannot target yourself"));
12+
private static final CommandExceptionType type = new SimpleCommandExceptionType(message);
13+
14+
public CannotTargetSelfException() {
15+
super(type, message);
16+
}
17+
}

0 commit comments

Comments
 (0)