",
+ desc: `Die Nachricht für unbekannte Befehle, die an den Spieler gesendet wird, wenn er einen unbekannten Befehl ausführt.
+ Die Nachricht muss das [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/)-Format verwenden.
+ Wenn auf \`default\` gesetzt, wird die Vanilla-Nachricht für unbekannte Befehle verwendet.
+
+ Verfügbare Platzhalter:
+
+ - __\`\`__ - die detaillierten Informationen des unbekannten Befehls.
+
+
+
API / Plugin-Freundlich
+ Diese Funktion ist API- / Plugin-freundlich. Das bedeutet, dass diese Nachricht von Plugins überschrieben werden kann, die \`UnknownCommandEvent#message\` oder \`UnknownCommandEvent#setMessage\` verwenden.
+
`
+ }
+ },
+ rebrand: {
+ "server-mod-name": {
+ default: "Leaf",
+ desc: "Der Server-Markenname, der im F3-Debug-Menü des Clients und in der Server-MOTD angezeigt wird."
+ },
+ "server-gui-name": {
+ default: "Leaf Console",
+ desc: "Der Titel, der im Server-GUI-Fenster angezeigt wird, wenn du den Server ohne die Option \`--nogui\` im Start-Flag gestartet hast."
+ }
+ },
+ sentry: {
+ __desc__: `[Sentry](https://sentry.io/welcome/) ist ein Anwendungsüberwachungsdienst für verbesserte Fehlerprotokollierung und -verfolgung. Hilft dem Server-Entwicklerteam bei der besseren Wartung.
+
+ Nach der Aktivierung der Sentry-Integration für deinen Server musst du keine langen Logs mehr manuell prüfen, um Fehler zu finden. Sentry kann Fehler sammeln, die auf deinem Server aufgetreten sind, ermöglicht es dir, Fehler im Web-Panel von Sentry zu verfolgen, und hilft dir, diese einfacher und schneller zu lokalisieren und zu beheben.
+
+ Siehe __[How to Setup Sentry](../how-to/setup-sentry)__, um zu erfahren, wie du es einrichtest und den DSN-Key für \`sentry.dsn\` unten erhältst.
`,
+ dsn: {
+ default: "''",
+ desc: `Der DSN-Key deines Sentry.
+ Wenn ein leerer Wert \`''\` angegeben wird, ist Sentry deaktiviert.`
+ },
+ "log-level": {
+ default: "WARN",
+ desc: `Logs mit einem Level höher oder gleich diesem Level werden aufgezeichnet.
+ Die gültigen Werte für diese Option sind: \`"WARN"\`, \`"ERROR"\` und \`"FATAL"\`.`
+ },
+ "only-log-thrown": {
+ default: true,
+ desc: "Ob Sentry nur Logs mit Javas \`Throwable\` aufzeichnet."
+ }
+ },
+ "secure-seed": {
+ enabled: {
+ default: false,
+ desc: `Ob der sichere Seed (Secure Seed) verwendet werden soll.
+
+ Der sichere Seed stellt sicher, dass alle Erze und Strukturen mit einem 1024-Bit-Seed unter Verwendung einer kryptografischen Hash-Funktion mit hoher Sicherheit generiert werden, anstatt einen 64-Bit-Seed wie in Vanilla zu verwenden. Dies schützt die Struktur-Seeds durch rechnerische Sicherheit und macht das Seed-Cracking nahezu unmöglich.
+
+
Warnung
+ Der sichere Seed ändert grundlegend die Positionen von Erzen und Strukturen im Vergleich zu Vanilla.
+ Dies gilt nur für neu generierte Chunks. Daher musst du eine neue Welt vorbereiten, wenn du diese Option aktivieren möchtest.
+ Sobald diese Option aktiviert ist, kannst du sie nicht deaktivieren, um zur Vanilla-Generierung zurückzukehren, es sei denn, du generierst die gesamte Welt vor, da neu generierte Chunks sonst Terrain-Unstimmigkeiten aufweisen.
+
`
+ }
+ },
+ "remove-vanilla-username-check": {
+ default: true,
+ desc: `Ob die Vanilla-Benutzernamenprüfung entfernt werden soll, um __alle Zeichen__ als Benutzernamen zu erlauben, einschließlich Chinesisch usw. (Dies ist nur für Offline-Server nützlich).
+ Wenn auf \`true\` gesetzt, können Spieler mit einem nicht-englischen Namen dem Server beitreten.`
+ },
+ "remove-spigot-check-bungee-config": {
+ default: true,
+ desc: `Ob der Spieler über einen Proxy auf den Backend-Server gelangen kann, ohne dass der Backend-Server den BungeeCord-Modus in \`spigot.yml\` aktiviert hat.
+
+
Warnung
+ Es wird nicht empfohlen, diese Option zu ändern, es sei denn, du bist sicher, was du tust.
+ Und sie könnte in Zukunft entfernt werden.
+
`
+ },
+ "remove-change-non-editable-sign-warning": {
+ default: false,
+ desc: `Ob der Server eine Warnmeldung ausgibt, wenn Spieler versuchen, ein Schild zu bearbeiten, das sie nicht bearbeiten dürfen.
+ Die Warnmeldung sieht so aus: \`Player [...] just tried to change non-editable sign\`.
+ Wenn auf \`true\` gesetzt, verhindert dies Konsolen-Spam, der durch Spieleraktionen oder andere Fälle verursacht wird.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "region-format-settings": {
+ __desc__: `Linear ist ein Regionsdateiformat, das [zstd-Kompression](https://facebook.github.io/zstd/) anstelle von zlib in Vanilla Minecraft verwendet. Dieses Format spart etwa ~50% Speicherplatz.
+ Um das Linear-Regionsformat zu verwenden, stelle sicher, dass du die __[Linear Documentation](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools) gelesen__ und alle erforderlichen Schritte ausgeführt hast, und ändere dann \`region-format\` unten auf \`LINEAR\`.
+
+
Warnung
+ Experimentelle Funktion, es besteht ein potenzielles Risiko des Verlusts von Chunk-Daten. Erstelle ein Backup deines Servers, bevor du zu Linear wechselst.
+ Außerdem empfehlen wir die Verwendung von Linear nicht, da das Vanilla-ANVIL-Format (\`.mca\`) ausreichend ist. Leaf verwendet die refactored Version des Linear-Flush-Systems, die sicherer, aber langsamer beim Speichern von Chunks ist, um Datenverlust weniger wahrscheinlich zu machen. Dieser Kompromiss lohnt sich jedoch, da Daten von unschätzbarem Wert sind.
+
`,
+ "region-format": {
+ default: "MCA",
+ desc: `Spezifiziert das Format, das zum Speichern von Chunk-Daten in Regionsdateien verwendet wird.
+ Verfügbare Regionsformate:
+
+ - \`MCA\`: Standardmäßiges Minecraft-ANVIL-Format unter Verwendung von zlib-Kompression.
+ - \`LINEAR\`: Das Linear v1 Format. Die refactored Version von [EarthMe](https://github.com/MrHua269) hat das Linear-Flush-System behoben.
+
`
+ },
+ "linear-compress-level": {
+ default: 1,
+ desc: `Das Kompressionslevel der Linear-Regionsformatdatei.
+ Dies hat nur Auswirkungen, wenn \`region-format\` oben auf \`LINEAR\` steht.
+
+
+ - Wenn auf ein höheres Level (bis zu \`22\`) gesetzt, bietet es bessere Kompressionsverhältnisse, erfordert jedoch deutlich mehr CPU-Zeit für die Kompression.
+ - Wenn auf ein niedrigeres Level gesetzt, komprimiert es schneller, benötigt aber mehr Platz. Level 1 verwendet die schnellste und leichteste Kompression.
+
`
+ },
+ "throw-on-unknown-extension-detected": {
+ default: false,
+ desc: `Ob ein Fehler geworfen und der Server abstürzen soll, wenn eine unbekannte oder nicht übereinstimmende Regionsformat-Erweiterung beim Laden von Regionsdateien von der Festplatte erkannt wird.
+ Dies kann Datenkorruption durch versehentlich konfigurierte falsche Regionsdateiformate in derselben Welt verhindern.
+
+ Zum Beispiel:
+ Wenn auf \`true\` gesetzt, stürzt der Server sofort ab, wenn \`.linear\`-Dateien geladen werden, während \`region-format\` oben auf \`MCA\` steht, oder umgekehrt.`
+ },
+ "flush-interval-seconds": {
+ default: 5,
+ desc: `Wie oft der Server versucht, zwischengespeicherte Linear-Regionsdateidaten auf die Festplatte zu flushen (schreiben).
+ Häufigeres Flushen reduziert potenziellen Datenverlust bei einem Absturz, erhöht aber die Festplatten-I/O.
+ (Einheit: Sekunde)`
+ }
+ },
+ "lag-compensation": {
+ enabled: {
+ default: false,
+ desc: `Die Lag-Kompensation wurde entwickelt, um die Auswirkungen von Server-Lag-Spikes oder niedrigen TPS-Situationen auf das Gameplay zu mildern, was das grundlegende Spielerlebnis während des Lags sicherstellen könnte.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "enable-for-water": {
+ default: false,
+ desc: `Ob Lag-Kompensation für fließendes Wasser aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "enable-for-lava": {
+ default: false,
+ desc: `Ob Lag-Kompensation für fließende Lava aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "including-5s-in-get-tps": {
+ default: true,
+ desc: `Ob 5-Sekunden-TPS in das Ergebnis der API \`Bukkit#getTPS\` und \`Server#getTPS\` aufgenommen werden sollen.
+ Befehle wie \`/tps\` zeigen dies unabhängig davon an.
+
+ - Wenn auf \`true\` gesetzt, kannst du die \`getTPS\`-Methode verwenden, um ein TPS-Long-Array mit 4 Elementen \`[5s, 1m, 5m, 15m]\` zu erhalten.
+ - Wenn auf \`false\` gesetzt, kannst du die \`getTPS\`-Methode verwenden, um ein TPS-Long-Array mit 3 Elementen \`[1m, 5m, 15m]\` zu erhalten.
+
+
+ Möchtest du tiefer eintauchen?
+ Wenn du die Leaf API für deine Plugins verwendest. Oder auf Leaf läufst und Reflection verwendest, um TPS zu erhalten, kannst du \`Bukkit#getTPSIncluding5SecondAverage\` verwenden, um das TPS-Array einschließlich 5-Sekunden-TPS \`[5s, 1m, 5m, 15m]\` zu erhalten.
+ Außerdem kannst du \`Bukkit#get5SecondTPSAverage\` verwenden, um den Durchschnittswert der 5-Sekunden-TPS als \`double\` zu erhalten.
+ `
+ },
+ "hidden-item-components": {
+ default: "[]",
+ desc: `Die Liste der Komponenten-Typschlüssel, die vor dem Inventar des Spielers, das an Clients gesendet wird, verborgen werden sollen.
+
+ Es kann verwendet werden, um komplexe Komponentendaten eines Items zu verbergen, um die Rendering-Last, häufige Animationen auf der Client-Seite und die Netzwerknutzung zu reduzieren. Die tatsächlichen Item-Daten sind nicht betroffen.
+
+ Es sei darauf hingewiesen, dass sich diese Option von Papers [Item-Obfuskation](https://docs.papermc.io/paper/reference/global-configuration/#anticheat_obfuscation_items_enable_item_obfuscation) unterscheidet. Diese Option verbirgt nur Item-Komponentendaten aus dem eigenen Inventar des Spielers, anstatt Daten zu verbergen, die an andere gesendet werden.
+ Zum Beispiel:
+
+ - Wenn der Wert \`[]\` angegeben wird, ist kein Item betroffen.
+ - Wenn der Wert \`[\"minecraft:custom_data\"]\`, wird die \`custom_data\`-Komponente des Items auf dem Client des Spielers verborgen.
+
+ Siehe [List of components](https://minecraft.wiki/w/Data_component_format#List_of_components) um die vollständige Liste der verfügbaren Komponenten-Typschlüssel für Items zu erhalten.
+
+
Achtung
+ Dies kann Resource Packs, Client-Mods oder spezifische Spielmechaniken beschädigen, die auf diesen clientseitigen Komponentendaten von Items basieren. Mit Vorsicht verwenden. Du musst wissen, welche Komponenten du verbirgst!
+
`
+ },
+ "connection-message": {
+ __desc__: `Die Verbindungsnachricht wird an alle Online-Spieler gesendet, wenn sie dem Server beitreten oder ihn verlassen.
+ Die Nachricht muss das [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/)-Format verwenden.
+ Wenn \`message\` unten auf \`default\` gesetzt ist, wird die Vanilla-Beitritts-/Verlassensnachricht verwendet.
+ Wenn \`enabled\` unten auf \`false\` gesetzt ist, wird die Verbindungsnachricht deaktiviert, und ein anderes Plugin wird verwendet, um die Verbindungsnachricht zu senden.
+
+ Verfügbare Platzhalter:
+
+ - __\`\`__ - Spielername.
+ - __\`\`__ - Anzeigename des Spielers.
+
+
+
API / Plugin-Freundlich
+ Diese Funktion ist API- / Plugin-freundlich. Das bedeutet, dass der Inhalt der Verbindungsnachricht von Plugins überschrieben werden kann, die \`PlayerJoinEvent\` oder \`PlayerQuitEvent\` verwenden.
+
`,
+ join: {
+ enabled: {
+ default: true,
+ desc: "Ob eine Nachricht gesendet werden soll, wenn der Spieler beitritt."
+ },
+ message: {
+ default: "default",
+ desc: "Die Beitrittsnachricht des Spielers."
+ }
+ },
+ quit: {
+ enabled: {
+ default: true,
+ desc: "Ob eine Nachricht gesendet werden soll, wenn der Spieler den Server verlässt."
+ },
+ message: {
+ default: "default",
+ desc: "Die Verlassensnachricht des Spielers."
+ }
+ }
+ },
+ cache: {
+ "cache-player-profile-result": {
+ default: true,
+ desc: `Ob die Profildaten des Spielers (z. B. UUID, Benutzername, Skin-/Cape-Texturen) gecacht werden sollen, wenn sie dem Server beigetreten sind.
+ Dies kann Netzwerkanfragen an Mojangs Authentifizierungsserver reduzieren und ist auch nützlich, wenn der Authentifizierungsserver vorübergehend nicht verfügbar ist, und erlaubt es Spielern trotzdem, dem Server unter Verwendung gecachter Profildaten erneut beizutreten.`
+ },
+ "cache-player-profile-result-timeout": {
+ default: 1440,
+ desc: `Der Timeout des Spielerprofil-Caches.
+ (Einheit: Minute, Standardwert 1440 Minuten = 24 Stunden)
+ Wenn der angegebene Timeout überschritten wird, sendet der Server beim nächsten Beitritt des Spielers eine weitere Anfrage, um Spielerprofildaten von Mojangs Authentifizierungsserver abzurufen.`
+ }
+ }
+ }
+};
+
+export default config;
diff --git a/pages/de/docs/config/data/leaf-global-1-21-4.ts b/pages/de/docs/config/data/leaf-global-1-21-4.ts
new file mode 100644
index 0000000..8bacd31
--- /dev/null
+++ b/pages/de/docs/config/data/leaf-global-1-21-4.ts
@@ -0,0 +1,1226 @@
+import type { ConfigRoot } from "@/.vitepress/theme/components/config/types";
+
+const config: ConfigRoot = {
+ "config-version": {
+ default: "3.0"
+ },
+
+ async: {
+ __desc__:
+ "Dieser Abschnitt enthält asynchrone Funktionen, die dazu dienen, die Last auf dem Haupt-Thread (Server-Thread) zu verringern, indem Aufgaben asynchron verarbeitet werden.",
+ "parallel-world-ticking": {
+ enabled: {
+ default: false,
+ desc: `Ob verschiedene Welten parallel in separaten Threads verarbeitet werden sollen, was die Leistung auf Multi-Core-Systemen verbessern kann.
+
+ Parallel World Ticking, auch bekannt als "PWT", ist ein Konzept von [SparklyPaper](https://github.com/SparklyPower/SparklyPaper), bei dem jede Welt in ihrem eigenen dedizierten Thread getickt wird, um die Arbeitslast von einem einzelnen Thread für alle Welten aufzuteilen und zu reduzieren.
+ In dieser PWT-Implementierung wartet jede Welt, bis der letzte Welt-Tick abgeschlossen ist. Mehr dazu in der Erklärung von SparklyPaper: [PARALLEL_WORLD_TICKING.md](https://github.com/SparklyPower/SparklyPaper/blob/13aff425238ea322658de0d9f4f7bd906bd9f431/docs/PARALLEL_WORLD_TICKING.md).
+
+ Wann solltest du PWT in Betracht ziehen?
+
+ - Ich kann wirklich nicht zu [Folia](https://papermc.io/software/folia) oder dessen Forks wechseln.
+ - Ich habe einen Multi-Core-Server.
+ - Meine Spieler verteilen sich gleichmäßig auf jede Welt.
+ - (Oder ich habe viele Welten, z. B. einige RPG-Server)
+
+
+ __⚡Empfohlener Wert: \`true\` (Nur wenn spezifische Engpässe auftreten und die Risiken verstanden werden)__
+
+
Experimentell
+ Experimentelle Funktion, möglicherweise instabil und kann Kompatibilitätsprobleme mit einigen Plugins verursachen.
+
`
+ },
+ threads: {
+ default: 8,
+ desc: `Anzahl der Threads, die für das parallele World-Ticking reserviert sind.
+
+ __⚡Empfohlener Wert: gleich der Anzahl der Welten__`
+ },
+ "log-container-creation-stacktraces": {
+ default: false,
+ desc: `Ob Stacktraces protokolliert werden sollen, wenn Container (wie Tile Entities oder Entities) während des parallelen Tickings erstellt werden.
+ Dies ist nützlich für das Debuggen potenzieller Nebenläufigkeitsprobleme (Concurrency Issues).`
+ },
+ "disable-hard-throw": {
+ default: false,
+ desc: `Ob "Hard Throws" (die normalerweise den Server stoppen) im Zusammenhang mit Fehlern beim parallelen Ticking deaktiviert werden sollen.
+
+
Achtung
+ Dies kann zugrundeliegende Probleme maskieren, aber helfen, Abstürze während der Testphase der Serverentwicklung zu verhindern. Mit Vorsicht verwenden.
+
`
+ },
+ "async-unsafe-read-handling": {
+ default: "BUFFERED",
+ desc: `Ob asynchrone Aufgaben innerhalb des parallelen Ticking-Systems synchron ausgeführt werden sollen.
+ Dies könnte für die Kompatibilität mit bestimmten Plugins erforderlich sein, macht jedoch die Leistungsvorteile des parallelen Tickings weitgehend zunichte.
+
+ __⚡Empfohlener Wert: \`BUFFERED\`__`
+ }
+ },
+ "async-entity-tracker": {
+ enabled: {
+ default: false,
+ desc: `Ob das Entity-Tracking asynchron erfolgen soll.
+ Dies kann die Leistung erheblich verbessern, insbesondere in Situationen mit einer großen Anzahl von Entities in einem kleinen Bereich.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Achtung
+ Wenn du Plugins wie Citizens installiert hast, die echte Entities oder spielerartige Entities als "NPC" verwenden, lies bitte auch \`compat-mode\` unten für weitere Informationen.
+
`
+ },
+ "compat-mode": {
+ default: false,
+ desc: `Ob der Kompatibilitätsmodus für Plugins wie Citizens oder NPC-Plugins, die echte, spielerartige Entities verwenden, aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, kann das Sichtbarkeitsproblem behoben werden, bei dem spielerartige NPCs manchmal verschwinden.
+
+ Du solltest \`compat-mode\` aktivieren, um die asynchrone Entity-Tracker-Funktion zu nutzen, __NUR WENN__ du Citizens oder eine andere Art von Real-Entity-NPC-Plugins installiert hast.
+
+ Wir empfehlen jedoch weiterhin die Verwendung von paketbasierten / virtuellen Entity-NPC-Plugins, um eine bessere Leistung zu erzielen, z. B. [ZNPC Plus](https://github.com/Pyrbu/ZNPCsPlus), [Adyeshach](https://github.com/TabooLib/Adyeshach), [Fancy NPC](https://modrinth.com/plugin/fancynpcs) oder andere, dann kann \`compat-mode\` deaktiviert bleiben.`
+ },
+ "max-threads": {
+ default: 0,
+ desc: `Maximale Anzahl an Threads, die für die asynchrone Entity-Pfadfindung verwendet werden sollen.
+ Zum Beispiel:
+
+ - Wenn ein Wert ≤ \`0\` angegeben wird, wird automatisch die Anzahl der CPU-Kerne plus dem Wert als Anzahl der Threads verwendet, mit einem Minimum von 1.
+ - Wenn auf \`0\` gesetzt, werden automatisch 1/4 der CPU-Kerne verwendet, mindestens jedoch 1.
+
+ __⚡Empfohlener Wert: 1/3 der CPU-Kerne__`
+ },
+ keepalive: {
+ default: 60,
+ desc: `Die Keepalive-Zeit für Threads; Threads ohne Aufgaben werden beendet, wenn sie diese Zeit überschreiten.
+ (Einheit: Sekunde)`
+ },
+ "queue-size": {
+ default: 0,
+ desc: `Maximale Größe der Warteschlange für ausstehende Entity-Tracking-Aufgaben.
+ Wenn ein Wert ≤ \`0\` angegeben wird, wird die Warteschlangengröße dynamisch als \`max-threads * 384\` berechnet.`
+ }
+ },
+ "async-target-finding": {
+ enabled: {
+ default: false,
+ desc: `Ob die Zielsuche (Target Finding) von Entities asynchron erfolgen soll.
+
+ Die Zielsuchberechnungen von Mobs, zum Beispiel das Finden von Entities in der Nähe zum Angreifen oder Interagieren mit Blöcken in der Nähe, sind aufwändig, insbesondere wenn es eine große Anzahl von Mobs gibt oder viele Mob-Farmen existieren.
+ Dies kann die Leistung verbessern, indem die KI-bezogenen Berechnungen in einen anderen Thread verlagert werden, während die eigentliche Validierung im Haupt-Thread verbleibt.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "async-alert-other": {
+ default: true,
+ desc: `Ob das Alarmieren anderer Mobs durch Mobs asynchron erfolgen soll.
+ Dies hat nur Auswirkungen, wenn \`enabled\` oben \`true\` ist.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "async-search-block": {
+ default: true,
+ desc: `Ob die Suche von Mobs nach Block-Zielen asynchron erfolgen soll.
+ Dies hat nur Auswirkungen, wenn \`enabled\` oben \`true\` ist.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "async-search-entity": {
+ default: true,
+ desc: `Ob die Suche von Mobs nach Entity-Zielen asynchron erfolgen soll.
+ Dies hat nur Auswirkungen, wenn \`enabled\` oben \`true\` ist.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "queue-size": {
+ default: 0,
+ desc: `Maximale Größe der Warteschlange für ausstehende Entity-Zielsuchaufgaben.
+ Wenn ein Wert ≤ \`0\` angegeben wird, wird automatisch \`4096\` verwendet.`
+ }
+ },
+ "async-playerdata-save": {
+ enabled: {
+ default: false,
+ desc: "Ob das Speichern von Spielerdaten asynchron erfolgen soll. (I/O-Operationen sind aufwändig)"
+ // TODO
+ //
+ //
Experimentell
+ // Experimentelle Funktion, kann unter Umständen zu Datenverlust oder Dateninkonsistenz führen!
+ //
`
+ }
+ },
+ "async-pathfinding": {
+ enabled: {
+ default: false,
+ desc: `Ob die Berechnung der Mob-Pfadfindung asynchron erfolgen soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "max-threads": {
+ default: 0,
+ desc: `Maximale Anzahl an Threads, die für die asynchrone Entity-Pfadfindung verwendet werden sollen.
+ Wenn ein Wert ≤ \`0\` angegeben wird, werden automatisch 1/4 der CPU-Kerne verwendet, mindestens jedoch 1.
+
+ __⚡Empfohlener Wert: 1/3 der CPU-Kerne__`
+ },
+ keepalive: {
+ default: 60,
+ desc: `Die Keepalive-Zeit für Threads; Threads ohne Aufgaben werden beendet, wenn sie diese Zeit überschreiten.
+ (Einheit: Sekunde)`
+ },
+ "queue-size": {
+ default: 0,
+ desc: `Maximale Größe der Warteschlange für ausstehende Entity-Tracking-Aufgaben.
+ Wenn ein Wert ≤ \`0\` angegeben wird, wird die Warteschlangengröße dynamisch als \`max-threads * 256\` berechnet.`
+ },
+ "reject-policy": {
+ default: "CALLER_RUNS",
+ desc: `Die Richtlinie, die verwendet werden soll, wenn die Warteschlange für Pfadfindungsaufgaben voll ist und eine neue Aufgabe eingereicht wird.
+
+ - \`FLUSH_ALL\`: Alle ausstehenden Aufgaben in der Warteschlange werden sofort im Server-Thread ausgeführt.
+ - \`CALLER_RUNS\`: Die eingehende eingereichte Aufgabe wird im Server-Thread ausgeführt.
+ - \`DISCARD\`: Die eingehende eingereichte Aufgabe wird verworfen.
+
+
+ __⚡Empfohlener Wert: \`CALLER_RUNS\`__`
+ }
+ },
+ "async-mob-spawning": {
+ enabled: {
+ default: true,
+ desc: `Ob Mob-Spawning asynchron erfolgen soll.
+
+ Auf Servern mit vielen Entities kann dies die Leistung um bis zu ~15% verbessern. Damit dies funktioniert, muss in der Paper-Config \`per-player-mob-spawns\` auf \`true\` gesetzt sein.
+ Eine kurze Anmerkung: Dies spawnt Mobs nicht tatsächlich asynchron (das wäre sehr unsicher). Es lagert lediglich einige teure Berechnungen aus, die für das Mob-Spawning erforderlich sind.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "async-locator": {
+ enabled: {
+ default: false,
+ desc: `Ob das Finden von Strukturen (Locator) asynchron erfolgen soll.
+ Dies lagert die Struktursuche in andere Threads aus.
+ Derzeit verfügbar für:
+
+ - \`/locate\` Befehl
+ - Delfin-Schatzsuche
+ - Enderauge-Festungssuche (Stronghold)
+
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ threads: {
+ default: 0,
+ desc: `Maximale Anzahl an Threads, die für den asynchronen Locator verwendet werden sollen.
+ Wenn ein Wert ≤ \`0\` angegeben wird, wird automatisch 1 Thread verwendet.
+
+ __⚡Empfohlener Wert: \`1\` oder \`2\`__`
+ },
+ keepalive: {
+ default: 60,
+ desc: `Die Keepalive-Zeit für Threads; Threads ohne Aufgaben werden beendet, wenn sie diese Zeit überschreiten.
+ (Einheit: Sekunde)`
+ }
+ },
+ "async-chunk-send": {
+ enabled: {
+ default: false,
+ desc: `Ob das Packen und Senden von Chunk-Paketen asynchron erfolgen soll.
+ Dies kann die Last auf dem Haupt-Thread erheblich reduzieren, insbesondere wenn viele Spieler gleichzeitig Chunks laden (z. B. beim Beitreten, Teleportieren oder schnellen Fliegen).
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ }
+ },
+
+ performance: {
+ __desc__:
+ "Dieser Abschnitt enthält Leistungsoptimierungen, die darauf abzielen, unnötige Berechnungen zu reduzieren oder effizientere Methoden zur Optimierung des Servers zu verwenden.",
+ "use-virtual-thread-for-user-authenticator": {
+ default: true,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den User Authenticator Service verwendet werden soll, der die Premium-Spieler-Beitrittsverifizierung handhabt.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "use-virtual-thread-for-profile-executor": {
+ default: false,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den Profile Executor verwendet werden soll, der das Abrufen von Spielerprofilen und Schädel-Skins handhabt.
+
+ __⚡Empfohlener Wert: \`false\`__`
+ },
+ "use-virtual-thread-for-async-chat-executor": {
+ default: true,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den Async Chat Executor verwendet werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "use-virtual-thread-for-async-scheduler": {
+ default: false,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den CraftAsyncScheduler verwendet werden soll, was die Leistung von Plugins verbessern könnte, die den asynchronen Scheduler von Bukkit stark nutzen.
+
+ __⚡Empfohlener Wert: \`true\` (Nur wenn alle Plugins Virtual Threads unterstützen)__`
+ },
+ "create-snapshot-on-retrieving-blockstate": {
+ default: true,
+ desc: `Ob standardmäßig ein Snapshot (Kopie) der TileEntity- / BlockState-Daten erstellt werden soll, wenn Plugins diese abrufen.
+
+ Einige Plugins rufen möglicherweise \`getInventory().getHolder()\` auf, um den Halter eines Inventars zu erhalten, was den Zugriff auf den BlockState beinhaltet.
+ Wenn es beispielsweise viele Trichter gibt und Plugins diese Methode beim Abhören einiger Events (z. B. Hopper-bezogene Events, häufige Aufrufe) aufrufen, ist das Neuerstellen des BlockStates und das Parsen von Item-Stacks bei massiven und häufigen Aufrufen sehr aufwändig.
+ Siehe Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) für weitere Informationen.
+
+ - Wenn auf \`true\` gesetzt, wird immer ein Snapshot (Kopie) des BlockState erstellt, wenn das Plugin entsprechende Methoden aufruft.
+ - Wenn auf \`false\` gesetzt, wird der echte BlockState direkt abgerufen, es sei denn, das Plugin fordert explizit einen Snapshot an. Die Leistung verbessert sich, aber es besteht das Risiko, dass der Blockstatus aufgrund schlechten Plugin-Designs modifiziert wird.
+
+
+ __⚡Empfohlener Wert: \`false\` (Nur wenn du spezifische Lags wie oben beschrieben feststellst)__`
+ },
+ "throttle-mob-spawning": {
+ enabled: {
+ default: false,
+ desc: `Ob Mob-Spawning in Chunks übersprungen werden soll, die wiederholt beim Spawnen von Mobs über den konfigurierten \`min-failed\`-Wert hinaus fehlgeschlagen sind.
+ Sobald die Mindestanzahl fehlgeschlagener Spawn-Versuche erreicht ist, wird der Server zufällig zwischen 1 ~ \`spawn-chance\`% der Spawn-Versuche in diesem Chunk überspringen.
+ Fehlgeschlagene Spawn-Versuche werden nicht gezählt, wenn Spawn-Limits erreicht sind, und der Fehlerzähler wird nach einem erfolgreichen Spawn zurückgesetzt.`
+ },
+ monster: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für feindliche Monster."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für feindliche Monster nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ creature: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für passive Kreaturen (Tiere)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für passive Kreaturen (Tiere) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für ambiente Mobs (Fledermäuse)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für ambiente Mobs (Fledermäuse) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ axolotls: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für Axolotl."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für Axolotl nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ underground_water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für Unterwasser-Kreaturen (Leuchttintenfisch)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für Unterwasser-Kreaturen (Leuchttintenfisch) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für Wasserkreaturen (Tintenfisch, Delfine)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für Wasserkreaturen (Tintenfisch, Delfine) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ water_ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für ambiente Wassermobs (Tropenfische)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für ambiente Wassermobs (Tropenfische) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ misc: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für sonstige Entities."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für sonstige Entities nach Erreichen des `min-failed`-Wertes oben."
+ }
+ }
+ },
+ "inactive-goal-selector-throttle": {
+ default: true,
+ desc: `Ob die [goal selector](https://maven.fabricmc.net/docs/yarn-1.21.4+build.8/net/minecraft/entity/ai/goal/GoalSelector.html)-Berechnungen für Entities gedrosselt werden sollen, die inaktiv sind (typischerweise weit weg von Spielern).
+ Anstatt den Goal Selector jeden Tick zu ticken, tickt er weniger häufig jede Sekunde. Dies kann die Leistung leicht verbessern, hat aber geringfügige Auswirkungen auf das Gameplay.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "throttle-hopper-when-full": {
+ enabled: {
+ default: false,
+ desc: `Ob Versuche von Trichtern (Hopper), Items zu übertragen, gedrosselt werden sollen, wenn der Zielcontainer voll ist.
+ Verhindert, dass der Trichter jeden Tick versucht, Items zu verschieben, selbst wenn dies immer wieder fehlschlägt.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "skip-ticks": {
+ default: 8,
+ desc: `Wie viele Ticks ein Trichter warten soll, bevor er erneut versucht, Items zu verschieben, wenn der Zielcontainer voll ist.
+ (Einheit: Tick)
+ Nur aktiv, wenn \`throttle-hopper-when-full.enabled\` oben \`true\` ist.
+ Wenn ein Wert ≤ \`0\` angegeben wird, ist diese Drosselungsfunktion deaktiviert.
+
+ __⚡Empfohlener Wert: \`8\`__
+
+ | Werte für Ziele | |
+ | Optimierung | 8 |
+ | Vanilla-Verhalten | 8 |
+
`
+ }
+ },
+ "skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer": {
+ default: true,
+ desc: `Ob die Aktualisierung von Karten-Item-Daten übersprungen werden soll, wenn die Karte keinen Renderer (\`CraftMapRenderer\`) hat.
+ Dies kann die Leistung verbessern, wenn Plugins wie ImageMap verwendet werden, die viele benutzerdefinierte Karten erstellen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
+
+
Achtung
+ Dies kann dazu führen, dass Vanilla-Karten-Item-Daten nicht mehr aktualisiert werden.
+
`
+ },
+ "skip-ai-for-non-aware-mob": {
+ default: true,
+ desc: `Ob AI-Ticks für Mobs, die sowohl *inaktiv* als auch *unaware* (nicht aufmerksam) sind, komplett übersprungen werden sollen.
+ Nicht aufmerksame Mobs, die auf diese Weise optimiert wurden, führen keine eigenständigen Aktionen aus oder reagieren nicht, bis sie wieder aktiv werden, siehe [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.4/org/bukkit/entity/Mob.html#setAware(boolean)) für weitere Informationen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "reduce-packets": {
+ __desc__: "Dieser Abschnitt ist für Funktionen zur Reduzierung nutzloser Pakete.",
+ "reduce-entity-move-packets": {
+ default: false,
+ desc: `Ob nutzlose Entity-Bewegungspakete, die an Spieler gesendet werden (z. B. kleine Bewegungen), reduziert werden sollen.
+ Dies kann Bandbreite sparen und die clientseitige Verarbeitungslast verringern, was Bewegungen bei hoher Entity-Anzahl oder leichten Lags möglicherweise flüssiger erscheinen lässt.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "optimized-powered-rails": {
+ default: false,
+ desc: `Ob optimierte Antriebsschienen (Powered Rails) verwendet werden sollen. Nutzt eine komplett neu geschriebene Version der Iterationslogik für Antriebsschienen, die das Vanilla-Verhalten beibehält und eine 4x schnellere Leistung erreichen kann.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "optimise-random-tick": {
+ default: false,
+ desc: `Ob das neu geschriebene Random-Ticking-System verwendet werden soll.
+
+ Dieses neu geschriebene System nutzt gewichtete Statistiken und Stichproben, um tickbare Blöcke in aktiven Chunks auszuwählen. Es kann die unnötigen Kosten reduzieren, die durch das häufige Auswählen nicht-tickbarer Positionen in der Vanilla-Random-Ticking-Logik entstehen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ "optimize-player-movement": {
+ default: true,
+ desc: `Ob unnötige Blockkanten-Checks bei der Spielerbewegung übersprungen und redundante Aktualisierungen der Sichtweite vermieden werden sollen.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "only-tick-items-in-hand": {
+ default: false,
+ desc: `Ob Items nur getickt oder aktualisiert werden sollen, wenn der Spieler sie in der Haupt- oder Nebenhand hält, anstatt das gesamte Inventar zu ticken.
+ Dies betrifft derzeit nur Kompass- und Karten-Items.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "optimize-block-entities": {
+ default: true,
+ desc: `Ob die effizientere Map-Datenstruktur für den Block-Entity-Ticker-Speicher verwendet werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "cache-biome": {
+ enabled: {
+ default: false,
+ desc: `Ob die Biom-Daten der Blockposition gecacht werden sollen, anstatt das Biom bei jeder Suche neu zu berechnen.
+
+ __⚡Empfohlener Wert: \`true\` (Erfordert auch das Aktivieren der Optionen unten)__`
+ },
+ "mob-spawning": {
+ default: false,
+ desc: `Ob das Biom in der Mob-Spawning-Logik gecacht werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ advancements: {
+ default: false,
+ desc: `Ob das Biom in der Berechnungslogik für Spieler-Fortschritte (Advancements) gecacht werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "faster-structure-gen-future-sequencing": {
+ default: true,
+ desc: `Ob eine schnellere Aufgaben-Sequenzierung für die Generierung von Strukturen verwendet werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Achtung
+ Dies kann in seltenen Grenzfällen zu einer inkonsistenten Reihenfolge zukünftiger Compose-Tasks führen, was unterschiedliche Ergebnisse bei der Strukturgenerierung zur Folge haben kann.
+
`
+ },
+ "faster-random-generator": {
+ enabled: {
+ default: false,
+ desc: `Ob der schnellere Zufallsgenerator (Random Generator), der in JDK 17 eingeführt wurde, verwendet werden soll.
+ Zufall wird fast überall in Minecraft verwendet; dies zu aktivieren kann eine ordentliche Leistungsverbesserung bringen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Achtung
+ Dies erfordert eine JVM, die \`RandomGenerator\` unterstützt. Einige JREs unterstützen dies nicht.
+
`
+ },
+ "random-generator": {
+ default: "Xoroshiro128PlusPlus",
+ desc: `Der spezifische Algorithmus des Zufallsgenerators, der verwendet werden soll.
+ Verfügbare Zufallsgeneratoren findest du unter [Random Number Generators in Java](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1) oder [JEP 356](https://openjdk.org/jeps/356).
+
+ __⚡Empfohlener Wert: \`Xoroshiro128PlusPlus\`__`
+ },
+ "enable-for-worldgen": {
+ default: false,
+ desc: `Ob der schnellere Zufallsgenerator für die Weltgenerierung verwendet werden soll.
+
+ - Wenn auf \`true\` gesetzt, verwenden \`Random\`-Aufrufe, die an der Weltgenerierung beteiligt sind, den schnelleren Zufallsgenerator, den du oben in \`random-generator\` gewählt hast. Die Weltgenerierung wird sich leicht von Vanilla unterscheiden.
+ - Wenn auf \`false\` gesetzt, verwenden \`Random\`-Aufrufe bei der Weltgenerierung den alten Zufallsgenerator von Vanilla.
+
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "warn-for-slime-chunk": {
+ default: true,
+ desc: "Ob der Server beim Start eine Warnmeldung ausgibt, wenn der schnellere Zufallsgenerator für die Slime-Chunk-Generierung aktiviert ist."
+ },
+ "use-legacy-random-for-slime-chunk": {
+ default: false,
+ desc: `Ob die alte Zufallsquelle (\`java.util.Random\`) für die Slime-Chunk-Generierung verwendet werden soll, um dem Vanilla-Verhalten zu folgen.
+ Wenn dein Server bestehende Slime-Farmen oder ähnliche Einrichtungen hat, die Slime-Chunks benötigen, aktiviere dies; andernfalls wird die Position der Slime-Chunks verschoben sein.
+
+ __⚡Empfohlener Wert: (Hängt von deinem Servertyp ab, siehe \`Werte für Ziele\` unten für mehr)__
+
+ | Werte für Ziele | |
+ | Optimierung | false |
+ | Vanilla-Verhalten | true |
+
`
+ },
+ "use-direct-implementation": {
+ default: false,
+ desc: `Ob eine direkte Random-Implementierung (LCG ohne Synchronisation) verwendet werden soll, anstatt an Javas RandomGenerator zu delegieren.
+ Dies kann die Leistung verbessern, ändert aber möglicherweise das RNG-Verhalten.
+
+ __⚡Empfohlener Wert: \`false\`__`
+ }
+ },
+ "cache-eye-fluid-status": {
+ default: false,
+ desc: `Ob die \`Entity#isEyeInFluid\`-Methode gecacht werden soll, um die Leistung zu verbessern und die Speichernutzung zu reduzieren.
+
+ __⚡Empfohlener Wert: \`false\`__`
+ },
+ "enable-cached-minecraft-to-bukkit-entitytype-convert": {
+ default: true,
+ desc: `Ob das Ergebnis der Umwandlung von *Minecraft EntityType* zu *Bukkit EntityType* zwischengespeichert (gecached) werden soll. Diese Umwandlung kann etwas aufwändig sein, insbesondere in der Spawning-Logik, daher kann das Caching die Leistung leicht verbessern.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ dab: {
+ __desc__:
+ "Dynamic Activation of Brain, auch bekannt als DAB, optimiert das 'Gehirn' (Brain) von Entities, indem die Frequenz ihres Brain-Tickings verringert wird, wenn sie weit von Spielern entfernt sind. Dies ist ein lohnender Kompromiss zur Leistungsverbesserung, wenn viele Entities vorhanden sind.",
+ enabled: {
+ default: true,
+ desc: `Ob DAB aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false (oder siehe dab.blacklisted-entities unten für mehr) |
+
`
+ },
+ "dont-enable-if-in-water": {
+ default: false,
+ desc: `Ob nicht-aquatische Entities im Wasser von DAB ausgeschlossen werden sollen. Dies kann [Pufferfish#58](https://github.com/pufferfish-gg/Pufferfish/issues/58) beheben.
+ Wenn auf \`true\` gesetzt, könnte dies verhindern, dass Entities im Wasser ersticken, wenn sie weit vom Spieler entfernt sind.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "start-distance": {
+ default: 12,
+ desc: `Die Distanz bestimmt, wie weit ein Entity vom Spieler entfernt sein muss, um von DAB beeinflusst zu werden.
+ (Einheit: Block)
+
+ __⚡Empfohlener Wert: \`8\`__`
+ },
+ "max-tick-freq": {
+ default: 20,
+ desc: `Die maximale Tick-Zeit definiert, wie oft das am weitesten entfernte Entity seine Pathfinder und Verhaltensweisen getickt bekommt.
+ (Einheit: Tick, Standardwert 20 Ticks = 1s)`
+ },
+ "activation-dist-mod": {
+ default: 8,
+ desc: `Die Tick-Frequenz, die definiert, wie stark die Distanz die Tick-Frequenz eines Entities beeinflusst. \`freq = (distanceToPlayer^2) / (2^value)\`.
+
+ - Wenn du möchtest, dass weiter entfernte Entities __weniger__ oft ticken, verwende \`7\`.
+ - Wenn du möchtest, dass weiter entfernte Entities __öfter__ ticken, versuche \`9\`.
+
+
+ __⚡Empfohlener Wert: \`7\`__`
+ },
+ "blacklisted-entities": {
+ default: "[]",
+ desc: `Eine Liste von Entities, die nicht von DAB betroffen sein sollen.
+
+ Einige Survival-Server haben Mob-Farmen, die darauf angewiesen sind, dass Mobs ein Ziel haben. Diese Art von "Pfadfindungs"-Mob-Farm kann durch DAB beeinträchtigt werden. Diese Situation kann gelöst werden, indem spezifische Mobs der Mob-Farm zu dieser DAB-Blacklist hinzugefügt werden.
+ Wenn bestimmte Mob-Farmen auf deinem Server defekt sind, Mobs einfrieren und sich nicht bewegen, und du nicht sicher bist, ob dies durch DAB verursacht wird, kannst du versuchen, sie zu dieser Liste hinzuzufügen, um zu sehen, ob das Problem dadurch behoben wird.
+
+ Format: \`[villager]\` oder \`[villager, zombified_piglin]\` (Du findest alle Entity-Typen in [Paper's Javadoc](https://jd.papermc.io/paper/1.21.4/org/bukkit/entity/EntityType.html)).
+
+ [💡 Du möchtest tiefer eintauchen?](guides/dab-blacklist-format)`
+ }
+ },
+ "dont-save-entity": {
+ "dont-save-primed-tnt": {
+ default: false,
+ desc: `Ob das Speichern von gezündetem TNT beim Entladen von Chunks deaktiviert werden soll.
+ Dies kann verhindern, dass Maschinen oder Redstone-Bauten durch TNT explodieren, wenn der Spieler versehentlich die Verbindung trennt oder der Chunk entladen wird, während der Spieler weit weg ist. Nützlich für Redstone-/Technik-/Survival-Server, die Maschinen mit TNT verwenden.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "dont-save-falling-block": {
+ default: false,
+ desc: `Ob das Speichern von fallenden Blöcken beim Entladen von Chunks deaktiviert werden soll.
+ Dies kann potenzielle Probleme mit verbuggten oder duplizierten fallenden Blöcken (Sand, Kies usw.) nach Server-Neustarts oder Chunk-Laden verhindern, insbesondere wenn diese durch Lags verursacht wurden.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "count-all-chunks-for-ticking": {
+ default: false,
+ desc: `Ob der zusätzliche Check übersprungen werden soll, der prüft, ob Ticking-Chunks während des Mob-Spawnings in der Nähe des Spielers sind.
+
+ Die Kosten für diesen Check können hoch sein, wenn es eine große Anzahl von Spielern und geladenen Chunks gibt. Es ist besser, diesen Check zu überspringen, da Ticking-Chunks meistens sowieso in der Nähe oder um Spieler herum sind. Es ist auch zu erwarten, dass das Mob-Spawning in einigen Randbedingungen leicht zunimmt.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "check-survival-before-growth": {
+ "cactus-check-survival": {
+ default: false,
+ desc: `Ob überprüft werden soll, ob der Kaktus überleben kann, bevor versucht wird, ihn wachsen zu lassen.
+ Dies kann die Leistung verbessern, wenn riesige Kaktusfarmen auf dem Server existieren.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ }
+ },
+
+ fixes: {
+ __desc__: "Dieser Abschnitt enthält Bugfixes für spezifische Probleme.",
+ "dont-place-player-if-server-full": {
+ default: false,
+ desc: `Ob Spielern der Beitritt verweigert werden soll, wenn der Server voll ist (definiert als \`max-players\` in \`server.properties\`).
+ Diese Option behebt [Paper#10668](https://github.com/PaperMC/Paper/issues/10668).
+
+ Wenn auf \`true\` gesetzt, solltest du Spielern die Berechtigung \`purpur.joinfullserver\` geben, anstatt die \`PlayerLoginEvent#allow\` API zu verwenden, um Spielern das Umgehen des Limits zu erlauben.`
+ }
+ },
+
+ "gameplay-mechanisms": {
+ __desc__: "Dieser Abschnitt enthält Funktionen, die die Spielmechanik modifizieren oder verbessern.",
+ "use-spigot-item-merging-mechanism": {
+ default: true,
+ desc: `Ob fallen gelassene Items basierend auf ihrer Tick-Reihenfolge zusammengeführt (gemerged) werden sollen, was das langjährige Standardverhalten von Spigot ist.
+
+ In Spigot wird das Item-Entity, das später tickt, in das früher tickende zusammengeführt. Wenn der Merge-Radius relativ größer ist, kann dies verhindern, dass fallen gelassene Items an unerwarteten Orten stecken bleiben. Dies ist nützlich für Farmen oder Redstone-Bauten, die zahlreiche fallen gelassene Items erzeugen können.
+ In Vanilla basiert das Zusammenführen von Items jedoch auf der Item-Anzahl des Stacks. Der Stack mit der kleineren Anzahl wird mit dem mit der größeren Anzahl zusammengeführt.
+
+ | Werte für Ziele | |
+ | SMP-freundlich | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "spawner-settings": {
+ enabled: {
+ default: false,
+ desc: "Ob die benutzerdefinierten Spawner-Optionen unten verwendet werden sollen. Die Optionen unten betreffen nur das Spawnen von Spawner-Blöcken statt des natürlichen Spawnens."
+ },
+ checks: {
+ "light-level-check": {
+ default: false,
+ desc: `Ob überprüft werden soll, ob das Lichtlevel ausreicht, um den Mob zu spawnen.
+
+ - Wenn auf \`true\` gesetzt, versucht der Spawner, Mobs unter Verwendung derselben Lichtlevel-Bedingungen zu spawnen, die für natürliches Mob-Spawning verwendet werden.
+ - Wenn auf \`false\` gesetzt, folgt der Spawner dem Vanilla-Verhalten, das versucht zu spawnen, ohne das Lichtlevel zu prüfen.
+
`
+ },
+ "spawner-max-nearby-check": {
+ default: true,
+ desc: `Ob überprüft werden soll, ob die maximale Anzahl an Mobs in der Nähe erreicht ist, um den Mob zu spawnen. Der Spawner hört auf, neue Mobs zu spawnen, um Überfüllung zu vermeiden.
+
+ - Wenn auf \`true\` gesetzt, folgt der Spawner dem Vanilla-Verhalten, das das Spawnen neuer Mobs verhindert, wenn die Anzahl der Mobs in der Nähe das Limit überschreitet.
+ - Wenn auf \`false\` gesetzt, versucht der Spawner immer zu spawnen, ohne die Anzahl der Mobs in der Nähe zu prüfen.
+
`
+ },
+ "check-for-nearby-players": {
+ default: true,
+ desc: `Ob überprüft werden soll, ob sich Spieler in einem Radius befinden, um den Mob zu spawnen.
+
+ - Wenn auf \`true\` gesetzt, versucht der Spawner immer, Mobs zu spawnen, ohne zu prüfen, ob ein Spieler in der Nähe ist.
+ - Wenn auf \`false\` gesetzt, versucht der Spawner nur dann Mobs zu spawnen, wenn ein Spieler im Radius ist.
+
`
+ },
+ "spawner-block-checks": {
+ default: false,
+ desc: "Ob Spawn-Versuche verhindert werden sollen, wenn der Spawn-Punkt durch Blöcke blockiert ist."
+ },
+ "water-prevent-spawn-check": {
+ default: false,
+ desc: "Ob Spawn-Versuche verhindert werden sollen, wenn der Spawn-Punkt Wasser enthält."
+ },
+ "ignore-spawn-rules": {
+ default: false,
+ desc: `Ob zusätzliche Spawn-Regeln von Mobs ignoriert werden sollen.
+
+ Viele Mobs haben Spawn-Beschränkungen, dass sie nur auf bestimmten Blöcken spawnen oder nicht spawnen können. Zum Beispiel können die meisten Tiere nur auf Grasblöcken spawnen, oder der Hoglin kann nicht auf Netherwarzen-Blöcken spawnen. Du findest die Liste zusätzlicher Spawn-Regeln unter [Additional Rules](https://minecraft.wiki/w/Mob_spawning#:~:text=additional%20rules).
+
+ Diese Option beeinflusst nicht die obigen Optionen \`spawner-block-checks\` und \`water-prevent-spawn-check\` und ist von diesen getrennt.`
+ }
+ },
+ "min-spawn-delay": {
+ default: 200,
+ desc: `Die minimale Verzögerung zwischen jedem Spawn-Versuch des Spawners. Höhere Werte verlangsamen die Spawning-Geschwindigkeit von Spawnern.
+ (Einheit: Tick)`
+ },
+ "max-spawn-delay": {
+ default: 800,
+ desc: `Die maximale Verzögerung zwischen jedem Spawn-Versuch des Spawners. Höhere Werte verlangsamen die Spawning-Geschwindigkeit von Spawnern.
+ (Einheit: Tick)`
+ }
+ },
+ "only-player-pushable": {
+ default: false,
+ desc: `Ob nur der Spieler verschiebbar (pushable) sein soll.
+ Wenn auf \`true\` gesetzt, überschreibt diese Option Werte verwandter Kollisionsoptionen in Papers globaler und Welt-Konfiguration, und Mobs werden nicht durch den Effekt der [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) Gamerule getötet.
+
+
Achtung
+ Dies kann Mob-Farmen zerstören, die Mob-Kollision nutzen, um Mobs fallen zu lassen oder Mobs zu töten, indem der Wert der [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) Gamerule überschritten wird.
+
`
+ },
+ knockback: {
+ __desc__: "Dieser Abschnitt enthält Optionen zum Anpassen des Rückstoßverhaltens (Knockback).",
+ "snowball-knockback-players": {
+ default: false,
+ desc: "Ob Schneebälle Spieler zurückstoßen können."
+ },
+ "egg-knockback-players": {
+ default: false,
+ desc: "Ob Eier Spieler zurückstoßen können."
+ },
+ "can-player-knockback-zombie": {
+ default: true,
+ desc: "Ob der Spieler Zombies mit der Hand, Waffe, Projektilen usw. zurückstoßen kann."
+ },
+ "flush-location-while-knockback-player": {
+ default: false,
+ desc: `Ob Bewegungsänderungen sofort an den Client gesendet werden sollen, sobald der Zielspieler getroffen wird und Rückstoß erhält. Dies kann ein flüssigeres PVP-Spielerlebnis mit schnelleren Rückstoß-Reaktionen bieten. In Vanilla geschieht das Senden des Pakets stattdessen am Ende des Ticks, was das PVP-Spielerlebnis beeinträchtigen kann.
+
+ __⚡Empfohlener Wert: \`true\` (Für PVP-Server)__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ "old-blast-protection-explosion-knockback": {
+ default: false,
+ desc: `Ob das alte Explosions-Rückstoßverhalten (<= 1.20.4) verwendet werden soll, das für Rüstungen mit Explosionsschutz-Verzauberung gilt.
+
+ - Wenn auf \`true\` gesetzt, wird der Explosions-Rückstoß basierend auf der Explosionsschutz-Verzauberung des Spielers berechnet. Der Rückstoß ist etwas größer als nach der Version 1.20.4.
+ - Wenn auf \`false\` gesetzt, folgt der Explosions-Rückstoß dem Vanilla-Verhalten der aktuellen Version.
+
`
+ }
+ },
+ "hide-item-component": {
+ "hidden-types": {
+ default: "[]",
+ desc: `Die Liste der Komponenten-Typschlüssel, die vor dem Client verborgen werden sollen.
+
+ Siehe [List of components](https://minecraft.wiki/w/Data_component_format#List_of_components) um die vollständige Liste der verfügbaren Komponenten-Typschlüssel für Items zu erhalten.
+ Zum Beispiel:
+
+ - Wenn der Wert \`[]\` angegeben wird, ist kein Item betroffen.
+ - Wenn der Wert \`[\"minecraft:custom_data\"]\`, wird die \`custom_data\`-Komponente des Items auf dem Client des Spielers verborgen.
+
`
+ },
+ enabled: {
+ default: false,
+ desc: `Ob spezifizierte Komponenten-Informationen aus dem Inventar des Spielers, das an Clients gesendet wird, verborgen werden sollen. Siehe auch \`hidden-types\` oben.
+
+ Es kann verwendet werden, um komplexe Komponentendaten eines Items zu verbergen, um die Rendering-Last, häufige Animationen auf der Client-Seite und die Netzwerknutzung zu reduzieren. Die tatsächlichen Item-Daten sind nicht betroffen.
+
+ Es sei darauf hingewiesen, dass sich diese Option von Papers [Item-Obfuskation](https://docs.papermc.io/paper/reference/global-configuration/#anticheat_obfuscation_items_enable_item_obfuscation) unterscheidet. Diese Option verbirgt nur Item-Komponentendaten aus dem eigenen Inventar des Spielers, anstatt Daten zu verbergen, die an andere gesendet werden.
+
+
Achtung
+ Dies kann Resource Packs, Client-Mods oder spezifische Spielmechaniken beschädigen, die auf diesen clientseitigen Komponentendaten von Items basieren. Mit Vorsicht verwenden. Du musst wissen, welche Komponenten du verbirgst!
+
`
+ }
+ },
+ "death-item-drop-knockback": {
+ "drop-around": {
+ default: true,
+ desc: `Ob Items beim Tod zufällig um den Spieler herum fallen gelassen werden sollen.
+
+ - Wenn auf \`true\` gesetzt, werden Items mit einer zufälligen Bewegung fallen gelassen und um den toten Spieler verstreut.
+ - Wenn auf \`false\` gesetzt, werden Items unter dem toten Spieler fallen gelassen.
+
`
+ },
+ "horizontal-force": {
+ default: 0.5,
+ desc: "Basisgeschwindigkeit der horizontalen Kraft, die auf die fallen gelassenen Items des Spielers beim Tod wirkt."
+ },
+ "vertical-force": {
+ default: 0.2,
+ desc: "Dasselbe wie \`horizontal-force\`, aber für die vertikale Geschwindigkeit."
+ }
+ },
+ "allow-tripwire-dupe": {
+ default: false,
+ desc: "Ob der Tripwire-Dupe ([MC-59471](https://bugs.mojang.com/browse/MC/issues/MC-59471)), der in den 1.21.2-Snapshots 24w33a und 24w36a behoben wurde, zurückgebracht werden soll. Er ist auch als String-Dupe bekannt."
+ },
+ player: {
+ "max-use-item-distance": {
+ default: 1.0000001,
+ desc: `Die maximale Distanz, über die der Spieler ein Item benutzen darf.
+ (Einheit: Block)
+
+ Einige [Anarchy-Server](https://minecraftservers.org/type/anarchy) oder ähnliche Servertypen erlauben Spielern möglicherweise die Nutzung von Hacks/Cheats. Wenn du möchtest, dass Spieler Crystal-bezogene Module nutzen können, die paketbasiert sind (z. B. CEV Breaker, BedAura), musst du diesen Wert möglicherweise anpassen.
+ Es ist besser, den Wert auf \`10.0000001\` zu setzen, um die Nutzung entsprechender Hack-Module zu erlauben.
+
+ Wenn \`-1\` angegeben wird, wird die Prüfung der maximal erlaubten Distanz zur Item-Nutzung deaktiviert.
+
+ __⚡Empfohlener Wert: \`10.0000001\` (Nur für Anarchy-Server)__
+
+
Achtung
+ Wenn auf \`-1\` oder einen großen positiven Wert gesetzt, können Spieler einige Paket-Module von Hack-Clients nutzen und sind auch in der Lage, den [Nocom Exploit](https://github.com/nerdsinspace/nocom-explanation) zu nutzen! Das Anpassen dieser Option erfordert eine sorgfältige Abwägung möglicher Exploits.
+
`
+ }
+ },
+ "inventory-overflow-event": {
+ enabled: {
+ default: false,
+ desc: `Ob das Inventar-Überlauf-Event (Inventory Overflow Event) aktiviert werden soll. Das Event wird aufgerufen, wenn ein Plugin \`Inventory#addItem\` verwendet, um Items zum Inventar des Spielers hinzuzufügen, und das Zielinventar voll ist.
+
+
Achtung
+ Dies ist keine saubere Lösung! Bitte überarbeite deine Plugin-Logik, um die zurückgegebene Map der \`Inventory#addItem\`-Methode so schnell wie möglich zu verwenden!
+
`
+ },
+ "listener-class": {
+ default: "com.example.package.PlayerInventoryOverflowEvent",
+ desc: "Der vollständige Name der Listener-Klasse, die auf dieses Inventar-Überlauf-Event hört. Setze dies auf deine eigene Listener-Klasse, um dieses Event zu nutzen."
+ }
+ },
+ "afk-command": {
+ enabled: {
+ default: false,
+ desc: `Ob der AFK-Befehl basierend auf Minecrafts eingebautem [Idle-Timeout-Mechanismus](https://minecraft.wiki/w/Server.properties#:~:text=player%20have%20to%20idle) aktiviert werden soll. Spieler können den Befehl /afk verwenden, um ihren AFK-Modus umzuschalten, und ihr AFK-Status kann in der Tab-Liste angezeigt werden.
+
+ Setze auch \`kick-if-idle\` in der Purpur-Config auf \`false\`, um zu verhindern, dass Spieler gekickt werden, wenn sie in den AFK-Modus wechseln. Die restlichen AFK-Einstellungen, konfigurierbare AFK-Nachrichten und Titel-Nachrichten befinden sich in der Purpur-Config.`
+ }
+ }
+ },
+
+ network: {
+ __desc__: "Dieser Abschnitt enthält Funktionen, die sich auf das Server-Netzwerk beziehen.",
+ "protocol-support": {
+ __desc__: `Dieser Abschnitt enthält Funktionen, die zusätzliche Protokoll-Unterstützung für einige QoL- / Utility-Mods bieten.
+
+ Die zusätzliche Protokoll-Unterstützung funktioniert nur, wenn eine entsprechende clientseitige Mod installiert ist. Das bedeutet, wenn eine bestimmte Protokoll-Unterstützung aktiviert ist und ein Spieler diese Mod auf dem Client installiert hat, kann er die zusätzlichen Funktionen nutzen, die in jeder Konfiguration unten beschrieben sind. Aber für Spieler, die keine entsprechende Mod installiert haben, bleibt alles wie zuvor.
+
+
Achtung
+ Die Protokoll-Unterstützung kann zu Inkompatibilität mit [ViaVersion](https://modrinth.com/plugin/viaversion) führen.
+ Wir empfehlen Spielern, einen Client zu verwenden, der dieselbe Version wie der Server-Core hat, und die neueste entsprechende Mod zu installieren; andernfalls können sie dem Server möglicherweise nicht beitreten.
+
`,
+ "jade-protocol": {
+ default: false,
+ desc: `Ob die [Jade](https://modrinth.com/mod/jade)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die Jade-Mod installiert haben, Item-Informationen in Lagercontainern, den Fortschritt von Öfen und Brauständen, Nahrung auf dem Lagerfeuer, Bienendaten im Bienenstock und weitere vanilla-freundliche Funktionen anzeigen lassen.`
+ },
+ "appleskin-protocol": {
+ default: false,
+ desc: `Ob die [AppleSkin](https://modrinth.com/mod/appleskin)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die AppleSkin-Mod installiert haben, die genauen Sättigungs-/Erschöpfungswerte auf dem Client anzeigen lassen.`
+ },
+ "appleskin-protocol-sync-tick-interval": {
+ default: 20,
+ desc: `Wie oft der Server AppleSkin-Daten mit Clients synchronisieren soll, die AppleSkin installiert haben.
+ Dies hat nur Auswirkungen, wenn \`appleskin-protocol\` oben \`true\` ist.
+ (Einheit: Tick, Standardwert 20 Ticks = 1 Sekunde)`
+ },
+ "asteorbar-protocol": {
+ default: false,
+ desc: `Ob die [AsteorBar](https://modrinth.com/mod/asteorbar)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die AsteorBar-Mod installiert haben, die genauen Sättigungs-/Erschöpfungswerte auf dem Client anzeigen lassen.`
+ },
+ "chatimage-protocol": {
+ default: false,
+ desc: `Ob die [ChatImage](https://modrinth.com/mod/chatimage)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die ChatImage-Mod installiert haben, das Bild sehen, das von anderen im CICode-Format gesendet wurde.`
+ },
+ "xaero-map-protocol": {
+ default: false,
+ desc: `Ob die [XaeroMap](https://modrinth.com/mod/xaeros-minimap)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die Xaero's MiniMap Mod oder Xaero's WorldMap Mod installiert haben, Koordinatenpunkte und Todespunkte basierend auf der \`protocol-support.xaero-map-server-id\` des Servers unten speichern.`
+ },
+ "xaero-map-server-id": {
+ default: 513317,
+ desc: `Eindeutige Nummer-ID für XaeroMap, um den Server zu identifizieren.
+ Dies kann verhindern, dass Punkte gelöscht/aktualisiert werden, wenn sich der Servername oder die IP-Adresse ändert. Ändere diesen Wert bei Bedarf.
+ Dieser Wert wird beim ersten Serverstart zufällig generiert.`
+ },
+ "syncmatica-protocol": {
+ default: false,
+ desc: `Ob die [Syncmatica](https://modrinth.com/mod/syncmatica)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die Syncmatica-Mod installiert haben, ihre [Litematica](https://modrinth.com/mod/litematica)-Schematic-Dateien hochladen oder geteilte Schematic-Dateien vom Server herunterladen. Jeder Spieler mit installierter Syncmatica-Mod kann auf geteilte Schematics zugreifen, die von anderen hochgeladen wurden.`
+ },
+ "syncmatica-quota": {
+ default: false,
+ desc: "Ob das maximale Dateigrößenlimit für jede geteilte Schematic-Datei der Litematica-Mod aktiviert werden soll."
+ },
+ "syncmatica-quota-limit": {
+ default: 40000000,
+ desc: `Die maximale Dateigröße jeder geteilten Schematic-Datei, die auf den Server hochgeladen wird.
+ (Einheit: Byte, Standardwert 40.000.000 Bytes ≈ 38 MB)`
+ },
+ "do-a-barrel-roll-protocol": {
+ default: false,
+ desc: `Ob die [Do a Barrel Roll](https://modrinth.com/mod/do-a-barrel-roll)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können die visuellen Effekte von Do a Barrel Roll mit anderen Spielern synchronisiert werden, die diese Mod installiert haben.`
+ },
+ "do-a-barrel-roll-allow-thrusting": {
+ default: false,
+ desc: "Ob Spielern erlaubt werden soll, die Option \`enable_thrust\` in ihrer Client-Konfiguration zu aktivieren."
+ },
+ "do-a-barrel-roll-force-enabled": {
+ default: false,
+ desc: "Ob die Mod für alle Spieler, die diese Mod installiert haben, zwangsweise aktiviert werden soll, unabhängig von ihrer Client-Konfiguration."
+ },
+ "do-a-barrel-roll-force-installed": {
+ default: false,
+ desc: "Ob Spieler abgewiesen werden sollen, wenn sie diese Mod nicht in ihrem Client installiert haben."
+ },
+ "do-a-barrel-roll-installed-timeout": {
+ default: 0,
+ desc: `Die Zeitspanne, die gewartet werden soll, bis ein Client auf das \`do_a_barrel_roll:config_sync\`-Paket antwortet.
+ (Einheit: Tick)
+ Wenn auf \`true\` gesetzt, werden Spieler, die diese Mod nicht in ihrem Client installiert haben, nach Ablauf dieses Timeouts gekickt.`
+ }
+ },
+ OptimizeNonFlushPacketSending: {
+ default: false,
+ desc: `Ob das Senden von nicht-geflushten Paketen optimiert werden soll, indem Nettys [\`lazyExecute\`](https://netty.io/4.2/api/io/netty/util/concurrent/SingleThreadEventExecutor.html#lazyExecute(java.lang.Runnable))-Methode verwendet wird. Dies kann Thread-Konkurrenz und Wakeup-Aufrufe für bestimmte Arten von Netzwerkoperationen reduzieren.
+
+
Warnung
+ Diese Option ist bekannt dafür, __INKOMPATIBEL__ mit ProtocolLib zu sein und kann Probleme mit anderen Plugins verursachen, die Netzwerkpakete intensiv manipulieren.
+ Erfordert einen Neustart des Servers, um wirksam zu werden. Mit extremer Vorsicht verwenden.
+
`
+ },
+ "chat-message-signature": {
+ default: true,
+ desc: `Ob die Chatnachrichten-Signatur aktiviert werden soll, die in Minecraft 1.19.1 eingeführt wurde.
+
+ - Wenn auf \`true\` gesetzt, werden Nachrichten signiert und können wie in Vanilla gemeldet werden.
+ - Wenn auf \`false\` gesetzt, ist die Chat-Signatur deaktiviert. Spieler können Nachrichten nicht melden, und das Pop-up mit der Warnung vor unsicheren Nachrichten wird deaktiviert, wenn der Spieler dem Server beitritt.
+
+
+ __⚡Empfohlener Wert: \`false\`__ (Nur für Offline-Mode-Server oder Server, die alternative Moderationsmethoden haben)`
+ },
+ "async-switch-state": {
+ default: false,
+ desc: "Ob die Logik zum Umschalten des Verbindungsstatus des Spielers asynchron verarbeitet werden soll. Dies kann das Problem der Blockierung des Haupt-Threads beheben, das durch die Nutzung von Exploits aufgrund eines Designfehlers in der Vanilla-Logik verursacht wird."
+ }
+ },
+
+ misc: {
+ __desc__: "Dieser Abschnitt enthält einige sonstige Funktionen.",
+ message: {
+ "unknown-command": {
+ default: "default",
+ desc: `Die Nachricht für unbekannte Befehle, die an den Spieler gesendet wird, wenn er einen unbekannten Befehl ausführt.
+ Die Nachricht muss das [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/)-Format verwenden.
+ Wenn auf \`default\` gesetzt, wird die Vanilla-Nachricht für unbekannte Befehle verwendet.
+
+ Verfügbare Platzhalter:
+
+ - __\`\`__ - die detaillierten Informationen des unbekannten Befehls.
+
+
+
API / Plugin-Freundlich
+ Diese Funktion ist API- / Plugin-freundlich. Das bedeutet, dass diese Nachricht von Plugins überschrieben werden kann, die \`UnknownCommandEvent#message\` oder \`UnknownCommandEvent#setMessage\` verwenden.
+
`
+ }
+ },
+ rebrand: {
+ "server-mod-name": {
+ default: "Leaf",
+ desc: "Der Server-Markenname, der im F3-Debug-Menü des Clients und in der Server-MOTD angezeigt wird."
+ },
+ "server-gui-name": {
+ default: "Leaf Console",
+ desc: "Der Titel, der im Server-GUI-Fenster angezeigt wird, wenn du den Server ohne die Option \`--nogui\` im Start-Flag gestartet hast."
+ }
+ },
+ sentry: {
+ __desc__: `[Sentry](https://sentry.io/welcome/) ist ein Anwendungsüberwachungsdienst für verbesserte Fehlerprotokollierung und -verfolgung. Hilft dem Server-Entwicklerteam bei der besseren Wartung.
+
+ Nach der Aktivierung der Sentry-Integration für deinen Server musst du keine langen Logs mehr manuell prüfen, um Fehler zu finden. Sentry kann Fehler sammeln, die auf deinem Server aufgetreten sind, ermöglicht es dir, Fehler im Web-Panel von Sentry zu verfolgen, und hilft dir, diese einfacher und schneller zu lokalisieren und zu beheben.
+
+ Siehe __[How to Setup Sentry](../how-to/setup-sentry)__, um zu erfahren, wie du es einrichtest und den DSN-Key für \`sentry.dsn\` unten erhältst.
`,
+ dsn: {
+ default: "''",
+ desc: `Der DSN-Key deines Sentry.
+ Wenn ein leerer Wert \`''\` angegeben wird, ist Sentry deaktiviert.`
+ },
+ "log-level": {
+ default: "WARN",
+ desc: `Logs mit einem Level höher oder gleich diesem Level werden aufgezeichnet.
+ Die gültigen Werte für diese Option sind: \`"WARN"\`, \`"ERROR"\` und \`"FATAL"\`.`
+ },
+ "only-log-thrown": {
+ default: true,
+ desc: "Ob Sentry nur Logs mit Javas \`Throwable\` aufzeichnet."
+ }
+ },
+ "secure-seed": {
+ enabled: {
+ default: false,
+ desc: `Ob der sichere Seed (Secure Seed) verwendet werden soll.
+
+ Der sichere Seed stellt sicher, dass alle Erze und Strukturen mit einem 1024-Bit-Seed unter Verwendung einer kryptografischen Hash-Funktion mit hoher Sicherheit generiert werden, anstatt einen 64-Bit-Seed wie in Vanilla zu verwenden. Dies schützt die Struktur-Seeds durch rechnerische Sicherheit und macht das Seed-Cracking nahezu unmöglich.
+
+
Warnung
+ Der sichere Seed ändert grundlegend die Positionen von Erzen und Strukturen im Vergleich zu Vanilla.
+ Dies gilt nur für neu generierte Chunks. Daher musst du eine neue Welt vorbereiten, wenn du diese Option aktivieren möchtest.
+ Sobald diese Option aktiviert ist, kannst du sie nicht deaktivieren, um zur Vanilla-Generierung zurückzukehren, es sei denn, du generierst die gesamte Welt vor, da neu generierte Chunks sonst Terrain-Unstimmigkeiten aufweisen.
+
`
+ }
+ },
+ "remove-vanilla-username-check": {
+ default: true,
+ desc: `Ob die Vanilla-Benutzernamenprüfung entfernt werden soll, um __alle Zeichen__ als Benutzernamen zu erlauben, einschließlich Chinesisch usw. (Dies ist nur für Offline-Server nützlich).
+ Wenn auf \`true\` gesetzt, können Spieler mit einem nicht-englischen Namen dem Server beitreten.`
+ },
+ "remove-spigot-check-bungee-config": {
+ default: false,
+ desc: `Ob der Spieler über einen Proxy auf den Backend-Server gelangen kann, ohne dass der Backend-Server den BungeeCord-Modus in \`spigot.yml\` aktiviert hat.
+
+
Warnung
+ Es wird nicht empfohlen, diese Option zu ändern, es sei denn, du bist sicher, was du tust.
+ Und sie könnte in Zukunft entfernt werden.
+
`
+ },
+ "remove-change-non-editable-sign-warning": {
+ default: false,
+ desc: `Ob der Server eine Warnmeldung ausgibt, wenn Spieler versuchen, ein Schild zu bearbeiten, das sie nicht bearbeiten dürfen.
+ Die Warnmeldung sieht so aus: \`Player [...] just tried to change non-editable sign\`.
+ Wenn auf \`true\` gesetzt, verhindert dies Konsolen-Spam, der durch Spieleraktionen oder andere Fälle verursacht wird.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "region-format-settings": {
+ __desc__: `Linear ist ein Regionsdateiformat, das [zstd-Kompression](https://facebook.github.io/zstd/) anstelle von zlib in Vanilla Minecraft verwendet. Dieses Format spart etwa ~50% Speicherplatz.
+ Um das Linear-Regionsformat zu verwenden, stelle sicher, dass du die __[Linear Documentation](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools) gelesen__ und alle erforderlichen Schritte ausgeführt hast, und ändere dann \`region-format\` unten auf \`LINEAR\`.
+
+
Warnung
+ Experimentelle Funktion, es besteht ein potenzielles Risiko des Verlusts von Chunk-Daten. Erstelle ein Backup deines Servers, bevor du zu Linear wechselst.
+ Außerdem empfehlen wir die Verwendung von Linear nicht, da das Vanilla-ANVIL-Format (\`.mca\`) ausreichend ist. Leaf verwendet die refactored Version des Linear-Flush-Systems, die sicherer, aber langsamer beim Speichern von Chunks ist, um Datenverlust weniger wahrscheinlich zu machen. Dieser Kompromiss lohnt sich jedoch, da Daten von unschätzbarem Wert sind.
+
`,
+ "region-format": {
+ default: "MCA",
+ desc: `Spezifiziert das Format, das zum Speichern von Chunk-Daten in Regionsdateien verwendet wird.
+ Verfügbare Regionsformate:
+
+ - \`MCA\`: Standardmäßiges Minecraft-ANVIL-Format unter Verwendung von zlib-Kompression.
+ - \`LINEAR\`: Das Linear v1 Format. Die refactored Version von [EarthMe](https://github.com/MrHua269) hat das Linear-Flush-System behoben.
+
`
+ },
+ "linear-compress-level": {
+ default: 1,
+ desc: `Das Kompressionslevel der Linear-Regionsformatdatei.
+ Dies hat nur Auswirkungen, wenn \`region-format\` oben auf \`LINEAR\` steht.
+
+
+ - Wenn auf ein höheres Level (bis zu \`22\`) gesetzt, bietet es bessere Kompressionsverhältnisse, erfordert jedoch deutlich mehr CPU-Zeit für die Kompression.
+ - Wenn auf ein niedrigeres Level gesetzt, komprimiert es schneller, benötigt aber mehr Platz. Level 1 verwendet die schnellste und leichteste Kompression.
+
`
+ },
+ "throw-on-unknown-extension-detected": {
+ default: false,
+ desc: `Ob ein Fehler geworfen und der Server abstürzen soll, wenn eine unbekannte oder nicht übereinstimmende Regionsformat-Erweiterung beim Laden von Regionsdateien von der Festplatte erkannt wird.
+ Dies kann Datenkorruption durch versehentlich konfigurierte falsche Regionsdateiformate in derselben Welt verhindern.
+
+ Zum Beispiel:
+ Wenn auf \`true\` gesetzt, stürzt der Server sofort ab, wenn \`.linear\`-Dateien geladen werden, während \`region-format\` oben auf \`MCA\` steht, oder umgekehrt.`
+ },
+ "flush-interval-seconds": {
+ default: 5,
+ desc: `Wie oft der Server versucht, zwischengespeicherte Linear-Regionsdateidaten auf die Festplatte zu flushen (schreiben).
+ Häufigeres Flushen reduziert potenziellen Datenverlust bei einem Absturz, erhöht aber die Festplatten-I/O.
+ (Einheit: Sekunde)`
+ }
+ },
+ "lag-compensation": {
+ enabled: {
+ default: false,
+ desc: `Die Lag-Kompensation wurde entwickelt, um die Auswirkungen von Server-Lag-Spikes oder niedrigen TPS-Situationen auf das Gameplay zu mildern, was das grundlegende Spielerlebnis während des Lags sicherstellen könnte.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "enable-for-water": {
+ default: false,
+ desc: `Ob Lag-Kompensation für fließendes Wasser aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "enable-for-lava": {
+ default: false,
+ desc: `Ob Lag-Kompensation für fließende Lava aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "including-5s-in-get-tps": {
+ default: true,
+ desc: `Ob 5-Sekunden-TPS in das Ergebnis der API \`Bukkit#getTPS\` und \`Server#getTPS\` aufgenommen werden sollen.
+ Befehle wie \`/tps\` zeigen dies unabhängig davon an.
+
+ - Wenn auf \`true\` gesetzt, kannst du die \`getTPS\`-Methode verwenden, um ein TPS-Long-Array mit 4 Elementen \`[5s, 1m, 5m, 15m]\` zu erhalten.
+ - Wenn auf \`false\` gesetzt, kannst du die \`getTPS\`-Methode verwenden, um ein TPS-Long-Array mit 3 Elementen \`[1m, 5m, 15m]\` zu erhalten.
+
+
+ Möchtest du tiefer eintauchen?
+ Wenn du die Leaf API für deine Plugins verwendest. Oder auf Leaf läufst und Reflection verwendest, um TPS zu erhalten, kannst du \`Bukkit#getTPSIncluding5SecondAverage\` verwenden, um das TPS-Array einschließlich 5-Sekunden-TPS \`[5s, 1m, 5m, 15m]\` zu erhalten.
+ Außerdem kannst du \`Bukkit#get5SecondTPSAverage\` verwenden, um den Durchschnittswert der 5-Sekunden-TPS als \`double\` zu erhalten.
+ `
+ },
+ "connection-message": {
+ __desc__: `Die Verbindungsnachricht wird an alle Online-Spieler gesendet, wenn sie dem Server beitreten oder ihn verlassen.
+ Die Nachricht muss das [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/)-Format verwenden.
+ Wenn \`message\` unten auf \`default\` gesetzt ist, wird die Vanilla-Beitritts-/Verlassensnachricht verwendet.
+ Wenn \`enabled\` unten auf \`false\` gesetzt ist, wird die Verbindungsnachricht deaktiviert, und ein anderes Plugin wird verwendet, um die Verbindungsnachricht zu senden.
+
+ Verfügbare Platzhalter:
+
+ - __\`\`__ - Spielername.
+ - __\`\`__ - Anzeigename des Spielers.
+
+
+
API / Plugin-Freundlich
+ Diese Funktion ist API- / Plugin-freundlich. Das bedeutet, dass der Inhalt der Verbindungsnachricht von Plugins überschrieben werden kann, die \`PlayerJoinEvent\` oder \`PlayerQuitEvent\` verwenden.
+
`,
+ join: {
+ enabled: {
+ default: true,
+ desc: "Ob eine Nachricht gesendet werden soll, wenn der Spieler beitritt."
+ },
+ message: {
+ default: "default",
+ desc: "Die Beitrittsnachricht des Spielers."
+ }
+ },
+ quit: {
+ enabled: {
+ default: true,
+ desc: "Ob eine Nachricht gesendet werden soll, wenn der Spieler den Server verlässt."
+ },
+ message: {
+ default: "default",
+ desc: "Die Verlassensnachricht des Spielers."
+ }
+ }
+ },
+ cache: {
+ "profile-lookup": {
+ enabled: {
+ default: false,
+ desc: `Ob die Profildaten des Spielers (z. B. UUID, Benutzername, Skin-/Cape-Texturen) gecacht werden sollen, wenn sie dem Server beigetreten sind.
+ Dies kann Netzwerkanfragen an Mojangs Authentifizierungsserver reduzieren und ist auch nützlich, wenn der Authentifizierungsserver vorübergehend nicht verfügbar ist, und erlaubt es Spielern trotzdem, dem Server unter Verwendung gecachter Profildaten erneut beizutreten.`
+ },
+ timeout: {
+ default: 1440,
+ desc: `Der Timeout des Spielerprofil-Caches.
+ (Einheit: Minute, Standardwert 1440 Minuten = 24 Stunden)
+ Wenn der angegebene Timeout überschritten wird, sendet der Server beim nächsten Beitritt des Spielers eine weitere Anfrage, um Spielerprofildaten von Mojangs Authentifizierungsserver abzurufen.`
+ },
+ "max-size": {
+ default: 8192,
+ desc: `Die maximale Anzahl an Profilen, die gecached werden sollen.
+ Höhere Werte können etwas mehr Speicher beanspruchen.`
+ }
+ }
+ },
+ "async-catcher": {
+ enabled: {
+ default: true,
+ desc: `Ob der Haupt-Thread-Check von Spigot aktiviert werden soll.
+
+
Warnung
+ Das Deaktivieren wird NICHT empfohlen und kann zu schwerwiegender Serverinstabilität führen.
+ Es wird nicht empfohlen, diese Option zu ändern, es sei denn, du bist sicher, was du tust.
+
`
+ }
+ }
+ }
+};
+
+export default config;
diff --git a/pages/de/docs/config/data/leaf-global-latest.ts b/pages/de/docs/config/data/leaf-global-latest.ts
new file mode 100644
index 0000000..a53ab76
--- /dev/null
+++ b/pages/de/docs/config/data/leaf-global-latest.ts
@@ -0,0 +1,1153 @@
+import type { ConfigRoot } from "@/.vitepress/theme/components/config/types";
+
+const config: ConfigRoot = {
+ "config-version": {
+ default: "3.0"
+ },
+
+ async: {
+ __desc__:
+ "Dieser Abschnitt enthält asynchrone Funktionen, die dazu dienen, die Last auf dem Haupt-Thread (Server-Thread) zu verringern, indem Aufgaben asynchron verarbeitet werden.",
+ "async-chunk-send": {
+ enabled: {
+ default: false,
+ desc: `Ob das Packen und Senden von Chunk-Paketen asynchron erfolgen soll.
+ Dies kann die Last auf dem Haupt-Thread erheblich reduzieren, insbesondere wenn viele Spieler gleichzeitig Chunks laden (z. B. beim Beitreten, Teleportieren oder schnellen Fliegen).
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "async-mob-spawning": {
+ enabled: {
+ default: true,
+ desc: `Ob Mob-Spawning asynchron erfolgen soll.
+
+ Auf Servern mit vielen Entities kann dies die Leistung um bis zu ~15% verbessern. Damit dies funktioniert, muss in der Paper-Config \`per-player-mob-spawns\` auf \`true\` gesetzt sein.
+ Anmerkung: Dies spawnt Mobs nicht tatsächlich asynchron (das wäre sehr unsicher). Es lagert lediglich einige teure Berechnungen aus, die für das Mob-Spawning erforderlich sind.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "async-pathfinding": {
+ enabled: {
+ default: false,
+ desc: `Ob die Berechnung der Mob-Pfadfindung asynchron erfolgen soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "max-threads": {
+ default: 0,
+ desc: `Maximale Anzahl an Threads, die für die asynchrone Entity-Pfadfindung verwendet werden sollen.
+ Wenn ein Wert ≤ \`0\` angegeben wird, werden automatisch 1/4 der CPU-Kerne verwendet, mindestens jedoch 1.
+
+ __⚡Empfohlener Wert: 1/3 der CPU-Kerne__`
+ },
+ keepalive: {
+ default: 60,
+ desc: `Die Keepalive-Zeit für Threads; Threads ohne Aufgaben werden beendet, wenn sie diese Zeit überschreiten.
+ (Einheit: Sekunde)`
+ },
+ "queue-size": {
+ default: 0,
+ desc: `Maximale Größe der Warteschlange für ausstehende Entity-Tracking-Aufgaben.
+ Wenn ein Wert ≤ \`0\` angegeben wird, wird die Warteschlangengröße dynamisch als \`max-threads * 256\` berechnet.`
+ },
+ "reject-policy": {
+ default: "CALLER_RUNS",
+ desc: `Die Richtlinie, die verwendet werden soll, wenn die Warteschlange für Pfadfindungsaufgaben voll ist und eine neue Aufgabe eingereicht wird.
+
+ - \`FLUSH_ALL\`: Alle ausstehenden Aufgaben in der Warteschlange werden sofort im Server-Thread ausgeführt.
+ - \`CALLER_RUNS\`: Die eingehende eingereichte Aufgabe wird im Server-Thread ausgeführt.
+
+
+ __⚡Empfohlener Wert: \`CALLER_RUNS\`__`
+ }
+ },
+ "async-playerdata-save": {
+ enabled: {
+ default: false,
+ desc: "Ob das Speichern von Spielerdaten asynchron erfolgen soll. (I/O-Operationen sind aufwändig)"
+ // TODO
+ //
+ //
Experimentell
+ // Experimentelle Funktion, kann unter Umständen zu Datenverlust oder Dateninkonsistenz führen!
+ //
`
+ }
+ },
+ "async-entity-tracker": {
+ enabled: {
+ default: false,
+ desc: `Ob das Entity-Tracking asynchron erfolgen soll.
+ Dies kann die Leistung erheblich verbessern, insbesondere in Situationen mit einer großen Anzahl von Entities in einem kleinen Bereich.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ threads: {
+ default: 0,
+ desc: `Maximale Anzahl an Threads, die für den asynchronen Entity-Tracker verwendet werden sollen.
+ Wenn ein Wert ≤ \`0\` angegeben wird, werden automatisch 1/4 der CPU-Kerne verwendet, mindestens jedoch 1.
+
+ __⚡Empfohlener Wert: 1/2 der CPU-Kerne__`
+ }
+ },
+ "parallel-world-ticking": {
+ enabled: {
+ default: false,
+ desc: `Ob verschiedene Welten parallel in separaten Threads verarbeitet werden sollen, was die Leistung auf Multi-Core-Systemen verbessern kann.
+
+ Parallel World Ticking, auch bekannt als "PWT", ist ein Konzept von [SparklyPaper](https://github.com/SparklyPower/SparklyPaper), bei dem jede Welt in ihrem eigenen dedizierten Thread getickt wird, um die Arbeitslast von einem einzelnen Thread für alle Welten aufzuteilen und zu reduzieren.
+ In dieser PWT-Implementierung wartet jede Welt, bis der letzte Welt-Tick abgeschlossen ist. Mehr dazu in der Erklärung von SparklyPaper: [PARALLEL_WORLD_TICKING.md](https://github.com/SparklyPower/SparklyPaper/blob/13aff425238ea322658de0d9f4f7bd906bd9f431/docs/PARALLEL_WORLD_TICKING.md).
+
+ Wann sollte ich PWT in Betracht ziehen?
+
+ - Ich kann wirklich nicht zu [Folia](https://papermc.io/software/folia) oder dessen Forks wechseln.
+ - Ich habe einen Multi-Core-Server.
+ - Meine Spieler verteilen sich gleichmäßig auf jede Welt.
+ - (Oder ich habe viele Welten, z. B. einige RPG-Server)
+
+
+ __⚡Empfohlener Wert: \`true\` (Nur wenn spezifische Engpässe auftreten und die Risiken verstanden werden)__
+
+
Experimentell
+ Experimentelle Funktion, möglicherweise instabil und kann Kompatibilitätsprobleme mit einigen Plugins verursachen.
+
`
+ },
+ threads: {
+ default: 8,
+ desc: `Anzahl der Threads, die für das parallele World-Ticking reserviert sind.
+
+ __⚡Empfohlener Wert: gleich der Anzahl der Welten__`
+ },
+ "log-container-creation-stacktraces": {
+ default: false,
+ desc: `Ob Stacktraces protokolliert werden sollen, wenn Container (wie Tile Entities oder Entities) während des parallelen Tickings erstellt werden.
+ Dies ist nützlich für das Debuggen potenzieller Nebenläufigkeitsprobleme (Concurrency Issues).`
+ },
+ "disable-hard-throw": {
+ default: false,
+ desc: `Ob "Hard Throws" (die normalerweise den Server stoppen) im Zusammenhang mit Fehlern beim parallelen Ticking deaktiviert werden sollen.
+
+
Achtung
+ Dies kann zugrundeliegende Probleme maskieren, aber helfen, Abstürze während der Testphase der Serverentwicklung zu verhindern. Mit Vorsicht verwenden.
+
`
+ },
+ "async-unsafe-read-handling": {
+ default: "BUFFERED",
+ desc: `Ob asynchrone Aufgaben innerhalb des parallelen Ticking-Systems synchron ausgeführt werden sollen.
+ Dies könnte für die Kompatibilität mit bestimmten Plugins erforderlich sein, macht jedoch die Leistungsvorteile des parallelen Tickings weitgehend zunichte.
+
+ __⚡Empfohlener Wert: \`BUFFERED\`__`
+ }
+ }
+ },
+
+ performance: {
+ __desc__:
+ "Dieser Abschnitt enthält Leistungsoptimierungen, die darauf abzielen, unnötige Berechnungen zu reduzieren oder effizientere Methoden zur Optimierung des Servers zu verwenden.",
+ "check-survival-before-growth": {
+ "cactus-check-survival": {
+ default: false,
+ desc: `Ob überprüft werden soll, ob der Kaktus überleben kann, bevor versucht wird, ihn wachsen zu lassen.
+ Dies kann die Leistung verbessern, wenn riesige Kaktusfarmen auf dem Server existieren.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "dont-save-entity": {
+ "dont-save-primed-tnt": {
+ default: false,
+ desc: `Ob das Speichern von gezündetem TNT beim Entladen von Chunks deaktiviert werden soll.
+ Dies kann verhindern, dass Maschinen oder Redstone-Bauten durch TNT explodieren, wenn der Spieler versehentlich die Verbindung trennt oder der Chunk entladen wird, während der Spieler weit weg ist. Nützlich für Redstone-/Technik-/Survival-Server, die Maschinen mit TNT verwenden.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "dont-save-falling-block": {
+ default: false,
+ desc: `Ob das Speichern von fallenden Blöcken beim Entladen von Chunks deaktiviert werden soll.
+ Dies kann potenzielle Probleme mit verbuggten oder duplizierten fallenden Blöcken (Sand, Kies usw.) nach Server-Neustarts oder Chunk-Laden verhindern, insbesondere wenn diese durch Lags verursacht wurden.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ dab: {
+ __desc__:
+ "Dynamic Activation of Brain, auch bekannt als DAB, optimiert das 'Gehirn' (Brain) von Entities, indem die Frequenz ihres Brain-Tickings verringert wird, wenn sie weit von Spielern entfernt sind. Dies ist ein lohnender Kompromiss zur Leistungsverbesserung, wenn viele Entities vorhanden sind.",
+ enabled: {
+ default: false,
+ desc: `Ob DAB aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false (oder siehe dab.blacklisted-entities unten für mehr) |
+
`
+ },
+ "dont-enable-if-in-water": {
+ default: false,
+ desc: `Ob nicht-aquatische Entities im Wasser von DAB ausgeschlossen werden sollen. Dies kann [Pufferfish#58](https://github.com/pufferfish-gg/Pufferfish/issues/58) beheben.
+ Wenn auf \`true\` gesetzt, könnte dies verhindern, dass Entities im Wasser ersticken, wenn sie weit vom Spieler entfernt sind.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "start-distance": {
+ default: 12,
+ desc: `Die Distanz bestimmt, wie weit ein Entity vom Spieler entfernt sein muss, um von DAB beeinflusst zu werden.
+ (Einheit: Block)
+
+ __⚡Empfohlener Wert: \`8\`__`
+ },
+ "max-tick-freq": {
+ default: 20,
+ desc: `Die maximale Tick-Zeit definiert, wie oft das am weitesten entfernte Entity seine Pathfinder und Verhaltensweisen getickt bekommt.
+ (Einheit: Tick, Standardwert 20 Ticks = 1s)`
+ },
+ "activation-dist-mod": {
+ default: 8,
+ desc: `Die Tick-Frequenz, die definiert, wie stark die Distanz die Tick-Frequenz eines Entities beeinflusst. \`freq = (distanceToPlayer^2) / (2^value)\`.
+
+ - Wenn du möchtest, dass weiter entfernte Entities __weniger__ oft ticken, verwende \`7\`.
+ - Wenn du möchtest, dass weiter entfernte Entities __öfter__ ticken, versuche \`9\`.
+
+
+ __⚡Empfohlener Wert: \`7\`__`
+ },
+ "blacklisted-entities": {
+ default: `
+ - villager
+ - axolotl
+ - hoglin
+ - zombified_piglin
+ - goat`,
+ desc: `Eine Liste von Entities, die nicht von DAB betroffen sein sollen.
+
+ Einige Survival-Server haben Mob-Farmen, die darauf angewiesen sind, dass Mobs ein Ziel haben. Diese Art von "Pfadfindungs"-Mob-Farm kann durch DAB beeinträchtigt werden. Diese Situation kann gelöst werden, indem spezifische Mobs der Mob-Farm zu dieser DAB-Blacklist hinzugefügt werden.
+ Wenn bestimmte Mob-Farmen auf deinem Server defekt sind, Mobs einfrieren und sich nicht bewegen, und du nicht sicher bist, ob dies durch DAB verursacht wird, kannst du versuchen, sie zu dieser Liste hinzuzufügen, um zu sehen, ob das Problem dadurch behoben wird.
+
+ Format: \`[villager]\` oder \`[villager, zombified_piglin]\` (Du findest alle Entity-Typen in [Paper's Javadoc](https://jd.papermc.io/paper/1.21.8/org/bukkit/entity/EntityType.html)).
+
+ [💡 Du möchtest tiefer eintauchen?](guides/dab-blacklist-format)`
+ }
+ },
+ "enable-cached-minecraft-to-bukkit-entitytype-convert": {
+ default: true,
+ desc: `Ob das Ergebnis der Umwandlung von *Minecraft EntityType* zu *Bukkit EntityType* zwischengespeichert (gecached) werden soll. Diese Umwandlung kann etwas aufwändig sein, insbesondere in der Spawning-Logik, daher kann das Caching die Leistung leicht verbessern.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "fast-biome-manager-seed-obfuscation": {
+ enabled: {
+ default: false,
+ desc: `Ob die Vanilla SHA-256 Seed-Obfuskation im \`BiomeManager\` durch XXHash ersetzt werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "seed-obfuscation-key": {
+ default: 513317,
+ desc: `Seed-Obfuskationsschlüssel für XXHash.
+ Dieser Wert wird beim ersten Serverstart zufällig generiert.`
+ }
+ },
+ "faster-random-generator": {
+ enabled: {
+ default: false,
+ desc: `Ob der schnellere Zufallsgenerator (Random Generator), der in JDK 17 eingeführt wurde, verwendet werden soll.
+ Zufall wird fast überall in Minecraft verwendet; dies zu aktivieren kann eine ordentliche Leistungsverbesserung bringen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Achtung
+ Dies erfordert eine JVM, die \`RandomGenerator\` unterstützt. Einige JREs unterstützen dies nicht.
+
`
+ },
+ "random-generator": {
+ default: "Xoroshiro128PlusPlus",
+ desc: `Der spezifische Algorithmus des Zufallsgenerators, der verwendet werden soll.
+ Verfügbare Zufallsgeneratoren findest du unter [Random Number Generators in Java](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1) oder [JEP 356](https://openjdk.org/jeps/356).
+
+ __⚡Empfohlener Wert: \`Xoroshiro128PlusPlus\`__`
+ },
+ "enable-for-worldgen": {
+ default: false,
+ desc: `Ob der schnellere Zufallsgenerator für die Weltgenerierung verwendet werden soll.
+
+ - Wenn auf \`true\` gesetzt, verwenden \`Random\`-Aufrufe, die an der Weltgenerierung beteiligt sind, den schnelleren Zufallsgenerator, den du oben in \`random-generator\` gewählt hast. Die Weltgenerierung wird sich leicht von Vanilla unterscheiden.
+ - Wenn auf \`false\` gesetzt, verwenden \`Random\`-Aufrufe bei der Weltgenerierung den alten Zufallsgenerator von Vanilla.
+
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "warn-for-slime-chunk": {
+ default: true,
+ desc: "Ob der Server beim Start eine Warnmeldung ausgibt, wenn der schnellere Zufallsgenerator für die Slime-Chunk-Generierung aktiviert ist."
+ },
+ "use-legacy-random-for-slime-chunk": {
+ default: false,
+ desc: `Ob die alte Zufallsquelle (\`java.util.Random\`) für die Slime-Chunk-Generierung verwendet werden soll, um dem Vanilla-Verhalten zu folgen.
+ Wenn dein Server bestehende Slime-Farmen oder ähnliche Einrichtungen hat, die Slime-Chunks benötigen, aktiviere dies; andernfalls wird die Position der Slime-Chunks verschoben sein.
+
+ __⚡Empfohlener Wert: (Hängt von deinem Servertyp ab, siehe \`Werte für Ziele\` unten für mehr)__
+
+ | Werte für Ziele | |
+ | Optimierung | false |
+ | Vanilla-Verhalten | true |
+
`
+ },
+ "use-direct-implementation": {
+ default: false,
+ desc: `Ob eine direkte Random-Implementierung (LCG ohne Synchronisation) verwendet werden soll, anstatt an Javas RandomGenerator zu delegieren.
+ Dies kann die Leistung verbessern, ändert aber möglicherweise das RNG-Verhalten.
+
+ __⚡Empfohlener Wert: \`false\`__`
+ }
+ },
+ "faster-structure-gen-future-sequencing": {
+ default: true,
+ desc: `Ob eine schnellere Aufgaben-Sequenzierung für die Generierung von Strukturen verwendet werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Achtung
+ Dies kann in seltenen Grenzfällen zu einer inkonsistenten Reihenfolge zukünftiger Compose-Tasks führen, was unterschiedliche Ergebnisse bei der Strukturgenerierung zur Folge haben kann.
+
`
+ },
+ "cache-biome": {
+ enabled: {
+ default: false,
+ desc: `Ob die Biom-Daten der Blockposition gecacht werden sollen, anstatt das Biom bei jeder Suche neu zu berechnen.
+
+ __⚡Empfohlener Wert: \`true\` (Erfordert auch das Aktivieren der Optionen unten)__`
+ },
+ "mob-spawning": {
+ default: false,
+ desc: `Ob das Biom in der Mob-Spawning-Logik gecacht werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ advancements: {
+ default: false,
+ desc: `Ob das Biom in der Berechnungslogik für Spieler-Fortschritte (Advancements) gecacht werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "optimize-block-entities": {
+ default: true,
+ desc: `Ob die effizientere Map-Datenstruktur für den Block-Entity-Ticker-Speicher verwendet werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "optimize-mob-despawn": {
+ default: false,
+ desc: `Ob eine effizientere Logik für das natürliche Despawning von Mobs verwendet werden soll.
+ Dies kann die hohen Kosten der Vanilla-Despawn-Logik vermeiden, die über jeden Spieler iteriert und dann die Distanz zwischen den Mobs und dem Spieler vergleicht.
+
+ Es wird empfohlen, das Flag [\`-DLeaf.enableFMA=true\`](http://localhost:5173/docs/config/system-properties#dleaf-enablefma) für eine bessere Leistung hinzuzufügen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ "only-tick-items-in-hand": {
+ default: false,
+ desc: `Ob Items nur getickt oder aktualisiert werden sollen, wenn der Spieler sie in der Haupt- oder Nebenhand hält, anstatt das gesamte Inventar zu ticken.
+ Dies betrifft derzeit nur Kompass- und Karten-Items.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "optimize-no-action-time": {
+ "disable-light-check": {
+ default: false,
+ desc: `Ob der Licht-Check im \`noActionTime\`-Update von Monstern übersprungen werden soll.
+ Erhöht den \`noActionTime\`-Zähler direkt um 1, ohne bei jedem Entity-Ticking das Lichtlevel zu prüfen. In Vanilla erhöht sich der Zähler um 2, wenn das Monster an einem Ort ist, an dem das Lichtlevel höher als ein bestimmter Wert ist.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ }
+ },
+ "optimize-player-movement": {
+ default: true,
+ desc: `Ob unnötige Blockkanten-Checks bei der Spielerbewegung übersprungen und redundante Aktualisierungen der Sichtweite vermieden werden sollen.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "optimize-random-tick": {
+ default: false,
+ desc: `Ob das neu geschriebene Random-Ticking-System verwendet werden soll.
+
+ Dieses neu geschriebene System nutzt gewichtete Statistiken und Stichproben, um tickbare Blöcke in aktiven Chunks auszuwählen. Es kann die unnötigen Kosten reduzieren, die durch das häufige Auswählen nicht-tickbarer Positionen in der Vanilla-Random-Ticking-Logik entstehen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ "optimize-waypoint": {
+ default: false,
+ desc: `Ob die Wegpunkt-Tracking-Daten des Spielers nur aktualisiert werden sollen, wenn sich ihre Blockposition ändert.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ "optimized-powered-rails": {
+ default: false,
+ desc: `Ob optimierte Antriebsschienen (Powered Rails) verwendet werden sollen. Nutzt eine komplett neu geschriebene Version der Iterationslogik für Antriebsschienen, die das Vanilla-Verhalten beibehält und eine 4x schnellere Leistung erreichen kann.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "reduce-packets": {
+ __desc__: "Dieser Abschnitt ist für Funktionen zur Reduzierung nutzloser Pakete.",
+ "reduce-entity-move-packets": {
+ default: false,
+ desc: `Ob nutzlose Entity-Bewegungspakete, die an Spieler gesendet werden (z. B. kleine Bewegungen), reduziert werden sollen.
+ Dies kann Bandbreite sparen und die clientseitige Verarbeitungslast verringern, was Bewegungen bei hoher Entity-Anzahl oder leichten Lags möglicherweise flüssiger erscheinen lässt.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "skip-ai-for-non-aware-mob": {
+ default: true,
+ desc: `Ob AI-Ticks für Mobs, die sowohl *inaktiv* als auch *unaware* (nicht aufmerksam) sind, komplett übersprungen werden sollen.
+ Nicht aufmerksame Mobs, die auf diese Weise optimiert wurden, führen keine eigenständigen Aktionen aus oder reagieren nicht, bis sie wieder aktiv werden, siehe [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.8/org/bukkit/entity/Mob.html#setAware(boolean)) für weitere Informationen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ datapack: {
+ "skip-inactive-entity-for-execute-command": {
+ default: false,
+ desc: `Ob die Auswahl inaktiver Entities beim Verwenden des execute-Befehls übersprungen werden soll.
+ Dies kann die Leistung auf Servern mit massiven Datapack-Funktionen verbessern.`
+ }
+ },
+ "skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer": {
+ default: true,
+ desc: `Ob die Aktualisierung von Karten-Item-Daten übersprungen werden soll, wenn die Karte keinen Renderer (\`CraftMapRenderer\`) hat.
+ Dies kann die Leistung verbessern, wenn Plugins wie ImageMap verwendet werden, die viele benutzerdefinierte Karten erstellen.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
+
+
Achtung
+ Dies kann dazu führen, dass Vanilla-Karten-Item-Daten nicht mehr aktualisiert werden.
+
`
+ },
+ "throttle-hopper-when-full": {
+ enabled: {
+ default: false,
+ desc: `Ob Versuche von Trichtern (Hopper), Items zu übertragen, gedrosselt werden sollen, wenn der Zielcontainer voll ist.
+ Verhindert, dass der Trichter jeden Tick versucht, Items zu verschieben, selbst wenn dies immer wieder fehlschlägt.
+
+ __⚡Empfohlener Wert: \`true\`__
+
+ | Werte für Ziele | |
+ | Optimierung | true |
+ | Vanilla-Verhalten | false |
+
`
+ },
+ "skip-ticks": {
+ default: 8,
+ desc: `Wie viele Ticks ein Trichter warten soll, bevor er erneut versucht, Items zu verschieben, wenn der Zielcontainer voll ist.
+ (Einheit: Tick)
+ Nur aktiv, wenn \`throttle-hopper-when-full.enabled\` oben \`true\` ist.
+ Wenn ein Wert ≤ \`0\` angegeben wird, ist diese Drosselungsfunktion deaktiviert.
+
+ __⚡Empfohlener Wert: \`8\`__
+
+ | Werte für Ziele | |
+ | Optimierung | 8 |
+ | Vanilla-Verhalten | 8 |
+
`
+ }
+ },
+ "throttle-mob-spawning": {
+ enabled: {
+ default: false,
+ desc: `Ob Mob-Spawning in Chunks übersprungen werden soll, die wiederholt beim Spawnen von Mobs über den konfigurierten \`min-failed\`-Wert hinaus fehlgeschlagen sind.
+ Sobald die Mindestanzahl fehlgeschlagener Spawn-Versuche erreicht ist, wird der Server zufällig zwischen 1 ~ \`spawn-chance\`% der Spawn-Versuche in diesem Chunk überspringen.
+ Fehlgeschlagene Spawn-Versuche werden nicht gezählt, wenn Spawn-Limits erreicht sind, und der Fehlerzähler wird nach einem erfolgreichen Spawn zurückgesetzt.`
+ },
+ monster: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für feindliche Monster."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für feindliche Monster nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ creature: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für passive Kreaturen (Tiere)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für passive Kreaturen (Tiere) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für ambiente Mobs (Fledermäuse)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für ambiente Mobs (Fledermäuse) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ axolotls: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für Axolotl."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für Axolotl nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ underground_water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für Unterwasser-Kreaturen (Leuchttintenfisch)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für Unterwasser-Kreaturen (Leuchttintenfisch) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für Wasserkreaturen (Tintenfisch, Delfine)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für Wasserkreaturen (Tintenfisch, Delfine) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ water_ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für ambiente Wassermobs (Tropenfische)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für ambiente Wassermobs (Tropenfische) nach Erreichen des `min-failed`-Wertes oben."
+ }
+ },
+ misc: {
+ "min-failed": {
+ default: 8,
+ desc: "Die minimalen fehlgeschlagenen Spawn-Versuche für sonstige Entities."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "Die Spawn-Chance für sonstige Entities nach Erreichen des `min-failed`-Wertes oben."
+ }
+ }
+ },
+ "create-snapshot-on-retrieving-blockstate": {
+ default: true,
+ desc: `Ob standardmäßig ein Snapshot (Kopie) der TileEntity- / BlockState-Daten erstellt werden soll, wenn Plugins diese abrufen.
+
+ Einige Plugins rufen möglicherweise \`getInventory().getHolder()\` auf, um den Halter eines Inventars zu erhalten, was den Zugriff auf den BlockState beinhaltet.
+ Wenn es beispielsweise viele Trichter gibt und Plugins diese Methode beim Abhören einiger Events (z. B. Hopper-bezogene Events, häufige Aufrufe) aufrufen, ist das Neuerstellen des BlockStates und das Parsen von Item-Stacks bei massiven und häufigen Aufrufen sehr aufwändig.
+ Siehe Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) für weitere Informationen.
+
+ - Wenn auf \`true\` gesetzt, wird immer ein Snapshot (Kopie) des BlockState erstellt, wenn das Plugin entsprechende Methoden aufruft.
+ - Wenn auf \`false\` gesetzt, wird der echte BlockState direkt abgerufen, es sei denn, das Plugin fordert explizit einen Snapshot an. Die Leistung verbessert sich, aber es besteht das Risiko, dass der Blockstatus aufgrund schlechten Plugin-Designs modifiziert wird.
+
+
+ __⚡Empfohlener Wert: \`false\` (Nur wenn du spezifische Lags wie oben beschrieben feststellst)__`
+ },
+ "use-virtual-thread-for-async-scheduler": {
+ default: false,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den CraftAsyncScheduler verwendet werden soll, was die Leistung von Plugins verbessern könnte, die den asynchronen Scheduler von Bukkit stark nutzen.
+
+ __⚡Empfohlener Wert: \`true\` (Nur wenn alle Plugins Virtual Threads unterstützen)__`
+ },
+ "use-virtual-thread-for-async-chat-executor": {
+ default: true,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den Async Chat Executor verwendet werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "use-virtual-thread-for-profile-executor": {
+ default: false,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den Profile Executor verwendet werden soll, der das Abrufen von Spielerprofilen und Schädel-Skins handhabt.
+
+ __⚡Empfohlener Wert: \`false\`__`
+ },
+ "use-virtual-thread-for-user-authenticator": {
+ default: true,
+ desc: `Ob der in JDK 21 eingeführte [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) für den User Authenticator Service verwendet werden soll, der die Premium-Spieler-Beitrittsverifizierung handhabt.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+
+ fixes: {
+ __desc__: "Dieser Abschnitt enthält Bugfixes für spezifische Probleme.",
+ "dont-place-player-if-server-full": {
+ default: false,
+ desc: `Ob Spielern der Beitritt verweigert werden soll, wenn der Server voll ist (definiert als \`max-players\` in \`server.properties\`).
+ Diese Option behebt [Paper#10668](https://github.com/PaperMC/Paper/issues/10668).
+
+ Wenn auf \`true\` gesetzt, solltest du Spielern die Berechtigung \`purpur.joinfullserver\` geben, anstatt die \`PlayerLoginEvent#allow\` API zu verwenden, um Spielern das Umgehen des Limits zu erlauben.`
+ }
+ },
+
+ "gameplay-mechanisms": {
+ __desc__: "Dieser Abschnitt enthält Funktionen, die die Spielmechanik modifizieren oder verbessern.",
+ "afk-command": {
+ enabled: {
+ default: false,
+ desc: `Ob der AFK-Befehl basierend auf Minecrafts eingebautem [Idle-Timeout-Mechanismus](https://minecraft.wiki/w/Server.properties#:~:text=player%20have%20to%20idle) aktiviert werden soll. Spieler können den Befehl /afk verwenden, um ihren AFK-Modus umzuschalten, und ihr AFK-Status kann in der Tab-Liste angezeigt werden.
+
+ Setze auch \`kick-if-idle\` in der Purpur-Config auf \`false\`, um zu verhindern, dass Spieler gekickt werden, wenn sie in den AFK-Modus wechseln. Die restlichen AFK-Einstellungen, konfigurierbare AFK-Nachrichten und Titel-Nachrichten befinden sich in der Purpur-Config.`
+ }
+ },
+ "inventory-overflow-event": {
+ enabled: {
+ default: false,
+ desc: `Ob das Inventar-Überlauf-Event (Inventory Overflow Event) aktiviert werden soll. Das Event wird aufgerufen, wenn ein Plugin \`Inventory#addItem\` verwendet, um Items zum Inventar des Spielers hinzuzufügen, und das Zielinventar voll ist.
+
+
Achtung
+ Dies ist keine saubere Lösung! Bitte überarbeite deine Plugin-Logik, um die zurückgegebene Map der \`Inventory#addItem\`-Methode so schnell wie möglich zu verwenden!
+
`
+ },
+ "listener-class": {
+ default: "com.example.package.PlayerInventoryOverflowEvent",
+ desc: "Der vollständige Name der Listener-Klasse, die auf dieses Inventar-Überlauf-Event hört. Setze dies auf deine eigene Listener-Klasse, um dieses Event zu nutzen."
+ }
+ },
+ player: {
+ "max-use-item-distance": {
+ default: 1.0000001,
+ desc: `Die maximale Distanz, über die der Spieler ein Item benutzen darf.
+ (Einheit: Block)
+
+ Einige [Anarchy-Server](https://minecraftservers.org/type/anarchy) oder ähnliche Servertypen erlauben Spielern möglicherweise die Nutzung von Hacks/Cheats. Wenn du möchtest, dass Spieler Crystal-bezogene Module nutzen können, die paketbasiert sind (z. B. CEV Breaker, BedAura), musst du diesen Wert möglicherweise anpassen.
+ Es ist besser, den Wert auf \`10.0000001\` zu setzen, um die Nutzung entsprechender Hack-Module zu erlauben.
+
+ Wenn \`-1\` angegeben wird, wird die Prüfung der maximal erlaubten Distanz zur Item-Nutzung deaktiviert.
+
+ __⚡Empfohlener Wert: \`10.0000001\` (Nur für Anarchy-Server)__
+
+
Achtung
+ Wenn auf \`-1\` oder einen großen positiven Wert gesetzt, können Spieler einige Paket-Module von Hack-Clients nutzen und sind auch in der Lage, den [Nocom Exploit](https://github.com/nerdsinspace/nocom-explanation) zu nutzen! Das Anpassen dieser Option erfordert eine sorgfältige Abwägung möglicher Exploits.
+
`
+ }
+ },
+ "allow-tripwire-dupe": {
+ default: false,
+ desc: "Ob der Tripwire-Dupe ([MC-59471](https://bugs.mojang.com/browse/MC/issues/MC-59471)), der in den 1.21.2-Snapshots 24w33a und 24w36a behoben wurde, zurückgebracht werden soll. Er ist auch als String-Dupe bekannt."
+ },
+ "death-item-drop-knockback": {
+ "drop-around": {
+ default: true,
+ desc: `Ob Items beim Tod zufällig um den Spieler herum fallen gelassen werden sollen.
+
+ - Wenn auf \`true\` gesetzt, werden Items mit einer zufälligen Bewegung fallen gelassen und um den toten Spieler verstreut.
+ - Wenn auf \`false\` gesetzt, werden Items unter dem toten Spieler fallen gelassen.
+
`
+ },
+ "horizontal-force": {
+ default: 0.5,
+ desc: "Basisgeschwindigkeit der horizontalen Kraft, die auf die fallen gelassenen Items des Spielers beim Tod wirkt."
+ },
+ "vertical-force": {
+ default: 0.2,
+ desc: "Dasselbe wie \`horizontal-force\`, aber für die vertikale Geschwindigkeit."
+ }
+ },
+ // TODO: Add back when implemented it
+ // "hide-item-component": {
+ // "hidden-types": {
+ // default: "[]",
+ // desc: `The list of component type keys that will be hidden from the client.
+ //
+ // See [List of components](https://minecraft.wiki/w/Data_component_format#List_of_components) to get the full list of available component type keys for items.
+ // For example:
+ //
+ // - If a value \`[]\` is given, no item will be affected.
+ // - If a value \`[\"minecraft:custom_data\"]\` is given, the item's \`custom_data\` component will be hidden on the player's client.
+ //
`
+ // },
+ // "enabled": {
+ // default: false,
+ // desc: `Whether to hide specified component information from the player's inventory sent to clients. Also see \`hidden-types\` above.
+ //
+ // It can be used to hide complex component data on an item to reduce rendering load, frequent animations on the client side, and network usage. The actual item data will not be affected.
+ //
+ // It is noted that this option is different from Paper's [item obfuscation](https://docs.papermc.io/paper/reference/global-configuration/#anticheat_obfuscation_items_enable_item_obfuscation). This option only hides item component data from the player's own inventory, instead of hiding data sent to others.
+ //
+ //
Attention
+ // It may break resource packs, client mods, or specific gameplay mechanics that rely on these client-side component data of items. Use with caution. You must know what components you are hiding!
+ //
`
+ // }
+ // },
+ knockback: {
+ __desc__: "Dieser Abschnitt enthält Optionen zum Anpassen des Rückstoßverhaltens (Knockback).",
+ "snowball-knockback-players": {
+ default: false,
+ desc: "Ob Schneebälle Spieler zurückstoßen können."
+ },
+ "egg-knockback-players": {
+ default: false,
+ desc: "Ob Eier Spieler zurückstoßen können."
+ },
+ "can-player-knockback-zombie": {
+ default: true,
+ desc: "Ob der Spieler Zombies mit der Hand, Waffe, Projektilen usw. zurückstoßen kann."
+ },
+ "flush-location-while-knockback-player": {
+ default: false,
+ desc: `Ob Bewegungsänderungen sofort an den Client gesendet werden sollen, sobald der Zielspieler getroffen wird und Rückstoß erhält. Dies kann ein flüssigeres PVP-Spielerlebnis mit schnelleren Rückstoß-Reaktionen bieten. In Vanilla geschieht das Senden des Pakets stattdessen am Ende des Ticks, was das PVP-Spielerlebnis beeinträchtigen kann.
+
+ __⚡Empfohlener Wert: \`true\` (Für PVP-Server)__
+
+
Experimentell
+ Experimentelle Funktion, wird aktiv getestet, bitte melde alle Fehler, die auftreten.
+
`
+ },
+ "old-blast-protection-explosion-knockback": {
+ default: false,
+ desc: `Ob das alte Explosions-Rückstoßverhalten (<= 1.20.4) verwendet werden soll, das für Rüstungen mit Explosionsschutz-Verzauberung gilt.
+
+ - Wenn auf \`true\` gesetzt, wird der Explosions-Rückstoß basierend auf der Explosionsschutz-Verzauberung des Spielers berechnet. Der Rückstoß ist etwas größer als nach der Version 1.20.4.
+ - Wenn auf \`false\` gesetzt, folgt der Explosions-Rückstoß dem Vanilla-Verhalten der aktuellen Version.
+
`
+ }
+ },
+ "only-player-pushable": {
+ default: false,
+ desc: `Ob nur der Spieler verschiebbar (pushable) sein soll.
+ Wenn auf \`true\` gesetzt, überschreibt diese Option Werte verwandter Kollisionsoptionen in Papers globaler und Welt-Konfiguration, und Mobs werden nicht durch den Effekt der [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) Gamerule getötet.
+
+
Achtung
+ Dies kann Mob-Farmen zerstören, die Mob-Kollision nutzen, um Mobs fallen zu lassen oder Mobs zu töten, indem der Wert der [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) Gamerule überschritten wird.
+
`
+ },
+ "spawner-settings": {
+ enabled: {
+ default: false,
+ desc: "Ob die benutzerdefinierten Spawner-Optionen unten verwendet werden sollen. Die Optionen unten betreffen nur das Spawnen von Spawner-Blöcken statt des natürlichen Spawnens."
+ },
+ checks: {
+ "light-level-check": {
+ default: false,
+ desc: `Ob überprüft werden soll, ob das Lichtlevel ausreicht, um den Mob zu spawnen.
+
+ - Wenn auf \`true\` gesetzt, versucht der Spawner, Mobs unter Verwendung derselben Lichtlevel-Bedingungen zu spawnen, die für natürliches Mob-Spawning verwendet werden.
+ - Wenn auf \`false\` gesetzt, folgt der Spawner dem Vanilla-Verhalten, das versucht zu spawnen, ohne das Lichtlevel zu prüfen.
+
`
+ },
+ "spawner-max-nearby-check": {
+ default: true,
+ desc: `Ob überprüft werden soll, ob die maximale Anzahl an Mobs in der Nähe erreicht ist, um den Mob zu spawnen. Der Spawner hört auf, neue Mobs zu spawnen, um Überfüllung zu vermeiden.
+
+ - Wenn auf \`true\` gesetzt, folgt der Spawner dem Vanilla-Verhalten, das das Spawnen neuer Mobs verhindert, wenn die Anzahl der Mobs in der Nähe das Limit überschreitet.
+ - Wenn auf \`false\` gesetzt, versucht der Spawner immer zu spawnen, ohne die Anzahl der Mobs in der Nähe zu prüfen.
+
`
+ },
+ "check-for-nearby-players": {
+ default: true,
+ desc: `Ob überprüft werden soll, ob sich Spieler in einem Radius befinden, um den Mob zu spawnen.
+
+ - Wenn auf \`true\` gesetzt, versucht der Spawner immer, Mobs zu spawnen, ohne zu prüfen, ob ein Spieler in der Nähe ist.
+ - Wenn auf \`false\` gesetzt, versucht der Spawner nur dann Mobs zu spawnen, wenn ein Spieler im Radius ist.
+
`
+ },
+ "spawner-block-checks": {
+ default: false,
+ desc: "Ob Spawn-Versuche verhindert werden sollen, wenn der Spawn-Punkt durch Blöcke blockiert ist."
+ },
+ "water-prevent-spawn-check": {
+ default: false,
+ desc: "Ob Spawn-Versuche verhindert werden sollen, wenn der Spawn-Punkt Wasser enthält."
+ },
+ "ignore-spawn-rules": {
+ default: false,
+ desc: `Ob zusätzliche Spawn-Regeln von Mobs ignoriert werden sollen.
+
+ Viele Mobs haben Spawn-Beschränkungen, dass sie nur auf bestimmten Blöcken spawnen oder nicht spawnen können. Zum Beispiel können die meisten Tiere nur auf Grasblöcken spawnen, oder der Hoglin kann nicht auf Netherwarzen-Blöcken spawnen. Du findest die Liste zusätzlicher Spawn-Regeln unter [Additional Rules](https://minecraft.wiki/w/Mob_spawning#:~:text=additional%20rules).
+
+ Diese Option beeinflusst nicht die obigen Optionen \`spawner-block-checks\` und \`water-prevent-spawn-check\` und ist von diesen getrennt.`
+ }
+ },
+ "min-spawn-delay": {
+ default: 200,
+ desc: `Die minimale Verzögerung zwischen jedem Spawn-Versuch des Spawners. Höhere Werte verlangsamen die Spawning-Geschwindigkeit von Spawnern.
+ (Einheit: Tick)`
+ },
+ "max-spawn-delay": {
+ default: 800,
+ desc: `Die maximale Verzögerung zwischen jedem Spawn-Versuch des Spawners. Höhere Werte verlangsamen die Spawning-Geschwindigkeit von Spawnern.
+ (Einheit: Tick)`
+ }
+ },
+ "use-spigot-item-merging-mechanism": {
+ default: false,
+ desc: `Ob fallen gelassene Items basierend auf ihrer Tick-Reihenfolge zusammengeführt (gemerged) werden sollen, was das langjährige Standardverhalten von Spigot ist.
+
+ In Spigot wird das Item-Entity, das später tickt, in das früher tickende zusammengeführt. Wenn der Merge-Radius relativ größer ist, kann dies verhindern, dass fallen gelassene Items an unerwarteten Orten stecken bleiben. Dies ist nützlich für Farmen oder Redstone-Bauten, die zahlreiche fallen gelassene Items erzeugen können.
+ In Vanilla basiert das Zusammenführen von Items jedoch auf der Item-Anzahl des Stacks. Der Stack mit der kleineren Anzahl wird mit dem mit der größeren Anzahl zusammengeführt.
+
+ | Werte für Ziele | |
+ | SMP-freundlich | true |
+ | Vanilla-Verhalten | false |
+
`
+ }
+ },
+
+ network: {
+ __desc__: "Dieser Abschnitt enthält Funktionen, die sich auf das Server-Netzwerk beziehen.",
+ "async-switch-state": {
+ default: false,
+ desc: "Ob die Logik zum Umschalten des Verbindungsstatus des Spielers asynchron verarbeitet werden soll. Dies kann das Problem der Blockierung des Haupt-Threads beheben, das durch die Nutzung von Exploits aufgrund eines Designfehlers in der Vanilla-Logik verursacht wird."
+ },
+ "chat-message-signature": {
+ default: true,
+ desc: `Ob die Chatnachrichten-Signatur aktiviert werden soll, die in Minecraft 1.19.1 eingeführt wurde.
+
+ - Wenn auf \`true\` gesetzt, werden Nachrichten signiert und können wie in Vanilla gemeldet werden.
+ - Wenn auf \`false\` gesetzt, ist die Chat-Signatur deaktiviert. Spieler können Nachrichten nicht melden, und das Pop-up mit der Warnung vor unsicheren Nachrichten wird deaktiviert, wenn der Spieler dem Server beitritt.
+
+
+ __⚡Empfohlener Wert: \`false\`__ (Nur für Offline-Mode-Server oder Server, die alternative Moderationsmethoden haben)`
+ },
+ OptimizeNonFlushPacketSending: {
+ default: false,
+ desc: `Ob das Senden von nicht-geflushten Paketen optimiert werden soll, indem Nettys [\`lazyExecute\`](https://netty.io/4.2/api/io/netty/util/concurrent/SingleThreadEventExecutor.html#lazyExecute(java.lang.Runnable))-Methode verwendet wird. Dies kann Thread-Konkurrenz und Wakeup-Aufrufe für bestimmte Arten von Netzwerkoperationen reduzieren.
+
+
Warnung
+ Diese Option ist bekannt dafür, __INKOMPATIBEL__ mit ProtocolLib zu sein und kann Probleme mit anderen Plugins verursachen, die Netzwerkpakete intensiv manipulieren.
+ Erfordert einen Neustart des Servers, um wirksam zu werden. Mit extremer Vorsicht verwenden.
+
`
+ },
+ "protocol-support": {
+ __desc__: `Dieser Abschnitt enthält Funktionen, die zusätzliche Protokoll-Unterstützung für einige QoL- / Utility-Mods bieten.
+
+ Die zusätzliche Protokoll-Unterstützung funktioniert nur, wenn eine entsprechende clientseitige Mod installiert ist. Das bedeutet, wenn eine bestimmte Protokoll-Unterstützung aktiviert ist und ein Spieler diese Mod auf dem Client installiert hat, kann er die zusätzlichen Funktionen nutzen, die in jeder Konfiguration unten beschrieben sind. Aber für Spieler, die keine entsprechende Mod installiert haben, bleibt alles wie zuvor.
+
+
Achtung
+ Die Protokoll-Unterstützung kann zu Inkompatibilität mit [ViaVersion](https://modrinth.com/plugin/viaversion) führen.
+ Wir empfehlen Spielern, einen Client zu verwenden, der dieselbe Version wie der Server-Core hat, und die neueste entsprechende Mod zu installieren; andernfalls können sie dem Server möglicherweise nicht beitreten.
+
`,
+ "jade-protocol": {
+ default: false,
+ desc: `Ob die [Jade](https://modrinth.com/mod/jade)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die Jade-Mod installiert haben, Item-Informationen in Lagercontainern, den Fortschritt von Öfen und Brauständen, Nahrung auf dem Lagerfeuer, Bienendaten im Bienenstock und weitere vanilla-freundliche Funktionen anzeigen lassen.`
+ },
+ "appleskin-protocol": {
+ default: false,
+ desc: `Ob die [AppleSkin](https://modrinth.com/mod/appleskin)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die AppleSkin-Mod installiert haben, die genauen Sättigungs-/Erschöpfungswerte auf dem Client anzeigen lassen.`
+ },
+ "appleskin-protocol-sync-tick-interval": {
+ default: 20,
+ desc: `Wie oft der Server AppleSkin-Daten mit Clients synchronisieren soll, die AppleSkin installiert haben.
+ Dies hat nur Auswirkungen, wenn \`appleskin-protocol\` oben \`true\` ist.
+ (Einheit: Tick, Standardwert 20 Ticks = 1 Sekunde)`
+ },
+ "asteorbar-protocol": {
+ default: false,
+ desc: `Ob die [AsteorBar](https://modrinth.com/mod/asteorbar)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die AsteorBar-Mod installiert haben, die genauen Sättigungs-/Erschöpfungswerte auf dem Client anzeigen lassen.`
+ },
+ "chatimage-protocol": {
+ default: false,
+ desc: `Ob die [ChatImage](https://modrinth.com/mod/chatimage)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die ChatImage-Mod installiert haben, das Bild sehen, das von anderen im CICode-Format gesendet wurde.`
+ },
+ "xaero-map-protocol": {
+ default: false,
+ desc: `Ob die [XaeroMap](https://modrinth.com/mod/xaeros-minimap)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die Xaero's MiniMap Mod oder Xaero's WorldMap Mod installiert haben, Koordinatenpunkte und Todespunkte basierend auf der \`protocol-support.xaero-map-server-id\` des Servers unten speichern.`
+ },
+ "xaero-map-server-id": {
+ default: 513317,
+ desc: `Eindeutige Nummer-ID für XaeroMap, um den Server zu identifizieren.
+ Dies kann verhindern, dass Punkte gelöscht/aktualisiert werden, wenn sich der Servername oder die IP-Adresse ändert. Ändere diesen Wert bei Bedarf.
+ Dieser Wert wird beim ersten Serverstart zufällig generiert.`
+ },
+ "syncmatica-protocol": {
+ default: false,
+ desc: `Ob die [Syncmatica](https://modrinth.com/mod/syncmatica)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können Spieler, die die Syncmatica-Mod installiert haben, ihre [Litematica](https://modrinth.com/mod/litematica)-Schematic-Dateien hochladen oder geteilte Schematic-Dateien vom Server herunterladen. Jeder Spieler mit installierter Syncmatica-Mod kann auf geteilte Schematics zugreifen, die von anderen hochgeladen wurden.`
+ },
+ "syncmatica-quota": {
+ default: false,
+ desc: "Ob das maximale Dateigrößenlimit für jede geteilte Schematic-Datei der Litematica-Mod aktiviert werden soll."
+ },
+ "syncmatica-quota-limit": {
+ default: 40000000,
+ desc: `Die maximale Dateigröße jeder geteilten Schematic-Datei, die auf den Server hochgeladen wird.
+ (Einheit: Byte, Standardwert 40.000.000 Bytes ≈ 38 MB)`
+ },
+ "do-a-barrel-roll-protocol": {
+ default: false,
+ desc: `Ob die [Do a Barrel Roll](https://modrinth.com/mod/do-a-barrel-roll)-Protokoll-Unterstützung aktiviert werden soll.
+ Wenn auf \`true\` gesetzt, können die visuellen Effekte von Do a Barrel Roll mit anderen Spielern synchronisiert werden, die diese Mod installiert haben.`
+ },
+ "do-a-barrel-roll-allow-thrusting": {
+ default: false,
+ desc: "Ob Spielern erlaubt werden soll, die Option \`enable_thrust\` in ihrer Client-Konfiguration zu aktivieren."
+ },
+ "do-a-barrel-roll-force-enabled": {
+ default: false,
+ desc: "Ob die Mod für alle Spieler, die diese Mod installiert haben, zwangsweise aktiviert werden soll, unabhängig von ihrer Client-Konfiguration."
+ },
+ "do-a-barrel-roll-force-installed": {
+ default: false,
+ desc: "Ob Spieler abgewiesen werden sollen, wenn sie diese Mod nicht in ihrem Client installiert haben."
+ },
+ "do-a-barrel-roll-installed-timeout": {
+ default: 0,
+ desc: `Die Zeitspanne, die gewartet werden soll, bis ein Client auf das \`do_a_barrel_roll:config_sync\`-Paket antwortet.
+ (Einheit: Tick)
+ Wenn auf \`true\` gesetzt, werden Spieler, die diese Mod nicht in ihrem Client installiert haben, nach Ablauf dieses Timeouts gekickt.`
+ }
+ }
+ },
+
+ misc: {
+ __desc__: "Dieser Abschnitt enthält einige sonstige Funktionen.",
+ cache: {
+ "profile-lookup": {
+ enabled: {
+ default: false,
+ desc: `Ob Profil-Datenabfragen (Skins, Texturen usw.) zwischengespeichert (gecached) werden sollen, um API-Aufrufe an Mojang zu reduzieren.
+ Dies ermöglicht es Spielern, dem Server unter Verwendung gecachter Daten wieder beizutreten, selbst wenn der Mojang-Authentifizierungsserver vorübergehend nicht verfügbar ist.`
+ },
+ timeout: {
+ default: 1440,
+ desc: `Der Timeout des Profil-Daten-Caches.
+ Sobald gecachte Profildaten nach dem Timeout ablaufen, wird der Cache ungültig, und der Server ruft das Profil erneut vom Mojang-Server ab, um sicherzustellen, dass die Profildaten aktualisiert sind.
+ (Einheit: Minute, Standardwert 1440 Minuten = 24 Stunden)`
+ },
+ "max-size": {
+ default: 8192,
+ desc: "Die maximale Anzahl an Profilen, die gecached werden sollen."
+ }
+ }
+ },
+ "connection-message": {
+ __desc__: `Die Verbindungsnachricht wird an alle Online-Spieler gesendet, wenn sie dem Server beitreten oder ihn verlassen.
+ Die Nachricht muss das [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/)-Format verwenden.
+ Wenn \`message\` unten auf \`default\` gesetzt ist, wird die Vanilla-Beitritts-/Verlassensnachricht verwendet.
+ Wenn \`enabled\` unten auf \`false\` gesetzt ist, wird die Verbindungsnachricht deaktiviert, und ein anderes Plugin wird verwendet, um die Verbindungsnachricht zu senden.
+
+ Verfügbare Platzhalter:
+
+ - __\`\`__ - Spielername.
+ - __\`\`__ - Anzeigename des Spielers.
+
+
+
API / Plugin-Freundlich
+ Diese Funktion ist API- / Plugin-freundlich. Das bedeutet, dass der Inhalt der Verbindungsnachricht von Plugins überschrieben werden kann, die \`PlayerJoinEvent\` oder \`PlayerQuitEvent\` verwenden.
+
`,
+ join: {
+ enabled: {
+ default: true,
+ desc: "Ob eine Nachricht gesendet werden soll, wenn der Spieler beitritt."
+ },
+ message: {
+ default: "default",
+ desc: "Die Beitrittsnachricht des Spielers."
+ }
+ },
+ quit: {
+ enabled: {
+ default: true,
+ desc: "Ob eine Nachricht gesendet werden soll, wenn der Spieler den Server verlässt."
+ },
+ message: {
+ default: "default",
+ desc: "Die Verlassensnachricht des Spielers."
+ }
+ }
+ },
+ "including-5s-in-get-tps": {
+ default: true,
+ desc: `Ob 5-Sekunden-TPS in das Ergebnis der API \`Bukkit#getTPS\` und \`Server#getTPS\` aufgenommen werden sollen.
+ Befehle wie \`/tps\` zeigen dies unabhängig davon an.
+
+ - Wenn auf \`true\` gesetzt, kannst du die \`getTPS\`-Methode verwenden, um ein TPS-Long-Array mit 4 Elementen \`[5s, 1m, 5m, 15m]\` zu erhalten.
+ - Wenn auf \`false\` gesetzt, kannst du die \`getTPS\`-Methode verwenden, um ein TPS-Long-Array mit 3 Elementen \`[1m, 5m, 15m]\` zu erhalten.
+
+
+ Möchtest du tiefer eintauchen?
+ Wenn du die Leaf API für deine Plugins verwendest. Oder auf Leaf läufst und Reflection verwendest, um TPS zu erhalten, kannst du \`Bukkit#getTPSIncluding5SecondAverage\` verwenden, um das TPS-Array einschließlich 5-Sekunden-TPS \`[5s, 1m, 5m, 15m]\` zu erhalten.
+ Außerdem kannst du \`Bukkit#get5SecondTPSAverage\` verwenden, um den Durchschnittswert der 5-Sekunden-TPS als \`double\` zu erhalten.
+ `
+ },
+ "lag-compensation": {
+ enabled: {
+ default: false,
+ desc: `Die Lag-Kompensation wurde entwickelt, um die Auswirkungen von Server-Lag-Spikes oder niedrigen TPS-Situationen auf das Gameplay zu mildern, was das grundlegende Spielerlebnis während des Lags sicherstellen könnte.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "enable-for-water": {
+ default: false,
+ desc: `Ob Lag-Kompensation für fließendes Wasser aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "enable-for-lava": {
+ default: false,
+ desc: `Ob Lag-Kompensation für fließende Lava aktiviert werden soll.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ }
+ },
+ "remove-change-non-editable-sign-warning": {
+ default: false,
+ desc: `Ob der Server eine Warnmeldung ausgibt, wenn Spieler versuchen, ein Schild zu bearbeiten, das sie nicht bearbeiten dürfen.
+ Die Warnmeldung sieht so aus: \`Player [...] just tried to change non-editable sign\`.
+ Wenn auf \`true\` gesetzt, verhindert dies Konsolen-Spam, der durch Spieleraktionen oder andere Fälle verursacht wird.
+
+ __⚡Empfohlener Wert: \`true\`__`
+ },
+ "remove-spigot-check-bungee-config": {
+ default: false,
+ desc: `Ob der Spieler über einen Proxy auf den Backend-Server gelangen kann, ohne dass der Backend-Server den BungeeCord-Modus in \`spigot.yml\` aktiviert hat.
+
+
Warnung
+ Es wird nicht empfohlen, diese Option zu ändern, es sei denn, du bist sicher, was du tust.
+ Und sie könnte in Zukunft entfernt werden.
+
`
+ },
+ "secure-seed": {
+ enabled: {
+ default: false,
+ desc: `Ob der sichere Seed (Secure Seed) verwendet werden soll.
+
+ Der sichere Seed stellt sicher, dass alle Erze und Strukturen mit einem 1024-Bit-Seed unter Verwendung einer kryptografischen Hash-Funktion mit hoher Sicherheit generiert werden, anstatt einen 64-Bit-Seed wie in Vanilla zu verwenden. Dies schützt die Struktur-Seeds durch rechnerische Sicherheit und macht das Seed-Cracking nahezu unmöglich.
+
+
Warnung
+ Der sichere Seed ändert grundlegend die Positionen von Erzen und Strukturen im Vergleich zu Vanilla.
+ Dies gilt nur für neu generierte Chunks. Daher musst du eine neue Welt vorbereiten, wenn du diese Option aktivieren möchtest.
+ Sobald diese Option aktiviert ist, kannst du sie nicht deaktivieren, um zur Vanilla-Generierung zurückzukehren, es sei denn, du generierst die gesamte Welt vor, da neu generierte Chunks sonst Terrain-Unstimmigkeiten aufweisen.
+
`
+ }
+ },
+ sentry: {
+ __desc__: `[Sentry](https://sentry.io/welcome/) ist ein Anwendungsüberwachungsdienst für verbesserte Fehlerprotokollierung und -verfolgung. Hilft dem Server-Entwicklerteam bei der besseren Wartung.
+
+ Nach der Aktivierung der Sentry-Integration für deinen Server musst du keine langen Logs mehr manuell prüfen, um Fehler zu finden. Sentry kann Fehler sammeln, die auf deinem Server aufgetreten sind, ermöglicht es dir, Fehler im Web-Panel von Sentry zu verfolgen, und hilft dir, diese einfacher und schneller zu lokalisieren und zu beheben.
+
+ Siehe __[How to Setup Sentry](../how-to/setup-sentry)__, um zu erfahren, wie du es einrichtest und den DSN-Key für \`sentry.dsn\` unten erhältst.
`,
+ dsn: {
+ default: "''",
+ desc: `Der DSN-Key deines Sentry.
+ Wenn ein leerer Wert \`''\` angegeben wird, ist Sentry deaktiviert.`
+ },
+ "log-level": {
+ default: "WARN",
+ desc: `Logs mit einem Level höher oder gleich diesem Level werden aufgezeichnet.
+ Die gültigen Werte für diese Option sind: \`"WARN"\`, \`"ERROR"\` und \`"FATAL"\`.`
+ },
+ "only-log-thrown": {
+ default: true,
+ desc: "Ob Sentry nur Logs mit Javas \`Throwable\` aufzeichnet."
+ }
+ },
+ rebrand: {
+ "server-mod-name": {
+ default: "Leaf",
+ desc: "Der Server-Markenname, der im F3-Debug-Menü des Clients und in der Server-MOTD angezeigt wird."
+ },
+ "server-gui-name": {
+ default: "Leaf Console",
+ desc: "Der Titel, der im Server-GUI-Fenster angezeigt wird, wenn du den Server ohne die Option \`--nogui\` im Start-Flag gestartet hast."
+ }
+ },
+ message: {
+ "unknown-command": {
+ default: "default",
+ desc: `Die Nachricht für unbekannte Befehle, die an den Spieler gesendet wird, wenn er einen unbekannten Befehl ausführt.
+ Die Nachricht muss das [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/)-Format verwenden.
+ Wenn auf \`default\` gesetzt, wird die Vanilla-Nachricht für unbekannte Befehle verwendet.
+
+ Verfügbare Platzhalter:
+
+ - __\`\`__ - die detaillierten Informationen des unbekannten Befehls.
+
+
+
API / Plugin-Freundlich
+ Diese Funktion ist API- / Plugin-freundlich. Das bedeutet, dass diese Nachricht von Plugins überschrieben werden kann, die \`UnknownCommandEvent#message\` oder \`UnknownCommandEvent#setMessage\` verwenden.
+
`
+ }
+ },
+ "vanilla-username-check": {
+ "remove-all-check": {
+ default: false,
+ desc: `Ob die Vanilla-Benutzernamenprüfung entfernt werden soll, was alle Zeichen als Benutzernamen erlaubt, einschließlich chinesischer Zeichen usw.
+
+
Experimentell
+ Das Entfernen aller Benutzernamenprüfungen ist __UNSICHER UND GEFÄHRLICH, VERWENDUNG AUF EIGENE GEFAHR!__
+
`
+ },
+ "enforce-skull-validation": {
+ default: true,
+ desc: "Ob die Schädel-Validierung erzwungen werden soll, um zu verhindern, dass Schädel mit ungültigen Namen die Verbindung des Clients trennen."
+ },
+ "allow-old-players-join": {
+ default: false,
+ desc: `Ob alten Spielern erlaubt werden soll, dem Server beizutreten, nachdem der Benutzernamen-Regex geändert wurde, auch wenn ihre Namen die neuen Anforderungen nicht erfüllen.
+
+
Experimentell
+ Das Entfernen aller Benutzernamenprüfungen für alte Spieler ist __UNSICHER UND GEFÄHRLICH, VERWENDUNG AUF EIGENE GEFAHR!__
+
`
+ },
+ "use-username-regex": {
+ default: false,
+ desc: `Ob der Benutzername-Regex zur Validierung von Benutzernamen verwendet werden soll, wodurch nur im Regex spezifizierte Zeichen erlaubt sind.
+ Diese Option ist inkompatibel mit \`remove-all-check\` oben. Du kannst nur eine dieser beiden Optionen verwenden.`
+ },
+ "username-regex": {
+ default: "^[a-zA-Z0-9_.]*$",
+ desc: `Der Benutzername-Regex legt fest, welche Zeichen in Benutzernamen erlaubt sind.
+ Dies hat nur Auswirkungen, wenn \`use-username-regex\` oben \`true\` ist.`
+ }
+ }
+ }
+};
+
+export default config;
diff --git a/pages/de/docs/config/gale-global.md b/pages/de/docs/config/gale-global.md
index f41aa81..02de454 100644
--- a/pages/de/docs/config/gale-global.md
+++ b/pages/de/docs/config/gale-global.md
@@ -12,6 +12,6 @@ const data = {
Diese YAML Konfiguration zeigt die standardmäßige Struktur der Konfigurationswerte der globalen Konfiguration von Gale (`config/gale-global.yml`)
-Klicke auf die Pfeile hinter den Konfigurationswerten um die entsprechende Beschreibung anzusehen
+Klicke auf die Pfeile hinter den Konfigurationswerten, um die entsprechende Beschreibung anzusehen
diff --git a/pages/de/docs/config/gale-world-defaults.md b/pages/de/docs/config/gale-world-defaults.md
index 3f10aa3..20afaf2 100644
--- a/pages/de/docs/config/gale-world-defaults.md
+++ b/pages/de/docs/config/gale-world-defaults.md
@@ -12,6 +12,6 @@ const data = {
Diese YAML Konfiguration zeigt die standardmäßige Struktur der Konfigurationswerte der weltspezifischen Konfiguration von Gale (`config/gale-world-defaults.yml`)
-Klicke auf die Pfeile hinter den Konfigurationswerten um die entsprechende Beschreibung anzusehen
+Klicke auf die Pfeile hinter den Konfigurationswerten, um die entsprechende Beschreibung anzusehen
diff --git a/pages/de/docs/config/guides/dab-blacklist-format.md b/pages/de/docs/config/guides/dab-blacklist-format.md
new file mode 100644
index 0000000..271a337
--- /dev/null
+++ b/pages/de/docs/config/guides/dab-blacklist-format.md
@@ -0,0 +1,36 @@
+# Du möchtest tiefer eintauchen?
+
+Die Option `dab.blacklisted-entities` akzeptiert alle gültigen YAML Listenformate.
+
+Wenn nur ein Entity zur Blacklist hinzugefügt werden soll, sind diese Formate erlaubt:
+
+```yaml
+dab:
+ blacklisted-entities: [villager]
+```
+
+or
+
+```yaml
+dab:
+ blacklisted-entities:
+ - villager
+```
+
+Wenn mehrere Entities zur Blacklist hinzugefügt werden sollen, sind diese Formate erlaubt:
+
+```yaml
+dab:
+ blacklisted-entities: [villager, zombified_piglin]
+```
+
+or
+
+```yaml
+dab:
+ blacklisted-entities:
+ - villager
+ - zombified_piglin
+```
+
+Wenn du dir nicht sicher bist, nutze den [YAML Checker](https://yamlchecker.org/) oder andere Online-Tools, um die Syntax zu überprüfen.
diff --git a/pages/de/docs/config/leaf-global.md b/pages/de/docs/config/leaf-global.md
new file mode 100644
index 0000000..759f26d
--- /dev/null
+++ b/pages/de/docs/config/leaf-global.md
@@ -0,0 +1,21 @@
+
+
+# Globale Leaf Konfiguration
+
+Diese YAML Konfiguration zeigt die standardmäßige Struktur der Konfigurationswerte der globalen Konfiguration von Leaf (`config/leaf-global.yml`)
+
+Klicke auf die Pfeile hinter den Konfigurationswerten, um die entsprechende Beschreibung anzusehen
+
+Ein Hot-Reload kann mit `/leaf reload` durchgeführt werden. Hot-Reload wird für asynchrone Optionen **nicht unterstützt**.
+
+
diff --git a/pages/de/docs/config/misc-config.md b/pages/de/docs/config/misc-config.md
deleted file mode 100644
index cda0ab4..0000000
--- a/pages/de/docs/config/misc-config.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Weitere Konfigurationen
-
-Aus irgendeinem Grund verändert Leaf auch manche Konfigurationseinträge in den Konfigurationen der Upstreams
-
-## Weltspezifische Paper Konfiguration
-
-```yaml title="paper-world-defaults.yml"
-entities:
- spawning:
- spawning-throttle:
- failed-attempts-threshold: disabled
- throttled-ticks-per-spawn:
- ambient: -1
- axolotls: -1
- creature: -1
- monster: -1
- underground_water_creature: -1
- water_ambient: -1
- water_creature: -1
-```
-
-## Purpur Konfiguration
-
-```yaml title="purpur.yml"
-settings:
- messages:
- afk-broadcast-away: %s is now AFK
- afk-broadcast-back: %s is no longer AFK
- afk-title-away: AFK:You are now AFK...:10:70:20
- afk-broadcast-use-display-name: false
- afk-tab-list-prefix: "[AFK] "
- afk-tab-list-suffix: ""
- afk-command-cooldown: 0
- afk-command-cooldown-msg: You need to wait %time%s to use /afk.
-```
-
-## Verschobene Pufferfish & Purpur Konfigurationseinträge
-
-### Pufferfish
-
-| | Vorher | Nachher |
-| --- | ------ | ------- |
-| | | |
-| | | |
-| | | |
-| | | |
-
-### Purpur
-
-| | Vorher | Nachher |
-| --- | ------ | ------- |
-| | | |
-| | | |
-| | | |
-| | | |
diff --git a/pages/de/docs/config/system-properties.md b/pages/de/docs/config/system-properties.md
index 86f6dc2..dd05602 100644
--- a/pages/de/docs/config/system-properties.md
+++ b/pages/de/docs/config/system-properties.md
@@ -10,7 +10,7 @@ Mithilfe dieses JVM Arguments kann ein anderes Mirror Repository for SpigotLibra
Verwende zum Beispiel das folgende Argument, um das Aliyun-Repository als Maven-Mirror festzulegen. Dadurch können Server auf dem chinesischen Festland Bibliotheken schneller herunterladen.
-```
+```bash
-DLeaf.library-download-repo=https://maven.aliyun.com/repository/public
```
diff --git a/pages/de/docs/dev/api.md b/pages/de/docs/dev/api.md
index 22d9493..a565ec4 100644
--- a/pages/de/docs/dev/api.md
+++ b/pages/de/docs/dev/api.md
@@ -46,6 +46,7 @@ Das Dev Bundle ist ein von paperweight bereitgestelltes Tool, mit dem du währen
Wie du es einrichtest und weitere Details findest du unter [paperweight-userdev](https://docs.papermc.io/paper/dev/userdev/).
Um das von Leaf bereitgestellte dev Bundle verwenden zu können, musst du die im obigen Tutorial angegebene Abhängigkeit wie folgt anpassen.
+
::: code-group
```kotlin [build.gradle.kts]
diff --git a/pages/de/docs/faq.md b/pages/de/docs/faq.md
index b8c2dd5..8fd4ce0 100644
--- a/pages/de/docs/faq.md
+++ b/pages/de/docs/faq.md
@@ -2,7 +2,7 @@
## ❓ · Wie viel schneller ist Leaf als `""`?
-Weitere Informationen finden Sie unter [Entity Performance](benchmark/entity-performance.md) und [Chunk gen/load Performance](benchmark/chunk-generation.md). In Zukunft werden wir detailliertere und verlässlichere Performance-Benchmarks bereitstellen!
+Weitere Informationen findest du unter [Entity Performance](benchmark/entity-performance.md) und [Chunk gen/load Performance](benchmark/chunk-generation.md). In Zukunft werden wir detailliertere und verlässlichere Performance-Benchmarks bereitstellen!
## ❓ · Unterstützt Leaf Spigot/Paper plugins?
@@ -35,5 +35,7 @@ Es handelt sich um unterschiedliche Mappings. Mojmap verwendet die Mojang-Mappin
Jeder kann über unser [Open Collective](https://opencollective.com/Winds-Studio) oder [Dreeam's AFDIAN](https://afdian.com/a/Dreeam) (unterstützt PayPal / Stripe) spenden.
:::info Hinweis
+
Fehlt etwas in diesem _FAQ_? [Schreib es hier](getting-started.md#📫-kontakt)!
+
:::
diff --git a/pages/de/docs/getting-started.md b/pages/de/docs/getting-started.md
index d187d56..e13bfba 100644
--- a/pages/de/docs/getting-started.md
+++ b/pages/de/docs/getting-started.md
@@ -1,8 +1,10 @@
# Wilkommen bei der Dokumentation von Leaf
:::warning IN ARBEIT
-Diese Dokumentation ist aktuell noch in Arbeit
+
+Diese Dokumentation ist aktuell noch in Arbeit!
Weitere Informationen sind auf unserem [Discord server](https://discord.gg/gfgAwdSEuM) erhältlich
+
:::
Leaf ist ein Paper-Fork mit dem Ziel, die Balance zwischen Leistung, Stabilität und Vanilla-Gameplay zu finden. Leaf wurde für große Netzwerke und Szenarien mit hohen Anforderungen konzipiert
diff --git a/pages/de/docs/how-to/java-flags.md b/pages/de/docs/how-to/java-flags.md
new file mode 100644
index 0000000..f4b84e1
--- /dev/null
+++ b/pages/de/docs/how-to/java-flags.md
@@ -0,0 +1,216 @@
+# Java Flags für Server
+
+## Bevor du beginnst: Wichtige Grundlagen
+
+Eine korrekte Optimierung erfordert ein methodisches Vorgehen. **Beziehe dich auf die detaillierten Schritte im Guide ["Optimize Your Leaf Server"](../how-to/optimize-leaf-server.md), um zu verstehen, _wie_ diese grundlegenden Maßnahmen umzusetzen sind.** Zusammengefasst gilt immer:
+
+1. **Backup deines Servers:** Erstelle vor jeder Änderung ein vollständiges Backup. (Für diesen Guide nicht zwingend nötig, aber eine bewährte Praxis.)
+2. **Profiling statt Raten:** Nutze Tools wie [Spark](https://spark.lucko.me/), um echte Bottlenecks (niedrige TPS, Lag-Spikes) zu identifizieren, bevor du Einstellungen änderst. Das verlinkte Dokument erklärt, wie du Spark für allgemeinen Lag und spezifische Spikes verwendest.
+3. **Schrittweise Änderungen:** Ändere immer nur wenige zusammenhängende Einstellungen gleichzeitig, starte den Server neu und teste anschließend.
+
+## Auswahl deiner Java Runtime Environment (JRE/JDK)
+
+- **Empfehlung:** Verwende eine aktuelle Java-21-Long-Term-Support-(LTS)-Version von einem seriösen OpenJDK-Anbieter, die die gewünschten GC-Optionen enthält (G1GC ist Standard, ZGC und Shenandoah können je nach Anbieter leicht variieren, sind aber in großen Builds wie Temurin, Corretto oder GraalVM üblich). Gute Optionen sind:
+ - **Adoptium Eclipse Temurin:** Weit verbreitetes, von der Community unterstütztes Build mit reinen OpenJDK-Binaries.
+ - **Amazon Corretto:** Gut unterstützte, produktionsreife OpenJDK-Distribution mit Langzeit-Support.
+ - **GraalVM (basierend auf OpenJDK):** Bietet potenzielle Performance-Vorteile durch den fortschrittlichen Graal Just-In-Time (JIT) Compiler. Kann sich jedoch anders verhalten als Standard-HotSpot-JVMs und unter Umständen Kompatibilitätsbesonderheiten haben. Teste gründlich, wenn du GraalVM wählst. **Die Nutzung von GraalVM ermöglicht spezielle JIT-Tuning-Optionen, die weiter unten beschrieben werden.**
+- **Vermeide:** Headless-Varianten (oft mit `-headless` gekennzeichnet), da ihnen Komponenten fehlen können, die Minecraft-Server benötigen. Verwende das vollständige JDK (Java Development Kit).
+
+## Java Startup Flags (JVM Arguments) – Garbage Collection
+
+Java Flags steuern das Verhalten der JVM, insbesondere das Memory Management (Garbage Collection – GC) und Performance-Optimierungen. Dieser Abschnitt konzentriert sich auf GC-Tuning.
+
+### Die Basis: Aikar’s Flags (G1GC)
+
+- **Zweck:** Aikar’s Flags sind ein bekannter Satz von Argumenten, die speziell für Minecraft-Server mit dem Garbage-First Garbage Collector (G1GC) optimiert sind. G1GC ist der Standard-GC in modernen Java-Versionen und bietet in der Regel ein gutes Gleichgewicht zwischen Throughput (wie viel Arbeit der Server erledigt) und Pausenzeiten (wie lange der Server während GC stoppt).
+- **Eignung:** Diese Flags sind ein hervorragender Ausgangspunkt und funktionieren gut für **die meisten Server** (ungefähr bis 1–100 Spieler). Ziel ist es, Lag-Spikes durch GC-Pausen zu reduzieren, indem G1GC gezielt auf die typischen Objekt-Allokationsmuster von Minecraft (viele kurzlebige Objekte) abgestimmt wird.
+- **Java 21+ Aikar’s Flags (mit G1GC):**
+
+ ```bash
+ java -XmsM -XmxM \
+ -XX:+UseG1GC \
+ -XX:+ParallelRefProcEnabled \
+ -XX:MaxGCPauseMillis=200 \
+ -XX:+UnlockExperimentalVMOptions \
+ -XX:+DisableExplicitGC \
+ -XX:+AlwaysPreTouch \
+ -XX:G1NewSizePercent=30 \
+ -XX:G1MaxNewSizePercent=40 \
+ -XX:G1HeapRegionSize=8M \
+ -XX:G1ReservePercent=20 \
+ -XX:G1HeapWastePercent=5 \
+ -XX:G1MixedGCCountTarget=4 \
+ -XX:InitiatingHeapOccupancyPercent=15 \
+ -XX:G1MixedGCLiveThresholdPercent=90 \
+ -XX:G1RSetUpdatingPauseTimePercent=5 \
+ -XX:SurvivorRatio=32 \
+ -XX:+PerfDisableSharedMem \
+ -XX:MaxTenuringThreshold=1 \
+ -Dusing.aikars.flags=https://mcflags.emc.gs \
+ -Daikars.new.flags=true \
+ -jar your-server-jar-file.jar nogui
+ ```
+
+ - Ersetze `` durch die gewünschte RAM-Menge (z. B. `10240` für 10GB).
+ - **Wichtig:** Setze `-Xms` und `-Xmx` auf **denselben Wert**.
+ - `-XX:+AlwaysPreTouch`: Allokiert Speicherseiten im Voraus.
+ - **Hinweis:** Verwende `/spark health` oder `/spark gcmonitor` im Spiel, um tatsächliche Heap-Nutzung und GC-Performance zu sehen.
+
+### Skalierung: Low-Latency Generational GCs (150+)
+
+Für sehr große oder aktive Server (150–300 Spieler) wird die schiere **Objekt-Allokationsrate** zur größten Herausforderung. Minecraft erzeugt enorme Mengen temporärer Daten (Spielerbewegungen, AI-Berechnungen, Block-Updates usw.), die schnell zu Garbage werden. Während G1GC damit relativ gut umgehen kann, können die Pausenzeiten unter extremer Last dennoch spürbar werden. Java 21 bietet fortschrittliche Low-Latency-GCs mit _generationalen_ Fähigkeiten, die speziell darauf ausgelegt sind, hohe Allokationsraten kurzlebiger Objekte effizient zu verarbeiten und dabei minimale Pausen zu verursachen.
+
+- **Generational ZGC (GZGC):**
+ - **Warum:** Kombiniert ZGCs nebenläufige Ultra-Low-Latency-Performance mit einer generationalen Heap-Struktur. Die Young Generation, in der die meisten Objekte sterben, wird häufig gesammelt, wodurch Full-Heap-Scans reduziert und hohe Allokationsraten besser bewältigt werden als beim älteren, nicht-generationalen ZGC.
+ - **Eignung:** Hervorragend für leistungsstarke Server (hohe Kernanzahl, 16GB+ RAM empfohlen), bei denen minimale Pausenzeiten höchste Priorität haben.
+ - **Beispiel-Flags (Java 21):**
+
+ ```bash
+ java -XmsM -XmxM \
+ -XX:+UnlockExperimentalVMOptions \
+ -XX:+UseZGC \
+ -XX:+ZGenerational \
+ -XX:+AlwaysPreTouch \
+ -XX:+DisableExplicitGC \
+ -XX:+PerfDisableSharedMem \
+ -XX:+UseDynamicNumberOfGCThreads \
+ -jar your-server-jar-file.jar nogui
+ ```
+
+ - `-XX:+UseZGC -XX:+ZGenerational`: Aktiviert Generational ZGC. (Wird ab Java 23+ Standard.)
+ - `-XX:+UseDynamicNumberOfGCThreads`: Ermöglicht eine dynamische Anpassung der GC-Threads.
+
+- **Generational Shenandoah:**
+ - **Warum:** Shenandoah führt den Großteil der GC-Arbeit ebenfalls nebenläufig aus und zielt auf geringe Pausen unabhängig von der Heap-Größe ab. JEP 404 führte generationalen Support experimentell in Java 17–23 ein, der in neueren Builds stabiler wird. Dadurch kann Shenandoah Young-Object-Collections effizienter handhaben, ähnlich wie GZGC.
+ - **Eignung:** Eine alternative Low-Latency-GC-Option, die in vielen OpenJDK-Builds verfügbar ist (nicht im Oracle JDK). Die Performance im Vergleich zu GZGC hängt vom Workload ab; Tests sind empfehlenswert, besonders unter Java 24+ für den generationalen Modus.
+ - **Beispiel-Flags (Java 24 – _Experimenteller_ Generational Mode):**
+
+ ```bash
+ java -XmsM -XmxM \
+ -XX:+UnlockExperimentalVMOptions \
+ -XX:+UseShenandoahGC \
+ -XX:ShenandoahGCMode=generational \
+ -XX:+AlwaysPreTouch \
+ -XX:+DisableExplicitGC \
+ -XX:+UseNUMA \
+ -XX:+AlwaysActAsServerClassMachine \
+ -XX:+ParallelRefProcEnabled \
+ -XX:+PerfDisableSharedMem \
+ -XX:+UseDynamicNumberOfGCThreads \
+ -jar your-server-jar-file.jar nogui
+ ```
+
+ - `-XX:+UseShenandoahGC`: Aktiviert Shenandoah.
+ - `-XX:ShenandoahGCMode=generational`: Wählt explizit den generationalen Modus aus JEP 404.
+
+### Vergleich: G1GC vs. Low-Latency Generational GCs (GZGC/GenShen) (Java 21+)
+
+| Feature | G1GC (mit Aikar’s Flags) | Generational ZGC / Generational Shenandoah |
+| :---------------------- | :--------------------------------------- | :------------------------------------------- |
+| **Hauptziel** | Balance aus Throughput & Pausenzeiten | Minimale Pausenzeiten (Ultra-Low-Latency) |
+| **Typische Pause** | Niedrig, steigt unter Last (<200ms Ziel) | Extrem niedrig, Sub-Millisekunden-Ziel |
+| **Allokationshandling** | Gut (generational) | Exzellent (generational + nebenläufig) |
+| **Throughput** | In der Regel sehr gut | Potenziell etwas geringer durch Nebenarbeit |
+| **CPU-Nutzung** | Moderat, Peaks während Pausen | Höhere _Hintergrund_-CPU-Nutzung |
+| **RAM-Overhead** | Effizient | Etwas höher möglich |
+| **Komplexität** | Bewährte Basis | Einfacheres Tuning als G1GC |
+| **Reifegrad** | Sehr ausgereift | Generationale Modi neuer (Java 21+) |
+| **Am besten für** | Die meisten Server (<100 Spieler) | Sehr große Server (150/300+), latenzsensitiv |
+
+**Empfehlung:** Starte mit Aikar’s G1GC-Flags. Wenn `/spark gcmonitor` trotz Tuning häufige oder lange GC-Pausen zeigt oder das Profiling ergibt, dass der Server bei hoher Spielerzahl mit der **Allokationsrate** kämpft (und du ausreichend Hardware + Java 21 hast), ziehe einen Wechsel zu Generational ZGC in Betracht. Teste Generational Shenandoah, wenn du Java 24+ nutzt oder GZGC Probleme verursacht.
+
+### Extreme Skalierung (300+ Spieler) & Advanced Tuning
+
+- **Allokationsrate ist entscheidend:** In diesem Bereich setzt die enorme Menge temporärer Objekte pro Sekunde den GC massiv unter Druck. Selbst Ultra-Low-Latency-Collector wie GZGC oder Generational Shenandoah können an ihre Grenzen stoßen, wenn die Anwendung schneller Speicher allokiert, als der GC ihn nebenläufig freigeben kann. Das kann zu Allocation Stalls (kurze Freezes) führen oder sehr große Heaps erfordern.
+- **Tiefgehendes Profiling (Spark):** Unverzichtbar. Nutze `/spark profiler`, um Hotspots mit hoher Allokationsrate zu identifizieren (z. B. ineffiziente Plugins, komplexe Entity-AI). Beobachte mit `/spark gcmonitor` sowohl GC-Pausen als auch Allokationsraten. Das Reduzieren unnötiger Allokationen auf Anwendungsebene (Plugin-Optimierung, Server-Config-Tuning) ist hier oft effektiver als reines GC-Tuning.
+- **Hardware:** Erfordert sehr leistungsstarke CPUs (starke Single-Thread- _und_ Multi-Core-Leistung), viel RAM (32GB++, ggf. 64GB+ je nach Allokationsrate) und schnellen NVMe-Speicher.
+
+## Advanced JVM Tuning: Compiler- und Runtime-Optimierungen
+
+Neben der Garbage Collection können weitere JVM-Flags die Performance beeinflussen, insbesondere in Bezug auf Speicherverbrauch, Code-Compilation (JIT) und Thread-Handling. **Das sind fortgeschrittene Optionen – teste Änderungen sorgfältig mit Spark oder ähnlichen Tools.** Genannte Defaults beziehen sich auf Java 21, sofern nicht anders angegeben.
+
+### Standard HotSpot (C1/C2) Compiler & Runtime Tuning
+
+Diese Flags gelten für Standard-OpenJDK-Builds wie Temurin oder Corretto.
+
+- **Memory & Pointer:**
+ - `-XX:+UseCompressedOops` (Default: false): Reduziert den Speicherbedarf für Objekt-Pointer auf 64-Bit-Systemen. Kann minimale Performance-Auswirkungen haben, spart aber etwas RAM.
+ - `-XX:+UseCompressedClassPointers` (Default: true): Ähnlich wie Oops, aber für Class Pointer. Reduziert Metadaten-Speicherverbrauch – aktiviert lassen.
+ - `-XX:+UseStringDeduplication` (Default: false, benötigt G1GC): Kann viel RAM sparen, wenn viele identische Strings existieren (Chat, Schilder, Item-Namen), indem sie sich ein gemeinsames Character-Array teilen. Verursacht zusätzlichen CPU-Overhead während GC-Zyklen. Testenswert auf Servern mit hohem RAM-Verbrauch und G1GC durch Hinzufügen von `+XX:+UseStringDeduplication`.
+- **Code Cache:** (Speichert kompilierten nativen Code)
+ - `-XX:ReservedCodeCacheSize=` (Default: plattformabhängig, oft 240M): Setzt die maximale Größe. Erhöhe (z. B. `512M`) **nur**, wenn Logs melden: "CodeCache is full. Compiler has been disabled." Nutzung überwachen (`jcmd VM.native_memory` oder Spark).
+ - `-XX:+UseCodeCacheFlushing` (Default: true): Erlaubt das Entfernen selten genutzten kompilierten Codes bei Platzmangel – aktiviert lassen.
+- **Threading & Scheduling:**
+ - `-XX:+UseThreadPriorities` (Default: true): Erlaubt unterschiedliche OS-Prioritäten für JVM-Threads (z. B. GC vs. Main Thread) – aktiviert lassen.
+ - `-XX:ThreadPriorityPolicy=1` (Default: 0): Versucht, Java-Threads höhere OS-Prioritäten gegenüber anderen Prozessen zu geben. Kann die Reaktionsfähigkeit unter Last erhöhen, aber andere Systemprozesse verhungern lassen. Mit Vorsicht verwenden und Systemstabilität überwachen.
+- **Hardware-spezifisch:**
+ - `-XX:+UseNUMA` (Default: false): Aktiviert NUMA-Awareness, um Speicher möglichst nahe an der ausführenden CPU zu allokieren. Kann auf Multi-Socket-Systemen oder großen CPUs (EPYC, Threadripper) die Performance deutlich verbessern, **wenn** Hardware und OS korrekt konfiguriert sind. Sorgfältig testen, da Fehlkonfiguration Performance verschlechtern kann. Low-Latency-GCs wie ZGC/Shenandoah haben oft eigenes NUMA-Handling.
+ - `-XX:+UseLargePages` (Default: false, benötigt OS-Konfiguration): Erlaubt die Nutzung großer Speicherseiten (z. B. 2MB/1GB statt 4KB). Kann TLB-Misses reduzieren und die Performance bei sehr großen Heaps (>32GB) verbessern. Erfordert komplexe OS-Konfiguration – vorsichtig testen.
+ - `-XX:+AlwaysActAsServerClassMachine` (Default: false): Erzwingt Server-Mode-Defaults (z. B. C2-Compiler), auch wenn Hardware-Erkennung fehlschlägt oder der Server in Docker läuft. Unproblematisch, explizit zu setzen.
+
+---
+
+- Kurz gesagt: Die meisten wichtigen Optimierungen sind bereits standardmäßig aktiviert – es gibt keinen Grund, alles „zu übertunen“. Wenn du dennoch tiefer einsteigen willst, schau dir [diese hilfreiche Website](https://chriswhocodes.com/hotspot_options_openjdk21.html) an, die jede Änderung pro Java-Version mit guten Erklärungen dokumentiert.
+
+---
+
+### GraalVM JIT Compiler Tuning
+
+- **Allgemeine Optionen:**
+ - `-XX:+UseJVMCIVMCompiler` (Default: true in GraalVM): Aktiviert den GraalVM-Compiler als Top-Tier-JIT. Das Deaktivieren (`-XX:-UseJVMCIVMCompiler`) wechselt zurück zum HotSpot-C2-Compiler – nützlich für Vergleiche.
+ - `-Dgraal.CompilerConfiguration=` (Default: community bei CE): Wählt die Compiler-Konfiguration. `community` ist Standard, `enterprise` bietet aggressivere Optimierungen mit längeren Compile-Zeiten, `economy` kompiliert schneller mit weniger Optimierung.
+ - `-Dgraal.ShowConfiguration=` (Default: none): Gibt beim Start Informationen zur gewählten Graal-Compiler-Konfiguration aus – hilfreich zur Kontrolle.
+ - `-Djdk.graal.MitigateSpeculativeExecutionAttacks=` (Default variiert, oft `GuardTargets`): (Ab GraalVM JDK 24 geändert zu `-Djdk.graal.SpectrePHTBarriers=`.) Steuert Schutzmaßnahmen gegen CPU-Schwachstellen wie Spectre. `None` bietet beste Performance, aber geringste Sicherheit. `AllTargets` ist am sichersten, aber mit hohem Performance-Verlust. `GuardTargets` ist meist ein guter Kompromiss. In vertrauenswürdigen Server-Umgebungen kann `None` nach sorgfältiger Risikoabwägung in Betracht gezogen werden.
+- **Performance-Tuning-Optionen:**
+ - `-Dgraal.UsePriorityInlining=true` (Default: true): Aktiviert einen erweiterten Inlining-Algorithmus, der Throughput priorisiert. Deaktivieren (`false`) kann Warmup beschleunigen, aber Peak-Performance senken.
+ - `-Dgraal.Vectorization=true` (Default: true): Aktiviert SIMD-/Vektorisierungs-Optimierungen für potenziell schnellere mathematische/Array-Operationen. Deaktivieren ist selten sinnvoll.
+ - `-Dgraal.OptDuplication=true` (Default: true): Aktiviert Pfad-Duplizierungs-Optimierungen, die verschiedene Codepfade separat optimieren. Deaktivieren kann Compile-Zeiten senken, verschlechtert aber meist die Laufzeit-Performance.
+ - `-Dgraal.TuneInlinerExploration=` (Default: 0, Bereich: -1 bis 1): Steuert den Aufwand für Inlining-Exploration. Werte >0 erhöhen den Aufwand (bessere Peak-Performance, langsameres Warmup), Werte <0 verringern ihn (schnelleres Warmup, evtl. geringere Peak-Performance). Erfordert sorgfältiges Profiling.
+ - `-Dgraal.TraceInlining=false` (Default: false): Aktiviert detaillierte Logs zu Inlining-Entscheidungen – nur für tiefgehendes Debugging sinnvoll.
+- **Optionen finden:** Nutze `java -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version | grep graal` (bei GraalVM), um verfügbare Graal-Flags aufzulisten. Das Verständnis erfordert jedoch tiefgehende Kenntnisse oder Dokumentation.
+
+---
+
+**Allgemeine Empfehlungen für Compiler-/Runtime-Flags:**
+
+- **Defaults sind meist gut:** Moderne JVMs (HotSpot und GraalVM) sind sehr gut abgestimmt. Bleib bei den Defaults, solange Profiling (Spark) keinen klaren Engpass zeigt.
+- **Fokus auf GC und Anwendung:** Bei Minecraft bringen GC-Optimierung (Aikar’s Flags, GZGC/GenShen) und Anwendungsoptimierung (Server-Configs, effiziente Plugins) meist die größten Performance-Gewinne.
+- **Schrittweise testen:** Wenn du experimentierst, ändere immer nur eine Option und miss die Auswirkungen mit Spark.
+
+## Server-Software-Konfiguration (Paper, Purpur, Leaf, etc.)
+
+Während JVM-Tuning entscheidend ist, ist **die Konfiguration der Server-Software genauso wichtig.** Einstellungen in Dateien wie `paper-global.yml`, `paper-world-defaults.yml`, `purpur.yml`, `leaf-global.yml` usw. steuern Gameplay-Mechaniken, die Performance und **Allokationsraten** stark beeinflussen.
+
+- **Bedeutung:** JVM-Flags steuern _wie_ der Server läuft (Memory, Compilation), Server-Configs steuern _was_ der Server tut (Entity-Ticks, Chunk-Loading, AI). Beides zu optimieren ist notwendig.
+- **Schlüsselbereiche:** View Distance, Simulation Distance, Mob-Spawning-Limits/-Raten, Entity Activation Ranges (entscheidend zur Reduzierung von AI-/Tick-Last und Allokationen), Chunk-Loading/-Generation, Hopper-Verhalten und asynchrone Operationen. Konsultiere die Dokumentation von Paper und Purpur.
+- **Aktion:** **Vernachlässige diese Dateien nicht.** Sieh dir die Doku deiner Server-Software an. **Für detaillierte Hinweise zu Leaf-spezifischen Einstellungen (`leaf-global.yml`) siehe erneut den Guide ["Optimize Your Leaf Server"](../how-to/optimize-leaf-server.md).** Nutze Spark-Profilergebnisse, um zu erkennen, welche Gameplay-Aspekte (oft korreliert mit hoher Allokation) angepasst werden müssen.
+
+## Testen, Iteration und Hilfe suchen
+
+- **Restart:** Wende Änderungen durch einen Server-Neustart an.
+- **Monitoring:** Nutze `/spark tps`, `/spark profiler` und `/spark gcmonitor`, um Performance, GC-Verhalten und Allokationsraten zu überwachen.
+- **Beobachten:** Achte auf Gameplay-Bugs oder unerwartetes Verhalten.
+- **Anpassen:** Setze Änderungen zurück, wenn Probleme auftreten, und passe basierend auf Profiling-Daten an. Optimierung ist ein iterativer Prozess.
+- **Community:** Suche Hilfe in den entsprechenden Discord-Servern (PaperMC, Purpur, Leaf), wenn du auf Probleme stößt.
+
+## Referenzen
+
+1. Mojang Studios (Minecraft 1.20.5 Release Notes): [https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-5](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-5)
+2. PaperMC Dokumentation (Getting Started): [https://docs.papermc.io/paper/getting-started](https://docs.papermc.io/paper/getting-started)
+3. Adoptium Eclipse Temurin: [https://adoptium.net/](https://adoptium.net/)
+4. Amazon Corretto: [https://aws.amazon.com/corretto/](https://aws.amazon.com/corretto/)
+5. Oracle OpenJDK Builds: [https://jdk.java.net/](https://jdk.java.net/)
+6. GraalVM: [https://www.graalvm.org/](https://www.graalvm.org/)
+7. Oracle Java HotSpot VM Options (Java 21): [https://chriswhocodes.com/hotspot_options_openjdk21.html](https://chriswhocodes.com/hotspot_options_openjdk21.html) (Unofficial but comprehensive list) / Official subset: [https://docs.oracle.com/en/java/javase/21/docs/specs/man/java.html](https://docs.oracle.com/en/java/javase/21/docs/specs/man/java.html)
+8. Aikar's Minecraft Java Flags Guide: [https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/](https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/)
+9. Oracle G1 Garbage Collector Dokumentation: [https://docs.oracle.com/en/java/javase/21/gctuning/garbage-first-g1-garbage-collector.html](https://docs.oracle.com/en/java/javase/21/gctuning/garbage-first-g1-garbage-collector.html)
+10. Oracle Java 21 Release Notes (Generational ZGC): [https://www.oracle.com/java/technologies/javase/21-relnote-issues.html#JDK-8293822](https://www.oracle.com/java/technologies/javase/21-relnote-issues.html#JDK-8293822)
+11. Oracle Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide (Setting Heap Size): [https://docs.oracle.com/en/java/javase/21/gctuning/factors-affecting-garbage-collection-performance.html#GUID-B0408057-SAF8-4C88-A484-E4565CEA6F75](https://docs.oracle.com/en/java/javase/21/gctuning/factors-affecting-garbage-collection-performance.html#GUID-B0408057-SAF8-4C88-A484-E4565CEA6F75)
+12. BellSoft Blog: Generational ZGC in JDK 21: What is it and how to use it: [https://bell-sw.com/blog/Generational-ZGC-in-JDK-21/](https://bell-sw.com/blog/Generational-ZGC-in-JDK-21/)
+13. OpenJDK Project ZGC (JEP 439: Generational ZGC): [https://openjdk.org/jeps/439](https://openjdk.org/jeps/439)
+14. OpenJDK Project Shenandoah: [https://wiki.openjdk.org/display/shenandoah/Main](https://wiki.openjdk.org/display/shenandoah/Main)
+15. PaperMC Dokumentation: [https://docs.papermc.io/paper/](https://docs.papermc.io/paper/)
+16. Purpur Dokumentation: [https://purpurmc.org/docs/](https://purpurmc.org/docs/)
+17. Inside.java Explainer: Generational ZGC: [https://inside.java/2023/11/28/gen-zgc-explainer/](https://inside.java/2023/11/28/gen-zgc-explainer/)
+18. OpenJDK JEP 404: Generational Shenandoah (Experimental): [https://openjdk.org/jeps/404](https://openjdk.org/jeps/404)
+19. GraalVM Dokumentation - Java Runtime Options: [https://www.graalvm.org/jdk21/reference-manual/java/options/](https://www.graalvm.org/jdk21/reference-manual/java/options/)
diff --git a/pages/de/docs/how-to/optimize-leaf-server.md b/pages/de/docs/how-to/optimize-leaf-server.md
new file mode 100644
index 0000000..f148e5b
--- /dev/null
+++ b/pages/de/docs/how-to/optimize-leaf-server.md
@@ -0,0 +1,135 @@
+# Optimierung deines Leaf-Servers (1.21.4/5)
+
+**Bevor du beginnst:**
+
+1. **BACKUP DEINES SERVERS!** Ernsthaft. Bevor du Konfigurationen änderst – insbesondere experimentelle – sichere deine Welt, Plugins und Konfigurationsdateien.
+2. **Profiling statt Raten:** Optimierung ist am effektivsten, wenn sie auf Daten basiert und nicht auf Annahmen. Nutze einen Profiler wie [Spark](https://spark.lucko.me/), um herauszufinden, _was_ auf _deinem_ Server tatsächlich Lag verursacht. Ändere nicht einfach wahllos Einstellungen – finde zuerst den Bottleneck!
+ - **Bei dauerhaft niedrigen TPS/Lag:** Wenn dein Server konstant unter 20 TPS läuft, nutze den Standard-Profiler:
+ 1. Führe `/spark profiler start` in der Konsole oder als OP aus.
+ 2. Lass ihn einige Minuten während typischer Serveraktivität laufen (oder wenn die TPS niedrig sind).
+ 3. Führe `/spark profiler stop` aus.
+ 4. Öffne den generierten Link und analysiere die "Hotspots" oder den Call Tree, um zu sehen, welche Operationen insgesamt die meiste Main-Thread-Zeit verbrauchen.
+ - **Bei plötzlichen Lag-Spikes/Freezes:** Wenn dein Server normalerweise stabil läuft, aber gelegentlich starke TPS-Einbrüche oder Freezes auftreten, fokussiere dich gezielt auf diese Momente:
+ 1. Führe `/spark profiler --only-ticks-over 100` aus (du kannst den `100`-ms-Schwellwert anpassen). Dieser Befehl zeichnet _nur_ Server-Ticks auf, die länger als die angegebene Dauer benötigen (normale Ticks dauern 50 ms).
+ 2. Lass den Profiler laufen, bis ein oder mehrere Lag-Spikes auftreten.
+ 3. Führe `/spark profiler stop` aus.
+ 4. Analysiere den Report. Er zeigt dir exakt, was der Server während dieser spezifischen laggy Ticks gemacht hat. Achte im Call Tree der aufgezeichneten Spikes auf Methoden/Operationen mit hohen Prozentwerten. So lässt sich die direkte Ursache des Freezes finden (z. B. ein bestimmtes Plugin-Event, World-Generation oder exzessive Entity-Verarbeitung).
+ - **Erst analysieren, dann ändern:** Nutze die Profilergebnisse als Grundlage für deine Konfigurationsänderungen. Zeigt Spark auf Entity-Pathfinding, konzentriere dich auf `async-pathfinding`. Zeigt es auf Chunk-Loading, prüfe View Distances oder `async-chunk-send`.
+3. **Schrittweise Änderungen:** Ändere immer nur wenige zusammenhängende Einstellungen gleichzeitig, starte den Server neu und teste anschließend. So erkennst du leichter, ob eine Änderung Probleme verursacht oder die Performance verbessert hat.
+4. **Beschreibungen lesen:** Die Konfigurationsdatei selbst enthält detaillierte Beschreibungen (`desc`) für jede Option. Lies sie sorgfältig!
+
+## Zentrale Optimierungsbereiche in `leaf-global.yml`
+
+Wir konzentrieren uns auf Abschnitte mit spürbaren Performance-Auswirkungen. Empfohlene Werte priorisieren oft Performance, teils auf Kosten kleiner Vanilla-Abweichungen oder mit Anforderungen an neuere Hardware/Java-Versionen.
+
+### 1. Asynchrone Operationen (`async`)
+
+Ziel ist es, Berechnungen vom Main Server Thread (der die Gameplay-Ticks verarbeitet) auf Hintergrund-Threads auszulagern, um die Main-Thread-Last zu senken und die TPS (Ticks Per Second) zu verbessern.
+
+- **`async-entity-tracker.enabled: true`**
+ - **Warum:** Entity-Tracking prüft kontinuierlich, welche Spieler welche Entities sehen können, und versendet Pakete zum Hinzufügen/Aktualisieren/Entfernen von Entities. Das ist besonders mit vielen Spielern und Entities sehr teuer. Diese Option verschiebt den Großteil dieser Sichtbarkeitsprüfungen und die Paketvorbereitung auf separate Hintergrund-Threads.
+ - **Funktionsweise:** Das System nutzt dedizierte Tracker-Threads. Bei Aktivierung werden interne Datenstrukturen (z. B. die Menge der Spieler, die eine Entity sehen, oder Attribut-Maps) auf thread-sichere Varianten umgestellt (z. B. `ConcurrentHashSet`, `ConcurrentHashMap`). Die Kernlogik der Distanzprüfung (`updatePlayer`) läuft in diesen Hintergrund-Threads. Operationen, die _zwingend_ auf dem Main Thread stattfinden müssen (z. B. Teleportieren eines Spielers, wenn sein Vehicle aus dem Sichtbereich entfernt wird), werden zurück auf den Main Thread eingeplant.
+ - **`compat-mode: false` (Empfohlen, sofern nicht benötigt)**
+ - **Warum es `compat-mode` gibt:** Manche NPC-Plugins (insbesondere Citizens) erstellen NPCs als _echte Spieler-Entities_. Die asynchrone Arbeitsweise des Trackers kann bei diesen NPCs visuelle Probleme verursachen (z. B. kurzes Verschwinden oder Ruckeln), da Updates nicht synchron zum Main Thread erfolgen.
+ - **Wie `compat-mode: true` funktioniert:** Der Code prüft explizit, ob eine getrackte Entity ein _echter Spieler_ oder ein _Fake Player_ (z. B. ein Citizens-NPC) ist. Ist der Kompatibilitätsmodus aktiviert, werden Tracking-Updates für _Fake Player_ **synchron** auf dem Main Thread ausgeführt, während alle anderen Entities (Mobs, Items, echte Spieler) weiterhin asynchron verarbeitet werden. Das behebt die visuellen Probleme bei diesen NPC-Typen.
+ - **Empfehlung:** Lass `compat-mode: false` für maximale Performance. Aktiviere ihn nur (`true`), wenn du Citizens oder ein ähnliches _Real-Entity_-NPC-Plugin nutzt **und** Sichtbarkeitsprobleme auftreten. Paketbasierte/virtuelle NPC-Plugins (z. B. ZNPCsPlus, Adyeshach, FancyNPCs) sind in der Regel nicht betroffen und profitieren von `compat-mode: false`.
+ - **`max-threads`:** Steuert die Größe des Thread-Pools für Entity-Tracking. Der Default (`0` = 1/4 der CPU-Kerne) ist ein sicherer Start. Erwäge eine Erhöhung auf `1/2` deiner CPU-Kerne, wenn Spark zeigt, dass viel Zeit im Entity-Tracking verbracht wird – vermeide aber eine Überallokation von Threads.
+ - **`keepalive` / `queue-size`:** Feinabstimmung des Thread-Pool-Verhaltens (Idle-Timeout) und der Task-Queue-Größe. Die Defaults sind meist sinnvoll.
+- **`async-target-finding.enabled: true`**
+ - **Warum:** Lagert den teuren Teil der Mob-AI (Suche nach Zielen in der Umgebung) auf Hintergrund-Threads aus und reduziert so die Main-Thread-Last.
+- **`async-pathfinding.enabled: true`**
+ - **Warum:** Das Berechnen von Navigationspfaden für Mobs (besonders komplexe) ist sehr CPU-intensiv. Diese Option lagert die _Berechnung_ der Pfade aus, sodass der Main Thread nicht durch Mobs blockiert wird, die ihren Weg finden wollen.
+ - **Funktionsweise:** Benötigt ein Mob einen Pfad, wird die Anfrage an den Async-Pathfinding-Thread-Pool gesendet. Die AI erhält den Pfad nicht sofort. Stattdessen wurden Navigationssystem und AI so angepasst, dass sie auf den Abschluss der Berechnung _warten_ (z. B. über `path.isProcessed()`) oder einen _Callback_ (`AsyncPathProcessor.awaitProcessing`) verwenden, der die Logik (z. B. Start der Bewegung) **erst nach** Erhalt des Pfades ausführt. Dadurch blockiert der Main Thread nicht.
+ - **`max-threads`:** Größe des Pathfinding-Thread-Pools. Default (`0` = 1/4 Kerne) ist konservativ. Erwäge `1/3` der CPU-Kerne, wenn Pathfinding (in Spark z. B. `PathFinder` oder Navigations-Tasks) eine wesentliche Lag-Ursache ist.
+ - **`keepalive` / `queue-size`:** Thread-Pool-Feintuning.
+ - **`reject-policy`:** Legt fest, was passiert, wenn die Pathfinding-Queue voll ist.
+ - `FLUSH_ALL`: Alle wartenden Pathfinding-Tasks werden sofort auf dem Main Thread ausgeführt. Kann einen Lag-Spike verursachen, verarbeitet aber alle offenen Anfragen.
+ - `CALLER_RUNS`: Nur der _neue_ Task, der nicht mehr in die Queue passt, wird auf dem Main Thread ausgeführt. Geringeres Spike-Risiko, aber einzelne Pfadanfragen können sich verzögern.
+- **`async-mob-spawning.enabled: true`**
+ - **Warum:** Lagert Berechnungen aus, die _vor_ dem Spawnen von Mobs stattfinden. Benötigt Paper `per-player-mob-spawns: true`, um effektiv zu sein. Das eigentliche Spawnen bleibt synchron (aus Sicherheitsgründen).
+- **`async-locator.enabled: true`**
+ - **Warum:** Führt Befehle wie `/locate` sowie Eye-of-Ender-/Dolphin-Suchen im Hintergrund aus und verhindert Server-Hänger bei potenziell langsamen Abfragen.
+ - **`threads`:** `1` oder `2` sind in der Regel ausreichend.
+- **`async-chunk-send.enabled: true`**
+ - **Warum:** Bereitet Chunk-Daten asynchron vor und sendet sie asynchron an Spieler. Reduziert Lag massiv bei Joins, Teleports oder schnellem Fliegen. Sehr empfohlen.
+- **`async-block-finding.enabled: true`**
+ - **Warum:** Ähnlich wie Target-Finding, aber für AI, die bestimmte Blöcke sucht. Reduziert Main-Thread-Last bei bestimmten AI-Aufgaben.
+- **`parallel-world-tracking`** (Experimentell)
+ - **Warum:** Versucht, unterschiedliche Welten/Regionen parallel auf Multi-Core-CPUs zu ticken.
+ - **Hinweis:** Hochgradig experimentell. Aktiviere (`enabled: true`) dies nur, wenn du _viele_ Welten hast **und** konkrete Bottlenecks bestehen **und** dir der Risiken von Concurrency-Problemen bewusst bist. Default (`false`) ist sicherer.
+- **`async-playerdata-save`**
+ - **Warum:** Versucht, Playerdaten asynchron zu speichern und reduziert so Max-MSPT-Spikes in Spark-Profilen.
+
+---
+
+### 2. Performance-Tweaks (`performance`)
+
+Dieser Abschnitt enthält gezielte Optimierungen.
+
+- **Virtual Threads (Java 21+ erforderlich)**
+ - `use-virtual-thread-for-user-authenticator.enabled: true`
+ - `use-virtual-thread-for-async-chat-executor.enabled: true`
+ - `use-virtual-thread-for-async-scheduler.enabled: true`
+ - **Warum:** Nutzt moderne, leichtgewichtige Java-21+-Threads für Login-Authentifizierung und potenziell Plugin-Async-Tasks. Reduziert Overhead gegenüber klassischen Threads.
+- **`create-snapshot-on-retrieving-blockstate.enabled: false`**
+ - **Warum:** Verhindert das Erstellen einer Kopie (Snapshot) von Blockdaten bei jeder Plugin-Abfrage. Deutlich schneller, setzt aber voraus, dass Plugins die Live-Daten nicht unbeabsichtigt verändern.
+ - **Hinweis:** In der Regel sicher. Bei seltsamen blockbezogenen Plugin-Problemen testweise wieder auf `true` setzen.
+- **Drosselung / Überspringen unnötiger Arbeit**
+ - `inactive-goal-selector-throttle.enabled: true`: Reduziert AI-Berechnungen für Mobs weit entfernt von Spielern.
+ - `throttle-hopper-when-full.enabled: true` (`skip-ticks: 8`): Verhindert, dass Hopper ständig versuchen, in volle Container zu pushen. `8` Ticks entsprechen der Vanilla-Cooldown.
+ - `skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer.enabled: true`: Hilfreich bei vielen Custom-Maps ohne Renderer (z. B. Image-Maps). Geringe Vanilla-Abweichung (Maps im Inventar aktualisieren sich ggf. erst beim Halten).
+ - `skip-ai-for-non-aware-mob.enabled: true`: Reduziert AI-Verarbeitung für inaktive Mobs weiter.
+- **`reduce-packets.reduce-entity-move-packets.enabled: true`**
+ - **Warum:** Sendet weniger/kleinere Pakete für kleine Entity-Bewegungen. Spart Bandbreite und Client-Rechenleistung, Bewegungen wirken unter Last oft flüssiger.
+- **`faster-random-generator.enabled: true`** (Java 17+ erforderlich)
+ - **Warum:** Nutzt schnellere Zufallszahlengeneratoren moderner Java-Versionen. Zufälligkeit wird _überall_ genutzt – das bringt messbare Vorteile.
+ - **`random-generator: Xoroshiro128PlusPlus`**: Gutes Verhältnis aus Geschwindigkeit und Qualität.
+ - **`enable-for-worldgen: false`**: **KRITISCH:** `true` **VERÄNDERT DIE WORLD GENERATION**. Erze, Strukturen usw. weichen von Vanilla-Seeds ab. Nur auf **NEUEN** Welten nutzen.
+ - **`use-legacy-random-for-slime-chunk: true`**: **KRITISCH:** Auf bestehenden Welten `true`, damit Slime-Chunks für Farmen an derselben Position bleiben. Nur auf neuen Welten ggf. `false`.
+- **`dab` (Distant Activation Behavior)**
+ - `enabled: true`: Reduziert AI-Verarbeitung (Brain-Ticks, Pathfinding) für entfernte Entities.
+ - `dont-enable-if-in-water: true`: Verhindert, dass weit entfernte Land-Mobs durch pausierte AI ertrinken.
+ - `start-distance: 8`, `max-tick-freq: 20`, `activation-dist-mod: 7`: Gute Startwerte für ein ausgewogenes Verhältnis aus Performance und Verhalten.
+ - `blacklisted-entities`: Trage hier Entities ein (z. B. `minecraft:villager`, `minecraft:zombified_piglin`), deren AI auch in der Ferne aktiv bleiben muss (z. B. für bestimmte Farmen).
+- **`dont-save-entity`**
+ - `dont-save-primed-tnt.enabled: true`: Verhindert das Speichern von TNT-Entities und vermeidet Explosionen durch Chunk-Load/Unload-Zyklen. Gut für technische/Redstone-Server.
+ - `dont-save-falling-block.enabled: true`: Verhindert geglitchten oder duplizierten Sand/Kies nach Restarts oder Lag.
+
+---
+
+### 3. Network-Einstellungen (`network`)
+
+- **`protocol-support`**: Aktiviere spezifische Protokolle (`jade`, `appleskin` usw.) **nur**, wenn deine Spieler diese Client-Mods nutzen und du serverseitige Unterstützung möchtest. Sie verbessern sonst nicht die Performance.
+- **`OptimizeNonFlushPacketSending.enabled: false`**
+ - **Warum `false`:** Diese Optimierung ist **BEKANNT INKOMPATIBEL** mit ProtocolLib und potenziell anderen netzwerkintensiven Plugins. **NICHT AKTIVIEREN**, außer du bist dir absolut sicher, dass nichts kaputtgeht.
+- **`chat-message-signature.enabled: false`**
+ - **Warum:** Deaktiviert die kryptografische Signierung von Chat-Nachrichten. Dadurch ist das Melden von Chats an Mojang nicht möglich und "Secure Chat"-Indikatoren entfallen. Oft gewünscht auf Servern mit eigener Moderation oder im Offline-Mode.
+
+---
+
+### 4. Sonstiges (`misc`)
+
+- **`secure-seed.enabled: false`**
+ - **Warum `false`:** `true` nutzt einen anderen internen Seed für Erze/Strukturen und macht Seed-Cracking unmöglich, **VERÄNDERT ABER GRUNDLEGEND** die Generation im Vergleich zu Vanilla-Seeds. Nur auf **NEUEN** Welten aktivieren.
+- **`region-format-settings.region-format: MCA`**
+ - **Warum `MCA`:** Standardmäßiges, sicheres und kompatibles Minecraft-Anvil-Format.
+ - **`LINEAR`:** Experimentelle Zstandard-Kompression. Spart Speicherplatz, ist aber **RISIKOREICH**, weniger kompatibel und erfordert spezielle Tools. **NICHT VERWENDEN**, außer du kennst die Risiken und hast Backups.
+- **`lag-compensation`** (Experimentell)
+ - `enabled: true`, `enable-for-water: true`, `enable-for-lava: true`
+ - **Warum:** Versucht, Gameplay während Lag-Spikes flüssiger wirken zu lassen.
+ - **Hinweis:** Experimentell, mögliche Nebenwirkungen beobachten.
+
+## Vererbte Einstellungen (Gale, Purpur, Paper)
+
+Bedenke, dass Leaf auf Gale, Purpur und Paper aufbaut. Viele wichtige Performance-Settings befinden sich in deren Konfigurationsdateien (`gale-global.yml`, `gale-world.yml`, `purpur.yml`, `paper-global.yml`, `paper-world-defaults.yml`).
+
+Nutze deren Dokumentationen (verlinkt unter [Useful Websites](../useful-sites.md)) und Community-Guides (z. B. Paper-chan), um diese ebenfalls zu optimieren.
+
+## Testen und Iteration
+
+- Nach Änderungen den Server **neu starten**.
+- **Performance überwachen** mit `/spark tps` und vor allem `/spark profiler` während normalem Gameplay.
+- **Gameplay beobachten:** Verhalten sich Mobs korrekt? Gibt es neue Glitches?
+- **Anpassen:** Falls keine Verbesserung eintritt oder Probleme auftreten, letzte Änderungen rückgängig machen oder weiter feinjustieren. Optimierung ist fast immer ein iterativer Prozess, der an deinen Server und deine Hardware angepasst werden muss.
+
+Wenn du Probleme hast oder Fragen auftauchen, frag gern im [Leaf Discord Server](https://discord.com/invite/gfgAwdSEuM). Viel Erfolg!
diff --git a/pages/docs/benchmark/chunk-generation.md b/pages/docs/benchmark/chunk-generation.md
index b36491f..aa7b102 100644
--- a/pages/docs/benchmark/chunk-generation.md
+++ b/pages/docs/benchmark/chunk-generation.md
@@ -1,7 +1,9 @@
# Chunk Generation Benchmark
:::warning
+
This page presents performance comparison data between Leaf and Paper server implementations for chunk generation tasks. These results represent a specific test scenario and may vary based on hardware, configuration, and specific world seeds.
+
:::
diff --git a/pages/docs/benchmark/entity-performance.md b/pages/docs/benchmark/entity-performance.md
index 1a978c2..605a8bb 100644
--- a/pages/docs/benchmark/entity-performance.md
+++ b/pages/docs/benchmark/entity-performance.md
@@ -21,7 +21,7 @@ Modified settings in bukkit.yml:
All other configuration files remained at default settings. This test simulates a high-entity-count scenario that frequently occurs on busy servers.
-### Leaf+Async Configuration
+### Leaf + Async Configuration
Enabled minimal async options in leaf-global.yml:
diff --git a/pages/docs/config/data/gale-global-1-21-1.ts b/pages/docs/config/data/gale-global-1-21-1.ts
index 4939761..e7601a2 100644
--- a/pages/docs/config/data/gale-global-1-21-1.ts
+++ b/pages/docs/config/data/gale-global-1-21-1.ts
@@ -80,9 +80,9 @@ const config: ConfigRoot = {
| Default | | |
| Recommended | Leaf | Paper | Vanilla |
- "none" 🛈 | "info" | "error" | "error" |
+ "none" ⓘ | "info" | "error" | "error" |
- 🛈 = The default value is \`"info"\` to prevent any errors going unnoticed by default, but the recommended value is \`"none"\` because these errors are usually meaningless and unsolvable anyway.
`
+ ⓘ = The default value is \`"info"\` to prevent any errors going unnoticed by default, but the recommended value is \`"none"\` because these errors are usually meaningless and unsolvable anyway.
`
},
"invalid-statistics": {
default: true,
@@ -176,28 +176,28 @@ const config: ConfigRoot = {
default: false,
desc: `Whether to ignore any legacy structure data, for which the NBT tag parser returns null for some reason.
- - If \`true\`, no warning will be given when this happens.
- - If \`false\`, an exception will be thrown in the console when this happens.
+ - If set to \`true\`, no warning will be given when this happens.
+ - If set to \`false\`, an exception will be thrown in the console when this happens.
| Default | | |
| Recommended | Leaf | Paper | Vanilla |
- true 🛈 | false | false | false |
+ true ⓘ | false | false | false |
| Values for goals | |
| Optimization | - |
| Vanilla behavior | false |
- 🛈 = The default value is \`false\` to prevent any errors going unnoticed by default, but the recommended value is \`true\` because these errors are usually meaningless and unsolvable anyway.
`
+ ⓘ = The default value is \`false\` to prevent any errors going unnoticed by default, but the recommended value is \`true\` because these errors are usually meaningless and unsolvable anyway.
`
},
keepalive: {
"send-multiple": {
default: true,
desc: `Whether to send more frequent keepalive packets than vanilla.
- - If \`true\`, a keepalive packet is sent to every client every second, and they are not kicked if they respond to at least one of them within 30 seconds.
- - If \`false\`, a keepalive packet is sent to every client every 15 seconds, and they are kicked if they do not respond to it within 30 seconds.
+ - If set to \`true\`, a keepalive packet is sent to every client every second, and they are not kicked if they respond to at least one of them within 30 seconds.
+ - If set to \`false\`, a keepalive packet is sent to every client every 15 seconds, and they are kicked if they do not respond to it within 30 seconds.
| Default | | |
@@ -215,7 +215,7 @@ const config: ConfigRoot = {
"add-oversleep": {
default: false,
desc: `Whether to add the oversleep portion of the last tick's time to the \`/tps\` command.
- This only has any effect if \`enabled\` above is \`true\`.
+ This only has any effect if \`enabled\` below is \`true\`.
| Default | | |
| Recommended | Leaf | Paper | Vanilla |
diff --git a/pages/docs/config/data/gale-global-1-21-4.ts b/pages/docs/config/data/gale-global-1-21-4.ts
index fbfb200..0601d17 100644
--- a/pages/docs/config/data/gale-global-1-21-4.ts
+++ b/pages/docs/config/data/gale-global-1-21-4.ts
@@ -80,9 +80,9 @@ const config: ConfigRoot = {
| Default | | |
| Recommended | Leaf | Paper | Vanilla |
- "none" 🛈 | "info" | "error" | "error" |
+ "none" ⓘ | "info" | "error" | "error" |
- 🛈 = The default value is \`"info"\` to prevent any errors going unnoticed by default, but the recommended value is \`"none"\` because these errors are usually meaningless and unsolvable anyway.
`
+ ⓘ = The default value is \`"info"\` to prevent any errors going unnoticed by default, but the recommended value is \`"none"\` because these errors are usually meaningless and unsolvable anyway.
`
},
"invalid-statistics": {
default: true,
@@ -176,28 +176,28 @@ const config: ConfigRoot = {
default: false,
desc: `Whether to ignore any legacy structure data, for which the NBT tag parser returns null for some reason.
- - If \`true\`, no warning will be given when this happens.
- - If \`false\`, an exception will be thrown in the console when this happens.
+ - If set to \`true\`, no warning will be given when this happens.
+ - If set to \`false\`, an exception will be thrown in the console when this happens.
| Default | | |
| Recommended | Leaf | Paper | Vanilla |
- true 🛈 | false | false | false |
+ true ⓘ | false | false | false |
| Values for goals | |
| Optimization | - |
| Vanilla behavior | false |
- 🛈 = The default value is \`false\` to prevent any errors going unnoticed by default, but the recommended value is \`true\` because these errors are usually meaningless and unsolvable anyway.
`
+ ⓘ = The default value is \`false\` to prevent any errors going unnoticed by default, but the recommended value is \`true\` because these errors are usually meaningless and unsolvable anyway.
`
},
keepalive: {
"send-multiple": {
default: true,
desc: `Whether to send more frequent keepalive packets than vanilla.
- - If \`true\`, a keepalive packet is sent to every client every second, and they are not kicked if they respond to at least one of them within 30 seconds.
- - If \`false\`, a keepalive packet is sent to every client every 15 seconds, and they are kicked if they do not respond to it within 30 seconds.
+ - If set to \`true\`, a keepalive packet is sent to every client every second, and they are not kicked if they respond to at least one of them within 30 seconds.
+ - If set to \`false\`, a keepalive packet is sent to every client every 15 seconds, and they are kicked if they do not respond to it within 30 seconds.
| Default | | |
@@ -215,7 +215,7 @@ const config: ConfigRoot = {
"add-oversleep": {
default: false,
desc: `Whether to add the oversleep portion of the last tick's time to the \`/tps\` command.
- This only has any effect if \`enabled\` above is \`true\`.
+ This only has any effect if \`enabled\` below is \`true\`.
| Default | | |
| Recommended | Leaf | Paper | Vanilla |
diff --git a/pages/docs/config/data/leaf-global-1-21-1.ts b/pages/docs/config/data/leaf-global-1-21-1.ts
index 71bfd07..375cd97 100644
--- a/pages/docs/config/data/leaf-global-1-21-1.ts
+++ b/pages/docs/config/data/leaf-global-1-21-1.ts
@@ -11,113 +11,109 @@ const config: ConfigRoot = {
"async-entity-tracker": {
enabled: {
default: false,
- desc:
- "Make entity tracking asynchronously, can improve performance significantly, especially in some massive entities in small area situations.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__" +
- '' +
- '
Attention
' +
- 'If you installed plugins like Citizens, which uses real, and player type entity as "NPC", also read `compat-mode` below for more infomration.' +
- "
"
+ desc: `Whether to make entity tracking asynchronous.
+ This can improve performance significantly, especially in situations with a large number of entities in a small area.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ If you installed plugins like Citizens, which uses the real entity or player-type entity as the "NPC", also read \`compat-mode\` below for more information.
+
`
},
"compat-mode": {
default: false,
- desc:
- "Enable compat mode to be compatible with plugins like Citizens or NPC plugins that use real, and player-type entity.
" +
- "If `true`, visibility issue that player-type NPCs may disappear sometimes can be fixed.
" +
- "
" +
- "You should enable `compat-mode` to use async entity tracker feature **ONLY IF** you installed Citizens or any other kind of real entity NPC plugins.
" +
- "
" +
- "But we still recommend to use packet-based / virtual entity NPC plugin to gain better performance, e.g. [ZNPC Plus](https://github.com/Pyrbu/ZNPCsPlus), [Adyeshach](https://github.com/TabooLib/Adyeshach), [Fancy NPC](https://modrinth.com/plugin/fancynpcs), or else, and then `compat-mode` can be disabled."
+ desc: `Whether to enable compatibility mode for plugins like Citizens or NPC plugins that use the real, player-type entity.
+ If set to \`true\`, the visibility issue that player-type NPCs may disappear sometimes can be fixed.
+
+ You should enable \`compat-mode\` to use the async entity tracker feature __ONLY IF__ you installed Citizens or any other kind of real entity NPC plugins.
+
+ But we still recommend using packet-based / virtual entity NPC plugin to gain better performance, e.g., [ZNPC Plus](https://github.com/Pyrbu/ZNPCsPlus), [Adyeshach](https://github.com/TabooLib/Adyeshach), [Fancy NPC](https://modrinth.com/plugin/fancynpcs), or else, and then \`compat-mode\` can be disabled.`
},
"max-threads": {
default: 0,
- desc:
- "Maximum number of threads for async entity tracker to use.
" +
- "If the value is set to `0`, it automatically uses 1/4 of the number of CPU cores and no less than 1.
" +
- "
" +
- "__⚡Recommended value: 1/2 of CPU cores__"
+ desc: `Maximum number of threads for async entity pathfinding to use.
+ For example:
+
+ - If a value < \`0\` is given, it automatically uses the number of CPU cores plus the value as the count of threads, with a minimum of 1.
+ - If set to \`0\`, it automatically uses 1/4 of the number of CPU cores, with a minimum of 1.
+
+
+ __⚡Recommended value: 1/2 of CPU cores__`
},
keepalive: {
default: 60,
- desc:
- "Thread keepalive time, threads with no tasks will be terminated if they exceed the time.
" +
- "(Unit: second)"
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
}
},
"async-playerdata-save": {
enabled: {
default: false,
- desc:
- "Make PlayerData saving asynchronously. (I/O operations are expensive)" +
- '' +
- '
Warning
' +
- "Experimental feature, may cause data lost in some circumstances!" +
- "
"
+ desc: `Whether to make player data saving asynchronous (I/O operations are expensive).
+
+
+
Experimental
+ Experimental feature, may cause data loss or data inconsistency in some circumstances!
+
`
}
},
"async-pathfinding": {
enabled: {
default: false,
- desc:
- "Make mob pathfinding calculation asynchronously.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__"
+ desc: `Whether to make the mob pathfinding calculation asynchronously.
+
+ __⚡Recommended value: \`true\`__`
},
"max-threads": {
default: 0,
- desc:
- "Maximum number of threads for async entity pathfinding to use.
" +
- "If the value is set to `0`, it automatically uses 1/4 of the number of CPU cores and no less than 1.
" +
- "
" +
- "__⚡Recommended value: 1/3 of CPU cores__"
+ desc: `Maximum number of threads for async mob pathfinding to use.
+ If a value ≤ \`0\` is given, it automatically uses 1/4 of the number of CPU cores, with a minimum of 1.
+
+ __⚡Recommended value: 1/3 of CPU cores__`
},
keepalive: {
default: 60,
- desc:
- "Thread keepalive time, threads with no tasks will be terminated if they exceed the time.
" +
- "(Unit: second)"
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
}
},
"async-mob-spawning": {
enabled: {
default: true,
- desc:
- "Whether asynchronous mob spawning should be enabled.
" +
- "On servers with many entities, this can improve performance by up to 15%. You must have Paper's `per-player-mob-spawns` config set to `true` for this to work.
" +
- "One quick note: this does not actually spawn mobs async (that would be very unsafe). This just offloads some expensive calculations that are required for mob spawning.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to make mob spawning asynchronous.
+
+ On servers with heavy mob spawning, this can improve performance by up to ~15%. You must have Paper's \`per-player-mob-spawns\` config set to \`true\` for this to work.
+ One quick note: this does not actually spawn mobs async (that would be very unsafe). This just offloads some expensive calculations that are required for mob spawning.
+
+ __⚡Recommended value: \`true\`__`
}
},
"async-locator": {
enabled: {
default: false,
- desc:
- "Whether asynchronous locator should be enabled.
" +
- "This offloads structure locating to other threads.
" +
- "Currently available for:" +
- "" +
- "- `/locate` command
" +
- "- Dolphin treasure finding
" +
- "- Eye of ender stronghold finding
" +
- "
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__"
+ desc: `Whether to make locator finding structures asynchronous.
+ This offloads structure locating to other threads.
+ Currently available for:
+
+ - \`/locate\` command
+ - Dolphin treasure finding
+ - Eye of Ender stronghold finding
+
+
+ __⚡Recommended value: \`true\`__`
},
threads: {
default: 0,
- desc:
- "Maximum number of threads for async locator to use.
" +
- "If a value ≤ `0` is given, it automatically uses 1 thread.
" +
- "
" +
- "__⚡Recommended value: `1` or `2`__"
+ desc: `Maximum number of threads for async locator to use.
+ If a value ≤ \`0\` is given, it automatically uses 1 thread.
+
+ __⚡Recommended value: \`1\` or \`2\`__`
},
keepalive: {
default: 60,
- desc:
- "Thread keepalive time, threads with no tasks will be terminated if they exceed the time.
" +
- "(Unit: second)"
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
}
}
},
@@ -127,232 +123,303 @@ const config: ConfigRoot = {
"This section contains performance tuning intended to reduce unnecessary calculations or use more efficient methods to optimize the server.",
"use-virtual-thread-for-async-chat-executor": {
default: true,
- desc:
- "Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in JDK 21 for the Async Chat Executor.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __Async Chat Executor__.
+
+ __⚡Recommended value: \`true\`__`
},
"use-virtual-thread-for-async-scheduler": {
default: true,
- desc:
- "Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in JDK 21 for the CraftAsyncScheduler, which could improve performance of plugin that heavily utilizing Bukkit's async scheduler.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __CraftAsyncScheduler__, which could improve the performance of plugins that heavily utilize Bukkit's async scheduler.
+
+ __⚡Recommended value: \`true\` (Only if all plugins support Virtual Thread)__`
},
"create-snapshot-on-retrieving-blockstate": {
default: true,
- desc:
- "Whether to create a snapshot (copy) of TileEntity / BlockState data by default when plugins retrieve them.
" +
- "
" +
- "Some plugins may call `getInventory().getHolder()` to get the holder of an inventory, which involves accessings the BlockState.
" +
- "For example, if there are tons of hoppers and plugins call this method when listening to some events (e.g. hopper related events, call frequently). Re-creating BlockState and parsing item stack in massive and frequent calls are very expensive.
" +
- "See Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) for more information." +
- "" +
- "- If `true`, always creates snapshot (copy) of BlockState when the plugin calls related methods.
" +
- "- If `false`, gets real BlockState directly unless the plugin explicitly requests a snapshot. Performance improves, but has risk that block state gets modified due to plugin's poor design.
" +
- "
" +
- "
" +
- "__⚡Recommended value: `false` (Only if you encounter specific lag described above)__"
+ desc: `Whether to create a snapshot (copy) of \`BlockEntity\` / \`BlockState\` data by default when plugins retrieve them.
+
+ Some plugins may call \`getInventory().getHolder()\` to get the holder of an inventory, which involves accessing the BlockState.
+ For example, if there are tons of hoppers and plugins, call this method when listening to some events (e.g., hopper related events, call frequently). Re-creating BlockState and parsing item stacks in massive and frequent calls are very expensive.
+ See Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) for more information.
+
+ - If set to \`true\`, it always creates a snapshot (copy) of BlockState when the plugin calls related methods.
+ - If set to \`false\`, it gets the real BlockState directly unless the plugin explicitly requests a snapshot. Performance improves, but there is a risk that the block state gets modified due to the plugin's poor design.
+
+
+ __⚡Recommended value: \`false\` (Only if you encounter specific lag described above)__`
},
"inactive-goal-selector-throttle": {
default: true,
- desc:
- "Throttles the [goal selector](https://maven.fabricmc.net/docs/yarn-1.21.4+build.8/net/minecraft/entity/ai/goal/GoalSelector.html) calculations for entities that are inactive (typically far from players).
" +
- "Instead of ticking goal selector every tick, it ticks less frequently to every second. This can improve performance slightly, but has minor gameplay implications.
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to throttle the [goal selector](https://maven.fabricmc.net/docs/yarn-1.21.1+build.3/net/minecraft/entity/ai/goal/GoalSelector.html) calculations for entities that are inactive (typically far from players).
+ Instead of ticking the goal selector every tick, it ticks less frequently every second. This can improve performance slightly, but has minor gameplay implications.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"throttle-hopper-when-full": {
enabled: {
default: false,
- desc:
- "Whether to throttle hopper item transfer attempts if the target container is full.
" +
- "Prevents the hopper from constantly trying to push items every tick, even if it keeps failing.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to throttle hopper item transfer attempts if the target container is full.
+ Prevents the hopper from constantly trying to push items every tick, even if it keeps failing.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"skip-ticks": {
default: 0,
- desc:
- "How many ticks a hopper should wait before trying to move items again if the target container is full.
" +
- "(Unit: tick)
" +
- "Only active if `throttle-hopper-when-full.enabled` (described above) is `true`.
" +
- "If a value ≤ `0` is given, this throttling feature is disabled.
" +
- "
" +
- "__⚡Recommended value: `8`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | 8 |
" +
- "| Vanilla behavior | 8 |
" +
- "
"
+ desc: `How many ticks should a hopper wait before trying to move items again if the target container is full.
+ (Unit: tick)
+ Only active if \`throttle-hopper-when-full.enabled\` above is \`true\`.
+ If a value ≤ \`0\` is given, this throttling feature is disabled.
+
+ __⚡Recommended value: \`8\`__
+
+ | Values for goals | |
+ | Optimization | 8 |
+ | Vanilla behavior | 8 |
+
`
}
},
"skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer": {
default: true,
- desc:
- "Whether to skip updating map item data update if the map doesn't have a renderer (`CraftMapRenderer`).
" +
- "This can improve performance if using ImageMap kind of plugins that create many custom maps.
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
" +
- '' +
- '
Attention
' +
- "This may cause vanilla map item data to stop be updated." +
- "
"
+ desc: `Whether to skip updating map item data if the map doesn't have a renderer (\`CraftMapRenderer\`).
+ This can improve performance if using ImageMap kind of plugins that create many custom maps.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Attention
+ This may cause vanilla map item data to stop being updated.
+
`
},
"skip-ai-for-non-aware-mob": {
default: true,
- desc:
- " Whether to skip AI ticks entirely for mobs that are both *inactive* and *unaware*.
" +
- "Unaware mobs optimized this way will not perform self actions or react until they become active again, see [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.4/org/bukkit/entity/Mob.html#setAware(boolean)) for more information.
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to skip AI ticks entirely for mobs that are both _inactive_ and _unaware_.
+ Unaware mobs optimized this way will not perform self actions or react until they become active again, see [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.1/org/bukkit/entity/Mob.html#setAware(boolean)) for more information.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"reduce-packets": {
- __desc__: "This section is for the useless packet reducing features.",
+ __desc__: "This section is for the useless packet-reducing features.",
"reduce-entity-move-packets": {
default: false,
- desc:
- "Whether to reduce the useless entity movement packets sent to players (e.g., small movements).
" +
- "This can save bandwidth and reduces client-side processing load, potentially making movement appear smoother during high entity counts or minor lag.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to reduce the useless entity movement packets sent to players (e.g., small movements).
+ This can save bandwidth and reduce client-side processing load, potentially to make movement appear smoother during high entity counts or minor lag.
+
+ __⚡Recommended value: \`true\`__`
}
},
"optimized-powered-rails": {
default: true,
- desc:
- "Whether to use optimized powered rails. Uses fully rewritten version of powered rail iteration logic which also keeps vanilla behavior, can achieve 4x faster performance.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to use optimized powered rails.
+ Uses a fully rewritten version of powered rail iteration logic, which also keeps vanilla behavior, and can achieve 4x faster performance.
+ The implementation is originally based on the fabric mod [FX's Rail Optimization](https://modrinth.com/mod/rail-optimization) made by [Fx Morin](https://github.com/FxMorin).
+
+ __⚡Recommended value: \`true\`__`
},
"optimize-minecart": {
enabled: {
default: false,
- desc:
- "Whether to optimize minecart ticking. By skipping tick collisions to reduce expensive `getEntities()` calls and bukkit event calls.
" +
- "This can handle a large amount of stacked minecarts better which is useful for [Anarchy servers](https://minecraftservers.org/type/anarchy).
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to optimize minecart ticking. By skipping tick collisions to reduce expensive \`getEntities()\` calls and Bukkit event calls.
+ This can handle a large amount of stacked minecarts better, which is useful for [Anarchy servers](https://minecraftservers.org/type/anarchy).
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"skip-tick-count": {
default: 30,
- desc:
- "How many ticks to skip before checking for the next minecart collisions.
" +
- "
" +
- "__⚡Recommended value: `30`__"
+ desc: `How many ticks to skip before checking for the next minecart collisions.
+
+ __⚡Recommended value: \`30\`__`
}
},
"faster-structure-gen-future-sequencing": {
default: true,
- desc:
- "Whether to use faster task sequencing for generating structures." +
- '' +
- '
Attention
' +
- "This may cause the inconsistent order of future compose tasks." +
- "
"
+ desc: `Whether to use faster task sequencing for generating structures.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ This may cause the inconsistent order of future compose tasks in rare edge cases, which may lead to different structure generation results.
+
`
},
"faster-random-generator": {
enabled: {
default: false,
- desc:
- "Whether to use the faster random generator.
" +
- "Random is used almost everywhere in Minecraft, enable this can get a decent performance improvement.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__" +
- '' +
- '
Attention
' +
- "Requires a JVM that supports `RandomGenerator`. Some JREs don't support this." +
- "
"
+ desc: `Whether to use the faster random generator introduced in Java 17.
+ Random is used almost everywhere in Minecraft, enabling this can get a decent performance improvement.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ This requires a JVM that supports \`RandomGenerator\`. Some JREs don't support it.
+
`
},
"random-generator": {
default: "Xoroshiro128PlusPlus",
- desc:
- "Which random generator will be used?
" +
- "Available random generators can be found in [Random Number Generators in Java](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1).
" +
- "
" +
- "__⚡Recommended value: `Xoroshiro128PlusPlus`__"
+ desc: `The specific algorithm of the random generator should be used.
+ Available random generators can be found in [Random Number Generators in Java](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1) or [JEP 356](https://openjdk.org/jeps/356).
+
+ __⚡Recommended value: \`Xoroshiro128PlusPlus\`__`
},
"enable-for-worldgen": {
default: false,
- desc:
- "Whether to use the faster random generator for world generation.
" +
- "" +
- "- If `true`, `Random` calls involved in world generation will use faster random generator you chose in `random-generator` above. The world generation will be slightly different from vanilla.
" +
- "- If `false`, `Random` calls involved in world generation will use legacy random generator of vanilla.
" +
- "
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to use the faster random generator for world generation.
+
+ - If set to \`true\`, \`Random\` calls involved in world generation will use the faster random generator you chose in \`random-generator\` above. The world generation will be slightly different from vanilla.
+ - If set to \`false\`, \`Random\` calls involved in world generation will use legacy random generator of vanilla.
+
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Warning
+ This will affect world generation. The terrain and other results of world generation will be slightly different from vanilla.
+
`
},
"warn-for-slime-chunk": {
default: true,
- desc: "Whether server prints a warning message on startup if you are using faster random generator for slime chunk generation."
+ desc: "Whether the server prints a warning message on startup if the faster random generator for slime chunk generation is enabled."
},
"use-legacy-random-for-slime-chunk": {
default: false,
- desc:
- "Whether to use legacy random source for slime chunk generation to follow the vanilla behavior.
" +
- "If your server has existing slime farms or related facilities need slime chunk, enable this, otherwise the location of slime chunk will offset.
" +
- "
" +
- "__⚡Recommended value:__ (Depends on your server type, see `Values for goals` below for more.)" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | false |
" +
- "| Vanilla behavior | true |
" +
- "
"
+ desc: `Whether to use legacy random source (\`java.util.Random\`) for slime chunk generation to follow the vanilla behavior.
+ If your server has existing slime farms or related facilities that need slime chunk, enable this; otherwise, the location of slime chunk will be offset.
+
+ __⚡Recommended value: (Depends on your server type, see \`Values for goals\` below for more)__
+
+ | Values for goals | |
+ | Optimization | false |
+ | Vanilla behavior | true |
+
`
}
},
- "entity-timeouts": {
+ "enable-cached-minecraft-to-bukkit-entitytype-convert": {
+ default: true,
+ desc: `Whether to cache the result of *Minecraft EntityType* to *Bukkit EntityType* conversion. This conversion can be somewhat expensive, especially in the spawning logic, so caching it can improve performance slightly.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ dab: {
__desc__:
- "These values define an entity's maximum lifespan (i.e. Entity TTL).
" +
- "(Unit: tick)
" +
- "If an entity is in this list, and it has survived for longer than that number of ticks, then it will be removed. 🛈
" +
- "If a value `-1` is given, the Entity TTL check will disable for specific entity.
" +
- "
" +
- "__⚡Recommended values:__" +
- "" +
- "| Entity | Max Lifespan |
" +
- "" +
- "| SNOWBALL | 200 |
" +
- "| LLAMA_SPIT | 150 |
" +
- "| DRAGON_FIREBALL | 150 |
" +
- "| EGG | 300 |
" +
- "| FIREBALL | 600 |
" +
- "| SMALL_FIREBALL | 400 |
" +
- "| WIND_CHARGE | 200 |
" +
- "| BREEZE_WIND_CHARGE | 200 |
" +
- "| WITHER_SKULL | 200 |
" +
- "
" +
- "🛈 = In here, the time that the entity survived means the total living time of entity, and will not be reset by chunk unloading or loading.",
+ "Dynamic Activation of Brain, also known as DAB, optimizes the brain of entities by decreasing the frequency of their brain ticking when they are far away from players. It is a worthwhile trade-off to improve performance if there are many entities.",
+ enabled: {
+ default: true,
+ desc: `Whether to enable the DAB.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false (or see dab.blacklisted-entities below for more) |
+
`
+ },
+ "dont-enable-if-in-water": {
+ default: false,
+ desc: `Whether the non-aquatic entities in the water will be excluded by DAB. This can fix [Pufferfish#58](https://github.com/pufferfish-gg/Pufferfish/issues/58).
+ If set to \`true\`, this could fix entities suffocating in the water if they are far from the player.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "start-distance": {
+ default: 12,
+ desc: `The distance determines how far away an entity has to be from the player to start being affected by DAB.
+ (Unit: block)
+
+ __⚡Recommended value: \`8\`__`
+ },
+ "max-tick-freq": {
+ default: 20,
+ desc: `The maximum tick time defines how often the furthest entity will get their pathfinders and behaviors ticked.
+ (Unit: tick, default value 20 ticks = 1s)`
+ },
+ "activation-dist-mod": {
+ default: 8,
+ desc: `The tick frequency that defines how much distance modifies an entity's tick frequency. \`freq = (distanceToPlayer^2) / (2^value)\`.
+
+ - If you want entities further away to tick __less__ often, try \`7\`.
+ - If you want entities further away to tick __more__ often, try \`9\`.
+
+
+ __⚡Recommended value: \`7\`__`
+ },
+ "blacklisted-entities": {
+ default: "[]",
+ desc: `A list of entity types that will not be affected by DAB.
+
+ Some survival servers have mob farms, which need mobs to have a target. This kind of "pathfinding" mob farm may be broken by DAB. This situation can be solved by adding specific mobs of the mob farm to this DAB blacklist.
+ If some specific mob farms are broken in your server, mobs freeze and don't move, and you are not sure whether it is caused by DAB. You can try to add them to this blacklist to see if it fixes the issue.
+
+ Format: \`[villager]\` or \`[villager, zombified_piglin]\` (You can find all entity types in [Paper's Javadoc](https://jd.papermc.io/paper/1.21.1/org/bukkit/entity/EntityType.html)).
+
+ [💡 Want to Go Deeper?](guides/dab-blacklist-format)`
+ }
+ },
+ "dont-save-entity": {
+ "dont-save-primed-tnt": {
+ default: false,
+ desc: `Whether to disable saving primed TNT on chunk unloads.
+ This can prevent machines or redstone builds from being exploded by TNT when the player accidentally disconnects or when the chunk unloads when the player is far away. Useful for redstone/technical/survival servers that have machines involving TNTs.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "dont-save-falling-block": {
+ default: false,
+ desc: `Whether to disable saving falling blocks on chunk unloads.
+ This can prevent potential issues with glitched or duplicated falling blocks (sand, gravel, etc.) after server restarts or chunk loads, especially if caused by lag.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "entity-timeouts": {
+ __desc__: `These values define an entity's maximum lifespan (i.e., Entity TTL).
+ (Unit: tick)
+ If an entity is in this list and it has survived for longer than that number of ticks, then it will be removed. ⓘ
+ If a value \`-1\` is given, the Entity TTL check will be disabled for a specific entity.
+
+ __⚡Recommended values:__
+
+ | Entity | Max Lifespan |
+
+ | SNOWBALL | 200 |
+ | LLAMA_SPIT | 150 |
+ | DRAGON_FIREBALL | 150 |
+ | EGG | 300 |
+ | FIREBALL | 600 |
+ | SMALL_FIREBALL | 400 |
+ | WIND_CHARGE | 200 |
+ | BREEZE_WIND_CHARGE | 200 |
+ | WITHER_SKULL | 200 |
+
+ ⓘ = In here, the time that the entity survived means the total living time of the entity, and will not be reset by chunk unloading or loading.`,
ALLAY: {
default: -1
},
@@ -701,149 +768,52 @@ const config: ConfigRoot = {
FISHING_BOBBER: {
default: -1
}
- },
- "enable-cached-minecraft-to-bukkit-entitytype-convert": {
- default: true,
- desc:
- "Whether to cache the result of *Minecraft EntityType* to *Bukkit EntityType* conversion. It can get a tiny improvement.
" +
- "
" +
- "__⚡Recommended value: `true`__"
- },
- dab: {
- enabled: {
- default: true,
- desc:
- "Dynamic Activation of Brain, as known as DAB, optimizes entity's brain to decrease the frequency of their brain ticking when they are far away from players.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false (or see dab.blacklisted-entities below for more) |
" +
- "
"
- },
- "dont-enable-if-in-water": {
- default: false,
- desc:
- "Whether non-aquatic entities in the water will not be affected by DAB.
" +
- "If `true`, this could fix entities suffocate in the water if they are far from the player. This fixed [Pufferfish's issue#58](https://github.com/pufferfish-gg/Pufferfish/issues/58).
" +
- "
" +
- "__⚡Recommended value: `true`__"
- },
- "start-distance": {
- default: 12,
- desc:
- "This value determines how far away an entity has to be from the player to start being affected by DAB.
" +
- "
" +
- "__⚡Recommended value: `8`__"
- },
- "max-tick-freq": {
- default: 20,
- desc:
- "This value defines how often the furthest entity will get their pathfinders and behaviors ticked
." +
- "(Unit: tick, default value 20 ticks = 1s)"
- },
- "activation-dist-mod": {
- default: 8,
- desc:
- "This value defines how much distance modifies an entity's tick frequency. `freq = (distanceToPlayer^2) / (2^value)`." +
- "" +
- "- If you want entities further away to tick __less__ often, use `7`.
" +
- "- If you want entities further away to tick __more__ often, try `9`.
" +
- "
" +
- "
" +
- "__⚡Recommended value: `7`__"
- },
- "blacklisted-entities": {
- default: "[]",
- desc:
- "A list of entities that will not be affected by DAB.
" +
- "
" +
- 'Some survival servers have mob farms which need mobs to have a target. This kind of "pathfinding" mob farm may break by DAB. This situation can be solved by adding specific mob of mob farm into this DAB blacklist.
' +
- "If some specific mob farms are broken in your server, mobs freeze and don't move, and you are not sure whether it is caused by DAB. You can try to add them into this blacklist to see if it fixes the issue.
" +
- "
" +
- "Format: `[VILLAGER]` or `[VILLAGER, ZOMBIFIED_PIGLIN]` (You can find all entity types in [Paper's Javadoc](https://jd.papermc.io/paper/1.21.1/org/bukkit/entity/EntityType.html))." +
- // This is completely broken.
- '' +
- 'Want to Go Deeper?
' +
- "For the format of `dab.blacklisted-entities`, it accepts all valid format of a YAML list.
" +
- "
" +
- "If you only need to add one entity into blacklist, these formats below are allowed:" +
- "```yaml" +
- "dab:" +
- " blacklisted-entities: [VILLAGER]" +
- "```" +
- "or" +
- "```yaml" +
- "dab:" +
- " blacklisted-entities:" +
- " - VILLAGER" +
- "```" +
- "And if you need to add multiple entities into blacklist, these formats below are allowed:" +
- "```yaml" +
- "dab:" +
- " blacklisted-entities: [VILLAGER, ZOMBIFIED_PIGLIN]" +
- "```" +
- "or" +
- "```yaml" +
- "dab:" +
- " blacklisted-entities:" +
- " - VILLAGER" +
- " - ZOMBIFIED_PIGLIN" +
- "```" +
- "If you are not sure, use [YAML Checker](https://yamlchecker.org/), or any online YAML syntax validator to check your config."
- }
- },
- "dont-save-entity": {
- "dont-save-primed-tnt": {
- default: false,
- desc:
- "Disable save primed tnt on chunk unloads.
" +
- "It can prevent machines from being exploded by TNT when the player accidentally disconnected or chunk unloads when the player is far away. Useful for survival servers which have machines involved TNT.
" +
- "
" +
- "__⚡Recommended value: `true`__"
- },
- "dont-save-falling-block": {
- default: false,
- desc: "Disable save falling block on chunk unloads.
" + "
" + "__⚡Recommended value: `true`__"
- }
}
},
fixes: {
- __desc__: "This section contains bugfixes for specific issues.",
+ __desc__: "This section contains bug fixes for specific issues.",
"dont-place-player-if-server-full": {
default: false,
- desc:
- "Whether to disallow player join a server if the server is full.
" +
- "If `true`, you should give player `purpur.joinfullserver` permission instead of using `PlayerLoginEvent#allow` to enable player to join a full server."
+ desc: `Whether to disallow players from joining if the server is full (defined as \`max-players\` in \`server.properties\`).
+ This option fixed [Paper#10668](https://github.com/PaperMC/Paper/issues/10668).
+
+ If set to \`true\`, you should grant player \`purpur.joinfullserver\` permission rather than using \`PlayerLoginEvent#allow\` API to allow players to bypass the limit.`
}
},
"gameplay-mechanisms": {
- __desc__: "This section contains the features that modify the game mechanics.",
+ __desc__: "This section contains the features that modify or improve the game mechanics.",
"use-spigot-item-merging-mechanism": {
default: true,
- desc: "Whether to use Spigot's dropped item merging mechanism."
+ desc: `Whether to merge dropped items based on their tick sequence, which is the long-standing default behavior of Spigot.
+
+ In Spigot, the item entity that ticks later will merge into the earlier ticking one. If the merge radius is relatively larger, it can prevent dropped items from getting stuck at unexpected locations. So that this is useful for farms or redstone builds that can create numerous dropped items.
+ However, in vanilla, the item merging is based on the item count of the stack. The stack with the smaller count will merge with the one with the larger count.
+
+ | Values for goals | |
+ | SMP friendly | true |
+ | Vanilla behavior | false |
+
`
},
"smooth-teleport": {
default: false,
- desc:
- 'hether to make a "smooth teleport" when players change dimension.
' +
- "This requires original world and target world that have the same logical height to work." +
- '' +
- '
Warning
' +
- "Experimental feature, report any bugs you encounter!" +
- "
"
+ desc: `Whether to make a "smooth teleport" when players change dimensions.
+ This requires original world and target world that have the same logical height to work.
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
},
"max-item-stack-count": {
- __desc__:
- "Configurable max stack size of dropped item." +
- '' +
- '
Warning
' +
- "We __do not__ recommended to use this feature. It is working in progress and has known issues.
" +
- "This feature also maybe remove in the future. __Do not__ touch this unless you know what you are doing!" +
- "
",
+ __desc__: `Configurable max stack size of dropped item.
+
+
+
Warning
+ We __do not__ recommend using this feature. It is a work in progress and has known issues.
+ This feature may also be removed in the future. __Do not__ touch this unless you know what you are doing!
+
`,
"max-dropped-items-stack-count": {
default: 0,
desc: "Maximum number of dropped items to stack."
@@ -865,116 +835,112 @@ const config: ConfigRoot = {
},
"can-player-knockback-zombie": {
default: true,
- desc: "Whether the player can knockback zombies."
+ desc: "Whether the player can knockback zombies using the hand, weapon, projectile, etc."
}
},
player: {
"disable-moved-wrongly-threshold": {
default: false,
- desc:
- "Whether to disable the Spigot built-in moved too quickly / wrongly checks for players and vehicles.
" +
- "If `true`, players can move or use vehicles (e.g. Minecart) to move with abnormal speed.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to disable the Spigot built-in moves too quickly / wrongly checks for players and vehicles.
+ If set to \`true\`, players can move or use vehicles (e.g., Minecart) to move at an abnormal speed.
+
+ __⚡Recommended value: \`true\`__`
},
"max-use-item-distance": {
default: 1.0000001,
- desc:
- "The max distance that the player is allowed to interact with an item.
" +
- "
" +
- "Some [Anarchy servers](https://minecraftservers.org/type/anarchy) or similar type of servers may allow players to use hacks / cheats. If you want players able to use crystal related modules that are packet-based (e.g. CEV Breaker, BedAura), you may need to adjust this value.
" +
- "It's better to set value to `10.0000001`, to allow using related hack modules." +
- "
" +
- "If a value `-1` is given, the check of max allowed distance to use an item will be disabled.
" +
- "
" +
- "__⚡Recommended value: `10.0000001` (For anarchy server)__" +
- '' +
- '
Attention
' +
- "If set to `-1`, players are able to use some packet modules of hack clients, and also [Nocom Exploit](https://github.com/nerdsinspace/nocom-explanation)!" +
- "
"
+ desc: `The maximum distance that the player is allowed to interact using an item.
+ (Unit: block)
+
+ Some [Anarchy servers](https://minecraftservers.org/type/anarchy) or similar types of servers may allow players to use hacks/cheats. If you want players to be able to use crystal related modules that are packet-based (e.g., CEV Breaker, BedAura), you may need to adjust this value.
+ It's better to set the value to \`10.0000001\` to allow using related hack modules.
+
+ If set to \`-1\` is given, the check of the maximum allowed distance to use an item will be disabled.
+
+ __⚡Recommended value: \`10.0000001\` (Only for anarchy server)__
+
+
+
Attention
+ If set to \`-1\` or any large positive values, players can use some packet modules of hack clients, and are also able to use [Nocom Exploit](https://github.com/nerdsinspace/nocom-explanation)! Adjusting this option requires careful consideration of potential exploits.
+
`
}
},
"afk-command": {
enabled: {
default: false,
- desc:
- "Wether to enable rhe AFK command based on Minecraft built-in [idle-timeout mechanism](https://minecraft.wiki/w/Server.properties#:~:text=player%20have%20to%20idle).
" +
- "Players can use /afk command to switch their AFK mode, and their AFK status can be shown in Tab list.
" +
- "Rest of AFK settings, configurable AFK messages, title messages, are in Purpur config."
+ desc: `Whether to enable the AFK command based on Minecraft's built-in [idle-timeout mechanism](https://minecraft.wiki/w/Server.properties#:~:text=player%20have%20to%20idle). Players can use \`/afk\` command to switch their AFK mode, and their AFK status can be shown in the Tab list.
+
+ Also set \`kick-if-idle\` to \`false\` in Purpur config, to prevent players from being kicked when they enter AFK mode. The rest of the AFK settings, configurable AFK messages, and title messages are in Purpur config.`
}
}
},
network: {
- __desc__: "This section contains features for server networking related.",
+ __desc__: "This section contains features related to server networking.",
"protocol-support": {
- __desc__:
- "This section contains features that provide extra protocol support for some QoL / Utility mods.
" +
- "
" +
- "The extra protocol support is only functional if there is corresponding client-side mod installed. It means if a specific protocol support is enabled, and a player installed that mod on client, they can get the additional features described in each config below. But for players who have no corresponding mod installed, then everything is the same as before." +
- '' +
- '
Attention
' +
- "The protocol support may cause incompatibility with the [ViaVersion](https://modrinth.com/plugin/viaversion).
" +
- " We recommend players to use client that has same version with the server core and install latest corresponding mod, otherwise they may unable to join the server." +
- "
",
+ __desc__: `This section contains features that provide extra protocol support for some QoL / Utility mods.
+
+ The extra protocol support is only functional if there is a corresponding client-side mod installed. It means if a specific protocol support is enabled, and a player installs that mod on the client, they can get the additional features described in each config below. But for players who have no corresponding mod installed, then everything is the same as before.
+
+
+
Attention
+ The protocol support may cause incompatibility with the [ViaVersion](https://modrinth.com/plugin/viaversion).
+ We recommend players use a client that has the same version as the server core and install the latest corresponding mod; otherwise, they may be unable to join the server.
+
`,
"jade-protocol": {
default: false,
- desc:
- "Whether to enable [Jade](https://modrinth.com/mod/jade) protocol support.
" +
- "If `true`, player who has Jade mod installed, can display item information inside the storage container, progress of furnace, brewing stand, foods on the campfire, bee data in beehive, and more vanilla-friendly features."
+ desc: `Whether to enable [Jade](https://modrinth.com/mod/jade) protocol support.
+ If set to \`true\`, players who have the Jade mod installed can display item information inside the storage container, progress of the furnace, brewing stand, foods on the campfire, bee data in the beehive, and more vanilla-friendly features.`
},
"appleskin-protocol": {
default: false,
- desc:
- "Whether to enable [AppleSkin](https://modrinth.com/mod/appleskin) protocol support.
" +
- "If `true`, player who has AppleSkin mod installed, can display the accurate saturation / exhaustion values on the client."
+ desc: `Whether to enable [AppleSkin](https://modrinth.com/mod/appleskin) protocol support.
+ If set to \`true\`, players who have the AppleSkin mod installed can display the accurate saturation/exhaustion values on the client.`
},
"asteorbar-protocol": {
default: false,
- desc:
- "Whether to enable [AsteorBar](https://modrinth.com/mod/asteorbar) protocol support.
" +
- "If `true`, player who has AsteorBar mod installed, can display the accurate saturation / exhaustion values on the client."
+ desc: `Whether to enable [AsteorBar](https://modrinth.com/mod/asteorbar) protocol support.
+ If set to \`true\`, players who have the AsteorBar mod installed can display the accurate saturation/exhaustion values on the client.`
},
"chatimage-protocol": {
default: false,
- desc:
- "Whether to enable [ChatImage](https://modrinth.com/mod/chatimage) protocol support.
" +
- "If `true`, player who has ChatImage mod installed, can see the image sent by others using CICode format."
+ desc: `Whether to enable [ChatImage](https://modrinth.com/mod/chatimage) protocol support.
+ If set to \`true\`, players who have the ChatImage mod installed can see the image sent by others using the CICode format.`
},
"xaero-map-protocol": {
default: false,
- desc:
- "Whether to enable [XaeroMap](https://modrinth.com/mod/xaeros-minimap) protocol support.
" +
- "If `true`, player who has Xaero's MiniMap mod or Xaero's WorldMap mod installed, can store players' coordinate points and death points based on server's `protocol-support.xaero-map-server-id` below, to prevent points from been deleted / refreshed if server name or IP address changed."
+ desc: `Whether to enable [XaeroMap](https://modrinth.com/mod/xaeros-minimap) protocol support.
+ If set to \`true\`, players who have Xaero's MiniMap mod or Xaero's WorldMap mod installed can store players' coordinate points and death points based on the server's \`protocol-support.xaero-map-server-id\` below.`
},
"xaero-map-server-id": {
default: 513317,
- desc: "Numeric id for XaeroMap to identify the server. This will generate randomly on first start."
+ desc: `Unique number ID for XaeroMap to identify the server.
+ This can prevent points from being deleted/refreshed if the server name or IP address changes. Change this value if needed.
+ This value will be generated randomly on the first server start.`
},
"syncmatica-protocol": {
default: false,
- desc:
- "Whether to enable [Syncmatica](https://modrinth.com/mod/syncmatica) protocol support.
" +
- "If `true`, player who has Syncmatica mod installed, can upload their [Litematica](https://modrinth.com/mod/litematica) schematics files or download shared schematics files from the server. Every player with Syncmatica mod installed can access shared schematics uploaded by others."
+ desc: `Whether to enable [Syncmatica](https://modrinth.com/mod/syncmatica) protocol support.
+ If set to \`true\`, players who have Syncmatica mod installed can upload their [Litematica](https://modrinth.com/mod/litematica) schematic files or download shared schematics files from the server. Every player with the Syncmatica mod installed can access shared schematics uploaded by others.`
},
"syncmatica-quota": {
default: false,
- desc: "Whether to enable maximum file size limit for each shared schematics file of Litematica mod."
+ desc: "Whether to enable the maximum file size limit for each shared schematics file of the Litematica mod."
},
"syncmatica-quota-limit": {
default: 40000000,
- desc:
- "Maximum file size, in bytes, for each shared schematics file uploading to server.
" +
- "(Unit: byte, default value 40,000,000 bytes ≈ 38 MB)"
+ desc: `The maximum file size of each shared schematic file is uploaded to the server.
+ (Unit: byte, default value 40,000,000 bytes ≈ 38 MB)`
}
},
"chat-message-signature": {
default: true,
- desc:
- "Whether to enable chat message signature which introduced since Minecraft 1.19.1.
" +
- "If `false`, players' chat messages become unable to report, and the insecure warning popup when player joined the server will be disabled.
" +
- "
" +
- "__⚡Recommended value: `false`__"
+ desc: `Whether to enable chat message signature, which was introduced in Minecraft 1.19.1.
+
+ - If set to \`true\`, messages are signed and able to report just like in vanilla.
+ - If set to \`false\`, the chat signature is disabled. Players are unable to report messages, and the insecure warning pop-up will be disabled when the player joins the server.
+
+
+ __⚡Recommended value: \`false\`__ (Only for offline-mode server or servers that have alternative moderation methods)`
}
},
@@ -983,179 +949,208 @@ const config: ConfigRoot = {
message: {
"unknown-command": {
default: "",
- desc:
- "Unknown command message, will send to player if they execute an unknown command.
" +
- "The message needs to use [MiniMessage](https://docs.advntr.dev/minimessage/format) format.
" +
- "If set message to `default` or leave the default value, the vanilla unknown command message will be used.
" +
- "
" +
- "Available placeholders:" +
- "" +
- "- __``__ - the detailed information of the unknown command.
" +
- "
" +
- '' +
- '
API / Plugin Friendly
' +
- "This feature is API / plugin friendly." +
- "It means that this message can be overrided by plugins using `UnknownCommandEvent#message` or `UnknownCommandEvent#setMessage`." +
- "
"
+ desc: `The unknown command message will be sent to the player if they execute an unknown command.
+ The message needs to use the [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/) format.
+ If set to \`default\`, the vanilla unknown command message will be used.
+
+ Available placeholders:
+
+ - __\`\`__ - the detailed information of the unknown command.
+
+
+
+
API / Plugin Friendly
+ This feature is API / plugin-friendly. It means that this message can be overridden by plugins using \`UnknownCommandEvent#message\` or \`UnknownCommandEvent#setMessage\`.
+
`
}
},
rebrand: {
"server-mod-name": {
default: "Leaf",
- desc: "Server brand name that shows in F3 menu and server MOTD."
+ desc: "The server brand name that will be shown on the client's F3 debug menu and server MOTD."
},
"server-gui-name": {
default: "Leaf Console",
- desc: "Server GUI window name, if you launched server without adding `--nogui` option in the startup flag."
+ desc: "The title displayed on the server GUI window, if you launched the server without adding the \`--nogui\` option in the startup flag."
}
},
sentry: {
- __desc__:
- "[Sentry](https://sentry.io/welcome/) is an application monitor service for improved error logging, tracing. Helping the server dev team to maintain better.
" +
- "
" +
- "After enabled Sentry integration for your server, you don't need to audit long logs to find errors manually. Sentry can collect errors happened in your server, enable you to track errors on Sentry's web panel and help you to locate and fix them easier and faster.
" +
- "
" +
- "See __[How to Setup Sentry](../../how-to/setup-sentry.md)__ to know how to set up and get the DSN key for `sentry.dsn` below.
",
+ __desc__: `[Sentry](https://sentry.io/welcome/) is an application monitor service for improved error logging and tracing. Helping the server dev team to maintain better.
+
+ After enabling Sentry integration for your server, you don't need to audit long logs to find errors manually. Sentry can collect errors that happened in your server, enable you to track errors on Sentry's web panel, and help you to locate and fix them more easily and quickly.
+
+ See __[How to Setup Sentry](../how-to/setup-sentry)__ to know how to set up and get the DSN key for \`sentry.dsn\` below.
`,
dsn: {
- default: "",
- desc:
- "The DSN key of your Sentry.
" + "If an empty value `''` is given, the Sentry will be disabled."
+ default: "''",
+ desc: `The DSN key of your Sentry.
+ If an empty value \`''\` is given, the Sentry will be disabled.`
},
"log-level": {
default: "WARN",
- desc: "Logs with a level higher than or equal to this level will be recorded."
+ desc: `Logs with a level higher than or equal to this level will be recorded.
+ The valid values for this option are: \`"WARN"\`, \`"ERROR"\`, and \`"FATAL"\`.`
},
"only-log-thrown": {
default: true,
- desc: "Only to log with a Throwable will be recorded after enabling this. "
+ desc: "Whether the Sentry only records the log with Java's \`Throwable\`."
}
},
"secure-seed": {
enabled: {
default: false,
- desc:
- "Whether to use secure seed.
" +
- "All ores and structures are generated with 1024-bit seed instead of using 64-bit seed in vanilla, made seed cracker become impossible.
" +
- "If used in the existing world, then the secure seed will only apply to new generating chunks.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | - |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to use the secure seed.
+
+ The secure seed ensures that all ores and structures are generated with a 1024-bit seed using a high security cryptographic hash function instead of using a 64-bit seed like in vanilla. This protects the structure seeds with computational secrecy and makes the seed cracking nearly impossible.
+
+
+
Warning
+ The secure seed fundamentally changes the positions of ore and structure compared to vanilla.
+ It only applies to newly generated chunks. Thus, you must prepare a new world if you want to enable this option.
+ Once this option is enabled, you can not disable it to return to the vanilla generation, unless you pre-generate the entire world, or newly generated chunks will have terrain mismatch.
+
`
}
},
"remove-vanilla-username-check": {
default: true,
- desc:
- "Whether to remove vanilla's username check to allow __all characters__ as username, including Chinese, etc. (It's only useful for offline servers).
" +
- "If `true`, players are allowed to use non-English name to join the server."
+ desc: `Whether to remove vanilla's username check to allow __all characters__ as usernames, including Chinese, etc. (It's only useful for offline servers).
+ If set to \`true\`, players are allowed to use a non-English name to join the server.`
},
"remove-spigot-check-bungee-config": {
default: true,
- desc: "Whether player can enter backend server via proxy, without the backend server to enable bungeecord mode in `spigot.yml`."
+ desc: `Whether the player can enter the backend server via proxy, without the backend server enabling BungeeCord mode in \`spigot.yml\`.
+
+
+
Warning
+ This option is not recommended to touch, unless you are sure what you are doing.
+ And it may be removed in the future.
+
`
},
"remove-change-non-editable-sign-warning": {
default: false,
- desc:
- "Whether the server prints warning when players tried to edit the sign that they are not allowed to edit.
" +
- "Enable this to prevent console spam in some cases.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether the server prints a warning message when players try to edit the sign that they are not allowed to edit.
+ The warning message looks like: \`Player [...] just tried to change non-editable sign\`.
+ If set to \`true\`, it will prevent console spam caused by player actions or other cases.
+
+ __⚡Recommended value: \`true\`__`
},
"region-format-settings": {
- __desc__:
- "Linear is a region file format that uses [ZSTD compression](https://facebook.github.io/zstd/) instead of ZLIB in vanilla Minecraft. This format saves about ~50% of disk space.
" +
- "To use Linear region format, make sure you __Read [Linear Documentation](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools)__, and have done all steps required, then change `region-format-settings.region-format` below to `LINEAR`." +
- '' +
- '
Warning
' +
- "Experimental feature, there is potential risk to lose chunk data. Backup your server before switching to Linear.
" +
- "Also, we do not recommend using Linear, since vanilla's ANVIL format (.mca) is enough. Leaf uses the refactored version of the Linear flush system, which is safer but slower to save chunks to make data lost less possible. However this change is worth it, data is invaluable." +
- "
",
+ __desc__: `Linear is a region file format that uses [zstd compression](https://facebook.github.io/zstd/) instead of zlib in vanilla Minecraft. This format saves about ~50% of disk space.
+ To use Linear region format, make sure you __read [Linear Documentation](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools)__, and have done all steps required, then change \`region-format\` below to \`LINEAR\`.
+
+
+
Warning
+ Experimental feature, there is a potential risk of losing chunk data. Backup your server before switching to Linear.
+ Also, we do not recommend using Linear, since vanilla's ANVIL format (\`.mca\`) is enough. Leaf uses the refactored version of the Linear flush system, which is safer but slower to save chunks to make data loss less likely. However, this trade-off is worthwhile, since data is invaluable.
+
`,
"region-format": {
default: "MCA",
- desc: 'Available region formats: `"MCA"`, `"LINEAR"`.'
+ desc: `Specifies the format used for saving chunk data in region files.
+ Available region formats:
+
+ - \`MCA\`: Standard Minecraft ANVIL format using zlib compression.
+ - \`LINEAR\`: The Linear v1 format. The refactored version by [EarthMe](https://github.com/MrHua269) fixed the Linear flush system.
+
`
},
"linear-compress-level": {
default: 1,
- desc: "The compression level for Linear region format file."
+ desc: `The compression level of the Linear region format file.
+ This only has any effect if \`region-format\` above is \`LINEAR\`.
+
+
+ - If set to a higher level (up to \`22\`), it provides better compression ratios but requires significantly more CPU time for compression.
+ - If set to a lower level, it compresses faster, but requires more space. The level \`1\` uses the fastest and lightest compression.
+
`
},
"throw-on-unknown-extension-detected": {
default: false,
- desc: "Whether to throw error to crash the server when unknown region format extension is detected."
+ desc: `Whether to throw an error and crash the server when an unknown or unmatched region format extension is detected during loading region files from the disk.
+ It can prevent data corruption from accidentally configured wrong region file formats in the same world.
+
+ For example:
+ If set to \`true\`, the server will crash immediately when loaded \`.linear\` files when \`region-format\` above is \`MCA\`, or vice-versa.`
},
"flush-interval-seconds": {
default: 5,
- desc: "The flush interval for Linear region format file data.
" + "(Unit: second)"
+ desc: `How often the server attempts to flush cached Linear region file data to the disk.
+ More frequent flushing reduces potential data loss on a crash but increases disk I/O.
+ (Unit: second)`
}
},
"lag-compensation": {
enabled: {
default: false,
- desc:
- "Lag compensation, which could ensure the basic game experience for players when server is lagging or low TPS situation.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__"
+ desc: `The lag compensation is designed to mitigate the gameplay impact of server lag spikes or low TPS situations, which could ensure the basic game experience for players during the lag.
+
+ __⚡Recommended value: \`true\`__`
},
"enable-for-water": {
default: false,
- desc:
- "Whether to enable lag compensation for water flowing.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to enable lag compensation for water flowing.
+
+ __⚡Recommended value: \`true\`__`
},
"enable-for-lava": {
default: false,
- desc:
- "Whether to enable lag compensation for lava flowing.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to enable lag compensation for lava flowing.
+
+ __⚡Recommended value: \`true\`__`
}
},
"including-5s-in-get-tps": {
default: true,
- desc:
- "Whether to include 5-second TPS in the result of API `Bukkit#getTPS` and `Server#getTPS`.
" +
- "" +
- "- If `true`, you can use `getTPS` method to get a TPS long array with 4 elements (`5s, 1m, 5m, 15m`).
" +
- "- If `false`, you can use `getTPS` method to get a TPS long array with 3 elements (`1m, 5m, 15m`).
" +
- "
" +
- '' +
- 'Want to Go Deeper?
' +
- "If you are using Gale API or Leaf API for your plugins. Or runinng on Leaf and use reflection to get TPS, you can use `Bukkit#getTPSIncluding5SecondAverage`, to get the TPS array including 5-seconds TPS (`5s, 1m, 5m, 15m`).
" +
- "Also, you can use `Bukkit#get5SecondTPSAverage` to get the average value of 5-seconds TPS in `double`." +
- " "
+ desc: `Whether to include 5-second TPS in the result of API \`Bukkit#getTPS\` and \`Server#getTPS\`.
+ Commands like \`/tps\` display it regardless.
+
+ - If set to \`true\`, you can use the \`getTPS\` method to get a TPS long array with 4 elements \`[5s, 1m, 5m, 15m]\`.
+ - If set to \`false\`, you can use the \`getTPS\` method to get a TPS long array with 3 elements \`[1m, 5m, 15m]\`.
+
+
+
+ Want to Go Deeper?
+ If you are using the Leaf API for your plugins. Or running on Leaf and using reflection to get TPS, you can use \`Bukkit#getTPSIncluding5SecondAverage\`, to get the TPS array including 5-second TPS \`[5s, 1m, 5m, 15m]\`.
+ Also, you can use \`Bukkit#get5SecondTPSAverage\` to get the average value of 5-second TPS in \`double\`.
+ `
},
"hidden-item-components": {
default: "[]",
- desc:
- "Controls whether specified component information is sent to clients. This may break resource packs and client mods that rely on this information. It needs a component type list, incorrect things will not work.
" +
- 'For example, you can fill it with `["custom_data"]` to hide components of *CUSTOM_DATA*. Also, it can avoid some frequent client animations.' +
- '' +
- '
Attention
' +
- "You must know what you're filling in and how it works! It handles all item stacks!" +
- "
"
+ desc: `The list of component type keys that will be hidden from the player's inventory sent to clients.
+
+ It can be used to hide complex component data on an item to reduce rendering load, frequent animations on the client side, and network usage. The actual item data will not be affected.
+
+ It is noted that this option is different from Paper's [item obfuscation](https://docs.papermc.io/paper/reference/global-configuration/#anticheat_obfuscation_items_enable_item_obfuscation). This option only hides item component data from the player's own inventory, instead of hiding data sent to others.
+ For example:
+
+ - If a value \`[]\` is given, no item will be affected.
+ - If a value \`[\"minecraft:custom_data\"]\` is given, the item's \`custom_data\` component will be hidden on the player's client.
+
+
+ See [List of components](https://minecraft.wiki/w/Data_component_format#List_of_components) to get the full list of available component type keys for items.
+
+
+
Attention
+ It may break resource packs, client mods, or specific gameplay mechanics that rely on these client-side component data of items. Use with caution. You must know what components you are hiding!
+
`
},
"connection-message": {
- __desc__:
- "Connection message, broadcasts to all online players, when they join or quit the server.
" +
- "The message needs to use [MiniMessage](https://docs.advntr.dev/minimessage/format) format.
" +
- "If set message to `default` or leave the default value, the vanilla join / quit message will be used.
" +
- "
" +
- "Available placeholders:" +
- "" +
- "- __`%player_name%`__ - player name.
" +
- "- __`%player_displayname%`__ - player display name.
" +
- "
" +
- '' +
- '
API / Plugin Friendly
' +
- "This feature is API / plugin friendly." +
- "It means that the connection message can be overrided by plugins using `PlayerJoinEvent` or `PlayerQuitEvent`." +
- "
",
+ __desc__: `The connection message broadcasts to all online players when they join or quit the server.
+ The message needs to use the [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/) format.
+ If set \`message\` below to \`default\`, the vanilla join/quit message will be used.
+ If set \`enabled\` below to \`false\`, the connection message will be disabled, and another plugin will be used to send the connection message.
+
+ Available placeholders:
+
+ - __\`\`__ - player name
+ - __\`\`__ - player display name
+
+
+
+
API / Plugin Friendly
+ This feature is API / plugin-friendly. It means that the connection message content can be overridden by plugins using \`PlayerJoinEvent\` or \`PlayerQuitEvent\`.
+
`,
join: {
enabled: {
- default: true
+ default: true,
+ desc: "Whether to broadcast a message when the player joins."
},
message: {
default: "default",
@@ -1164,27 +1159,26 @@ const config: ConfigRoot = {
},
quit: {
enabled: {
- default: true
+ default: true,
+ desc: "Whether to broadcast a message when the player quits."
},
message: {
default: "default",
- desc: "The left message of the player."
+ desc: "The quit message of the player."
}
}
},
cache: {
"cache-player-profile-result": {
default: true,
- desc:
- "Whether to cache the player profile result when they joined server.
" +
- "It's useful if Mojang's authentication server is down."
+ desc: `Whether to cache the player's profile data (e.g., UUID, username, skin/cape textures) when they joined the server.
+ This can reduce network requests to Mojang's authentication server, and is also useful if the authentication server is temporarily unavailable, and still allows players to rejoin the server using cached profile data.`
},
"cache-player-profile-result-timeout": {
default: 1440,
- desc:
- "The timeout of the player profile cache.
" +
- "(Unit: minute)
" +
- "If the given timeout is exceeded, it will send another request to Mojang's authentication server to get profile data on player's next join.
"
+ desc: `The timeout of the player profile cache.
+ (Unit: minute, default value 1440 minutes = 24 hours)
+ If the given timeout is exceeded, the server will send another request to fetch player profile data from Mojang's authentication server on the player's next join.`
}
}
}
diff --git a/pages/docs/config/data/leaf-global-1-21-4.ts b/pages/docs/config/data/leaf-global-1-21-4.ts
index f36f074..8f7cb38 100644
--- a/pages/docs/config/data/leaf-global-1-21-4.ts
+++ b/pages/docs/config/data/leaf-global-1-21-4.ts
@@ -8,207 +8,230 @@ const config: ConfigRoot = {
async: {
__desc__:
"This section contains asynchronous features intended to reduce the load on the main thread (Server Thread) by processing tasks asynchronously.",
- "parallel-world-tracking": {
+ "parallel-world-ticking": {
enabled: {
default: false,
- desc:
- "Whether parallel processing different worlds in separate threads, which can improve performance on multi-core system.
" +
- "
" +
- 'Parallel World Ticking, also called "PWT", is a concept created by [SparklyPaper](https://github.com/SparklyPower/SparklyPaper), by ticking each world in a separate thread, to reduce and split the work load in originally single thread for all worlds.
' +
- "In this PWT implementation, each world will wait until last world tick finished, read more in SparklyPaper's explanation [PARALLEL_WORLD_TICKING.md](https://github.com/SparklyPower/SparklyPaper/blob/13aff425238ea322658de0d9f4f7bd906bd9f431/docs/PARALLEL_WORLD_TICKING.md).
" +
- "
" +
- "When I should consider to try PWT?" +
- "" +
- "- I really can't switch to [Folia](https://papermc.io/software/folia)
" +
- "- I have a multi-core server
" +
- "- My players spread averagely in each world
" +
- "- (Or I have many worlds, e.g. some RPG servers)
" +
- "
" +
- "
" +
- "__⚡Recommended value: true (Only if experience specific bottlenecks and understand the risks)__" +
- '' +
- '
Warning
' +
- "Experimental feature, potentially unsable, and may cause compatibility issue with some plugins." +
- "
"
+ desc: `Whether to parallel process different worlds in separate threads, which can improve performance on a multi-core system.
+
+ Parallel World Ticking, also known as "PWT", is a concept created by [SparklyPaper](https://github.com/SparklyPower/SparklyPaper), which involves ticking each world in its own dedicated thread to reduce and split the workload from a single thread for all worlds.
+ In this PWT implementation, each world will wait until the last world tick completes. Read more in SparklyPaper's explanation [PARALLEL_WORLD_TICKING.md](https://github.com/SparklyPower/SparklyPaper/blob/13aff425238ea322658de0d9f4f7bd906bd9f431/docs/PARALLEL_WORLD_TICKING.md).
+
+ When should I consider trying PWT?
+
+ - I really can't switch to [Folia](https://papermc.io/software/folia) or its fork.
+ - I have a multi-core server.
+ - My players spread on average in each world.
+ - (Or I have many worlds, e.g., some RPG servers)
+
+
+ __⚡Recommended value: \`false\` (Only enable it if experience specific bottlenecks and understand the risks)__
+
+
+
Experimental
+ Experimental feature, potentially unstable, and may cause compatibility issues with some plugins.
+
`
},
threads: {
default: 8,
- desc:
- "Number of threads dedicated to parallel world ticking.\n\n" +
- "Consider setting based on amount of worlds in the server."
+ desc: `Number of threads dedicated to parallel world ticking.
+
+ __⚡Recommended value: same as the number of worlds__`
},
"log-container-creation-stacktraces": {
default: false,
- desc:
- "Log stacktraces when containers (like Tile Entities or Entities) are created during parallel ticking.\n\n" +
- "Useful for debugging potential concurrency issues."
+ desc: `Whether to log stacktraces when containers (like Block Entities or Entities) are created during parallel ticking.
+ This is useful for debugging potential concurrency issues.`
},
"disable-hard-throw": {
default: false,
- desc:
- "Disable hard throws (which usually stop the server) related to parallel ticking errors.\n\n" +
- "⚠️ **Might mask underlying issues but could prevent crashes in unstable experimental phases. Use with caution.**"
+ desc: `Whether to disable hard throws (which usually stop the server) related to parallel ticking errors.
+
+
+
Attention
+ This may mask underlying issues, but it can help prevent crashes during the testing stage of server development. Use with caution.
+
`
},
- "run-async-tasks-sync": {
- default: false,
- desc:
- "Run asynchronous tasks synchronously within the parallel ticking system.\n\n" +
- "Might be needed for compatibility with certain plugins but largely negates the performance benefits of parallel ticking."
+ "async-unsafe-read-handling": {
+ default: "BUFFERED",
+ desc: `Whether to run asynchronous tasks synchronously within the parallel ticking system.
+ This might be needed for plugin compatibility with certain plugins, but it largely negates the performance benefits of parallel ticking.
+
+ __⚡Recommended value: \`BUFFERED\`__`
}
},
"async-entity-tracker": {
enabled: {
default: false,
- desc:
- "Make entity tracking asynchronous, can improve performance significantly, " +
- "especially in situations with massive numbers of entities in a small area.\n\n" +
- "⚡ **Recommended value:** `true`\n\n" +
- "📝 **Note:** If you installed plugins like Citizens, which uses real, player-type " +
- "entities as NPCs, also read the `compat-mode` description below."
+ desc: `Whether to make entity tracking asynchronous.
+ This can improve performance significantly, especially in situations with a large number of entities in a small area.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ If you installed plugins like Citizens, which uses the real entity or player-type entity as the "NPC", also read \`compat-mode\` below for more information.
+
`
},
"compat-mode": {
default: false,
- desc:
- "Enable compatibility mode for plugins like Citizens or other NPC plugins that use real, player-type entities.\n\n" +
- "If `true`, visibility issues where player-type NPCs might disappear sometimes can be fixed.\n\n" +
- "You should enable `compat-mode` ONLY IF you have installed Citizens or similar real-entity NPC " +
- "plugins and are experiencing issues.\n\n" +
- "Using packet-based / virtual entity NPC plugins (e.g., [ZNPC Plus](https://github.com/Pyrbu/ZNPCsPlus), " +
- "[Adyeshach](https://github.com/TabooLib/Adyeshach), [FancyNPCs](https://modrinth.com/plugin/fancynpcs)) " +
- "is generally recommended for better performance, allowing this to remain `false`."
+ desc: `Whether to enable compatibility mode for plugins like Citizens or NPC plugins that use the real, player-type entity.
+ If set to \`true\`, the visibility issue that player-type NPCs may disappear sometimes can be fixed.
+
+ You should enable \`compat-mode\` to use the async entity tracker feature __ONLY IF__ you installed Citizens or any other kind of real entity NPC plugins.
+
+ But we still recommend using packet-based / virtual entity NPC plugin to gain better performance, e.g., [ZNPC Plus](https://github.com/Pyrbu/ZNPCsPlus), [Adyeshach](https://github.com/TabooLib/Adyeshach), [Fancy NPC](https://modrinth.com/plugin/fancynpcs), or else, and then \`compat-mode\` can be disabled.`
},
"max-threads": {
default: 0,
- desc:
- "Maximum number of threads for the async entity tracker to use.\n\n" +
- "If the value is set to `0`, it automatically uses 1/4 of the number of CPU cores (minimum 1).\n\n" +
- "⚡ **Recommended value:** 1/2 of CPU cores (or adjust based on server load and core count)"
+ desc: `Maximum number of threads for async entity pathfinding to use.
+ For example:
+
+ - If a value < \`0\` is given, it automatically uses the number of CPU cores plus the value as the count of threads, with a minimum of 1.
+ - If set to \`0\`, it automatically uses 1/4 of the number of CPU cores, with a minimum of 1.
+
+
+ __⚡Recommended value: 1/2 of CPU cores__`
},
keepalive: {
default: 60,
- desc:
- "Thread keepalive time. Threads with no tasks will be terminated if " +
- "they remain idle for longer than this duration.\n\n 📏 **Unit:** seconds."
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
},
"queue-size": {
default: 0,
- desc:
- "Maximum size of the queue for pending entity tracking tasks.\n\n" +
- "If set to `0`, the queue size is dynamically calculated as `max-threads * 384`.\n\n" +
- "A limit might prevent excessive memory usage under extreme load but could potentially " +
- "lead to tasks being dropped or delayed depending on the rejection policy " +
- "(which is not configurable here)."
+ desc: `Maximum size of the queue for pending entity tracking tasks.
+ If a value ≤ \`0\` is given, the queue size is dynamically calculated as \`max-threads * 384\`.`
}
},
"async-target-finding": {
enabled: {
default: false,
- desc:
- "**Experimental feature**\n\n Moves the expensive entity target search calculations " +
- "(finding nearby entities to attack or interact with) to a background thread while keeping " +
- "the actual entity validation on the main thread.\n\n" +
- "Can improve performance by reducing main thread load from AI calculations.\n\n" +
- "⚡ **Recommended value:** `true`"
+ desc: `Whether to make entity target finding asynchronous.
+
+ Mob's target search calculations, for example, finding nearby entities to attack or interact with nearby blocks, are expensive, especially if there is a large number of mobs or many mob farms exist.
+ It can improve performance by moving the AI-related calculations to another thread, while keeping the actual validation on the main thread.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "async-alert-other": {
+ default: true,
+ desc: `Whether to make mobs alerting other mobs asynchronous.
+ This only has any effect if \`enabled\` above is \`true\`.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "async-search-block": {
+ default: true,
+ desc: `Whether to make mobs searching block target asynchronous.
+ This only has any effect if \`enabled\` above is \`true\`.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "async-search-entity": {
+ default: true,
+ desc: `Whether to make mobs searching entity target asynchronous.
+ This only has any effect if \`enabled\` above is \`true\`.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "queue-size": {
+ default: 0,
+ desc: `Maximum size of the queue for pending entity target finding tasks.
+ If a value ≤ \`0\` is given, it automatically uses \`4096\`.`
}
},
"async-playerdata-save": {
enabled: {
default: false,
- desc:
- "**Experimental feature**\n\n Make PlayerData saving asynchronous.\n\n" +
- "⚠️ **Warning: May cause data loss in some circumstances (e.g., server crashes " +
- "during the save operation)! Use with extreme caution and ensure robust backups.**"
+ desc: "Whether to make player data saving asynchronous (I/O operations are expensive)."
+ // TODO
+ //
+ //
Experimental
+ // Experimental feature, may cause data loss or data inconsistency in some circumstances!
+ //
`
}
},
"async-pathfinding": {
enabled: {
default: false,
- desc: "Make mob pathfinding calculations asynchronous.\n\n ⚡ **Recommended value:** `true`"
+ desc: `Whether to make the mob pathfinding calculation asynchronously.
+
+ __⚡Recommended value: \`true\`__`
},
"max-threads": {
default: 0,
- desc:
- "Maximum number of threads for async entity pathfinding to use.\n\n" +
- "If the value is set to `0`, it automatically uses 1/4 of the number of CPU cores (minimum 1).\n\n" +
- "⚡ **Recommended value:** 1/3 of CPU cores (or adjust based on server load)"
+ desc: `Maximum number of threads for async mob pathfinding to use.
+ If a value ≤ \`0\` is given, it automatically uses 1/4 of the number of CPU cores, with a minimum of 1.
+
+ __⚡Recommended value: 1/3 of CPU cores__`
},
keepalive: {
default: 60,
- desc:
- "Thread keepalive time. Threads with no tasks will be terminated if they remain idle " +
- "longer than this duration.\n\n 📏 **Unit:** seconds."
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
},
"queue-size": {
default: 0,
- desc:
- "Maximum size of the queue for pending pathfinding tasks.\n\n" +
- "If set to `0`, the queue size is dynamically calculated as `max-threads * 256`."
+ desc: `Maximum size of the queue for pending mob pathfinding tasks.
+ If a value ≤ \`0\` is given, the queue size is dynamically calculated as \`max-threads * 256\`.`
},
"reject-policy": {
- default: "FLUSH_ALL",
- desc:
- "The policy to use when the pathfinding task queue is full (only relevant if `queue-size` is > 0) and a new task is submitted.\n\n" +
- "- `FLUSH_ALL`: All pending tasks in the queue are immediately run on the main server thread.\n" +
- "- `CALLER_RUNS`: The newly submitted task (that couldn't fit in the queue) is run on the main server thread."
+ default: "CALLER_RUNS",
+ desc: `The policy to use when the pathfinding task queue is full, and a new task is submitted.
+
+ - \`FLUSH_ALL\`: All pending tasks in the queue are immediately run on the server thread.
+ - \`CALLER_RUNS\`: The incoming submitted task will be run on the server thread.
+ - \`DISCARD\`: The incoming submitted task will be discarded.
+
+
+ __⚡Recommended value: \`CALLER_RUNS\`__`
}
},
"async-mob-spawning": {
enabled: {
default: true,
- desc:
- "Whether asynchronous mob spawning calculations should be enabled.\n\n" +
- "On servers with many entities, this can improve performance by offloading some expensive " +
- "calculations required for mob spawning to other threads. You must have Paper's `per-player-mob-spawns` " +
- "config set to `true` in `paper-world-defaults.yml` for this to work effectively.\n\n" +
- "📝 **Note:** This does not actually spawn mobs asynchronously (which would be unsafe), " +
- "only some prerequisite calculations.\n\n" +
- "⚡ **Recommended value:** `true`"
+ desc: `Whether to make mob spawning asynchronous.
+
+ On servers with heavy mob spawning, this can improve performance by up to ~15%. You must have Paper's \`per-player-mob-spawns\` config set to \`true\` for this to work.
+ One quick note: this does not actually spawn mobs async (that would be very unsafe). This just offloads some expensive calculations that are required for mob spawning.
+
+ __⚡Recommended value: \`true\`__`
}
},
"async-locator": {
enabled: {
default: false,
- desc:
- "Whether asynchronous structure locating should be enabled.\n\n" +
- "This offloads potentially slow structure searches (like finding strongholds or monuments) to other threads.\n\n" +
- "Currently available for:\n\n" +
- "- `/locate` command\n" +
- "- Dolphin treasure finding\n" +
- "- Eye of Ender stronghold finding\n\n" +
- "⚡ **Recommended value:** `true`"
+ desc: `Whether to make locator finding structures asynchronous.
+ This offloads structure locating to other threads.
+ Currently available for:
+
+ - \`/locate\` command
+ - Dolphin treasure finding
+ - Eye of Ender stronghold finding
+
+
+ __⚡Recommended value: \`true\`__`
},
threads: {
default: 0,
- desc:
- "Maximum number of threads for the async locator to use.\n\n" +
- "If a value ≤ `0` is given, it automatically uses 1 thread.\n\n" +
- "⚡ **Recommended value:** `1` or `2` (usually sufficient as these lookups aren't constant)"
+ desc: `Maximum number of threads for async locator to use.
+ If a value ≤ \`0\` is given, it automatically uses 1 thread.
+
+ __⚡Recommended value: \`1\` or \`2\`__`
},
keepalive: {
default: 60,
- desc:
- "Thread keepalive time. Threads with no tasks will be terminated if " +
- "they remain idle longer than this duration.\n\n 📏 **Unit:** seconds."
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
}
},
"async-chunk-send": {
enabled: {
default: false,
- desc:
- "Makes chunk packet preparation and sending asynchronous.\n\n" +
- "This can significantly reduce main thread load, especially when many players " +
- "are loading chunks simultaneously (e.g., joining, teleporting, flying fast).\n\n" +
- "⚡ **Recommended value:** `true`"
- }
- },
- "async-block-finding": {
- enabled: {
- default: false,
- desc:
- "Moves expensive block search calculations (e.g., used by some commands or AI behaviors) " +
- "to a background thread while keeping the actual block validation on the main thread.\n\n" +
- "Can improve performance by reducing main thread load during these searches.\n\n" +
- "⚡ **Recommended value:** `true`"
+ desc: `Whether to make packing and sending chunk packets asynchronous.
+ This can significantly reduce main thread load, especially when many players are loading chunks simultaneously (e.g., joining, teleporting, flying fast).
+
+ __⚡Recommended value: \`true\`__`
}
}
},
@@ -218,820 +241,1018 @@ const config: ConfigRoot = {
"This section contains performance tuning intended to reduce unnecessary calculations or use more efficient methods to optimize the server.",
"use-virtual-thread-for-user-authenticator": {
default: true,
- desc:
- "Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in JDK 21 for the User Authenticator service, which handles premium player join verification.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __User Authenticator service__, which handles premium player join verification.
+
+ __⚡Recommended value: \`true\`__`
},
"use-virtual-thread-for-profile-executor": {
- default: true,
- desc:
- "Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in JDK 21 for the Profile Executor, which handles player profile and skull skin fetching.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ default: false,
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __Profile Executor__, which handles player profile and skull skin fetching.
+
+ __⚡Recommended value: \`false\`__`
},
"use-virtual-thread-for-async-chat-executor": {
default: true,
- desc:
- "Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in JDK 21 for the Async Chat Executor.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __Async Chat Executor__.
+
+ __⚡Recommended value: \`true\`__`
},
"use-virtual-thread-for-async-scheduler": {
- default: true,
- desc:
- "Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in JDK 21 for the CraftAsyncScheduler, which could improve performance of plugin that heavily utilizing Bukkit's async scheduler.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ default: false,
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __CraftAsyncScheduler__, which could improve the performance of plugins that heavily utilize Bukkit's async scheduler.
+
+ __⚡Recommended value: \`true\` (Only if all plugins support Virtual Thread)__`
},
"create-snapshot-on-retrieving-blockstate": {
default: true,
- desc:
- "Whether to create a snapshot (copy) of TileEntity / BlockState data by default when plugins retrieve them.
" +
- "
" +
- "Some plugins may call `getInventory().getHolder()` to get the holder of an inventory, which involves accessings the BlockState.
" +
- "For example, if there are tons of hoppers and plugins call this method when listening to some events (e.g. hopper related events, call frequently). Re-creating BlockState and parsing item stack in massive and frequent calls are very expensive.
" +
- "See Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) for more information." +
- "" +
- "- If `true`, always creates snapshot (copy) of BlockState when the plugin calls related methods.
" +
- "- If `false`, gets real BlockState directly unless the plugin explicitly requests a snapshot. Performance improves, but has risk that block state gets modified due to plugin's poor design.
" +
- "
" +
- "
" +
- "__⚡Recommended value: `false` (Only if you encounter specific lag described above)__"
+ desc: `Whether to create a snapshot (copy) of \`BlockEntity\` / \`BlockState\` data by default when plugins retrieve them.
+
+ Some plugins may call \`getInventory().getHolder()\` to get the holder of an inventory, which involves accessing the BlockState.
+ For example, if there are tons of hoppers and plugins, call this method when listening to some events (e.g., hopper related events, call frequently). Re-creating BlockState and parsing item stacks in massive and frequent calls are very expensive.
+ See Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) for more information.
+
+ - If set to \`true\`, it always creates a snapshot (copy) of BlockState when the plugin calls related methods.
+ - If set to \`false\`, it gets the real BlockState directly unless the plugin explicitly requests a snapshot. Performance improves, but there is a risk that the block state gets modified due to the plugin's poor design.
+
+
+ __⚡Recommended value: \`false\` (Only if you encounter specific lag described above)__`
+ },
+ "throttle-mob-spawning": {
+ enabled: {
+ default: false,
+ desc: `Whether to skip mob spawning in chunks that have repeatedly failed to spawn mobs beyond the configured \`min-failed\` value.
+ Once the minimum number of failed spawn attempts is reached, the server will randomly skip between 1 ~ \`spawn-chance\`% of spawn attempts in that chunk.
+ Failed spawn attempts will not be counted if spawn limits are reached, and the failure counter will be reset after a successful spawn.`
+ },
+ monster: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for hostile monsters."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of hostile monsters after reaching the `min-failed` value above."
+ }
+ },
+ creature: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for passive creatures (animals)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of passive creatures (animals) after reaching the `min-failed` value above."
+ }
+ },
+ ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for ambient mobs (bats)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of ambient mobs (bats) after reaching the `min-failed` value above."
+ }
+ },
+ axolotls: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for axolotls."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of axolotls after reaching the `min-failed` value above."
+ }
+ },
+ underground_water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for underground water creatures (glow squid)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of underground water creatures (glow squid) after reaching the `min-failed` value above."
+ }
+ },
+ water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for water creatures (squid, dolphins)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of water creatures (squid, dolphins) after reaching the `min-failed` value above."
+ }
+ },
+ water_ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for ambient water mobs (tropical fish)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of ambient water mobs (tropical fish) after reaching the `min-failed` value above."
+ }
+ },
+ misc: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for misc entities."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of misc entities after reaching the `min-failed` value above."
+ }
+ }
},
"inactive-goal-selector-throttle": {
default: true,
- desc:
- "Throttles the [goal selector](https://maven.fabricmc.net/docs/yarn-1.21.4+build.8/net/minecraft/entity/ai/goal/GoalSelector.html) calculations for entities that are inactive (typically far from players).
" +
- "Instead of ticking goal selector every tick, it ticks less frequently to every second. This can improve performance slightly, but has minor gameplay implications.
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to throttle the [goal selector](https://maven.fabricmc.net/docs/yarn-1.21.4+build.8/net/minecraft/entity/ai/goal/GoalSelector.html) calculations for entities that are inactive (typically far from players).
+ Instead of ticking the goal selector every tick, it ticks less frequently every second. This can improve performance slightly, but has minor gameplay implications.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"throttle-hopper-when-full": {
enabled: {
default: false,
- desc:
- "Whether to throttle hopper item transfer attempts if the target container is full.
" +
- "Prevents the hopper from constantly trying to push items every tick, even if it keeps failing.
" +
- "
" +
- "__⚡Recommended value: `true` (set `enabled` below to true)__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to throttle hopper item transfer attempts if the target container is full.
+ Prevents the hopper from constantly trying to push items every tick, even if it keeps failing.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"skip-ticks": {
default: 8,
- desc:
- "How many ticks a hopper should wait before trying to move items again if the target container is full.
" +
- "(Unit: tick)
" +
- "Only active if `throttle-hopper-when-full.enabled` (described above) is `true`.
" +
- "If a value ≤ `0` is given, this throttling feature is disabled.
" +
- "
" +
- "__⚡Recommended value: `8`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | 8 |
" +
- "| Vanilla behavior | 8 |
" +
- "
"
+ desc: `How many ticks should a hopper wait before trying to move items again if the target container is full.
+ (Unit: tick)
+ Only active if \`throttle-hopper-when-full.enabled\` above is \`true\`.
+ If a value ≤ \`0\` is given, this throttling feature is disabled.
+
+ __⚡Recommended value: \`8\`__
+
+ | Values for goals | |
+ | Optimization | 8 |
+ | Vanilla behavior | 8 |
+
`
}
},
"skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer": {
default: true,
- desc:
- "Whether to skip updating map item data update if the map doesn't have a renderer (`CraftMapRenderer`).
" +
- "This can improve performance if using ImageMap kind of plugins that create many custom maps.
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
" +
- '' +
- '
Attention
' +
- "This may cause vanilla map item data to stop be updated." +
- "
"
+ desc: `Whether to skip updating map item data if the map doesn't have a renderer (\`CraftMapRenderer\`).
+ This can improve performance if using ImageMap kind of plugins that create many custom maps.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Attention
+ This may cause vanilla map item data to stop being updated.
+
`
},
"skip-ai-for-non-aware-mob": {
default: true,
- desc:
- "Whether to skip AI ticks entirely for mobs that are both *inactive* and *unaware*.
" +
- "Unaware mobs optimized this way will not perform self actions or react until they become active again, see [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.4/org/bukkit/entity/Mob.html#setAware(boolean)) for more information.
" +
- "
" +
- "__⚡Recommended value: `true`__" +
- "" +
- "| Values for goals | |
" +
- "| Optimization | true |
" +
- "| Vanilla behavior | false |
" +
- "
"
+ desc: `Whether to skip AI ticks entirely for mobs that are both _inactive_ and _unaware_.
+ Unaware mobs optimized this way will not perform self actions or react until they become active again, see [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.4/org/bukkit/entity/Mob.html#setAware(boolean)) for more information.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
},
"reduce-packets": {
- __desc__: "This section is for the useless packet reducing features.",
+ __desc__: "This section is for the useless packet-reducing features.",
"reduce-entity-move-packets": {
default: false,
- desc:
- "Whether to reduce the useless entity movement packets sent to players (e.g., small movements).
" +
- "This can save bandwidth and reduces client-side processing load, potentially making movement appear smoother during high entity counts or minor lag.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to reduce the useless entity movement packets sent to players (e.g., small movements).
+ This can save bandwidth and reduce client-side processing load, potentially to make movement appear smoother during high entity counts or minor lag.
+
+ __⚡Recommended value: \`true\`__`
}
},
- "reduce-chunk-source-updates": {
+ "optimized-powered-rails": {
+ default: false,
+ desc: `Whether to use optimized powered rails.
+ Uses a fully rewritten version of powered rail iteration logic, which also keeps vanilla behavior, and can achieve 4x faster performance.
+ The implementation is originally based on the fabric mod [FX's Rail Optimization](https://modrinth.com/mod/rail-optimization) made by [Fx Morin](https://github.com/FxMorin).
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "optimise-random-tick": {
+ default: false,
+ desc: `Whether to use the rewritten random ticking system.
+
+ This rewritten random ticking system uses weighted statistics and sampling to select tickable blocks in active chunks. It can reduce the unnecessary cost caused by frequently selecting non-tickable locations in the vanilla random ticking logic.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ "optimize-player-movement": {
+ default: true,
+ desc: `Whether to skip unnecessary block edge checks on player moving and avoid redundant view distance updates.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "only-tick-items-in-hand": {
+ default: false,
+ desc: `Whether to tick or update items only if the player holds them in the main hand or offhand, instead of ticking the entire inventory.
+ This currently only affects the ticking of compass and map item.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "optimize-block-entities": {
+ default: true,
+ desc: `Whether to use the more efficient map data structure for block entity ticker storage.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "cache-biome": {
enabled: {
default: false,
- desc:
- "Whether to reduces chunk source updates on inter-chunk player moves.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to cache the biome data of the block location, instead of recalculating the biome every time searching.
+
+ __⚡Recommended value: \`true\` (Also requires enabling options below)__`
+ },
+ "mob-spawning": {
+ default: false,
+ desc: `Whether to cache the biome in mob spawning logic.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ advancements: {
+ default: false,
+ desc: `Whether to cache the biome in player advancement calculation logic.
+
+ __⚡Recommended value: \`true\`__`
}
},
"faster-structure-gen-future-sequencing": {
- enabled: {
- default: true,
- desc:
- "Uses a potentially faster method for sequencing asynchronous tasks " +
- "related to structure generation.\n\n" +
- "⚠️ **May cause inconsistent order of future composition tasks in rare " +
- "edge cases, potentially affecting structure generation results subtly.**\n\n" +
- "⚡ **Recommended value:** `true` (if no issues observed)"
- }
- },
- "optimized-powered-rails": {
- default: false,
- desc:
- "Whether to use optimized powered rails. Uses fully rewritten version of powered rail iteration logic which also keeps vanilla behavior, can achieve 4x faster performance.
" +
- "
" +
- "__⚡Recommended value: `true`__"
- },
- "optimize-player-movement": {
default: true,
- desc:
- "Whether to optimize player movement processing by skipping unnecessary block edge checks and avoiding redundant view distance updates.
" +
- "
" +
- "__⚡Recommended value: `true`__"
+ desc: `Whether to use faster task sequencing for generating structures.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ This may cause the inconsistent order of future compose tasks in rare edge cases, which may lead to different structure generation results.
+
`
},
"faster-random-generator": {
enabled: {
default: false,
- desc:
- "Use faster random number generator implementations provided by Java 17+.\n\n" +
- "Random is used almost everywhere in Minecraft, enabling this can provide a decent " +
- "performance improvement.\n\n" +
- "📝 **Note:** Requires a JVM that supports `java.util.random.RandomGenerator` and " +
- "the LXM generators. Some JREs don't support this and may cause a crash.\n\n" +
- "⚡ **Recommended value:** `true` (if using Java 17+ and compatible JRE)"
+ desc: `Whether to use the faster random generator introduced in Java 17.
+ Random is used almost everywhere in Minecraft, enabling this can get a decent performance improvement.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ This requires a JVM that supports \`RandomGenerator\`. Some JREs don't support it.
+
`
},
"random-generator": {
default: "Xoroshiro128PlusPlus",
- desc:
- "Specifies which random generator algorithm to use when `faster-random-generator.enabled` is true.\n\n" +
- "See [JEP 356](https://openjdk.org/jeps/356) or [Java RNG Info](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1) " +
- "for details on Java's available generators. `Xoroshiro128PlusPlus` generally offers a good balance of speed " +
- "and statistical quality.\n\n" +
- "⚡ **Recommended value:** `Xoroshiro128PlusPlus`"
+ desc: `The specific algorithm of the random generator should be used.
+ Available random generators can be found in [Random Number Generators in Java](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1) or [JEP 356](https://openjdk.org/jeps/356).
+
+ __⚡Recommended value: \`Xoroshiro128PlusPlus\`__`
},
"enable-for-worldgen": {
default: false,
- desc:
- "Enable the faster random generator for world generation processes.\n\n" +
- "⚠️ **WARNING: This WILL change world generation results! Use only for new worlds " +
- "or if vanilla seed parity is not required. Structures, ore veins, etc., will be " +
- "different from vanilla generation with the same seed.**\n\n" +
- "⚡ **Recommended value:** `true` for optimization (on new worlds), `false` for vanilla behavior/seed parity."
+ desc: `Whether to use the faster random generator for world generation.
+
+ - If set to \`true\`, \`Random\` calls involved in world generation will use the faster random generator you chose in \`random-generator\` above. The world generation will be slightly different from vanilla.
+ - If set to \`false\`, \`Random\` calls involved in world generation will use legacy random generator of vanilla.
+
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Warning
+ This will affect world generation. The terrain and other results of world generation will be slightly different from vanilla.
+
`
},
"warn-for-slime-chunk": {
default: true,
- desc:
- "Log a warning on startup if slime chunk calculations are using the faster random generator " +
- "instead of the legacy one, as this will change slime chunk locations."
+ desc: "Whether the server prints a warning message on startup if the faster random generator for slime chunk generation is enabled."
},
"use-legacy-random-for-slime-chunk": {
default: false,
- desc:
- "Force the use of the legacy random source (`java.util.Random`) specifically " +
- "for slime chunk calculations, even if faster generators are enabled elsewhere.\n\n" +
- "Set to `true` to maintain vanilla slime chunk locations (important for existing slime farms).\n\n" +
- "⚡ **Recommended value:** `true` for vanilla behavior/existing farms, `false` for optimization " +
- "(on new worlds where slime chunk location doesn't matter)."
+ desc: `Whether to use legacy random source (\`java.util.Random\`) for slime chunk generation to follow the vanilla behavior.
+ If your server has existing slime farms or related facilities that need slime chunk, enable this; otherwise, the location of slime chunk will be offset.
+
+ __⚡Recommended value: (Depends on your server type, see \`Values for goals\` below for more)__
+
+ | Values for goals | |
+ | Optimization | false |
+ | Vanilla behavior | true |
+
`
},
"use-direct-implementation": {
default: false,
- desc:
- "Use direct Java implementations of the selected random algorithm instead of " +
- "delegating through the standard `RandomGenerator` interface.\n\n" +
- "May offer a minor performance improvement but could potentially change RNG " +
- "behavior compared to the standard library's delegation mechanism."
+ desc: `Whether to use direct random implementation (LCG without synchronization) instead of delegating to Java's RandomGenerator.
+ This may improve performance, but potentially changes RNG behavior.
+
+ __⚡Recommended value: \`false\`__`
}
},
+ "cache-eye-fluid-status": {
+ default: false,
+ desc: `Whether to cache the \`Entity#isEyeInFluid\` method to improve performance and reduce memory usage.
+
+ __⚡Recommended value: \`false\`__`
+ },
"enable-cached-minecraft-to-bukkit-entitytype-convert": {
- enabled: {
- default: true,
- desc:
- "Whether to cache the result of the `CraftEntityType#minecraftToBukkit` conversion call.\n\n" +
- "This conversion can be somewhat expensive, so caching can improve performance slightly in code " +
- "that frequently converts between Minecraft and Bukkit entity types.\n\n" +
- "⚡ **Recommended value:** `true`"
- }
+ default: true,
+ desc: `Whether to cache the result of *Minecraft EntityType* to *Bukkit EntityType* conversion. This conversion can be somewhat expensive, especially in the spawning logic, so caching it can improve performance slightly.
+
+ __⚡Recommended value: \`true\`__`
},
dab: {
+ __desc__:
+ "Dynamic Activation of Brain, also known as DAB, optimizes the brain of entities by decreasing the frequency of their brain ticking when they are far away from players. It is a worthwhile trade-off to improve performance if there are many entities.",
enabled: {
default: true,
- desc:
- "Enables Distant Activation Behavior (DAB) / Dynamic Activation of Brain optimization for entities.\n\n" +
- "Reduces the AI processing (like pathfinding and goal execution / brain ticking) for entities that are " +
- "far away from players, improving performance.\n\n" +
- "⚡ **Recommended value:** `true` for optimization, `false` (or use blacklist) for vanilla behavior."
+ desc: `Whether to enable the DAB.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false (or see dab.blacklisted-entities below for more) |
+
`
},
"dont-enable-if-in-water": {
default: false,
- desc:
- "If true, non-aquatic entities that are in water will not have their AI throttled by DAB, even if they are far away.\n\n" +
- "Can prevent issues like terrestrial mobs suffocating unexpectedly in water when far from players due to paused AI " +
- "(Fixes [Pufferfish issue #58](https://github.com/pufferfish-gg/Pufferfish/issues/58)).\n\n" +
- "⚡ **Recommended value:** `true`"
+ desc: `Whether the non-aquatic entities in the water will be excluded by DAB. This can fix [Pufferfish#58](https://github.com/pufferfish-gg/Pufferfish/issues/58).
+ If set to \`true\`, this could fix entities suffocating in the water if they are far from the player.
+
+ __⚡Recommended value: \`true\`__`
},
"start-distance": {
default: 12,
- desc:
- "The distance (in blocks) an entity must be from the nearest player to start being affected by DAB throttling.\n\n" +
- "⚡ **Recommended value:** `8`\n\n" +
- "📏 **Unit:** blocks."
+ desc: `The distance determines how far away an entity has to be from the player to start being affected by DAB.
+ (Unit: block)
+
+ __⚡Recommended value: \`8\`__`
},
"max-tick-freq": {
default: 20,
- desc:
- "Defines the maximum frequency (most often, in ticks) that the furthest " +
- "entities affected by DAB will have their AI/brain ticked.\n\n" +
- "Lower values mean more frequent updates even for distant mobs (less optimization). " +
- "Higher values mean less frequent updates (more optimization). `20` ticks = 1 second.\n\n" +
- "📏 **Unit:** ticks."
+ desc: `The maximum tick time defines how often the furthest entity will get their pathfinders and behaviors ticked.
+ (Unit: tick, default value 20 ticks = 1s)`
},
"activation-dist-mod": {
default: 8,
- desc:
- "Controls how aggressively distance impacts the entity's tick frequency. " +
- "The effective frequency is influenced by the formula: " +
- "`freq ≈ (distanceToPlayer^2) / (2^value)` (clamped by `max-tick-freq`).\n\n" +
- "- Lower value (e.g., 7): Further entities tick less often (more aggressive optimization).\n" +
- "- Higher value (e.g., 9): Further entities tick more often (less aggressive optimization).\n\n" +
- "⚡ **Recommended value:** `7`"
+ desc: `The tick frequency that defines how much distance modifies an entity's tick frequency. \`freq = (distanceToPlayer^2) / (2^value)\`.
+
+ - If you want entities further away to tick __less__ often, try \`7\`.
+ - If you want entities further away to tick __more__ often, try \`9\`.
+
+
+ __⚡Recommended value: \`7\`__`
},
"blacklisted-entities": {
- default: [],
- desc:
- "A list of entity types (e.g., `minecraft:villager`, `minecraft:creeper`) that should be " +
- "completely ignored by the DAB optimization system.\n\nUseful for mob farms that rely on " +
- "specific AI behaviors (like pathfinding) even when players are distant. If mobs in a farm freeze, " +
- "try adding their type here (e.g., `[ZOMBIFIED_PIGLIN]` or `[VILLAGER, ZOMBIE]`).\n\n" +
- "See [Bukkit EntityType Javadoc](https://jd.papermc.io/paper/1.21.1/org/bukkit/entity/EntityType.html) " +
- "for type names. Use YAML list format (e.g., `- VILLAGER` newline `- ZOMBIE` or `[VILLAGER, ZOMBIE]`)."
+ default: "[]",
+ desc: `A list of entity types that will not be affected by DAB.
+
+ Some survival servers have mob farms, which need mobs to have a target. This kind of "pathfinding" mob farm may be broken by DAB. This situation can be solved by adding specific mobs of the mob farm to this DAB blacklist.
+ If some specific mob farms are broken in your server, mobs freeze and don't move, and you are not sure whether it is caused by DAB. You can try to add them to this blacklist to see if it fixes the issue.
+
+ Format: \`[villager]\` or \`[villager, zombified_piglin]\` (You can find all entity types in [Paper's Javadoc](https://jd.papermc.io/paper/1.21.4/org/bukkit/entity/EntityType.html)).
+
+ [💡 Want to Go Deeper?](guides/dab-blacklist-format)`
}
},
"dont-save-entity": {
"dont-save-primed-tnt": {
- enabled: {
- default: false,
- desc:
- "If enabled, Primed TNT entities will not be saved when chunks unload.\n\n" +
- "Useful for redstone/technical/survival servers to prevent TNT explosions " +
- "caused by chunk loading/unloading cycles (e.g., when a player disconnects " +
- "or moves far away from an active TNT device).\n\n" +
- "⚡ **Recommended value:** `true`"
- }
+ default: false,
+ desc: `Whether to disable saving primed TNT on chunk unloads.
+ This can prevent machines or redstone builds from being exploded by TNT when the player accidentally disconnects or when the chunk unloads when the player is far away. Useful for redstone/technical/survival servers that have machines involving TNTs.
+
+ __⚡Recommended value: \`true\`__`
},
"dont-save-falling-block": {
- enabled: {
- default: false,
- desc:
- "If enabled, Falling Block entities will not be saved when chunks unload.\n\n" +
- "Can prevent issues with glitched or duplicated falling blocks (sand, gravel, etc.) " +
- "after server restarts or chunk reloads, especially if caused by lag.\n\n" +
- "⚡ **Recommended value:** `true`"
- }
+ default: false,
+ desc: `Whether to disable saving falling blocks on chunk unloads.
+ This can prevent potential issues with glitched or duplicated falling blocks (sand, gravel, etc.) after server restarts or chunk loads, especially if caused by lag.
+
+ __⚡Recommended value: \`true\`__`
}
},
- "entity-running-behavior-cache-update-interval": {
- default: 5,
- desc:
- "How often (in ticks) an entity updates its internal cache of currently running brain behaviors (AI tasks).\n\n" +
- "Lower values mean the cache is more up-to-date but involves slightly more frequent checks. Higher values reduce " +
- "check frequency but might slightly delay internal AI state tracking.\n\n" +
- "📏 **Unit:** ticks."
+ "count-all-chunks-for-ticking": {
+ default: false,
+ desc: `Whether to skip the additional check that checks whether ticking chunks are near the player during the mob spawning.
+
+ The cost of this check can be expensive if there is a high number of players and loading chunks. It's better to skip this check, since ticking chunks are often near or around players most of the time. It's also expected that the mob spawning increases slightly in some edge conditions.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "check-survival-before-growth": {
+ "cactus-check-survival": {
+ default: false,
+ desc: `Whether to check if the cactus can survive before trying to grow.
+ This can help improve performance if huge cactus farms exist on the server.
+
+ __⚡Recommended value: \`true\`__`
+ }
}
},
fixes: {
+ __desc__: "This section contains bug fixes for specific issues.",
"dont-place-player-if-server-full": {
- enabled: {
- default: false,
- desc:
- "Prevents players from being fully placed into the world if the server is already at its maximum " +
- "player capacity (`max-players` in `server.properties`).\n\n" +
- "If enabled, bypass access relies solely on permissions (e.g., `purpur.joinfullserver` or similar, " +
- "check server/plugin documentation) rather than allowing plugins to override the limit via the `PlayerLoginEvent#allow` method."
- }
+ default: false,
+ desc: `Whether to disallow players from joining if the server is full (defined as \`max-players\` in \`server.properties\`).
+ This option fixed [Paper#10668](https://github.com/PaperMC/Paper/issues/10668).
+
+ If set to \`true\`, you should grant player \`purpur.joinfullserver\` permission rather than using \`PlayerLoginEvent#allow\` API to allow players to bypass the limit.`
}
},
"gameplay-mechanisms": {
+ __desc__: "This section contains the features that modify or improve the game mechanics.",
"use-spigot-item-merging-mechanism": {
- enabled: {
- default: true,
- desc:
- "Whether to use Spigot's specific logic for merging item stacks (e.g., dropped items).\n\n" +
- "Set to `true` to potentially restore item merging behavior closer to Spigot if Leaf/Paper has different mechanics."
- }
+ default: true,
+ desc: `Whether to merge dropped items based on their tick sequence, which is the long-standing default behavior of Spigot.
+
+ In Spigot, the item entity that ticks later will merge into the earlier ticking one. If the merge radius is relatively larger, it can prevent dropped items from getting stuck at unexpected locations. So that this is useful for farms or redstone builds that can create numerous dropped items.
+ However, in vanilla, the item merging is based on the item count of the stack. The stack with the smaller count will merge with the one with the larger count.
+
+ | Values for goals | |
+ | SMP friendly | true |
+ | Vanilla behavior | false |
+
`
},
"spawner-settings": {
enabled: {
default: false,
- desc:
- "Enable the custom mob spawner settings defined below. If `false`, spawners will use default behavior " +
- "(likely closer to vanilla or Paper)."
+ desc: "Whether to use custom spawner options below. Options below only affect the spawning of spawner blocks instead of the natural spawning."
},
checks: {
"light-level-check": {
default: false,
- desc: "Check if there is the required light level to spawn the mob. Vanilla spawners ignore light levels."
+ desc: `Whether to check if the light level is sufficient to spawn the mob.
+
+ - If set to \`true\`, the spawner will attempt to spawn mobs using the same light level conditions used for natural mob spawning.
+ - If set to \`false\`, the spawner will follow the vanilla behavior that attempts to spawn without checking the light level.
+
`
},
"spawner-max-nearby-check": {
default: true,
- desc: "Check if there are the max amount of nearby mobs to spawn the mob (prevents overcrowding)."
+ desc: `Whether to check if there is the maximum amount of nearby mobs to spawn the mob. The spawner will stop spawning new mobs to prevent overcrowding.
+
+ - If set to \`true\`, the spawner will follow the vanilla behavior that prevents spawning new mobs if the nearby mob count exceeds the limit.
+ - If set to \`false\`, the spawner will always attempt to spawn without checking the nearby mob count.
+
`
},
"check-for-nearby-players": {
default: true,
- desc: "Check if any players are in a radius to spawn the mob. Spawners only activate when players are nearby."
+ desc: `Whether to check if any players are in a radius to spawn the mob.
+
+ - If set to \`true\`, the spawner will always attempt to spawn mobs without checking if there is any player nearby.
+ - If set to \`false\`, the spawner will attempt to spawn mobs only if there is a player in the radius.
+
`
},
"spawner-block-checks": {
default: false,
- desc: "Check if there are blocks blocking the spawner to spawn the mob."
+ desc: "Whether to prevent spawn attempts if the spawn point is obstructed by blocks."
},
"water-prevent-spawn-check": {
default: false,
- desc: "Checks if there is water around that prevents spawning (e.g., for mobs that shouldn't spawn in water)."
+ desc: "Whether to prevent spawn attempts if the spawn point has water."
+ },
+ "ignore-spawn-rules": {
+ default: false,
+ desc: `Whether to ignore additional spawn rules of mobs.
+
+ Many mobs have spawn restrictions to be only or prevent them from spawning on specific blocks. For example, most animals can only spawn on grass blocks, or the hoglin can not spawn on the nether wart block. You can find the list of additional spawn rules in [Additional Rules](https://minecraft.wiki/w/Mob_spawning#:~:text=additional%20rules).
+
+ This option does not affect and is separate from \`spawner-block-checks\` and \`water-prevent-spawn-check\` above.`
}
},
"min-spawn-delay": {
default: 200,
- desc:
- "Minimum delay (in ticks) between spawner spawns. The actual delay is randomized between min and max. " +
- "Higher values slow down spawners. Vanilla default: 200.\n\n" +
- "📏 **Unit:** ticks."
+ desc: `The minimum delay between each spawn attempt of the spawner. Higher values will slow down the spawning speed of spawners.
+ (Unit: tick)`
},
"max-spawn-delay": {
default: 800,
- desc:
- "Maximum delay (in ticks) between spawner spawns. Higher values slow down spawners. " +
- "Vanilla default: 800.\n\n 📏 **Unit:** ticks."
- }
- },
- "smooth-teleport": {
- enabled: {
- default: false,
- desc:
- "**Experimental feature**\n\nAttempts to make dimension changes (e.g., entering Nether/End portals) " +
- "smoother for the player, reducing the jarring screen blackout effect.\n\n" +
- "⚠️ **Warning: Requires the origin world and the destination world to have the same logical height " +
- "(`logical-height` in world settings) to function correctly. May have visual glitches or compatibility issues. " +
- "Report any bugs encountered.**"
+ desc: `The maximum delay between each spawn attempt of the spawner. Higher values will slow down the spawning speed of spawners.
+ (Unit: tick)`
}
},
"only-player-pushable": {
- enabled: {
- default: false,
- desc: "If enabled, only players will have collisions."
- }
+ default: false,
+ desc: `Whether to make only the player pushable.
+ If set to \`true\`, this option will override values of related collision options in Paper's global and world config, and mobs will not be killed under the effect of [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) gamerule.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ It can break mob farms that are using mob collision to push mobs to fall or kill mobs by exceeding the value of the [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) gamerule.
+
`
},
knockback: {
+ __desc__: "This section contains options to adjust knockback related behaviors.",
"snowball-knockback-players": {
- enabled: {
- default: false,
- desc: "Allow snowballs thrown by players (or dispensers) to apply knockback to other players upon impact."
- }
+ default: false,
+ desc: "Whether the snowball can knockback players."
},
"egg-knockback-players": {
- enabled: {
- default: false,
- desc: "Allow eggs thrown by players (or dispensers) to apply knockback to other players upon impact."
- }
+ default: false,
+ desc: "Whether the egg can knockback players."
},
"can-player-knockback-zombie": {
- enabled: {
- default: true,
- desc:
- "Determines if players' attacks apply standard knockback to Zombies " +
- "(and potentially related undead mobs like Husks, Drowned).\n\n" +
- "May be useful if other settings or plugins interfere with default knockback mechanics."
- }
+ default: true,
+ desc: "Whether the player can knockback zombies using the hand, weapon, projectile, etc."
+ },
+ "flush-location-while-knockback-player": {
+ default: false,
+ desc: `Whether to send movement changes to the client immediately.
+ Once the target player is hit and gets knockback, it can give a smoother PVP gameplay experience with faster knockback responses. Instead, in vanilla, the packet sending happens at the end of the tick and it may hurt the PVP game experience.
+
+ __⚡Recommended value: \`true\` (For PVP server)__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ "old-blast-protection-explosion-knockback": {
+ default: false,
+ desc: `Whether to use the old <= 1.20.4 explosion knockback behavior, which applies to armors with blast protection enchantment.
+
+ - If set to \`true\`, the explosion knockback will be calculated based on the blast protection enchantment the player has. The knockback is slightly bigger than that after the 1.20.4 version.
+ - If set to \`false\`, explosion knockback will follow the vanilla behavior of the current version.
+
`
}
},
"hide-item-component": {
+ "hidden-types": {
+ default: "[]",
+ desc: `The list of component type keys that will be hidden from the client.
+
+ See [List of components](https://minecraft.wiki/w/Data_component_format#List_of_components) to get the full list of available component type keys for items.
+ For example:
+
+ - If a value \`[]\` is given, no item will be affected.
+ - If a value \`[\"minecraft:custom_data\"]\` is given, the item's \`custom_data\` component will be hidden on the player's client.
+
`
+ },
enabled: {
default: false,
- desc:
- "If enabled, specified item component information from player's inventory will be hidden from the client.\n\n" +
- "This only affects what the client sees, not the actual item data on the server. It can be used to hide complex " +
- "internal data or potentially reduce client-side rendering load for items with excessive component data (e.g., " +
- "avoid frequent client animations).\n\n" +
- "⚠️ **Warning: May break resource packs, client mods, or specific gameplay mechanics that rely on reading " +
- "this component data client-side. Use with caution. You must know what components you are hiding! " +
- "This is not the same as Paper's item-obfuscation.**"
+ desc: `Whether to hide specified component information from the player's inventory sent to clients. Also see \`hidden-types\` above.
+
+ It can be used to hide complex component data on an item to reduce rendering load, frequent animations on the client side, and network usage. The actual item data will not be affected.
+
+ It is noted that this option is different from Paper's [item obfuscation](https://docs.papermc.io/paper/reference/global-configuration/#anticheat_obfuscation_items_enable_item_obfuscation). This option only hides item component data from the player's own inventory, instead of hiding data sent to others.
+
+
+
Attention
+ It may break resource packs, client mods, or specific gameplay mechanics that rely on these client-side component data of items. Use with caution. You must know what components you are hiding!
+
`
+ }
+ },
+ "death-item-drop-knockback": {
+ "drop-around": {
+ default: true,
+ desc: `Whether to drop items randomly around the player on their death.
+
+ - If set to \`true\`, items will be dropped with a randomized motion and scattered around the dead player.
+ - If set to \`false\`, items will be dropped below the dead player.
+
`
},
- "hidden-types": {
- default: [],
- desc:
- "A list of component type IDs (e.g., `minecraft:custom_data`, `minecraft:attribute_modifiers`, " +
- "`minecraft:trim`) that will be hidden from the client if `hide-item-component.enabled` is true.\n\n" +
- "Consult Minecraft component documentation or tools like NBT viewers to identify relevant component IDs. " +
- 'Example: `["minecraft:custom_data"]`'
+ "horizontal-force": {
+ default: 0.5,
+ desc: "Base speed of horizontal velocity that applies to the player's dropped items on death."
+ },
+ "vertical-force": {
+ default: 0.2,
+ desc: "Same as \`horizontal-force\`, but it is for vertical velocity."
}
},
"allow-tripwire-dupe": {
- enabled: {
- default: false,
- desc:
- "Whether to allow the vanilla behavior where tripwire hooks can sometimes " +
- "duplicate items (like sand or TNT) under specific circumstances.\n\n" +
- "Set to `true` to enable this vanilla mechanic/exploit."
- }
+ default: false,
+ desc: "Whether to bring back tripwire dupe ([MC-59471](https://bugs.mojang.com/browse/MC/issues/MC-59471)) which is fixed in 1.21.2's snapshots 24w33a and 24w36a. It is also known as the string dupe."
},
player: {
"max-use-item-distance": {
default: 1.0000001,
- desc:
- "The maximum distance (in blocks) a player can be from a block's interaction " +
- "point to successfully use an item on it (right-click).\n\n" +
- "Setting this to `-1` disables the distance check entirely.\n\n" +
- "⚠️ **Warning: Disabling the check (`-1`) or setting a very large value enables " +
- "'reach' hacks and potential exploits like NoCom (No Comply, interacting through walls). " +
- "The slightly-above-1 default aims to prevent NoCom while allowing legitimate interactions. " +
- "Adjusting this requires careful consideration of exploit potential.**\n\n" +
- "⚡ **Recommended value:** `10.0000001` for [anarchy servers](https://minecraftservers.org/type/anarchy) " +
- "allowing packet-based hacks (like CrystalAura); `1.0000001` otherwise.\n\n" +
- "📏 **Unit:** blocks."
+ desc: `The maximum distance that the player is allowed to interact using an item.
+ (Unit: block)
+
+ Some [Anarchy servers](https://minecraftservers.org/type/anarchy) or similar types of servers may allow players to use hacks/cheats. If you want players to be able to use crystal related modules that are packet-based (e.g., CEV Breaker, BedAura), you may need to adjust this value.
+ It's better to set the value to \`10.0000001\` to allow using related hack modules.
+
+ If set to \`-1\` is given, the check of the maximum allowed distance to use an item will be disabled.
+
+ __⚡Recommended value: \`10.0000001\` (Only for anarchy server)__
+
+
+
Attention
+ If set to \`-1\` or any large positive values, players can use some packet modules of hack clients, and are also able to use [Nocom Exploit](https://github.com/nerdsinspace/nocom-explanation)! Adjusting this option requires careful consideration of potential exploits.
+
`
+ }
+ },
+ "inventory-overflow-event": {
+ enabled: {
+ default: false,
+ desc: `Whether to enable the inventory overflow event. The event is called when the plugin uses \`Inventory#addItem\` to add items to the player's inventory, and the target inventory is full.
+
+
+
Attention
+ This is not a proper solution to use! Please redesign your plugin logic to use the returned map of the \`Inventory#addItem\` method as soon as possible!
+
`
+ },
+ "listener-class": {
+ default: "com.example.package.PlayerInventoryOverflowEvent",
+ desc: "The full listener class name that listens to this inventory overflow event. Set to your own listener class to use this event."
}
},
"afk-command": {
enabled: {
default: false,
- desc:
- "Enables a built-in `/afk` command functionality integrated with " +
- "Minecraft's idle-timeout mechanism (set in `server.properties`).\n\n" +
- "Players exceeding the idle timeout may be automatically set to AFK " +
- "(if supported by this feature) or kicked as per `server.properties`.\n\n" +
- "Note: Rest of AFK settings might be in Purpur config if applicable, or dedicated AFK plugins."
+ desc: `Whether to enable the AFK command based on Minecraft's built-in [idle-timeout mechanism](https://minecraft.wiki/w/Server.properties#:~:text=player%20have%20to%20idle). Players can use \`/afk\` command to switch their AFK mode, and their AFK status can be shown in the Tab list.
+
+ Also set \`kick-if-idle\` to \`false\` in Purpur config, to prevent players from being kicked when they enter AFK mode. The rest of the AFK settings, configurable AFK messages, and title messages are in Purpur config.`
}
}
},
network: {
+ __desc__: "This section contains features related to server networking.",
"protocol-support": {
+ __desc__: `This section contains features that provide extra protocol support for some QoL / Utility mods.
+
+ The extra protocol support is only functional if there is a corresponding client-side mod installed. It means if a specific protocol support is enabled, and a player installs that mod on the client, they can get the additional features described in each config below. But for players who have no corresponding mod installed, then everything is the same as before.
+
+
+
Attention
+ The protocol support may cause incompatibility with the [ViaVersion](https://modrinth.com/plugin/viaversion).
+ We recommend players use a client that has the same version as the server core and install the latest corresponding mod; otherwise, they may be unable to join the server.
+
`,
"jade-protocol": {
- enabled: {
- default: false,
- desc:
- "Enable server-side support for the [Jade / WTHIT](https://modrinth.com/mod/jade) " +
- "(What The Hell Is That) client mod's protocol.\n\n" +
- "Allows the server to potentially send more accurate or custom information " +
- "(like storage contents, furnace progress, beehive data) to players using this mod."
- }
+ default: false,
+ desc: `Whether to enable [Jade](https://modrinth.com/mod/jade) protocol support.
+ If set to \`true\`, players who have the Jade mod installed can display item information inside the storage container, progress of the furnace, brewing stand, foods on the campfire, bee data in the beehive, and more vanilla-friendly features.`
},
"appleskin-protocol": {
- enabled: {
- default: false,
- desc:
- "Enable server-side support for the [AppleSkin](https://modrinth.com/mod/appleskin) client mod's protocol.\n\n" +
- "Sends detailed hunger, saturation, and exhaustion information to players using AppleSkin, " +
- "allowing accurate display on the client."
- }
+ default: false,
+ desc: `Whether to enable [AppleSkin](https://modrinth.com/mod/appleskin) protocol support.
+ If set to \`true\`, players who have the AppleSkin mod installed can display the accurate saturation/exhaustion values on the client.`
},
"appleskin-protocol-sync-tick-interval": {
default: 20,
- desc:
- "How often (in ticks) the server should synchronize AppleSkin data (saturation, exhaustion) " +
- "with clients using the mod, if `appleskin-protocol.enabled` is true.\n\n" +
- "`20` ticks = 1 second.\n\n" +
- "📏 **Unit:** ticks."
+ desc: `How often the server should synchronize AppleSkin data to clients with AppleSkin installed.
+ This only has any effect if \`appleskin-protocol\` above is \`true\`.
+ (Unit: tick, default value 20 ticks = 1 second)`
},
"asteorbar-protocol": {
- enabled: {
- default: false,
- desc:
- "Enable server-side support for the [Astéor Bar](https://modrinth.com/mod/asteorbar) client mod's protocol.\n\n" +
- "Sends detailed saturation/exhaustion information for display on the client."
- }
+ default: false,
+ desc: `Whether to enable [AsteorBar](https://modrinth.com/mod/asteorbar) protocol support.
+ If set to \`true\`, players who have the AsteorBar mod installed can display the accurate saturation/exhaustion values on the client.`
},
"chatimage-protocol": {
- enabled: {
- default: false,
- desc:
- "Enable server-side support for client mods that allow embedding images in chat " +
- "(e.g., [ChatImage](https://modrinth.com/mod/chatimage)).\n\n" +
- "Requires a compatible plugin on the server to handle image uploading, " +
- "distribution, and display using formats like CICode."
- }
+ default: false,
+ desc: `Whether to enable [ChatImage](https://modrinth.com/mod/chatimage) protocol support.
+ If set to \`true\`, players who have the ChatImage mod installed can see the image sent by others using the CICode format.`
},
"xaero-map-protocol": {
- enabled: {
- default: false,
- desc:
- "Enable server-side support for [Xaero's World Map and Minimap](https://modrinth.com/mod/xaeros-minimap) " +
- "client mods' protocols.\n\n" +
- "Allows the server to potentially send waypoint data or other map-related information. " +
- "Clients can store map data (like player coordinates, death points) tied to the server ID, " +
- "preventing data loss if server IP/name changes."
- }
+ default: false,
+ desc: `Whether to enable [XaeroMap](https://modrinth.com/mod/xaeros-minimap) protocol support.
+ If set to \`true\`, players who have Xaero's MiniMap mod or Xaero's WorldMap mod installed can store players' coordinate points and death points based on the server's \`protocol-support.xaero-map-server-id\` below.`
},
"xaero-map-server-id": {
- default: -739812325,
- desc:
- "A unique numeric identifier for this server used by Xaero's map protocol.\n\n" +
- "Clients use this ID to distinguish map data from different servers. Change if needed " +
- "(especially in a multi-server network environment). Generated randomly on first start if not set."
+ default: 513317,
+ desc: `Unique number ID for XaeroMap to identify the server.
+ This can prevent points from being deleted/refreshed if the server name or IP address changes. Change this value if needed.
+ This value will be generated randomly on the first server start.`
},
"syncmatica-protocol": {
- enabled: {
- default: false,
- desc:
- "Enable server-side support for the [Syncmatica](https://modrinth.com/mod/syncmatica) client mod's protocol.\n\n" +
- "Allows players using Syncmatica to share and synchronize [Litematica](https://modrinth.com/mod/litematica) " +
- "schematics with the server and other players (requires a compatible server-side implementation)."
- }
+ default: false,
+ desc: `Whether to enable [Syncmatica](https://modrinth.com/mod/syncmatica) protocol support.
+ If set to \`true\`, players who have Syncmatica mod installed can upload their [Litematica](https://modrinth.com/mod/litematica) schematic files or download shared schematics files from the server. Every player with the Syncmatica mod installed can access shared schematics uploaded by others.`
},
"syncmatica-quota": {
- enabled: {
- default: false,
- desc: "Enable a storage quota limit for schematics uploaded via Syncmatica, if `syncmatica-protocol.enabled` is true."
- }
+ default: false,
+ desc: "Whether to enable the maximum file size limit for each shared schematics file of the Litematica mod."
},
"syncmatica-quota-limit": {
default: 40000000,
- desc:
- "The maximum total size allowed for Syncmatica schematic uploads per player or globally " +
- "(depending on implementation) if `syncmatica-quota.enabled` is true.\n\n" +
- "Default is 40,000,000 bytes (approx 38-40MB).\n\n" +
- "📏 **Unit:** bytes."
+ desc: `The maximum file size of each shared schematic file is uploaded to the server.
+ (Unit: byte, default value 40,000,000 bytes ≈ 38 MB)`
+ },
+ "do-a-barrel-roll-protocol": {
+ default: false,
+ desc: `Whether to enable [Do a Barrel Roll](https://modrinth.com/mod/do-a-barrel-roll) protocol support.
+ If set to \`true\`, the visual effects of Do a Barrel Roll can be synchronized to other players who have this mod installed.`
+ },
+ "do-a-barrel-roll-allow-thrusting": {
+ default: false,
+ desc: "Whether to allow players to enable \`enable_thrust\` option in their client configuration."
+ },
+ "do-a-barrel-roll-force-enabled": {
+ default: false,
+ desc: "Whether to force the mod to be enabled for all players who have this mod installed, regardless of their client configuration."
+ },
+ "do-a-barrel-roll-force-installed": {
+ default: false,
+ desc: "Whether to reject players who join if they don't have this mod installed in their clients."
+ },
+ "do-a-barrel-roll-installed-timeout": {
+ default: 0,
+ desc: `The amount of time to wait for a client to respond to the \`do_a_barrel_roll:config_sync\` packet.
+ (Unit: tick)
+ If set to \`true\`, players who have not installed this mod in their clients will be kicked after this timeout is reached.`
}
},
OptimizeNonFlushPacketSending: {
- enabled: {
- default: false,
- desc:
- "Optimizes the sending of non-flushed packets by using Netty's `lazyExecute` method. " +
- "This can reduce thread contention and wakeup calls for certain types of network operations.\n\n" +
- "⚠️ **WARNING: This option is known to be INCOMPATIBLE with ProtocolLib and may cause issues " +
- "with other plugins that extensively manipulate network packets. " +
- "Requires a server restart to take effect. Use with extreme caution.**"
- }
+ default: false,
+ desc: `Whether to optimize the sending of non-flushed packets by using Netty's [\`lazyExecute\`](https://netty.io/4.2/api/io/netty/util/concurrent/SingleThreadEventExecutor.html#lazyExecute(java.lang.Runnable)) method. This can reduce thread contention and wakeup calls for certain types of network operations.
+
+
+
Warning
+ This option is known to be __INCOMPATIBLE__ with ProtocolLib and may cause issues with other plugins that extensively manipulate network packets.
+ Requires restarting the server to take effect. Use with extreme caution.
+
`
},
"chat-message-signature": {
- enabled: {
- default: true,
- desc:
- "Whether to enable cryptographic signatures for chat messages (introduced in 1.19.1).\n\n" +
- "- If `true` (Vanilla default): Messages are signed, allowing players to report messages to " +
- "Mojang and enabling the 'secure chat' indicators/popups.\n" +
- "- If `false`: Signatures are disabled. Chat reporting is not possible, and the 'secure chat' " +
- "popup/indicators are disabled (often preferred for offline-mode servers or communities wanting to handle moderation internally).\n\n" +
- "⚡ **Recommended value:** `false`"
- }
+ default: true,
+ desc: `Whether to enable chat message signature, which was introduced in Minecraft 1.19.1.
+
+ - If set to \`true\`, messages are signed and able to report just like in vanilla.
+ - If set to \`false\`, the chat signature is disabled. Players are unable to report messages, and the insecure warning pop-up will be disabled when the player joins the server.
+
+
+ __⚡Recommended value: \`false\`__ (Only for offline-mode server or servers that have alternative moderation methods)`
+ },
+ "async-switch-state": {
+ default: false,
+ desc: `Whether to process the connection state switch logic of the player asynchronously.
+ This can resolve the main thread blocking issue caused by using exploits due to vanilla logic's design flaw.
+
+ __⚡Recommended value: \`true\`__ `
}
},
misc: {
+ __desc__: "This section contains some miscellaneous features.",
message: {
"unknown-command": {
- default: "",
- desc:
- "Customizes the message displayed when a player enters an unrecognized command.\n\n" +
- "- Uses [MiniMessage](https://docs.adventure.kyori.net/minimessage/format.html) format for colors and styling.\n" +
- '- Set to the string `"default"` to use the standard vanilla message.\n' +
- "- Placeholder: `` can be used to insert the specific unknown command text entered by the player.\n\n" +
- "📝 **Note:** This message can be overridden by plugins using `UnknownCommandEvent#message`."
+ default: "default",
+ desc: `The unknown command message will be sent to the player if they execute an unknown command.
+ The message needs to use the [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/) format.
+ If set to \`default\`, the vanilla unknown command message will be used.
+
+ Available placeholders:
+
+ - __\`\`__ - the detailed information of the unknown command.
+
+
+
+
API / Plugin Friendly
+ This feature is API / plugin-friendly. It means that this message can be overridden by plugins using \`UnknownCommandEvent#message\` or \`UnknownCommandEvent#setMessage\`.
+
`
}
},
rebrand: {
"server-mod-name": {
default: "Leaf",
- desc:
- "The server name/brand displayed in the client's F3 debug screen and potentially the " +
- "multiplayer server list (replaces 'Paper', 'Spigot', 'Vanilla', etc.)."
+ desc: "The server brand name that will be shown on the client's F3 debug menu and server MOTD."
},
"server-gui-name": {
default: "Leaf Console",
- desc: "The title displayed in the server's graphical console window (if one is used, i.e., not launched with `--nogui`)."
+ desc: "The title displayed on the server GUI window, if you launched the server without adding the \`--nogui\` option in the startup flag."
}
},
sentry: {
+ __desc__: `[Sentry](https://sentry.io/welcome/) is an application monitor service for improved error logging and tracing. Helping the server dev team to maintain better.
+
+ After enabling Sentry integration for your server, you don't need to audit long logs to find errors manually. Sentry can collect errors that happened in your server, enable you to track errors on Sentry's web panel, and help you to locate and fix them more easily and quickly.
+
+ See __[How to Setup Sentry](../how-to/setup-sentry)__ to know how to set up and get the DSN key for \`sentry.dsn\` below.
`,
dsn: {
- default: "",
- desc:
- "Your Sentry Data Source Name (DSN) for advanced error reporting and aggregation.\n\n" +
- "Obtain a DSN from [sentry.io](https://sentry.io/) by creating a project. " +
- "Leave blank (`''`) to disable Sentry integration."
+ default: "''",
+ desc: `The DSN key of your Sentry.
+ If an empty value \`''\` is given, the Sentry will be disabled.`
},
"log-level": {
default: "WARN",
- desc:
- "The minimum logging level (e.g., `INFO`, `WARN`, `ERROR`) required for a server " +
- "log message to be captured and sent to Sentry, if Sentry is enabled."
+ desc: `Logs with a level higher than or equal to this level will be recorded.
+ The valid values for this option are: \`"WARN"\`, \`"ERROR"\`, and \`"FATAL"\`.`
},
"only-log-thrown": {
- enabled: {
- default: true,
- desc:
- "If true, only log messages that include a Java Throwable (an exception or error stack trace) " +
- "will be sent to Sentry, ignoring plain log messages even if they meet the `log-level`."
- }
+ default: true,
+ desc: "Whether the Sentry only records the log with Java's \`Throwable\`."
}
},
"secure-seed": {
enabled: {
default: false,
- desc:
- "If enabled, world generation features like ore veins and structure placements " +
- "will use a secure, high-entropy 1024-bit seed derived internally from the main world " +
- "seed, instead of directly using the 64-bit world seed.\n\n" +
- "This makes predicting ore/structure locations based on the world seed (seed cracking) " +
- "computationally infeasible.\n\n" +
- "⚠️ **WARNING: This fundamentally changes ore and structure positions compared to vanilla " +
- "generation with the same world seed! Use only for new worlds or where vanilla seed parity " +
- "is not a requirement. Applies only to newly generated chunks in existing worlds.**\n\n" +
- "⚡ **Recommended value:** `true` (on new worlds where seed cracking is a concern), `false` for vanilla behavior/seed parity."
+ desc: `Whether to use the secure seed.
+
+ The secure seed ensures that all ores and structures are generated with a 1024-bit seed using a high security cryptographic hash function instead of using a 64-bit seed like in vanilla. This protects the structure seeds with computational secrecy and makes the seed cracking nearly impossible.
+
+
+
Warning
+ The secure seed fundamentally changes the positions of ore and structure compared to vanilla.
+ It only applies to newly generated chunks. Thus, you must prepare a new world if you want to enable this option.
+ Once this option is enabled, you can not disable it to return to the vanilla generation, unless you pre-generate the entire world, or newly generated chunks will have terrain mismatch.
+
`
}
},
"remove-vanilla-username-check": {
- enabled: {
- default: true,
- desc:
- "Removes the default vanilla check that restricts player usernames " +
- "to alphanumeric characters and underscores (`a-zA-Z0-9_`).\n\n" +
- "Enable this (`true`) to allow usernames containing symbols or other " +
- "characters (e.g., Chinese, spaces), often necessary for specific " +
- "authentication plugins or some offline-mode setups."
- }
+ default: true,
+ desc: `Whether to remove vanilla's username check to allow __all characters__ as usernames, including Chinese, etc. (It's only useful for offline servers).
+ If set to \`true\`, players are allowed to use a non-English name to join the server.`
},
"remove-spigot-check-bungee-config": {
- enabled: {
- default: true,
- desc:
- "Disables Spigot's check for `settings.bungeecord: true` in `spigot.yml` " +
- "when a player attempts to join via a proxy.\n\n" +
- "Enable this (`true`) to allow players to connect through a BungeeCord/Velocity " +
- "proxy even if the backend server doesn't have BungeeCord mode explicitly enabled " +
- "in its own Spigot configuration.\n\n" +
- "⚠️ **WARNING: This assumes your proxy is correctly configured for IP forwarding " +
- "(e.g., using BungeeCord mode on the proxy itself). Failure to ensure proper IP " +
- "forwarding configuration on the proxy side can lead to security vulnerabilities " +
- "(like IP spoofing) and incorrect player IP addresses being reported to the backend server and plugins.**"
- }
+ default: false,
+ desc: `Whether the player can enter the backend server via proxy, without the backend server enabling BungeeCord mode in \`spigot.yml\`.
+
+
+
Warning
+ This option is not recommended to touch, unless you are sure what you are doing.
+ And it may be removed in the future.
+
`
},
"remove-change-non-editable-sign-warning": {
- enabled: {
- default: false,
- desc:
- 'Suppresses the console warning message: "Player [...] tried to change non-editable sign".\n\n' +
- "Enable this (`true`) to reduce console spam if this warning occurs frequently due to plugins " +
- "or specific player actions and is considered benign noise.\n\n" +
- "⚡ **Recommended value:** `true` (to reduce console spam)"
- }
+ default: false,
+ desc: `Whether the server prints a warning message when players try to edit the sign that they are not allowed to edit.
+ The warning message looks like: \`Player [...] just tried to change non-editable sign\`.
+ If set to \`true\`, it will prevent console spam caused by player actions or other cases.
+
+ __⚡Recommended value: \`true\`__`
},
"region-format-settings": {
+ __desc__: `Linear is a region file format that uses [zstd compression](https://facebook.github.io/zstd/) instead of zlib in vanilla Minecraft. This format saves about ~50% of disk space.
+ To use Linear region format, make sure you __read [Linear Documentation](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools)__, and have done all steps required, then change \`region-format\` below to \`LINEAR\`.
+
+
+
Warning
+ Experimental feature, there is a potential risk of losing chunk data. Backup your server before switching to Linear.
+ Also, we do not recommend using Linear, since vanilla's ANVIL format (\`.mca\`) is enough. Leaf uses the refactored version of the Linear flush system, which is safer but slower to save chunks to make data loss less likely. However, this trade-off is worthwhile, since data is invaluable.
+
`,
"region-format": {
default: "MCA",
- desc:
- "Specifies the format used for saving chunk data in region files.\n\n" +
- "- `MCA`: Standard Minecraft Anvil format using Zlib compression. Compatible everywhere. Safer.\n" +
- "- `LINEAR`: Experimental format using Zstandard (ZSTD) compression. Offers significant disk " +
- "space savings but is less compatible and potentially riskier.\n\n" +
- "See [LinearRegionFileFormatTools Documentation](https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools) " +
- "before using LINEAR.\n\n" +
- "⚠️ **LINEAR is experimental. Always back up your world before switching formats. " +
- "Potential risk of data loss or corruption. Requires server restart.**"
+ desc: `Specifies the format used for saving chunk data in region files.
+ Available region formats:
+
+ - \`MCA\`: Standard Minecraft ANVIL format using zlib compression.
+ - \`LINEAR\`: The Linear v1 format. The refactored version by [EarthMe](https://github.com/MrHua269) fixed the Linear flush system.
+
`
},
"linear-compress-level": {
default: 1,
- desc:
- "The Zstandard compression level to use when `region-format` is set to `LINEAR`.\n\n" +
- "Higher levels (up to 22) provide better compression ratios but require significantly more " +
- "CPU time for compression. Lower levels are faster. Level 1 is a fast, light compression setting."
+ desc: `The compression level of the Linear region format file.
+ This only has any effect if \`region-format\` above is \`LINEAR\`.
+
+
+ - If set to a higher level (up to \`22\`), it provides better compression ratios but requires significantly more CPU time for compression.
+ - If set to a lower level, it compresses faster, but requires more space. The level \`1\` uses the fastest and lightest compression.
+
`
},
"throw-on-unknown-extension-detected": {
- enabled: {
- default: false,
- desc:
- "If true, the server will detect and throw an error (potentially stopping) if it " +
- "encounters region files with an unexpected file extension in the world's region directory " +
- "(e.g., finding `.linear` files when expecting `.mca`, or vice-versa).\n\n" +
- "Helps prevent data corruption from accidentally mixing region file formats in the same world."
- }
+ default: false,
+ desc: `Whether to throw an error and crash the server when an unknown or unmatched region format extension is detected during loading region files from the disk.
+ It can prevent data corruption from accidentally configured wrong region file formats in the same world.
+
+ For example:
+ If set to \`true\`, the server will crash immediately when loaded \`.linear\` files when \`region-format\` above is \`MCA\`, or vice-versa.`
},
"flush-interval-seconds": {
default: 5,
- desc: "How often (in seconds) the server attempts to flush cached region file data (relevant for LINEAR format) to disk.\n\nMore frequent flushing reduces potential data loss on crash but increases disk I/O.\n\n📏 **Unit:** seconds.\n\n"
+ desc: `How often the server attempts to flush cached Linear region file data to the disk.
+ More frequent flushing reduces potential data loss on a crash but increases disk I/O.
+ (Unit: second)`
}
},
"lag-compensation": {
enabled: {
default: false,
- desc:
- "**Experimental feature**\n\n Enables lag compensation features designed to " +
- "mitigate the gameplay impact of server lag spikes or low TPS situations, potentially " +
- "ensuring a basic level of playability.\n\nMay involve techniques like client-side " +
- "prediction adjustments or delaying certain actions to feel smoother during lag.\n\n" +
- "⚠️ **Experimental: May have unintended side effects or not work reliably in all situations. Use with caution.**\n\n" +
- "⚡ **Recommended value:** `true`"
+ desc: `The lag compensation is designed to mitigate the gameplay impact of server lag spikes or low TPS situations, which could ensure the basic game experience for players during the lag.
+
+ __⚡Recommended value: \`true\`__`
},
"enable-for-water": {
- enabled: {
- default: false,
- desc:
- "Apply lag compensation logic specifically to player interactions involving water " +
- "(e.g., swimming, fluid flow effects), if `lag-compensation.enabled` is true.\n\n" +
- "⚡ **Recommended value:** `true`"
- }
+ default: false,
+ desc: `Whether to enable lag compensation for water flowing.
+
+ __⚡Recommended value: \`true\`__`
},
"enable-for-lava": {
- enabled: {
- default: false,
- desc:
- "Apply lag compensation logic specifically to player interactions " +
- "involving lava, if `lag-compensation.enabled` is true.\n\n" +
- "⚡ **Recommended value:** `true`"
- }
+ default: false,
+ desc: `Whether to enable lag compensation for lava flowing.
+
+ __⚡Recommended value: \`true\`__`
}
},
"including-5s-in-get-tps": {
- enabled: {
- default: true,
- desc:
- "Whether the server's reported TPS (Ticks Per Second) values should include the " +
- "short-term 5-second average alongside the standard 1-minute, 5-minute, and 15-minute " +
- "averages when accessed via API methods like `Bukkit#getTPS()` or `Server#getTPS()`.\n\n" +
- "- If `true`: `getTPS()` returns `[5s, 1m, 5m, 15m]`.\n" +
- "- If `false`: `getTPS()` returns `[1m, 5m, 15m]`.\n\n" +
- "Enable (`true`) for more immediate feedback on recent performance fluctuations via API. " +
- "Commands like `/tps` might display it regardless.\n\n" +
- "📝 **Note:** Methods like `Bukkit#getTPSIncluding5SecondAverage()` and `Bukkit#get5SecondTPSAverage()` " +
- "may be available via Leaf/Gale API regardless of this setting."
- }
+ default: true,
+ desc: `Whether to include 5-second TPS in the result of API \`Bukkit#getTPS\` and \`Server#getTPS\`.
+ Commands like \`/tps\` display it regardless.
+
+ - If set to \`true\`, you can use the \`getTPS\` method to get a TPS long array with 4 elements \`[5s, 1m, 5m, 15m]\`.
+ - If set to \`false\`, you can use the \`getTPS\` method to get a TPS long array with 3 elements \`[1m, 5m, 15m]\`.
+
+
+
+ Want to Go Deeper?
+ If you are using the Leaf API for your plugins. Or running on Leaf and using reflection to get TPS, you can use \`Bukkit#getTPSIncluding5SecondAverage\`, to get the TPS array including 5-second TPS \`[5s, 1m, 5m, 15m]\`.
+ Also, you can use \`Bukkit#get5SecondTPSAverage\` to get the average value of 5-second TPS in \`double\`.
+ `
},
"connection-message": {
+ __desc__: `The connection message broadcasts to all online players when they join or quit the server.
+ The message needs to use the [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/) format.
+ If set \`message\` below to \`default\`, the vanilla join/quit message will be used.
+ If set \`enabled\` below to \`false\`, the connection message will be disabled, and another plugin will be used to send the connection message.
+
+ Available placeholders:
+
+ - __\`\`__ - player name
+ - __\`\`__ - player display name
+
+
+
+
API / Plugin Friendly
+ This feature is API / plugin-friendly. It means that the connection message content can be overridden by plugins using \`PlayerJoinEvent\` or \`PlayerQuitEvent\`.
+
`,
join: {
enabled: {
default: true,
- desc: "Whether to use the custom join message defined below instead of the default Minecraft join message."
+ desc: "Whether to broadcast a message when the player joins."
},
message: {
default: "default",
- desc:
- "The message broadcast globally when a player joins the server.\n\n" +
- "- Uses [MiniMessage](https://docs.adventure.kyori.net/minimessage/format.html) format.\n" +
- 'Set to `"default"` for vanilla message (e.g., "Player joined the game").\n' +
- "Placeholders: `%player_name%`, `%player_displayname%`."
+ desc: "The join message of the player."
}
},
quit: {
enabled: {
default: true,
- desc: "Whether to use the custom quit message defined below instead of the default Minecraft quit message."
+ desc: "Whether to broadcast a message when the player quits."
},
message: {
default: "default",
- desc:
- "The message broadcast globally when a player leaves the server.\n\n" +
- "- Uses [MiniMessage](https://docs.adventure.kyori.net/minimessage/format.html) format.\n" +
- '- Set to `"default"` for vanilla message.\n' +
- "- Placeholders: `%player_name%`, `%player_displayname%`."
+ desc: "The quit message of the player."
}
}
},
cache: {
- "cache-player-profile-result": {
+ "profile-lookup": {
enabled: {
- default: true,
- desc:
- "Cache the player's profile information (UUID, username, skin/cape textures) " +
- "retrieved from Mojang's session servers upon their first successful join.\n\n" +
- "This allows players to rejoin the server using cached data even if Mojang's " +
- "authentication servers are temporarily unavailable (useful during outages)."
+ default: false,
+ desc: `Whether to cache the player's profile data (e.g., UUID, username, skin/cape textures) when they joined the server.
+ This can reduce network requests to Mojang's authentication server, and is also useful if the authentication server is temporarily unavailable, and still allows players to rejoin the server using cached profile data.`
+ },
+ timeout: {
+ default: 1440,
+ desc: `The timeout of the player profile cache.
+ (Unit: minute, default value 1440 minutes = 24 hours)
+ If the given timeout is exceeded, the server will send another request to fetch player profile data from Mojang's authentication server on the player's next join.`
+ },
+ "max-size": {
+ default: 8192,
+ desc: `The maximum number of profiles to cache.
+ Higher values may take slightly more memory.`
}
- },
- "cache-player-profile-result-timeout": {
- default: 1440,
- desc:
- "How long (in minutes) the cached player profile information remains valid.\n\n" +
- "After this timeout, the server will attempt to re-fetch the profile from Mojang upon " +
- "the player's next join to ensure the data (especially textures) is up-to-date.\n\n" +
- "Default is 1440 minutes (24 hours).\n\n" +
- "📏 **Unit:** minutes."
+ }
+ },
+ "async-catcher": {
+ enabled: {
+ default: true,
+ desc: `Whether to enable Spigot's main thread check.
+
+
+
Warning
+ Disabling this is NOT recommended and can lead to severe server instability.
+ This option is not recommended to touch, unless you are sure what you are doing.
+
`
}
}
}
diff --git a/pages/docs/config/data/leaf-global-latest.ts b/pages/docs/config/data/leaf-global-latest.ts
new file mode 100644
index 0000000..917c398
--- /dev/null
+++ b/pages/docs/config/data/leaf-global-latest.ts
@@ -0,0 +1,1190 @@
+import type { ConfigRoot } from "@/.vitepress/theme/components/config/types";
+
+const config: ConfigRoot = {
+ "config-version": {
+ default: "3.0"
+ },
+
+ async: {
+ __desc__:
+ "This section contains asynchronous features intended to reduce the load on the main thread (Server Thread) by processing tasks asynchronously.",
+ "async-chunk-send": {
+ enabled: {
+ default: false,
+ desc: `Whether to make packing and sending chunk packets asynchronous.
+ This can significantly reduce main thread load, especially when many players are loading chunks simultaneously (e.g., joining, teleporting, flying fast).
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "async-mob-spawning": {
+ enabled: {
+ default: true,
+ desc: `Whether to make mob spawning asynchronous.
+
+ On servers with heavy mob spawning, this can improve performance by up to ~15%. You must have Paper's \`per-player-mob-spawns\` config set to \`true\` for this to work.
+ One quick note: this does not actually spawn mobs async (that would be very unsafe). This just offloads some expensive calculations that are required for mob spawning.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "async-pathfinding": {
+ enabled: {
+ default: false,
+ desc: `Whether to make the mob pathfinding calculation asynchronously.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "max-threads": {
+ default: 0,
+ desc: `Maximum number of threads for async mob pathfinding to use.
+ If a value ≤ \`0\` is given, it automatically uses 1/4 of the number of CPU cores, with a minimum of 1.
+
+ __⚡Recommended value: 1/3 of CPU cores__`
+ },
+ keepalive: {
+ default: 60,
+ desc: `The thread keepalive time, threads with no tasks will be terminated if they exceed the time.
+ (Unit: second)`
+ },
+ "queue-size": {
+ default: 0,
+ desc: `Maximum size of the queue for pending mob pathfinding tasks.
+ If a value ≤ \`0\` is given, the queue size is dynamically calculated as \`max-threads * 256\`.`
+ },
+ "reject-policy": {
+ default: "CALLER_RUNS",
+ desc: `The policy to use when the pathfinding task queue is full, and a new task is submitted.
+
+ - \`FLUSH_ALL\`: All pending tasks in the queue are immediately run on the server thread.
+ - \`CALLER_RUNS\`: The incoming submitted task will be run on the server thread.
+
+
+ __⚡Recommended value: \`CALLER_RUNS\`__`
+ }
+ },
+ "async-playerdata-save": {
+ enabled: {
+ default: false,
+ desc: "Whether to make player data saving asynchronous (I/O operations are expensive)."
+ // TODO
+ //
+ //
Experimental
+ // Experimental feature, may cause data loss or data inconsistency in some circumstances!
+ //
`
+ }
+ },
+ "async-entity-tracker": {
+ enabled: {
+ default: false,
+ desc: `Whether to make entity tracking asynchronous.
+ This can improve performance significantly, especially in situations with a large number of entities in a small area.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ threads: {
+ default: 0,
+ desc: `Maximum number of threads for async entity tracker to use.
+ If a value ≤ \`0\` is given, it automatically uses 1/4 of the number of CPU cores, with a minimum of 1.
+
+ __⚡Recommended value: 1/2 of CPU cores__`
+ }
+ },
+ "parallel-world-ticking": {
+ enabled: {
+ default: false,
+ desc: `Whether to parallel process different worlds in separate threads, which can improve performance on a multi-core system.
+
+ Parallel World Ticking, also known as "PWT", is a concept created by [SparklyPaper](https://github.com/SparklyPower/SparklyPaper), which involves ticking each world in its own dedicated thread to reduce and split the workload from a single thread for all worlds.
+ In this PWT implementation, each world will wait until the last world tick completes. Read more in SparklyPaper's explanation [PARALLEL_WORLD_TICKING.md](https://github.com/SparklyPower/SparklyPaper/blob/13aff425238ea322658de0d9f4f7bd906bd9f431/docs/PARALLEL_WORLD_TICKING.md).
+
+ When should I consider trying PWT?
+
+ - I really can't switch to [Folia](https://papermc.io/software/folia) or its fork.
+ - I have a multi-core server.
+ - My players spread on average in each world.
+ - (Or I have many worlds, e.g., some RPG servers)
+
+
+ __⚡Recommended value: \`false\` (Only enable it if experience specific bottlenecks and understand the risks)__
+
+
+
Experimental
+ Experimental feature, potentially unstable, and may cause compatibility issues with some plugins.
+
`
+ },
+ threads: {
+ default: 8,
+ desc: `Number of threads dedicated to parallel world ticking.
+
+ __⚡Recommended value: same as the number of worlds__`
+ },
+ "log-container-creation-stacktraces": {
+ default: false,
+ desc: `Whether to log stacktraces when containers (like Block Entities or Entities) are created during parallel ticking.
+ This is useful for debugging potential concurrency issues.`
+ },
+ "disable-hard-throw": {
+ default: false,
+ desc: `Whether to disable hard throws (which usually stop the server) related to parallel ticking errors.
+
+
+
Attention
+ This may mask underlying issues, but it can help prevent crashes during the testing stage of server development. Use with caution.
+
`
+ },
+ "async-unsafe-read-handling": {
+ default: "BUFFERED",
+ desc: `Whether to run asynchronous tasks synchronously within the parallel ticking system.
+ This might be needed for plugin compatibility with certain plugins, but it largely negates the performance benefits of parallel ticking.
+
+ __⚡Recommended value: \`BUFFERED\`__`
+ }
+ }
+ },
+
+ performance: {
+ __desc__:
+ "This section contains performance tuning intended to reduce unnecessary calculations or use more efficient methods to optimize the server.",
+ "check-survival-before-growth": {
+ "cactus-check-survival": {
+ default: false,
+ desc: `Whether to check if the cactus can survive before trying to grow.
+ This can help improve performance if huge cactus farms exist on the server.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "dont-save-entity": {
+ "dont-save-primed-tnt": {
+ default: false,
+ desc: `Whether to disable saving primed TNT on chunk unloads.
+ This can prevent machines or redstone builds from being exploded by TNT when the player accidentally disconnects or when the chunk unloads when the player is far away. Useful for redstone/technical/survival servers that have machines involving TNTs.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "dont-save-falling-block": {
+ default: false,
+ desc: `Whether to disable saving falling blocks on chunk unloads.
+ This can prevent potential issues with glitched or duplicated falling blocks (sand, gravel, etc.) after server restarts or chunk loads, especially if caused by lag.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ dab: {
+ __desc__:
+ "Dynamic Activation of Brain, also known as DAB, optimizes the brain of entities by decreasing the frequency of their brain ticking when they are far away from players. It is a worthwhile trade-off to improve performance if there are many entities.",
+ enabled: {
+ default: false,
+ desc: `Whether to enable the DAB.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false (or see dab.blacklisted-entities below for more) |
+
`
+ },
+ "dont-enable-if-in-water": {
+ default: false,
+ desc: `Whether the non-aquatic entities in the water will be excluded by DAB. This can fix [Pufferfish#58](https://github.com/pufferfish-gg/Pufferfish/issues/58).
+ If set to \`true\`, this could fix entities suffocating in the water if they are far from the player.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "start-distance": {
+ default: 12,
+ desc: `The distance determines how far away an entity has to be from the player to start being affected by DAB.
+ (Unit: block)
+
+ __⚡Recommended value: \`8\`__`
+ },
+ "max-tick-freq": {
+ default: 20,
+ desc: `The maximum tick time defines how often the furthest entity will get their pathfinders and behaviors ticked.
+ (Unit: tick, default value 20 ticks = 1s)`
+ },
+ "activation-dist-mod": {
+ default: 8,
+ desc: `The tick frequency that defines how much distance modifies an entity's tick frequency. \`freq = (distanceToPlayer^2) / (2^value)\`.
+
+ - If you want entities further away to tick __less__ often, try \`7\`.
+ - If you want entities further away to tick __more__ often, try \`9\`.
+
+
+ __⚡Recommended value: \`7\`__`
+ },
+ "blacklisted-entities": {
+ default: `
+ - villager
+ - axolotl
+ - hoglin
+ - zombified_piglin
+ - goat`,
+ desc: `A list of entity types that will not be affected by DAB.
+
+ Some survival servers have mob farms, which need mobs to have a target. This kind of "pathfinding" mob farm may be broken by DAB. This situation can be solved by adding specific mobs of the mob farm to this DAB blacklist.
+ If some specific mob farms are broken in your server, mobs freeze and don't move, and you are not sure whether it is caused by DAB. You can try to add them to this blacklist to see if it fixes the issue.
+
+ Format: \`[villager]\` or \`[villager, zombified_piglin]\` (You can find all entity types in [Paper's Javadoc](https://jd.papermc.io/paper/1.21.8/org/bukkit/entity/EntityType.html)).
+
+ [💡 Want to Go Deeper?](guides/dab-blacklist-format)`
+ }
+ },
+ "enable-cached-minecraft-to-bukkit-entitytype-convert": {
+ default: true,
+ desc: `Whether to cache the result of *Minecraft EntityType* to *Bukkit EntityType* conversion. This conversion can be somewhat expensive, especially in the spawning logic, so caching it can improve performance slightly.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "fast-biome-manager-seed-obfuscation": {
+ enabled: {
+ default: false,
+ desc: `Whether to replace vanilla SHA-256 seed obfuscation in \`BiomeManager\` with XXHash.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "seed-obfuscation-key": {
+ default: 513317,
+ desc: `Seed obfuscation key for XXHash.
+ This value will be generated randomly on the first server start.`
+ }
+ },
+ "faster-random-generator": {
+ enabled: {
+ default: false,
+ desc: `Whether to use the faster random generator introduced in Java 17.
+ Random is used almost everywhere in Minecraft, enabling this can get a decent performance improvement.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ This requires a JVM that supports \`RandomGenerator\`. Some JREs don't support it.
+
`
+ },
+ "random-generator": {
+ default: "Xoroshiro128PlusPlus",
+ desc: `The specific algorithm of the random generator should be used.
+ Available random generators can be found in [Random Number Generators in Java](https://www.baeldung.com/java-17-random-number-generators#1-api-design-1) or [JEP 356](https://openjdk.org/jeps/356).
+
+ __⚡Recommended value: \`Xoroshiro128PlusPlus\`__`
+ },
+ "enable-for-worldgen": {
+ default: false,
+ desc: `Whether to use the faster random generator for world generation.
+
+ - If set to \`true\`, \`Random\` calls involved in world generation will use the faster random generator you chose in \`random-generator\` above. The world generation will be slightly different from vanilla.
+ - If set to \`false\`, \`Random\` calls involved in world generation will use legacy random generator of vanilla.
+
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Warning
+ This will affect world generation. The terrain and other results of world generation will be slightly different from vanilla.
+
`
+ },
+ "warn-for-slime-chunk": {
+ default: true,
+ desc: "Whether the server prints a warning message on startup if the faster random generator for slime chunk generation is enabled."
+ },
+ "use-legacy-random-for-slime-chunk": {
+ default: false,
+ desc: `Whether to use legacy random source (\`java.util.Random\`) for slime chunk generation to follow the vanilla behavior.
+ If your server has existing slime farms or related facilities that need slime chunk, enable this; otherwise, the location of slime chunk will be offset.
+
+ __⚡Recommended value: (Depends on your server type, see \`Values for goals\` below for more)__
+
+ | Values for goals | |
+ | Optimization | false |
+ | Vanilla behavior | true |
+
`
+ },
+ "use-direct-implementation": {
+ default: false,
+ desc: `Whether to use direct random implementation (LCG without synchronization) instead of delegating to Java's RandomGenerator.
+ This may improve performance, but potentially changes RNG behavior.
+
+ __⚡Recommended value: \`false\`__`
+ }
+ },
+ "faster-structure-gen-future-sequencing": {
+ default: true,
+ desc: `Whether to use faster task sequencing for generating structures.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ This may cause the inconsistent order of future compose tasks in rare edge cases, which may lead to different structure generation results.
+
`
+ },
+ "cache-biome": {
+ enabled: {
+ default: false,
+ desc: `Whether to cache the biome data of the block location, instead of recalculating the biome every time searching.
+
+ __⚡Recommended value: \`true\` (Also requires enabling options below)__`
+ },
+ "mob-spawning": {
+ default: false,
+ desc: `Whether to cache the biome in mob spawning logic.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ advancements: {
+ default: false,
+ desc: `Whether to cache the biome in player advancement calculation logic.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "optimize-block-entities": {
+ default: true,
+ desc: `Whether to use the more efficient map data structure for block entity ticker storage.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "optimize-mob-despawn": {
+ default: false,
+ desc: `Whether to use more efficient logic for mob natural despawn.
+ This can prevent the expensive cost of the vanilla despawn logic that iterates over every player, then compares the distance between the mobs and the player.
+
+ It's recommended to add [\`-DLeaf.enableFMA=true\`](system-properties#dleaf-enablefma) flag for better performance.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ "only-tick-items-in-hand": {
+ default: false,
+ desc: `Whether to tick or update items only if the player holds them in the main hand or offhand, instead of ticking the entire inventory.
+ This currently only affects the ticking of compass and map item.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "optimize-no-action-time": {
+ "disable-light-check": {
+ default: false,
+ desc: `Whether to skip the light check in the monster's \`noActionTime\` update.
+ Directly increment the \`noActionTime\` counter by 1 without checking the light level on every entity ticking. In vanilla, the counter increases by 2 if the monster is in a place where the light level is higher than a specific value.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ }
+ },
+ "optimize-player-movement": {
+ default: true,
+ desc: `Whether to skip unnecessary block edge checks on player moving and avoid redundant view distance updates.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "optimize-random-tick": {
+ default: false,
+ desc: `Whether to use the rewritten random ticking system.
+
+ This rewritten random ticking system uses weighted statistics and sampling to select tickable blocks in active chunks. It can reduce the unnecessary cost caused by frequently selecting non-tickable locations in the vanilla random ticking logic.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ "optimize-waypoint": {
+ default: false,
+ desc: `Whether to update the player's waypoint tracking data only when their block positions change.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ "optimized-powered-rails": {
+ default: false,
+ desc: `Whether to use optimized powered rails.
+ Uses a fully rewritten version of powered rail iteration logic, which also keeps vanilla behavior, and can achieve 4x faster performance.
+ The implementation is originally based on the fabric mod [FX's Rail Optimization](https://modrinth.com/mod/rail-optimization) made by [Fx Morin](https://github.com/FxMorin).
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "reduce-packets": {
+ __desc__: "This section is for the useless packet-reducing features.",
+ "reduce-entity-move-packets": {
+ default: false,
+ desc: `Whether to reduce the useless entity movement packets sent to players (e.g., small movements).
+ This can save bandwidth and reduce client-side processing load, potentially to make movement appear smoother during high entity counts or minor lag.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "skip-ai-for-non-aware-mob": {
+ default: true,
+ desc: `Whether to skip AI ticks entirely for mobs that are both _inactive_ and _unaware_.
+ Unaware mobs optimized this way will not perform self actions or react until they become active again, see [Mob.html#setAware(boolean)](https://jd.papermc.io/paper/1.21.8/org/bukkit/entity/Mob.html#setAware(boolean)) for more information.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
+ },
+ datapack: {
+ "skip-inactive-entity-for-execute-command": {
+ default: false,
+ desc: `Whether to skip selecting inactive entities when using the execute command.
+ This can improve performance on servers with massive datapack functions.`
+ }
+ },
+ "skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer": {
+ default: true,
+ desc: `Whether to skip updating map item data if the map doesn't have a renderer (\`CraftMapRenderer\`).
+ This can improve performance if using ImageMap kind of plugins that create many custom maps.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
+
+
+
Attention
+ This may cause vanilla map item data to stop being updated.
+
`
+ },
+ "throttle-hopper-when-full": {
+ enabled: {
+ default: false,
+ desc: `Whether to throttle hopper item transfer attempts if the target container is full.
+ Prevents the hopper from constantly trying to push items every tick, even if it keeps failing.
+
+ __⚡Recommended value: \`true\`__
+
+ | Values for goals | |
+ | Optimization | true |
+ | Vanilla behavior | false |
+
`
+ },
+ "skip-ticks": {
+ default: 8,
+ desc: `How many ticks should a hopper wait before trying to move items again if the target container is full.
+ (Unit: tick)
+ Only active if \`throttle-hopper-when-full.enabled\` above is \`true\`.
+ If a value ≤ \`0\` is given, this throttling feature is disabled.
+
+ __⚡Recommended value: \`8\`__
+
+ | Values for goals | |
+ | Optimization | 8 |
+ | Vanilla behavior | 8 |
+
`
+ }
+ },
+ "throttle-mob-spawning": {
+ enabled: {
+ default: false,
+ desc: `Whether to skip mob spawning in chunks that have repeatedly failed to spawn mobs beyond the configured \`min-failed\` value.
+ Once the minimum number of failed spawn attempts is reached, the server will randomly skip between 1 ~ \`spawn-chance\`% of spawn attempts in that chunk.
+ Failed spawn attempts will not be counted if spawn limits are reached, and the failure counter will be reset after a successful spawn.`
+ },
+ monster: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for hostile monsters."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of hostile monsters after reaching the `min-failed` value above."
+ }
+ },
+ creature: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for passive creatures (animals)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of passive creatures (animals) after reaching the `min-failed` value above."
+ }
+ },
+ ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for ambient mobs (bats)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of ambient mobs (bats) after reaching the `min-failed` value above."
+ }
+ },
+ axolotls: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for axolotls."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of axolotls after reaching the `min-failed` value above."
+ }
+ },
+ underground_water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for underground water creatures (glow squid)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of underground water creatures (glow squid) after reaching the `min-failed` value above."
+ }
+ },
+ water_creature: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for water creatures (squid, dolphins)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of water creatures (squid, dolphins) after reaching the `min-failed` value above."
+ }
+ },
+ water_ambient: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for ambient water mobs (tropical fish)."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of ambient water mobs (tropical fish) after reaching the `min-failed` value above."
+ }
+ },
+ misc: {
+ "min-failed": {
+ default: 8,
+ desc: "The minimum failed spawn attempt for misc entities."
+ },
+ "spawn-chance": {
+ default: "25.0",
+ desc: "The spawn chance of misc entities after reaching the `min-failed` value above."
+ }
+ }
+ },
+ "create-snapshot-on-retrieving-blockstate": {
+ default: true,
+ desc: `Whether to create a snapshot (copy) of \`BlockEntity\` / \`BlockState\` data by default when plugins retrieve them.
+
+ Some plugins may call \`getInventory().getHolder()\` to get the holder of an inventory, which involves accessing the BlockState.
+ For example, if there are tons of hoppers and plugins, call this method when listening to some events (e.g., hopper related events, call frequently). Re-creating BlockState and parsing item stacks in massive and frequent calls are very expensive.
+ See Paper's [API-to-get-a-BlockState-without-a-snapshot.patch#L6](https://github.com/PaperMC/Paper-archive/blob/b48403bd69f534ffd43fe2afb4e8e1f1ffa95fe1/patches/server/0160-API-to-get-a-BlockState-without-a-snapshot.patch#L6) for more information.
+
+ - If set to \`true\`, it always creates a snapshot (copy) of BlockState when the plugin calls related methods.
+ - If set to \`false\`, it gets the real BlockState directly unless the plugin explicitly requests a snapshot. Performance improves, but there is a risk that the block state gets modified due to the plugin's poor design.
+
+
+ __⚡Recommended value: \`false\` (Only if you encounter specific lag described above)__`
+ },
+ "use-virtual-thread-for-async-scheduler": {
+ default: false,
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __CraftAsyncScheduler__, which could improve the performance of plugins that heavily utilize Bukkit's async scheduler.
+
+ __⚡Recommended value: \`true\` (Only if all plugins support Virtual Thread)__`
+ },
+ "use-virtual-thread-for-async-chat-executor": {
+ default: true,
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __Async Chat Executor__.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "use-virtual-thread-for-profile-executor": {
+ default: false,
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __Profile Executor__, which handles player profile and skull skin fetching.
+
+ __⚡Recommended value: \`false\`__`
+ },
+ "use-virtual-thread-for-user-authenticator": {
+ default: true,
+ desc: `Whether to use the [Virtual Thread](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) introduced in Java 21 for the __User Authenticator service__, which handles premium player join verification.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+
+ fixes: {
+ __desc__: "This section contains bug fixes for specific issues.",
+ "dont-place-player-if-server-full": {
+ default: false,
+ desc: `Whether to disallow players from joining if the server is full (defined as \`max-players\` in \`server.properties\`).
+ This option fixed [Paper#10668](https://github.com/PaperMC/Paper/issues/10668).
+
+ If set to \`true\`, you should grant player \`purpur.joinfullserver\` permission rather than using \`PlayerLoginEvent#allow\` API to allow players to bypass the limit.`
+ }
+ },
+
+ "gameplay-mechanisms": {
+ __desc__: "This section contains the features that modify or improve the game mechanics.",
+ "afk-command": {
+ enabled: {
+ default: false,
+ desc: `Whether to enable the AFK command based on Minecraft's built-in [idle-timeout mechanism](https://minecraft.wiki/w/Server.properties#:~:text=player%20have%20to%20idle). Players can use \`/afk\` command to switch their AFK mode, and their AFK status can be shown in the Tab list.
+
+ Also set \`kick-if-idle\` to \`false\` in Purpur config, to prevent players from being kicked when they enter AFK mode. The rest of the AFK settings, configurable AFK messages, and title messages are in Purpur config.`
+ }
+ },
+ "inventory-overflow-event": {
+ enabled: {
+ default: false,
+ desc: `Whether to enable the inventory overflow event. The event is called when the plugin uses \`Inventory#addItem\` to add items to the player's inventory, and the target inventory is full.
+
+
+
Attention
+ This is not a proper solution to use! Please redesign your plugin logic to use the returned map of the \`Inventory#addItem\` method as soon as possible!
+
`
+ },
+ "listener-class": {
+ default: "com.example.package.PlayerInventoryOverflowEvent",
+ desc: "The full listener class name that listens to this inventory overflow event. Set to your own listener class to use this event."
+ }
+ },
+ player: {
+ "max-use-item-distance": {
+ default: 1.0000001,
+ desc: `The maximum distance that the player is allowed to interact using an item.
+ (Unit: block)
+
+ Some [Anarchy servers](https://minecraftservers.org/type/anarchy) or similar types of servers may allow players to use hacks/cheats. If you want players to be able to use crystal related modules that are packet-based (e.g., CEV Breaker, BedAura), you may need to adjust this value.
+ It's better to set the value to \`10.0000001\` to allow using related hack modules.
+
+ If set to \`-1\` is given, the check of the maximum allowed distance to use an item will be disabled.
+
+ __⚡Recommended value: \`10.0000001\` (Only for anarchy server)__
+
+
+
Attention
+ If set to \`-1\` or any large positive values, players can use some packet modules of hack clients, and are also able to use [Nocom Exploit](https://github.com/nerdsinspace/nocom-explanation)! Adjusting this option requires careful consideration of potential exploits.
+
`
+ }
+ },
+ "allow-tripwire-dupe": {
+ default: false,
+ desc: "Whether to bring back tripwire dupe ([MC-59471](https://bugs.mojang.com/browse/MC/issues/MC-59471)) which is fixed in 1.21.2's snapshots 24w33a and 24w36a. It is also known as the string dupe."
+ },
+ "death-item-drop-knockback": {
+ "drop-around": {
+ default: true,
+ desc: `Whether to drop items randomly around the player on their death.
+
+ - If set to \`true\`, items will be dropped with a randomized motion and scattered around the dead player.
+ - If set to \`false\`, items will be dropped below the dead player.
+
`
+ },
+ "horizontal-force": {
+ default: 0.5,
+ desc: "Base speed of horizontal velocity that applies to the player's dropped items on death."
+ },
+ "vertical-force": {
+ default: 0.2,
+ desc: "Same as \`horizontal-force\`, but it is for vertical velocity."
+ }
+ },
+ // TODO: Add back when implemented it
+ // "hide-item-component": {
+ // "hidden-types": {
+ // default: "[]",
+ // desc: `The list of component type keys that will be hidden from the client.
+ //
+ // See [List of components](https://minecraft.wiki/w/Data_component_format#List_of_components) to get the full list of available component type keys for items.
+ // For example:
+ //
+ // - If a value \`[]\` is given, no item will be affected.
+ // - If a value \`[\"minecraft:custom_data\"]\` is given, the item's \`custom_data\` component will be hidden on the player's client.
+ //
`
+ // },
+ // "enabled": {
+ // default: false,
+ // desc: `Whether to hide specified component information from the player's inventory sent to clients. Also see \`hidden-types\` above.
+ //
+ // It can be used to hide complex component data on an item to reduce rendering load, frequent animations on the client side, and network usage. The actual item data will not be affected.
+ //
+ // It is noted that this option is different from Paper's [item obfuscation](https://docs.papermc.io/paper/reference/global-configuration/#anticheat_obfuscation_items_enable_item_obfuscation). This option only hides item component data from the player's own inventory, instead of hiding data sent to others.
+ //
+ //
+ //
Attention
+ // It may break resource packs, client mods, or specific gameplay mechanics that rely on these client-side component data of items. Use with caution. You must know what components you are hiding!
+ //
`
+ // }
+ // },
+ knockback: {
+ __desc__: "This section contains options to adjust knockback related behaviors.",
+ "snowball-knockback-players": {
+ default: false,
+ desc: "Whether the snowball can knockback players."
+ },
+ "egg-knockback-players": {
+ default: false,
+ desc: "Whether the egg can knockback players."
+ },
+ "can-player-knockback-zombie": {
+ default: true,
+ desc: "Whether the player can knockback zombies using the hand, weapon, projectile, etc."
+ },
+ "flush-location-while-knockback-player": {
+ default: false,
+ desc: `Whether to send movement changes to the client immediately.
+ Once the target player is hit and gets knockback, it can give a smoother PVP gameplay experience with faster knockback responses. Instead, in vanilla, the packet sending happens at the end of the tick and it may hurt the PVP game experience.
+
+ __⚡Recommended value: \`true\` (For PVP server)__
+
+
+
Experimental
+ Experimental feature, actively testing, please report any bugs you encounter.
+
`
+ },
+ "old-blast-protection-explosion-knockback": {
+ default: false,
+ desc: `Whether to use the old <= 1.20.4 explosion knockback behavior, which applies to armors with blast protection enchantment.
+
+ - If set to \`true\`, the explosion knockback will be calculated based on the blast protection enchantment the player has. The knockback is slightly bigger than that after the 1.20.4 version.
+ - If set to \`false\`, explosion knockback will follow the vanilla behavior of the current version.
+
`
+ }
+ },
+ "only-player-pushable": {
+ default: false,
+ desc: `Whether to make only the player pushable.
+ If set to \`true\`, this option will override values of related collision options in Paper's global and world config, and mobs will not be killed under the effect of [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) gamerule.
+
+ __⚡Recommended value: \`true\`__
+
+
+
Attention
+ It can break mob farms that are using mob collision to push mobs to fall or kill mobs by exceeding the value of the [maxEntityCramming](https://minecraft.wiki/w/Game_rule#:~:text=entity%20cramming%20damage) gamerule.
+
`
+ },
+ "spawner-settings": {
+ enabled: {
+ default: false,
+ desc: "Whether to use custom spawner options below. Options below only affect the spawning of spawner blocks instead of the natural spawning."
+ },
+ checks: {
+ "light-level-check": {
+ default: false,
+ desc: `Whether to check if the light level is sufficient to spawn the mob.
+
+ - If set to \`true\`, the spawner will attempt to spawn mobs using the same light level conditions used for natural mob spawning.
+ - If set to \`false\`, the spawner will follow the vanilla behavior that attempts to spawn without checking the light level.
+
`
+ },
+ "spawner-max-nearby-check": {
+ default: true,
+ desc: `Whether to check if there is the maximum amount of nearby mobs to spawn the mob. The spawner will stop spawning new mobs to prevent overcrowding.
+
+ - If set to \`true\`, the spawner will follow the vanilla behavior that prevents spawning new mobs if the nearby mob count exceeds the limit.
+ - If set to \`false\`, the spawner will always attempt to spawn without checking the nearby mob count.
+
`
+ },
+ "check-for-nearby-players": {
+ default: true,
+ desc: `Whether to check if any players are in a radius to spawn the mob.
+
+ - If set to \`true\`, the spawner will always attempt to spawn mobs without checking if there is any player nearby.
+ - If set to \`false\`, the spawner will attempt to spawn mobs only if there is a player in the radius.
+
`
+ },
+ "spawner-block-checks": {
+ default: false,
+ desc: "Whether to prevent spawn attempts if the spawn point is obstructed by blocks."
+ },
+ "water-prevent-spawn-check": {
+ default: false,
+ desc: "Whether to prevent spawn attempts if the spawn point has water."
+ },
+ "ignore-spawn-rules": {
+ default: false,
+ desc: `Whether to ignore additional spawn rules of mobs.
+
+ Many mobs have spawn restrictions to be only or prevent them from spawning on specific blocks. For example, most animals can only spawn on grass blocks, or the hoglin can not spawn on the nether wart block. You can find the list of additional spawn rules in [Additional Rules](https://minecraft.wiki/w/Mob_spawning#:~:text=additional%20rules).
+
+ This option does not affect and is separate from \`spawner-block-checks\` and \`water-prevent-spawn-check\` above.`
+ }
+ },
+ "min-spawn-delay": {
+ default: 200,
+ desc: `The minimum delay between each spawn attempt of the spawner. Higher values will slow down the spawning speed of spawners.
+ (Unit: tick)`
+ },
+ "max-spawn-delay": {
+ default: 800,
+ desc: `The maximum delay between each spawn attempt of the spawner. Higher values will slow down the spawning speed of spawners.
+ (Unit: tick)`
+ }
+ },
+ "use-spigot-item-merging-mechanism": {
+ default: false,
+ desc: `Whether to merge dropped items based on their tick sequence, which is the long-standing default behavior of Spigot.
+
+ In Spigot, the item entity that ticks later will merge into the earlier ticking one. If the merge radius is relatively larger, it can prevent dropped items from getting stuck at unexpected locations. So that this is useful for farms or redstone builds that can create numerous dropped items.
+ However, in vanilla, the item merging is based on the item count of the stack. The stack with the smaller count will merge with the one with the larger count.
+
+ | Values for goals | |
+ | SMP friendly | true |
+ | Vanilla behavior | false |
+
`
+ }
+ },
+
+ network: {
+ __desc__: "This section contains features related to server networking.",
+ "async-switch-state": {
+ default: false,
+ desc: `Whether to process the connection state switch logic of the player asynchronously.
+ This can resolve the main thread blocking issue caused by using exploits due to vanilla logic's design flaw.
+
+ __⚡Recommended value: \`true\`__ `
+ },
+ "chat-message-signature": {
+ default: true,
+ desc: `Whether to enable chat message signature, which was introduced in Minecraft 1.19.1.
+
+ - If set to \`true\`, messages are signed and able to report just like in vanilla.
+ - If set to \`false\`, the chat signature is disabled. Players are unable to report messages, and the insecure warning pop-up will be disabled when the player joins the server.
+
+
+ __⚡Recommended value: \`false\`__ (Only for offline-mode server or servers that have alternative moderation methods)`
+ },
+ OptimizeNonFlushPacketSending: {
+ default: false,
+ desc: `Whether to optimize the sending of non-flushed packets by using Netty's [\`lazyExecute\`](https://netty.io/4.2/api/io/netty/util/concurrent/SingleThreadEventExecutor.html#lazyExecute(java.lang.Runnable)) method. This can reduce thread contention and wakeup calls for certain types of network operations.
+
+
+
Warning
+ This option is known to be __INCOMPATIBLE__ with ProtocolLib and may cause issues with other plugins that extensively manipulate network packets.
+ Requires restarting the server to take effect. Use with extreme caution.
+
`
+ },
+ "protocol-support": {
+ __desc__: `This section contains features that provide extra protocol support for some QoL / Utility mods.
+
+ The extra protocol support is only functional if there is a corresponding client-side mod installed. It means if a specific protocol support is enabled, and a player installs that mod on the client, they can get the additional features described in each config below. But for players who have no corresponding mod installed, then everything is the same as before.
+
+
+
Attention
+ The protocol support may cause incompatibility with the [ViaVersion](https://modrinth.com/plugin/viaversion).
+ We recommend players use a client that has the same version as the server core and install the latest corresponding mod; otherwise, they may be unable to join the server.
+
`,
+ "jade-protocol": {
+ default: false,
+ desc: `Whether to enable [Jade](https://modrinth.com/mod/jade) protocol support.
+ If set to \`true\`, players who have the Jade mod installed can display item information inside the storage container, progress of the furnace, brewing stand, foods on the campfire, bee data in the beehive, and more vanilla-friendly features.`
+ },
+ "appleskin-protocol": {
+ default: false,
+ desc: `Whether to enable [AppleSkin](https://modrinth.com/mod/appleskin) protocol support.
+ If set to \`true\`, players who have the AppleSkin mod installed can display the accurate saturation/exhaustion values on the client.`
+ },
+ "appleskin-protocol-sync-tick-interval": {
+ default: 20,
+ desc: `How often the server should synchronize AppleSkin data to clients with AppleSkin installed.
+ This only has any effect if \`appleskin-protocol\` above is \`true\`.
+ (Unit: tick, default value 20 ticks = 1 second)`
+ },
+ "asteorbar-protocol": {
+ default: false,
+ desc: `Whether to enable [AsteorBar](https://modrinth.com/mod/asteorbar) protocol support.
+ If set to \`true\`, players who have the AsteorBar mod installed can display the accurate saturation/exhaustion values on the client.`
+ },
+ "chatimage-protocol": {
+ default: false,
+ desc: `Whether to enable [ChatImage](https://modrinth.com/mod/chatimage) protocol support.
+ If set to \`true\`, players who have the ChatImage mod installed can see the image sent by others using the CICode format.`
+ },
+ "xaero-map-protocol": {
+ default: false,
+ desc: `Whether to enable [XaeroMap](https://modrinth.com/mod/xaeros-minimap) protocol support.
+ If set to \`true\`, players who have Xaero's MiniMap mod or Xaero's WorldMap mod installed can store players' coordinate points and death points based on the server's \`protocol-support.xaero-map-server-id\` below.`
+ },
+ "xaero-map-server-id": {
+ default: 513317,
+ desc: `Unique number ID for XaeroMap to identify the server.
+ This can prevent points from being deleted/refreshed if the server name or IP address changes. Change this value if needed.
+ This value will be generated randomly on the first server start.`
+ },
+ "syncmatica-protocol": {
+ default: false,
+ desc: `Whether to enable [Syncmatica](https://modrinth.com/mod/syncmatica) protocol support.
+ If set to \`true\`, players who have Syncmatica mod installed can upload their [Litematica](https://modrinth.com/mod/litematica) schematic files or download shared schematics files from the server. Every player with the Syncmatica mod installed can access shared schematics uploaded by others.`
+ },
+ "syncmatica-quota": {
+ default: false,
+ desc: "Whether to enable the maximum file size limit for each shared schematics file of the Litematica mod."
+ },
+ "syncmatica-quota-limit": {
+ default: 40000000,
+ desc: `The maximum file size of each shared schematic file is uploaded to the server.
+ (Unit: byte, default value 40,000,000 bytes ≈ 38 MB)`
+ },
+ "do-a-barrel-roll-protocol": {
+ default: false,
+ desc: `Whether to enable [Do a Barrel Roll](https://modrinth.com/mod/do-a-barrel-roll) protocol support.
+ If set to \`true\`, the visual effects of Do a Barrel Roll can be synchronized to other players who have this mod installed.`
+ },
+ "do-a-barrel-roll-allow-thrusting": {
+ default: false,
+ desc: "Whether to allow players to enable \`enable_thrust\` option in their client configuration."
+ },
+ "do-a-barrel-roll-force-enabled": {
+ default: false,
+ desc: "Whether to force the mod to be enabled for all players who have this mod installed, regardless of their client configuration."
+ },
+ "do-a-barrel-roll-force-installed": {
+ default: false,
+ desc: "Whether to reject players who join if they don't have this mod installed in their clients."
+ },
+ "do-a-barrel-roll-installed-timeout": {
+ default: 0,
+ desc: `The amount of time to wait for a client to respond to the \`do_a_barrel_roll:config_sync\` packet.
+ (Unit: tick)
+ If set to \`true\`, players who have not installed this mod in their clients will be kicked after this timeout is reached.`
+ }
+ }
+ },
+
+ misc: {
+ __desc__: "This section contains some miscellaneous features.",
+ cache: {
+ "profile-lookup": {
+ enabled: {
+ default: false,
+ desc: `Whether to cache profile data lookups (skins, textures, etc.) to reduce API calls to Mojang.
+ This allows players to rejoin the server using cached data even if Mojang's authentication server is temporarily unavailable.`
+ },
+ timeout: {
+ default: 1440,
+ desc: `The timeout of the profile lookup cache.
+ Once a cached profile data expires after the timeout, the cache of it becomes invalid, and the server will re-fetch the profile from the Mojang server to ensure the profile data is updated.
+ (Unit: minute, default value 1440 minutes = 24 hours)`
+ },
+ "max-size": {
+ default: 8192,
+ desc: "The maximum number of profiles to cache."
+ }
+ }
+ },
+ "connection-message": {
+ __desc__: `The connection message broadcasts to all online players when they join or quit the server.
+ The message needs to use the [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/) format.
+ If set \`message\` below to \`default\`, the vanilla join/quit message will be used.
+ If set \`enabled\` below to \`false\`, the connection message will be disabled, and another plugin will be used to send the connection message.
+
+ Available placeholders:
+
+ - __\`\`__ - player name
+ - __\`\`__ - player display name
+
+
+
+
API / Plugin Friendly
+ This feature is API / plugin-friendly. It means that the connection message content can be overridden by plugins using \`PlayerJoinEvent\` or \`PlayerQuitEvent\`.
+
`,
+ join: {
+ enabled: {
+ default: true,
+ desc: "Whether to broadcast a message when the player joins."
+ },
+ message: {
+ default: "default",
+ desc: "The join message of the player."
+ }
+ },
+ quit: {
+ enabled: {
+ default: true,
+ desc: "Whether to broadcast a message when the player quits."
+ },
+ message: {
+ default: "default",
+ desc: "The quit message of the player."
+ }
+ }
+ },
+ "including-5s-in-get-tps": {
+ default: true,
+ desc: `Whether to include 5-second TPS in the result of API \`Bukkit#getTPS\` and \`Server#getTPS\`.
+ Commands like \`/tps\` display it regardless.
+
+ - If set to \`true\`, you can use the \`getTPS\` method to get a TPS long array with 4 elements \`[5s, 1m, 5m, 15m]\`.
+ - If set to \`false\`, you can use the \`getTPS\` method to get a TPS long array with 3 elements \`[1m, 5m, 15m]\`.
+
+
+
+ Want to Go Deeper?
+ If you are using the Leaf API for your plugins. Or running on Leaf and using reflection to get TPS, you can use \`Bukkit#getTPSIncluding5SecondAverage\`, to get the TPS array including 5-second TPS \`[5s, 1m, 5m, 15m]\`.
+ Also, you can use \`Bukkit#get5SecondTPSAverage\` to get the average value of 5-second TPS in \`double\`.
+ `
+ },
+ "lag-compensation": {
+ enabled: {
+ default: false,
+ desc: `The lag compensation is designed to mitigate the gameplay impact of server lag spikes or low TPS situations, which could ensure the basic game experience for players during the lag.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "enable-for-water": {
+ default: false,
+ desc: `Whether to enable lag compensation for water flowing.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "enable-for-lava": {
+ default: false,
+ desc: `Whether to enable lag compensation for lava flowing.
+
+ __⚡Recommended value: \`true\`__`
+ }
+ },
+ "remove-change-non-editable-sign-warning": {
+ default: false,
+ desc: `Whether the server prints a warning message when players try to edit the sign that they are not allowed to edit.
+ The warning message looks like: \`Player [...] just tried to change non-editable sign\`.
+ If set to \`true\`, it will prevent console spam caused by player actions or other cases.
+
+ __⚡Recommended value: \`true\`__`
+ },
+ "remove-spigot-check-bungee-config": {
+ default: false,
+ desc: `Whether the player can enter the backend server via proxy, without the backend server enabling BungeeCord mode in \`spigot.yml\`.
+
+
+
Warning
+ This option is not recommended to touch, unless you are sure what you are doing.
+ And it may be removed in the future.
+
`
+ },
+ "secure-seed": {
+ enabled: {
+ default: false,
+ desc: `Whether to use the secure seed.
+
+ The secure seed ensures that all ores and structures are generated with a 1024-bit seed using a high security cryptographic hash function instead of using a 64-bit seed like in vanilla. This protects the structure seeds with computational secrecy and makes the seed cracking nearly impossible.
+
+
+
Warning
+ The secure seed fundamentally changes the positions of ore and structure compared to vanilla.
+ It only applies to newly generated chunks. Thus, you must prepare a new world if you want to enable this option.
+ Once this option is enabled, you can not disable it to return to the vanilla generation, unless you pre-generate the entire world, or newly generated chunks will have terrain mismatch.
+
`
+ }
+ },
+ sentry: {
+ __desc__: `[Sentry](https://sentry.io/welcome/) is an application monitor service for improved error logging and tracing. Helping the server dev team to maintain better.
+
+ After enabling Sentry integration for your server, you don't need to audit long logs to find errors manually. Sentry can collect errors that happened in your server, enable you to track errors on Sentry's web panel, and help you to locate and fix them more easily and quickly.
+
+ See __[How to Setup Sentry](../how-to/setup-sentry)__ to know how to set up and get the DSN key for \`sentry.dsn\` below.
`,
+ dsn: {
+ default: "''",
+ desc: `The DSN key of your Sentry.
+ If an empty value \`''\` is given, the Sentry will be disabled.`
+ },
+ "log-level": {
+ default: "WARN",
+ desc: `Logs with a level higher than or equal to this level will be recorded.
+ The valid values for this option are: \`"WARN"\`, \`"ERROR"\`, and \`"FATAL"\`.`
+ },
+ "only-log-thrown": {
+ default: true,
+ desc: "Whether the Sentry only records the log with Java's \`Throwable\`."
+ }
+ },
+ rebrand: {
+ "server-mod-name": {
+ default: "Leaf",
+ desc: "The server brand name that will be shown on the client's F3 debug menu and server MOTD."
+ },
+ "server-gui-name": {
+ default: "Leaf Console",
+ desc: "The title displayed on the server GUI window, if you launched the server without adding the \`--nogui\` option in the startup flag."
+ }
+ },
+ message: {
+ "unknown-command": {
+ default: "default",
+ desc: `The unknown command message will be sent to the player if they execute an unknown command.
+ The message needs to use the [MiniMessage](https://docs.papermc.io/adventure/minimessage/format/) format.
+ If set to \`default\`, the vanilla unknown command message will be used.
+
+ Available placeholders:
+
+ - __\`\`__ - the detailed information of the unknown command.
+
+
+
+
API / Plugin Friendly
+ This feature is API / plugin-friendly. It means that this message can be overridden by plugins using \`UnknownCommandEvent#message\` or \`UnknownCommandEvent#setMessage\`.
+
`
+ }
+ },
+ "vanilla-username-check": {
+ "remove-all-check": {
+ default: false,
+ desc: `Whether to remove the vanilla username check, allowing all characters as usernames, including Chinese characters, etc.
+
+
+
Experimental
+ Removing all username checks is __UNSAFE AND DANGEROUS, USE AT YOUR OWN RISK!__
+
`
+ },
+ "enforce-skull-validation": {
+ default: true,
+ desc: "Whether to enforce skull validation, preventing skulls with invalid names from disconnecting the client."
+ },
+ "allow-old-players-join": {
+ default: false,
+ desc: `Whether to allow old players to join the server after the username regex is changed, even if their names don't meet the new requirements.
+
+
+
Experimental
+ Removing all username checks for old players is __UNSAFE AND DANGEROUS, USE AT YOUR OWN RISK!__
+
`
+ },
+ "use-username-regex": {
+ default: false,
+ desc: `Whether to use the username regex to validate usernames, allowing only characters specified in the regex.
+ This option is incompatible with the \`remove-all-check\` above. You can only use one of these two options.`
+ },
+ "username-regex": {
+ default: "^[a-zA-Z0-9_.]*$",
+ desc: `The username regex specifies the characters allowed in usernames.
+ This only has any effect if \`use-username-regex\` above is \`true\`.`
+ }
+ }
+ }
+};
+
+export default config;
diff --git a/pages/docs/config/guides/dab-blacklist-format.md b/pages/docs/config/guides/dab-blacklist-format.md
new file mode 100644
index 0000000..4635961
--- /dev/null
+++ b/pages/docs/config/guides/dab-blacklist-format.md
@@ -0,0 +1,36 @@
+# Want to Go Deeper?
+
+For the format of `dab.blacklisted-entities`, it accepts all valid format of a YAML list.
+
+If you only need to add one entity into blacklist, these formats below are allowed to use:
+
+```yaml
+dab:
+ blacklisted-entities: [villager]
+```
+
+or
+
+```yaml
+dab:
+ blacklisted-entities:
+ - villager
+```
+
+And if you need to add multiple entities into blacklist, these formats below are allowed to use:
+
+```yaml
+dab:
+ blacklisted-entities: [villager, zombified_piglin]
+```
+
+or
+
+```yaml
+dab:
+ blacklisted-entities:
+ - villager
+ - zombified_piglin
+```
+
+If you are not sure, use [YAML Checker](https://yamlchecker.org/), or any online YAML syntax validator to check your config.
diff --git a/pages/docs/config/leaf-global.md b/pages/docs/config/leaf-global.md
index d686756..f1711d4 100644
--- a/pages/docs/config/leaf-global.md
+++ b/pages/docs/config/leaf-global.md
@@ -1,8 +1,10 @@