
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
Dipendenze: · Loader: Bukkit, Spigot, Paper, Purpur, Folia · Versione di Minecraft: 1.16 - 1.21.11+ · Versione della mod: 23.2 I server…
Dipendenze: · Loader: Bukkit, Spigot, Paper, Purpur, Folia · Versione di Minecraft: 1.16 - 1.21.11+ · Versione della mod: 23.2 I server multigiocatore di Minecraft necessitano di un audit dettagliato delle azioni dei gi
Dipendenze:
· Loader: Bukkit, Spigot, Paper, Purpur, Folia
· Versione di Minecraft: 1.16 - 1.21.11+
· Versione della mod: 23.2
I server multigiocatore di Minecraft necessitano di un audit dettagliato delle azioni dei giocatori per prevenire modifiche non autorizzate della mappa e il furto di oggetti di valore di gioco. Il core vanilla del server non registra né la cronologia di modifica del terreno né lo spostamento degli oggetti nei contenitori, perciò gli amministratori non hanno modo di identificare i trasgressori o di annullare le distruzioni senza ripristinare completamente i file della mappa dalle copie di backup. Il plugin di server CoreProtect registra tutti gli eventi di modifica del mondo, crea indici dettagliati delle azioni degli utenti ed esegue ripristini (rollback) puntuali dello spazio sulla base di query parametriche complesse. Lo strumento funziona in modalità asincrona, scrivendo le transazioni in una coda per proteggere il thread principale del server dai rallentamenti.
1. Database e architettura asincrona di logging
Il plugin CoreProtect intercetta gli eventi del server tramite i gestori di eventi delle API Bukkit/Paper. Per evitare il blocco del thread principale del server (Server Thread) durante l'elaborazione di migliaia di record al secondo, il plugin utilizza un modello di logging asincrono. Gli eventi (distruzione di un blocco, modifica dell'inventario di una cassa, uso di un comando) vengono dapprima inseriti in un buffer dinamico interno DataQueue. Un thread consumatore in background (Consumer Thread) legge le transazioni dal buffer e le scrive nel database tramite transazioni in blocco (Batch processing), riducendo il carico sul dispositivo di archiviazione.
Il plugin supporta il funzionamento con due sistemi di gestione di basi di dati (DBMS):
1. SQLite (locale di default): Tutte le informazioni vengono scritte nel file database.db nella directory del plugin. SQLite non richiede l'installazione di servizi di terze parti, il che lo rende comodo per piccoli server locali con un basso livello di transazioni.
2. MySQL / MariaDB (server esterno): Utilizza una connessione di rete a un server di database separato. Questa soluzione è lo standard industriale per i grandi server e le reti di server con un elevato numero di giocatori online (a partire da 50 giocatori). MySQL garantisce un'elevata velocità di esecuzione delle query indicizzate ed elimina la frammentazione dell'archiviazione locale.
Schema delle tabelle del database
CoreProtect crea un insieme di tabelle relazionali per ottimizzare la memorizzazione dei dati. Invece di salvare stringhe di testo complete per ogni record, il plugin utilizza tabelle di dizionario per i nomi univoci di giocatori, mondi, tipi di blocchi ed entità.
Tabella | Scopo | Campi principali |
|---|---|---|
| Dizionario dei nomi utente |
|
| Dizionario dei mondi di gioco |
|
| Registro delle modifiche ai blocchi nel mondo |
|
| Transazioni di oggetti nei contenitori |
|
| Log delle sessioni di accesso (entrata/uscita) |
|
| Contenuto dei cartelli di testo |
|
| Registrazioni di morte e spawn delle creature |
|
Tutte le coordinate x, y, z vengono indicizzate insieme all'identificatore del mondo wid per garantire una ricerca istantanea delle transazioni entro un raggio determinato.
2. Sintassi dei comandi e parametri di filtraggio
L'interazione con il database di CoreProtect avviene tramite comandi testuali. Le operazioni principali sono: ispezione, ricerca, rollback e annullamento del rollback.
Modalità ispettore /co inspect o /co i)
Il comando passa il client alla modalità di audit locale. Dopo l'attivazione, il giocatore può interagire con il mondo per ottenere i log:
· Il clic sinistro su un blocco esistente mostra in chat il nickname di chi lo ha piazzato, la data, l'ora e le coordinate.
· Il clic destro su una superficie vuota (o su un blocco) mostra la cronologia dei blocchi che in precedenza occupavano quello spazio o che sono stati rimossi.
· Il clic destro su un contenitore (cassa, fornace, barile, shulker) mostra il log dello spostamento degli oggetti.
Parametri di filtraggio delle query /co rollback, /co restore, /co lookup)
Per la selezione dei dati il plugin utilizza parametri combinati nel formato parametro:valore. I parametri sono separati da spazi:
1. Utente u:<nome>): Indica il giocatore da controllare. È possibile indicare più nomi separati da virgola (per esempio, u:Stevie,Alex). Per il rollback degli eventi naturali si utilizzano identificatori tecnici:
· u:#fire – propagazione del fuoco.
· u:#lava – fuoriuscita di lava.
· u:#water – fuoriuscita d'acqua.
· u:#creeper – esplosione di un creeper.
· u:#tnt – esplosione di dinamite.
· u:#enderman – spostamento di blocchi da parte di un enderman.
2. Tempo t:<valore>): Intervallo di tempo per l'analisi. Supporta le unità di misura: s (secondi), m (minuti), h (ore), d (giorni), w (settimane), y (anni). È consentito combinare le unità, per esempio: t:2w4d6h (2 settimane, 4 giorni e 6 ore).
3. Raggio r:<numero>): Raggio della zona di ricerca in blocchi attorno all'esecutore del comando. Supporta inoltre valori speciali:
· r:#global – ricerca in tutto il database (all'interno di tutti i chunk caricati).
· r:#world – ricerca all'interno del mondo di gioco corrente.
· r:#chunk – ricerca nel chunk corrente del giocatore.
· r:#selection (o r:#we) – limita la ricerca ai confini della griglia di selezione corrente di WorldEdit.
4. Azione a:<tipo>): Filtra i record in base al tipo di operazione:
· a:block – piazzamento e distruzione di blocchi.
· a:+block – solo piazzamento di blocchi.
· a:-block – solo distruzione di blocchi.
· a:container – transazioni dell'inventario.
· a:+container – aggiunta di oggetti a un contenitore.
· a:-container – prelievo di oggetti da un contenitore.
· a:kill – morte di animali e mostri.
· a:spawn – spawn delle entità.
· a:chat – messaggi in chat.
· a:command – comandi inseriti.
· a:session – accesso dei giocatori.
5. Blocchi b:<materiale>): Limita la ricerca ai materiali indicati (per esempio, b:stone,oak_planks).
6. Esclusione e:<materiale>): Esclude i materiali dall'elaborazione (per esempio, e:tnt).
Anteprima del rollback e annullamento delle operazioni
Per ridurre al minimo gli errori durante i rollback su larga scala, CoreProtect supporta un sistema di simulazione visiva:
1. L'esecuzione del comando di rollback con il flag #preview (per esempio, /co rollback u:Griefer t:2h r:20 #preview) non modifica i file della mappa. Il client riceve invece i pacchetti di modifica dei blocchi nella sessione di rendering corrente. L'amministratore vede il mondo nello stato "dopo il rollback", mentre per gli altri giocatori i blocchi restano invariati.
#preview
/co apply
2. Per applicare il risultato si utilizza il comando /co apply.
3. Per annullare l'anteprima si utilizza il comando /co cancel.
4. Per annullare un rollback fisico già eseguito si applica il comando /co undo, che riporta le coordinate allo stato precedente all'esecuzione di /co rollback.
3. Descrizione completa del file di configurazione config.yml
Il file di configurazione gestisce i limiti, i parametri di logging e la connessione ai database.
Blocco dei parametri generali (General Settings)
· verbose: true – mostra in console un rapporto dettagliato su ogni coordinata modificata durante l'esecuzione dei rollback. Se impostato su false viene mostrato solo il numero totale di blocchi modificati.
· check-updates: true – verifica all'avvio se sono presenti nuove versioni del plugin sui server dello sviluppatore.
· api-enabled: true – consente ai plugin di terze parti di interagire con i dati di CoreProtect.
· default-radius: 10 – raggio di rollback predefinito se questo parametro non è indicato nel comando.
· max-radius: 250 – limita il raggio massimo per un singolo comando. Il valore 0 rimuove la limitazione.
Blocco dei parametri di logging (Logging Settings)
Questi parametri determinano quali eventi vengono effettivamente scritti nel database. Disattivare i log non necessari aiuta a ridurre le dimensioni del database:
· block-place: true / block-break: true – logging del normale piazzamento e distruzione di blocchi da parte dei giocatori.
· natural-break: true – logging della caduta di blocchi a seguito di spostamenti o della distruzione di blocchi di supporto (per esempio, la rottura del blocco su cui era appoggiata una torcia).
· block-movement: true – logging della caduta gravitazionale di sabbia, ghiaia o calcestruzzo.
· pistons: true – logging dello spostamento di blocchi tramite pistoni.
· block-burn: true – logging della distruzione di blocchi a causa del fuoco.
· block-ignite: true – logging dell'incendio di blocchi da parte dei giocatori tramite acciarino o sfere di fuoco.
· explosions: true – logging delle esplosioni di dinamite, creeper, letti nel Nether o cristalli dell'End.
· entity-kills: true – registrazione della morte di villici, animali, mostri e supporti per armature.
· player-chat: true / player-command: true – logging dei messaggi in chat e dei comandi da console.
· player-session: true – logging dell'orario di accesso e di uscita dei giocatori dal server.
· container-transactions: true – logging delle operazioni di spostamento degli oggetti in casse, fornaci, tramogge e shulker.
Blocco del database (Database Settings)
· use-mysql: false – interruttore del tipo di database. Se impostato su true il plugin si connette a un DBMS MySQL esterno.
· table-prefix: co_ – prefisso per i nomi delle tabelle SQL.
· mysql-host: localhost – indirizzo IP o nome di dominio del server di database MySQL.
· mysql-port: 3306 – porta di rete per la connessione.
· mysql-database: minecraft – nome del database di destinazione.
· mysql-username: root – nome utente del database.
· mysql-password: password – password dell'utente.
· mysql-ssl: false – attiva la crittografia SSL della connessione al server di database.
4. API per gli sviluppatori di plugin
CoreProtect offre agli sviluppatori l'accesso al proprio database tramite la classe CoreProtectAPI. Ciò consente ad altri plugin (per esempio WorldEdit o sistemi di protezione) di registrare le proprie modifiche o di eseguire una ricerca automatica nella cronologia.
Inizializzazione dell'API
Per connettersi all'API si utilizza il metodo di inizializzazione:
import net.coreprotect.CoreProtect; |
Principali metodi dell'interfaccia API
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – registra il piazzamento di un blocco nel database a nome dell'utente indicato.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – registra la distruzione di un blocco.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – registra l'operazione di aggiunta (true) o prelievo (false) di oggetti da un contenitore.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – esegue una ricerca in base ai filtri indicati e restituisce un array di risultati.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – avvia un rollback asincrono delle modifiche nel mondo.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – avvia un ripristino asincrono delle modifiche.
· boolean hasPlaced(String user, Block block, int time, int offset) – verifica se il giocatore indicato ha piazzato questo blocco entro un determinato periodo di tempo.
· boolean hasRemoved(String user, Block block, int time, int offset) – verifica se il giocatore indicato ha distrutto questo blocco.
5. Prestazioni, compatibilità e manutenzione
Quando si utilizza CoreProtect su server con un elevato numero di giocatori online, gli amministratori tengono conto delle particolarità dell'interazione con le moderne architetture di server:
· Supporto di Folia: Il core di server Folia utilizza una pianificazione multithread per regioni (Regionized multithreading), che richiede ai plugin una rigorosa sicurezza dei thread durante il lavoro con il mondo. CoreProtect è adattato al funzionamento in Folia: l'esecuzione delle operazioni /co rollback e /co restore avviene tramite lo scheduler delle regioni (Region Scheduler), il che previene i conflitti di accesso ai chunk e gli errori critici di tipo ConcurrentModificationException.
· Clustering MultiPaper: Sui server di tipo MultiPaper CoreProtect viene configurato per l'utilizzo di un unico database MySQL esterno. Ciò aiuta a sincronizzare la cronologia delle azioni dei giocatori sui diversi nodi del cluster.
· Pulizia del database (Purge): Il database locale SQLite con il tempo si frammenta e si espande, rallentando l'esecuzione dei comandi. Il comando /co purge t:30d elimina i record più vecchi di 30 giorni. Dopo la pulizia del database SQLite il file database.db non si riduce automaticamente di dimensione, poiché il DBMS SQLite conserva le pagine libere per i record futuri. Per ridurre fisicamente il file sul disco è necessario eseguire il comando VACUUM tramite la console del database oppure arrestare il server ed effettuare la compressione tramite utility di terze parti. L'uso di MySQL elimina questo problema, poiché il DBMS MySQL libera in modo più efficiente lo spazio su disco non utilizzato.
Conclusione
CoreProtect è lo standard per i sistemi di logging e ripristino sui server di Minecraft Java Edition. A differenza di alternative come LogBlock (che supporta solo il lavoro con MySQL ed è limitato al logging dei blocchi) o Prism (che ha una struttura di configurazione più complessa), CoreProtect offre un funzionamento completamente autonomo con SQLite, un tracciamento dettagliato del contenuto dei contenitori e, inoltre, un sistema unico di anteprima dei rollback #preview. L'unica limitazione tecnica del plugin è il notevole carico sul dispositivo di archiviazione durante la pulizia dei grandi database locali SQLite, perciò ai progetti di grandi dimensioni si consiglia di utilizzare DBMS MySQL dedicati su veloci dischi NVMe. Il plugin è adatto sia per piccoli server privati tra amici sia per progetti su larga scala con centinaia di giocatori attivi.
Installazione
Un'installazione tipica richiede circa 5 minuti. Il procedimento è lo stesso; cambiano solo il loader e la build corrispondente.
- 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.








