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

Стартап Туториал | Создание плагинов | Spigot/CraftBukkit/Bukkit

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

  1. Larin

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

    Баллы:
    103
    Что такое аннотации? Как сделать свои аннотации? Зачем они нужны? Для чего нужны модификаторы доступа? Что такое ООП? Отличия примитивных от не примитивных типов? Что такое класс? Зачем нужна строка package xxx в самом верху? Что такое метод? Что такое getServer()? Почему надо писать import?
    p.s. аннотация @Override нужна ТОЛЬКО для компилятора, можно переопределять и без нее, но она помогает найти ошибки во время компиляции, если сигнатура метода не совпадает с сигнатурой у метода в суперклассе.
    Я говорю - это очередная, бесполезная статья уровня копипасты. Для таких туториалов нужен минимальный уровень. Из-за таких туториалов плодят 500 тем в час, "ПАЧИМИ НИРАПБАТАЕТ ЕТО".[DOUBLEPOST=1491032325,1491032244][/DOUBLEPOST]
    В любой книге о java - коллекции. Там максимум 80 страниц.
     
  2. Хостинг MineCraft
    <
  3. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Если люди не могут осилить статью хабра на ~10к символов, то о каких 80 стр может идти речь? Для таких людей это как войну и мир прочитать
     
  4. XjCyan1de

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

    Баллы:
    76
    Имя в Minecraft:
    XjCyan1de
    для тех кто вообще новичёк - http://javarush.ru сам там учился
     
  5. vlad123HIOOF

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

    Баллы:
    66
    Имя в Minecraft:
    Mirol_Play
    Код:
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
                Player p = (Player) sender;
                if(sender instanceof Player)
                {
                    if(cmd.getName().equalsIgnoreCase("lab"))
                    {
                       
                        Location loc = p.getLocation();
                        loc.setZ(-20);
                        loc.setX(472);
                        p.setCompassTarget(loc);
                       
                    }
         }
         return true;
        }
    
    }
    При вводе пишет тип команды нету
     
  6. Dymeth

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

    Баллы:
    76
    В plugin.yml команду добавил?
     
  7. vlad123HIOOF

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

    Баллы:
    66
    Имя в Minecraft:
    Mirol_Play
    Делал всё по этому гайду http://rubukkit.org/threads/tutoria...pigot-craftbukkit-bukkit.133861/#post-1438006 ,а в нём об этом даже не писалось . Спасибо что помогли[DOUBLEPOST=1497806261,1497805545][/DOUBLEPOST]
    Вот так ?
    Код:
    commands:
    lab:
     
  8. Slavkaa

    Slavkaa Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Slavok2001
  9. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    [DOUBLEPOST=1498055118,1498054975][/DOUBLEPOST]проффесиональная, розработки.[DOUBLEPOST=1498055298][/DOUBLEPOST]"обьяснишь"
     
  10. Spark108

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

    Баллы:
    66
    Имя в Minecraft:
    Spark108
    @_MasterCapeXD_, отлично сделал. Только вот помести все скриншоты под спойлеры.
     
  11. N0Trix

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

    Баллы:
    46
    Skype:
    dimasikus.dddss
    Имя в Minecraft:
    N0Trix
    в строку public class Main должны дописать extends JavaPlugin.
    Я объяснить зачем начинающим "Дивилоперам" не хочешь ?
     
  12. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Учить интерфейсам надо изучая java и писать плагины уже с каким то базовым набором знаний.
     
  13. N0Trix

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

    Баллы:
    46
    Skype:
    dimasikus.dddss
    Имя в Minecraft:
    N0Trix
    Придёт же начинающий "Дивилопер" который не знает основ и будет задавать эти вопросы... И да такие люди всегда будут появляться на рб... Хотя бы сократить бы их количество.
     
  14. Автор темы
    _MasterCapeXD_

    _MasterCapeXD_ Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    _MasterCapeXD_
    Это форум Bukkit, и глубоко затрагивать именно классы/методы Java здесь нет смысла, для этого есть другие сайты. А тут больше по созданию плагинов на платформе Bukkit/Spigot[DOUBLEPOST=1498120098,1498119220][/DOUBLEPOST]
    Спасибо)
     
  15. Sambon_

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

    Баллы:
    88
    Skype:
    morbla_kun
    Имя в Minecraft:
    Satael
    Имхо годная инструкция.

    Другое дело, что всё портят некоторые "профи", которые, судя по всему, пришли тупо за едой (ибо у меня начал жиром протекать монитор), оставляя вроде как "канстрюгдивнуу гредеку", а годным контентом для многохромосомчатых (на подобии меня) в её резонность её саму не снабдили. Не надо так, кхем.
     
  16. Автор темы
    _MasterCapeXD_

    _MasterCapeXD_ Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    _MasterCapeXD_
    Давно не было продолжения данного туториала, ну и ладно, уже есть)
    Сегодня мы научимся создавать собственные GUI!


    Мы сделаем так, чтобы гуишка открывалась при вводе команды, так мы и вспомним прошлую часть.
    Наш GUI будет менюшкой с двумя иконками - Да и Нет, при нажатии на Да игрок получит ссылку на этот туториал, а при нажатии нет, в чат выведет сообщение:
    Вы отказались от получения ссылки.


    Что-же, начнем. (по просьбе некоторых пользователей, теперь скринов не будет)

    Для начала создадим класс GUIBuilder, и в нем метод addIcon(), чтобы этот метод создавал предметы, которые мы будем устанавливать в GUI. Создавать класс мы уже умеем, так что приступим сразу к коду:
    Код:
    package ya.top.koder.plugin;
    
    import java.util.List;
    
    import org.bukkit.Material;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    
    public class GUIBuilder
    {
       
        public static ItemStack addIcon(Material material, String displayname, List<String> lore)
        {
            ItemStack item = new ItemStack(material);
            ItemMeta meta = item.getItemMeta();
            meta.setDisplayName(displayname);
            meta.setLore(lore);
           
            item.setItemMeta(meta);
           
            return item;
           
        }
    
    }
    
    Мы создали метод addIcon, который использует три аргумента, Предмет material, Строку имени, и список строк - lore (описание предмета). Наш метод возвращает тип ItemStack. В самом теле метода мы создаем экземпляр класса ItemStack, с предметом material (укажем мы предмет уже когда начнем устанавливать предметы в инвентарь), потом мы достаем ItemMeta из нашего предмета item. Когда мы получили мету предмета, мы изменяем ее, устанавливая кастомное имя и описание предмета. После всех этих махинаций мы уже измененную мету вставляем в предмет, после чего возвращаем сам предмет, который уже был обработан методом.

    Теперь создадим наш GUI, для начала мы должны создать команду.
    В классе Main мы регистрируем команду, устанавливаем обработчик команд и создаем сам класс:
    Класс Main:
    Код:
    package ya.top.koder.plugin;
    
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main extends JavaPlugin
    {
       
        public void onEnable()
        {
           
            getLogger().info("Norm");
            getLogger().warning("Not Norm");
            getLogger().severe("Bad");
           
            getServer().getPluginManager().registerEvents(new Join(), this);
            getServer().getPluginCommand("maininfo").setExecutor(new myCommand());
            getServer().getPluginCommand("geturl").setExecutor(new GURLCmd());           
           
        }

    Класс GURLCmd:
    Код:
    package ya.top.koder.plugin;
    
    import java.util.List;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.Inventory;
    
    public class GURLCmd implements CommandExecutor {
       
    
        //Создаем список строк для установки описания
       
        //Для иконки Да
        private List<String> lore1;
        //Для иконки Нет
        private List<String> lore2;
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
        {
            if(sender instanceof Player)
            {
                Player player = (Player) sender;
               
                if(cmd.getName().equalsIgnoreCase("geturl"))
                {
                    Inventory inv = Bukkit.createInventory(null, 9, "§eПолучить ссылку?");
                   
                    lore1.add("§eПодтвердить получение ссылки");
                    lore2.add("§eОтказаться от получения ссылки");
                   
                    //Устанавливаем предметы в инвентарь (первый слот начинается от нуля)
                    inv.setItem(2, GUIBuilder.addIcon(Material.EMERALD_BLOCK, "§aДа", lore1));
                    inv.setItem(6, GUIBuilder.addIcon(Material.REDSTONE_BLOCK, "§cНет", lore2));
                   
                    //Открываем инвентарь
                    player.openInventory(inv);
                }
            }
           
            return true;
        }
    
    }
    Тут все понятно по комментариям. Надеюсь)
    Ну, разве что, как вы видите, мы обратились к классу GUIBuilder и достали из него метод addIcon, и туда установили свои значения.

    Теперь мы должны запретить игроку перетаскивать предметы из инвентаря, для этого мы регистрируем ивент)

    Класс Main:
    Код:
    package ya.top.koder.plugin;
    
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main extends JavaPlugin
    {
       
        public void onEnable()
        {
           
            getLogger().info("Norm");
            getLogger().warning("Not Norm");
            getLogger().severe("Bad");
           
            getServer().getPluginManager().registerEvents(new Join(), this);
            getServer().getPluginManager().registerEvents(new Click(), this);
            getServer().getPluginCommand("maininfo").setExecutor(new myCommand());
            getServer().getPluginCommand("geturl").setExecutor(new GURLCmd());           
           
        }

    Класс Click:
    Код:
    package ya.top.koder.plugin;
    
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    
    public class Click implements Listener
    {
       
        @EventHandler
        public void on(InventoryClickEvent e)
        {
           
            //Проверяем инвентарь
            if(e.getInventory().getTitle().equals("§eПолучить ссылку?"))
            {
                //Если он, то отменяем ивент
                e.setCancelled(true);
               
                //Если игрок кликнул по иконке Да, то:
                if((e.getCurrentItem().getType() == Material.EMERALD_BLOCK) && (e.getCurrentItem().getItemMeta().getDisplayName().equals("§aДа")))
                {
                    //Проверяем, есть ли это игрок
                    if(e.getWhoClicked() instanceof Player)
                    {
                        //Если да, устанавливаем игрока как того, кто кликнул и отправляем сообщение
                        Player p = (Player) e.getWhoClicked();
                        p.sendMessage("§6http://rubukkit.org/threads/tutorial-sozdanie-plaginov-spigot-craftbukkit-bukkit.133861/page-3");
                    }
                //Или если игрок кликнул по иконке Нет, то:
                } else if((e.getCurrentItem().getType() == Material.REDSTONE_BLOCK) && (e.getCurrentItem().getItemMeta().getDisplayName().equals("§cНет")))
                {
                    //Проверяем, есть ли это игрок
                    if(e.getWhoClicked() instanceof Player)
                    {
                        //Если да, устанавливаем игрока как того, кто кликнул и отправляем сообщение
                        Player p = (Player) e.getWhoClicked();
                        p.sendMessage("§cВы отказались от получения ссылки.");
                    }
                }
            }
        }
    
    }

    После всего этого не забываем вписать команду в plugin.yml:
    Код:
    name: RuBukkit
    description: Tutorial
    author: MasterCapeXD
    version: 1.0
    main: ya.top.koder.plugin.Main
    commands:
      maininfo:
        description: Main info of player
      geturl:
        description: get url of this thread

    На этом вроде все. 4 часть туториала подошла к концу.
     
  17. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    ЧСВ[DOUBLEPOST=1498141316,1498141242][/DOUBLEPOST]
    [DOUBLEPOST=1498141356][/DOUBLEPOST]Да и лучше проверку на игрока в самом начале тогда делать...[DOUBLEPOST=1498141395][/DOUBLEPOST]Так у тебя даже 2 проверки
     
  18. Автор темы
    _MasterCapeXD_

    _MasterCapeXD_ Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    _MasterCapeXD_
    Я это заметил, когда написал уже. Знал, что прицепятся)[DOUBLEPOST=1498146556,1498146469][/DOUBLEPOST]
    =)
    Эт для примера)
     
  19. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Мда
    Вообще в этом смысла я не вижу, и соглашусь с @Mr_RoboMan, не умеешь пользоватся документацией и не знаешь английский хоть чуть - чуть -- лучше даже и не начинать
    А если по коду, то так не проще?
    Material type = e.getCurremtItem().getType();
    p.sendMessage(type == блаблабла1 ? "1" : "2");
    Думаю суть этого "сложного" кода понятна.
    Дальше.
    Создать инвентарь один раз, и итем стак тоже один раз, и использовать private static видимо уже не в моде.
    Так же не нужна проверка на имя команды, если команда одна или же, если команды в отдельных классах
     
    Последнее редактирование: 24 июн 2017
  20. HellsCoder

    HellsCoder Ньюби Пользователь

    Баллы:
    1
    Имя в Minecraft:
    HellsCoder
    неа
     
  21. Автор темы
    _MasterCapeXD_

    _MasterCapeXD_ Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    _MasterCapeXD_
    Насчет этого - не понял, что ты имеешь в виду? Чем тебе не нравится метод addIcon()?
    А инвентарь и так только в команде создается, больше нигде не используется
     

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