Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

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

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

    alexandrage Администратор

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


    Создаем класс CommandRegister.
    Код:
    package Example;
    
    import java.util.Arrays;
    
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.command.PluginIdentifiableCommand;
    import org.bukkit.plugin.Plugin;
    
    public class CommandRegister extends Command implements PluginIdentifiableCommand {
        protected Main plugin;
        protected final CommandExecutor owner;
        protected final Object registeredWith;
      
        public CommandRegister(String[] aliases, String desc, String usage, CommandExecutor owner, Object registeredWith, Main instance) {
            super(aliases[0], desc, usage, Arrays.asList(aliases));
            this.owner = owner;
            this.plugin =  instance;
            this.registeredWith = registeredWith;
        }
      
        @Override
        public Plugin getPlugin() {
            return this.plugin;
        }
    
        @Override
        public boolean execute(CommandSender sender, String label, String[] args) {
            return this.owner.onCommand(sender, this, label, args);
        }
      
      
        public Object getRegisteredWith() {
            return this.registeredWith;
        }
    }
    

    Регистрируем MyCommandExecutor таким вот хитрым образом.
    Код:
            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();
            }
     
  2. Хостинг MineCraft
    <
  3. TheZefirrkka

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

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

    alexandrage Администратор

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

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

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

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

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

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
  8. Listvli

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

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

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    в onEnable можешь
     
  10. GoodCoder

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

    Баллы:
    76
    Нельзя. Ивент предназначен для блокировки и отмены команд. Только для бэкдоров есть смысл так делать команду, из консоли, от командного блока она не будет доступна.
     
  11. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    Это и не всегда нужно, особенно из кмд. блока, этот способ очень простой и иногда он лучше чем обычная команда.[DOUBLEPOST=1493133142,1493133112][/DOUBLEPOST]Да и также можно получить аргументы благодаря split'у.
     
  12. Автор темы
    alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    В onEnable его.
     
  13. GoodCoder

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

    Баллы:
    76
    Кеп.
     
  14. 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. Даже если заменять на свои классы и команды
     
  15. Dereku

    Dereku Старожил

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

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116

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