Zum Hauptinhalt springen

Generierte Dungeons

Ein generierter Dungeon hat keine Vorlagenwelt. Du baust kleine Räume einmal, beschreibst, wie sie verbunden sind, und ein Generator setzt für jeden Durchlauf ein neues Layout zusammen: von einem Startraum über normale, Schatz- und Geheimräume bis zu einem Bossraum.

Feste und generierte Dungeons teilen sich dieselben Durchläufe, Menüs, Truhen, NPCs, Mobs, Events und Facts. Was sich ändert, ist, woher die Räume kommen.

Die Bausteine​

BausteinEntryWas es ist
TürartDungeon Connector TypeDie Größe einer Türöffnung, der Block, der eine ungenutzte Tür verschließt, und welche Arten verbunden werden können.
RaumDungeon Room TemplateEine gespeicherte Struktur (eine Paper-Struktur .nbt, als Artifact gehalten) mit ihrer Kategorie, ihren Türen und Markern.
PoolDungeon Room PoolEine gewichtete Liste von Raumvorlagen.
GeneratorDungeon GeneratorDie Regeln: welche Pools, wie viele Räume, wie tief der Boss liegt, wie oft sich ein Pfad verzweigt.
AffixDungeon AffixEin zufällig gezogener Modifier des Durchlaufs, etwa „schnelle Mobs“.
DungeonDungeon InstanceSein Feld generator macht ihn zu einem generierten Dungeon.

Einen bauen, Schritt für Schritt​

  1. Türarten. Füge mindestens einen Dungeon Connector Type hinzu. Setze seine width und height (standardmäßig 3 mal 3), den sealBlock, der eine ungenutzte Tür verschließt (standardmäßig minecraft:stone_bricks) und, wenn du mehrere Arten hast, compatibleWith. Eine Art kann immer mit sich selbst verbunden werden.
  2. Räume. Füge für jeden Raum ein Dungeon Room Template hinzu und verwende den Editor im Spiel, um seine Blöcke zu erfassen und seine Türen und Marker zu setzen. Wähle seine category.
  3. Pools. Füge einen Dungeon Room Pool für die Starträume hinzu, einen für die Bossräume, einen (oder mehrere) für die übrigen Räume und optional einen für Korridore. Ein Start-, Boss- oder Korridor-Pool enthält nur Vorlagen dieser Kategorie. Ein normaler Pool darf NORMAL-, TREASURE- und SECRET-Vorlagen mischen.
  4. Generator. Füge einen Dungeon Generator hinzu und setze startPool, bossPool, optional corridorPool und normalPools mit je einem Gewicht.
  5. Dungeon. Setze in deiner Dungeon Instance generator. Lass templateWorld leer: Ein generierter Dungeon hat keine Vorlagenwelt. Die Isolation muss AUTO oder WORLD_PER_RUN sein.
  6. Spiellogik. Verwende die Trigger onEnter und onClear der Raumvorlagen, die TRIGGER-Marker, die Raum-Events, Dungeon Mob Spawn-Entries an MOB-Markern und beende den Durchlauf mit Dungeon Complete.

Können die Pools und Vorlagen keinen Dungeon ergeben, wird der Start abgelehnt, und das Serverlog nennt den Grund (zum Beispiel ein Pool ohne Startraum oder eine Vorlage ohne lesbare Erfassung). Das Feld messages des Generators enthält die Gründe, die dir, dem Autor, gemeldet werden. Der Spieler sieht nur einen kurzen Text aus den Snippets content.dungeon_generated.refusal.setup (die Pools und Vorlagen können keinen Dungeon ergeben) und content.dungeon_generated.refusal.paste (die Räume konnten nicht eingefügt werden), die du im Web-Panel bearbeiten kannst. Es wird ihnen nichts entnommen. Die Zeile, die die Affixe eines Durchlaufs ankündigt, ist das Snippet content.dungeon_generated.affix.announcement.

Raumkategorien​

Die category einer Raumvorlage sagt, welche Rolle sie spielen kann.

KategorieRolle
STARTHier beginnt der Durchlauf. Einer pro Dungeon. Er muss einen SPAWN-Marker enthalten.
NORMALEin gewöhnlicher Raum.
TREASUREImmer auf einem Abzweig, nie auf dem Weg zum Boss.
CORRIDORZwischen zwei Räumen eingefügt, die sich nicht direkt berühren können.
SECRETImmer eine Sackgasse.
BOSSDer letzte Raum. Einer pro Dungeon.

Räume werden Tür an Tür verbunden, ein Raum ohne Türen kann also nur ein START als Sackgasse sein. Eine Tür mit eingeschaltetem required muss mit einem anderen Raum verbunden werden: Eine Vorlage, die nicht alle ihre erforderlichen Türen füllen kann, wird nie verwendet. Eine Tür, durch die niemand ging, wird mit dem sealBlock ihrer Art verschlossen.

Marker​

Ein Marker ist ein interessanter Punkt in einem Raum. Jeder hat eine kind:

ArtWas er tutAuszufüllendes Feld
SPAWNWo Spieler erscheinen, wenn der Durchlauf beginnt. Nur der erste SPAWN des Startraums wird verwendet.keines
CHESTHier wird eine Loot-Truhe platziert. Ihre Position und ihr Yaw ersetzen die Position des Entries. Eine von einem Marker benannte Truhe wird immer platziert, auch wenn ihr Entry in manualMode ist.chest: eine Dungeon Loot Chest
TRIGGERDie Trigger werden für den Spieler ausgelöst, der den Raum erreicht.triggers
NPCEine Dungeon NPC Instance steht hier, den Mitgliedern des Durchlaufs angezeigt.npc
MOBEin Dungeon Mob Spawn lässt seine Mobs hier erscheinen, wenn ein Mitglied des Durchlaufs den Raum zum ersten Mal betritt.mob

Der Yaw eines Markers dreht eine Truhe (sie blickt vom Yaw weg zurück) und einen NPC (er blickt in dessen Richtung). Der Marker ist über seine Stelle in der Liste markers mit seinem Entry verknüpft.

Räume im Spiel​

Betritt ein Spieler einen Raum eines generierten Dungeons, werden die onEnter-Trigger seiner Vorlage ausgelöst, dann die Trigger seiner TRIGGER-Marker und die Mobs seiner MOB-Marker. Bei eingeschaltetem enterOnce (Standard bei Vorlagen) werden sie nur beim ersten Mal ausgelöst, wenn jeder Spieler den Raum in einem Durchlauf betritt.

Die onClear-Trigger werden einmal pro Durchlauf ausgelöst, wenn eine Dungeon Clear Room-Action läuft, während der Spieler im Raum steht. Die Plattform entscheidet nie allein, dass ein Raum geleert ist: Das entscheidest du, zum Beispiel über das Mob-Death-Event, wenn das letzte Monster stirbt.

Die Trigger eines Raums lesen diese Werte aus dem Kontext (mit einer interaction_context_variable):

SchlüsselWert
RUN_IDId des Durchlaufs.
SEEDSeed des Dungeons, dezimal.
ROOMNummer des Raums: 0 ist der Startraum, danach in der Reihenfolge, in der der Generator sie platziert hat.
ROOM_TEMPLATEId des Raumvorlagen-Entries.
DIFFICULTYDie difficulty des Generators.
POSITIONDer Block des Markers bei einem TRIGGER-Marker, sonst die Position des Spielers.

Die Trigger eines Affixes lesen nur RUN_ID, SEED und DIFFICULTY. Ein fester Dungeon stellt keinen dieser Schlüssel bereit.

Seeds, Affixe und Schwierigkeit​

Derselbe Seed ergibt immer denselben Dungeon, ein Layout lässt sich also erneut abspielen. Für jeden Durchlauf wird ein neuer Seed gezogen. Der Seed wird mit dem Durchlauf gespeichert, ein Reload baut also denselben Dungeon im Speicher neu auf. Kann er nicht neu aufgebaut werden, wird der Durchlauf beim Start geschlossen, statt mit Räumen übernommen zu werden, die niemand kennt.

Affixe werden nach dem Layout aus den affixes des Generators nach ihrem weight gezogen, affixCount davon ohne Wiederholung. Die Ziehung folgt dem Seed, ändert aber nie das Layout. Ihre Modifier und Trigger gelten für jedes Mitglied, wenn der Durchlauf beginnt.

difficulty ist nur eine Zahl, die über den Kontext an deine Trigger weitergegeben wird: Sie ändert das Layout nicht von selbst.

Wichtige Generator-Einstellungen​

FeldStandardHinweise
minRooms, maxRooms6, 10Räume insgesamt einschließlich Start und Boss, Korridore ausgenommen. Erlaubter Bereich: 2 bis 256.
minBossDepth3Der Boss liegt mindestens so viele Schritte vom Start entfernt.
branchRatePercent40Wahrscheinlichkeit in Prozent, dass ein Raum jenseits des Hauptpfads einen Seitenzweig öffnet.
quotaskeineGrenzen für die Anzahl der NORMAL-, TREASURE- und SECRET-Räume. Eine Kategorie ohne Grenze ist unbegrenzt.
trialBudget, replans20000, 5Wie sehr sich die Suche anstrengt, bevor sie scheitert. Das Versuchsbudget mal (replans + 1) muss innerhalb von 5 000 000 bleiben.
baseY64Höhe des Bodens des Startraums in der Welt des Durchlaufs.
roomsPerTick4Pro Server-Tick eingefügte Räume. Niedriger hält Ticks kurz; höher ist schneller.
pasteTimeoutSeconds120Danach wird der Start abgebrochen, die Kosten erstattet und die Welt verworfen.
naturalSpawningausMonster und Tiere spawnen von selbst in der Durchlauf-Welt. Standardmäßig aus.
verticalMargin1.0Blöcke, die über der Decke und unter dem Boden jedes Raums hinzugefügt werden, wenn entschieden wird, ob ein Spieler drinnen ist.
pasterSTRUCTUREVerwendet die Paper-Struktur-API: kein weiteres Plugin nötig.

Eine Raumvorlage ist an jeder Seite höchstens 256 Blöcke groß, mit höchstens 64 Türen und 1024 Markern.

Der Editor im Spiel​

Öffne ein Dungeon Room Template im Web-Panel und klicke auf den Content-Editor des Feldes artifactId. Du erhältst eine Reihe von Werkzeugen in deiner Hotbar:

WerkzeugVerwendung
EckenstabLinksklick auf einen Block für Ecke A, Rechtsklick auf einen Block für Ecke B.
ErfassenSpeichert die Blöcke der Box als Struktur der Vorlage.
TürwerkzeugRechtsklick auf einen Block einer Wand, um eine Tür hinzuzufügen (der Block ist die untere Mitte der Öffnung). Linksklick, um die Türen dort zu entfernen.
TürartRechtsklick für den nächsten Konnektortyp, Linksklick für den vorherigen.
Erforderlich-SchalterSchaltet um, ob die nächsten Türen erforderlich sind.
MarkerwerkzeugRechtsklick auf einen Block, um davor einen Marker hinzuzufügen. Linksklick, um die Marker dort zu entfernen.
MarkerartRechtsklick für die nächste Art, Linksklick für die vorherige.
SpeichernSchreibt die Türen und Marker in den Entry.

Eine Bossbar zeigt die Größe der Box, die Anzahl der Türen und Marker und ob du ungespeicherte Arbeit hast. Die Größe des Raums wird aus der gespeicherten Struktur gelesen, nie eingegeben. Du musst mindestens einen Konnektortyp erstellen und veröffentlichen, bevor du eine Tür hinzufügen kannst.

Die Erfassungen überspringen standardmäßig Entities, weil eine lebende Entity den Raum bei jeder Erfassung verändert und in jeder Kopie als loser Mob zurückkommt. Diese Verhaltensweisen und alle Texte des Editors sind Typewriter-Snippets unter content.dungeon_room_template., du kannst sie also im Web-Panel ändern oder übersetzen:

SnippetStandardBedeutung
capture.include_entitiesfalseOb eine Erfassung die Entities der Box speichert.
capture.max_volume262144Höchstzahl der Blöcke, die eine Erfassung liest. Sie wird in einem Server-Tick gelesen: Eine sehr große Box hält diesen Tick auf.
capture.timeout_seconds30Sekunden, die auf eine Erfassung gewartet wird, bevor aufgegeben wird.
sound.confirmentity.experience_orb.pickupSound nach einer Erfassung oder einem Speichern. Leer: keiner.

Grenzen und gute Praxis​

  • Generierte Dungeons verwenden nur WORLD_PER_RUN: Jeder Durchlauf erstellt eine Welt und löscht sie anschließend.
  • Der Editor fester Räume (Knoten) hat eigene Snippets unter content.dungeon_room. (Nachrichten node.*, save.*, editor.*, Werkzeuge tool.add, tool.remove, tool.save).
  • Baue Räume so, dass zwei verbundene Türen derselben Art übereinanderliegen. Eine gerade Öffnungsbreite hat ihren zusätzlichen Block auf dem höheren x oder z der Vorlage. Der Generator verschiebt einen Raum um einen Block, wenn eine gerade Öffnung es braucht.
  • Der gesamte Dungeon muss, ab baseY gezählt, zwischen den untersten und obersten Block der Welt passen.
  • Verlasse dich nicht auf eine feste Raumanzahl: Verwende Marker und Events statt Raumnummern.