
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.











