当前位置: 首页 > 知识库问答 >
问题:

Bukkit插件踢原因只使用第一个词

琴元凯
2023-03-14

所以我正在为我的服务器制作一个 kick/ban 命令,格式是 /kick 名称原因。我让它一切工作,但原因只能是1个单词和任何排除它的东西,例如/kick BattleDash你好世界会说BattleDash被踢了你好

这是我的代码:

    if (cmd.getName().equalsIgnoreCase("kick") && sender instanceof Player) {

        Player player = (Player) sender;

        int length = args.length;

        if (length >= 2) {

            boolean playerFound = false;

            for (Player playerToKick : Bukkit.getServer().getOnlinePlayers()) {
                if(playerToKick.getName().equalsIgnoreCase(args[0])) {
                    playerToKick.kickPlayer(ChatColor.RED + "Kicked by Administrator " + player.getName() + "\nReason: " + args[1]);
                    player.sendMessage(ChatColor.RED + "[BATTLEDASHLOGS]: Kicked player " + playerToKick.getName() + "succesfully!");
                    break;
                }
            }

            if (playerFound == false) {
                player.sendMessage(ChatColor.RED + "[BATTLEDASHLOGS]: " + args[0] + " was not found!");
            }

        } else player.sendMessage(ChatColor.RED + "[BATTLEDASHLOGS]: Incorrect arguments!" + ChatColor.RED + " /kick <PlayerName> <reason>");

    return true;

}

(此外,如果您不包括一个原因,它会在聊天中出现内部错误,并在控制台中发生异常)

共有1个答案

林哲茂
2023-03-14

您的代码之所以这样做,是因为它被编程的方式。

如果我们看一下论证的那一行:

playerToKick.kickPlayer(ChatColor.RED + "Kicked by Administrator " + player.getName() + "\nReason: " + args[1]);

我们可以看到您只使用args[1]。如果我们将消息视为数组,问题就很清楚了:

在位置 0 处(记住数组从 0 开始):战斗哈希

1:你好

2:世界

当您只将参数[1]添加到消息中时,将只使用hello!相反,我们需要做的是使用所有的参数。这样做的一种方法是:

// First, transform your array into a list, so it's easier to understand
List<String> arguments = new ArrayList<>(args);

String playerName = arguments.get(0);  // Get the player name
arguments.remove(0);   // Remove the player name from our arguments list, we don't want it in the message

String message = String.join(" ", arguments);  // Combine all the other arguments into a message
 类似资料:
  • 当我试图在我的bukkit服务器中加载插件时,我遇到了NullPointerExc的问题,但在Eclipse中没有错误。我的插件是Rush插件,很多东西没有使用/丢失。错误是这样的: 以下是我的代码:

  • 我做了一个插件,可以跟踪你在《我的世界》开采的钻石数量,并保存到config.yml文件中。但是我的代码似乎不工作,我不知道为什么? 我已经在setConfig参数中尝试了1,现在我已经切换到这个,它似乎仍然不起作用。我还在我的配置.yml文件中预定义了菱形。 当玩家执行命令/mydiamonds时,它会打印出“你已经开采了(a)钻石”。但不管你开采了多少钻石,它总是打印出零。

  • 我对代码有问题,因为它不能正常工作。这部分代码在第一个播放器上运行时有效 当第二个玩家接触水时,什么也没有发生。没有错误。下面是完整的代码: 我很确定第二个玩家的“结束”是真的,所以它不会这样做。

  • 我正在尝试恢复一个插件,但发现了一个错误: 我做的一切都是对的!plugin.yml外部罐子和出口,但仍然不起作用。知道为什么吗?

  • 在我的Spigot插件中,我使用重复任务每隔0.5秒更新一次玩家的库存。长时间运行代码后,我会得到。 我做了一些调试并使用JProfiler来查看导致内存泄漏的原因,并注意到ItemStacks的数量不断增加。堆遍历器显示这是由更新库存的代码引起的。这是当前代码: 经过更多的调试,我发现删除了将停止增加的itemStack数量。 什么可能导致内存泄漏? 编辑: 我已经更改了代码,不再为每个玻璃窗格

  • 我想把玩家点击的块的位置保存到两个变量中。 我尝试在使用该项目后触发一个事件,但只有当我在空中单击时才会生成该事件。 如果(p.getiteminhand().gettype()==Material.blaze_rod){System.out.println(“test”);} 我也尝试了这个设计,但代码仍然不能正常工作: 如果((p.getiteminhand().gettype()==Mate