Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Туториал Создание плагинов с примерами.

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем wroud, 18 авг 2012.

?

Это было полезно?

  1. Да

    103 голосов
    82,4%
  2. Нет

    22 голосов
    17,6%
  1. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    Здравствуйте посмотрел темы на форуме станет ясно что уроков по написанию плагинов увы очень и очень мало. Зато запросов на разработку плагинов довольно много.
    Работа с plugin.yml
    Работа с командами

    Написать плагин для Bukkit не так уж и сложно.Плагины могут перехватывать эвенты (события) изменять или анулировать результат к примеру эвенты входа и выхода с сервера игроков выглядят так:
    Код:
    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        event.setJoinMessage(event.getPlayer().getName() + " вошел на сервер");
    }
     
    @EventHandler
    public void onQuit(PlayerQuitEvent event) {
        event.setQuitMessage(event.getPlayer().getName() + " покинул сервер");
    }
    Рассмотрим их повнимательнее. "@EventHandler" перед функцией означает что дальше идёт перехват эвента, то есть когда игрок заходит или выходит с сервера будет срабатывать та или иная функция при этом в переменную "event" будут переданы некоторые значения.
    event.getPlayer() - мы получим игрока который вошел или вышел
    event.getQuitMessage() - мы получим сообщение которое будет выведено в игре
    Изменить игрока не получится зато можно изменить сообщение:
    event.setJoinMessage(event.getPlayer().getName() + " вошел на сервер");
    Рассмотрим этот код:
    event.setJoinMessage() - задаёт выводимое сообщение тоесть мы можем написать event.setJoinMessage("Hello World!") и у игроков в игре будет выведено сообщение "Hello World!"
    event.getPlayer().getName() - этим можно получить имя игрока и если передавать значение переменной то оно будет String :
    String playername = event.getPlayer().getName();
    Так инициализируется переменная playername содержащая текстовую информацию,
    в конце должен стоять знак ";" означающий завершение строки иначе при компиляции будет ошибка.
    Дальше идёт " + " вошел на сервер"" при объединении переменной и текста между ними ставится знак "+" а текст оборачивается в кавычки , пример:

    Код:
    String a = "Hello";
    String b = "World";
    event.setJoinMessage(a + " " + b + "!");
    на экран будет выведено "Hello World!"
    замете что знак + не заменяется на пробел а просто играет роль связующего.
    Статья не помещается полностью придётся писать в следующий коммент:confused:
     
    Nyan_adm_dog нравится это.
  2. Хостинг MineCraft
    <
  3. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    Теперь давайте приступим к написанию самого плагина.

    Во первых понадобится программа для компиляции кода, я посоветую использовать
    NetBeans IDE​
    выберете для Java EE. После установки нужно скачать craftbukkit. ​
    Теперь зайдите в NetBeans и нажмите "Создать проект" (светло коричневая папка с плюсиком в панеле инструментов)
    Выберете Java => Приложение Java , введите папку и название проекта после в поле создать главный класс ставте галочку и вводите MyProject.Main
    MyProject - пакет классов (папка) можно ввести название вашего плагина но не должно быть пробелов
    Main - главный класс проекта
    Нажмите готово и у вас должен будет создаться проект и открыться класс Main
    Теперь заходим в папку с проектом и создаём папку lib в неё помещаем скачанный craftbukkit после переключаемся сново в NetBeans жмём правой кнопкой по проекту (слева) заходим в свойства, в открывшемся окне выбираем "Библиотеки" и жмём "добавить папку или jar" и выбираем craftbukkit.jar, жмём ок и ещё раз ок.
    Возвращаемся к главному классу
    Меняем
    Код:
    public class Main { {
    на
    Код:
    public class Main extends JavaPlugin implements Listener { {
    JavaPlugin и Listener будут подчёркнуты красным нажимаем на них и зажимаем Alt+Enter появется подсказка жмём "Добавить оператор импорта org.bukkit.event.Listener"
    потом по другому слову тоже самое и выбираем "Добавить оператор импорта org.bukkit.plugin.java.JavaPlugin"
    убираем
    Код:
        public static void main(String[] args) {
            // TODO code application logic here
        }
    и добавляем
    Код:
        @Override
        public void onEnable() {
            getServer().broadcastMessage("Мой плагин включен");
        }
     
        @Override
        public void onDisable() {
            getServer().broadcastMessage("Мой плагин отключен");
        }
     
        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            event.setJoinMessage(event.getPlayer().getName() + " зашел на сервер");
        }
     
        @EventHandler
        public void onQuit(PlayerQuitEvent event) {
            event.setQuitMessage(event.getPlayer().getName() + " покинул сервер");
        }
    onEnable() - срабатывает когда плагин включается
    onDisable() - срабатывает когда плагин выключается
    с PlayerJoinEvent и PlayerQuitEvent сделать тоже самое(иморт)
    Готово теперь можно скомпилировать код и плагин готов.
     
  4. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    Если что-то непонятно или где-то ошибки пишите;)
     
    DavidShabaev нравится это.
  5. AJAharroje

    AJAharroje Активный участник

    Баллы:
    68
    Интересно, реально ли сделать так, чтобы можно было написав в чате /admins увидеть список on-line модераторов/администраторов/овнеров?:3 Хорошая идея кстати, а воплотить не понимаю как
     
  6. No1C

    No1C Активный участник Пользователь

    Баллы:
    78
    Лично у меня ошибка при запуске сервера...


     
  7. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    можно
     
  8. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    Я забыл написать про plugin.yml, сегодня напишу про него и про показ админов
     
  9. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    Работа с plugin.yml
    Для работы плагина должен быть написать plugins.yml в нём содержится информация о имени, версии, командах и разрешениях(permissions).
    Пример:
    Код:
    name: CommandEx
    main: CommandEx.Main
    description: Пример работы с коммандами
    version: 0.01
    commands:
      admins:
        description: CommandEx.
        usage: /<command>
      cex:
        description: CommandEx.
        usage: /<command>
    Синтаксис Yaml, поле
    "name" должно содержать название вашего плагина,
    "description" описание,
    "version" версию,
    Дальше идёт группа "commands" это означает что дальше будут команды и их описание.
    Код:
      admins:
        description: CommandEx.
        usage: /<command>
    является блоком команды
    первая строчка это сома команда которая идёт после слеша ("/admins")
    "descriprion" это описание команды , о "usage" поговорим позже.
    Файл yml должен находится на уровне исходных файлов.
    [​IMG]
    [​IMG]
    Я не освоил ещё plugin.yml полностью но полная информация о нём тут
     
  10. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    Работа с командами.
    По мимо событий onDisable() и onEnable() есть событие команды onCommand() оно отличается тем что должно возвращаться true или false (выполнена команда или нет)
    Я не буду копировать весь код, а только выдержки из него сам код в прекреплённом файле.
    Код:
    public boolean onCommand(CommandSender sender, Command command,
                String label, String[] args) {
    как и с onJoin() в функцию передаются некоторые данные
    "sender" игрок который отправил команду
    "command" сама команда
    "label" не углублялся в познание это не потребуется
    "args" аргументы("/cex первый_аргумент второй_аргумент итд")
    command.getName().equalsIgnoreCase("cex") :
    command.getName() получаем имя команды("/команда")
    .equalsIgnoreCase() оператор который выполняет сравнивание
    2х обьектов игнорируя слеш
    ("cex") - то с чем сравниваем
    в итоге command.getName().equalsIgnoreCase("cex") возвращает true или false
    "admins".equals(args[0]) делает тоже самое но уже просто сравнивание текста "admins" и первого аргумента команды (args[0])
    Player[] players = getServer().getOnlinePlayers();
    players является массивом в который записываются онлайн игроки
    дальше идёт цикл for (Player player : players) {
    размером в количество игроков(то есть код в цикле будет повторяться столько раз сколько игроков на сервере)
    при этом в player записывается игрок
    player.isOp() проверяет является ли игрок админом возвращает true или false
    tex = new String[players.length];
    инициализирует текстовый массив размером в количество игроков
    Код:
                            if (i == 0) {
                                tex[i] = player.getPlayer().getName();
                            } else {
                                tex[i] = ", " + player.getPlayer().getName();
                            }
    }
    это конструктор сообщения
    если игрок является первым запятую не ставим
     

    Вложения:

    • CommandEx.zip
      Размер файла:
      866 байт
      Просмотров:
      145
    SHALK97 нравится это.
  11. Автор темы
    wroud

    wroud Активный участник Пользователь

    Баллы:
    88
    Skype:
    Wrouds
    я проверил в 1 игрока всё работает , нужен тест в несколько админов
    Замечен недочёт в статье по командам.
    Конструктор должен выглядеть так:
    Код:
                        if (player.isOp()) {
                            if (i == 0) {
                                tex[i] = player.getPlayer().getName();
                            } else {
                                tex[i] = ", " + player.getPlayer().getName();
                            }
                            i++;
    }
    Ещё недочёт.
    Изменить
    Код:
    tex = new String[players.length];
    на
    Код:
    tex = new String[1];
     
    ВремяПриключений нравится это.
  12. derlafff

    derlafff Активный участник

    Баллы:
    68
    Имя в Minecraft:
    derlafff
    Нашел в твоем "уроке" только две запятые. И то, обе отделены пробелами с двух сторон. Не говоря уже о "премерах".

    Удали, не позорься
     
  13. derlafff

    derlafff Активный участник

    Баллы:
    68
    Имя в Minecraft:
    derlafff
    Так и скажи, что неграмотный и невежда, от того и не умеешь формулировать свои мысли грамотно. Иди лучше книжки почитай, вместо создания таких туториалов с "премерами".

    Я надеюсь, что когда-нибудь ты поймешь глупость своих слов и будешь вспоминать это со стыдом.
     
  14. derlafff

    derlafff Активный участник

    Баллы:
    68
    Имя в Minecraft:
    derlafff
    Начал считать, насчитал 20 недостающих, надоело. И это забывая о "тоесть", "светло коричневая" и "объединении"
     
  15. савва

    савва Активный участник

    Баллы:
    88
    Имя в Minecraft:
    savvok01
    Мне кажется или ты школьник которого мама заставила читать правила все сильного Русского?
    Теперь ты ими так и блещешь! :p Человек старался а ты его так опозорил! Сам ты невежда !
     
  16. derlafff

    derlafff Активный участник

    Баллы:
    68
    Имя в Minecraft:
    derlafff
    Очень интересно, состоишь в "СтопГнида", а, судя по описанию, ведешь себя как раз, как эта "Гнида"
     
  17. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    с итэм татуриалом автара гатов здиладь плогын и многа харошева
     
    fromgate и mayor123 нравится это.
  18. савва

    савва Активный участник

    Баллы:
    88
    Имя в Minecraft:
    savvok01
    ладно все я пошутил :trf:
     
  19. савва

    савва Активный участник

    Баллы:
    88
    Имя в Minecraft:
    savvok01
    локи можешь сделать что то типа minequery тока на 1,3,2
     
  20. wkera

    wkera Старожил Пользователь

    Баллы:
    103
    А вас похоже мама не заставляла читать правила "все сильного"...:fp:
     
  21. савва

    савва Активный участник

    Баллы:
    88
    Имя в Minecraft:
    savvok01
    да ладно пошутил я:D Хватит тему уже засорять!
     

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