Перейти к содержимому


* * * * *

Плагины, говоришь?.. Хех!

bukkit plugins плагины

Добрый день, веселая минутка.
к/ф "Белое солнце пустыни"

Написанное ни в коем случае не претендует на какое-то справочное пособие, для этого есть вполне себе самодостаточная майн-вики. Даже полнотой охвата, логичностью и структурированностью изложенное отличаться не будет. Скорее это будут мысли "на тему", изложенные на бумаге. В основном это будет результат копания в коде майна и баккита, опыт многократного наступания на грабли и муторного исправления тривиальнейших (с высоты полученного опыта) ошибок. Пишется в том числе для того, чтобы предостеречь начинающего плагинописателя от долгого и нудного поиска правильного пути, не всегда самого короткого, но на выходе дающего наилучший результат.

Пока написано 7 статей, 3 еще вчерне набросаны. Буду публиковать по 1-2 в неделю. Дальше посмотрим.
PS: статьи автоматически дублируются в разделе "Серверные плагины", там же можно задавать вопросы, предлагать правки.
Прежде чем перейти к сути вопроса, зададимся предварительным вопросом "А зачем оно все нужно?". Ну вроде можно перейти в креатив, поставить или убрать любые блоки, что еще нужно для полного счастья, кроме стака алмазных блоков? Однако рано или поздно наступает момент, когда одной возможности что-то строить уже не хватает, хочется строить много и быстро. - Ну так поставь WorldEdit, там все это есть! - Ну так о нем и речь, собственно, WorldEdit ведь тоже является плагином. - А зачем изобретать велосипед, все ведь уже написано? - Тогда вам, пожалуй, не сюда, дальше читать смысла нет. Как бы много не было написано плагинов, в любом случае они не покрывают 100% потребностей. Особенно, если вы содержите свой сервер, причем не для себя и двух своих друзей, а для нескольких десятков ежедневных игроков, причем никогда не известно, что эти самые игроки устроят у вас на сервере через 5 минут.

Для начала прежде всего следует задать себе вопрос "А для чего нужны плагины [в майнкрафте, конечно же]?". Казалось бы, разработчики майна предоставили богатый инструментарий для того, чтобы в самой игре можно было реализовать любой каприз клиента: тут тебе и редстоун-схемы, работающие по принципу аналоговых и логических электронных элементов, здесь вам и командные блоки, позволяющие выполнить любую (почти) консольную команду, а функционал консольных команд в майне очень и очень серьезен. Ваяй не хочу. Так и хочется спросить "Что же тебе, собака, надобно?! Женись, князь ее отпускает!". Однако же раз за разом народ то и дело ваяет плагины и плагинчики, подчас выполняющие крохотные узкоспециализированные задачки.

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

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

Есть еще одна причина, не совсем очевидная, но для меня немаловажная: для работы с редстоун-схемами на серьезном уровне нужно иметь особо извращенный склад ума, заточенный под электронную схемотехнику. Казалось бы, для программиста ("тыжпрограммист!") не должно составить особой проблемы освоить схемотехнику и принципы ее работы, но вот поди ж ты, меня эти логические элементы, повторители, факелы и принципы распространения редстоун-сигнала чем дальше тем больше выводят из себя. Особенно бесит то, что все это требует изрядно места. Уже не говоря о том, что, как правило, работает все это через одно место и сыпется от малейшего чиха лага сервера. С консольными командами тоже не все так просто, их использование требует извращенных специфических навыков, связанных с линуксоподобными операционными системами и, как правило, отсутствующих у нормальных людей [сарка-а-азм]. Плюс консоль сама по себе накладывает определенные ограничения на параметры, а в совокупности с комблоками поиск работающего варианта превращается порой в пытку.

Я ни в коей мере не хочу сказать, что создание плагинов - работа простая и непыльная. Нет, спотыкаться и ошибаться приходится ежечасно, ошибки выискиваются и фиксятся долгими дождливыми вечерами. Кроме того, написание плагинов требует более-менее внятного понимания явы вообще и работы майнкрафт-сервера под управлением виртуальной ява-машины в частности. Однако если вы освоите это на достаточном уровне и подкопите какой-никакой багаж вспомогательных инструментов (я имею в виду самостоятельно написанные классы-утилиты для работы со специфическими функциями майнкрафт-сервера), это позволит вам создавать такие вещи, которые даже в теории нельзя реализовать с помощью каких бы то ни было редстоун-схем и/или командных блоков.

Самое главное отличие плагинов от всего вышеописанного в том, что с помощью плагина вы можете дотянуться не только туда, куда вам позволят разработчики, а туда, куда вы сами сможете дотянуться. И поверьте, слово "сможете" здесь не преувеличение, даже используя штатные средства баккита можно творить вещи, в корне меняющие логику работы майнкрафт-сервера, а если ко всему к этому научиться еще дозированно применять методы рефлексного (отраженного) программирования, получая доступ ко всем [да, почти] низкоуровневым объектам сервера, можно почувствовать, как над головой образуется нимб, а под лопатками начинают чесаться растущие крылья [сарка-а-азм].

Неслабый плюс также заключается в том, что плагин работает с той же скоростью, что и сам сервер, поскольку написан на той же яве и откомпилирован в тот же байт-код. Кроме того, и это, наверное, самое главное - плагин позволяет участвовать в обработке любых событий сервера, будь то загрузка или выгрузка какого-то чанка (или даже мира), взаимодействие сущностей (в том числе - игроков с сущностями), установка блоков и многих-многих других. Получая (и изменяя) информацию о таких событиях, можно воздействовать на логику работы сервера коренным образом. Также можно, наряду с серверными, генерировать собственные события (в том числе и производные от серверных), что дает почти безграничную гибкость в обработке тех или иных ситуаций.

Еще один немаловажный момент: многие действия по обработке данных можно выносить в отдельный поток, что при наличии в распоряжении виртуальной ява-машины (JVM) нескольких доступных процессоров (пусть даже логических) значительно ускоряет работу системы. Правда, время от времени на критичных участках приходится возвращаться в основной серверный поток, например, при изменении блоков в загруженном чанке или при телепортации сущностей, это связано с особенностями работы майн-сервера, этакая защита от рассинхронизации. Но, как правило, выгода от операции распараллеливания компенсирует все затраты на ее реализацию.

Также средствами плагина можно получить доступ к любым консольным командам сервера, изменить механизм их работы, ввести собственные команды. Поскольку подавляющая часть административных действий на сервере выполняется с помощью именно консольных команд (даже если они выполняются через GUI (графический интерфейс) клиента, все равно, как правило, конечные действия производятся через механизм серверных консольных команд). К слову, все существующие серверные плагины взаимодействуют с пользователем в основном именно через серверные консольные команды. Исключение составляют лишь немногие плагины, которые имеют собственные клиентские компоненты и взаимодействующие с ними путем прямой посылки управляющих пакетов.

И, в заключение, один уточняющий вопрос: что же считать плагином и чем он отличается от мода (модификации)? Если не залазить в дебри терминологии и не заниматься софистикой, я бы для себя определил это различие так: "мод" - это некая общая модификация майнкрафта, применяющаяся как на серверной так и на клиентской стороне (синхронно), меняющая логику игры в целом. "Плагин" же применительно к майнкрафту - это все-таки чисто серверное расширение, с клиентской частью взаимодействующее [как правило] только через консольные команды, то есть, не требующее установки специальной клиентской сборки. Однако повлиять на логику работы сервера плагин может так же значительно, как и модификация.

В общем, нет вопроса "трудно или не очень", есть вопрос "а мне слабо?". Никто не говорит, что научиться писать плагины легко, и даже предлагаемые материалы не сделают из вас плагинописателя, если вы сами не наступите на горло собственной лени. Все находится в ваших руках.
Я долго ждал. А потом Бог сказал:
«Садись на коня и возьми сам, что хочешь, если ты храбрый и сильный!»
к/ф "Белое солнце пустыни"

В следующей статье обсудим в самых общих [парламентских] выражениях структуру майнкравтовского сервера, чтобы представлять, в каких тяжелых условиях нам придется работать.
  • Поблагодарили: deoldetrash, Larisa и Frank


0 Комментарии