Bukkit зарегистрировать команды во время выполнения - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь зарегистрировать команду bukkit для другой команды.

Итак, я хочу сделать «/ command1» для регистрации «/ command2», чтобы команда 2 могла выполняться только после того, как я выполнил команду 1.

Я пытался сделать это около 10 часов, на данный момент я могу зарегистрировать команду, не внося ее в plugin.yml, и это работает, просто вторая команда не регистрируется.

Основной класс:

import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandMap;
import org.bukkit.plugin.SimplePluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import java.lang.reflect.Field;

public class Main extends JavaPlugin {

@Getter
CommandMap commandMap;
@Override
public void onEnable() {
    loadCommandMap();
    this.commandMap.register("command1", new FirstCommand(this));
}


private void loadCommandMap() {
    try {
        if (Bukkit.getPluginManager() instanceof SimplePluginManager) {
            Field f = SimplePluginManager.class.getDeclaredField("commandMap");
            f.setAccessible(true);
            this.commandMap = (CommandMap) f.get(Bukkit.getPluginManager());
        }
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
}

FirstCommand:

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;

public class FirstCommand extends Command {
private Main plugin;

public FirstCommand(Main plugin) {
    super("command1");
    this.plugin = plugin;
}

@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
    plugin.getCommandMap().register("command2", new SecondCommand());
    sender.sendMessage("Command 1.");
    return true;
}
}

Вторая команда:

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;

public class SecondCommand extends Command {
public SecondCommand() {
    super("command2");
}

@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
    sender.sendMessage("Command 2");
    return true;
}
}

Я действительно надеюсь, что кто-то знает, почему первая команда регистрируется, а вторая - нет.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Я не совсем понимаю, о чем вы говорите, но я думаю, что это может вам помочь ...

Учебное пособие по Bukkit - Регистрация команд во время выполнения

0 голосов
/ 25 августа 2018

Вы можете попытаться не зарегистрировать их во время выполнения, но включить их во время выполнения.

Вы можете использовать глобальные статические переменные (например, в основнойкласс вашего приложения), например,

// in your class "Main"
public static boolean isCommand2Enabled = false;

и когда вызывается command1, вы устанавливаете для него значение true

Main.isCommand2Enabled = true;

Ваша команда2 теперь должна только проверять, активирована ли она ужеи может быть выполнено:

if(!Main.isCommand2Enabled) {
   // I am not activated yet and must return
   return false;
}

Но я не совсем уверен, если вы попытаетесь сначала определить имя command2 при выполнении command1 (переменное имя команды).Тогда вам, возможно, следует использовать фиксированную команду и сделать переменную только соответствующего аргумента.

...