Java Elseif从不在onCommand中执行
我正在尝试制作一个插件,将“变量”添加到命令中。您可以使用/set(variablename)(value)来设置一个值,然后您可以使用带有var:(varname)的任何命令(例如,您可以执行/set foo bar,然后执行“/说var:foo”,在聊天中它会说“bar”)出于某种原因myJava 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
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
-语句之前。我已经编辑了我的答案,我认为这就是它不起作用的原因