标签 Java 下的文章

在使用 Bukkit.dispatchCommand(CommandSender sender, String commandLine) 时,可能会遇到需要获取命令返回值的需求。

可是,如果要想获取命令的“返回值”,首先需要明白的一点是,这个返回值实际上只是另一个插件接收到指令输入后,自发向 CommandSender 发送消息的行为。

所以,关键点在于如何捕捉插件向 CommandSender 发消息这一行为。

现在好多教程多推荐使用操作数据包的形式来获取玩家收到的消息,但是这样写有些复杂。

我们注意到在 dispatch command 时需要指定一个 CommandSender 命令发送者,而所有插件在发送消息时,都是发送到这个 CommandSender 里面的。

实际上,可以自己实现一个 CommandSender,我们可以理解成设计一个“打入敌方”的穿山甲。我们要想实现“窃听”,就需要在它耳朵上安装上“窃听器”,即复写它的耳朵: sendMessage() 方法,再把其它插件发送给我们穿山甲的消息,发送给我们自己。

ICommandSender

import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.Plugin;

import java.util.Set;

public class ICommandSender implements CommandSender {
    private String sender_id;
    ICommandSender(String sender_id) {
        // 给我们的穿山甲一个“代号”
        this.sender_id = sender_id;
    }
    @Override
    public void sendMessage(String s) {
        // 将其他插件发送给这个 ICommandSender 的消息转发给我们自己
        ICommandReceiver.receiveMessage(this.sender_id, s);
    }

    @Override
    public void sendMessage(String[] strings) {
        // 将其他插件发送给这个 ICommandSender 的消息转发给我们自己
        ICommandReceiver.receiveMessage(this.sender_id, strings);
    }

    @Override
    .....
}

我们的 ICommandReceiver.receiveMessage(String id, String msg) 就可以窃听到别的插件发送的消息,也就是“命令的返回值”啦。

最终效果(也可以获得完整的颜色字符):

Snipaste_2022-07-27_22-43-54.png