Поиск статей
![](https://history.minecrafting.ru/public/style_images/minecraftingnoir/icon_users.png)
Монументальное полотно "Сеятель"
23.12.2015 20:40 |
vasco
в Статьи по плагинам
Тем, кто ни разу не писал ничего на яве и пришел из С (С++), могу лишь посочувствовать: да, отсутствие указателей, деструкторов и множественного наследования поначалу очень сильно напрягает. Потом начинает расслаблять. В итоге через полгодика начинаешь замечать за собой склонность к быдлокодингу, поскольку начинает казаться, что ява сама лучше знает - когда и что надо делать. Приходится ломать себя об колено и искусственно начинать себя ограничивать.
Тем, кто пришел с PHP и иже с ним, готов посочувствовать еще больше: они совершенно искренне не понимают поначалу, почему нельзя писать код там, где им хочется, почему все обязательно заворачивать в какие-то глупые классы? В итоге, их творения обычно имеют легкоузнаваемую шизоидную конструкцию: один (максимум, два-три) файл, общий класс и куча методов с непонятными связями, больше напоминающие скрипты, коими, собственно, и являются.
И тем и тем могу со всей ответственностью заявить: проект "майнкрафт" дошел до финала не в последнюю очередь именно потому, что был написан на яве. Да, "порог разваливания" у нее гораздо ниже, чем у С++, Crysis на ней вряд ли напишешь - умумукаешься с глюками и тормозами бороться, но все-таки первоначальных усилий для получения стабильно работающего кода на яве нужно затратить гораздо меньше. Что касается PHPобразных, то там (по моему скромному мнению) проект начинает разваливаться сразу со старта, а при наличии нескольких десятков модулей основная часть сил будет тратиться именно на удержание проекта в вертикальном положении. Так что ява, как ни крути, очень хороший компромисс для реализации проектов среднего уровня, к коим я отношу и майнкрафт.
Плагин!.. Да-да, простите, мы отвлеклись от главной темы нашего повествования. С чего начинается
Открываем диалоговое окно создания нового java-проекта и первым делом указываем название нашего плагина. Назовем его TestPlugin, однако вы, надеюсь, помните о том, что "как корабль назовешь, так он и поплывет"? Это не значит, что плагин должен называться MegaUberPlugin - его название должно хотя бы минимально отражать его назначение. Ну, или, по крайней мере, быть достаточно уникальным и запоминающимся, это вам сослужит хорошую службу при продвижении плагина (если, конечно, он доживет до этого этапа). В качестве JRE (Java runtime environment) пока лучше выбрать пункт Use default JRE (currently 'jre7', скорее всего). Галочку Use default location оставляйте на месте, чтобы плагин лег в ваше основное хранилище проектов, указанное при первом запуске эклипса. В разделе Project layout лучше выбрать пункт Create separate folders for sources and class files, дабы сразу отделить
На следующей странице нас, пожалуй, заинтересует пока лишь вкладка Libraries, предназначенная для подключения к вашему проекту внешних библиотек. В нашем случае jar-файл вашего сервера (например, bukkit.jar) как раз и будет такой внешней библиотекой. Нажимаем кнопку Add External JARs... и, открыв папку, где установлен ваш сервер, выбираем нужный jar-файл. Все, жмем Finish: слева, в окне Package Explorer должен появиться новый проект TestPlugin, в котором будет находиться одна папка с исходниками (src) и раздел JRE Library System, в котором среди подключенных библиотек можно будет найти и заветный баккит.
Если вы до этого сталкивались с Явой, то должны знать, что все java-классы в ней раскладываются по пакетам (package). Соответственно, "адресация" любого класса в яве выглядит как package.class, причем пакет сам, скорее всего, будет иметь в своем названии точки, поскольку общепринятое именование пакетов выглядит как zone.site.package, то есть напоминает интернет-адрес "наоборот": сначала указывается зона (например, ru), затем имя сайта (если он есть - чудесно, укажите его, если нет не беда, просто придумайте более-менее уникальное имя, которое бы достаточно точно вас идентифицировало), и только потом, как домен третьего уровня, указывается собственно имя пакета. В нашем случае, например, это может выглядеть как ru.aspushkin.testplugin. То есть, имя вашего пакета будет полностью (ну, за исключением регистра, в именовании пакетов обычно используются только строчные латинские символы) совпадать с названием вашего плагина. Еще раз заострю внимание: это необязательно, но очень желательно. Гораздо проще понять человека, если он действует в рамках общей логики и общепринятых соглашений.
Теперь, кликнув на папке src вашего проекта, открываем правой кнопкой контекстное меню и выбираем там пункт New -> Package. В открывшемся окне указываем название вашего пакета (ru.aspushkin.testplugin). Как вариант, можно последовательно создать три вложенных пакета: ru, aspushkin и testplugin - результат будет тот же самый. На диске это и в том и в том случае выглядеть как три вложенных каталога, соответствующих вышеуказанным именам. Насколько я помню, в настройках проекта эклипса можно указать, нужно ли разворачивать пакеты в виде дерева, либо отображать их в виде zone.site.package.
Вот теперь мы полностью готовы к созданию главного класса нашего плагина, который будет называться (вот ужос!) TestPlugin. На элементе вашего пакета (или на внутреннем элементе TestPlugin, если он отображается в виде дерева) снова открываем контекстное меню, но теперь уже выбираем пункт New -> Class, в открывшемся окне вводим имя нового класса TestPlugin и, ничего больше не трогая, жмем кнопку Finish. В нашем пакете появился файл TestPlugin.java следующего примерно содержания:
package ru.aspushkin.testplugin; public class TestPlugin { }Поздравлять вас с написанием вашего первого плагина, как это обычно делается, не буду, поскольку вы еще даже порог не переступили. Не с чем пока поздравлять.
Сразу, во всей своей неприглядности и пошлости, встает вопрос "А как баккит определяет, что это плагин? Как он узнает, что это главный класс плагина?". По названию? Нет, назвать результирующий jar-файл вы можете как угодно, не обязательно TestPlugin.jar. Ориентироваться баккиту помогают два момента. Первый момент - это файл plugin.yml, который вы должны создать прямо в корне вашего проекта (контекстное меню на названии проекта, далее New -> File). В нем можно указать много всяких интересных вещей, очень сильно облегчающих на первых порах жизнь плагинописателя. Довольно подробно все эти моменты расписаны в профильной статье на баккит-вики. В общем и целом, есть три элемента, обязательные для данного файла: name - название вашего плагина, которое будет отображаться, например, в результатах команды /plugins (если вы в названии плагина используете пробел, заключайте название в кавычки, однако лучше избегать таких названий), version - текущая версия плагина, которая состоит из мажорной и минорной части, и которую [хорошие дети] увеличивают на 1 при каждой новой сборке, а также элемент main - который, собственно, и определяет главный класс вашего плагина. В нашем случае файл plugin.yml может выглядеть примерно так:
name: "TestPlugin" version: 0.9a main: ru.aspushkin.testplugin.TestPluginОбратите внимание, первое слово testplugin написано строчными буквами, поскольку определяет имя пакета, а второе - с использованием заглавных, поскольку относится уже к названию главного класса вашего плагина.
Однако, это еще не все. Вторым моментом "- Узнаешь брата Колю?! - Узнаю!" является то, что главный класс вашего плагина должен наследоваться от класса JavaPlugin. Для этого после выражения public class TestPlugin но до открывающей фигурной скобки дописываем extends JavaPlugin. Эклипс тут же подсуетится и подчеркнет JavaPlugin красным цветом. Это говорит о том, что он не нашел соответствия данному классу в доступном пространстве имен. Наведите курсор на это имя - появится желтое всплывающее окно с вариантами решения данной проблемы. Скорее всего первым пунктом там будет Import 'JavaPlugin' (org.bukkit.plugin.java), на который, соответственно, и следует незамедлительно жать изо всех сил. Это добавит в ваш исходный файл дополнительную строку импорта, после чего текст файла примет следующий вид:
package ru.aspushkin.testplugin; import org.bukkit.plugin.java.JavaPlugin; public class TestPlugin extends JavaPlugin { }Если же этой строки во всплывающем окне нет, значит вы еще не добавили jar-файл вашего сервера в качестве внешней библиотеки для вашего проекта, что вам и следует незамедлительно сделать, нажав Fix project setup...
Вот теперь ваш проект полностью соответствует
О том, как собрать и запустить свой сервер рассказывать не буду, "коналов-мануалов" типа "как собрать свой backet-сервир! сматрите и наслождайтесь!" в рунете чуть меньше чем "охренеть сколько". Будем считать, что с этим вы уже сталкивались, раз уж пришли к написанию собственных плагинов. В любом случае, это тема для отдельной статьи, и не одной. Все что нам нужно на данный момент - это убедиться в том, что баккит полюбил наш плагин как родной и допустил его в свое пространство. Для этого смотрим в консоль сервера (или открываем файл logs/latest.log в каталоге вашего сервера) и ищем в нем нечто вроде:
[17:49:07] [Server thread/INFO]: [TestPlugin] Loading TestPlugin v0.9a ... [17:49:11] [Server thread/INFO]: [TestPlugin] Enabling TestPlugin v0.9aПервая строка говорит о том, что плагин ваш был найден, опознан, проверен, принят и загружен. А вторая - о том, что он был запущен и готов выполнять свои обязанности. Что же делает наш плагин? Да по прежнему ничего. Почему? Да потому, что для этого нужна как минимум еще одна статья - о событиях и их обработке.
- deoldetrash, avttrue, AngryDead и еще 2 это одобряют
0 Комментарии