本地玩家 Bukkit/Spigot 发展

Local Player Bukkit/Spigot Development

有没有获取本地播放器显示名称的命令。 因此,如果我创建一条聊天消息,所有玩家都会在聊天中看到自己的名字。这可能吗?如何?

不行,你获取不到"local"玩家名,因为谁会运行代码是服务端,不是客户端,所以你获取不到,因为没有本地播放器。但是,您仍然可以为不同的人使用不同的名字发送自定义消息来模拟这种效果。

基于例子,你可以简单的通过/tellraw命令发送消息给你想要发送消息的玩家,例子:

public static void sendMessage(String playerName, String msg) {
        Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),
                "/tellraw " + playerName + " {\"text\":\"" + msg.replaceAll("<playername>", playerName) + "\"}");
}

在这种情况下,我使用 <playername> 作为关键字来引用播放器,因此 Hello <playername> 应该 return Hello yourname... 但是,当您没有 Player 对象时,此解决方案会更好,并且为了不浪费机器的时间来创建它,您可以简单地使用 tellraw ...但是为了简化答案,您可以使用 Player::sendMessage 方法(引用自 bcsb1001).:

public static void sendMessage(Player player, String msg){
    player.sendMessage(msg.replaceAll("<playername>", player.getName()));
}

好的,但我怎样才能将它发送给群组或数组中的每个人?
在这种情况下,您可以为每个玩家使用 for each 循环。

这里是完整代码,用于向每个在线玩家发送问候消息:

public static void sayHelloToEveryone() {
    String msg = "Hello <playername>!";
    for (Player p : Bukkit.getServer().getOnlinePlayers()) {
        p.sendMessage(msg.replaceAll("<playername>", p.getName()));
    }
}

因此,当您使用sayHelloToEveryone()时,它会根据每个人的姓名向他们发送消息:

如果 Steve 和 Ruben 在线,服务器将向两个用户发送不同的消息:
史蒂夫的聊天: Hello Steve!
Ruben 的聊天: Hello Ruben!