CloudMeteorite — ивент «Метеорит»

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

Что это

CloudMeteorite — ивент-плагин для Paper 1.19.4, заявлен как дополнение линейки Cloud Ultra Anarchy+ и её фирменной лавкрафтианской тематики: метеорит подан не декорацией, а обломком чего-то древнего, рухнувшего с неба на голову серверу. Плагин сам поднимает шар из угля и магмы в случайной точке карты, запускает вокруг него огненный дождь, запирает лут в четырёх сундуках до истечения таймера — а затем сам убирает за собой, возвращая рельеф как было, вплоть до последнего блока.

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

Как проходит ивент

Падение и постройка шара

Место падения плагин обычно выбирает сам — случайная точка в радиусе (по умолчанию 200 блоков) от заданного центра карты, всегда на поверхности: высота берётся по самому верхнему блоку в этой точке. Либо администратор задаёт точные координаты командой. Перед постройкой плагин снимает снапшот всего куба 9×9×9 — это 729 блоков (2×радиус+1 при радиусе шара 4) — вокруг центра, чтобы потом вернуть рельеф один в один, блок за блоком, вместе с его ориентацией.

Дальше — сама постройка. Внутри сферы радиусом 4 блока для каждой позиции: примерно в 20% случаев блок вообще не трогается (сквозь метеорит проглядывает то, что было — трава, камень, воздух), из оставшихся — около 5% превращаются в карманы лавы, а всё прочее становится обшивкой: уголь и магма пополам у самой поверхности, а глубже, в «ядре» — смесь угля, магмы и незеррака. В сумме получается не ровный шар, а обгоревшая, повреждённая на вид глыба со следами удара. Если на сервере стоит WorldEdit и в конфиге указан файл схематики — вместо генерации вставится готовая заготовка (отдельной настройкой решается, перезаписывать ли воздухом существующий рельеф); нет файла или плагина — CloudMeteorite тихо строит метеорит сам, без ошибок и без остановки ивента.

Тут же, в 7 блоках от центра (радиус шара + 3) по четырём сторонам света, вырастают 4 сундука — каждый на высоте своей точки, не обязательно вровень с самим метеоритом. Лут в них закладывается сразу, в момент постройки, а не в момент разлочки: сундук уже полон, просто открыть его раньше времени не даёт защита зоны.

Удар: звук, вспышка, тайтл и боссбар

В момент удара срабатывает целая пачка эффектов разом. Звук взрыва (по умолчанию — генерик-экспложн) с громкостью 1.5 и высотой тона 0.8 звучит для каждого игрока в мире метеорита — причём проигрывается он «у самого слушателя», так что слышно его одинаково громко всем в этом мире, а не только тем, кто рядом с ударом. На месте падения дополнительно вспыхивают 5 крупных взрывных частиц и рассыпаются 40 частиц лавы — а вот это уже видно только тем, кто физически близко, в обычной дальности прорисовки частиц.

Отдельно стоит сверить с кодом заголовок на экран, потому что название настройки вводит в заблуждение. В конфиге она подписана как «тайтл игрокам в зоне», а внутренний метод в коде называется «для игроков поблизости» — но по факту «☄ МЕТЕОРИТ!» с подсказкой «Беги в центр — там сундуки с лутом!» получает каждый игрок в мире метеорита, вообще без проверки расстояния (0.5 секунды на появление, 3 секунды на экране, 1 секунда на затухание). Боссбар с обратным отсчётом ведёт себя так же — вешается на всех, кто есть в мире, и каждую секунду добирает тех, кто зашёл или переместился в этот мир уже после старта. А сообщения в чат о старте, разлочке и завершении — это вообще бродкаст на весь сервер, во все миры разом, а не только в мир, где упал метеорит.

Нюанс: после разлочки боссбар и голограмма не переключаются на отдельный вид «открыто» сами по себе — боссбар так и показывает «0с», а голограмма на мгновение показывает разлоченный текст и тут же перезаписывается обратно тем же обратным отсчётом, замершим на нуле. Реальный статус в этот момент надёжнее смотреть через /meteorite info или по чат-сообщению о разлочке.

Огненный дождь

Одновременно с ударом начинается дождь: над площадкой 20×20 блоков вокруг метеорита, с высоты 30–50 блоков над рельефом, один за другим спавнятся огненные шары — новый каждые 30 тиков, то есть примерно раз в полторы секунды, и падают почти строго вниз с едва заметным случайным сносом. Блоков они не трогают: не поджигают, не выбивают воронок — это подавлено на уровне самой сущности, а взрыв дополнительно чистится приват-защитой. Весь урон достаётся только живым существам в 3 блоках от точки падения, и это не только игроки: попавший под руку зомби или чья-то корова огребут те же 4.0 урона — это 2 сердца, если считать по конвенции конфига, где 1.0 = половина сердца. Игрок с правом meteorite.bypass от этого урона полностью защищён.

При каждом падении есть независимый шанс 5% выбить бонусный предмет прямо на месте (таблица — ниже). За стандартные 15 минут дождя набегает около 600 шаров — то есть в среднем ожидаемо около 30 бонусных дропов за один ивент, ещё до того, как кто-то дотронется до сундука. Пока шар летит — за ним тянется шлейф из частиц пламени и дыма, это можно выключить в конфиге.

Зона и защита

С момента удара и до самой уборки вокруг метеорита действует приват-регион — и хотя в конфиге он подписан как «куб», по факту это не совсем куб. При настройке по умолчанию (region.size: 10) регион уходит на 5 блоков от центра в каждую сторону по горизонтали — 11×11 блоков в плане, а вот вверх он идёт заметно дальше: не 5, а 5 + радиус шара (4) + 2 блока запаса, то есть на 11 блоков вверх от центра при стандартных настройках (итого 17 блоков в высоту) — с расчётом накрыть с запасом и сам шар, и голограмму над ним. Вниз регион уходит только на те же 5 блоков.

Внутри этого объёма игрокам без meteorite.bypass запрещено практически всё: нельзя ломать и ставить блоки, нельзя взаимодействовать вообще ни с одним блоком — не только с сундуками, а с любой дверью, кнопкой, печкой; не работают телепорт хорус-плодом и жемчуг Энда, а сундуки не открыть раньше разлочки. Взрыв внутри региона — хоть от собственных огненных шаров, хоть от случайного крипера или чужого тротила — блоков не портит, хотя сущности при этом урон получить всё ещё могут. Право meteorite.bypass снимает все эти ограничения разом, включая блокировку сундуков: с ним можно заглянуть внутрь и до официальной разлочки.

Хронометраж

Полный цикл одного ивента — это фиксированная последовательность фаз:

  • T+0 — удар, постройка шара, 4 сундука с лутом, старт дождя, боссбар и тайтл
  • T+15 мин (по умолчанию, chest.open-after-minutes) — дождь останавливается, сундуки разлочены, чат оповещён
  • T+20 мин (ещё cleanup.after-unlock-minutes = 5) — структура и сундуки исчезают, регион снят, рельеф восстановлен
  • Каждые 120 мин (по умолчанию, event.interval-minutes) — авто-таймер пробует запустить новый ивент сам

В конфиге отдельно есть параметр fireball.duration-minutes с комментарием «совпадает с таймером открытия сундуков» — но по коду он нигде не читается: реальную длительность дождя целиком определяет chest.open-after-minutes, и менять для этого нужно именно его. Сам авто-таймер устроен просто: он тикает по фиксированному расписанию от момента старта сервера, не пересчитывая интервал от конца предыдущего ивента, и если на очередном тике ивент почему-то ещё активен — просто пропускает попытку и вернётся на следующем.

Лут и награды

В каждом из четырёх сундуков — случайный набор из общей лут-таблицы: заполняются 12 из 27 ячеек (число настраивается), позиции внутри сундука перемешиваются случайно, а сами предметы выбираются независимо друг от друга — то есть один и тот же предмет вполне может выпасть в один сундук дважды. Вес определяет, как часто запись выпадает относительно остальных; в столбце «Шанс» ниже — доля от суммарного веса таблицы (115).

ПредметВесШансКоличество
Железный слиток3026%3–16
Бутылка опыта2522%4–16
Золотой слиток2017%2–8
Изумруд1513%1–5
Алмаз109%1–3
Золотое яблоко87%1–2
Незеритовый лом54%1–2
Зачарованное золотое яблоко22%1

У огненных шаров — своя таблица, компактнее (суммарный вес — 73), и срабатывает она только при том самом 5%-м шансе дропа на каждое падение:

ПредметВесШансКоличество
Уголь4055%1–4
Железный слиток2027%1–2
Золотой слиток1014%1
Алмаз34%1

Обе таблицы принимают не только предметы, но и записи типа «команда»: вместо материала указывается консольная команда с плейсхолдером %player% — например, чтобы выдать что-то из другой системы поощрений сервера. В сундучной лут-таблице это действительно работает: команда срабатывает один раз — для того, кто первым откроет конкретный сундук, то есть максимум 4 срабатывания за ивент, по одному на сундук, а не по одному на игрока. А в таблице огненных шаров command-запись бессмысленна и всегда молча пропускается: падающему шару просто некого подставить в %player%. В базовом конфиге ни одной активной command-записи нет — только закомментированные примеры для затравки, из коробки оба источника лута выдают исключительно предметы.

Интеграции

CloudMeteorite опирается на два чужих плагина, но не требует ни одного из них — оба идут «мягкой» зависимостью. Найдётся WorldEdit — можно подготовить свою схематику метеорита и вставлять её вместо процедурной генерации, получив уникальную форму глыбы под свой сервер. Найдётся DecentHolograms — над метеоритом повиснет голограмма с текстом из конфига, причём для «заперто» и «открыто» заданы отдельные шаблоны строк с плейсхолдером %time%. Не найдётся ни один из двух — CloudMeteorite тихо переключается на встроенные средства и пишет в лог при запуске, что именно нашёл, а ивент идёт как обычно, без единой ошибки в консоли.

Команды

Всё управление — через одну команду /meteorite (работает и русский алиас /метеорит), доступную только тем, у кого есть meteorite.admin.

КомандаЧто делаетПример
/meteorite start [x z]Запустить ивент; без координат — случайное место по настройкам, с обоими координатами — точный центр/meteorite start 500 -300
/meteorite stopОстановить ивент досрочно и сразу всё убрать/meteorite stop
/meteorite reloadПеречитать config.yml/meteorite reload
/meteorite infoСтатус: активен ли ивент, где центр, заперты ли сундуки, идёт ли дождь, сколько до открытия/метеорит info

По координатам есть тонкость: нужны сразу оба числа, x и z. Если они не парсятся как числа — команда явно откажет с подсказкой по синтаксису; а если указано только одно число вместо двух — команда молча откатится на случайное место, как будто координаты не задавали вовсе. Попытка запустить уже активный ивент или остановить неактивный вернёт понятную ошибку в чат, а не тишину.

С reload есть менее очевидный момент: команда всегда рапортует об успехе в чат, и сырые значения из config.yml действительно перечитываются сразу. Но обе лут-таблицы и авто-таймер обновляются из кэша только в том случае, если на момент reload ни один ивент не активен — правки лута лучше вносить и перечитывать между ивентами, а не во время них.

stop и естественное завершение — не одно и то же для игроков, хотя итог одинаков. При штатном окончании в чат уходит сообщение о том, что структура растворилась сама; при досрочной остановке — отдельное сообщение об остановке администратором. А вот уборка — сундуки, структура, регион, боссбар, голограмма — в обоих случаях одинаковая и полная.

Права

  • meteorite.admin — доступ ко всем подкомандам /meteorite (по умолчанию — у операторов)
  • meteorite.bypass — полный иммунитет к зоне ивента: игнорирует приват-защиту (ломать, ставить, взаимодействовать, телепорт), не получает урон от огненного дождя и открывает сундуки в любой момент, даже до официальной разлочки (по умолчанию — у операторов)

Как провести и удержать атмосферу

Место падения стоит держать в уже освоенной, доступной части карты: слишком дальний край — и добежать за 15 минут не успеет никто, а слишком близко к спавну или чьей-то стройке — и на 20 минут кто-то получит у себя во дворе регион с полным запретом на взаимодействие. Для этого и нужны spawn.center-x/z и spawn.radius — разброс можно держать строго в пределах давно обжитой зоны, не трогая фронтир.

Раз тайтл, боссбар и чат-оповещение бьют по всему миру без привязки к дистанции, это готовый инструмент собрать в одной точке даже сильно расползшийся по карте анархи-сервер: пропустить объявление физически невозможно, где бы игрок ни строился в этот момент. Лавкрафтианская подача линейки Cloud Ultra Anarchy+ — обломок чего-то древнего, рухнувший с неба, а не метеор из учебника — ложится в это естественно: сама механика ничего не навязывает, а вот собственные объявления в чате или таблички у спавна можно писать уже под эту тему.

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

Настройка

Конфиг открыт полностью и сгруппирован по смыслу:

  • Авто-таймерevent.auto-enabled, event.interval-minutes
  • Зона паденияspawn.world, spawn.center-x/z, spawn.radius
  • Структураstructure.radius (размер шара) и schematic.file / schematic.paste-air — альтернатива в виде готовой схематики
  • Регион защитыregion.size
  • Сундукиchest.open-after-minutes, loot-slots
  • Обе лут-таблицыloot и fireball.drop-loot, построчно: материал (или команда), вес, минимум и максимум количества
  • Огненный дождьfireball.zone-size, damage, radius, spawn-interval-ticks, item-drop-chance
  • Уборкаcleanup.after-unlock-minutes
  • Эффекты — боссбар и его цвет, голограмма с раздельными строками для «заперто» и «открыто», шлейф у шаров, вспышка со звуком удара, тайтл со своим текстом и подзаголовком

После правок — /meteorite reload. Как уже сказано выше, сырые значения подхватываются сразу, а вот лут-таблицы и авто-таймер — только если в этот момент ни один ивент не активен.

CloudMeteorite — не картинка на пять секунд, а законченный цикл: спавн, риск, награда, уборка, и снова тишина до следующего раза. Настроил цифры под ритм своего сервера один раз — и дальше метеорит падает сам, по расписанию, бьёт объявлением по всему миру и не оставляет за собой ни единого сломанного блока.