From a17086b059eda6efdf8a2243ce49742851665603 Mon Sep 17 00:00:00 2001 From: Shiewk Date: Sun, 27 Jul 2025 15:10:25 +0200 Subject: [PATCH] /offlinetp command --- .../smoderation/paper/SModerationPaper.java | 1 + .../paper/command/OfflineTPCommand.java | 65 +++++++++++++++++++ .../argument/OfflinePlayerArgument.java | 40 ++++++++++++ src/main/resources/paper-plugin.yml | 5 +- 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/shiewk/smoderation/paper/command/OfflineTPCommand.java create mode 100644 src/main/java/de/shiewk/smoderation/paper/command/argument/OfflinePlayerArgument.java diff --git a/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java b/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java index 4d0c92f..556e6a5 100644 --- a/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java +++ b/src/main/java/de/shiewk/smoderation/paper/SModerationPaper.java @@ -72,6 +72,7 @@ public final class SModerationPaper extends JavaPlugin { registerCommand(commands, new UnbanCommand()); registerCommand(commands, new MuteCommand()); registerCommand(commands, new BanCommand()); + registerCommand(commands, new OfflineTPCommand()); }); SchedulerUtil.scheduleGlobalRepeating(PLUGIN, CustomInventoryListener::onTick, 1, 1); diff --git a/src/main/java/de/shiewk/smoderation/paper/command/OfflineTPCommand.java b/src/main/java/de/shiewk/smoderation/paper/command/OfflineTPCommand.java new file mode 100644 index 0000000..d9b6501 --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/paper/command/OfflineTPCommand.java @@ -0,0 +1,65 @@ +package de.shiewk.smoderation.paper.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.tree.LiteralCommandNode; +import de.shiewk.smoderation.paper.command.argument.OfflinePlayerArgument; +import de.shiewk.smoderation.paper.util.CommandUtil; +import de.shiewk.smoderation.paper.util.PlayerUtil; +import io.papermc.paper.command.brigadier.CommandSourceStack; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; + +import java.util.Collection; +import java.util.List; + +import static de.shiewk.smoderation.paper.SModerationPaper.*; +import static io.papermc.paper.command.brigadier.Commands.argument; +import static io.papermc.paper.command.brigadier.Commands.literal; +import static net.kyori.adventure.text.Component.text; + +public final class OfflineTPCommand implements CommandProvider { + + @Override + public LiteralCommandNode getCommandNode() { + return literal("offlinetp") + .requires(CommandUtil.requirePermission("smod.offlinetp")) + .then(argument("player", new OfflinePlayerArgument()) + .executes(this::offlineTeleport) + ) + .build(); + } + + private int offlineTeleport(CommandContext context) throws CommandSyntaxException { + Player sender = CommandUtil.getExecutingPlayer(context.getSource()); + OfflinePlayer player = context.getArgument("player", OfflinePlayer.class); + + Location location = player.getLocation(); + + if (location == null) { + CommandUtil.error("This player's location is unknown."); + } + + sender.teleportAsync(location, PlayerTeleportEvent.TeleportCause.COMMAND); + sender.sendMessage(CHAT_PREFIX.append( + text("Teleporting you to ").color(PRIMARY_COLOR) + .append(text(PlayerUtil.offlinePlayerName(player.getUniqueId())).colorIfAbsent(SECONDARY_COLOR)) + .append(text(".")) + )); + + return Command.SINGLE_SUCCESS; + } + + @Override + public String getCommandDescription() { + return "Teleports you to an offline player."; + } + + @Override + public Collection getAliases() { + return List.of("smodofflinetp"); + } +} diff --git a/src/main/java/de/shiewk/smoderation/paper/command/argument/OfflinePlayerArgument.java b/src/main/java/de/shiewk/smoderation/paper/command/argument/OfflinePlayerArgument.java new file mode 100644 index 0000000..e3e03e3 --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/paper/command/argument/OfflinePlayerArgument.java @@ -0,0 +1,40 @@ +package de.shiewk.smoderation.paper.command.argument; + +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import de.shiewk.smoderation.paper.util.CommandUtil; +import io.papermc.paper.command.brigadier.argument.CustomArgumentType; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.CompletableFuture; + +public final class OfflinePlayerArgument implements CustomArgumentType.Converted { + + @Override + public OfflinePlayer convert(@NotNull String nativeType) throws CommandSyntaxException { + OfflinePlayer player = Bukkit.getOfflinePlayerIfCached(nativeType); + if (player != null){ + return player; + } else { + CommandUtil.error("That player is not cached."); + throw new AssertionError(); // can't happen + } + } + + @Override + public @NotNull ArgumentType getNativeType() { + return StringArgumentType.word(); + } + + @Override + public @NotNull CompletableFuture listSuggestions(@NotNull CommandContext context, @NotNull SuggestionsBuilder builder) { + return builder.buildFuture(); + } + +} diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index 87f513b..7c8d652 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -71,4 +71,7 @@ permissions: description: Allows the player to see vanished players smod.socialspy: default: op - description: Allows the player to enable SocialSpy \ No newline at end of file + description: Allows the player to enable SocialSpy + smod.offlinetp: + default: op + description: Allows the player to teleport themself to offline players \ No newline at end of file