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

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

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

  1. Автор темы
    alexandrage

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

    Баллы:
    173
    И снова немного магии рефлексии.
    Регистрируем команды без записи в plugin.yml.


    Создаем класс CommandRegister.
    PHP:
    package Example;

    import java.lang.reflect.Field;
    import java.util.Arrays;

    import org.bukkit.Bukkit;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandMap;
    import org.bukkit.command.CommandSender;
    import org.bukkit.command.PluginIdentifiableCommand;
    import org.bukkit.plugin.Plugin;

    public class 
    CommandRegister extends Command implements PluginIdentifiableCommand {
        protected 
    Plugin plugin;
        protected final 
    CommandExecutor owner;
        protected final 
    Object registeredWith;

        public 
    CommandRegister(String[] aliasesString descString usageCommandExecutor ownerObject registeredWith,
                
    Plugin plugin2) {
            
    super(aliases[0], descusageArrays.asList(aliases));
            
    this.owner owner;
            
    this.plugin plugin2;
            
    this.registeredWith registeredWith;
        }

        @
    Override
        
    public Plugin getPlugin() {
            return 
    this.plugin;
        }

        @
    Override
        
    public boolean execute(CommandSender senderString labelString[] args) {
            if (!
    this.testPermission(sender)) {
                return 
    true;
            }
            if (
    this.owner.onCommand(senderthislabelargs)) {
                return 
    true;
            } else {
                
    sender.sendMessage(this.usageMessage);
                return 
    false;
            }
        }

        public static 
    void reg(Plugin pluginCommandExecutor cxecutorString[] aliasesString descString usage) {
            try {
                
    CommandRegister reg = new CommandRegister(aliasesdescusagecxecutor, new Object(), plugin);
                
    Field field Bukkit.getServer().getClass().getDeclaredField("commandMap");
                
    field.setAccessible(true);
                
    CommandMap map = (CommandMapfield.get(Bukkit.getServer());
                
    map.register(plugin.getDescription().getName(), reg);
            } catch (
    Exception e) {
                
    e.printStackTrace();
            }
        }
    }

    Регистрируем MyCommandExecutor таким вот хитрым образом.
    PHP:
    CommandRegister.reg(this, new MyCommandExecutor(this), new String[] { "example" }, "example""example");
     
    Последнее редактирование: 17 фев 2022
  2. TheZefirrkka

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

    Баллы:
    76
    А ещё через PlayerCommandPreprocessEvent можно + поверх другой команды можно свою сделать, но команда через таб не отображается, но это тоже можно сделать :3
     
  3. Автор темы
    alexandrage

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

    Баллы:
    173
    С командами на ивенте может случится серьезный казус, когда вдруг ты не смог ее отменить через setCancelled(true); . Да и не самое удобное решение для динамических команд.
     
  4. Saharo4ek

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

    Баллы:
    96
    Имя в Minecraft:
    tin
    То чувство, когда годно.
    Спасибо
     
  5. TheZefirrkka

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

    Баллы:
    76
    Никогда не забывал, для не особо больших команд(например, пишет игрок /stats и ему открывает меню) лучше не юзать это т.к. лишний код.
     
  6. Автор темы
    alexandrage

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

    Баллы:
    173
  7. Listvli

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

    Баллы:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Это куда второй код закидывать?
     
  8. TheZefirrkka

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

    Баллы:
    76
    в onEnable можешь
     
  9. TheZefirrkka

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

    Баллы:
    76
    Это и не всегда нужно, особенно из кмд. блока, этот способ очень простой и иногда он лучше чем обычная команда.
    Да и также можно получить аргументы благодаря split'у.
     
  10. Автор темы
    alexandrage

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

    Баллы:
    173
    В onEnable его.
     
  11. Listvli

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

    Баллы:
    66
    Имя в Minecraft:
    ListvliLiveGames
    Код:
    public class CommandListener extends JavaPlugin implements CommandExecutor {
    
            public void onEnable() {
                try {
                    CommandListener cmd = new CommandListener(this);
                    CommandRegister reg = new CommandRegister(new String[]{"example"}, "example", "example", cmd, new Object(), this);
                    Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
                    field.setAccessible(true);
                    CommandMap map = (CommandMap)field.get(Bukkit.getServer());
                    map.register(this.getDescription().getName(), reg);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    }
    Что-то вроде этого? Бьет ошибку у nem CommandListener и new CommandRegister. Даже если заменять на свои классы и команды
     
  12. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А лучше бы била тебя.
    Хоть бы написал какое исключение тебе выбрасывается.
     
  13. Автор темы
    alexandrage

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

    Баллы:
    173
  14. Exception_Prototype

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

    Баллы:
    96
  15. Автор темы
    alexandrage

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

    Баллы:
    173
  16. demkom

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

    Баллы:
    76
    Имя в Minecraft:
    G_demkom_G
  17. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Чувствую, скоро этот туториал устареет. А именно с выходом 1.13
     
  18. Автор темы
    alexandrage

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

    Баллы:
    173
    Не должно. Ведроапи никогда сильно не меняется.
    Чего не скажешь о плагинах на nms, у них точно батхерд случится. И тебе еще лет 5 заниматься говном :D. Пока все нормальные держат свои сервера.
     
    Последнее редактирование: 27 ноя 2017
  19. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
  20. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku

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