Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

В разработке Я создаю свой первый плагин для Rubukkit!

Интересно?

  • Да, продолжай!

    16 голосов 61,5%
  • Нет,

    10 голосов 38,5%

leonmark061

Активный участник
Пользователь
Баллы
76
Всем привет.
Я уже какое-то время занимаюсь программированием на Java(и не только :) ), но из плагинов писал только кривые и никому не нужные штуки, вроде фиксов для WG.
Но теперь мне захотелось создать что-то полезное для сообщества и поделиться этим, вероятно, долгим, нудным процессом с дорогими пользователями, которые только начинают писать плагины, и научить вас плохим манерам программирования и созданию плагинов в общем.
Если Вы продвинутый кодер(коим я, конечно же, не являюсь), и у Вас уже есть свои устоявшиеся принципы написания кода, которые, по вашему мнению, правильнее моих, то пожалуйста, "критикуйте меня полностью". Иначе я буду открыто показывать пользователям, как, возможно, "писать" нельзя.
Ну, это при условии, что данный пост вообще кто-то будет читать...

Итак.
Хочу немного прояснить, что я вообще задумал.
Я решил написать плагин и поделиться этим процессом написания с вами, описывая каждый шаг. Для ленивых, и тех, кто не воспринимает больше 10 строчек текста, сразу скажу, что никаких видео с демонстрацией данного процесса я записывать не планирую - только текст и скриншоты. Так что, либо читать, либо идти мимо.
Каждый шаг создания плагина будет сопровождаться подробным описанием этого шага, листингом с комментариями и, возможно, каким-нибудь скриншотом.

Я не хочу писать слишком большие плагины, по-этому выберу "среднячок".

Идея​
Для начала необходимо продумать, что вообще должен уметь плагин. Представить его основные функции их реализацию.
Так как моя задница слишком ленивая(а ведь именно в ней у меня генерируются идеи), я возьму одну идею из уже имеющихся на данном форуме.
Я выбрал идею пользователя @craftist - "CommandVote". Мне плевать, если кто-то уже взялся за разработку такого плагина, ведь реализовывать его я буду по-своему. И не факт, что плагин будет в точности воспроизводить функционал, предложенный автором идеи. Да, в итоге может получится несколько плагинов со схожим функционалом, но кого это волнует? Продолжим.

Проектирование.​
Определившись с идеей, надо спроектировать функционал плагина. Это необходимо для того, что в процессе разработки у вас не возникало никаких трудностей с организацией классов. Приступим.

Так как плагин будет не маленький, то и классов в нем будет большое количество(2+).
Итак, CommandVotePlugin - первый класс, головной. В этом классе будет происходить инициализация всех остальных компонентов плагина. И через него же я буду обращаться к этим самым компонентам(прим.: запуск голосования и т.п.). Второй , не менее важный класс - CommandVoteCommandExecutor. В нем я буду обрабатывать команды, введенные игроком.
Как вы могли заметить, в качестве префикса к основному названию класса я использую название самого плагина(CommandVote + Plugin, CommandVote + CommandExecutor). Это полезно, если вы в нескольких своих плагинах используйте схожие названия классов и хотите иметь возможность взаимодействовать между ними. Но если вам нафиг не сдались эти префиксы, их спокойно можно отбросить. Продолжим.
Нам понадобятся еще два класса Voting и VotingManager. Первый будет представлять из себя само голосование в виде объекта и хранить в себе данные: имя, выполняемая команда, кол-во голосов для выполнения и т.д.. Второй будет управлять голосованиями: запускать их, считать голоса, выполнять, останавливать и т.д.
Данные о голосованиях нам надо откуда-то брать, поэтому следующие два класса называются Configuration и VotingConfiguration. В первом я буду считывать и глобальные настройки для плагина. В втором - всю информацию о голосовании. Так же нам понадобятся классы для событий:
VotingBeginEvent, VotingVoteEvent, VotingEndEvent,VotingTimeoutEvent и соответствующие слушатели для них. Класс MessageUtils будет служить для формирования сообщений, заменяя флаги (типа {RandVoted}, {YesVoted} и т.п.) на соответствующую информацию.
Для базового функционала мне этого хватит. Если чего-то будет не хватать, можно добавлять это по ходу разработки.

Реализация.
...
​
Если вам интересно - пишите, не стесняйтесь. В следующих постах я буду мало-помалу заниматься реализацией плагина и делиться этим процессом с вами. В конце разработки, я создам тему для самого плагина и исходного кода.

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

P.S. В данном посте(треде) я во всем опираюсь на свой личный опыт.
 
Последнее редактирование:
Всем привет.
Я уже какое-то время занимаюсь программированием на Java(и не только :) ), но из плагинов писал только кривые и никому не нужные штуки, вроде фиксов для WG.
Но теперь мне захотелось создать что-то полезное для сообщества и поделиться этим, вероятно, долгим, нудным процессом с дорогими пользователями, которые только начинают писать плагины, и научить вас плохим манерам программирования и созданию плагинов в общем.
Если Вы продвинутый кодер(коим я, конечно же, не являюсь), и у Вас уже есть свои устоявшиеся принципы написания кода, которые, по вашему мнению, правильнее моих, то пожалуйста, "критикуйте меня полностью". Иначе я буду открыто показывать пользователям, как, возможно, "писать" нельзя.
Ну, это при условии, что данный пост вообще кто-то будет читать...

Итак.
Хочу немного прояснить, что я вообще задумал.
Я решил написать плагин и поделиться этим процессом написания с вами, описывая каждый шаг. Для ленивых, и тех, кто не воспринимает больше 10 строчек текста, сразу скажу, что никаких видео с демонстрацией данного процесса я записывать не планирую - только текст и скриншоты. Так что, либо читать, либо идти мимо.
Каждый шаг создания плагина будет сопровождаться подробным описанием этого шага, листингом с комментариями и, возможно, каким-нибудь скриншотом.

Я не хочу писать слишком большие плагины, по-этому выберу "среднячок".

Идея​
Для начала необходимо продумать, что вообще должен уметь плагин. Представить его основные функции их реализацию.
Так как моя задница слишком ленивая(а ведь именно в ней у меня генерируются идеи), я возьму одну идею из уже имеющихся на данном форуме.
Я выбрал идею пользователя @craftist - "CommandVote". Мне плевать, если кто-то уже взялся за разработку такого плагина, ведь реализовывать его я буду по-своему. И не факт, что плагин будет в точности воспроизводить функционал, предложенный автором идеи. Да, в итоге может получится несколько плагинов со схожим функционалом, но кого это волнует? Продолжим.

Проектирование.​
Определившись с идеей, надо спроектировать функционал плагина. Это необходимо для того, что в процессе разработки у вас не возникало никаких трудностей с организацией классов. Приступим.

Так как плагин будет не маленький, то и классов в нем будет большое количество(2+).
Итак, CommandVotePlugin - первый класс, головной. В этом классе будет происходить инициализация всех остальных компонентов плагина. И через него же я буду обращаться к этим самым компонентам(прим.: запуск голосования и т.п.). Второй , не менее важный класс - CommandVoteCommandExecutor. В нем я буду обрабатывать команды, введенные игроком.
Как вы могли заметить, в качестве префикса к основному названию класса я использую название самого плагина(CommandVote + Plugin, CommandVote + CommandExecutor). Это полезно, если вы в нескольких своих плагинах используйте схожие названия классов и хотите иметь возможность взаимодействовать между ними. Но если вам нафиг не сдались эти префиксы, их спокойно можно отбросить. Продолжим.
Нам понадобятся еще два класса Voting и VotingManager. Первый будет представлять из себя само голосование в виде объекта и хранить в себе данные: имя, выполняемая команда, кол-во голосов для выполнения и т.д.. Второй будет управлять голосованиями: запускать их, считать голоса, выполнять, останавливать и т.д.
Данные о голосованиях нам надо откуда-то брать, поэтому следующие два класса называются Configuration и VotingConfiguration. В первом я буду считывать и глобальные настройки для плагина. В втором - всю информацию о голосовании. Так же нам понадобятся классы для событий:
VotingBeginEvent, VotingVoteEvent, VotingEndEvent,VotingTimeoutEvent и соответствующие слушатели для них. Класс MessageUtils будет служить для формирования сообщений, заменяя флаги (типа {RandVoted}, {YesVoted} и т.п.) на соответствующую информацию.
Для базового функционала мне этого хватит. Если чего-то будет не хватать, можно добавлять это по ходу разработки.

Реализация.
...
​
Если вам интересно - пишите, не стесняйтесь. В следующих постах я буду мало-помалу заниматься реализацией плагина и делиться этим процессом с вами. В конце разработки, я создам тему для самого плагина и исходного кода.

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

P.S. В данном посте(треде) я во всем опираюсь на свой личный опыт.
Есть идея!Создай плагин на запрет предметов,блоков,мата,флуда и рекламы на сервере.Или можно создать плагин на статистику,Кароче говоря вот тебе две идеи выбирай сам)
 
Как вы могли заметить, в качестве префикса к основному названию класса я использую название самого плагина(CommandVote + Plugin, CommandVote + CommandExecutor). Это полезно, если вы в нескольких своих плагинах используйте схожие названия классов и хотите иметь возможность взаимодействовать между ними.
Это не полезно. Я не думаю, что какой ниб Вася будет копировать твой package для своего плагина. Достаточно будет заиметь уникальный package (аля org.rubukkit.leonmark061.commandvote), и твои мозолящие глаза префиксы канут в небытие.
Данные о голосованиях нам надо откуда-то брать, поэтому следующие два класса называются Configuration и VotingConfiguration.
Мажорно. Небось и ссылки на переменные конфигов будут статическими :D
 
Это не полезно. Я не думаю, что какой ниб Вася будет копировать твой package для своего плагина. Достаточно будет заиметь уникальный package (аля org.rubukkit.leonmark061.commandvote), и твои мозолящие глаза префиксы канут в небытие.
Тогда создайте мне два класса... хм. Допустим EffectFactory. Поместите их в разные пакеты, например первый в org.rubukkit.dereku.weaponeffects, а другой в org.rubukkit.dereku.particleeffects. И заставьте работать их один на другого. Это можно будет провести только таким образом:
Java:
package org.rubukkit.dereku.weaponeffects;

...

EffectFactory factory = new EffectFactory(new org.rubukkit.dereku.particleeffects.EffectFactory())
Не знал, что вам проще прописывать именно полный путь к классу, а не короткий префикс.
Мажорно. Небось и ссылки на переменные конфигов будут статическими :D
Что еще за "мажорно"? Как будто-то кто-то ограничивает вас в количестве возможно кода...
 
Тогда создайте мне два класса... хм. Допустим EffectFactory.
А зачем мне два одинаковых класса? Весьма глупый аргумент в сторону защиты префиксов на каждый класс.
Что еще за "мажорно"? Как будто-то кто-то ограничивает вас в количестве возможно кода...
Ограничивать никто не собирается, но вот обслуживать всё это тебе.
 
Тогда создайте мне два класса... хм. Допустим EffectFactory. Поместите их в разные пакеты, например первый в org.rubukkit.dereku.weaponeffects, а другой в org.rubukkit.dereku.particleeffects. И заставьте работать их один на другого. Это можно будет провести только таким образом:
Java:
package org.rubukkit.dereku.weaponeffects;

...

EffectFactory factory = new EffectFactory(new org.rubukkit.dereku.particleeffects.EffectFactory())
Не знал, что вам проще прописывать именно полный путь к классу, а не короткий префикс.

Что еще за "мажорно"? Как будто-то кто-то ограничивает вас в количестве возможно кода...
Просто ты говнокодер, у кого есть 2 класса с одинаковым названием, нормальные кодеры так не делают.
 
Просто ты говнокодер, у кого есть 2 класса с одинаковым названием, нормальные кодеры так не делают.
Не стоит так предвзято относится к людям. Вы еще не видели мой код, поэтому не можете называть меня говнокодером. С тем же успехом я могу назвать вас так же.
 
Не стоит так предвзято относится к людям. Вы еще не видели мой код, поэтому не можете называть меня говнокодером. С тем же успехом я могу назвать вас так же.
То, что нужно загружать 2 класса с одинаковым именем уже говорит о говнокоде.
 
То, что нужно загружать 2 класса с одинаковым именем уже говорит о говнокоде.
Вы очень невнимательны. Я нигде и не предлагал загружать два класса с одинаковым именем. Я лишь привел пример, как этого можно избежать.
 
Вы очень невнимательны. Я нигде и не предлагал загружать два класса с одинаковым именем. Я лишь привел пример, как этого можно избежать.
Глупый что ли? Ты сказал, как избежать этого, а я сказал, что если такая проблема появляется - значит говнокод.
 
Глупый что ли? Ты сказал, как избежать этого, а я сказал, что если такая проблема появляется - значит говнокод.
Как вам угодно. Видимо, у вас очень большой опыт копания в говнокоде. Не буду больше спорить с вами.
 
Как вам угодно. Видимо, у вас очень большой опыт копания в говнокоде. Не буду больше спорить с вами.
У вас два класса с названием EffectFactory в разных пакетах... ЗАЧЕМ? Сделайте WeaponEffectFactory и ParticleEffectFactory которые наследуются EffectFactory.
 
У вас два класса с названием EffectFactory, но в разных пакетах... ЗАЧЕМ? Сделайте WeaponEffectFactory и ParticleEffectFactory которые наследуются EffectFactory.
У меня два разных плагина, две разные реализации EffectFactory. Одна для частиц, другая для различных бонусов. Следовательно, наследовать какой-то общий класс они не могут. Обе реализации в задействованы в разных плагинах.
Надеюсь так понятно.

Пример был приведен для того, что бы показать, как можно было бы использовать имена классов без написания префиксов к основному имени, приводя полный путь к классу.
 
У меня два разных плагина, две разные реализации EffectFactory. Одна для частиц, другая для различных бонусов. Следовательно, наследовать какой-то общий класс они не могут. Обе реализации в задействованы в разных плагинах.
Надеюсь так понятно.

Пример был приведен для того, что бы показать, как можно было бы использовать имена классов без написания префиксов к основному имени, приводя полный путь к классу.
Если они в разных плагинах то в чем проблема? Кто сказал что нужно писать полный путь?
 
Если они в разных плагинах то в чем проблема? Кто сказал что нужно писать полный путь?
Боже. Если не знаете о чем идет речь, лучше вообще не встревайте. Прежде, читайте диалоги полностью.
 
Боже. Если не знаете о чем идет речь, лучше вообще не встревайте. Прежде, читайте диалоги полностью.
Да с вами вскоре никто и не захочет вести диалог.
Придумывать никому не нужные велосипеды и обвинять людей что они их не понимают и не принимают.
 
Да с вами вскоре никто и не захочет вести диалог.
Придумывать никому не нужные велосипеды и обвинять людей что они их не понимают и не принимают.
Это ваше дело. Я никого не заставляю ничего понимать или принимать.
Но я вас очень прошу, не заставляйте меня отвечать на одни и те же вопросы!
 
Я не кодер. Я - программист. И если вы меня не понимаете - не надо. Даже не пытайтесь.
 
Последнее редактирование:
если вы меня не понимаете - не надо. Даже не пытайтесь.
Даже не пытайтесь меня понять, но я напишу распишу процесс создания плагина!

Проще говоря, для кого ты пишешь это, если тебя не надо понимать? Тебе, между прочим, дельные советы дают, а ты их игнорируешь.
 
Последнее редактирование:

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

Назад
Верх