Jump to content


- - - - -

Монументальное полотно "Сеятель"


Киса, я давно вас хотел спросить как художник — художника. Вы… рисовать умеете?
к/ф "Двенадцать стульев"

"А когда же будет про Яву?", спросите вы. А "про яву" не будет. Ну не думаете же вы, в самом деле, что я сейчас начну долго и нудно объяснять - что такое пакеты и классы, циклы и интерфейсы? Беседа выйдет, конечно, "безумно интересной", но абсолютно непродуктивной: о программировании на Яве написан вагон и маленькая тележка книжек, тонких и толстых, пересказывать их краткое содержание - что может быть более глупым. Полно форумов, в том числе и на русском, где давно уже по 16 раз обсудили и решили все те проблемы, которые вы считаете неразрешимыми. Есть великолепный сайт, где собраны примеры по Яве на все случаи жизни.

Что касается документации непосредственно на баккит, то тут все немного сложнее. Я в настоящий момент пользуюсь справочником по Bukkit API, размещенным на сайте проекта Spigot. Раньше у баккита был свой голубенький шикарный справочник, но после известных событий он приказал жить долго и счастливо. Тем не менее, основную свою задачу спиготовский справочник выполняет вполне успешно, пользоваться им можно и нужно.
Однако, как я и говорил, лучший источник знаний и опыта - ковыряние в чужих исходниках, благо ява позволяет это делать без особых затруднений. Поначалу все это кажется китайской грамотой. Потом начинают встречаться знакомые слова. Иногда начинает казаться даже, что ты краем зацепил общий смысл (но быстро проходит). Долго шарахаешься, пытаясь понять - как и чем, а главное - зачем, все это собирается в кучу. Затем, рано или поздно, наступает момент прозрения (причем это как-то так внезапно случается), и ты восклицаешь "вона чо, Михалыч!". После этого в голове сама-собой начинает складываться стройная пирамидка, в которой все кубики(ну, почти все) - от основания до самой вершины - вызывают детское умиление своей логичностью и упорядоченностью.

Тем, кто ни разу не писал ничего на яве и пришел из С (С++), могу лишь посочувствовать: да, отсутствие указателей, деструкторов и множественного наследования поначалу очень сильно напрягает. Потом начинает расслаблять. В итоге через полгодика начинаешь замечать за собой склонность к быдлокодингу, поскольку начинает казаться, что ява сама лучше знает - когда и что надо делать. Приходится ломать себя об колено и искусственно начинать себя ограничивать.

Тем, кто пришел с PHP и иже с ним, готов посочувствовать еще больше: они совершенно искренне не понимают поначалу, почему нельзя писать код там, где им хочется, почему все обязательно заворачивать в какие-то глупые классы? В итоге, их творения обычно имеют легкоузнаваемую шизоидную конструкцию: один (максимум, два-три) файл, общий класс и куча методов с непонятными связями, больше напоминающие скрипты, коими, собственно, и являются.

И тем и тем могу со всей ответственностью заявить: проект "майнкрафт" дошел до финала не в последнюю очередь именно потому, что был написан на яве. Да, "порог разваливания" у нее гораздо ниже, чем у С++, Crysis на ней вряд ли напишешь - умумукаешься с глюками и тормозами бороться, но все-таки первоначальных усилий для получения стабильно работающего кода на яве нужно затратить гораздо меньше. Что касается PHPобразных, то там (по моему скромному мнению) проект начинает разваливаться сразу со старта, а при наличии нескольких десятков модулей основная часть сил будет тратиться именно на удержание проекта в вертикальном положении. Так что ява, как ни крути, очень хороший компромисс для реализации проектов среднего уровня, к коим я отношу и майнкрафт.

Плагин!.. Да-да, простите, мы отвлеклись от главной темы нашего повествования. С чего начинается Родина написание плагина? Лучше всего начать с запуска эклипса (шутка, да, однако именно его мы и запускаем). В главном меню выбираем пункт File -> New -> Java Project... . Если последнего пункта там нет, выбирайте пункт Project, после чего в открывшемся окне в списке типов проектов ищете-таки Java Project.

Открываем диалоговое окно создания нового 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, дабы сразу отделить мух от котлет агнцев от козлищ исходные файлы и скомпилированные классы. Галочку Add project to working set можно пока не ставить.

На следующей странице нас, пожалуй, заинтересует пока лишь вкладка 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...

Вот теперь ваш проект полностью соответствует высокому званию строителя коммунизма требованиям баккита к плагинам и может быть скомпилирован в соответствующий jar-файл. Вернее, скомпонован, поскольку компиляция файлов в эклипсе происходит "на лету", при каждом сохранении исходного файла. В окне Package Explorer на названии вашего проекта вызываем контекстное меню, далее Export..., в открывшемся окне выбираем пункт Java -> JAR File и переходим к следующей странице диалога (автоматически вызвать диалог экспорта в jar-файл с переходом сразу ко второй странице можно по нажатию Ctrl+F9). На второй странице в левом окне вы среди открытых проектов должны выбрать ваш TestPlugin, поставив на нем галочку (убедитесь что в правом окне установилась галочка на файле plugin.yml). Из опций вы должны выбрать Export generated class files and resources, Compress the contents of the JAR file и, пожалуй, Overwrite existing files without warnings. Ну и, само собой, необходимо указать - во что все это превращать, то есть путь и название jar-файла (Select the export destination -> JAR file). Лечь он должен в каталог plugins/ вашего сервера баккит, где и тусуются все загружаемые сервером плагины.

О том, как собрать и запустить свой сервер рассказывать не буду, "коналов-мануалов" типа "как собрать свой 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 and 2 others like this


0 Comments