如何获取玩家执行的命令的输出?

问题描述 投票:0回答:1

我正在纸上做一个插件,我需要在执行命令时获取玩家的输出,例如,如果玩家使用: / tpa 获取如下输出:“在服务器中时,将传送请求发送到”控制台它只显示“用户发出命令:/tpa”

package cherry.plugins;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerChatEvent;

public class CommandLogger implements Listener {
    private final CherryCostume plugin;

    // Variable para capturar la salida del comando antes de que se envíe al chat
    private String currentCommandSender;
    private String lastCommandOutput;

    public CommandLogger(CherryCostume plugin) {
        this.plugin = plugin;
        Bukkit.getPluginManager().registerEvents(this, plugin);
    }

    @EventHandler
    public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
        String command = event.getMessage().substring(1); // Remueve la barra inicial
        String playerName = event.getPlayer().getName();

        // Verificamos si el comando es de tipo /tell o /msg
        if (command.startsWith("tell") || command.startsWith("msg")) {
            String[] commandParts = command.split(" ", 3);
            if (commandParts.length >= 3) {
                String targetPlayer = commandParts[1]; // Jugador objetivo
                String message = commandParts[2]; // Mensaje del comando

                // Guardamos el jugador que envió el comando para comparar más tarde
                currentCommandSender = playerName;

                // Logueamos el comando ejecutado
                plugin.getLogger().info("Comando ejecutado: " + command);
                plugin.getLogger().info("Salida: Comando enviado a " + targetPlayer + " con el mensaje: " + message);
            }
        }
    }

    @EventHandler
    public void onPlayerChat(AsyncPlayerChatEvent event) {
        String message = event.getMessage();

        // Verificamos si el mensaje corresponde a un susurro
        if (message.startsWith("§7[§8[.*§r")) {
            String sender = event.getPlayer().getName();

            // Solo registramos el mensaje de chat si es de un jugador que acaba de ejecutar un comando
            if (sender.equals(currentCommandSender)) {
                // Capturamos la salida exacta como aparece en el chat
                lastCommandOutput = message;

                // Logueamos la salida exacta del chat generada por el comando
                plugin.getLogger().info("Salida: " + lastCommandOutput);
            }
        }
    }
}````



java minecraft bukkit spigot
1个回答
0
投票

您处理命令的方式不正确。要使用 spigot API 创建命令,您需要首先在

plugin.yml
中注册您的命令。将这些行添加到其中:

commands:
  tpa:

完成此操作后,您需要为该命令创建一个类。这个类必须实现

CommandExecutor
(你可以在类名后写
implements CommandExecutor
)。这个实现需要一个方法:

@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {

}

在此方法中,您必须放置玩家运行命令时要执行的代码。

CommandSender
可以通过执行
Player
来转换为
Player player = (Player) sender;

关于您关于控制台和玩家消息的问题,服务器自动打印“玩家发出命令/命令”。如果您想向运行该命令的玩家显示消息,您可以创建如前所示的

Player
,然后使用
player.sendMessage("message")

完成所有这些后,您需要在主插件类的 onEnable() 中注册命令。您可以通过在插件的主类(扩展

getCommand("tpa").setExecutor(new TpaCommand(), this);
的类)中编写
JavaPlugin
来完成此操作 .

希望这能回答您的问题。

© www.soinside.com 2019 - 2025. All rights reserved.