Java Elseif从不在onCommand中执行

Java Elseif从不在onCommand中执行,java,bukkit,Java,Bukkit,我正在尝试制作一个插件,将“变量”添加到命令中。您可以使用/set(variablename)(value)来设置一个值,然后您可以使用带有var:(varname)的任何命令(例如,您可以执行/set foo bar,然后执行“/说var:foo”,在聊天中它会说“bar”)出于某种原因my else if(Arrays.toString(args).contains("var:")) { 要么从不执行,要么总是返回false。这是为什么?我如何修复它? 主要插件类: public clas

我正在尝试制作一个插件,将“变量”添加到命令中。您可以使用/set(variablename)(value)来设置一个值,然后您可以使用带有var:(varname)的任何命令(例如,您可以执行/set foo bar,然后执行“/说var:foo”,在聊天中它会说“bar”)出于某种原因my

else if(Arrays.toString(args).contains("var:")) {
要么从不执行,要么总是返回false。这是为什么?我如何修复它?

主要插件类:

public class main extends JavaPlugin implements Listener {
    List<String> vars = new ArrayList<String>();
     public void onEnable()
     {
       getLogger();
       getServer().getPluginManager().registerEvents(this, this);
       Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Variables Enabled!");
     }

     public void onDisable()
     {
        Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "Variables Disabled!");
     }

    @Override
    public boolean onCommand(CommandSender sender, Command command,
            String label, String[] args) {
            if(command.getName().equalsIgnoreCase("set")) {
                vars.add(args[0] + ":" + args[1]);
                sender.sendMessage(ChatColor.RED + "Variable " + args[0] + " added with the value " + args[1]);
            }else if(Arrays.toString(args).contains("var:")) { //Line problem is on
                int size = args.length;
                   for (int i=0; i<size; i++)
                   {
                      if(args[i].contains("var:")) {
                          String[] parts = args[i].split(":");
                          for (String temp : vars) {
                              String[] varname = temp.split(":");
                              if(varname[1].equals(parts[1])) {
                                  args[i] = varname[2];
                              }
                          }
                      }
                   }

            }
        return super.onCommand(sender, command, label, args);
    }

     }
public类主扩展JavaPlugin实现监听器{
List vars=new ArrayList();
public void onEnable()
{
getLogger();
getServer().getPluginManager().registerEvents(这个,这个);
Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN+“变量已启用!”);
}
公共无效不可撤销()
{
Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN+“变量已禁用!”);
}
@凌驾
公共布尔onCommand(CommandSender,Command命令,
字符串标签,字符串[]args){
if(command.getName().equalsIgnoreCase(“set”)){
vars.add(args[0]+”:“+args[1]);
sender.sendMessage(ChatColor.RED+“变量”+args[0]+“添加值”+args[1]);
}else if(Arrays.toString(args.contains)(“var:”){//行问题已打开
int size=args.length;

对于(int i=0;i,您的问题似乎不在于
else if
,而在于最里面的
if
。您可以将命令的变量名(foo)与以前存储的值(bar)进行比较。请改为尝试:

                          if(varname[0].equals(parts[1])) {
                              args[i] = varname[1];
                          }

当然,使用更合适的集合类型会更好。例如,
vars
可能是一个
Map
我解决了自己的问题!问题是onCommand仅在从插件获取命令时才会触发。为此,我必须使用playerCommandPreprepreprocessevent。

onCommand()方法不允许您过滤播放器发送的所有命令请求,它只允许您实现plugin.yml中列出的命令。我将使用PlayerCommandPrepreprocessEvent,它允许您“捕获”玩家尝试执行的所有命令,在它们被特定插件处理并更改命令以及后续参数之前

我还将使用HashMap,而不是将字符串变量的名称和值相互映射的列表。下面是我测试的一些示例代码:

//Somewhere else
private HashMap<String, String> variableMap = new HashMap<String, String>();

public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
    if (command.getName().equalsIgnoreCase("set")) {
        if (args.length == 2) { //With this approach, the first argument is the name, the second the value
            variableMap.put(args[0], args[1]);
            sender.sendMessage(ChatColor.GREEN + "Variable " + args[0] + " now has value " + args[1] + ".");
        }
    }
    return false;
}

@EventHandler
public void onCommand(PlayerCommandPreprocessEvent event) {
    String[] args = event.getMessage().split(" "); //Get the message and split it to get the arguments
    String newMessage = args[0]; //In this example I preserve the original command, so I'm not changing the first argument
    for (int i = 1; i < args.length; i++) {
        if (args[i].toLowerCase().startsWith("var:")) { //If it starts with "var:", case insensitive...
            String[] parts = args[i].split(":");
            if (parts.length == 2 && variableMap.containsKey(parts[1])) { //If it has two parts, and the variable map contains the name of that variable
                newMessage += " " + variableMap.get(parts[1]); //Add the variable name and not the original argument
                continue;
            }
        }
        newMessage += " " + args[i]; //If the argument is not a variable or it is wrongly formatted, add the original argument to the combined string
    }
    event.setMessage(newMessage); //Set the new command message or contents
}
//其他地方
私有HashMap variableMap=新HashMap();
公共布尔onCommand(CommandSender-sender、Command命令、字符串别名、字符串[]args){
if(command.getName().equalsIgnoreCase(“set”)){
如果使用这种方法(args.length==2){//,则第一个参数是名称,第二个参数是值
variableMap.put(args[0],args[1]);
sender.sendMessage(ChatColor.GREEN+“变量”+args[0]+“现在有值”+args[1]+);
}
}
返回false;
}
@事件处理程序
命令上的公共无效(PlayerCommandPrepreprocessEvent事件){
String[]args=event.getMessage().split(“”;//获取消息并将其拆分以获取参数
String newMessage=args[0];//在本例中,我保留了原始命令,因此不更改第一个参数
对于(int i=1;i
Arrays.toString(args)的值是多少?在您的方法开始时,能否尝试将
Arrays.toString(…)…
Arrays.asList(args).contains(“var:”)
@amitfarag在这种情况下,恐怕
asList
不起作用,因为参数值仅在空格上分割,因此具有值上面示例中的“var:foo”。首先,感谢您的回答。我似乎有一个lua遗留问题:P(lua索引为1),但除了这个问题,else if也有一个问题。我将更新我的答案,说明原因。然后请尝试记录您的
数组。toString(args)
在JFPicard建议的
if
-语句之前。我已经编辑了我的答案,我认为这就是它不起作用的原因