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

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

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

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

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    CraftBukkit - глобальная серверная модификация, предоставляющая API для взаимодействия с игровым миром и созданная для упрощения создания плагинов к SMP-серверу.В августе 2014 года команду Bukkit покинули практически все разработчики, в том числе глава проекта EvilSeph.

    Spigot - оптимизированная версия CraftBukkit со своими доработками и новыми возможностями и настройками, которая продолжила работу команды Bukkit.

    Разработки, созданные для данного туториала, используют ядро Spigot.

    + Помощь в изучении Java

    Начало:
    Софт:
    Среды разработки:
    + Eclipse (удобная, понятная среда розработки, отлично подходит для новичков)
    + IntelliJ IDEA (проффесиональная среда розработки, но ее интерфейс сложно изучить новичкам)
    + NetBeans (по моему мнению, самая худшая среда розработки среди этих трех, хотя и полностью русифицирована)
    Программа для редактирования и создания конфигурационных файлов (конфигов крч):
    + Notepad++

    В данном туториале для примера мы будем использовать Eclipse!

    Создание проекта\пакетов\классов\
    (Внимание! Те, кто умеет это делать, промотайте эту часть!)

    Создание проекта:
    1) Запускаем Eclipse
    2) Нажимаем на кнопку File (в левой верхней части экрана) -> New -> Java project
    [​IMG]
    1.jpg
    3) В появившемся окне указываем имя проекта (в этом случае "RuBukkit") и ставим такие настройки:
    [​IMG]
    2.jpg
    4) Нажимаем Finish
    ПРОЕКТ СОЗДАН!

    Создание пакетов:
    [INFO] Чтобы красиво оформить наш проект и разложить все по полочкам, мы создадим несколько пакетов(папок) внутри папки src. В нашем случае: ya.top.koder.plugin (Точками мы разделяем папки).
    1) Нажимаем ПКМ по папке src
    2) Нажимаем New -> Package
    [​IMG]
    3.jpg
    3) Создаем сами пакеты:
    [​IMG]
    4.jpg
    4) Нажимаем Finish
    ПАКЕТЫ СОЗДАНЫ!

    Так у нас получится 4 папки внутри папки src (папка ya, в ней папка top, в ней папка koder а в ней папка plugin, в которой уже будет находится наш главный класс).

    Создание классов:
    [INFO] Создадим главный класс (в нашем случае под названием Main) (оригинальность зашкаливает).
    1) Нажимаем ПКМ по пакету plugin -> New -> Class
    5.jpg
    [​IMG]
    2) Указываем название и нажимаем Finish
    [​IMG]
    6.jpg
    КЛАСС СОЗДАН!

    Стоп мотать! Теперь мы должны интегрировать библиотеки Spigot. Для этого нажимаем ПКМ по проекту и нажимаем Properties -> Java build pass, заходим во вкладку Libraries и нажимаем на кнопку Add external JARs и указываем место хранения ядра Spigot (Их можно скачать тут).
    7.jpg
    [​IMG]
    Стоп мотать! Теперь начинаем работать непосредственно внутри класса:

    Созданный нами класс Main пока-что выглядит вот так:
    [​IMG]
    8.jpg
    Теперь мы должны сказать классу что он главный и что он наследует библиотеки Spigot'a (Он же сам не додумается, он же глупенький)

    Чтобы класс унаследовал все методы библиотек Spigot, в строку public class Main должны дописать extends JavaPlugin. Это должно выглядить вот так:
    [​IMG]
    9.jpg
    Мы написали это, но нам высветилась ошибка,так как мы должны импортировать весь этот JavaPlugin.Для этого нажимаем на лампочку слева от этой строки и нажимаем это:
    [​IMG]
    10.jpg
    Теперь мы можем работать со всеми методами Spigot API.

    Два самых важных метода - onEnable() и onDisable()(Не такой уж и важный), сейчас мы начнем с ними работать, а особенно с onEnable(), так как он весь код, написанный в нем, заставляет работать сразу после запуска сервера.
    Вот так мы создаем эти два метода: public void onEnable() / public void onDisable()

    void - тип возвращаемых данных. Поскольку этот метод ни чего не возвращает через return, то мы должны сообщить об этом системе. (Тип доступа может быть любым форматом возвращаемых данных, к примеру: int, boolean и даже String)

    ЧТО МЫ МОЖЕМ ДЕЛАТЬ В МЕТОДЕ onEnable()?
    - Много чего.Как минимум, мы можем начать работать с getLogger() (Также доступен в методе onDisable() ).
    Для того чтобы узнать список того, что мы можем сделать в getLogger(), ставим после него точку. Вот так:
    [​IMG]
    Но я хочу выделить среди них всех три функции (Всего тут не обьяснишь.Понимание всего приходит со временем):
    1) getLogger().info("Text"); - (Информация) - выводит текст в кавычках в консоль.
    2) getLogger().warning("Text"); (Предупреждение) - выводит текст в кавычках в консоль.
    3) getLogger().severe("Text"); (Ошибка) - выводит текст в кавычках в консоль.

    Также в методе onEnable() мы можем работать с getServer(). Чтобы узнать список всех его функций, как обычно, ставим после него точку.С помощью getServer() мы можем выполнить команду вместо игрока, зарегистрировать ивент, установить екзекутор для команды (указать отдельный класс, который будет обрабатывать указанную команду).

    Первая часть туториала подходит к концу.В следующей части мы будем работать с ивентами (событиями\слушателями событий (Listener))

    Работа с ивентами: (список Bukkit-ивентов тут и тут)

    Регистрация ивента:

    Для регистрации ивента мы будем использовать getServer(). Для регистрации ивента (например, событие при заходе игрока) мы должны написать это:
    getServer().getPluginManager().registerEvents(this,this);
    если хотим создать обработчик данного события в главном классе, а если мы хотим выделить для обработки этого ивента отдельный класс, то надо прописать это:
    getServer().getPluginManager().registerEvents(newіНазваниеКлассаОтвечающегоЗаОбработкуДанногоИвента(),this);
    [​IMG]
    После этого выведется ошибка о том, что класс не найден и скажет создать этот класс, на что мы и соглашаемся.
    Отправляемся в этот класс.

    Вписываем метод обработки этого ивента:
    [​IMG]
    Импортируем все.

    Что такое @EventHandler? (Это не пользователь, не чистит ссылку)

    @EventHandler:
    оказывает поддержку для того, чтобы динамически генерировать слушателей события, методы которых выполняют простой оператор, включающий входящий объект-событие и целевой объект.

    Непонятно? Если да, то я уже выше говорил, что понимание всего приходит со временем.
    А если сказать по-простому, то без этой штуки над ивентом ивент не сработает)

    Окей, теперь, чтобы посмотреть все, что можно получить с этого ивента, пишем e и ставим точку.

    Ну, давайте удалим сообщение о входе, сделав что-то похожее на плагин HideStream.
    Для этого мы напишем e.setJoinMessage(); и установим туда null (ничего).
    Код:
    @EventHandler
    public void on(PlayerJoinEvent e)
    {
         e.setJoinMessage(null);
    }
    С ивентами все. В следующей части поговорим о командах.

    Создание команд:

    Ну вот и третья часть! Сегодня мы научимся создавать собственные команды.И это не так уж и сложно.Но сначала надо определиться, где мы будем обрабатывать команды.Как помните, во второй части туториала про ивенты, мы создавали отдельный класс-обработчик ивентов, а сегодня мы научимся создавать класс-обработчик команд.Но можно создать обработчик и в главном классе.Сегодня мы обсудим 2 способа.

    Первый способ (В главном классе):

    Для начала, мы должны добавить метод обработки команды. Этот метод называется onCommand.Также в нем должны находится такие аргументы (CommandSender, Command, String label и String [] args) (Не забываем все импортировать! Только Command импортируйте не как org.bukkit.Material а как org.bukkit.Command). Это должно выглядить примерно вот-так:

    [​IMG]

    Если вы заметили, над самим методом висит какой-то @Override.Что это?

    Аннотация @Override информирует компилятор о том, что метод перегружает метод в суперклассе.

    На практике возможны случаи, когда вызываемый метод наследуемого класса не может найти метод родительского класса либо из-за неправильного расставления модификаторов доступа, либо из-за неправильного расположения классов в пакетах.
    Если не использовать аннотацию @Override, то "неправильная" программа скомпилируеются без ошибок, а сам проблемный участок кода станет нереально сложно найти. Использование аннотации @Override заставляет компилятор сразу проверять перегружает ли метод аналогичный в суперклассе.

    Другими словами, аннотация @Override указывает, что далее мы собираемся переопределять метод базового класса.

    Давайте сделаем команду, при вводе которой игроку выведется сообщение о его: имени, здоровьи, сытости. Назовем ее /maininfo.Вот что получается:

    [​IMG]


    Сначала мы достаем класс игрока и и ставим ему имя p, кастуем его как Player и устанавливаем его sender'ом (отправителем команды).

    Дальше мы делаем проверку, действительно ли отправитель команды - игрок? Если да, то даем возможность работать коду ниже.Ниже мы уже проверяем какую команду написал игрок, тоесть спрашиваем: Если(команда.ПолучитьНазваниеКоманды().выглядитТакСИгнорированиемРегистра("maininfo")). Если да, то получаем его имя, здоровье и сыстость.Потом отправляем сообщение игроку.
    В конце мы ставим return true; (Вернуть? Да).


    Это мы создали команду в главном классе.Теперь сделаем эту команду в отдельном классе.
    2 способ (В отдельном классе)

    Для начала мы отправляемся в метод onEnable().
    Устанавливаем класс-обработчик с помощью getServer().
    Это должно выглядить вот так:
    Код:
    getServer().getPluginCommand("названиеКоманды").setExecutor(new НазваниеКлассаОбрабатывающегоКоманду());

    [​IMG]

    Далее нам выводиться ошибка, так как класс не найден.Нажимаем на лампочку и создаем его.В
    появившемся окне указываем, что данный класс наследует CommandExecutor:

    [​IMG]

    Нажимаем Finish.Как видим,программа уже создала метод за нас.Нам только надо внутри него написать то же, что и писали в главном классе.
    Получается вот-так:

    [​IMG]

    На этом и третья часть подходит к концу. В следующей части мы научимся создавать собвстенные GUI.
     
    Последнее редактирование: 30 авг 2017
  2. Mr Hosting
  3. xBrainRTPx

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

    Баллы:
    21
    Имя в Minecraft:
    Brat987
    молодец!
     
  4. Автор темы
    _MasterCapeXD_

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    Спасибо!
     
  5. Mr_RoboMan

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

    Баллы:
    123
    Поздравляю, ты "создал" еще N-ное количество "дивилаперов" которые будут писать свои недоплагины на дюп/секс/наркотики/и_прочую_зуйню.
     
  6. Blc_Dragon

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

    Баллы:
    46
    *лайк*
     
  7. Автор темы
    _MasterCapeXD_

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    Всегда найдут за что зацепиться...Из той информации, что сейчас здесь, эти "супир" плугины не сделаешь.И неужели все будут писать именно этот бред? Может, кому-то эти уроки действительно помогут на начальных этапах, и в будущем этот парень будет отличным кодером.
     
  8. GoodCoder

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

    Баллы:
    76
    Эти уроки ни кому не нужны, потому что их уже целый вагон и маленькая тележка.
    Твой урок бестолковый. Для такого он и правда сойдёт:
    Много мусора для чайников. Хотя бы основы Java нужно выучить, прежде чем сажаться за написание плагинов. Про @EventHandler ничего так и не рассказал.
    Давно есть туторы от профи, которые рассказывают все тонкости, чтобы люди могли сразу писать качественные плагины.
     
  9. Автор темы
    _MasterCapeXD_

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    Ну, я посмотрю, будут просить продолжения, продолжу...Ну а если серьезно, супер программистом на Рубаките не станешь, но, можешь попрактиковаться на ранних этапах.А уже если хочешь быть профи, то изучай Java глубже и на специальных сайтах на подобие JavaRush и тп.
     
  10. xBrainRTPx

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

    Баллы:
    21
    Имя в Minecraft:
    Brat987
    От кого, например?
     
  11. OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    JavaRush чтобы стать профи? Надеюсь это шутка.

    К сожалению, не успел ознакомиться полностью с туториалом, но первое что бросилось в глаза это везде ошибка в слове "разработчик" (или имеются ввиду особенные вОлОгОдские рОзрОбОтчики?)
     
  12. Dymeth

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

    Баллы:
    76
    Skype:
    DymethInfo
    Имя в Minecraft:
    Dymeth
    Будет полезно людям, которые хотят писать плагины, но не решаются начинать. Отличная пошаговая инструкция
     
  13. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    +1
    Гавно.
    Либо ты пишешь туториал, либо излагаешь свои эмоции. Вместе — никак.

    Почему бы сразу не начать делать проект maven/gradle? Всё равно придётся на них перейти. А сразу начинать проще.
     
  14. Автор темы
    _MasterCapeXD_

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    Я не русский, могут быть офографические ошибки
    Спасибо))
    Ну, я по своему опыту сказал.Я не мог понять IntelliJ IDEA, а NetBeans мне просто не понравился по интерфейсу.Eclipse мне отлично подошел. Выбирать каждому свое, я для этого и оставил 3 ссылки.Мог бы оставить только Eclipse.
     
  15. alexandrage

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

    Баллы:
    173
    Не думаю, что для простого проекта нужены грабли или мавен. Когда у тебя из либ одно ведро. А вот когда нужно пол гитхаба выкачивать, другое дело.
     
  16. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Возможно, но у меня обычно и ядра-то под рукой нет =) Только его API где-то в глубинах ~/.m2/

    Да и редко уже без большего числа либ получается обойтись, постоянно всякие Gson-ы и свои наработки тянутся.

    Новичку может и да, проще так, но сложности в сразу понять maven не вижу =)
     
  17. OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    По-хорошему было бы неплохо написать плагин на gradle для bukkit плагинов. Как это сделано в Sponge
     
  18. AtomicScience

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

    Баллы:
    76
    Крутотень!:good:

    Но есть пара замечаний.
    1.Лучше не кидать скрины из Eclipse, а копировать все сразу на форум. Тогда и разобраться будет проще, просто напиши комментарии(слешами) к необходимым для пояснениям строкам, и в случае чего можно скопировать твой замечательный код к себе, чтобы попробовать, так сказать, на практике
    2. Oшибка:
    С нетерпением жду следующей части!

    P.S.
    При выводе в консоль русские символы мутируют в непонятные кракозябры. Это точно ошибка консоли, так как в логах все нормально. Как пофиксить, знаешь?

    Консолька:
    upload_2017-3-29_22-32-31.png

    Логи:
    upload_2017-3-29_22-33-26.png
     
  19. Автор темы
    _MasterCapeXD_

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    Я не рекомендую копировать.Когда переписываешь, то запоминаешь на ходу.Я так учился.Даже если мог копировать, тупо переписывал.Но я подумаю над этим)
     
  20. AtomicScience

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

    Баллы:
    76
    Ну, я не хочу, чтобы это дошло до автоматизма, как базовый синтаксис, вот там это полезно
    А так, в случае чего, посмотрел, написал
     
  21. Автор темы
    _MasterCapeXD_

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

    Баллы:
    46
    Имя в Minecraft:
    _MasterCapeXD_
    Нет, у меня самого такая проблема, но я не считаю это проблемой (пока-что), по этому не искал способов решения этой пробелмы.Хотя соглашусь, в логи постоянно смотреть неудобно.
     

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