我正在尝试为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,管理员,管理员,主持人,主持人,正常)。我已经看过我的代码一千次,但我仍然不明白为什么它会让人们将他们的名字改为禁止的名字。
答案 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")
。这意味着,无论用户是输入admin
,ADMIN
,Admin
,aDmIn
还是其他任何案例组合,都会被拒绝。
我希望这会让你感到沮丧。
在一个相当单独的说明中,我过去使用Bukkit插件开发,我发现return false
最适合控制台,并且您应始终return true
给用户,因为CB的确定版本(不确定更新版本)将打印命令用法,因为它在plugin.yml
中定义给聊天中的用户。如果您正在执行自己的错误消息,请关闭CraftBukkit,如果命令发件人是用户,则关注return true
。