Приват — это не «здесь нельзя копать». Это блок, который сам решает, что будет с тем, кто попробует его сломать: промолчит, ударит взрывом или зашвырнёт нарушителя за горизонт случайным телепортом.
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 управления — подробности отдельным разделом ниже.
/priv setowner) и снятие привата.Тонкость: роль «доверенный» (TRUSTED) и метод isTrusted() в коде — разные вещи. Флаги build/container/interact игнорирует именно роль TRUSTED и выше, а вот от сигналки и дебаффа освобождён и бафф получает любой участник независимо от роли. Повысить кого-то до совладельца не даст никто, кроме владельца или админа — у простого совладельца попытка тихо откатывается до «участник».
Флаги действуют на весь куб целиком: build закрывает стройку и вёдра, container — сундуки/бочки/печи, interact — двери/кнопки/рычаги — для всех, кто ниже TRUSTED. pvp выкл — бой запрещён (по локации жертвы, не атакующего). mobs выкл — не спавнятся естественно враждебные мобы; заспавненные командой или яйцом флаг не трогает. explosion выкл — взрывы не рушат блоки, кроме самоподрыва взрывного привата. Дефолты — из settings.default-flags, тип может переопределить своим блоком flags:.
Снять приват начисто может только владелец или privates.bypass: центр сам или кнопкой в GUI — предмет возвращается в инвентарь, голограмма пропадает мгновенно, без подтверждения. Команда /priv delete — тот же результат, но с защитой от случайного набора: таймер 15 секунд, повтор в этом окне — приват снят. Участник центр сломать не может. Гость, добивший центр, приват сносит в любом случае — а что будет дальше, зависит от типа.
Материал, CMD-текстура (custom-model-data 920001–920009 — диапазон плагина, менять нельзя) и размер куба у каждого типа настраиваются независимо. У слова «радиус» в конфиге двойной смысл: радиус самого куба (size/2, у всех по умолчанию 12) — это площадь ЗАЩИТЫ, а отдельный параметр radius у взрывного и эндер-привата — площадь ЭФФЕКТА при разрушении центра, и она не обязана совпадать с кубом. Ниже — заводские значения и механика по коду.
Материал SMOOTH_STONE, CMD 920001, куб 25×25×25 (радиус 12) — стандартный, а вот поведение — нет. Голограмма отключена жёстко в коде: даже при settings.hologram: true плагин её всегда удаляет вместо создания. ПКМ по центру не-участником не открывает ничего и не пишет в чат — тогда как у остальных восьми типов гость хотя бы узнаёт владельца и размер куба. /priv info для не-участника покажет только «информация недоступна». По тексту предмета скрытый приват ещё и не подсвечивается для случайного /rtp чужих игроков — для сторонних rtp-скриптов есть статический PrivatesAPI.isProtected(). Флаги, роли, снятие, эффекты — всё как у обычного привата, разница только в невидимости.
Материал RESPAWN_ANCHOR, CMD 920002, куб 25×25×25. Ломает центр не-участник — плагин детонирует настоящий взрыв силой power: 12.0 (у ванильного TNT — 4.0), с атакующим как источником, чтобы защита чужих кубов рядом сработала как положено. Через тик — второй проход, ручное добивание в сфере радиусом radius: 10: ломаются обсидиан, плачущий обсидиан, сундуки, бочки, эндер-сундуки и шалкеры — то, что взрыв обычно не берёт (обсидиан к взрыву почти неуязвим). Чужие приваты в радиусе добивания не трогаются. Тем же проходом все живые существа получают entity-damage: 40.0 урона — 20 сердец, игроку без брони смерть гарантирована, — а весь дроп на земле подчищается. Радиус добивания (10) меньше радиуса защиты куба (12) — взрыв не обязательно достаёт до края территории.
Материал CRYING_OBSIDIAN, CMD 920003, куб 25×25×25. Раз в inner-interval-seconds: 60 плагин обходит все 26 блоков оболочки 3×3×3 вокруг центра (сам центр не трогает) и там, где блок не совпадает с материалом реставрации, ставит его заново — по умолчанию обычный OBSIDIAN (настройка regen.material общая для обоих защищённых типов, а не плачущий, как сам центр-блок). Проверка идёт раз в секунду через общий тикер, единый для всех приватов, без отдельного таймера на каждый. В заводском конфиге это единственный тип с собственным блоком flags: — продублированным один в один с глобальными значениями, просто образец для правки.
Материал LODESTONE, CMD 920004, куб 25×25×25. Та же регенерация, но в два слоя: оболочка 3×3×3 латается каждые inner-interval-seconds: 60, а более широкая 5×5×5 — раз в outer-interval-seconds: 180, тем же материалом. Даже если нападавший выдолбил коридор на глубину два блока от края, через три минуты внешний слой затянется — версия для тех, кому «Защищённого» мало.
Материал SCULK_CATALYST, CMD 920005, куб 25×25×25. Не столько держит периметр, сколько следит за ним — три независимых триггера. Вторжение: не-участник (и не бипас) сменил блок-координату внутри куба. Взрыв: если хоть один из ломающихся блоков любого взрыва по соседству оказался внутри его куба — сработает и от чужой TNT или крипера рядом, не только от атаки на себя. Разрушение центра — отдельное событие при добивании блока не-участником. На все три реагирует одна функция оповещения с троттлингом throttle-seconds: 10 — на приват целиком, а не на игрока: новые срабатывания молчат 10 секунд. Сообщение уходит в чат владельцу и всем участникам онлайн, а если заполнен webhook-url — асинхронно летит POST с JSON (id привата, владелец, тип события, нарушитель, координаты, мир); по умолчанию адрес пуст и вебхук выключен.
Материал BARREL, CMD 920006, куб 25×25×25. Каждые interval-seconds: 3 плагин собирает предметы-Item внутри куба и складывает их в собственное виртуальное хранилище на 54 слота — число зашито в коде, конфигом не меняется. Предмет поместился целиком — исчезает с земли; частично — остаётся не влезший остаток; хранилище забито — лишнее ждёт следующего тика. Открывается хранилище отдельным окном в GUI управления (доступно любому участнику, только у типа HOPPER), закрытие окна сохраняет содержимое сразу. Приват сняли — сами или чужими руками, добив центр, — содержимое высыпается у центра, а не пропадает.
Материал 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 секунд: трёхсекундный запас гарантирует, что эффект не мигает в щель между двумя переналожениями. Партиклов эффекты не показывают — только иконка в инвентаре.
Материал MAGMA_BLOCK, CMD 920008, куб 25×25×25. Зеркало баффа с обратным знаком: раз в interval-seconds: 5 достаётся всем, кто не является ни владельцем, ни участником любой роли, и у кого нет privates.bypass, — то есть чистым гостям. Заводской набор: Слабость I (WEAKNESS:0), Медлительность II (SLOW:1), Иссушение I (WITHER:0) — гость слабее бьёт, медленнее бежит и теряет здоровье от иссушения. Длительность — та же формула, 8 секунд. Владелец и участники не получают ничего.
Материал END_STONE_BRICKS, CMD 920009, куб 25×25×25. Ломает центр не-участник — срабатывает разброс в сфере радиусом radius: 40, втрое больше защитного куба в 12 блоков: эффект накрывает соседние постройки, если приват стоит не в чистом поле. Разбрасывает не только виновника, а всех игроков мира, кто в момент разрушения оказался внутри 40 блоков от центра. Для каждого сперва пробует консольную команду из rtp-command: "rtp %player%"; не сработала — включается свой алгоритм: до 8 попыток случайного угла и дистанции (20 + случайные до radius блоков), поиск высшего твёрдого блока по X/Z, отбраковка точек с лавой или водой под ногами, телепорт на блок выше поверхности. Не набрал точку за 8 попыток — жёсткий фолбэк: сдвиг на фиксированное расстояние по оси. Игрок в любом случае куда-то улетит.
Открывается ПКМ по центр-блоку доверенным (владелец, участник любой роли или 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 — стрелка «Назад». Пустые ячейки затемнены серым стеклом, кроме диапазона голов участников — там незанятый слот остаётся пустым, чтобы было видно, сколько мест свободно.
Всё живёт в одном 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 и меткой типа; дальше это обычный итем, который можно положить в сундук с наградами ивента или выдать вручную.
Под конкретные задачи сервера типы ложатся по-разному:
Всё управление — через команду /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 внутри куба, на который вы смотрите.
/priv give, /priv reload и /priv list all.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» зашита в коде напрямую и через этот блок не редактируется.Девять типов — девять разных ответов на один и тот же вопрос нарушителя: «а что будет, если сюда сунуться». Дальше решает конфиг: сколько блоков радиуса, какой характер у периметра и что именно услышит — или получит — гость, зашедший без приглашения.