Bukkit 字符串无法正确读取

Bukkit Strings Not Reading Correctly

我正在尝试为 Mincraft Bukkit 服务器创建一个插件,但在读取存储在字符串数组中的命令参数时遇到了一些问题。这是我整个插件的代码。 (这个插件的目的是让你在游戏中把你的名字改成不同的名字。我知道这个已经做了,但是我想重新制作它来练习制作插件......)

Main.java

package me.DarkSun159;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{

    Permission makeNicks = new Permission("makeNicks");

    @Override
    public void onEnable(){
        getServer().getPluginManager().registerEvents(new EventListener(this), this);
        getServer().getPluginManager().addPermission(makeNicks);

        this.getConfig().options().copyDefaults(true);
        this.saveConfig();

        getLogger().info("+------------------------------------+");
        getLogger().info("|DSP's NickName Mod had been enabled.|");
        getLogger().info("+------------------------------------+");
    }

    @Override
    public void onDisable(){
        this.saveConfig();

        getLogger().info("+-------------------------------------+");
        getLogger().info("|DSP's NickName Mod had been disabled.|");
        getLogger().info("+-------------------------------------+");
    }

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

        if(cmd.getName().equalsIgnoreCase("nick") && sender instanceof Player){
            Player player = (Player)sender;

            if(args == null || args.length == 0 || args.length > 1){
                messagePlayer.error(player, "Usage:\n     /nick <nickname>");
                return false;
            }
            else if(args[0] == "Admin" || args[0] == "admin" || args[0] == "Administrator" || args[0] == "administrator" || args[0] == "Mod" || args[0] == "mod" || args[0] == "Moderator" || args[0] == "moderator"){
                messagePlayer.warning(player, "You cannot use " + args[0] + " as you nickname...");
                return false;
            }
            else if(args[0] == "normal"){
                this.getConfig().getConfigurationSection(player.getName()).set("", null);
                messagePlayer.success(player, "You name has been set back to " + player.getName() + "!");
                this.saveConfig();
                return true;
            }
            else{
                this.getConfig().addDefault(player.getName(), args[0]);
                messagePlayer.success(player, "You nickname has been changed to " + args[0] + "!");
                this.saveConfig();
                return true;
            }
        }

        return false;
    }

}

EventListener.java

package me.DarkSun159;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class EventListener implements Listener{
    Main plugin;

    public EventListener(Main plugin){
        this.plugin = plugin;
    }

    @EventHandler
    public void onSpeech(AsyncPlayerChatEvent e){
        Player player = e.getPlayer();
        String message;

        if(plugin.getConfig().contains(player.getName())){
            message = ChatColor.LIGHT_PURPLE + "[" + plugin.getConfig().get(player.getName()) + "] " + ChatColor.RESET + e.getMessage();

            for(Player p : Bukkit.getOnlinePlayers()){
                p.sendMessage(message);
            }

            e.setCancelled(true);
        }


    }

}

现在,大部分都可以正常工作(我还在开发它,所以它可能看起来不完整),但是当你把它加载到你的服务器时,它会让你把你的名字改成我告诉你的名字它不允许你(Admin,admin,Mod,mod,Administrator,administrator,Moderator,moderator,normal)。我已经查看我的代码一千遍了,但我仍然不明白为什么它允许人们将他们的名字更改为禁止的名字。

args[0] == "Admin" || args[0] == "admin" ...是你的问题。

不要检查 String== 是否相等,使用 String.equals()

args[0].equals("Admin") 会 return trueargs[0]Adminargs[0] == "Admin" 不会。这是因为 == 检查值是否是同一个对象。

此外,检查 Admin 然后 admin 是次优的。例如,用户可以输入 ADMIN 并摆脱它。就个人而言,要消除区分大小写,我会执行以下操作。 args[0].toLowerCase().equals("admin")。这意味着无论用户输入 adminADMINAdminaDmIn 还是任何其他大小写组合,都将被拒绝。

我希望这能消除您的挫败感。

在一个相当独立的说明中,我过去有 Bukkit 插件开发,我发现 return false 最适合控制台,并且你应该始终 return true 给用户,因为,CB 的旧版本(不确定新版本)将在聊天中向用户打印 plugin.yml 中定义的命令用法。如果您正在处理自己的错误消息,请关闭 CraftBukkit 的,如果命令发送者是用户而不是控制台,则 return true