Что такое Denizen?

Так что же такое Denizen?

Коротко: Denizen — это язык скриптов!

Чуть подробнее: Denizen — это плагин для Spigot-серверов, который автоматически загружает и выполняет пользовательские скрипты, позволяя владельцам серверов быстро и удобно настраивать свой сервер как угодно — примерно так же, как разработка собственных плагинов, только в десять раз быстрее и в десять раз проще!

Давайте будем чуть более формальны

Скрипты Denizen оформлены в YAML-подобной структуре — ради простоты и привычности. Вам когда-нибудь доводилось править YAML-конфиги какого-нибудь плагина на своём сервере? Представьте, что вы точно так же правите простой YAML-конфиг, только с ним можно делать вообще всё что угодно!

Сам синтаксис внутри секций скрипта — это синтаксис «команда-тег»…

  • Команда: Понятие, знакомое большинству владельцев серверов — вы постоянно пользуетесь командами, вроде /gamemode creative или /tp player. В Denizen всё то же самое, только вместо / используется -.

  • Тег: Понятие одновременно знакомое и непривычное. Если посмотреть документацию какой-нибудь команды, там может быть написано, например, /tp <player> — то есть в первый аргумент нужно подставить имя игрока. Тег в Denizen — это, по сути, такой же «подставь-меня-сам» плейсхолдер, который умеет заполнять себя сам. Когда вы пишете в скрипте Denizen <player>, система автоматически подставит туда нужного игрока. В этом и состоит фокус, превращающий набор простых команд в динамичные и мощные скрипты.

Как это выглядит?

Вот пример простого скрипта Denizen:

my_example_script:
    type: task
    script:
    - narrate "Hello there, <player.name>!"
    - wait 5s
    - hurt <player> 1

При запуске этот простой скрипт сделает вот что: поприветствует игрока по имени (подставится автоматически), подождёт 5 секунд, а затем нанесёт игроку 1 единицу урона.

Это похоже на программирование?

Тем, кто уже знаком с программированием на других языках, многое в Denizen можно объяснить через аналогии с этими языками (if-конструкции, циклы foreach и т. п. — по сути эквивалентны), но важно понимать, что между Denizen и такими языками, как JavaScript, C# или большинство других распространённых языков, есть ряд принципиальных отличий. Если вы уже знаете один из них — освоить Denizen вам будет довольно легко. Только не пытайтесь писать скрипты Denizen так же, как пишете код на обычных языках программирования: это совсем другое. В зависимости от ваших предпочтений в языках программирования, вы можете приятно удивиться, насколько удобнее Denizen по сравнению с теми языками, которыми вы пользовались раньше.

Если вы вообще не знакомы ни с каким языком программирования, не переживайте — Denizen изначально спроектирован так, чтобы быть дружелюбным и простым в освоении для людей без опыта. Здесь полным-полно инструментов и помощников, которые делают изучение и работу с Denizen куда проще, чем с более «пугающими» языками вроде Java.

Denizen проще в изучении и использовании… в чём подвох?

Сейчас некоторые читатели наверняка подумали: «Ну тогда он явно куда менее мощный, да?» … и вот в этом-то и забавный момент. На Denizen зачастую можно сделать больше, чем на Java-плагине. Есть исключения (ради шутки нельзя подключить какую-нибудь случайную Java-библиотеку для шахмат, как это можно сделать в Java), но когда речь идёт о взаимодействии с Minecraft-сервером, Denizen не только покрывает большую часть функциональности Bukkit API и поверх этого даёт огромный набор дополнительных утилит и «фишек для удобства», но и открывает доступ к целому пласту возможностей, которые в Bukkit не выставлены — через NMS-вызовы. Например: в Bukkit нет API, чтобы воткнуть стрелу в сущность, а Denizen делает это одной короткой командой. В Bukkit нет события на сообщения, отправленные игроку, а Denizen без проблем их перехватывает — и при этом у Denizen есть команда light, готовая к использованию в любой момент. Подобных фич ещё очень много, и многие попадают в категорию «почему Bukkit этого не умеет?! Это же так полезно!»

Другой возможный подвох, который приходит на ум: производительность. Работают ли скрипты так же быстро, как чистый Java-код? Ну… и да, и нет. Если взять жёсткое сравнение один-в-один — тесный цикл на Java против тесного цикла на Denizen — Java, конечно, победит без труда. Но в реальных сценариях Denizen держится на достаточно высоком уровне, и для 99% скриптов, которые вы можете написать, заметного падения производительности не будет. Опытные скриптеры воспроизводили функциональность таких плагинов, как WorldGuard, и при этом сервер продолжал работать на полной частоте тиков без каких-либо проблем.