1 год на форуме Топ пользователь 5000 просмотров Все
Награды
1 год на форуме
1 год на форуме
Топ пользователь
Топ пользователь
5000 просмотров
5000 просмотров
Пишем простой плагин для Minecraft Server
  13445
Итак, мальчики и девочки. Многие из нас играют в эту замечательную песочницу. И чуть меньше людей желают открыть свой сервер со своими шахматами и пионерками, со своим набором плагинов… Но случается и так, что нужного плагина порой не найти или нужна какая-то мелочовка, которая вшита только в монструозные плагины.
Сегодня я вас научу как писать плагины для сервера майнкрафта.

Подготовка.
Нам понадобятся следующие «инструменты»:
1. клиент minecraft;
2. сервер Bukkit;
3. Bukkit API;
4. среда разработки Eclipse;
5. базовые знания Java.
Если базовых знаний по Java нет, то я надеюсь, что хоть по какому-то языку программирования у вас есть базовые знания (тот же pascal abc). Если их нет то вам тут делать почти нечего .В таком случае бежим в гугл и ищем самоучители/учебники/справочники по Java.
Все ссылки даны в конце статьи.

Устанавливаем и запускаем Эклипс. Знакомить вас с его интерфейсом не стану. В Гугле можно много статей на эту тему найти.



Первым делом, создаем новый проект (Java Project).



В появившемся окне, в поле Project name, пишем любое название. В группе JREможно
выбрать версию библиотек Java, которые будут подключены к проекты. Хотя я не знаю на сколько это сильно влияет на результат, но всегда можно изменить эти параметры в настройках проекта и занаво пересобрать плагин.
.

Слева, в Package Explorer, мы увидим наше древо проекта. Там пока ничего путного нету. Даже компилировать нечего. Исправим ситуацию. Добавим сначало Пакет(package). Грубо говоря,
Пакет – это пространство имен(namespace) и служит для унификации переменных и функций.
В полу Name вводим имя пакета. Формат имени должен быть примерно такой: me.dmitriymx.firstplg.

Теперь добавим Class в пакет.
В поле Name вводим имя нового класса (у меня это DmxFirstPlugin).
Все остальные пункты оставляем как етсь и подтверждаем создание.
Вот вроде и всё с подготовкой… Хотя нет. Забыли про Bukkit API. Скачиваем в любую папку(лучше в ту же, где и workspace, чтобы не потерять) и подключаем его к проекту. Для этого кликаем пкм(правой кнопкой мыши) на папке вашего проекта в Package Explorer и выбираем Properties. В появившемся окне, слева, выбираем пункт Java Build Path. Справа теперь выбираем Libraries. Далее жмем кнопку Add External JARs и выбираем скаченный Bukkit API.



Создание каркаса для плагина

Теперь приступим непосредственно к программированию.

Изменим это
public class DmxFirstPlugin{
на это
public class DmxFirstPlugin extends JavaPlugin{
Эклипс подчеркнет нам JavaPlugin, указывая на ошибку в коде. Если подвести мышь к такому подчеркнутому коду, то откроется окошко с описанием ошибки и способы ее решения. В данном случае нам нужно импортировать класс из Bukkit API, для чего выбираем пункт Import ‘JavaPlugin’(org.bukkit.plugin.java). И сразу же замечаем. как над всем нашим кодом вписалась строчка
import org.bukkit.plugin.java.JavaPlugin;
Но вот опять Эклипсу что-то не нравится и он нам подчеркивает теперь класс DmxFirstPlugin. Повторяем трюк с подсказкой и выбираем первый пункт решения проблеммы: добавить недостоющие методы нашего класса. После этого, нам допишут 2 метода: onEnabled и onDisabled.

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

Событие onDisabled, соответственно. происходит при отключении плагина во время выключения сервера. Этот метод используют как деструктор, где освобождается память от уже ненужных данных и закрываются разного рода соединения(если, напиример, плагин подключался к бд)

Теперь «закрепим» на переменной вывод консоли сервера. для этого, перед всеми методами напишем:
private static final Logger mclog = Logger.getLogger("minecraft");
А в методах onEnabled и onDisabled:
public void onEnable() {
mclog.info("[DmxFirstPlugin] Start");
}

public void onDisable() {
mclog.info("[DmxFirstPlugin] Stop");
}
В итоге, должен получится вот такой вот код:
package me.dmitriymx.firstplg;

import java.util.logging.Logger;

import org.bukkit.plugin.java.JavaPlugin;

public class DmxFirstPlugin extends JavaPlugin{
private static final Logger mclog = Logger.getLogger("minecraft");

@Override
public void onDisable() {
mclog.info("[DmxFirstPlugin] Stop");
}

@Override
public void onEnable() {
mclog.info("[DmxFirstPlugin] Start");
Последний штрих перед компиляцией. Надо добавить файл описания для нашего плагина.
Клик пкм по src, New->File. В File name пишем plugin.yml. В него пишем следующий текст:
name: FirstSamplePlugin
main: me.dmitriymx.firstplg.DmxFirstPlugin
version: 1.0
А вот теперь компилация.

<CTRL+S> для сохранения кода. Клик пкм по папке src и выбираем Export. В окне открываем папку Java и выбираем там JAR file. После нажатия на Next, жмем на Browse и сохраняем файл сразу в папку плагинов сервера(plugins). Finish.

Запускаем сервер и убеждаемся, что все работает как мы хотим:


На сегодня всё. Мы получили каркас для будующих плагинов.
Ответов 1
  • ZAKA_Network
    6 апреля 2018
     

    package ru.luvas.rmcs.api.example;



    import org.bukkit.entity.Player;

    import org.bukkit.event.EventHandler;

    import org.bukkit.event.EventPriority;

    import org.bukkit.event.entity.EntityDamageEvent;

    import org.bukkit.event.entity.EntityRegainHealthEvent;

    import org.bukkit.event.entity.FoodLevelChangeEvent;

    import org.bukkit.event.player.PlayerJoinEvent;

    import org.bukkit.event.player.PlayerQuitEvent;

    import org.bukkit.event.player.PlayerRespawnEvent;

    import ru.luvas.rmcs.api.RMCSAPI;

    import ru.luvas.rmcs.api.scoreboard.AnimationGamma;

    import ru.luvas.rmcs.api.scoreboard.ScoreboardAPI;

    import ru.luvas.rmcs.api.util.AutoListener;

    @Example

    public class ScoreboardExample {



    private final static ScoreboardAPI api = RMCSAPI.getScoreboardAPI();



    public static void load() {

    api.prepare();

    api.setDisplayName("Немного инфы о тебе", AnimationGamma.GOLD);

    //Общие для всех строки:

    api.addGlobalScore(7, "&r&r&r");

    api.addGlobalScore(4, "&r&r");

    api.addGlobalScore(2, "&r");

    api.addGlobalScore(1, "&6Наш сайт: &bwww.dms.yt");

    new AutoListener() {



    @EventHandler

    public void onJoin(PlayerJoinEvent e) {

    setup(e.getPlayer());

    }



    @EventHandler

    public void onQuit(PlayerQuitEvent e) {

    api.invalidate(e.getPlayer());

    }



    @EventHandler(priority = EventPriority.MONITOR)

    public void onDamage(EntityDamageEvent e) {

    if(e.getEntity() instanceof Player)

    api.updateScore((Player) e.getEntity(), 6, "Здоровье: &a%d", (int) (((Player) e.getEntity()).getHealth() - e.getFinalDamage()));

    }



    @EventHandler(priority = EventPriority.MONITOR)

    public void onRegainHealth(EntityRegainHealthEvent e) {

    if(e.getEntity() instanceof Player)

    api.updateScore((Player) e.getEntity(), 6, "Здоровье: &a%d", (int) (((Player) e.getEntity()).getHealth() - e.getAmount()));

    }



    @EventHandler(priority = EventPriority.MONITOR)

    public void onRespawn(PlayerRespawnEvent e) {

    api.updateScore(e.getPlayer(), 6, "Здоровье: &a%d", (int) e.getPlayer().getMaxHealth());

    }



    @EventHandler(priority = EventPriority.MONITOR)

    public void onFoodLevelChange(FoodLevelChangeEvent e) {

    api.updateScore((Player) e.getEntity(), 5, "Голод: &a%d", e.getFoodLevel());

    }



    };

    }



    private static void setup(Player p) {

    api.addScore(p, 6, "Здоровье: &a%d", (int) p.getHealth());

    api.addScore(p, 5, "Голод: &a%d", p.getFoodLevel());

    api.addScore(p, 3, "Твой ник: &a%s", p.getName());

    }



    }

    0
Обратная связь