
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
Зависимости: · Загрузчик: Bukkit, Spigot, Paper, Purpur, Folia · Версия Minecraft: 1.16 - 1.21.11+ · Версия мода: 23.2…
Зависимости: · Загрузчик: Bukkit, Spigot, Paper, Purpur, Folia · Версия Minecraft: 1.16 - 1.21.11+ · Версия мода: 23.2 Многопользовательские серверы Minecraft нуждаются в детальном аудите действий игроков для предотвращ
Зависимости:
· Загрузчик: Bukkit, Spigot, Paper, Purpur, Folia
· Версия Minecraft: 1.16 - 1.21.11+
· Версия мода: 23.2
Многопользовательские серверы Minecraft нуждаются в детальном аудите действий игроков для предотвращения несанкционированных изменений карты и кражи игровых ценностей. Ванильное ядро сервера не записывает историю редактирования ландшафта и перемещения предметов в контейнерах, поэтому администраторы лишены возможности идентифицировать нарушителей или отменить разрушения без полного восстановления файлов карты из резервных копий. Серверный плагин CoreProtect регистрирует все события изменения мира, создаёт детальные индексы действий пользователей и выполняет точечные откаты (rollbacks) пространства на основе сложных параметрических запросов. Инструмент функционирует в асинхронном режиме, записывая транзакции в очередь для защиты главного потока сервера от задержек.
1. Базы данных и асинхронная архитектура логирования
Плагин CoreProtect перехватывает события сервера с помощью обработчиков событий Bukkit/Paper API. Для предотвращения блокировки главного потока сервера (Server Thread) во время обработки тысяч записей в секунду плагин использует асинхронную модель логирования. События (разрушение блока, изменение инвентаря сундука, использование команды) сначала помещаются во внутренний динамический буфер DataQueue. Фоновый поток-потребитель (Consumer Thread) считывает транзакции из буфера и записывает их в базу данных пакетными транзакциями (Batch processing), что снижает нагрузку на накопитель.
Плагин поддерживает работу с двумя системами управления базами данных (СУБД):
1. SQLite (Локально по умолчанию): Вся информация записывается в файл database.db в директории плагина. SQLite не требует установки сторонних служб, что делает его удобным для небольших локальных серверов с низким уровнем транзакций.
2. MySQL / MariaDB (Внешний сервер): Использует сетевое подключение к отдельному серверу баз данных. Это решение является промышленным стандартом для крупных серверов и серверных сетей с высоким показателем онлайна (от 50 игроков). MySQL обеспечивает высокую скорость выполнения индексных запросов и исключает фрагментацию локального хранилища.
Схема таблиц базы данных
CoreProtect создаёт набор реляционных таблиц для оптимизации хранения данных. Вместо сохранения полных текстовых строк для каждой записи плагин использует таблицы-словари для уникальных имён игроков, миров, типов блоков и сущностей.
Таблица | Назначение | Основные поля |
|---|---|---|
| Словарь имён пользователей |
|
| Словарь игровых миров |
|
| Реестр изменений блоков в мире |
|
| Транзакции предметов в контейнерах |
|
| Лог сессий авторизации (вход/выход) |
|
| Содержимое текстовых табличек |
|
| Записи о смерти и спавне существ |
|
Все координаты x, y, z индексируются совместно с идентификатором мира wid для обеспечения мгновенного поиска транзакций в заданном радиусе.
2. Синтаксис команд и параметры фильтрации
Взаимодействие с базой данных CoreProtect происходит с помощью текстовых команд. Главные операции: инспектирование, поиск, откат и отмена отката.
Режим инспектора /co inspect или /co i)
Команда переключает клиент в режим локального аудита. После активации игрок может взаимодействовать с миром для получения логов:
· Левый клик по существующему блоку выводит в чат никнейм того, кто его установил, дату, время и координаты.
· Правый клик по пустой плоскости (или блоку) выводит историю блоков, которые ранее занимали это пространство или были демонтированы.
· Правый клик по контейнеру (сундук, печь, бочка, шалкер) показывает лог перемещения предметов.
Параметры фильтрации запросов /co rollback, /co restore, /co lookup)
Для выборки данных плагин использует комбинированные параметры в формате параметр:значение. Параметры разделяются пробелами:
1. Пользователь u:<имя>): Указывает игрока для проверки. Можно указать несколько имён через запятую (например, u:Stevie,Alex). Для отката природных событий используются технические идентификаторы:
· u:#fire – распространение огня.
· u:#lava – разлив лавы.
· u:#water – разлив воды.
· u:#creeper – взрыв крипера.
· u:#tnt – взрыв динамита.
· u:#enderman – перемещение блоков эндерменом.
2. Время t:<величина>): Временной интервал для анализа. Поддерживает единицы измерения: s (секунды), m (минуты), h (часы), d (дни), w (недели), y (годы). Разрешено комбинировать единицы, например: t:2w4d6h (2 недели, 4 дня и 6 часов).
3. Радиус r:<число>): Радиус зоны поиска в блоках вокруг исполнителя команды. Также поддерживает специальные значения:
· r:#global – поиск по всей базе данных (в пределах всех загруженных чанков).
· r:#world – поиск в пределах текущего игрового мира.
· r:#chunk – поиск в текущем чанке игрока.
· r:#selection (или r:#we) – ограничивает поиск границами текущей сетки выделения WorldEdit.
4. Действие a:<тип>): Фильтрует записи по типу операции:
· a:block – установка и разрушение блоков.
· a:+block – только установка блоков.
· a:-block – только разрушение блоков.
· a:container – транзакции инвентаря.
· a:+container – добавление предметов в контейнер.
· a:-container – извлечение предметов из контейнера.
· a:kill – смерть животных и монстров.
· a:spawn – спавн сущностей.
· a:chat – сообщения в чате.
· a:command – введённые команды.
· a:session – авторизация игроков.
5. Блоки b:<материал>): Ограничивает поиск указанными материалами (например, b:stone,oak_planks).
6. Исключение e:<материал>): Исключает материалы из обработки (например, e:tnt).
Предварительный просмотр отката и отмена операций
Для минимизации ошибок во время масштабных откатов CoreProtect поддерживает систему визуального моделирования:
1. Выполнение команды отката с флагом #preview (например, /co rollback u:Griefer t:2h r:20 #preview) не изменяет файлы карты. Вместо этого клиент получает пакеты изменения блоков в текущем сеансе рендеринга. Администратор видит мир в состоянии "после отката", тогда как для других игроков блоки остаются без изменений.
#preview
/co apply
2. Для применения результата используют команду /co apply.
3. Для отмены предварительного просмотра используют команду /co cancel.
4. Для отмены уже выполненного физического отката применяют команду /co undo, которая возвращает координаты в состояние до выполнения /co rollback.
3. Полное описание файла конфигурации config.yml
Файл конфигурации управляет лимитами, параметрами логирования и подключением к базам данных.
Блок общих параметров (General Settings)
· verbose: true – выводит подробный отчёт в консоль о каждой модифицированной координате во время выполнения откатов. В случае установки false выводится только суммарное количество изменённых блоков.
· check-updates: true – проверяет, есть ли новые версии плагина на серверах разработчика во время запуска.
· api-enabled: true – позволяет сторонним плагинам взаимодействовать с данными CoreProtect.
· default-radius: 10 – радиус отката по умолчанию, если этот параметр не указан в команде.
· max-radius: 250 – ограничивает максимальный радиус для одной команды. Значение 0 снимает ограничение.
Блок параметров логирования (Logging Settings)
Эти параметры определяют, какие именно события записываются в базу данных. Отключение ненужных логов помогает уменьшить размер базы данных:
· block-place: true / block-break: true – логирование обычной установки и разрушения блоков игроками.
· natural-break: true – логирование выпадения блоков вследствие сдвигов или разрушения опорных блоков (например, разрушение блока, на котором держался факел).
· block-movement: true – логирование гравитационного падения песка, гравия или бетона.
· pistons: true – логирование перемещения блоков с помощью поршней.
· block-burn: true – логирование уничтожения блоков огнём.
· block-ignite: true – логирование поджога блоков игроками с помощью огнива или огненных шаров.
· explosions: true – логирование взрывов динамита, криперов, кроватей в Нижнем мире или кристаллов Края.
· entity-kills: true – регистрация смерти жителей, животных, монстров и стоек для брони.
· player-chat: true / player-command: true – логирование сообщений в чате и консольных команд.
· player-session: true – логирование времени входа и выхода игроков с сервера.
· container-transactions: true – логирование операций перемещения предметов в сундуках, печах, воронках и шалкерах.
Блок базы данных (Database Settings)
· use-mysql: false – переключатель типа базы данных. В случае установки true плагин подключается к внешней СУБД MySQL.
· table-prefix: co_ – префикс для названий SQL-таблиц.
· mysql-host: localhost – IP-адрес или доменное имя сервера баз данных MySQL.
· mysql-port: 3306 – сетевой порт для подключения.
· mysql-database: minecraft – название целевой базы данных.
· mysql-username: root – имя пользователя базы данных.
· mysql-password: password – пароль пользователя.
· mysql-ssl: false – включает шифрование подключения SSL к серверу баз данных.
4. API для разработчиков плагинов
CoreProtect предоставляет разработчикам доступ к своей базе данных через класс CoreProtectAPI. Это позволяет другим плагинам (например, WorldEdit или защитным системам) регистрировать свои изменения или выполнять автоматический поиск истории.
Инициализация API
Для подключения к API используют метод инициализации:
import net.coreprotect.CoreProtect; |
Основные методы интерфейса API
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – регистрирует установку блока в базе данных от имени указанного пользователя.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – регистрирует разрушение блока.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – записывает операцию добавления (true) или извлечения (false) предметов из контейнера.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – выполняет поиск по указанным фильтрам и возвращает массив результатов.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – инициирует асинхронный откат изменений в мире.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – инициирует асинхронное восстановление изменений.
· boolean hasPlaced(String user, Block block, int time, int offset) – проверяет, размещал ли указанный игрок этот блок за определённое время.
· boolean hasRemoved(String user, Block block, int time, int offset) – проверяет, разрушал ли указанный игрок этот блок.
5. Производительность, совместимость и обслуживание
При работе с CoreProtect на серверах с высоким онлайном администраторы учитывают особенности взаимодействия с современными серверными архитектурами:
· Поддержка Folia: Серверное ядро Folia использует регионарное многопоточное планирование (Regionized multithreading), что требует от плагинов строгой потокобезопасности при работе с миром. CoreProtect адаптирован для работы в Folia: выполнение операций /co rollback и /co restore происходит через планировщик регионов (Region Scheduler), что предотвращает конфликты доступа к чанкам и критические ошибки ConcurrentModificationException.
· Кластеризация MultiPaper: На серверах типа MultiPaper CoreProtect настраивают на использование единой внешней базы данных MySQL. Это помогает синхронизировать историю действий игроков на разных серверах-нодах кластера.
· Очистка базы данных (Purge): Локальная SQLite база данных со временем фрагментируется и разрастается, замедляя выполнение команд. Команда /co purge t:30d удаляет записи, которые старше 30 дней. После очистки базы данных SQLite файл database.db не уменьшается в размере автоматически, поскольку СУБД SQLite сохраняет свободные страницы для будущих записей. Для физического уменьшения файла на диске необходимо выполнить команду VACUUM через консоль базы данных или остановить сервер и осуществить сжатие с помощью сторонних утилит. Использование MySQL устраняет эту проблему, поскольку СУБД MySQL эффективнее высвобождает неиспользуемое дисковое пространство.
Заключение
CoreProtect является стандартом для систем логирования и восстановления на серверах Minecraft Java Edition. В отличие от альтернатив наподобие LogBlock (который поддерживает только работу с MySQL и ограничен логированием блоков) или Prism (который имеет более сложную структуру настройки), CoreProtect предлагает полностью автономный запуск с SQLite, детальное отслеживание содержимого контейнеров, а также уникальную систему предварительного просмотра откатов #preview. Единственным техническим ограничением плагина является значительная нагрузка на дисковый накопитель во время очистки больших локальных баз данных SQLite, поэтому крупным проектам рекомендуется использовать выделенные СУБД MySQL на быстрых NVMe-дисках. Плагин подходит как для небольших приватных серверов друзей, так и для масштабных проектов с сотнями активных игроков.
Установка
Базовая установка занимает около 5 минут. Общий процесс одинаков, отличается только лоадер и совместимый билд.
- 1Stop your Minecraft server.
- 2Drop the plugin .jar into the server /plugins folder.
- 3Start the server once so the plugin generates its config files.
- 4Edit /plugins/<name>/config.yml as needed, then run /reload confirm or restart.











