
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
Afhankelijkheden: · Loader: Bukkit, Spigot, Paper, Purpur, Folia · Minecraft-versie: 1.16 - 1.21.11+ · Mod-versie: 23.2…
Afhankelijkheden: · Loader: Bukkit, Spigot, Paper, Purpur, Folia · Minecraft-versie: 1.16 - 1.21.11+ · Mod-versie: 23.2 Multiplayer-Minecraft-servers vereisen een gedetailleerde controle van spelersacties om ongeoorloof
Afhankelijkheden:
· Loader: Bukkit, Spigot, Paper, Purpur, Folia
· Minecraft-versie: 1.16 - 1.21.11+
· Mod-versie: 23.2
Multiplayer-Minecraft-servers vereisen een gedetailleerde controle van spelersacties om ongeoorloofde wijzigingen aan de kaart en diefstal van waardevolle spelobjecten te voorkomen. De vanilla-kern van de server registreert geen geschiedenis van het bewerken van het landschap of het verplaatsen van voorwerpen in containers, waardoor beheerders niet in staat zijn om overtreders te identificeren of vernietigingen ongedaan te maken zonder de kaartbestanden volledig vanuit back-ups te herstellen. De serverplugin CoreProtect registreert alle gebeurtenissen die de wereld veranderen, maakt gedetailleerde indexen van gebruikersacties aan en voert puntsgewijze terugdraaiingen (rollbacks) van het gebied uit op basis van complexe parametrische query's. De tool werkt in asynchrone modus en schrijft transacties naar een wachtrij om de hoofdthread van de server tegen vertragingen te beschermen.
1. Databases en asynchrone logarchitectuur
De CoreProtect-plugin onderschept serverevenementen met behulp van de event-handlers van de Bukkit/Paper API. Om te voorkomen dat de hoofdthread van de server (Server Thread) wordt geblokkeerd tijdens het verwerken van duizenden records per seconde, gebruikt de plugin een asynchroon logmodel. Gebeurtenissen (het vernietigen van een blok, het wijzigen van de inventaris van een kist, het gebruik van een commando) worden eerst in een interne dynamische buffer DataQueue geplaatst. Een achtergrond-consumer-thread (Consumer Thread) leest de transacties uit de buffer en schrijft ze in batchtransacties (Batch processing) naar de database, wat de belasting op het opslagmedium vermindert.
De plugin ondersteunt het werken met twee databasebeheersystemen (DBMS):
1. SQLite (lokaal, standaard): Alle informatie wordt naar het bestand database.db in de map van de plugin geschreven. SQLite vereist geen installatie van diensten van derden, wat het handig maakt voor kleine lokale servers met een laag transactieniveau.
2. MySQL / MariaDB (externe server): Maakt gebruik van een netwerkverbinding met een aparte databaseserver. Deze oplossing is de industriestandaard voor grote servers en servernetwerken met een hoog aantal gelijktijdige spelers (vanaf 50 spelers). MySQL zorgt voor een hoge uitvoeringssnelheid van indexquery's en sluit fragmentatie van de lokale opslag uit.
Tabelschema van de database
CoreProtect maakt een set relationele tabellen aan om de gegevensopslag te optimaliseren. In plaats van volledige tekstreeksen voor elke record op te slaan, gebruikt de plugin woordenboektabellen voor unieke spelersnamen, werelden, bloktypen en entiteiten.
Tabel | Doel | Hoofdvelden |
|---|---|---|
| Woordenboek van gebruikersnamen |
|
| Woordenboek van spelwerelden |
|
| Register van blokwijzigingen in de wereld |
|
| Transacties van voorwerpen in containers |
|
| Log van aanmeldsessies (in-/uitloggen) |
|
| Inhoud van tekstbordjes |
|
| Registraties van het sterven en spawnen van wezens |
|
Alle coördinaten x, y, z worden samen met de wereld-id wid geïndexeerd om een directe zoekopdracht naar transacties binnen een bepaalde straal te garanderen.
2. Commandosyntaxis en filterparameters
De interactie met de database van CoreProtect verloopt via tekstcommando's. De belangrijkste bewerkingen zijn: inspecteren, zoeken, terugdraaien en het terugdraaien ongedaan maken.
Inspecteurmodus /co inspect of /co i)
Het commando schakelt de client over naar de lokale controlemodus. Na activering kan de speler met de wereld interageren om logs op te vragen:
· Linkermuisklik op een bestaand blok toont in de chat de bijnaam van degene die het heeft geplaatst, de datum, de tijd en de coördinaten.
· Rechtermuisklik op een leeg vlak (of blok) toont de geschiedenis van de blokken die deze ruimte eerder innamen of die zijn verwijderd.
· Rechtermuisklik op een container (kist, oven, vat, shulker) toont het log van het verplaatsen van voorwerpen.
Filterparameters voor query's /co rollback, /co restore, /co lookup)
Voor de selectie van gegevens gebruikt de plugin gecombineerde parameters in het formaat parameter:waarde. Parameters worden door spaties gescheiden:
1. Gebruiker u:<naam>): Geeft de te controleren speler aan. Je kunt meerdere namen opgeven, gescheiden door een komma (bijvoorbeeld u:Stevie,Alex). Voor het terugdraaien van natuurlijke gebeurtenissen worden technische identificatoren gebruikt:
· u:#fire – verspreiding van vuur.
· u:#lava – uitstroming van lava.
· u:#water – uitstroming van water.
· u:#creeper – explosie van een CREEPER.
· u:#tnt – explosie van TNT.
· u:#enderman – het verplaatsen van blokken door een ENDERMAN.
2. Tijd t:<waarde>): Tijdsinterval voor de analyse. Ondersteunt maateenheden: s (seconden), m (minuten), h (uren), d (dagen), w (weken), y (jaren). Het is toegestaan eenheden te combineren, bijvoorbeeld: t:2w4d6h (2 weken, 4 dagen en 6 uur).
3. Straal r:<getal>): Straal van de zoekzone in blokken rond degene die het commando uitvoert. Ondersteunt ook speciale waarden:
· r:#global – zoeken in de hele database (binnen alle geladen chunks).
· r:#world – zoeken binnen de huidige spelwereld.
· r:#chunk – zoeken in de huidige chunk van de speler.
· r:#selection (of r:#we) – beperkt het zoeken tot de grenzen van de huidige WorldEdit-selectie.
4. Actie a:<type>): Filtert records op basis van het bewerkingstype:
· a:block – het plaatsen en vernietigen van blokken.
· a:+block – alleen het plaatsen van blokken.
· a:-block – alleen het vernietigen van blokken.
· a:container – inventaristransacties.
· a:+container – het toevoegen van voorwerpen aan een container.
· a:-container – het verwijderen van voorwerpen uit een container.
· a:kill – de dood van dieren en monsters.
· a:spawn – het spawnen van entiteiten.
· a:chat – chatberichten.
· a:command – ingevoerde commando's.
· a:session – aanmelding van spelers.
5. Blokken b:<materiaal>): Beperkt het zoeken tot de opgegeven materialen (bijvoorbeeld b:stone,oak_planks).
6. Uitsluiting e:<materiaal>): Sluit materialen uit van de verwerking (bijvoorbeeld e:tnt).
Voorbeeldweergave van het terugdraaien en het ongedaan maken van bewerkingen
Om fouten tijdens grootschalige terugdraaiingen te minimaliseren, ondersteunt CoreProtect een systeem voor visuele simulatie:
1. Het uitvoeren van het terugdraaicommando met de vlag #preview (bijvoorbeeld /co rollback u:Griefer t:2h r:20 #preview) wijzigt de kaartbestanden niet. In plaats daarvan ontvangt de client pakketten met blokwijzigingen in de huidige rendersessie. De beheerder ziet de wereld in de toestand "na het terugdraaien", terwijl de blokken voor andere spelers ongewijzigd blijven.
#preview
/co apply
2. Om het resultaat toe te passen, gebruikt men het commando /co apply.
3. Om de voorbeeldweergave te annuleren, gebruikt men het commando /co cancel.
4. Om een reeds uitgevoerde fysieke terugdraaiing ongedaan te maken, past men het commando /co undo toe, dat de coördinaten terugbrengt naar de toestand van vóór de uitvoering van /co rollback.
3. Volledige beschrijving van het configuratiebestand config.yml
Het configuratiebestand beheert limieten, logparameters en databaseverbindingen.
Blok met algemene parameters (General Settings)
· verbose: true – geeft tijdens het uitvoeren van terugdraaiingen een gedetailleerd rapport in de console weer over elke gewijzigde coördinaat. Indien ingesteld op false wordt alleen het totale aantal gewijzigde blokken weergegeven.
· check-updates: true – controleert bij het opstarten of er nieuwe versies van de plugin op de servers van de ontwikkelaar zijn.
· api-enabled: true – staat plugins van derden toe om met de gegevens van CoreProtect te interageren.
· default-radius: 10 – de standaardstraal voor het terugdraaien, als deze parameter niet in het commando is opgegeven.
· max-radius: 250 – beperkt de maximale straal voor één commando. De waarde 0 heft de beperking op.
Blok met logparameters (Logging Settings)
Deze parameters bepalen welke gebeurtenissen precies in de database worden vastgelegd. Het uitschakelen van onnodige logs helpt om de grootte van de database te verkleinen:
· block-place: true / block-break: true – het loggen van het gewone plaatsen en vernietigen van blokken door spelers.
· natural-break: true – het loggen van het vallen van blokken als gevolg van verschuivingen of het vernietigen van steunblokken (bijvoorbeeld het breken van het blok waarop een fakkel hing).
· block-movement: true – het loggen van het gravitatieval van zand, grind of beton.
· pistons: true – het loggen van het verplaatsen van blokken met behulp van zuigers.
· block-burn: true – het loggen van het vernietigen van blokken door vuur.
· block-ignite: true – het loggen van het in brand steken van blokken door spelers met behulp van een vuursteen en staal of vuurballen.
· explosions: true – het loggen van explosies van TNT, CREEPERS, bedden in de Nether of End-kristallen.
· entity-kills: true – het registreren van de dood van dorpelingen, dieren, monsters en wapenrekken.
· player-chat: true / player-command: true – het loggen van chatberichten en consolecommando's.
· player-session: true – het loggen van de in- en uitlogtijden van spelers op de server.
· container-transactions: true – het loggen van het verplaatsen van voorwerpen in kisten, ovens, trechters en shulkers.
Databaseblok (Database Settings)
· use-mysql: false – schakelaar voor het databasetype. Indien ingesteld op true maakt de plugin verbinding met een extern MySQL-DBMS.
· table-prefix: co_ – voorvoegsel voor de namen van SQL-tabellen.
· mysql-host: localhost – IP-adres of domeinnaam van de MySQL-databaseserver.
· mysql-port: 3306 – netwerkpoort voor de verbinding.
· mysql-database: minecraft – de naam van de doeldatabase.
· mysql-username: root – de gebruikersnaam van de database.
· mysql-password: password – het wachtwoord van de gebruiker.
· mysql-ssl: false – schakelt SSL-versleuteling van de verbinding met de databaseserver in.
4. API voor pluginontwikkelaars
CoreProtect biedt ontwikkelaars toegang tot zijn database via de klasse CoreProtectAPI. Dit stelt andere plugins (bijvoorbeeld WorldEdit of beveiligingssystemen) in staat om hun wijzigingen te registreren of automatisch in de geschiedenis te zoeken.
Initialisatie van de API
Om verbinding te maken met de API gebruikt men de initialisatiemethode:
import net.coreprotect.CoreProtect; |
Belangrijkste methoden van de API-interface
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – registreert het plaatsen van een blok in de database namens de opgegeven gebruiker.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – registreert het vernietigen van een blok.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – registreert de bewerking van het toevoegen (true) of verwijderen (false) van voorwerpen uit een container.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – voert een zoekopdracht uit op basis van de opgegeven filters en geeft een array met resultaten terug.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – initieert een asynchrone terugdraaiing van wijzigingen in de wereld.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – initieert een asynchroon herstel van wijzigingen.
· boolean hasPlaced(String user, Block block, int time, int offset) – controleert of de opgegeven speler dit blok binnen een bepaalde tijd heeft geplaatst.
· boolean hasRemoved(String user, Block block, int time, int offset) – controleert of de opgegeven speler dit blok heeft vernietigd.
5. Prestaties, compatibiliteit en onderhoud
Bij het werken met CoreProtect op servers met veel gelijktijdige spelers houden beheerders rekening met de bijzonderheden van de interactie met moderne serverarchitecturen:
· Folia-ondersteuning: De serverkern van Folia maakt gebruik van geregionaliseerde multithreading (Regionized multithreading), wat van plugins een strikte thread-veiligheid vereist tijdens het werken met de wereld. CoreProtect is aangepast om in Folia te werken: de uitvoering van de bewerkingen /co rollback en /co restore verloopt via de regioplanner (Region Scheduler), wat conflicten bij de toegang tot chunks en kritieke fouten zoals ConcurrentModificationException voorkomt.
· MultiPaper-clustering: Op servers van het type MultiPaper wordt CoreProtect geconfigureerd om één enkele externe MySQL-database te gebruiken. Dit helpt om de geschiedenis van spelersacties op de verschillende servernodes van het cluster te synchroniseren.
· Het opschonen van de database (Purge): De lokale SQLite-database raakt na verloop van tijd gefragmenteerd en groeit, wat de uitvoering van commando's vertraagt. Het commando /co purge t:30d verwijdert records die ouder zijn dan 30 dagen. Na het opschonen van de database wordt het SQLite-bestand database.db niet automatisch kleiner, omdat het SQLite-DBMS vrije pagina's bewaart voor toekomstige records. Om het bestand fysiek op de schijf te verkleinen, moet men het commando VACUUM via de databaseconsole uitvoeren, of de server stoppen en de compressie uitvoeren met behulp van externe hulpprogramma's. Het gebruik van MySQL verhelpt dit probleem, omdat het MySQL-DBMS ongebruikte schijfruimte efficiënter vrijgeeft.
Conclusie
CoreProtect is de standaard voor log- en herstelsystemen op Minecraft Java Edition-servers. In tegenstelling tot alternatieven zoals LogBlock (dat alleen het werken met MySQL ondersteunt en beperkt is tot het loggen van blokken) of Prism (dat een complexere configuratiestructuur heeft), biedt CoreProtect een volledig zelfstandige start met SQLite, gedetailleerde tracering van de inhoud van containers, en een uniek systeem voor de voorbeeldweergave van terugdraaiingen #preview. De enige technische beperking van de plugin is de aanzienlijke belasting van de schijfopslag tijdens het opschonen van grote lokale SQLite-databases, waardoor het grote projecten wordt aangeraden om speciale MySQL-DBMS'en op snelle NVMe-schijven te gebruiken. De plugin is zowel geschikt voor kleine privéservers van vrienden als voor grootschalige projecten met honderden actieve spelers.
Installatie
Een typische installatie duurt ongeveer 5 minuten. De stappen zijn gelijk; alleen de loader en de bijbehorende build verschillen.
- 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.








