Untitled

 avatar
unknown
plain_text
3 months ago
2.0 kB
10
Indexable
package pl.chunklock.core.command.impl.argument;

import java.util.ArrayList;
import java.util.List;
import org.bukkit.Chunk;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import studio.mevera.imperat.BukkitCommandSource;
import studio.mevera.imperat.command.arguments.type.ArgumentType;
import studio.mevera.imperat.context.CommandContext;
import studio.mevera.imperat.exception.CommandException;
import studio.mevera.imperat.providers.SuggestionProvider;

public class ChunkArgumentType extends ArgumentType<BukkitCommandSource, Chunk> {

  @Override
  public Chunk parse(@NotNull CommandContext<BukkitCommandSource> context,
      @NotNull String input) throws CommandException {
    final BukkitCommandSource source = context.source();

    if (source.isConsole()) {
      throw new CommandException("Only players can specify relative chunks.");
    }

    final Player player = source.asPlayer();

    if (input.equalsIgnoreCase("~") || input.equalsIgnoreCase("here")) {
      return player.getLocation().getChunk();
    }

    final String[] parts = input.split(",");
    if (parts.length != 2) {
      throw new CommandException("Invalid chunk format. Use x,z or ~");
    }

    try {
      final int x = Integer.parseInt(parts[0]);
      final int z = Integer.parseInt(parts[1]);
      return player.getWorld().getChunkAt(x, z);
    } catch (final NumberFormatException e) {
      throw new CommandException("Chunk coordinates must be integers.");
    }
  }

  @Override
  public SuggestionProvider<BukkitCommandSource> getSuggestionProvider() {
    return (ctx, arg) -> {
      final BukkitCommandSource source = ctx.source();
      final List<String> suggestions = new ArrayList<>();
      suggestions.add("~");

      final Player player = source.asPlayer();
      final Chunk chunk = player.getLocation().getChunk();
      suggestions.add(chunk.getX() + "," + chunk.getZ());

      return suggestions;
    };
  }
}
Editor is loading...
Leave a Comment