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 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
。
我正在尝试为 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 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
。