Запомни код
package org.dragons.dragonscommand;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.plugin.java.JavaPlugin;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class DragonsCommand extends JavaPlugin implements CommandExecutor, Listener {

    private final HashMap<UUID, Integer> spamCounter = new HashMap<>();

    @Override
    public void onEnable() {
        saveDefaultConfig();
        this.getCommand("voice").setExecutor(this);
        Bukkit.getPluginManager().registerEvents(this, this);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("voice") && sender instanceof Player) {
            Player player = (Player) sender;
            sendChatWithLinks(player);
            return true;
        }
        return false;
    }

    private void sendChatWithLinks(Player player) {
        // Отправка вводного текста
        String introText = getConfig().getString("voice-command-message.intro-text");
        if (introText != null) {
            player.sendMessage(ChatColor.translateAlternateColorCodes('§', introText));
        }

        // Отправка остальных сообщений
        List<?> messages = getConfig().getList("voice-command-message");
        if (messages != null) {
            for (Object obj : messages) {
                if (obj instanceof Map<?, ?>) {
                    Map<?, ?> map = (Map<?, ?>) obj;
                    if (map.containsKey("parts")) {
                        List<?> parts = (List<?>) map.get("parts");
                        TextComponent message = new TextComponent("");
                        for (Object partObj : parts) {
                            if (partObj instanceof Map<?, ?>) {
                                Map<?, ?> part = (Map<?, ?>) partObj;
                                String text = (String) part.get("text");
                                String link = (String) part.get("link");
                                String hoverText = (String) part.get("hover-text");
                                TextComponent partComponent = new TextComponent(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('§', text)));
                                if (link != null) {
                                    partComponent.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, link));
                                }
                                if (hoverText != null) {
                                    partComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverText).create()));
                                }
                                message.addExtra(partComponent);
                            }
                        }
                        player.spigot().sendMessage(message);
                    }
                }
            }
        }
    }

    private void sendClickableMessage(Player player, String message, String url, String hoverText) {
        TextComponent textComponent = new TextComponent(TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('§', message)));
        textComponent.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, url));
        textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverText).create()));
        player.spigot().sendMessage(textComponent);
    }

    @EventHandler
    public void onBlockPlace(BlockPlaceEvent event) {
        Player player = event.getPlayer();
        int maxHeight = getConfig().getInt("redstone-restrictions.max-height");
        if (event.getBlockPlaced().getType() == Material.REDSTONE_WIRE) {
            if (event.getBlockPlaced().getLocation().getY() <= maxHeight) {
                event.setCancelled(true);
                player.sendMessage(ChatColor.RED + getConfig().getString("redstone-restrictions.restriction-message"));
            }
        }
    }

    @EventHandler
    public void onCommandPreprocess(PlayerCommandPreprocessEvent event) {
        Player player = event.getPlayer();

        spamCounter.putIfAbsent(player.getUniqueId(), 0);
        int count = spamCounter.get(player.getUniqueId());

        int maxCommands = getConfig().getInt("spam-protection.max-commands");
        long cooldown = getConfig().getLong("spam-protection.cooldown");

        if (count >= maxCommands) {
            event.setCancelled(true);
            player.sendMessage(ChatColor.RED + getConfig().getString("spam-protection.spam-message"));
        } else {
            spamCounter.put(player.getUniqueId(), count + 1);
            Bukkit.getScheduler().runTaskLater(this, () -> spamCounter.put(player.getUniqueId(), count), cooldown * 20L);
        }
    }
}

config.yml
voice-command-message:
  intro-text: "§6DragonsGrief §7» §fДобро пожаловать! Здесь вы найдете нужную информацию."
  messages:
    - parts:
        - text: "§6DragonsGrief §7» §b§nforge 1.16.5"
          link: "http://example.com/forge"
          hover-text: "Кликни"
        - text: " §f| §b§nfabric 1.16.5"
          link: "http://example.com/fabric"
          hover-text: "Кликни"
    - parts:
        - text: "§6DragonsGrief §7» §fДругие версии можно найти §b§nтут"
          link: "http://example.com/others"
          hover-text: "Кликни"

spam-protection:
  max-commands: 5 # Максимальное количество команд, которые игрок может ввести за один промежуток времени
  cooldown: 5     # Время в секундах, через которое счетчик спама сбрасывается
  spam-message: "§6DragonsGrief §» §c§lНе спамь!"  # Сообщение, которое отображается игроку, если он превышает лимит команд

# Настройка использования редстоуна
redstone-restrictions:
  max-height: 15  # Максимальная высота, ниже которой нельзя ставить редстоун
  restriction-message: "Вы не можете ставить редстоун ниже высоты 15."  # Сообщение, которое отображается, если игрок пытается поставить редстоун ниже указанной высоты

plugin.yml
name: DragonsCommand
version: 1.0
main: org.dragons.dragonscommand.DragonsCommand
commands:
  voice:
    description: Отправляет сообщение с информацией о голосовом чате.