Zum Hauptinhalt springen

Was sind modulare Dungeons?

Modulare Dungeons sind ein Dungeon-System, das in BetterStructures 2.0.0 und später eingeführt wurde. Anstatt als ein festes Schematic zu spawnen, werden modulare Dungeons dynamisch aus kleineren, handgefertigten Modulen zusammengesetzt. Module können mehrstöckige Dungeons bilden, deren Aufbau bei jeder Generierung anders ausfällt.


Wie werden modulare Dungeons generiert​

  • Module Jedes Modul hat eine konfigurierbare Größe, häufig 16x16x16 Blöcke. Einige Inhaltspakete verwenden 32x16x32 oder andere Abmessungen. Standardisierte Verbindungspunkte mit Randkennzeichnungen sorgen dafür, dass Module ohne Lücken oder Überlappungen zusammenpassen. Die Abmessungen eines Dungeons werden mit moduleSizeXZ und moduleSizeY in der Modulgenerator-Konfiguration festgelegt. Module können Korridore, Räume, Treppen oder spezielle Begegnungsräume enthalten.

  • Generierungsprozess Wenn ein modularer Dungeon in einem neuen Chunk generiert wird, verwendet BetterStructures einen Wave Function Collapse (WFC) Algorithmus, um Module aus dem verfügbaren Pool prozedural zusammenzusetzen. Das System wählt zufällig kompatible Module basierend auf Border-Tag-Abgleich aus und "näht" sie zu einem vollständigen Dungeon zusammen. Die Dauer hängt von Radius, Höhenbereich, Modulpool, Einschränkungen und Serverleistung ab. Die Layoutberechnung läuft asynchron; das Einfügen aus der Warteschlange teilt sich das konfigurierte Zeitbudget pro Server-Tick. Große oder inkompatible Layouts können trotzdem aufwendig sein oder beim Zusammenstellen scheitern.

  • Dungeon-Größe Dungeons können so konfiguriert werden, dass sie in verschiedenen Größen mittels des Radius-Parameters generiert werden. Größere Radiuswerte erzeugen deutlich größere Dungeons, die sich über Hunderte von Blöcken erstrecken können. Die meisten Dungeons umfassen mehrere Stockwerke, verbunden durch Treppenmodule oder vertikale Schächte. Vertikale Verbindungen zwischen Stockwerken werden über die up-/down-Einträge der Border-Tag-Map borders eines Moduls erreicht: Die Oberseite eines Moduls verbindet sich mit einem darüberliegenden Nachbarn, wenn ihre gegenüberliegenden Border-Tags übereinstimmen.


Vielfalt und Paketintegration​

Der Inhaltskatalog enthält Dungeoneering Modules Free und Dungeoneering Modules Premium. Der mitgelieferte Dungeoneering-Generator führt Start-Schematics aus beiden Paketen auf. Der Katalog enthält außerdem Tommyknockers Modules Free und Tommyknockers Modules Premium, eine modulare Mine, die von EliteMobs-Bossen bewacht wird; Premium setzt das Free-Paket voraus. Installiere die vom Paket angegebenen Module und Abhängigkeiten einschließlich benötigter FreeMinecraftModels-Inhalte. Zusätzliche kompatible Module erweitern die möglichen Layouts; ein Schematic allein installiert keine zugehörigen Modell- oder Mob-Inhalte.


Markierungen für Entities und Behälter​

Die Modulgenerierung liest den Text auf der Vorderseite von Schildern und verwirft leere Zeilen. Schreibe den kleingeschriebenen Marker in die erste Zeile und seine Argumente direkt darunter. Die Erkennung unterscheidet Groß- und Kleinschreibung, außer bei [elitemobs]. Beim modularen Einfügen werden alle Schildblöcke entfernt, auch Dekoschilder und nicht unterstützte Marker.

Schild-TagWeitere ZeilenVerhalten
[spawn]Bukkit-Entity-Typ in Zeile 2Spawnt eine dauerhafte Vanilla-Entity, zentriert auf dem Block des Schilds. Eigene modulare Welten erfassen diese Position außerdem als Spawn-Markierung für Integrationen.
[chest]KeinePlatziert eine Truhe und befüllt sie mit treasureFile des Modulgenerators.
[trapped_chest]KeinePlatziert eine Redstone-Truhe und befüllt sie mit treasureFile des Modulgenerators.
[pool: poolname]KeineWählt einen Boss aus einem EliteMobs-Spawn-Pool und spawnt ihn zentriert auf dem Block des Schilds. Im bestehenden Gelände ist der Boss ein einmaliger regionaler EliteMobs-Boss. Wie reguläre und instanzierte Bosse in einer eigenen modularen Welt behandelt werden, steht im Abschnitt zu Spawn-Pools.
[elitemobs]EliteMobs-Boss-Dateiname in den folgenden Zeilen, ohne Trennzeichen zusammengefügtNur in Modulen, die in bestehendes Gelände eingefügt werden (isWorldGeneration: false): spawnt einen einmaligen regionalen EliteMobs-Boss, zentriert auf dem Block des Schilds. Eigene modulare Welten ignorieren ihn.
[barrel]KeineErfasst in einer eigenen modularen Welt eine Fassposition, die eine Integration mit spawnBarrels() materialisieren kann. Das Schild selbst platziert oder befüllt kein Fass.
[exit]Namen der oberen und unteren Komponente in Zeile 2 und 3, ohne .schemErfasst Ausgänge in einer eigenen modularen Welt. Eine Integration muss die Komponenten aus components/ platzieren. Fehlt eine Argumentzeile, werden beide Namen durch genericelevator_up und genericelevator_down ersetzt.

Die Marker [barrel] und [exit] werden nur bei isWorldGeneration: true verarbeitet. Verwende isWorldGeneration: false für Dungeons im bestehenden Gelände; dort funktionieren [spawn], [chest], [trapped_chest], [pool: poolname] und [elitemobs]. Boss-Schilder im bestehenden Gelände benötigen ein aktiviertes EliteMobs; ohne es protokolliert BetterStructures eine Warnung pro Dungeon und spawnt keine Bosse. Module erstellen keinen WorldGuard-Arenaschutz. Für gewöhnliche Loot-Fässer platzierst du echte Fassblöcke im Modul und konfigurierst ihre Beute wie unten beschrieben.

Spawn-Pools​

[pool: poolname]-Schilder lesen aus Spawn-Pool-Konfigurationsdateien im Ordner spawn_pools/. Jede Spawn-Pool-Datei ist eine kleine YAML-Konfiguration mit diesen Feldern:

FeldStandardBeschreibung
isEnabled—Wird nicht gelesen. Spawn-Pools haben keinen Aktivierungsschalter.
poolStrings[]Liste der EliteMobs-Boss-Dateinamen, die für diesen Pool infrage kommen
minLevel-1Wird gespeichert, aber nicht gelesen.
maxLevel-1Level, das instanzierte Bosse aus diesem Pool erhalten. Gib ausdrücklich ein gültiges Level an.

Der Handler benötigt EliteMobs und wählt zufällig einen Boss-Dateinamen aus poolStrings. Er hängt den spawnPoolSuffix des Generators vor .yml an: Mit _hard wird poolname_hard.yml gewählt. Ein Generator ohne spawnPoolSuffix sucht nach poolname.yml. Vermeide Leerzeichen am Ende des Poolnamens. Eine fehlende Pool-Datei, eine leere poolStrings-Liste oder ein Boss-Dateiname, den EliteMobs nicht kennt, protokolliert eine Warnung und spawnt für dieses Schild nichts.

In einer eigenen modularen Welt spawnen nicht instanzierte Bosse während des Einfügens. Instanzierte Bosse bleiben in der Warteschlange, bis eine Integration spawnInstancedEntities() aufruft. Jeder spawnt mit dem maxLevel des Pools und einer EliteMobs-Instanz-Schwierigkeits-ID, die davon abhängt, wie weit er vom Startpunkt des Dungeons entfernt ist. Als Entfernung zählt der größere der X- und Z-Versätze, gemessen an der Breite des Dungeons, (2 × radius − 1) × moduleSizeXZ: Unter einem Sechstel dieser Breite ergibt sich 2, unter einem Drittel 1, und alles weiter draußen ergibt 0. useGradientLevels hat darauf keinen Einfluss.


Modell- und Mob-Integrationen​

Der modulare und der gewöhnliche Struktur-Einfügevorgang verwenden unterschiedliche Schild-Handler. Das modulare Einfügen verarbeitet [elitemobs]-Schilder nur im bestehenden Gelände, wie oben aufgeführt. Die unter Strukturen erstellen beschriebenen Strukturschilder [mythicmobs] und [custom] werden beim modularen Einfügen nicht verarbeitet. Verwende die oben unterstützten Modulmarkierungen und beachte die Abhängigkeiten deines Inhaltspakets.

Ein Schematic allein stellt keine beliebigen Modell-Entities anderer Plugins wieder her. Installiere die Modellinhalte und Begleit-Plugins, die dein gewähltes Paket benötigt. Verlasse dich nicht darauf, dass ein fehlender Boss automatisch als dekoratives Modell erscheint.


Moduldimensionen​

Wichtig: Die Modulgröße ist konfigurierbar, nicht fest.

Jeder Modulgenerator definiert seine Standard-Modulgröße mit:

  • moduleSizeXZ: Breite und Tiefe in Blöcken, ausdrücklich passend zum Schematic setzen
  • moduleSizeY: Höhe in Blöcken, ausdrücklich passend zum Schematic setzen

Häufige Größe: 16×16×16 Blöcke, ausdrücklich konfigurieren Häufige Alternative: 32×16×32 Blöcke (in einigen Inhaltspaketen verwendet)

Für Modulersteller:

  1. Prüfe deine Generator-Konfiguration auf moduleSizeXZ- und moduleSizeY-Werte
  2. Baue ALLE Module für diesen Generator genau in diesen Dimensionen
  3. Prüfe die tatsächlichen Schematic-Abmessungen und Verbindungspunkte; der Generator validiert ihre Geometrie nicht für dich

Benutzerdefinierte Dimensionen festlegen: In deiner Modulgenerator-Konfigurationsdatei:

moduleSizeXZ: 32  # Width and depth
moduleSizeY: 16 # Height

Hinweis: Alle Module in einem Generator müssen dieselben Dimensionen verwenden. Du kannst keine 16×16×16 und 32×16×32 Module im selben Dungeon-System mischen.


Modulgenerator-Konfigurationsfelder​

Neben moduleSizeXZ und moduleSizeY unterstützt die Modulgenerator-Konfiguration die folgenden Felder:

FeldStandardBeschreibung
isEnabledtrueErlaubt die natürliche Auswahl. Der manuelle Befehl prüft diesen Schalter nicht.
radiusAusdrücklich angebenRadius in Modul-Rasterzellen, deren horizontale Größe moduleSizeXZ ist. Die äußeren Randzellen werden vom Gitter reserviert.
edgesfalseWird gespeichert, aber vom aktuellen Generator nicht gelesen. Randplatzierung verwendet world_border-Tags.
startModule—Liste der .schem-Startdateien. Eine wird zufällig mit Rotation 0 an Rasterposition (0, 0, 0) gewählt.
minChunkY0Inklusiver minimaler vertikaler Modulrasterindex, keine Y-Blockkoordinate der Welt.
maxChunkY0Inklusiver maximaler vertikaler Modulrasterindex. Schließe Rasterebene 0 in diesen Bereich ein.
moduleSizeXZAusdrücklich angebenBreite und Tiefe der Module in Blöcken
moduleSizeYAusdrücklich angebenHöhe der Module in Blöcken
debugfalseZeichnet Diagnoseblöcke und Text in die Zielwelt. Nur in einem entbehrlichen Generierungsbereich verwenden.
useGradientLevelsfalseWird gespeichert, aber von der aktuellen Spawn-Pool-Berechnung nicht gelesen.
spawnPoolSuffix—Suffix für Spawn-Pool-Namen. Lass den Schlüssel weg oder setze "", wenn du keinen möchtest.
isWorldGenerationfalsetrue erstellt eine eigene Void-Welt; false fügt in die bestehende Welt ein.
treasureFile—Schatzkonfigurationsdatei für Truhen in diesem Dungeon
generateLootInBarrelstrueOb Fässer in Modulen mit Beute befüllt werden sollen
barrelTreasureFilenametreasure_barrel_food.ymlSchatzkonfigurationsdatei zum Befüllen von Fässern in diesem Dungeon
validWorldsleer (alle Welten)Liste gültiger Weltnamen, in denen der Dungeon generiert werden kann
validWorldEnvironmentsleer (alle Umgebungen)Liste gültiger Weltumgebungen (NORMAL, NETHER, THE_END, CUSTOM). Der mitgelieferte Dungeoneering-Generator liefert ausdrücklich [NORMAL, CUSTOM] mit, ab Werk generieren Dungeons also nur in Welten vom Oberwelt-Typ. Siehe den Hinweis unten dazu, was passiert, wenn der Schlüssel fehlt.
centerModuleAltitude0Y-Startkoordinate der natürlichen Generierung in bestehendem Gelände. Rasterebene 0 ist um die Hälfte von moduleSizeY nach oben versetzt. Manuelle Platzierung in einer bestehenden Welt beginnt an der Spielerposition; in einer eigenen Welt beginnt sie bei (0, 0, 0).

Bei fehlenden Schlüsseln wird der aktuelle Feldwert aus der Generatordefinition verwendet. Vorgefertigte Generatoren initialisieren diese Werte passend zu ihren Inhalten. Ein von Hand geschriebener Generator beginnt für radius, moduleSizeXZ und moduleSizeY mit 0. Diese Nullen können auch in die Datei geschrieben werden. Gehe nicht davon aus, dass eine fehlende Größe zu 16 wird. Fehlende validWorlds und validWorldEnvironments schränken nichts ein. Durch Weglassen wird ein Generator daher nicht auf NORMAL/CUSTOM begrenzt. Beginne mit einem vollständigen funktionierenden Generator und setze Radius, Abmessungen, Startmodule und Welteinschränkungen ausdrücklich.


Konfigurationsfelder einzelner Module​

Jedes einzelne Modul kann die folgenden Konfigurationsfelder definieren:

FeldStandardBeschreibung
isEnabledtrueOb dieses Modul aktiviert ist
weight100Auswahlgewicht für dieses Modul während der Generierung. Ein negativer oder nicht endlicher Wert protokolliert eine Warnung und wird zu 0, wodurch das Modul aus der Auswahl fällt.
repetitionPenalty0Wird für jedes bereits gewählte Nachbarmodul mit demselben Schematic-Dateinamen zum Auswahlgewicht addiert. Positive Werte fördern Wiederholung, negative verringern sie. Halte das resultierende Gewicht positiv.
noRepeatfalseSchließt diesen Kandidaten neben einem gewählten Modul mit derselben Konfigurationsidentität aus, einschließlich Klonen. Beschränkt ihn nicht auf ein Vorkommen pro Dungeon.
enforceVerticalRotationfalseVerlangt gleiche Y-Achsen-Rotationen bei übereinanderliegenden Modulen, sobald eines der beiden den Schalter aktiviert.
enforceHorizontalRotationfalseVerlangt gleiche Y-Achsen-Rotationen bei horizontalen Nachbarn, sobald einer den Schalter aktiviert.
minY-4Inklusive minimale Modulrasterebene für die Kandidatenauswahl.
maxY20Inklusive maximale Modulrasterebene für die Kandidatenauswahl.
biomedefaultWird gespeichert, schränkt die Modulauswahl aber nicht ein.
minecraftBiomenullWird gespeichert, schränkt die Modulauswahl aber nicht ein.
treasureFile—Wird als Modulkonfiguration geladen. Markierungstruhen verwenden beim aktuellen modularen Einfügen jedoch treasureFile des Modulgenerators.
generateLootInBarrelstrueOb Fässer in diesem Modul mit Beute befüllt werden sollen
barrelTreasureFilenametreasure_barrel_food.ymlSchatzkonfigurationsdatei zum Befüllen von Fässern in diesem Modul
borders—Border-Tag-Map, die die Verbindungskompatibilität definiert
cloneConfig—Klont Einstellungen aus einer anderen Modul-Konfigurationsdatei
compoundModule—Wird gespeichert, aber vom aktuellen Generator nicht zum Aufbau zusammengesetzter Module verwendet.
isAutomaticallyPlacedtrueErlaubt die gewöhnliche Kandidatenauswahl. Ein konfiguriertes Startmodul umgeht diesen Filter.

Definiere alle sechs borders-Einträge: north, south, east, west, up und down, jeweils mit einer Tag-Liste. Gewöhnliche Tags müssen einschließlich Groß- und Kleinschreibung genau übereinstimmen. Beispielsweise passt corridor zu corridor; no-mirror_corridor passt zu corridor, aber nicht zu einem weiteren no-mirror_corridor. Jedes Modul erhält vier Y-Achsen-Rotationen: 0, 90, 180 und 270 Grad.

nothing erlaubt einen leeren Nachbarn. world_border kennzeichnet Module für den äußersten belegbaren horizontalen Ring; jede nach außen gerichtete Seite darf nur world_border-Tags enthalten. Verwende nothing für geschlossene obere und untere Grenzen. Radius 5 erlaubt bis zu 9 × 9 horizontale Modulzellen mit einer leeren Grenze darum. Diese Regeln filtern gewöhnliche Kandidaten; das Startmodul wird direkt gesetzt, seine Konfiguration und Geometrie müssen daher zum Ursprung passen.

Hinweis zu cloneConfig: Verweise auf den .yml-Dateinamen eines anderen Moduls, um jede geklonte Einstellung aus dieser Datei statt aus der eigenen zu lesen. Wird das Klonziel gefunden, löscht BetterStructures die nun überflüssigen Schlüssel aus der lokalen Moduldatei: treasureFile, barrelTreasureFilename, generateLootInBarrels, borders, minY, maxY, weight, repetitionPenalty, die beiden Rotationsschalter, noRepeat, die sechs *IsPassable-Schlüssel und isAutomaticallyPlaced. isEnabled, biome, minecraftBiome, cloneConfig und compoundModule bleiben in der Datei. Die Suche nach zusammengesetzten Modulen folgt zur Laufzeit ebenfalls dem Klonziel. Existiert die benannte Datei nicht, wird die Kloneinstellung mit einer Warnung ignoriert und das Modul behält seine eigenen Werte.

In generierten Modul-Konfigurationen wirst du außerdem northIsPassable, southIsPassable, eastIsPassable, westIsPassable, upIsPassable und downIsPassable finden. Sie stehen standardmäßig auf true und nichts im Generator liest sie aus – sie zu ändern hat keine Wirkung. Verwende stattdessen borders.

Erzeuge keinen cloneConfig-Zyklus. Ein Zyklus wie a.yml -> b.yml -> a.yml stoppt das Laden der Module mit einem Fehler "Cyclic module clone configuration", der die Kette nennt.


Einen Dungeon manuell mit /bs generateModules erzeugen​

/bs generateModules <ModuleGeneratorsConfigFile.yml> führt einen Modulgenerator auf Abruf aus, statt darauf zu warten, dass während der Weltgenerierung einer auftaucht. Die Tab-Vervollständigung listet jede geladene Modulgeneratordatei auf.

Was passiert, hängt von der Einstellung isWorldGeneration des Generators ab:

  • isWorldGeneration: true – BetterStructures erstellt eine neue Welt für den Dungeon. Ihr Name besteht aus dem Generator-Dateinamen und _0, _1, _2…; gewählt wird der erste Suffix, dessen Ordner noch nicht existiert. Die Void-Welt verwendet NORMAL, hält Spawn-Chunks nicht im Speicher und hat Autosave deaktiviert. Der Befehl versetzt den Spieler in den Zuschauermodus, teleportiert ihn aber nicht in die neue Welt.
  • isWorldGeneration: false – die Generierung findet in der Welt statt, in der du gerade stehst.

Eine Bossleiste zeigt den Aufbau des Layouts und verschwindet, sobald das Einfügen eingereiht wird. Die Abschlussmeldung für den Aufbau bedeutet nicht, dass Blöcke oder Entities fertig eingefügt sind. Ist kein konfiguriertes Start-Schematic installiert, stoppt die Generierung; auch ein deaktiviertes Startmodul kann zum Abbruch führen, weil sein Container fehlt.

Der Befehl benötigt einen Spieler mit betterstructures.generatemodules und wird während eines Inhaltsneuladens abgelehnt. Manuelle Generierung umgeht die Prüfungen der natürlichen Platzierung, darunter Generatoraktivierung, Welteinschränkungen und Schutz der Grundfläche. Wähle das Ziel bewusst.

Wo Moduldateien liegen​

Module gehören nach plugins/BetterStructures/modules, das rekursiv durchsucht wird – ein Inhaltspaket kann seine .schem-Dateien in Unterordnern halten, und die passenden .yml-Konfigurationen werden daneben erzeugt.

Schematic-Dateinamen müssen im gesamten modules-Baum eindeutig sein. Doppelte Namen oder ein unlesbares Schematic brechen das Laden der Module ab. Schematics werden vor isEnabled gelesen; ein deaktiviertes Modul umgeht daher keine beschädigte Datei. Der Ordner eines Inhaltspakets mit isEnabled: false wird vollständig übersprungen, seine Module werden also weder gelesen noch geladen.

Natürliche Dungeon-Platzierung und Schutz​

Natürliche Generierung prüft die gesamte konfigurierte Grundfläche. Sie überspringt die Platzierung bei Überschneidung mit dem eingestellten Schutzradius um die Weltkoordinaten (0, 0), einer benannten WorldGuard-Region oder generierten Chunks, die nicht kürzlich als neu beobachtet wurden. Direkt vor dem Einreihen des Einfügevorgangs wird WorldGuard erneut geprüft; wurde ein zunächst ungenerierter Chunk inzwischen generiert, wird der Vorgang abgebrochen. Dies prüft den Chunk-Zustand, nicht Spielerbauten oder andere Schutzplugins. Ein neuer Chunk neben einer alten Basis macht nicht die ganze Grundfläche zulässig.

Belasse natürlich ausgewählte Generatoren bei isWorldGeneration: false. Die natürliche Auswahl schließt Generatoren mit true nicht aus; diese Einstellung erstellt weiterhin eine eigene Welt, statt in das geprüfte Gelände einzufügen.

Blöcke, Block-Entities, Beute, Entities und Marker teilen sich das Zeitbudget zum Einfügen. WorldGenerationFinishEvent wird nach erfolgreichem Einfügen in eine eigene Welt und der unmittelbaren Nachverarbeitung ausgelöst. Das bedeutet nicht, dass eine Integration Ausgänge platziert oder wartende instanzierte Bosse gespawnt hat. Große Bauten können nach der Layoutberechnung noch mehrere Ticks benötigen.

Vorrang der Modul-Beuteeinstellungen​

Markierungstruhen und Redstone-Truhen verwenden treasureFile des Modulgenerators. Bei echten Fassblöcken müssen sowohl der Generator als auch das Modul generateLootInBarrels erlauben. Ein nicht leeres barrelTreasureFilename des Moduls hat Vorrang vor dem Generatorwert. Generierte Moduldateien verwenden standardmäßig treasure_barrel_food.yml. Sowohl Truhen- als auch Fassfüllungen lösen das abbrechbare ChestFillEvent aus, bevor ihre Inventar-Snapshots angewendet werden.

Verwende Truhenmarker für generierte Truhenbeute. Die Inventare gewöhnlicher Truhen, Redstone-Truhen und Fässer aus dem Schematic bleiben beim aktuellen modularen Einfügen nicht erhalten. Barriereblöcke werden übersprungen; Bedrock-Marker werden nur an nicht festen Zielblöcken zu Stein. Luft höhlt Innenräume in bestehenden Welten aus und wird in eigenen Void-Welten übersprungen.

In einem Modul gespeicherte Entities wie Rüstungsständer, Gemälde und Rahmen werden mit eingefügt. Gemälde und Rahmen drehen sich mit der Rotation des Moduls, damit sie an ihrer Wand befestigt bleiben.