Share via


NPC-Dialogbefehl

Mit verzweigten Dialogen kannst du ein dynamisches NPC-Dialogskript erstellen, das aktualisierte Dialoge basierend auf den Aktionen oder Reaktionen eines Spielers im Spiel bereitstellen kann. Das System der verzweigten Dialoge besteht aus drei Teilen: dem NPC-Objekt, den Dialogbefehlen und den Ressourcenszenendateien.

Voraussetzungen

Es wird empfohlen, vor Beginn dieses Tutorials Folgendes abzuschließen:

Die Szenendatei

Die Szenendatei ist eine JSON-Datei im Ordner Dialog im Stammverzeichnis des Verhaltenspakets (%localappdata%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\<your behavior pack folder>). Sie enthält alle Informationen, die für den verzweigten Dialog benötigt werden. Du kannst so viele Szenendateien erstellen, wie du benötigst. Du kannst eine Szenendatei für jeden NPC in deiner Welt oder für jedes Kapitel deiner Geschichte erstellen. Du kannst aber auch mit nur einer Szenendatei für die Welt arbeiten – die Wahl liegt ganz bei dir. Die Funktion der verzweigten Dialoge liest alle Dateien im Dialogordner, unabhängig davon, wie sie organisiert sind.

Eigenschaften

Die erste Eigenschaft ist die Kopfzeile, die diese JSON-Datei als gültige Szenendatei definiert.

Beispiel:

{
    "format_version": "1.17",
    "minecraft:npc_dialogue": {}
}

Da es sich um eine JSON-Datei handelt, müssen wir Klammern einfügen. Die nächste Eigenschaft, die wir hinzufügen, ist die Eigenschaft „scenes“ (Szenen). Dies ist der Ort, an dem alle unsere verzweigten Dialoge gespeichert werden.

    {
        "format_version": "1.17",
        "minecraft:npc_dialogue": {
            "scenes": []
        }
    }

Jetzt, da wir die Eigenschaften Kopfzeile und Szenendatei festgelegt haben, können wir unsere individuellen Szenen für unseren verzweigten NPC-Dialog erstellen. Jede neue Instanz des NPC-Dialogs erfordert eine neue Szene. Dies wird in der Szenendatei definiert, indem ein Szenen-Tag erstellt wird. Du verwendest das Szenen-Tag im Spiel, um den in der Szenendatei angegebenen Text aufzurufen. Du kannst auch NPC-Tasten und -Befehle einrichten, die sich genauso verhalten, wie wenn sie mit dem NPC-Editor im Spiel eingerichtet worden wären.

Sehen wir uns die NPC-Szenenstruktur an:

    {
        "scene_tag": "ducky_intro",
        "npc_name": "Ducky",
        "text": "Hello. My name is Ducky. Take this gold!",
        "on_open_commands": [
            "/clear @p"
        ],
        "on_close_commands": [
            "/say Enjoy the gold! "
        ],
        "buttons": [
            {
                "name": "Take Gold",
                "commands": [
                    "/give @initiator gold_ingot"
                ]
            }
        ]
    }

Szeneneigenschaften

scene_tag: Dies ist der Name, den du verwenden wirst, um diese Szene im Spiel aufzurufen. Hierbei handelt es sich um eine erforderliche Eigenschaft.

npc_name: Hier kannst du einen Namen für dein NPC-Dialogfeld hinzufügen oder ändern. Hierbei handelt es sich um eine optionale Eigenschaft, die nützlich ist, um NPC-Namen dynamisch zu ändern.

Text: Hier gibst du den Dialog ein, den dein NPC im Spiel für diese Szene anzeigen soll. Du kannst den Dialogtext direkt hier eingeben oder Rohtext verwenden, wenn du mit einer Sprachdatei arbeitest. Hierbei handelt es sich um eine optionale Eigenschaft. Ohne sie bleibt das NPC-Dialogfeld jedoch leer.

on_open_commands: Hier kannst du festlegen, welche Befehle ausgelöst werden, wenn das NPC-Dialogfeld geöffnet wird. Optionale Eigenschaft.

on_close_commands: Hier kannst du festlegen, welche Befehle ausgelöst werden, wenn das NPC-Dialogfeld geschlossen wird. Optionale Eigenschaft.

Buttons: Hier kannst du Tasten für deinen NPC erstellen. Die Untergruppe enthält die Eigenschaften „name“ (Name) und „commands“ (Befehle). Mit der Eigenschaft „name“ (Name) kannst du den Text festlegen, der auf der Taste deines NPCs angezeigt werden soll. Mit der zweiten Eigenschaft – „commands“ (Befehle) – kannst du Befehle hinzufügen, die im Spiel ausgeführt werden, wenn die Taste gedrückt wird. Optionale Eigenschaft; erforderlich für NPC-Tasten.

Rohtext

Alle oben angegebenen Szeneneigenschaften unterstützen Rohtext.

    {
        "scene_tag": "ducky_intro",
        "npc_name": { "rawtext": [ { "translate": "character.name", "with": ["\n"] } ] },
        "text": { "rawtext": [ { "translate": "ducky.intro.text", "with": ["\n"] } ] },
        "on_open_commands": ["/clear @p"],
        "on_close_commands": ["/say Enjoy the gold! "],
        "buttons": [
            {
                "name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
                "commands": [
                    "/give @initiator gold_ingot"
                ]
            }
        ]
    }

Dialogbefehl

Der Dialogbefehl ermöglicht es NPCs, Szenendateien zu öffnen oder zu lesen. Der Befehl verfügt über zwei verschiedene Modi, von denen jeder seinen eigenen Zweck und seine eigene Syntax hat.

Dialogue Open (Dialog öffnen)

Mit „Dialogue Open“ (Dialog öffnen) wird das Öffnen eines NPC-Dialogfelds für den/die Zielspieler erzwungen. Diese Funktion wurde zuvor als „Remote Fire“ (Remote-Auslösung) bezeichnet, da sie das Klicken auf einen NPC simuliert. Dieser Befehl kann für jeden NPC verwendet werden und erfordert kein Verhaltenspaket – es sei denn, der NPC soll eine Szenendatei für seinen Dialog verwenden (was bei Verwendung von „Dialogue Open“ (Dialog öffnen) keine Voraussetzung ist).

Die Syntax für „Dialogue Open“ (Dialog öffnen) lautet wie folgt:

    /dialogue open <npc: target> <player: target> [sceneName:string]

/dialogue: Der anfängliche Befehl.

open: Die Befehlsvariante.

<npc: target>: Der NPC, auf den du abzielst.

<player: target>: Der Spieler, auf den du abzielst. Dies ist der Spieler, dem das NPC-Dialogfeld angezeigt wird.

[sceneName:string]: Dies ist der Name, der verwendet wird, wenn du den in einer Szenendatei enthaltenen Dialog verwenden möchtest. Bei „string“ (Zeichenfolge) muss es sich um einen gültigen Szenen-Tag-Namen handeln. Ansonsten tritt ein Fehler auf. Hierbei handelt es sich um einen optionalen Parameter.

Hinweis

Wenn sceneName nicht angegeben ist, wird der zuletzt verwendete Dialog des NPCs angezeigt.

Praktische Anwendung

„Dialogue Open“ (Dialog öffnen) wird hauptsächlich auf zwei Arten verwendet.

Die erste besteht darin, ein NPC-Dialogfeld zu initiieren, ohne dass der Spieler direkt mit dem NPC interagiert. Dabei wird der NPC im Grunde als „Pop-up-Fenster“ verwendet und der Spieler muss nicht auf den NPC klicken. In diesem Szenario muss der NPC nicht einmal für den Spieler in der Welt sichtbar sein (er muss sich jedoch in einem geladenen Chunk und in Tick-Entfernung zum Spieler befinden, der den Dialog empfängt). Er könnte auch unter der Erde oder an einem anderen unzugänglichen Ort versteckt sein.

Die zweite Art, „Dialogue Open“ (Dialog öffnen) zu verwenden, besteht darin, mithilfe der Szenendatei Bäume für verzweigte Dialoge zu erstellen. Mit dem Befehl „Dialogue Open“ (Dialog öffnen) in der Szenendatei eines NPCs kann der NPC automatisch das nächste Dialogfeld für einen Spieler öffnen, indem er einen „On Close Command“ (Befehl, der beim Schließen ausgeführt wird) oder einen „Button“-Befehl (Taste) auslöst. Dies ist die Grundlage für alle Dialogbaum-Verzweigungspfade.

Dialogue Change (Dialog ändern)

„Dialogue Change“ (Dialog ändern) wird verwendet, um einen NPC anzuweisen, den Dialog aus einer speziell festgelegten Szenendatei zu verwenden. Damit dieser Befehl korrekt ausgeführt wird, muss ein Verhaltenspaket verwendet werden, das einen Dialogordner und eine Szenendatei enthält. Der Befehl weist den Ziel-NPC an, den Dialog vom durch den Namen des Szenen-Tags angegebenen Speicherort abzurufen. Der Befehl sollte ausgeführt werden, bevor der Spieler Kontakt mit dem NPC einleitet.

Die Syntax für „Dialogue Change“ (Dialog ändern) lautet wie folgt:

    /dialogue change <npc: target> <sceneName:string> [player: target]

/dialogue: Der anfängliche Befehl.

change: Die Befehlsvariante.

<npc: target>: Der NPC, auf den du abzielst.

<sceneName:string>: Dies ist der Name, der verwendet wird, wenn du den in einer Szenendatei enthaltenen Dialog verwenden möchtest. Bei „string“ (Zeichenfolge) muss es sich um einen gültigen Szenen-Tag-Namen handeln. Ansonsten tritt ein Fehler auf.

[player: target]: Der Spieler, auf den du abzielst (dies ist der Spieler, dem das Dialogfeld angezeigt wird). Wenn diese Angabe im Befehl „/dialogue change“ (Dialog ändern) weggelassen wird, wird der NPC-Dialog für alle Spieler aktualisiert.

Praktische Anwendung

„Dialogue Change“ (Dialog ändern) wird hauptsächlich verwendet, um den Dialog eines NPCs mithilfe von Befehlen zu ändern. Der Befehl kann von einem vom Spieler ausgelösten Befehlsblock in der Welt kommen, von einem anderen NPC ausgelöst oder vom Ziel-NPC selbst ausgeführt werden.

Du kannst einen NPC-Dialog basierend auf den Aktionen eines Spielers in der Welt ändern, z.B. beim Betreten eines bestimmten Gebiets, beim Sprechen mit einem anderen NPC oder beim Ausführen einer bestimmten Aufgabe. Wenn die Aktion bewertet werden kann, kann sie verwendet werden, um den Dialogbefehl auszuführen und den Dialog des NPCs zu ändern.

Im Gegensatz zu „Dialogue Open“ (Dialog öffnen) führt „Dialogue Change“ (Dialog ändern) nicht dazu, dass das NPC-Dialogfeld angezeigt wird. Stattdessen verweist es den NPC auf den Szenendateidialog, der dem Spieler während der nächsten Interaktion mit diesem NPC angezeigt werden soll.

Zielerfassung

Die Zielerfassung ist ein wichtiger Bestandteil des NPC-Dialogverzweigungssystems. Sie legt fest, welche NPCs die Befehle erhalten und welchen Spielern der Dialog angezeigt wird. Mit der Zielerfassung wird darüber hinaus sichergestellt, dass jedem Spieler der Dialog angezeigt wird, den er auch sehen soll, und dass der Dialog in Mehrspieler-Szenarien nicht verloren geht.

Auf NPCs abzielen

Um den Befehl /dialogue verwenden zu können, musst du auf einen NPC abzielen. Dieser fungiert als der NPC, von dem aus der Dialog angezeigt wird. Im Porträt des Dialogs wird das Bild dieses NPCs angezeigt.

Der NPC, von dem aus du den Dialog auslösen möchtest, muss in der Welt vorhanden sein.

Auf Spieler abzielen

Wenn du den Befehl /dialogue verwendest, wird es vorkommen, dass du auch auf Spieler abzielen musst: Verwende dazu Spielerselektoren wie beispielsweise @a (alle Spieler) oder @p (nächster Spieler). Diese funktionieren in der Regel gut für Einzelspieler-Umgebungen. Wenn du jedoch Szenenänderungen pro Spieler festlegen möchtest, musst du einen speziellen Zieltyp namens @initiator verwenden (der Spieler, der mit dem NPC interagiert).

Beispiel:

    "buttons": [
        {
            "name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
            "commands": [
                "/give @initiator gold_ingot"
            ]
        }
    ]

Durch die Verwendung dieses Zielselektors mit NPCs ist es möglich, Dialoge spielerspezifisch zu aktualisieren. Dies bedeutet, dass NPCs sich im Mehrspielermodus an den Dialogstatus jedes Spielers erinnern und ihnen entsprechend einzigartige Dialoge senden können. Dies ist nützlich, wenn die Änderung eines NPC-Dialogs durch einen Spieler dazu führen könnte, dass andere Spieler den gesamten Dialogzweig nicht sehen. Darüber hinaus lässt sich dadurch sicherstellen, dass jeder Spieler nur einen Gegenstand von einem NPC erhält und nicht zum NPC zurückkehren kann, um weitere Gegenstände zu erhalten, und dass ein Spieler andere Spieler nicht daran hindern kann, Gegenstände zu sammeln.

Vollständiges Beispiel:

    {
        "format_version": "1.17",
        "minecraft:npc_dialogue": {
            "scenes": [
                {
                    "scene_tag": "ducky_intro",
                    "npc_name": { "rawtext": [ { "translate": "character.name", "with": ["\n"] } ] },
                    "text": { "rawtext": [ { "translate": "ducky.intro.text", "with": ["\n"] } ] },
                    "on_open_commands": ["/clear @p"],
                    "on_close_commands": ["/say Enjoy the gold! "],
                    "buttons": [
                        {
                            "name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
                            "commands": [
                                "/give @initiator gold_ingot"
                            ]
                        }
                    ]
                }
            ]
        }
    }

Befehl zum Auslösen der Szene:

    /dialogue open @e[tag=ducky] @p ducky_intro