Freigeben über


Einführung in das Thema Beutetabellen

Beutetabellen sind JSON-formatierte Dateien, mit denen festgelegt wird, wie Gegenstände im Spiel generiert werden. Sie können verwendet werden, um den Inhalt von Truhen zu generieren und um zu definieren, welche Gegenstände ein Objekt bei seinem Tod fallen lässt oder auch mit welchen Gegenständen ein Objekt ausgestattet ist. In manchen Fällen werden sie sogar in Spielmechaniken wie dem Melken einer Pilzkuh oder dem Angeln verwendet.

Abbildung, die Alex beim Öffnen einer Truhe zeigt, um die Beute zu zeigen.

Beutetabellendateien werden im Stammverzeichnis eines Verhaltenspakets gespeichert. Sie bestehen in der Regel aus drei Hauptabschnitten, die als „Pools“ bezeichnet werden.

  • Rolls (Ausschüttungen)
    • Wie oft dieser Beutetopf ausgeschüttet wird, um einen Eintrag auszuwählen. Dies kann entweder eine Ganzzahl sein, d.h. eine festgelegte Anzahl von Ausschüttungen, oder ein Minimum/Maximum-Bereich, aus dem die Anzahl der Ausschüttungen ausgewählt werden kann.
  • Conditions (Bedingungen) (optional) weitere Informationen
    • Dies sind die Bedingungen, die erfüllt sein müssen, damit dieser Beutetopf ausgeschüttet werden kann.
  • Entries (Einträge)
    • Dies ist eine Liste der Objekte, aus der das Spiel bei dieser Ausschüttung eine Auswahl trifft. Dabei kann es sich um item, loot_table oder empty handeln, wenn die Möglichkeit bestehen soll, dass bei dieser Ausschüttung nichts passiert.

In diesem Tutorial wird Folgendes beschrieben:

  • Verwendung von JSON zur Definition einer Beutetabelle
  • Anwenden von Funktionen auf Einträge zum Ändern des ausgewählten Gegenstands
  • Verwendung von Bedingungen, um die Auswahl eines Beutetopfs oder Eintrags weiter einzuschränken.

Voraussetzungen

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

Grundlegende Verwendung

Erstellen wir zunächst eine Beutetabelle, die bei ihrem Aufruf einen einzelnen Diamanten ausgibt.

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond"
                }
            ]
        }
    ]
}

Wie du siehst, haben wir einen einzelnen Beutetopf definiert, der nur einmal ausgeschüttet wird und bei jeder Ausschüttung einen einzigen Diamanten enthält. Wenn du dies mit der minecraft:loot-Komponente in der Verhaltensdatei eines Objekts verknüpfst, lässt dieses den Diamanten fallen, wenn es stirbt.

Was tun wir, wenn du aus zwei Gegenständen auswählen möchtest? Was, wenn wir einen Diamanten oder ein Stück Kohle zurückgeben möchten? Dazu fügen wir dem Objekt entries einen zweiten Wert hinzu.

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond"
                },
                {
                    "type": "item",
                    "name": "minecraft:coal"
                }
            ]
        }
    ]
}

Hier siehst du, dass das Fallenlassen eines Diamanten jetzt genauso wahrscheinlich ist wie das eines Kohlestücks. Allen entries ist eine Gewichtung weight zugewiesen. Wenn du dies nicht angibst, ist der Standardwert 1, wodurch alle entries die gleiche Ausschüttungswahrscheinlichkeit haben. Um dies anzupassen, müssen wir den Wert weight selbst definieren.

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 7
                }
            ]
        }
    ]
}

Um zu verstehen, wie weight sich auf die Ausschüttung auswirkt, kannst du dir einfach vorstellen, dass das obige Beispiel nicht zwei Einträge hat, sondern acht: sieben Möglichkeiten, Kohle zu erhalten, und eine Möglichkeit, einen Diamanten zu erhalten. Es ist daher siebenmal wahrscheinlicher, dass ein Kohlestück ausgeschüttet wird, als dass ein Diamant ausgeschüttet wird.

Obwohl der quality-Modifikator aus der Java Edition (der weight basierend auf dem Glück-Attribut des Spielers anpasst) in den Vanilla-Dateien der Bedrock Edition vorhanden ist, unterstützt die Bedrock Edition derzeit nicht das Glück-Attribut. Damit verliert diese Funktion jeglichen Nutzen.

Du kannst auch randomisieren, wie oft ein Satz von entries ausgeschüttet wird. Der rolls-Schlüssel kann mit einem min- und einem max-Wert festgelegt werden, zwischen denen das Spiel eine zufällige Auswahl trifft.

{
    "pools": [
        {
            "rolls": {
                "min": 1,
                "max": 3
            },
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 7
                }
            ]
        }
    ]
}

Dies führt dazu, dass das Spiel die Einträge ein- bis dreimal ausschüttet. Das Ergebnis sind mindestens ein und maximal drei Gegenstände bei jedem Aufruf dieser Beutetabelle.

Hier ist ein weiteres Beispiel, bei dem eine Beutetabelle als einer der Einträge verwendet wird. Dies führt dazu, dass das Spiel die andere Beutetabelle aufruft und das zurückgibt, was daraus resultiert.

{
    "pools": [
        {
            "rolls": {
                "min": 1,
                "max": 3
            },
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 7
                },
                {
                    "type": "loot_table",
                    "name": "loot_tables/custom/some_loot_table",
                    "weight": 1
                }
            ]
        }
    ]
}

Denke daran, dass sich Beutetabellen in keiner Weise auf sich selbst beziehen können. Wenn eine Ausschüttung zu einer rekursiven Beutetabelle führt, wird nichts zurückgegeben.

Funktionen und Ändern von Gegenständen

Funktionen sind optionale Operationen, die einem Eintrag hinzugefügt werden können, der einen Gegenstand ändert. Damit kannst du etwa festlegen, wie viele Gegenstände einer Art zurückgegeben werden, die Attribute dieses Gegenstands ändern oder eine beliebige Anzahl anderer Operationen ausführen. In diesem Artikel erläutern wir einige der häufigsten Verwendungen von Funktionen. Ausführliche Erläuterungen zu allen verfügbaren Funktionen findest du im Tutorial Beute- und Handelstabellenfunktionen.

set_count

Damit kannst du eine Mindest- und eine Höchstzahl von Gegenständen festlegen, die mit diesem Eintrag zurückgegeben werden:

                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1,
                    "functions": [
                        {
                          "function": "set_count",
                          "count": {
                            "min": 1,
                            "max": 6
                          }
                        }
                    ]
                }

Im obigen Beispiel werden ein bis sechs Diamanten zurückgegeben, wenn dieser Eintrag ausgeschüttet wird.

set_data

Damit wird der Datenwert eines Gegenstands festgelegt. Dies ist nützlich für Dinge wie die Rückgabe eines bestimmten Tranks oder eines bestimmten Farbstoffs. Darüber hinaus kannst du damit verschiedene Blockwerte zurückgeben, wie beispielsweise eine bestimmte Wollfarbe oder einen bestimmten Baumstammtyp.

                {
                    "type": "item",
                    "name": "minecraft:potion",
                    "weight": 1,
                    "functions": [
                      {
                        "function": "set_data",
                        "data": 21
                      }
                    ]
                }

Das obige Beispiel gibt einen Trank der Heilung zurück.

                {
                    "type": "item",
                    "name": "minecraft:wool",
                    "weight": 1,
                    "functions": [
                      {
                        "function": "set_data",
                        "data": 1
                      }
                    ]
                }

In diesem Beispiel würde orangefarbene Wolle zurückgegeben.

specific_enchants

Mit dieser Funktion kannst du eine Liste bestimmter Verzauberungen für einen Gegenstand festlegen. Damit kannst du Verzauberungen auf Gegenstände anwenden, die normalerweise im Spiel nicht verzaubert werden könnten.

                {
                    "type": "item",
                    "name": "minecraft:stick",
                    "weight": 1,
                    "functions": [
                        {
                          "function": "specific_enchants",
                          "enchants": [
                             "knockback",
                             "fire_aspect"
                          ]
                        }
                    ]
                }

Du kannst die Verzauberungen auch als Objekte definieren, um auch eine Verzauberungsstufe festzulegen. Maximale Verzauberungsstufen sind hartcodiert und können nicht überschrieben werden.

                {
                    "type": "item",
                    "name": "minecraft:stick",
                    "weight": 1,
                    "functions": [
                        {
                          "function": "specific_enchants",
                          "enchants": [
                             {
                                "id": "knockback",
                                "level": 1
                             },
                             {
                                "id": "unbreaking",
                                "level": 3
                             }
                          ]
                        }
                    ]
                }

Mehrere Funktionen

Es können mehrere Funktionen definiert werden. Hier ist ein Beispiel für die Kombination von zwei Funktionen. In diesem Beispiel gibt dieser Eintrag einen bis drei Tränke der Heilung zurück.

                {
                    "type": "item",
                    "name": "minecraft:potion",
                    "weight": 1,
                    "functions": [
                        {
                            "function": "set_count",
                            "count": {
                              "min": 1,
                              "max": 3
                            }
                        },
                        {
                            "function": "set_data",
                            "data": 21
                        }
                    ]
                }

Mehrere Funktionen können sogar aus Wiederholungen derselben Funktion bestehen. Wenn es aber einen Konflikt zwischen diesen Funktionen gibt, „gewinnt“ die letzte, die definiert wurde.

So führt beispielsweise die Verwendung mehrerer set_count-Funktionen wie im folgenden Beispiel dazu, dass nur das letzte Duplikat verwendet wird. Dadurch liegt die Anzahl der Gegenstände zwischen fünf und sieben und nicht zwischen eins und drei.

                {
                    "type": "item",
                    "name": "minecraft:potion",
                    "weight": 1,
                    "functions": [
                        {
                            "function": "set_count",
                            "count": {
                              "min": 1,
                              "max": 3
                            }
                        },
                        {
                            "function": "set_count",
                            "count": {
                              "min": 5,
                              "max": 7
                            }
                        }
                    ]
                }

Bedingungen

Bedingungen sind eine Liste von Anforderungen, die erfüllt sein müssen, bevor entweder ein Beutetopf verwendet oder ein individueller Eintrag ausgewählt werden kann. Alle Bedingungen werden in der Liste „conditions“ (Bedingungen) gespeichert. Jede Bedingung wird einzeln ausgeführt. Wenn eine Bedingung in der Liste fehlschlägt, werden die übrigen Bedingungen in derselben Liste ignoriert.

Bedingung „Übereinstimmendes Tool“

match_tool ist eine Bedingung, die prüft, ob das Tool (oder die Waffe oder der Gegenstand, den der Spieler verwendet) für den Beute-Drop mit dem angegebenen Satz von Modifikatorbedingungen übereinstimmt. Die verwendeten Prädikate sind: count, durability, enchantments und item.

  • count: Zahl der Gegenstände.
    • range_max: maximaler Wert
    • range_min: Mindestwert
  • durability: Dauerhaftigkeit des Gegenstands
    • range_max: maximaler Wert
    • range_min: Mindestwert
  • enchantments Liste von Verzauberungen
    • enchantment: Verzauberungs-ID
    • levels: Stufe der Verzauberung
    • range_max: maximaler Wert
    • range_min: Mindestwert
  • item: Gegenstand-ID

Beispiel:


"conditions": [  
            {  
              "condition": "match_tool",  
              "enchantments": [  
                {  
                  "enchantment": "sharpness",  
                  "levels": {  
                    "range_max": 6  
                  }  
                }  
              ],  
              "item": "minecraft:diamond_sword",  
              "count": 1,  
              "durability": {  
                "range_min": 1  
              }  
            }  
          ]  

Pool-Bedingungen

Die Anwendung einer Bedingung auf einen Pool ermöglicht die Ausführung des gesamten Pools auf der Grundlage der definierten Bedingungen.

Das folgende Beispiel wird nur ausgelöst, wenn das Objekt, das es aufruft, von einem Skelett getötet wurde. Dies führt entweder zu einem Diamanten oder zu einem Stück Kohle.

{
    "pools": [
        {
            "conditions": [
                {
                    "condition": "killed_by_entity",
                    "entity_type": "minecraft:skeleton"
                }
            ],
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 1
                }
            ]
        }
    ]
}

Bedingungen für Einträge

Du kannst auch Bedingungen auf bestimmte entries innerhalb der Ausschüttung anwenden. Im folgenden Beispiel wird nur in 50% der Fälle ein Diamant zurückgegeben, wenn das Objekt, das dies aufgerufen hat, vom Spieler getötet wurde. In den übrigen Fällen wird beim Aufruf ein Stück Kohle zurückgegeben.

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "item",
                    "name": "minecraft:diamond",
                    "weight": 1,
                    "conditions": [
                        {
                            "condition": "killed_by_player"
                        }
                    ]
                },
                {
                    "type": "item",
                    "name": "minecraft:coal",
                    "weight": 1
                }
            ]
        }
    ]
}

Wenn du dich mit den verschiedenen verfügbaren Funktionen und Bedingungen vertraut machst, kannst du das Spielerlebnis für deinen Spieler wirklich individuell anpassen. Du kannst Gegenstände benennen und ihnen einen Hintergrund geben, Ressourcenkisten voller Vorräte fallen lassen und sogar schriftliche Bücher für Anweisungen oder Informationen erstellen.

Wie geht es weiter?

Es gibt sehr viele weitere Funktionen, mit denen ein ausgewählter Gegenstand modifiziert werden kann. Im nächsten Tutorial werden wir uns damit befassen.