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

Как сделать свой плагин для minecraft

  • автор:

Как сделать свой плагин для minecraft

Основой любого сервера майнкрафт, безусловно, являются его плагины. От них на сервере зависит практически всё — их качество и функционал напрямую определяют привлекательность сервера. Чтобы быть более конкурентными среди других майнкрафт серверов — стоит использовать собственные уникальные плагины реализующие Ваши задумки. И если у Вас нет средств для того, чтобы нанимать разработчиков на стороне — самое время научиться писать плагины самому.

First things first

Для начала стоит определиться с основами.
Думаю, ни для кого не секрет что оригинальный сервер майнкрафта написан и работает на Java.
Java — это обьектно-ориентированный язык программирования. Для работы Вашего сервера, Java клиента майнкрафта и написания плагинов под этот сервер вам нужно установить Java.
Начать можете отсюда, отсюда, или отсюда.

Для того, чтобы начать что-то писать под этот сервер нам нужно воспользоваться API.
Основные, наиболее распространенные и популярные API для оригинального сервера, вот неожиданность — тоже написаны и работают на Java (или на любом другом JVM совместимом языке).
Из этого следует что все плагины для наиболее распространенных и популярных API к оригинальному серверу майнкрафта написаны на… (ну, надеюсь, Вы уже поняли).

Что же это за такие “наиболее распространенные и популярные API к оригинальному серверу”, спросите Вы?
А я приведу вам небольшой список таковых:

  • Bukkit
  • Spigot [документация]
  • Paper [документация]

Я не буду охватывать тут всю историю развития этих API, кто от кого форкнулся и так далее, ведь здесь важно другое — абсолютное большинство публичных плагинов что Вы найдете в сети, так или иначе работают с одним (или с несколькими / всеми) из этих API.

Ещё для написания плагинов нам понадобится “среда разработки”.
Если очень упрощённо, то это программа, позволяющая разрабатывать другие программы на определённом языке программирования на несколько порядков удобнее, чем если бы Вы писали код просто в блокноте.
Дальше по статье я буду приводить примеры разработки с использованием Intelij IDEA от Jetbrains, но, в принципе, Вы можете использовать любую другую удобную вам IDE.

Ну и последнее, но не по важности — сам сервер майнкрафта с нужным нам API на борту. Я для этого туториала взял Paper версии 1.19.2 отсюда и в дальнейшем, в статье, буду ссылаться на его API и документацию.
Сейчас Вам достаточно скачать .jar файл сервера. Позже я обьясню как его запустить и как протестировать плагин на нём.

Стартуем

На данном этапе предполагается, что Вы уже установили Java и IDE (среду разработки) на Java и перед вами сейчас открыт приветственный экран Вашей IDE.
Вот мой, например:
IDEA
Сперва нам нужно создать проект. Этим проектом и будет наш плагин.
Кликаем на кнопку ‘New Project’ и перед нами открывается окно создания нового проекта.
New project
С названием, думаю, всё очевидно.

  • Location’ — место на диске, где будет лежать папка проекта.
  • Create git repository’ — создать ли Git репозиторий для проекта. Если у вас стоит галочка — уберите.
  • Language’ — Java, тут всё понятно.
  • Build System’ — а вот с этого момента поподробнее.


Build System — система, через которую будет собираться Ваш проект.
Под сборкой имеется ввиду компиляция всего Вашего кода в исполняемый файл (jar, например) вместе с автоматическим внедрением в него всех зависимостей, библиотек и так далее.
Есть много различных сборщиков — Maven, Gradle, Ant и т.д., но в этом туториале я остановлюсь на Maven — как на самом простом, по моему мнению, в освоении, для начинающих разработчиков.

  • JDK’ — или Java Development Kit та самая Java которую Вы должны были уже установить ранее. Если вам повезло — IDEA сама автоматически определит доступную вам версию JDK. Если нет — вам придётся указать её локацию на диске вручную.
  • Add sample code’ — просто сразу добавляет в проект готовый пакет с классом в нём.
  • Advanced settings’ — в нашем случае тут расположены настройки для сборщика Maven.
  • Group Id’ — уникальный идентификатор Вашего проекта.
  • Artifact Id’ — название собранного сборщиком скомпилированного файла.


После того, как Вы всё настроили — жмём кнопку ‘Create’, и перед нами открывается окно с проектом.
project created
Немного отвлечёмся и поговорим о структуре плагинов, написанных под Paper API (и все его форки).
Для того, чтобы сервер понимал, что перед ним именно плагин, а не странный файл с расширением .jar — в каждом из плагинов есть файл plugin.yml — в котором подробно описывается что перед сервером за плагин, кто его автор, где расположен главный его класс, какие команды есть у плагина и т.д.

Мы начнём именно с создания и наполнения этого файла. Создаём в папке resources файл plugin.yml -> кликаем правой кнопкой мыши на resources -> New -> File -> вводим plugin.yml .
Заполняем файл следующим образом:
plugin.yml
Подробное описание каждой записи в файле есть здесь.
Из самого важного — нужно указать правильный путь до главного класса плагина ( main ), в моём случае это me.xezard.firstplugin.FirstPlugin . Если путь будет указан неверно — плагин не запустится.

Теперь нам нужно создать соответствующие указанному ранее пути пакеты и главный класс плагина.
Создаём нужные пакеты — кликаем правой кнопкой мыши на me.xezard (в Вашем случае это может быть Ваш собственный ранее созданный пакет) -> New -> Package -> вводим firstplugin .
Важно: новый пакет в таком случае создаётся относительно уже существующего. Полный путь получится следующим — me.xezard.firstplugin .
⁣Давайте заодно удалим класс автоматически созданный нашей IDE — класс Main .
Жмём правой кнопкой мыши по нему -> Delete -> Ок. Готово.

Вот мы и добрались до создания первого класса плагина и по совместительству — главного его класса.
Жмём правой кнопкой мыши на ранее созданный нами пакет -> New -> Java class -> вводим то имя класса, которое мы ранее указали последним в main секции файла plugin.yml — в моём случае это ‘FirstPlugin’.
Итог всех приведённых выше манипуляций выглядит следующим образом:
main class
Вновь немного отвлечёмся на настройку сборки нашего плагина. В данный момент мы никак не сможем взаимодействовать с API сервера майнкрафт — среда разработки ничего не знает о нём и его структуре. Для того, чтобы это исправить, нам нужно добавить API в проект, в моём случае это будет Paper API (форк Spigot API), в файл pom.xml . pom.xml — это, по сути, подробное описание нашему сборщику как конкретно собирать проект. Я не буду останавливаться на этом и подробно обьяснять что означает каждая из строк в файле — на это вполне может уйти пара отдельных гайдов. Сейчас вам достаточно привести Ваш pom.xml к следующему виду:


Если очень кратко — то в файле мы указали под какую версию Java будет скомпилирован плагин, указали репозиторий, где находится Paper API и указали что наш плагин зависит от этого API в секции <dependencies> .

Пришло время для самого интересного — написания кода. Cтоит начать с того, что любой плагин написанный под Paper API (и его форки) в своём главном классе обязательно должен наследовать класс JavaPlugin.
Для наследования в Java используется ключевое слово extends.
Изменим код класса на следующий:
main class
Я постарался максимально понятно расписать за что отвечает каждая строка в классе. Сейчас, если скомпилировать плагин, добавить на сервер и запустить его — при включении или выключении плагина сервером он выведет в консоль соответствующие сообщения.

Компиляция плагина

Пришло время собрать наш код в jar файл! Если Вы, также как и я, используете IDEA для написания кода — просто откройте панель ‘Maven’ справа в верхнем углу, нажмите левой кнопкой мыши на название Вашего плагина и далее на зелёный значок Play.
build
Если до этого момента Вы всё делали правильно — Вы увидите открывшуюся консоль и по прошествии некоторого времени надпись ‘BUILD SUCCESS’.
build success

Тестируем плагин

Помните сервер, который Вы скачали в начале статьи? Его время пришло.
Переместите .jar сервера, который Вы загрузили в отдельную папку. Если вы являетесь пользователем операционной системы Windows (как я), то создайте в этой же папке скрипт start.bat со следующим содержимым:


Важно: paper.jar что указан в этом файле — это название Вашего файла сервера в папке. Если название не будет совпадать — скрипт не запустит Ваш сервер. Параметры Xms и Xmx используются для выделения процессу сервера оперативной памяти. Я использовал 1 гигабайт, но Вы можете указать свои значения. Главное, чтобы выделенной оперативной памяти хватало для работы сервера.

После того, как Вы закончили редактировать файл — запустите его двойным кликом мыши. При первом запуске сервера, как ни странно — он не запустится. Вместо этого он сначала предложит вам принять соглашение EULA.
Cейчас Вам достаточно открыть файл eula.txt и поменять строчку eula=false на eula=true и сохранить файл.
Теперь запустите сервер повторно и после надписи ‘Done! For help, type “help”’ напишите в консоли stop и нажмите Enter.
Повторный запуск был необходим для того, чтобы сервер сгенерировал все свои файлы.

Вернитесь в папку в которой лежат файлы Вашего плагина и перейдите в папку target — в ней лежит скомпилированный плагин, в моём случае это FirstPlugin.jar. Переместите его в папку сервера, в подпапку plugins, после этого запустите сервер.

Если вы шли в точности по статье и всё делали правильно, то в консоли сервера вы сможете увидеть заветное сообщение:
success
⁣⁣За сим первая часть этой замечательной статьи подходит к концу. Во второй части мы рассмотрим создание команд, отслеживание событий сервера и работу с конфигурацией плагина.

[Урок][Глава 1] Учимся писать плагин для сервера

[Урок][Глава 1] Учимся писать плагин для сервера

Вводим там следующие пункты
1. name — Название вашего проекта
2. main — Название.main.Название — Будет использоваться чтобы использовать плагин на сервере
3. version — версия плагина.

[Урок][Глава 1] Учимся писать плагин для сервера [Урок][Глава 1] Учимся писать плагин для сервера

Далее мы создаем Package в файле scr и в Package создаем Class. Все файлы называть как название плагина.

[Урок][Глава 1] Учимся писать плагин для сервера

Когда вы создадите файл, вы должны добавить к 2 строке extends JavaPlugin, затем, навести на него курсор и нажать импорт. После чего, у вас появится строка с импортом для работы плагина

[Урок][Глава 1] Учимся писать плагин для сервера

И так. Дабы не томить вас нудными скринами, составил вам сразу готовый код выдачи лога в консоль. Давайте же разберемся, а не тупо спишем.

private Logger Log — Создает лог плагина, после чего, идут сообщения в консоль.
public void onEnable () < - Данное действие при запуске консоли(сервера), будем информировать нас и включать плагин
getLogger().info(«Enabled!») — Благодаря этому, в консоль будет выводиться сообщение «Enabled», когда плагин будет включен
log.info(«MAIN LOGGER») — Включается когда запускается консоль
log.warning(«Warning») — Включается когда имеется баг
log.error(«Error») — Включается, когда идет фатальная ошибка (полностью отключается плагин)
Все это выше выводит всё в консоль
public void onDisable() < - Данное действие будет выключать всё при выключении сервера
getLogger().info(«Disabled») — Выключение плагина. Выводит сообщение в консоль

Вы наверное спросите, зачем мы пишем < и >> Несколько раз?
Дело в том, что эти скобочки, открывают взаимодействие с пабликом. Если после ввода public void onEnable() поставить <, то все ниже коды будут выполняться тогда, когда паблик начнет их выполнять.
Чтобы закрыть паблик, нужно ввести >. Чтобы полностью закончить код, нужно в самом конце и в самом начале строке, написать еще раз >. Это означает, что паблик и код завершены

В сегодняшнем уроке, мы научились выставлять сообщение в консоль о запуске/выключении консоли.

Minecraft Plugin Development — New Guide For 2023

Matej Pacan

How to make Minecraft plugins for Bukkit, Spigot and Paper. Updated for 2023 and Minecraft 1.8.8 to 1.20.

Best Minecraft servers in the world offer majestic level of detail and are tailored to their needs.

This might include crazy minigames combining everything the game has to offer, attracting hundreds of thousands of players and generating servers like Hypixel upwards of $15m in revenue per year.

This is all made possible using Minecraft plugins. Today, I’ll show you how you can create your own.

What Is A Minecraft Plugin

A plugin is an extension for the Minecraft multiplayer server. Plugins can change certain aspects of the game, adding new commands, events, minigames or other game mechanics. Plugins do not require players to modify their client before connecting to the server as mods do, making them easy and convenient.

Examples of popular plugins include WorldEdit, EssentialsX, DiscordSRV or ChatControl Red.

Prerequisites

  • Minecraft Java Edition
  • Local Minecraft server (I recommend Paper)
  • IntelliJ IDEA or Eclipse installed (I recommend IntelliJ)
  • Some knowledge of Java (if you don’t have any, keep reading)

I covered the basics of installing IntelliJ, a local Paper server and creating and compiling your first dummy Minecraft plugin here.

You should continue this tutorial with some knowledge of Java.

There are plenty of great resources out there, such as the Java Masterclass™ training. It offers 1:1 mentorship and is designed specifically for Minecraft plugins, so I recommend checking it out even if you just plan on creating plugins recreationally.

Project structure and first steps

Before we make an actual Minecraft plugin, we need to setup our project first. This is a folder in which you’ll have your plugin’s source code.

For this guide, we’ll be using IntelliJ with an extension called “Minecraft plugin development”, which streamlines this process.

Our project will also contain a file called pom.xml, which is used by a tool called Maven to compile the plugin, and manage our dependencies, such as Spigot API or any other library you want to hook into.

This process is covered in my Gist article called “The 15-Minute Minecraft Plugin Tutorial”.

When you are finished, your plugin structure should look similar to this. I named my plugin “Challenge”:

Making Our First Plugin Challenge

Now that you have your project ready, let’s begin the real stuff.

“Minecraft But Each Block You Mine, Spawns a Random Mob”

My first idea was inspired from this video from Boffy, which got over 6m views — whenever you mine a block, it spawns a random mob.

It’s very simple, all you have to do is listen for block breaking and then spawn a random mob.

I recorded a full video tutorial about game events, click this link to see it.

First, I’ll create a new class called BlockListener, make it implement the Listener interface from the org.bukkit.event package and register it in our main class.

This is our BlockListener class where we’ll listen for breaking blocks:

And this will be the main plugin class that registers our block listener:

Now, inside BlockListener, we’ll add a method called onBlockBreak.

The Minecraft server will scan all methods in each class implementing a Listener and look for public void methods having @EventHandler annotation over them, as well as a single parameter being the event itself.

Here is our method:

The event provides a straightforward way of getting the player and the block.

Getting Random Entity

Now, how do we spawn a random mob? For this, we can use the EntityType class.

This is an enum, allowing us the random calculation. Each enum in Java has constants with an internal ordinal number, similar to indexes in an array. For example, in our enum, there are constants ZOMBIE, SKELETON, and CREEPER. The ZOMBIE has ordinal 0, SKELETON has a 1 and CREEPER has a 2.

Now, we can use this knowledge to generate a random number between 0 and the amount of contants. To achieve this, I will be using the Random class from Java package.

Validation Check

Next problem is that, not all entity types are alive and spawnable.

Such as a snowball is not a valid mob, so we need to ignore them using “while” loop and keep iterating until we find the first valid one.

This is the implementation for Spigot or Paper. It should work on Minecraft 1.8.8 to the latest one.

PS: You can ignore players in creative by adding “if (event.getPlayer().getGamemode != GameMode.SURVIVAL)” condition above the while loop.

Let’s test the code to see what happens!

Our Second Challenge: Bloodmoon Event

Now, we’re going to be creating a hardcore night challenge that will spawn overpowered monsters when the sun is down.

To edit our monsters, we can listen to CreatureSpawnEvent event and do our logic there.

Calculating Minecraft Night

A Minecraft world lasts for 20 minutes and its time is measured in ticks. There are 20 ticks in one second, therefore 20 minutes * 60 = 1200 seconds * 20 = 24,000 ticks per a daylight cycle.

Using /time set command, I figured out know it’s pretty dark when the time is above 12,300, so I will call event.getEntity().getWorld().getTime() and return the code if it is below that value.

Creating Custom Mobs

Next, I’ll check if the entity type is Zombie or a Skeleton, I want to add them some special armor.

Check out my video tutorial on making custom items and marking entities with invisible metadata, so you can track custom monsters later.

Next, let’s turn half of the Zombies into babies. I will use the Random field from earlier and call its “nextBoolean()” method, which returns a 50% chance to accomplish this.

Further, let’s give Skeletons some overpowered Bows. I will create a custom Bow item (see the video tutorial above) add the Arrow Fire enchantment to a Bow and then add it to Skeleton’s hand.

Notice: For compatibility reasons with 1.8.8, I use setItemInHand(), but if you only want to support Minecraft 1.9+ you can use setItemInMainHand().

Finally, let’s make Creepers powered, making them glow and give way more powerful explosions.

This is going to be an exciting night! Here is the full code:

Now, let’s move to our next challenge.

Building A House Using ChatGPT

Let’s spice this challenge a little further. It’s 2023, and we can use AI to generate simple Minecraft code snippets.

ChatGPT answers are not always accurate and require you to correct its code, but they can still save some time and get you started.

Creating A Custom Minecraft Command

I want to build a simple house-like structure, complete with a roof and floor.

To achieve that, we’ll need to create a /house command.

I recorded a video tutorial on creating custom commands here. Make sure to check it out before continuing!

There are two places where you need to register your command. First, we need to open our plugin.yml and create our command in the commands section.

It can look something like this (if you need help, see my video tutorial above):

Then, we need to create the command class itself. Each command class implements CommandExecutor interface and must implement its onCommand() method.

Return false in the onCommand() method if you want Bukkit to display the “usage” key from the command in plugin.yml from above. Otherwise return true.

Also, don’t forget to register your command in the onEnable() method in your main plugin’s class!

If you run this command from a console, the CommandSender will actually be implemented by ConsoleCommandSender so we need to make sure it is a player:

Using ChatGPT To Develop Minecraft Plugins

Now, here comes the fun part. I played with ChatGPT and found that it generates a nice house with two holes in it using the following prompt:

I am a power user. Write a Spigot API command to build 4 stone walls around the player in all four directions to resemble house walls. Then, place cobblestone at the floor and glass on the roof. Make the walls 5 blocks wide around the player’s center. Leave two blocks empty in the stone wall in the shape of a door so the player can escape the walls. Make it work for both Minecraft 1.8.8 and 1.17 where some material names are different.

I have taken its code, added a try-catch block around it to catch any potential errors, and voila, we have a fully functional command!

If the command won’t run for you, make sure you have registered it in the onEnable() method in the main plugin’s class as I wrote earlier.

Look at our beautiful house — it’s quite big too!

Broadcasting Messages With A Bonus

And now comes the final, most difficult but also the most rewarding challenge…

We’ll broadcast timed messages with a sick twist, each time a message is broadcasted, a Wither will appear behind the player!

We will be using custom config and a timed task for maximum customization — you will actually be able to sell a plugin like this!

Creating Custom Config

Bukkit, Spigot and Paper make it very easy to have a custom configuration for your plugin. Simply create a new config.yml file in src/main/resources folder next to plugin.yml.

Check out my video tutorial on making custom settings, including your own files other than config.yml with custom names!

The .yml files use YAML syntax, let’s put some initial values into it so we can use in the timed task.

I simply want to specify the period between each broadcast, and then let my plugin customer decide if he wants to spawn a custom mob or not, let him pick the entity type and set a message the player will see.

Here is what I placed there:

To make this magic work, place “saveDefaultConfig();” in the onEnable() method in your main plugin’s class. Next time you start the server, a config.yml file will appear in your plugin’s folder.

Creating A Bukkit Runnable

Next, let’s create a runnable task where the spawning will take place.

There is a special class BukkitRunnable in Bukkit. To learn more about all the different delayed, or timed tasks, check out my video tutorial here!

Here is a dummy class:

In your onEnable() method, I will get the server’s scheduler and set it to execute the code in the run() block depending on the value in my config.yml:

Notice I am multiplying the config number with 20, that is because Bukkit operates in ticks — we need to convert our seconds into them, and 1 second = 20 ticks.

Creating Static Plugin Instance

Now, if you want to call getConfig() from any other class, you need to get the main plugin’s class instance.

For that, some people prefer using dependency injection. I think that is too much repetitive code and too much hassle, so I simply store the plugin’s instance as a static field.

Obviously, if you are coding for NASA or Bank Of America, you probably want higher coding practices, but for Minecraft plugins, this is the easiest and fastest way.

Sending Colorized Player Message

Also, I’d like to replace & color codes with actual colors so that my plugin customers can use colors in their config message, so I’ll just make a static method for that and place it to the main class.

If you’re on Minecraft 1.16+ and want to use RGB colors, including gradients, I made a video tutorial on that as well. You will need to adjust the method above.

This is a useful method because it retrieves a config key, replaces colors in it and sends it as a message to the player automatically.

Adding It All Together

Now, let’s implement the timed task.

We’ll simply iterate for each online player, get its location, use his direction and convert it into a vector to spawn the custom mob exactly 3 blocks behind the player (sneaky!), and send him our message.

There is numerous ways to do this in Bukkit, here is how I did it:

Wow! We did a lot of work today! Check out our beautiful creation:

Obviously, you will end up flooding your server with Withers, so:

Anti-Lag And Entity Limit

I recommend adding a limit where you call getWorld().getLivingEntities() and then you count all custom mobs in loaded chunks.

We will need to adjust our code a bit so that instead of iterating through all players, we look for each world and players within it:

Obviously, if your custom entity is a generic one like a Zombie, this code will count all Zombies, not just your custom mobs. You will need to mark your custom mob with invisible metadata for that. Check out my free video tutorial on how to do this.

Conclusion

If you followed this tutorial down here, you should have a basic knowledge of how Minecraft plugins work and be able to create a simple challenge plugin.

There is way more to discover than what I covered today. That is why I am doing a 100% free YouTube Minecraft plugin development series on my channel, where you can learn how to make more advanced Minecraft plugins yourself.

Now, if you want to take this knowledge to the next level, including mastering Java, I highly recommend Project Orion™ training.

Inside, students get 1:1 access to instructors on weekly coaching calls, as well as 7 weeks of advanced training to build minigames, understand packets, anti-cheats and practically all coding aspects of Bukkit.

A lot of people landed 6-figure international developer positions, grew their Miencraft networks to 1,000+ players, and more. Click here to learn more about Project Orion™.

Разработка собственного плагина для сервера Minecraft

Еще с детства я начал покорять бесконечные просторы Minecraft. Естественно о разработке в то время никакой речи не шло. Но с недавних пор загорелся идеей создать о свой проект серверов.

На Java до этого никогда не писал, но есть бекграунд на других языках, поэтому осталось только приспособиться. Соотвественно разработка плагинов, Bukkit и другие библиотеки вижу впервые, но посмотрев несколько туторов, стала понятна примерная концепция.

Ранее писал на таких языках как PHP, JS. В данный момент веду разработку на языке Go. Сильно привык к «гошке» и его синтаксису и в процессе написания плагина часто использовал синтаксис Go для написания логических конструкций.

Мне не сильно хотелось использовать какие-то готовые решения, ведь тогда не будет углубленных знаний, которые я получу в процессе написания кода. Хочется одновременно и поучить Java и написать что-то свое (самое главное).

В этой статье я не буду затрагивать процесс настройки окружения, установки IDE и стороннего софта.

Идея плагина

На серверах часто используются постройки, находящиеся в пустоте, например летающие лобби, острова. Такую модель постройки мы выбрали вместе с моим другом: летающие острова. Одной из проблем таких построек — Игрок может провалиться в пустоту и не выбраться.

Прошерстив Google мне удалось найти парочку подходящих плагинов, которые уже решают это проблему. Но один из них, который оказался поддерживаем разработчиком и самими ядром сервера, предоставлял ограниченный функционал, расширенный можно было приобрести на X евро. Фича, которая мне понравилась в платном плагине — создание анимаций из частиц после телепортации из пустоты.

Мне захотелось самому понять, как это сделать, разработать собственный плагин, а потом с удовольствием им пользоваться, поддерживать, находить баги — мое мелкое детище, как никак.

Создаем сам плагин

Назвал я плагин просто — VoidTeleport.

Первым делом создал класс для управления конфигурацией плагина.

Отлично! Класс для работы с конфигом уже есть, теперь нужно определиться со структурой файла config.yml . Нужно реализовать поддержку для разных миров, поэтому не придумал ничего проще, как просто указать список нужных миров.

Конфиг есть, теперь можно приступить к созданию обработчика событий. Мой выбор пал на событие EntityDamageByBlockEvent. Можно было бы и слушать событие PlayerMoveEvent, но оно случается гораздо чаще, чем триггер на получение урона. Лишняя нагрузка на сервер не нужна, поэтому стал слушать урон.

Тепер разберем вызов эффекта анимации при телепортации Spiral.spawn(player) . Назвал класс Spiral, потому что эффект будет в виде спирали.

Т.к. это мой первый плагин, то не стал заморачиваться с Пакетами и ProtocolLib.

Описываем анимацию в отдельном классе Spiral. Я предпочел реализовать спираль под названием Helix — достаточно простая в реализации модель. Пришлось немного вспомнить тригонометрию, но у меня получилось!

Почему в коде 23? Это число является ограничением для координаты y. Т.е. по сути спираль будет подниматься вверх на y = 2.3 . Как можно заметить, при указании смещения particleLocation.add(x, y / 10, z) y делится на 10. Еще одной причиной стало то, что спираль не успевает несколько раз «обернуть» игрока.

Собираем все вместе

Наконец можем собрать наш код в единой точке и протестировать, что получилось.

Результат

При заданным настройкам файле конфигурации мы успешно попадаем в указанную точки и наблюдаем просто классную анимацию, как по мне.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *