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
| Baustein | Entry | Was es ist |
|---|---|---|
| Türart | Dungeon Connector Type | Die Größe einer Türöffnung, der Block, der eine ungenutzte Tür verschließt, und welche Arten verbunden werden können. |
| Raum | Dungeon Room Template | Eine gespeicherte Struktur (eine Paper-Struktur .nbt, als Artifact gehalten) mit ihrer Kategorie, ihren Türen und Markern. |
| Pool | Dungeon Room Pool | Eine gewichtete Liste von Raumvorlagen. |
| Generator | Dungeon Generator | Die Regeln: welche Pools, wie viele Räume, wie tief der Boss liegt, wie oft sich ein Pfad verzweigt. |
| Affix | Dungeon Affix | Ein zufällig gezogener Modifier des Durchlaufs, etwa „schnelle Mobs“. |
| Dungeon | Dungeon Instance | Sein Feld generator macht ihn zu einem generierten Dungeon. |
Einen bauen, Schritt für Schritt
- Türarten. Füge mindestens einen Dungeon Connector Type hinzu. Setze seine
widthundheight(standardmäßig 3 mal 3), densealBlock, der eine ungenutzte Tür verschließt (standardmäßigminecraft:stone_bricks) und, wenn du mehrere Arten hast,compatibleWith. Eine Art kann immer mit sich selbst verbunden werden. - 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. - 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- undSECRET-Vorlagen mischen. - Generator. Füge einen Dungeon Generator hinzu und setze
startPool,bossPool, optionalcorridorPoolundnormalPoolsmit je einem Gewicht. - Dungeon. Setze in deiner Dungeon Instance
generator. LasstemplateWorldleer: Ein generierter Dungeon hat keine Vorlagenwelt. Die Isolation mussAUTOoderWORLD_PER_RUNsein. - Spiellogik. Verwende die Trigger
onEnterundonClearder 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.
| Kategorie | Rolle |
|---|---|
START | Hier beginnt der Durchlauf. Einer pro Dungeon. Er muss einen SPAWN-Marker enthalten. |
NORMAL | Ein gewöhnlicher Raum. |
TREASURE | Immer auf einem Abzweig, nie auf dem Weg zum Boss. |
CORRIDOR | Zwischen zwei Räumen eingefügt, die sich nicht direkt berühren können. |
SECRET | Immer eine Sackgasse. |
BOSS | Der 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:
| Art | Was er tut | Auszufüllendes Feld |
|---|---|---|
SPAWN | Wo Spieler erscheinen, wenn der Durchlauf beginnt. Nur der erste SPAWN des Startraums wird verwendet. | keines |
CHEST | Hier 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 |
TRIGGER | Die Trigger werden für den Spieler ausgelöst, der den Raum erreicht. | triggers |
NPC | Eine Dungeon NPC Instance steht hier, den Mitgliedern des Durchlaufs angezeigt. | npc |
MOB | Ein 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üssel | Wert |
|---|---|
RUN_ID | Id des Durchlaufs. |
SEED | Seed des Dungeons, dezimal. |
ROOM | Nummer des Raums: 0 ist der Startraum, danach in der Reihenfolge, in der der Generator sie platziert hat. |
ROOM_TEMPLATE | Id des Raumvorlagen-Entries. |
DIFFICULTY | Die difficulty des Generators. |
POSITION | Der 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
| Feld | Standard | Hinweise |
|---|---|---|
minRooms, maxRooms | 6, 10 | Räume insgesamt einschließlich Start und Boss, Korridore ausgenommen. Erlaubter Bereich: 2 bis 256. |
minBossDepth | 3 | Der Boss liegt mindestens so viele Schritte vom Start entfernt. |
branchRatePercent | 40 | Wahrscheinlichkeit in Prozent, dass ein Raum jenseits des Hauptpfads einen Seitenzweig öffnet. |
quotas | keine | Grenzen für die Anzahl der NORMAL-, TREASURE- und SECRET-Räume. Eine Kategorie ohne Grenze ist unbegrenzt. |
trialBudget, replans | 20000, 5 | Wie sehr sich die Suche anstrengt, bevor sie scheitert. Das Versuchsbudget mal (replans + 1) muss innerhalb von 5 000 000 bleiben. |
baseY | 64 | Höhe des Bodens des Startraums in der Welt des Durchlaufs. |
roomsPerTick | 4 | Pro Server-Tick eingefügte Räume. Niedriger hält Ticks kurz; höher ist schneller. |
pasteTimeoutSeconds | 120 | Danach wird der Start abgebrochen, die Kosten erstattet und die Welt verworfen. |
naturalSpawning | aus | Monster und Tiere spawnen von selbst in der Durchlauf-Welt. Standardmäßig aus. |
verticalMargin | 1.0 | Blöcke, die über der Decke und unter dem Boden jedes Raums hinzugefügt werden, wenn entschieden wird, ob ein Spieler drinnen ist. |
paster | STRUCTURE | Verwendet 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:
| Werkzeug | Verwendung |
|---|---|
| Eckenstab | Linksklick auf einen Block für Ecke A, Rechtsklick auf einen Block für Ecke B. |
| Erfassen | Speichert die Blöcke der Box als Struktur der Vorlage. |
| Türwerkzeug | Rechtsklick 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ürart | Rechtsklick für den nächsten Konnektortyp, Linksklick für den vorherigen. |
| Erforderlich-Schalter | Schaltet um, ob die nächsten Türen erforderlich sind. |
| Markerwerkzeug | Rechtsklick auf einen Block, um davor einen Marker hinzuzufügen. Linksklick, um die Marker dort zu entfernen. |
| Markerart | Rechtsklick für die nächste Art, Linksklick für die vorherige. |
| Speichern | Schreibt 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:
| Snippet | Standard | Bedeutung |
|---|---|---|
capture.include_entities | false | Ob eine Erfassung die Entities der Box speichert. |
capture.max_volume | 262144 | Hö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_seconds | 30 | Sekunden, die auf eine Erfassung gewartet wird, bevor aufgegeben wird. |
sound.confirm | entity.experience_orb.pickup | Sound 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.(Nachrichtennode.*,save.*,editor.*, Werkzeugetool.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
baseYgezählt, zwischen den untersten und obersten Block der Welt passen. - Verlasse dich nicht auf eine feste Raumanzahl: Verwende Marker und Events statt Raumnummern.