9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-30 04:09:09 +00:00

Fix sakura debug command tab completion

This commit is contained in:
Samsuik
2025-06-23 11:50:44 +01:00
parent 714e2ffefe
commit 8ad4fe843a
8 changed files with 58 additions and 60 deletions

View File

@@ -66,23 +66,18 @@ public abstract class BaseMenuCommand extends BaseSubCommand {
return Collections.emptyList();
}
final Command command = SakuraCommands.getCommand(args[0]);
final List<String> completions = new ArrayList<>();
if (command != null && args.length > 1) {
final String[] newArgs = Arrays.copyOfRange(args, 1, args.length);
completions.addAll(command.tabComplete(sender, alias, newArgs));
} else {
for (final Command subCommand : SakuraCommands.SUB_COMMANDS) {
final String commandName = subCommand.getName();
if (commandName.startsWith(args[0])) {
completions.add(commandName);
}
for (final Command subCommand : this.subCommands()) {
final String commandName = subCommand.getName();
if (commandName.startsWith(args[0])) {
completions.add(commandName);
}
if (commandName.equalsIgnoreCase(args[0])) {
final String[] newArgs = Arrays.copyOfRange(args, 1, args.length);
return subCommand.tabComplete(sender, alias, newArgs);
}
}
final String lastArg = args[args.length - 1];
return completions.stream()
.filter(result -> result.startsWith(lastArg))
.toList();
return completions;
}
}

View File

@@ -42,10 +42,6 @@ public abstract class BaseSubCommand extends Command {
return completions;
}
public void sendPlayerOnlyMessage(CommandSender sender) {
sender.sendRichMessage("<red>This command can only be ran by players");
}
protected final Optional<Integer> parseInt(String[] args, int index) {
return this.parse(args, index, Integer::parseInt);
}

View File

@@ -0,0 +1,22 @@
package me.samsuik.sakura.command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jspecify.annotations.NullMarked;
@NullMarked
public abstract class PlayerOnlySubCommand extends BaseSubCommand {
public PlayerOnlySubCommand(String name) {
super(name);
}
public abstract void execute(Player player, String[] args);
public final void execute(CommandSender sender, String[] args) {
if (sender instanceof Player player) {
this.execute(player, args);
} else {
sender.sendRichMessage("<red>This command can only be used by players");
}
}
}

View File

@@ -7,7 +7,6 @@ import me.samsuik.sakura.player.visibility.VisibilityTypes;
import net.minecraft.server.MinecraftServer;
import org.bukkit.command.Command;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
import java.util.HashMap;
import java.util.HashSet;
@@ -39,12 +38,4 @@ public final class SakuraCommands {
server.server.getCommandMap().register(name, "sakura", command);
});
}
@Nullable
public static Command getCommand(String name) {
return SUB_COMMANDS.stream()
.filter(cmd -> cmd.getName().equalsIgnoreCase(name))
.findFirst()
.orElse(null);
}
}

View File

@@ -1,13 +1,12 @@
package me.samsuik.sakura.command.subcommands;
import me.samsuik.sakura.command.BaseSubCommand;
import me.samsuik.sakura.command.PlayerOnlySubCommand;
import me.samsuik.sakura.player.visibility.VisibilityGui;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jspecify.annotations.NullMarked;
@NullMarked
public final class FPSCommand extends BaseSubCommand {
public final class FPSCommand extends PlayerOnlySubCommand {
private final VisibilityGui visibilityGui = new VisibilityGui();
public FPSCommand(String name) {
@@ -15,9 +14,7 @@ public final class FPSCommand extends BaseSubCommand {
}
@Override
public void execute(CommandSender sender, String[] args) {
if (sender instanceof Player player) {
this.visibilityGui.showTo(player);
}
public void execute(Player player, String[] args) {
this.visibilityGui.showTo(player);
}
}

View File

@@ -1,19 +1,18 @@
package me.samsuik.sakura.command.subcommands;
import me.samsuik.sakura.command.BaseSubCommand;
import me.samsuik.sakura.command.PlayerOnlySubCommand;
import me.samsuik.sakura.configuration.GlobalConfiguration;
import me.samsuik.sakura.player.visibility.VisibilitySettings;
import me.samsuik.sakura.player.visibility.VisibilityState;
import me.samsuik.sakura.player.visibility.VisibilityType;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jspecify.annotations.NullMarked;
import java.util.Arrays;
@NullMarked
public final class VisualCommand extends BaseSubCommand {
public final class VisualCommand extends PlayerOnlySubCommand {
private final VisibilityType type;
public VisualCommand(VisibilityType type, String... aliases) {
@@ -23,11 +22,7 @@ public final class VisualCommand extends BaseSubCommand {
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!(sender instanceof Player player)) {
return;
}
public void execute(Player player, String[] args) {
VisibilitySettings settings = player.getVisibility();
VisibilityState state = settings.toggle(type);

View File

@@ -1,19 +1,19 @@
package me.samsuik.sakura.command.subcommands.debug;
import me.samsuik.sakura.command.BaseSubCommand;
import me.samsuik.sakura.command.PlayerOnlySubCommand;
import me.samsuik.sakura.local.LocalRegion;
import me.samsuik.sakura.local.storage.LocalStorageHandler;
import me.samsuik.sakura.local.storage.LocalValueStorage;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jspecify.annotations.NullMarked;
import java.util.List;
import java.util.Optional;
@NullMarked
public final class DebugLocalRegions extends BaseSubCommand {
public final class DebugLocalRegions extends PlayerOnlySubCommand {
private static final int DEFAULT_REGION_SIZE = 16;
public DebugLocalRegions(String name) {
@@ -21,9 +21,8 @@ public final class DebugLocalRegions extends BaseSubCommand {
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!(sender instanceof Player player)) {
this.sendPlayerOnlyMessage(sender);
public void execute(Player player, String[] args) {
if (args.length == 0) {
return;
}
@@ -34,14 +33,18 @@ public final class DebugLocalRegions extends BaseSubCommand {
final int blockZ = location.getBlockZ();
final Optional<LocalRegion> currentRegion = storageHandler.locate(blockX, blockZ);
if ("create".equalsIgnoreCase(args[0])) {
if ("create".equalsIgnoreCase(args[0]) && args.length > 1) {
final int size = parseInt(args, 1).orElse(DEFAULT_REGION_SIZE);
final LocalRegion region = LocalRegion.at(blockX, blockZ, size);
storageHandler.put(region, new LocalValueStorage());
if (currentRegion.isPresent()) {
player.sendRichMessage("<red>regions cannot overlap");
} else {
storageHandler.put(region, new LocalValueStorage());
}
}
if ("get".equalsIgnoreCase(args[0])) {
sender.sendRichMessage("<red>" + (currentRegion.isPresent() ? currentRegion.get() : "not inside of a region"));
player.sendRichMessage("<red>" + (currentRegion.isPresent() ? currentRegion.get() : "not inside of a region"));
}
if (currentRegion.isPresent()) {
@@ -51,4 +54,9 @@ public final class DebugLocalRegions extends BaseSubCommand {
}
}
}
@Override
public void tabComplete(List<String> list, String[] args) throws IllegalArgumentException {
list.addAll(List.of("create", "get", "delete"));
}
}

View File

@@ -1,6 +1,6 @@
package me.samsuik.sakura.command.subcommands.debug;
import me.samsuik.sakura.command.BaseSubCommand;
import me.samsuik.sakura.command.PlayerOnlySubCommand;
import me.samsuik.sakura.redstone.RedstoneNetwork;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerPlayer;
@@ -8,7 +8,6 @@ import net.minecraft.world.level.Level;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.craftbukkit.util.CraftLocation;
import org.bukkit.entity.Player;
@@ -19,18 +18,13 @@ import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
@NullMarked
public final class DebugRedstoneCache extends BaseSubCommand {
public final class DebugRedstoneCache extends PlayerOnlySubCommand {
public DebugRedstoneCache(String name) {
super(name);
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!(sender instanceof Player player)) {
this.sendPlayerOnlyMessage(sender);
return;
}
public void execute(Player player, String[] args) {
ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle();
Level level = nmsPlayer.level();
Set<Location> locations = new HashSet<>();