1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Стартап Регистрируем команды без записи в plugin.yml

Тема в разделе "Разработка плагинов для новичков", создана пользователем alexandrage, 9 апр 2017.

  1. Nikolai_Faint

    Nikolai_Faint Активный участник Пользователь

    Баллы:
    96
    Костыль + Костыль = Плугин.
     
  2. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    Причём тут вообще это? Нам не интересно как ты плагины пишешь.
     
  3. Автор темы
    alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну вообще то тема об регистрации через рефлексию. А как вы это примените уже вам решать.
     
  4. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Для чего в данном случае сохраняется объект, от куда... вызвали создание нового экземпляра класса команды?
    PHP:
    protected final Object registeredWith;
     
  5. Автор темы
    alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Запчать от we. Для чего юзалось хз. Вам это не нужно.
     
  6. DigerNub

    DigerNub Новичок

    Баллы:
    16
    Здравствуйте, Александр! С регистрацией команд разобрались. А не подскажете, пожалуйста, как можно совершить обратный процесс, то есть разрегистрацию команд. Ибо при выгрузке плагина зарегистрированные команды остаются.???
     
  7. Автор темы
    alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Вот так наверное.
    Код:
        public static void unregister(String name) {
            try {
                Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
                field.setAccessible(true);
                CommandMap map = (CommandMap) field.get(Bukkit.getServer());
                Field field2 = SimpleCommandMap.class.getDeclaredField("knownCommands");
                field2.setAccessible(true);
                Map<String, Command> command = (Map<String, Command>) field2.get(map);
                command.get(name).unregister(map);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
  8. Автор темы
    alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Не должно. Если что попробуй прям из Map<String, Command> удалить.
    Код:
        public static void unregister(String name) {
            try {
                Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
                field.setAccessible(true);
                CommandMap map = (CommandMap) field.get(Bukkit.getServer());
                Field field2 = SimpleCommandMap.class.getDeclaredField("knownCommands");
                field2.setAccessible(true);
                Map<String, Command> command = (Map<String, Command>) field2.get(map);
                Command cmd = command.get(name);
                command.remove(cmd.getName());
                for(String tmp : cmd.getAliases()) {
                    command.remove(tmp);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
    Последнее редактирование: 11 апр 2019
  9. DigerNub

    DigerNub Новичок

    Баллы:
    16
    Я просто изменил
    command.get(name).unregister(map); на
    command.remove(name);
    И вроде все заработало!!! Спасибо вам, Александр! И, кстати, как лайкнуть? )
     
  10. Автор темы
    alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Алисасы еще придется удалить. Выше код.
     
  11. DigerNub

    DigerNub Новичок

    Баллы:
    16
    Да, просмотрев ваш код я уже понял это! Еще раз благодарю!
     
  12. ReloGGrc

    ReloGGrc Активный участник Пользователь

    Баллы:
    46
    Имя в Minecraft:
    ALis
    Вопрос, а как добавить TabCompleter?

    Памагити...
     
    Последнее редактирование: 25 дек 2022
  13. Автор темы
    alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Как и в обычных командах. В новых версиях игры для комплита, если регистрация идет не на запуске плагина, а позже, требуется вот такая хитрость.
    Код:
        private static void syncCommands() {
            String version = Bukkit.getServer().getClass().getName().split("\\.")[3];
            try {
                Class<?> server = Class.forName("org.bukkit.craftbukkit." + version + ".CraftServer");
                Method syncCommands = server.getDeclaredMethod("syncCommands");
                syncCommands.setAccessible(true);
                syncCommands.invoke(Bukkit.getServer());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
     

Поделиться этой страницей