CloudPrivates — приват-регионы на 9 механик защиты

Приват — это не «здесь нельзя копать». Это блок, который сам решает, что будет с тем, кто попробует его сломать: промолчит, ударит взрывом или зашвырнёт нарушителя за горизонт случайным телепортом.

Что это

CloudPrivates — плагин приват-регионов для Paper 1.19.4, студия Cloud Delight (автор в plugin.yml — Виталий). Игрок ставит особый блок — вокруг встаёт защищённый куб. Но вместо одного универсального приватбокса — девять типов со своим характером: один держит периметр и сам себя чинит, другой бьёт взрывом, третий копит выброшенный лут, четвёртый раздаёт баффы своим и дебаффы чужим, пятый вообще исчезает с радаров — ни голограммы, ни ответа на клик.

Ролевая модель — не «владелец + список ников», а пять уровней прав и шесть независимых флагов на каждый приват. Управление — через GUI по ПКМ, команды дублируют почти всё то же из чата. Голограммы — опциональный слой через мягкую зависимость DecentHolograms. А соседним плагинам экосистемы CloudPrivates отдаёт своё состояние напрямую через статический PrivatesAPI.

Как это работает

Плагин узнаёт приват-предмет по PDC-метке внутри итем-меты (privates:type), а не по виду блока — подменить обычным блоком нельзя. Место свободно — блок встаёт, вокруг центра поднимается защитный куб; пересекается с чужим приватом — установка отклоняется, если конфиг не разрешил обратное (allow-overlap: false по умолчанию). Проверка не перебирает все приваты сервера: каждый индексируется по чанкам (16×16), которые задевает его куб, и новая установка сверяется только с приватами из тех же чанков.

Размер — на уровне типа: у всех девяти по умолчанию 25×25×25, то есть 12 блоков радиуса от центра по каждой оси, включая высоту. ПКМ по центру (только основная рука) открывает GUI управления — подробности отдельным разделом ниже.

  • Владелец (вес 4) — всё, включая передачу владения (/priv setowner) и снятие привата.
  • Совладелец (вес 3) — участники, роли (кроме назначения других совладельцев), флаги; снять приват не может.
  • Доверенный (вес 2) — строит, ломает, открывает сундуки и двери всегда: флаги build/container/interact на него не действуют в принципе.
  • Участник (вес 1) — действует по флагам как гость, но приравнен к «своим» для сигналки, баффа и дебаффа.
  • Гость (вес 0) — только то, что разрешено публичными флагами; отдельной записью не хранится.

Тонкость: роль «доверенный» (TRUSTED) и метод isTrusted() в коде — разные вещи. Флаги build/container/interact игнорирует именно роль TRUSTED и выше, а вот от сигналки и дебаффа освобождён и бафф получает любой участник независимо от роли. Повысить кого-то до совладельца не даст никто, кроме владельца или админа — у простого совладельца попытка тихо откатывается до «участник».

Флаги действуют на весь куб целиком: build закрывает стройку и вёдра, container — сундуки/бочки/печи, interact — двери/кнопки/рычаги — для всех, кто ниже TRUSTED. pvp выкл — бой запрещён (по локации жертвы, не атакующего). mobs выкл — не спавнятся естественно враждебные мобы; заспавненные командой или яйцом флаг не трогает. explosion выкл — взрывы не рушат блоки, кроме самоподрыва взрывного привата. Дефолты — из settings.default-flags, тип может переопределить своим блоком flags:.

Снять приват начисто может только владелец или privates.bypass: центр сам или кнопкой в GUI — предмет возвращается в инвентарь, голограмма пропадает мгновенно, без подтверждения. Команда /priv delete — тот же результат, но с защитой от случайного набора: таймер 15 секунд, повтор в этом окне — приват снят. Участник центр сломать не может. Гость, добивший центр, приват сносит в любом случае — а что будет дальше, зависит от типа.

9 типов приватов

Материал, CMD-текстура (custom-model-data 920001–920009 — диапазон плагина, менять нельзя) и размер куба у каждого типа настраиваются независимо. У слова «радиус» в конфиге двойной смысл: радиус самого куба (size/2, у всех по умолчанию 12) — это площадь ЗАЩИТЫ, а отдельный параметр radius у взрывного и эндер-привата — площадь ЭФФЕКТА при разрушении центра, и она не обязана совпадать с кубом. Ниже — заводские значения и механика по коду.

1. Скрытый приват (HIDDEN)

Материал SMOOTH_STONE, CMD 920001, куб 25×25×25 (радиус 12) — стандартный, а вот поведение — нет. Голограмма отключена жёстко в коде: даже при settings.hologram: true плагин её всегда удаляет вместо создания. ПКМ по центру не-участником не открывает ничего и не пишет в чат — тогда как у остальных восьми типов гость хотя бы узнаёт владельца и размер куба. /priv info для не-участника покажет только «информация недоступна». По тексту предмета скрытый приват ещё и не подсвечивается для случайного /rtp чужих игроков — для сторонних rtp-скриптов есть статический PrivatesAPI.isProtected(). Флаги, роли, снятие, эффекты — всё как у обычного привата, разница только в невидимости.

2. Взрывной приват (EXPLOSIVE)

Материал RESPAWN_ANCHOR, CMD 920002, куб 25×25×25. Ломает центр не-участник — плагин детонирует настоящий взрыв силой power: 12.0 (у ванильного TNT — 4.0), с атакующим как источником, чтобы защита чужих кубов рядом сработала как положено. Через тик — второй проход, ручное добивание в сфере радиусом radius: 10: ломаются обсидиан, плачущий обсидиан, сундуки, бочки, эндер-сундуки и шалкеры — то, что взрыв обычно не берёт (обсидиан к взрыву почти неуязвим). Чужие приваты в радиусе добивания не трогаются. Тем же проходом все живые существа получают entity-damage: 40.0 урона — 20 сердец, игроку без брони смерть гарантирована, — а весь дроп на земле подчищается. Радиус добивания (10) меньше радиуса защиты куба (12) — взрыв не обязательно достаёт до края территории.

3. Защищённый приват (PROTECTED)

Материал CRYING_OBSIDIAN, CMD 920003, куб 25×25×25. Раз в inner-interval-seconds: 60 плагин обходит все 26 блоков оболочки 3×3×3 вокруг центра (сам центр не трогает) и там, где блок не совпадает с материалом реставрации, ставит его заново — по умолчанию обычный OBSIDIAN (настройка regen.material общая для обоих защищённых типов, а не плачущий, как сам центр-блок). Проверка идёт раз в секунду через общий тикер, единый для всех приватов, без отдельного таймера на каждый. В заводском конфиге это единственный тип с собственным блоком flags: — продублированным один в один с глобальными значениями, просто образец для правки.

4. Защищённый+ приват (PROTECTED_PLUS)

Материал LODESTONE, CMD 920004, куб 25×25×25. Та же регенерация, но в два слоя: оболочка 3×3×3 латается каждые inner-interval-seconds: 60, а более широкая 5×5×5 — раз в outer-interval-seconds: 180, тем же материалом. Даже если нападавший выдолбил коридор на глубину два блока от края, через три минуты внешний слой затянется — версия для тех, кому «Защищённого» мало.

5. Сигнальный приват (ALARM)

Материал SCULK_CATALYST, CMD 920005, куб 25×25×25. Не столько держит периметр, сколько следит за ним — три независимых триггера. Вторжение: не-участник (и не бипас) сменил блок-координату внутри куба. Взрыв: если хоть один из ломающихся блоков любого взрыва по соседству оказался внутри его куба — сработает и от чужой TNT или крипера рядом, не только от атаки на себя. Разрушение центра — отдельное событие при добивании блока не-участником. На все три реагирует одна функция оповещения с троттлингом throttle-seconds: 10 — на приват целиком, а не на игрока: новые срабатывания молчат 10 секунд. Сообщение уходит в чат владельцу и всем участникам онлайн, а если заполнен webhook-url — асинхронно летит POST с JSON (id привата, владелец, тип события, нарушитель, координаты, мир); по умолчанию адрес пуст и вебхук выключен.

6. Воронка-приват (HOPPER)

Материал BARREL, CMD 920006, куб 25×25×25. Каждые interval-seconds: 3 плагин собирает предметы-Item внутри куба и складывает их в собственное виртуальное хранилище на 54 слота — число зашито в коде, конфигом не меняется. Предмет поместился целиком — исчезает с земли; частично — остаётся не влезший остаток; хранилище забито — лишнее ждёт следующего тика. Открывается хранилище отдельным окном в GUI управления (доступно любому участнику, только у типа HOPPER), закрытие окна сохраняет содержимое сразу. Приват сняли — сами или чужими руками, добив центр, — содержимое высыпается у центра, а не пропадает.

7. Бафф-приват (BUFF)

Материал BEACON, CMD 920007, куб 25×25×25. Раз в interval-seconds: 5 плагин обходит игроков в кубе и накладывает эффекты на владельца и любого участника — роль не важна. Заводской набор: Сила I (STRENGTH:0), Скорость II (SPEED:1), Регенерация I (REGENERATION:0), Сопротивление урону I (DAMAGE_RESISTANCE:0) — цифра после двоеточия это амплификатор, 0 значит уровень I, 1 — уровень II. Длительность каждого наложения не ровно 5 секунд, а (интервал + 3) × 20 тиков, то есть 8 секунд: трёхсекундный запас гарантирует, что эффект не мигает в щель между двумя переналожениями. Партиклов эффекты не показывают — только иконка в инвентаре.

8. Дебафф-приват (DEBUFF)

Материал MAGMA_BLOCK, CMD 920008, куб 25×25×25. Зеркало баффа с обратным знаком: раз в interval-seconds: 5 достаётся всем, кто не является ни владельцем, ни участником любой роли, и у кого нет privates.bypass, — то есть чистым гостям. Заводской набор: Слабость I (WEAKNESS:0), Медлительность II (SLOW:1), Иссушение I (WITHER:0) — гость слабее бьёт, медленнее бежит и теряет здоровье от иссушения. Длительность — та же формула, 8 секунд. Владелец и участники не получают ничего.

9. Эндер-приват (ENDER)

Материал END_STONE_BRICKS, CMD 920009, куб 25×25×25. Ломает центр не-участник — срабатывает разброс в сфере радиусом radius: 40, втрое больше защитного куба в 12 блоков: эффект накрывает соседние постройки, если приват стоит не в чистом поле. Разбрасывает не только виновника, а всех игроков мира, кто в момент разрушения оказался внутри 40 блоков от центра. Для каждого сперва пробует консольную команду из rtp-command: "rtp %player%"; не сработала — включается свой алгоритм: до 8 попыток случайного угла и дистанции (20 + случайные до radius блоков), поиск высшего твёрдого блока по X/Z, отбраковка точек с лавой или водой под ногами, телепорт на блок выше поверхности. Не набрал точку за 8 попыток — жёсткий фолбэк: сдвиг на фиксированное расстояние по оси. Игрок в любом случае куда-то улетит.

GUI управления

Открывается ПКМ по центр-блоку доверенным (владелец, участник любой роли или privates.bypass) — ванильное открытие блока под приватом не проходит, даже если это сундук. Гостю на видимом типе GUI не откроется — в чат придёт имя типа и «Владелец: X | Размер: N» (вторая строка зашита в коде, не из messages). У скрытого типа не будет и этого.

27-слотовое окно «Управление»: слот 4 — инфо-лист (тип, владелец, размер и радиус, координаты, мир, число участников); слоты 9–17 — головы участников по порядку добавления, максимум 9 на экране — если участников больше, остальные видны через /priv members. Слот 18 (изумруд) «Добавить участника» — клик закрывает окно и переводит в режим ожидания: следующая реплика в чат перехватывается, интерпретируется как ник, «отмена»/«cancel»/пустая строка отменяют. Слот 20 (компаратор) открывает флаги; слот 22 (жемчуг Края) — телепорт к центру, доступен любому участнику; слот 24 (сундук) — хранилище, только у HOPPER; слот 26 (барьер) — снять приват, только владельцу или бипасу, с лором «действие необратимо»: в отличие от /priv delete, кнопка снимает приват одним кликом, без 15-секундного подтверждения.

Клик по голове участника: ЛКМ крутит роль по кругу «участник → доверенный → совладелец → участник», но до совладельца поднимет только владелец или админ — у простого совладельца роль тихо откатывается обратно. ПКМ удаляет участника целиком, и это уже разрешено любому, кто вправе управлять, без владельческой оговорки. Флаги — отдельное окно на 9 слотов: первые шесть — сами флаги (лаймовый краситель значит «включён», серый — «выключен», клик переключает и сохраняет мгновенно), слот 8 — стрелка «Назад». Пустые ячейки затемнены серым стеклом, кроме диапазона голов участников — там незанятый слот остаётся пустым, чтобы было видно, сколько мест свободно.

Хранение, голограммы и API

Всё живёт в одном YAML-файле privates.yml в папке плагина — никакой SQLite тут нет. На приват — один блок: id, владелец (uuid и ник), тип, мир, координаты центра, размер, участники с ролями, все шесть флагов, а у воронки — ещё и содержимое хранилища через Bukkit-сериализацию ItemStack. Запись помечается «грязной» при изменении, автосейв на диск — раз в 30 секунд при изменениях и обязательно при выключении сервера; но большинство действий игрока сохраняются немедленно. Одна повреждённая запись при загрузке не валит весь файл — плагин пропускает её с предупреждением в лог. Старые записи без сохранённой роли получают «доверенный» — обратная совместимость со старым поведением «участник значит может строить».

Голограмма — необязательный слой: софт-зависимость от DecentHolograms. При старте плагин пишет в лог один из трёх исходов: голограммы выключены в конфиге, DecentHolograms не найден, или найден — с указанием версии. Скрытый приват голограмму не получает никогда. Текст и высота настраиваются через %owner% и %type%. При выключении сервера голограммы снимаются, при включении — создаются заново.

Для внешних плагинов есть статический класс PrivatesAPI: isProtected(Location) с алиасом isInsidePrivate(Location), и getOwnerAt(Location) — uuid владельца привата в точке или null. Комментарий в коде называет потребителей — CloudCommandStaff и CloudTrophyHunt, оба зовут методы через рефлексию, не как обычную зависимость при компиляции, — сигнатуры менять нельзя без синхронной правки.

Как выдавать приваты / сценарии сервера

Выдача — команда /priv give <тип> <игрок> [кол-во], доступна только праву privates.admin: количество зажато в диапазон 1–64, выдающий получает подтверждение, получатель — отдельное сообщение о приходе блока. Сам плагин не знает про магазины или квесты — он лишь создаёт предмет с нужным материалом, CMD и меткой типа; дальше это обычный итем, который можно положить в сундук с наградами ивента или выдать вручную.

Под конкретные задачи сервера типы ложатся по-разному:

  • Скрытый — секретки, административные зоны, тайники ивентов: не выдаёт себя ни голограммой, ни ответом на клик.
  • Взрывной — трофейная комната или центр PvP-арены: взлом обходится нападающему дорого и без права на добычу.
  • Защищённый / Защищённый+ — публичные постройки у спавна, которым нужно стоять несмотря на регулярные попытки погрифить: периметр латается сам.
  • Сигнальный — охрана ценной зоны или VIP-участка: с вебхуком оповещение о вторжении можно завести хоть во внешний бот-канал.
  • Воронка — автоферма или мободробилка: дроп собирается сам, не нужна сеть ванильных воронок под каждым блоком.
  • Бафф — точка сбора перед рейдом, safe-хаб или разминочная зона: свои получают преимущество просто находясь внутри.
  • Дебафф — антикемперская зона или территория «только для своих»: чужой не может закрепиться внутри надолго.
  • Эндер — элемент мини-игры или ловушка для любопытных: разброс на 40 блоков превращает взлом в наказание-рандомайзер для всех, кто рядом.

Команды

Всё управление — через команду /priv (алиасы /privates, /приват) с подсказками в tab-complete. Цель определяется так: сначала центр-блок привата в прицеле, до 6 блоков; если в прицеле ничего нет — приват, в кубе которого стоите; если под ногами сразу несколько — приоритет у того, где вы владелец, иначе у того, которым можете управлять.

КомандаЧто делает
/priv infoИнфо о привате — по прицелу на центр или по тому, где стоите.
/priv add / remove <ник>Добавить или убрать участника (роль по умолчанию — участник).
/priv trust / untrust <ник>Выдать роль «доверенный» или понизить обратно до «участник».
/priv role <ник> <member|trusted|coowner>Назначить роль напрямую; coowner — только от владельца или админа.
/priv membersСписок участников с ролями.
/priv flag <флаг> [on|off]Без значения — показать текущее; со значением — переключить.
/priv home [номер]Телепорт к своему привату; без номера при нескольких — список на выбор.
/priv listСписок своих приватов.
/priv borderПодсветить границы куба частицами (нужно быть участником).
/priv setowner <ник>Передать владение приватом.
/priv deleteСнять приват (повторить в течение 15 секунд для подтверждения).
/priv give <тип> <игрок> [кол-во]Выдать приват-блок игроку, 1–64 шт. (privates.admin).
/priv list allВсе приваты сервера (privates.admin).
/priv reloadПеречитать config.yml без рестарта (privates.admin).

Примеры: /priv give explosive Vitaly 3 выдаст три взрывных приват-блока игроку Vitaly. /priv role Друг coowner сделает Друга совладельцем, если исполнитель — владелец или админ. /priv flag pvp on включит PvP внутри куба, на который вы смотрите.

Права

  • privates.admin (по умолчанию — у op): доступ к /priv give, /priv reload и /priv list all.
  • privates.bypass (по умолчанию — у op): полный обход защиты — строить, ломать, открывать где угодно, как владелец в любом чужом привате. Заодно снимает статус «чужого» для остальных механик: не запускает сигналку, не ловит дебафф.

Настройка

config.yml читается вживую — правки применяются командой /priv reload, без перезапуска сервера (голограммы при этом тоже пересоздаются). Настраивается почти всё:

  • allow-overlap — пересекаются ли новые приваты с чужими кубами (по умолчанию нет, проверка через чанк-индекс);
  • hologram, hologram-height (1.6 блока), hologram-lines — вкл/выкл, высота и текст с плейсхолдерами %owner%, %type%; для скрытого привата не действует никогда;
  • max-members — лимит участников (0 — без лимита; отдельно от лимита голов в GUI, который упирается в 9 слотов);
  • entry-message — «вы на территории <владелец>»: enabled, throttle-seconds (8, на игрока), on-exit — сообщение о выходе;
  • border — подсветка границ частицами: particle (FLAME), duration-seconds (8), step (1.0 — шаг между частицами);
  • default-flags — глобальные build/container/interact/pvp/mobs/explosion; тип переопределяет своим блоком flags: (в заводском конфиге так сделано только у «защищённого», для примера);
  • у каждого типа — материал, custom-model-data (920001–920009, не менять), размер куба и механика: power/radius/entity-damage у взрывного, inner/outer-interval у защищённых, webhook-url/throttle-seconds у сигнального, interval-seconds и effects у воронки/баффа/дебаффа, radius/rtp-command у эндер-привата;
  • regen.material — чем зарастает оболочка защищённых приватов, общий параметр на оба типа (OBSIDIAN);
  • messages — весь текст плагина с кодами &; но пара строк вроде «Владелец: X | Размер: N» зашита в коде напрямую и через этот блок не редактируется.
Девять типов — девять разных ответов на один и тот же вопрос нарушителя: «а что будет, если сюда сунуться». Дальше решает конфиг: сколько блоков радиуса, какой характер у периметра и что именно услышит — или получит — гость, зашедший без приглашения.