Bukkit字符串没有正确阅读

时间:2015-05-23 00:58:34

标签: java arrays string bukkit

我正在尝试为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);
        }


    }

}

现在,它的大部分工作没有问题(我仍在开发它,所以它可能看起来不完整),但是当你在服务器中加载它时,它将允许你将你的名字改为我告诉它的名字不要让你(管理员,管理员,Mod,mod,管理员,管理员,主持人,主持人,正常)。我已经看过我的代码一千次,但我仍然不明白为什么它会让人们将他们的名字改为禁止的名字。

1 个答案:

答案 0 :(得分:1)

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

请勿使用String检查==平等,使用String.equals()

args[0].equals("Admin")true时,

args[0]将返回Admin,但args[0] == "Admin"则不会。这是因为==检查值是否是同一个对象。

此外,检查Admin然后检查admin是次优的。例如,用户可以输入ADMIN,然后侥幸逃脱。就个人而言,为了消除区分大小写,我会做类似以下的事情。 args[0].toLowerCase().equals("admin")。这意味着,无论用户是输入adminADMINAdminaDmIn还是其他任何案例组合,都会被拒绝。

我希望这会让你感到沮丧。

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