Upgrade einer Minecraft-Welt erzwingen

Meine mittlerweile über fünfzehnjährige Minecraft-Welt Akaria, belegt speichertechnisch bereits etliche Gigabyte auf der Festplatte. Allerdings ist dies bei solchen gewachsenen Welten nicht unbedingt das Problem. Bedingt durch viele Upgrades der Minecraft-Server-Versionen und damit einhergehenden Änderungen, wie z.B. am Chunk-Format, befindet sich irgendwann ein buntes Sammelsurium an Daten in den Weltordnern. An sich ist dies kein Problem, da Chunks beim Laden im Spiel automatisch konvertiert werden.

Ein Teil der Minecraft-Welt Akaria

Allerdings kann dies bei vielen Chunks mit Performanceeinbußen verbunden sein und die Chunks könnten teilweise noch Daten enthalten, die nur aufgrund vorheriger Versionen in diesen schlummern, aber in dieser Form nicht mehr benötigt werden. In einem solchen Fall bietet es sich an ein Upgrade aller Chunks und Regionen zu erzwingen:

screen java -Xms16G -Xmx16G -jar server.jar --forceUpgrade --recreateRegionFiles --eraseCache

Durch den Screen-Befehl kann die Session im Hintergrund weiterlaufen, nachdem sie detached wurde (Strg + A, anschließend Strg + D; Wiederaufruf mittels screen -r).

Damit beginnt der Minecraft-Server die Entities, POIs und Chunks zu upgraden. Während dieses Vorgangs, der je nach Welt, etliche Stunden dauern kann, ist der Minecraft-Server nicht erreichbar. In der Log-Datei latest.log kann der Fortschritt verfolgt werden:

[20:21:17] [Server thread/INFO]: 3% completed (10558 / 343881 chunks)...
[20:21:18] [Server thread/INFO]: 3% completed (10613 / 343881 chunks)...
[20:21:19] [Server thread/INFO]: 3% completed (10661 / 343881 chunks)...
[20:21:20] [Server thread/INFO]: 3% completed (10736 / 343881 chunks)...
[20:21:21] [Server thread/INFO]: 3% completed (10818 / 343881 chunks)...
[20:21:22] [Server thread/INFO]: 3% completed (10869 / 343881 chunks)...
[20:21:23] [Server thread/INFO]: 3% completed (10906 / 343881 chunks)...

Während die Option forceUpgrade dafür sorgt, dass der Upgradeprozess überhaupt angestartet wird, sorgt recreateRegionFiles dafür das neue und saubere Region-Dateien erzeugt werden, anstatt die alten Dateien nur zu bearbeiten. Die Option eraseCache löscht cacheähnliche Daten aus den NBT-Daten, darunter unter anderem Heightmaps, BlockLight und SkyLight. Diese Daten werden beim Neuladen der Chunks im Server ebenfalls wieder neu erzeugt.

Ist der Vorgang am Ende abgeschlossen, kann der temporär gestartete Server beendet werden und der Minecraft-Server wieder im Produktivbetrieb gestartet werden. Durch das Upgrade, das Löschen der Caches und der Neuanlage der Regionen, sollten viele Altlasten und potenzielle Probleme aus den Daten entfernt werden. Dies schlägt sich im Endeffekt auch positiv auf die Performance des Spieles im Serverbetrieb nieder.

Konvertierung der Map von Minecraft 1.12 auf 1.13 durchführen

Vor einigen Wochen erschien Version 1.13 des Open-Word-Spieles Minecraft. Im Zuge dieser Aktualisierung wurden unter anderem die Daten der Blöcke verändert. Beim Erzeugen der Weltkarte über die freie Minecraft-Rendersoftware Mapcrafter traten nach dem Update Probleme auf.

Nur die bereits konvertierten Chunks werden gerendert

Während der Server ohne Probleme lief, wurden in der Karte nur bestimmte Chunks gerendert. Der Grund hierfür war das nur die Chunks in das neue Format der Version 1.13 konvertiert wurden, die von den Spielern auf dem Server besucht worden waren. Alle anderen Chunks lagen noch im Format der Version 1.12 vor. Eine Lösung für dieses Problem schafft der mit 1.13 neu eingeführte Kommandozeilen-Parameter –forceUpgrade des Minecraft-Servers. Wenn man diesen entsprechend startet:

java -Xmx4096M -Xms2048M -jar minecraft_server.jar nogui --forceUpgrade

beginnt der Server alle Chunks in das neue Format zu überführen:

[06:42:34] [Server thread/INFO]: Starting minecraft server version 1.13.1
...
[06:42:34] [Server thread/INFO]: Forcing world upgrade!
[06:42:34] [Server thread/INFO]: Counting chunks...
[06:42:48] [Server thread/INFO]: Upgrading structure data...
[06:42:48] [Server thread/INFO]: 0% completed (0 / 1630135 chunks)...
[06:42:49] [Server thread/INFO]: 0% completed (0 / 1630135 chunks)...
..
[08:52:58] [Server thread/INFO]: 99% completed (1629866 / 1630135 chunks)...
[08:52:59] [Server thread/INFO]: 99% completed (1630017 / 1630135 chunks)...
[08:53:00] [pool-4-thread-1/INFO]: World optimizaton finished after 7812721 ms

Je nach der Größe der eigenen Welt kann dieser Vorgang durchaus einige Stunden in Anspruch nehmen. Nachdem alle Chunks konvertiert wurden, funktioniert das Rendering der Weltkarte wieder wie gewohnt.

Bereiche in Minecraft über größere Distanzen klonen

In Minecraft gibt es eine Reihe von Kommandobefehlen, wie z.B. das clone-Kommando. Mit diesem Kommando ist es möglich einen bestimmten Bereich von A nach B zu kopieren. Allerdings gibt es hier einige Beschränkungen. Würde man den folgenden Befehl eingeben:

/clone 87 76 -74 87 76 -74 9000 100 9000

so würde man einen Block in eine sehr entfernte Region kopieren. Der Server antwortet darauf mit einem:

Cannot access blocks outside of the world

Der Hintergrund dieser Fehlermeldung ist, das der betroffende Bereiche nicht geladen wurde. Um den Spieler herum werden einige Chunks vom Festspeicher in den Arbeitsspeicher des Servers geladen. Diese Bereiche können mit dem clone-Kommando bearbeitet werden. Mit einem Trick kann man auch in entfernte Bereiche klonen. Dazu benötigt man einen zweiten Spieler, welcher sich an den Zielkoordinaten aufhält. Dadurch sind die Chunks des Zielbereiches ebenfalls im Arbeitsspeicher des Servers vorhanden, so das die clone-Operation erfolgreich ausgeführt werden. So bequem wie mit dem WorldEdit-Plugin ist das zwar nicht, aber dafür funktioniert es mit dem Vanilla-Server von Minecraft.