标签 bukkit 下的文章

在使用 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

首先是你要在插件的 src/ 文件夹里面添加一个配置文件, 比如 qaq.yml,里面填写上默认配置的内容。

然后呢,在第一次启动的时候,让 bukkit 把你 jar 包里的这个配置文件保存到 plugins/ 里面

// 这里面的 false 意思是, 如果这个文件已经存在的话就不要替换它
saveResource("<文件名>", false);

下一步,你得把文件的内容读出来:

// 读文件
File file = new File(this.getDataFolder(), "<文件名>");

最后一步是转为 YamlConfiguration

// 这个 yamlConfiguration 就是YAML配置对象了
YamlConfiguration yamlConfiguration = YamlConfiguration.loadConfiguration(file);
P.S. 原标题 Creating multiple config files & using them