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

Статус
Закрыто для дальнейших ответов.

_MasterCapeXD_

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

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

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

[+] <- Помощь в изучении Java;
[+] <- Сборка ссылок на обучающие материалы
[+] <- Документация Spigot API;

Софт для начала работы:
Среда разработки:
1) IntelliJ IDEA [+]
2) Eclipse [+]
3) NetBeans [+]
Для нормального запуска этих программ у Вас должен быть установлен JDK (Java Development Kit) и JRE (Java Runtime Environment)!

Редактирование файлов (.yml, .json, etc...):
1) Notepad++ [+]

Проект, созданный для данного туториала, был разработан в СР Eclipse.

Основы:
Java - обьектно-ориентированный язык программирования (вся программа - связь разных обьектов. Это как организм, в котором каждый орган отвечает за свою функцию для нормального функционирования всего организма. Органы могут сотрудничать, обмениваться информацией и тп).
Его приемущества:
1) Инкапсуляция:
Теория: позволяет устанавливать доступ к обьекту и информации в нем с помощью модификаторов доступа.
Пример: у Вас есть 3 сейфа с информацией. Первый - приватный (пароль знаете только Вы), второй - обычный (пароль знают Ваши родственники и соседи), третий - публичный (пароля нет).

2) Наследование:
Теория: позволяет наследовать свойства, методы и поля родительского обьекта.
Пример: У Вас есть обьект Car (автомобиль), и обьект BMW, который наследует обьект Car.

3) Полиморфизм (углубленно о наследовании):
Теория: позволяет обьекту использовать методы производного класса, который не существует на момент создания базового.
Пример: Что может хранить класс Car? Например, название марки автомобиля, кол-во сидений и тп. Допустим, кол-во сидений = 4. А что, если мы делаем 2-местный автомобиль? Мы наследуем класс Car и имеем возможность изменить для себя кол-во сидений для нашего авто.

Основные типы данных:
1) Текстовый тип:
char - символ (16-разрядное беззнаковое целое, представляющее собой символ UTF-16 (буквы и цифры)).
String - строка (может хранить в себе любые символы, главное, чтобы кодировка подошла).
2) Целочисленный тип:
byte - 8-разрядное целое число.
short - 16-разрядное целое число.
int - 32-разрядное целое число.
long - 64-разрядное целое число.
3) Дробный тип:
float - 32-разрядное число в формате IEEE 754 с плавающей точкой.
double - 64-разрядное число в формате IEEE 754 с плавающей точкой.
4) Логический тип:
boolean - хранит значение true или false.

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

Модификаторы доступа в Java:
private - приватный (как мы помним, пароль знаем только мы).
(модификатор не указывается) - обычный (как мы помним, пароль знают только наши родственники и соседи).
protected - защищенный (пароль знают только наши дети и мы сами).
public - публичный (пароля нет).

НАЧАЛО РАБОТЫ:
Создание проекта в среде разработки Eclipse:
1) Запускаем Eclipse.
2) Нажимаем на кнопку File (в левой верхней части экрана) -> New -> Java project.
bandicam 2018-02-04 14-56-42-829.jpg
3) В появившемся окне указываем имя проекта (в этом случае "RuBukkitGuide") и ставим такие настройки:
bandicam 2018-02-04 14-57-00-100.jpg
4) Нажимаем Finish.
Проект создан!

Создание пакетов:
1) В созданном обьекте нажимаем ПКМ по папке src.
2) Нажимаем New -> Package.
bandicam 2018-02-04 14-57-39-652.jpg
3) Создаем сами пакеты:
bandicam 2018-02-04 14-57-50-349.jpg
4) Нажимаем Finish.
Пакеты созданы.
Мы создали в папке src папку org, в ней папку rb и в ней папку guide.
Для чего нужны пакеты? Представьте, что у Вас есть один большой ящик (Ваша программа) и в нем 4 маленьких ящика. В первом - яблоки, во втором - персики, в третьем - гранаты, в четвертом - ананасы. Для чего нам нужны эти коробки? Правильно, чтобы все фрукты не находились в одной коробке.
Но в Java пакеты не только используются для сортировки. Они берут участие в инкапсуляции. Помните Обычный модификатор доступа? Вот вся информация с модификатором Обычный будет доступна всем обьектам в этом пакете. Тоесть, у яблок своя тусовка, и никакие персики и другие фрукты туда не полезут.

Создание класса:
Создадим теперь наш главный класс, который запустит весь наш плагин, назовем его Main.
1) Нажимаем ПКМ по пакету guide -> New -> Class.
[Screen]bandicam 2018-02-04 14-58-12-337.jpg
2) Указываем название и нажимаем Finish.
bandicam 2018-02-04 14-58-30-056.jpg
Класс создан!

Добавление библиотеки Spigot в проект:
Для этого нажимаем ПКМ по проекту и нажимаем Properties -> Java build pass, заходим во вкладку Libraries и нажимаем на кнопку Add external JARs и указываем место хранения ядра Spigot (скачать их можно тут или тут).
bandicam 2018-02-04 14-59-35-563.jpg

Начинаем кодить!
Созданный нами класс Main пока-что выглядит вот так:
bandicam 2018-02-04 15-00-33-878.jpg

Для того, чтобы наш проект считался плагином, нам нужно унаследовать класс JavaPlugin (этот класс находится в самом ядре Spigot).
Для того, чтобы унаследовать этот класс, нам нужно в строку public class Main дописать extends JavaPlugin.
Хорошо. Или нехорошо? Что за красная лампочка??? Eclipse нам говорит, что мы не импортировали класс JavaPlugin. Нажимаем на лампочку и импортируем.

bandicam 2018-02-04 15-01-36-742.jpg

Теперь мы имеем доступ к protected и public полям и методам. Чтобы Java знала наверняка, что мы используем метод из родительского класса (JavaPlugin), мы скажем это, используя аннотацию @Override. Какой метод мы возьмем из родительского класса? onEnable(), так как он запускает весь наш проект. Само ядро будет знать, что это плагин, и начнет получать всю нужную информацию. Если мы уберем extends JavaPlugin и метод onEnable(), то когда добавим плагин в папку plugins, он вообще не загрузится, и его вообще не будет в списке плагинов.

bandicam 2018-02-04 15-04-20-383.jpg

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

Как узнать все методы, к которым мы имеем доступ? Пишем this и ставим точку. Нам программа вывела все доступные методы и поля из класса JavaPlugin.

Что будем делать? Ну давайте выведем при запуске плагина, что он включился.
Для этого заходим в метод onEnable(){ } и между { и } пишем нашу команду. Она выглядит так: this.getLogger().info("ПЛУГИН РАБОТАИТ!");
Что мы сделали, введя эту команду? Мы получили класс Logger, в которого есть метод info(...), который и запустили.

Плагин написан. Теперь мы должны создать файл plugin.yml. Нажимаем ПКМ по проекту. В окне нажимаем New -> File и вводим plugin.yml.
В нем мы должны ввести такие значения:

Код:
name: RBGuide # Имя плагина
main: org.rb.guide.Main # Путь к главному классу (тому, который наследует JavaPlugin)
author: MasterCapeXD # Автор плагина
version: 0.1 # Версия плагина
description: super plugin # Описание плагина

Теперь мы можем скомпилировать плагин. Нажимаем ПКМ по проекту, в окне нажимаем Export... -> Java -> JAR file -> Next и вводим путь к папке, где хотим сохранить файл.

Доп. информация:
Кроме метода onEnable() в JavaPlugin есть еще 2 метода - onLoad() и onDisable().

Весь класс Main:
PHP:
package org.rb.guide;

import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin
{
    @Override
    public void onEnable()
    {
        this.getLogger().info("ПЛУГИН РАБОТАИТ!");
    }
}

Сам проект тут.

1 часть подошла к концу. В следующем мы продолжим добавлять функционала в плагин.
 
Последнее редактирование:
Лучше бы новичков на Intellij сажать (имхо)
+ каждую команду желательно делать в своем отдельном классе
 
Лучше бы новичков на Intellij сажать (имхо)
+ каждую команду желательно делать в своем отдельном классе
Вот сам на нем и сиди, а нам eclipse норм. Нефиг навязывать свое мнение, на чем нравится на том и сидят.
 
Последнее редактирование:
Создаём плагины в 4 шага:
1. Читаем любую книгу от известного автора о основах Java
2. Пишем 100500 бесполезных программ, чтобы голова начала работать как у программиста
3. Смотрим примеры плагинов для Bukkit
4. Читаем javadoc от bukkit
5. ????
6. PROFIT!

Очередной copy-paste туториал. Пока я не перестал copy-paste'ить, у меня у самого ничего не получалось.
Будто шаманские тексты копируешь и ОНО РАБОТАЕТ!
 
Создаём плагины в 4 шага:
1. Читаем любую книгу от известного автора о основах Java
2. Пишем 100500 бесполезных программ, чтобы голова начала работать как у программиста
3. Смотрим примеры плагинов для Bukkit
4. Читаем javadoc от bukkit
5. ????
6. PROFIT!

Очередной copy-paste туториал. Пока я не перестал copy-paste'ить, у меня у самого ничего не получалось.
Будто шаманские тексты копируешь и ОНО РАБОТАЕТ!
Туториал как-раз не копи паст, специально все на скринах (чтобы переписывали) и с обьяснениями, что, зачем, почему и как. Ну и, понятное дело, что до этого основы Java надо знать.Даже не основы Java а вообще основы программирования, независимо от ЯП.Знать что такое переменные и с чем их едят (как минимум).
 
Туториал как-раз не копи паст, специально все на скринах (чтобы переписывали) и с обьяснениями, что, зачем, почему и как. Ну и, понятное дело, что до этого основы Java надо знать.Даже не основы Java а вообще основы программирования, независимо от ЯП.Знать что такое переменные и с чем их едят (как минимум).
Это - копипаста. Код за тебя уже написан, а как ты перенесешь - дело пятое.
 
Туториал как-раз не копи паст, специально все на скринах (чтобы переписывали) и с обьяснениями, что, зачем, почему и как. Ну и, понятное дело, что до этого основы Java надо знать.Даже не основы Java а вообще основы программирования, независимо от ЯП.Знать что такое переменные и с чем их едят (как минимум).
когда я начал кодить, я знал основы программирования очень не плохо (учили в шк), но что такое ООП не знал совершенно.

в итоге все было так:
Будто шаманские тексты копируешь и ОНО РАБОТАЕТ!
 
Код за тебя уже написан, а как ты перенесешь - дело пятое.
Смотри, мой код примитивный, например:
Ивенты: кому надо слушать ивент захода игрока только чтобы убрать сообщение?Я сделал пример, а какой ивент использовать и как с ним работать, дело читателя. Если в теме все описано, каждый шаг, то это уже не шаманские тексты, более менее понятно. Тоже самое с командами.Я сделал пример команды, описал, что за что отвечает, и где можно вписать свой код, чтобы команда делала то, что надо тому, кто его создает.
 
Смотри, мой код примитивный, например:
Ивенты: кому надо слушать ивент захода игрока только чтобы убрать сообщение?Я сделал пример, а какой ивент использовать и как с ним работать, дело читателя. Если в теме все описано, каждый шаг, то это уже не шаманские тексты, более менее понятно. Тоже самое с командами.Я сделал пример команды, описал, что за что отвечает, и где можно вписать свой код, чтобы команда делала то, что надо тому, кто его создает.
Это тебе более-менее понятно. А для 12 летнего школьника это шаманские тексты. Надо книги читать, чтобы хоть что-то понимать. Уже после книги с основами и нескольких простых программ, можно начинать читать твой туториал.
 
Это тебе более-менее понятно. А для 12 летнего школьника это шаманские тексты. Надо книги читать, чтобы хоть что-то понимать. Уже после книги с основами и нескольких простых программ, можно начинать читать твой туториал.
Псс... Что написано у меня в первом посте в теме?
+ Помощь в изучении Java
 
на русском чет не особо нахожу гайдов посложнее, к примеру работа с хэшмапами или arraylist
 
Псс... Что написано у меня в первом посте в теме?
Что такое аннотации? Как сделать свои аннотации? Зачем они нужны? Для чего нужны модификаторы доступа? Что такое ООП? Отличия примитивных от не примитивных типов? Что такое класс? Зачем нужна строка package xxx в самом верху? Что такое метод? Что такое getServer()? Почему надо писать import?
p.s. аннотация @Override нужна ТОЛЬКО для компилятора, можно переопределять и без нее, но она помогает найти ошибки во время компиляции, если сигнатура метода не совпадает с сигнатурой у метода в суперклассе.
Я говорю - это очередная, бесполезная статья уровня копипасты. Для таких туториалов нужен минимальный уровень. Из-за таких туториалов плодят 500 тем в час, "ПАЧИМИ НИРАПБАТАЕТ ЕТО".
зайди на хабр.

это java классы, так что туторов по ним как грязи
В любой книге о java - коллекции. Там максимум 80 страниц.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх