package dev.plex.extras.command; import com.google.common.collect.ImmutableList; import dev.plex.command.PlexCommand; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; import dev.plex.extras.TFMExtras; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @CommandParameters(name = "cartsit", usage = "/ ", description = "Sit in nearest minecart. If target is in a minecart already, they will be ejected", aliases = "minecartsit") @CommandPermissions(permission = "plex.tfmextras.cartsit") public class CartSitCommand extends PlexCommand { @Override protected Component execute(@NotNull CommandSender sender, @Nullable Player player, @NotNull String[] args) { if (!(sender instanceof Player) && args.length == 0) { return usage(); } if (args.length == 0) { if (player.isInsideVehicle()) { player.eject(); } List minecart = player.getNearbyEntities(100, 100, 100).stream().filter(entity -> entity.getType() == EntityType.MINECART).collect(Collectors.toList()); if (minecart.isEmpty()) { return MiniMessage.miniMessage().deserialize("Could not find a nearby minecart!"); } Entity entity = findNearestEntity(player, minecart); TFMExtras.plexApi().scheduler().runEntity(entity, () -> entity.addPassenger(player)); return null; } Player target = getNonNullPlayer(args[0]); if (target.isInsideVehicle()) { target.eject(); } List minecart = target.getNearbyEntities(100, 100, 100).stream().filter(entity -> entity.getType() == EntityType.MINECART).collect(Collectors.toList()); if (minecart.isEmpty()) { return MiniMessage.miniMessage().deserialize("Could not find a nearby minecart near " + target.getName() + "!"); } Entity entity = findNearestEntity(target, minecart); TFMExtras.plexApi().scheduler().runEntity(entity, () -> entity.addPassenger(target)); return null; } public Entity findNearestEntity(Player player, List entities) { return entities.stream() .min(Comparator.comparingDouble(entity -> player.getLocation().distanceSquared(entity.getLocation()))) .orElseThrow(); } @Override public @NotNull List smartTabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { return args.length == 1 && silentCheckPermission(sender, this.getPermission()) ? onlinePlayerNames() : ImmutableList.of(); } }