
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
Zależności: · Loader: Bukkit, Spigot, Paper, Purpur, Folia · Wersja Minecraft: 1.16 - 1.21.11+ · Wersja moda: 23.2 Wieloosobowe serwery…
Zależności: · Loader: Bukkit, Spigot, Paper, Purpur, Folia · Wersja Minecraft: 1.16 - 1.21.11+ · Wersja moda: 23.2 Wieloosobowe serwery Minecraft wymagają szczegółowego audytu działań graczy, aby zapobiec nieautoryzowan
Zależności:
· Loader: Bukkit, Spigot, Paper, Purpur, Folia
· Wersja Minecraft: 1.16 - 1.21.11+
· Wersja moda: 23.2
Wieloosobowe serwery Minecraft wymagają szczegółowego audytu działań graczy, aby zapobiec nieautoryzowanym zmianom mapy oraz kradzieży cennych przedmiotów w grze. Waniliowy rdzeń serwera nie zapisuje historii edycji terenu ani przemieszczania przedmiotów w pojemnikach, dlatego administratorzy są pozbawieni możliwości zidentyfikowania sprawców lub cofnięcia zniszczeń bez pełnego przywrócenia plików mapy z kopii zapasowych. Wtyczka serwerowa CoreProtect rejestruje wszystkie zdarzenia zmieniające świat, tworzy szczegółowe indeksy działań użytkowników i wykonuje punktowe cofnięcia (rollbacks) przestrzeni na podstawie złożonych zapytań parametrycznych. Narzędzie działa w trybie asynchronicznym, zapisując transakcje do kolejki, aby chronić główny wątek serwera przed opóźnieniami.
1. Bazy danych i asynchroniczna architektura logowania
Wtyczka CoreProtect przechwytuje zdarzenia serwera za pomocą obsługi zdarzeń Bukkit/Paper API. Aby zapobiec blokowaniu głównego wątku serwera (Server Thread) podczas przetwarzania tysięcy rekordów na sekundę, wtyczka stosuje asynchroniczny model logowania. Zdarzenia (zniszczenie bloku, zmiana ekwipunku skrzyni, użycie polecenia) są najpierw umieszczane w wewnętrznym dynamicznym buforze DataQueue. Działający w tle wątek konsumenta (Consumer Thread) odczytuje transakcje z bufora i zapisuje je do bazy danych w transakcjach wsadowych (Batch processing), co zmniejsza obciążenie nośnika danych.
Wtyczka obsługuje pracę z dwoma systemami zarządzania bazami danych (DBMS):
1. SQLite (lokalnie, domyślnie): Wszystkie informacje są zapisywane w pliku database.db w katalogu wtyczki. SQLite nie wymaga instalacji usług zewnętrznych, co czyni go wygodnym dla małych serwerów lokalnych o niskim poziomie transakcji.
2. MySQL / MariaDB (serwer zewnętrzny): Wykorzystuje połączenie sieciowe z oddzielnym serwerem baz danych. To rozwiązanie jest standardem branżowym dla dużych serwerów oraz sieci serwerów o wysokiej liczbie graczy online (od 50 graczy). MySQL zapewnia dużą szybkość wykonywania zapytań indeksowych i wyklucza fragmentację lokalnego magazynu.
Schemat tabel bazy danych
CoreProtect tworzy zestaw tabel relacyjnych w celu optymalizacji przechowywania danych. Zamiast zapisywać pełne ciągi tekstowe dla każdego rekordu, wtyczka korzysta z tabel słownikowych dla unikalnych nazw graczy, światów, typów bloków i bytów.
Tabela | Przeznaczenie | Główne pola |
|---|---|---|
| Słownik nazw użytkowników |
|
| Słownik światów gry |
|
| Rejestr zmian bloków w świecie |
|
| Transakcje przedmiotów w pojemnikach |
|
| Dziennik sesji logowania (wejście/wyjście) |
|
| Zawartość tabliczek tekstowych |
|
| Zapisy o śmierci i pojawianiu się istot |
|
Wszystkie współrzędne x, y, z są indeksowane wspólnie z identyfikatorem świata wid, aby zapewnić błyskawiczne wyszukiwanie transakcji w zadanym promieniu.
2. Składnia poleceń i parametry filtrowania
Interakcja z bazą danych CoreProtect odbywa się za pomocą poleceń tekstowych. Główne operacje to: inspekcja, wyszukiwanie, cofanie oraz anulowanie cofnięcia.
Tryb inspektora /co inspect lub /co i)
Polecenie przełącza klienta w tryb lokalnego audytu. Po aktywacji gracz może wchodzić w interakcję ze światem, aby uzyskać dzienniki:
· Lewe kliknięcie istniejącego bloku wyświetla na czacie nick osoby, która go umieściła, datę, godzinę oraz współrzędne.
· Prawe kliknięcie pustej powierzchni (lub bloku) wyświetla historię bloków, które wcześniej zajmowały tę przestrzeń lub zostały zdemontowane.
· Prawe kliknięcie pojemnika (skrzynia, piec, beczka, shulker) pokazuje dziennik przemieszczania przedmiotów.
Parametry filtrowania zapytań /co rollback, /co restore, /co lookup)
Do wyboru danych wtyczka stosuje połączone parametry w formacie parametr:wartość. Parametry są oddzielane spacjami:
1. Użytkownik u:<imię>): Wskazuje gracza do sprawdzenia. Można podać kilka imion oddzielonych przecinkiem (na przykład u:Stevie,Alex). Do cofania zdarzeń naturalnych używa się identyfikatorów technicznych:
· u:#fire – rozprzestrzenianie się ognia.
· u:#lava – rozlanie lawy.
· u:#water – rozlanie wody.
· u:#creeper – wybuch CREEPERA.
· u:#tnt – wybuch TNT.
· u:#enderman – przemieszczanie bloków przez ENDERMANA.
2. Czas t:<wartość>): Przedział czasowy do analizy. Obsługuje jednostki miary: s (sekundy), m (minuty), h (godziny), d (dni), w (tygodnie), y (lata). Dozwolone jest łączenie jednostek, na przykład: t:2w4d6h (2 tygodnie, 4 dni i 6 godzin).
3. Promień r:<liczba>): Promień strefy wyszukiwania w blokach wokół wykonawcy polecenia. Obsługuje również wartości specjalne:
· r:#global – wyszukiwanie w całej bazie danych (w obrębie wszystkich załadowanych chunków).
· r:#world – wyszukiwanie w obrębie bieżącego świata gry.
· r:#chunk – wyszukiwanie w bieżącym chunku gracza.
· r:#selection (lub r:#we) – ogranicza wyszukiwanie do granic bieżącego zaznaczenia WorldEdit.
4. Akcja a:<typ>): Filtruje rekordy według typu operacji:
· a:block – stawianie i niszczenie bloków.
· a:+block – tylko stawianie bloków.
· a:-block – tylko niszczenie bloków.
· a:container – transakcje ekwipunku.
· a:+container – dodawanie przedmiotów do pojemnika.
· a:-container – wyjmowanie przedmiotów z pojemnika.
· a:kill – śmierć zwierząt i potworów.
· a:spawn – pojawianie się bytów.
· a:chat – wiadomości na czacie.
· a:command – wprowadzone polecenia.
· a:session – logowanie graczy.
5. Bloki b:<materiał>): Ogranicza wyszukiwanie do wskazanych materiałów (na przykład b:stone,oak_planks).
6. Wykluczenie e:<materiał>): Wyklucza materiały z przetwarzania (na przykład e:tnt).
Podgląd cofnięcia i anulowanie operacji
Aby zminimalizować błędy podczas wielkoskalowych cofnięć, CoreProtect obsługuje system modelowania wizualnego:
1. Wykonanie polecenia cofnięcia z flagą #preview (na przykład /co rollback u:Griefer t:2h r:20 #preview) nie zmienia plików mapy. Zamiast tego klient otrzymuje pakiety zmiany bloków w bieżącej sesji renderowania. Administrator widzi świat w stanie „po cofnięciu”, podczas gdy dla innych graczy bloki pozostają bez zmian.
#preview
/co apply
2. Aby zastosować wynik, używa się polecenia /co apply.
3. Aby anulować podgląd, używa się polecenia /co cancel.
4. Aby cofnąć już wykonane fizyczne cofnięcie, stosuje się polecenie /co undo, które przywraca współrzędne do stanu sprzed wykonania /co rollback.
3. Pełny opis pliku konfiguracyjnego config.yml
Plik konfiguracyjny zarządza limitami, parametrami logowania oraz połączeniem z bazami danych.
Blok parametrów ogólnych (General Settings)
· verbose: true – wyświetla szczegółowy raport w konsoli o każdej zmodyfikowanej współrzędnej podczas wykonywania cofnięć. W przypadku ustawienia false wyświetlana jest tylko łączna liczba zmienionych bloków.
· check-updates: true – sprawdza podczas uruchamiania, czy na serwerach dewelopera są dostępne nowe wersje wtyczki.
· api-enabled: true – pozwala wtyczkom zewnętrznym na interakcję z danymi CoreProtect.
· default-radius: 10 – domyślny promień cofnięcia, jeśli ten parametr nie został podany w poleceniu.
· max-radius: 250 – ogranicza maksymalny promień dla jednego polecenia. Wartość 0 znosi to ograniczenie.
Blok parametrów logowania (Logging Settings)
Parametry te określają, które dokładnie zdarzenia są zapisywane do bazy danych. Wyłączenie zbędnych dzienników pomaga zmniejszyć rozmiar bazy danych:
· block-place: true / block-break: true – logowanie zwykłego stawiania i niszczenia bloków przez graczy.
· natural-break: true – logowanie wypadania bloków wskutek przesunięć lub zniszczenia bloków podporowych (na przykład rozbicie bloku, na którym trzymała się pochodnia).
· block-movement: true – logowanie grawitacyjnego opadania piasku, żwiru lub betonu.
· pistons: true – logowanie przemieszczania bloków za pomocą tłoków.
· block-burn: true – logowanie niszczenia bloków przez ogień.
· block-ignite: true – logowanie podpalania bloków przez graczy za pomocą krzesiwa lub kul ognia.
· explosions: true – logowanie wybuchów TNT, CREEPERÓW, łóżek w Netherze lub kryształów Endu.
· entity-kills: true – rejestracja śmierci mieszkańców wioski, zwierząt, potworów oraz stojaków na zbroję.
· player-chat: true / player-command: true – logowanie wiadomości na czacie i poleceń konsolowych.
· player-session: true – logowanie czasu wejścia i wyjścia graczy z serwera.
· container-transactions: true – logowanie operacji przemieszczania przedmiotów w skrzyniach, piecach, lejach i shulkerach.
Blok bazy danych (Database Settings)
· use-mysql: false – przełącznik typu bazy danych. W przypadku ustawienia true wtyczka łączy się z zewnętrznym DBMS MySQL.
· table-prefix: co_ – prefiks dla nazw tabel SQL.
· mysql-host: localhost – adres IP lub nazwa domeny serwera baz danych MySQL.
· mysql-port: 3306 – port sieciowy do połączenia.
· mysql-database: minecraft – nazwa docelowej bazy danych.
· mysql-username: root – nazwa użytkownika bazy danych.
· mysql-password: password – hasło użytkownika.
· mysql-ssl: false – włącza szyfrowanie SSL połączenia z serwerem baz danych.
4. API dla deweloperów wtyczek
CoreProtect udostępnia deweloperom dostęp do swojej bazy danych poprzez klasę CoreProtectAPI. Pozwala to innym wtyczkom (na przykład WorldEdit lub systemom ochrony) rejestrować swoje zmiany lub wykonywać automatyczne wyszukiwanie historii.
Inicjalizacja API
Aby połączyć się z API, używa się metody inicjalizacji:
import net.coreprotect.CoreProtect; |
Główne metody interfejsu API
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – rejestruje postawienie bloku w bazie danych w imieniu wskazanego użytkownika.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – rejestruje zniszczenie bloku.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – zapisuje operację dodania (true) lub wyjęcia (false) przedmiotów z pojemnika.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – wykonuje wyszukiwanie według wskazanych filtrów i zwraca tablicę wyników.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – inicjuje asynchroniczne cofnięcie zmian w świecie.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – inicjuje asynchroniczne przywrócenie zmian.
· boolean hasPlaced(String user, Block block, int time, int offset) – sprawdza, czy wskazany gracz postawił ten blok w określonym czasie.
· boolean hasRemoved(String user, Block block, int time, int offset) – sprawdza, czy wskazany gracz zniszczył ten blok.
5. Wydajność, kompatybilność i konserwacja
Podczas pracy z CoreProtect na serwerach o wysokiej liczbie graczy online administratorzy uwzględniają specyfikę interakcji z nowoczesnymi architekturami serwerowymi:
· Wsparcie Folia: Rdzeń serwera Folia wykorzystuje regionalne wielowątkowanie (Regionized multithreading), co wymaga od wtyczek ścisłego bezpieczeństwa wątków podczas pracy ze światem. CoreProtect został dostosowany do pracy w Folii: wykonanie operacji /co rollback oraz /co restore odbywa się poprzez harmonogram regionów (Region Scheduler), co zapobiega konfliktom dostępu do chunków i krytycznym błędom ConcurrentModificationException.
· Klastrowanie MultiPaper: Na serwerach typu MultiPaper CoreProtect konfiguruje się tak, aby korzystał z jednej zewnętrznej bazy danych MySQL. Pomaga to synchronizować historię działań graczy na różnych węzłach serwerowych klastra.
· Czyszczenie bazy danych (Purge): Lokalna baza danych SQLite z czasem ulega fragmentacji i rozrasta się, spowalniając wykonywanie poleceń. Polecenie /co purge t:30d usuwa rekordy starsze niż 30 dni. Po wyczyszczeniu bazy danych plik SQLite database.db nie zmniejsza się automatycznie pod względem rozmiaru, ponieważ DBMS SQLite zachowuje wolne strony na potrzeby przyszłych zapisów. Aby fizycznie zmniejszyć plik na dysku, należy wykonać polecenie VACUUM przez konsolę bazy danych lub zatrzymać serwer i przeprowadzić kompresję za pomocą narzędzi zewnętrznych. Użycie MySQL eliminuje ten problem, ponieważ DBMS MySQL skuteczniej zwalnia nieużywaną przestrzeń dyskową.
Podsumowanie
CoreProtect jest standardem dla systemów logowania i przywracania na serwerach Minecraft Java Edition. W przeciwieństwie do alternatyw takich jak LogBlock (który obsługuje wyłącznie pracę z MySQL i ogranicza się do logowania bloków) lub Prism (który ma bardziej złożoną strukturę konfiguracji), CoreProtect oferuje w pełni autonomiczne uruchomienie z SQLite, szczegółowe śledzenie zawartości pojemników, a także unikalny system podglądu cofnięć #preview. Jedynym technicznym ograniczeniem wtyczki jest znaczne obciążenie nośnika dyskowego podczas czyszczenia dużych lokalnych baz danych SQLite, dlatego dużym projektom zaleca się stosowanie dedykowanych DBMS MySQL na szybkich dyskach NVMe. Wtyczka nadaje się zarówno do małych prywatnych serwerów dla znajomych, jak i do wielkoskalowych projektów z setkami aktywnych graczy.
Instalacja
Typowa instalacja zajmuje około 5 minut. Procedura jest taka sama; różni się tylko loader i odpowiedni build.
- 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.











