Zum Hauptinhalt springen

Was ist eine Schatzdatei?

Schatzdateien bestimmen die Beutetabellen für BetterStructures-Truhen. Sie werden normalerweise Generatoren zugewiesen, können aber auch auf der Ebene einer individuellen Baukonfiguration gesetzt werden.

Diese Beutetabellen sind ziemlich mächtig, erfordern aber auch Kenntnisse einiger grundlegender statistischer Konzepte zum Verständnis.

Statistische Grundlagen​

Lies hier über diese Konzepte, der Rest der Seite setzt voraus, dass du sie verstehst!

Gewichtete Wahrscheinlichkeit

BetterStructures und EliteMobs (ein weiteres Plugin desselben Autors) verwenden beide das Konzept der gewichteten Wahrscheinlichkeit in ihren Beutesystemen. Damit wird ein einfaches Problem gelöst: Wie kann man die Chance festlegen, ein Item aus einer potenziell unendlichen Liste von Items auszuwählen?

Bei gewichteter Wahrscheinlichkeit erhält jedes Item ein Gewicht. Hast du 100 Items mit jeweils Gewicht 1, beträgt die Auswahlchance für jedes Item 1%. Fügst du ein weiteres Item mit Gewicht 1 hinzu, beträgt die Chance für alle 101 Items jeweils ungefähr 0,99%. Gibst du dem neuen Item stattdessen Gewicht 2, steigt das Gesamtgewicht auf 102. Ein Gewichtspunkt entspricht dann 1/102, also etwa 0,98%, und das neue Item erhält mit seinen zwei Punkten ungefähr 1,96% Auswahlchance. Bei Gewicht 100 beträgt das Gesamtgewicht 200. Da das neue Item die Hälfte davon ausmacht, hat es eine Auswahlchance von 50%.

Wie du siehst, ist dies gut geeignet, wenn du Listen von Hunderten von Dingen randomisieren möchtest.

Gaußsche Verteilung

Eine Gaußsche Verteilung ist eine glockenförmige mathematische Funktion.

Du fragst dich vielleicht, wie dies für das Beutesystem relevant ist. Eine Sache, die BetterStructures beim Festlegen von Beute in Truhen entscheiden muss, ist, wie viel Beute in diesen Truhen erscheint. Die Menge sollte konstant um eine bestimmte Zahl liegen, aber idealerweise nicht so vorhersehbar, dass das Öffnen einer Truhe weniger aufregend wird.

Um diesen semi-zufälligen Effekt zu erzielen, wird die Gaußsche Verteilung verwendet, um zu randomisieren, wie viele Items ausgewählt werden. Sobald diese Menge bestimmt ist, wählt die gewichtete Wahrscheinlichkeit ein Element aus der Seltenheitstabelle zufällig aus und berücksichtigt dabei die Gewichte.

Wie funktioniert also die Gaußsche Verteilung?

Glücklicherweise musst du dir keine Sorgen darüber machen, wie die Mathematik dahinter funktioniert, und kannst dich stattdessen auf die zwei Einstellungen konzentrieren, die sie modifizieren: Mittelwert und Standardabweichung.

Mittelwert

mean legt das Zentrum der Gaußschen Ziehung fest, mit der die Anzahl der Loot-Versuche bestimmt wird. Die Implementierung rundet auf, begrenzt negative Ergebnisse auf null und fügt dann einen Versuch hinzu. Ein Mittelwert von 5 bedeutet deshalb nicht, dass im Durchschnitt genau fünf Itemstapel ausgegeben werden.

Standardabweichung

standardDeviation steuert die Streuung dieser ersten Ziehung. Vor dem Runden liegen ungefähr 68% der Gaußschen Werte innerhalb einer Standardabweichung vom Mittelwert und ungefähr 95% innerhalb von zwei. Bei einem Mittelwert von 5 und einer Standardabweichung von 1 liegen daher etwa 68% der ursprünglichen Ziehungen zwischen 4 und 6. Größere oder kleinere Einstellungen verbreitern oder verengen diese Streuung.

Das sind Wahrscheinlichkeiten, keine festen Mindest- oder Höchstwerte. Wie viele Itemstapel tatsächlich ausgegeben werden, hängt außerdem von gültigen Loot-Einträgen und freien Inventarplätzen ab.

Standardmäßig beträgt der Mittelwert 4 und die Standardabweichung 3.


Implementierungsdetails

Das Verständnis, wie das Schatzsystem intern funktioniert, kann dir helfen, es effektiver zu konfigurieren:

Mindestanzahl an Loot-Versuchen

Bei einer nicht leeren eigenen Seltenheitsliste beträgt die Anzahl der Loot-Versuche max(ceil(gaussian(mean, standardDeviation)), 0) + 1. Durch den zusätzlichen Versuch ist der konfigurierte Mittelwert nicht der endgültige Durchschnitt an Stapeln. Es wird mindestens ein Versuch unternommen. Eine ungültige oder leere Itemtabelle, fehlgeschlagene Item-Erstellung oder ein abgebrochenes Truhenfüll-Event können die Truhe trotzdem leer lassen.

Zufällige Slot-Platzierung

Items werden auf zufällige Plätze in der Truhe verteilt, statt sie vom ersten Platz an der Reihe nach zu füllen. Jeder Stapel kommt in einen zufällig gewählten freien Platz, und vorhandene Inhalte werden nie überschrieben. Die Auswahl endet, sobald der Behälter keine freien Plätze mehr hat, und ein bereits voller Behälter erhält keine Beute, weder eigene noch Vanilla-Beute.

Fehlerbehandlung

Wenn ein Item-Material in deiner Minecraft-Version nicht existiert (zum Beispiel wenn eine ältere Konfiguration auf einer neueren Version verwendet wird, in der Items umbenannt wurden), wird dieses Item stillschweigend übersprungen, anstatt Fehler zu verursachen. Verzauberungseinträge, die sich nicht zu einem echten minecraft:-Verzauberungsschlüssel auflösen lassen, werden ebenfalls stillschweigend übersprungen, während ein procedurallyGeneratedItemSettings-Block, dessen Schlüssel ein nicht existierendes Material ist, eine Warnung mit dem Dateinamen protokolliert.

Ein fehlender oder ungültiger amount-Wert führt zu einer Warnung. Das eingelesene Minimum wird auf mindestens 1 angehoben, das Maximum auf mindestens dieses Minimum. Ein fehlender Wert wird zu 1, während 5-2 zu einer festen Menge von 5 wird. Bei fehlerhaften Bereichen kann ein erfolgreich eingelesenes Minimum erhalten bleiben. Korrigiere deshalb die Datei, statt dich auf diese Reparatur zu verlassen.

Verwende endliche, positive Gewichte für Seltenheiten und deren Items. Eine Seltenheit, deren Gewicht fehlt, null, negativ oder keine Zahl ist, wird ausgelassen. Ein Itemeintrag, dessen Gewicht fehlt, negativ oder keine Zahl ist, wird verworfen; nicht numerische und negative Werte protokollieren eine Warnung mit dem Dateinamen. Ein Item mit Gewicht 0 bleibt in der Tabelle, wird aber nie gewählt. Haben alle Items einer Seltenheit das Gewicht 0, fügt eine Auswahl, die auf diese Seltenheit fällt, nichts hinzu. Eine fehlgeschlagene Auswahl erzeugt während der geladenen Lebensdauer des Plugins nur einmal pro Warnungskategorie eine Warnung, nicht für jede Datei. Verlasse dich nicht darauf, dass jedes ungültige Gewicht eine Warnung auslöst.


Spezielles Format

Schatzdateien haben ein spezielles Format, das so aussieht:

isEnabled: true
mean: 4.0
standardDeviation: 3.0
vanillaTreasure: BURIED_TREASURE
items:
common:
weight: 60
items:
- amount: 1-1
material: STONE_PICKAXE
procedurallyGenerateEnchantments: true
weight: 1.0
- amount: 1-1
material: STONE_SHOVEL
procedurallyGenerateEnchantments: true
weight: 1.0
rare:
weight: 30
items:
- amount: 1-1
material: ANVIL
weight: 6.0
- amount: 1-6
material: BEETROOT
weight: 6.0
epic:
weight: 10
items:
- amount: 2-10
material: DIAMOND
weight: 1.0
- amount: 1-1
material: DIAMOND_AXE
weight: 6.0
procedurallyGeneratedItemSettings:
golden_sword:
bane_of_arthropods:
minlevel: 1
maxlevel: 5
chance: 0.2
looting:
minlevel: 1
maxlevel: 3
chance: 0.2

Dies ist ein gekürztes Beispiel. Mitgelieferte Schatzdateien enthalten größere Itemtabellen und Verzauberungseinstellungen. Einige Vorlagen verwenden andere Mittelwerte und Standardabweichungen. Die Nahrungstabelle für Fässer verwendet beispielsweise einen Mittelwert von 1 und eine Standardabweichung von 0.7.

isEnabled

SchlüsselWerteStandard
isEnabledBooleantrue

Dieses Feld wird gespeichert, aber der aktuelle Schatzlader und die Beuteauswahl verwenden es nicht zum Abschalten einer Tabelle. false allein stoppt die Beute nicht. Deaktiviere die betreffende Struktur oder den Generator oder verwende für Fässer den Schalter für Fassbeute.


mean

SchlüsselWerteStandard
meanDouble4

Setze den mean. Lies die Details dazu hier.


standardDeviation

SchlüsselWerteStandard
standardDeviationDouble3

Setze die standardDeviation. Lies die Details dazu hier.


vanillaTreasure

SchlüsselWerteStandard
vanillaTreasureStringkeiner, außer in den mitgelieferten vanilla_*-Dateien

Legt eine optionale Vanilla-Minecraft-Beutetabelle zusätzlich zur benutzerdefinierten Beute fest. Verwende Bukkits LootTables-Enum-Werte, beispielsweise BURIED_TREASURE, SHIPWRECK_TREASURE oder SIMPLE_DUNGEON. Groß- und Kleinschreibung spielen keine Rolle. Die Vanilla-Auswahl erfolgt nach der eigenen Beute und verwendet die verbleibenden leeren Plätze. Ohne diese Einstellung wird nur eigene Beute verwendet. Ungültige Namen erzeugen eine Warnung und deaktivieren den Vanilla-Anteil.

Die mitgelieferten Vanilla-Schatzdateien verwenden ihre passende Tabelle, wenn der Schlüssel fehlt: vanilla_bastion_treasure.yml verwendet BASTION_TREASURE, vanilla_buried_treasure.yml verwendet BURIED_TREASURE, vanilla_end_city_treasure.yml verwendet END_CITY_TREASURE, vanilla_fishing_treasure.yml verwendet FISHING_TREASURE und vanilla_shipwreck_treasure.yml verwendet SHIPWRECK_TREASURE. Jede andere Datei benötigt das Feld ausdrücklich; ein vanilla_*-Name allein wählt keine Beutetabelle aus.


items

Hier wird es knifflig, da viele Optionen von Admins gesetzt werden können. Schauen wir uns das Konfigurationsdatei-Beispiel von vorhin genauer an.

items:
common:
weight: 60
items:
- amount: 1-1
material: STONE_PICKAXE
procedurallyGenerateEnchantments: true
weight: 1.0
- amount: 1-1
material: STONE_SHOVEL
procedurallyGenerateEnchantments: true
weight: 1.0
rare:
weight: 30
items:
- amount: 1-1
material: ANVIL
weight: 6.0
- amount: 1-6
material: BEETROOT
weight: 6.0

Hier siehst du, dass unter dem items-Konfigurationsschlüssel eine Map mit common und rare steht. Dies sind rarities (Seltenheiten)!


rarities​

Seltenheiten haben keinen festen Namen. Du kannst sie hinzufügen oder entfernen und sie so anpassen, wie du möchtest, solange du dasselbe Format verwendest.

Beachte, dass was diese Seltenheitstabellen mehr oder weniger selten macht, das weight der Beutetabelle ist!

Standardmäßig:

  • common hat ein Standard-weight von 60
  • rare hat ein Standard-weight von 30
  • epic hat ein Standard-weight von 10

Das macht gewöhnliche Items 6x wahrscheinlicher als epische Items. Du kannst mehr über weights hier lesen!

Neben dem Gewicht hat jede Seltenheitstabelle ihre eigene Liste von items.


Items einer Seltenheitsstufe​

Seltenheits-Items sind eine Map-Liste, die alle Items auflistet, die die Seltenheitstabelle hat.

Diese Items haben die folgenden Einstellungen:

SchlüsselWerteStandard
amountmin-max Integervariabel
materialMaterialvariabel
procedurallyGenerateEnchantmentsBooleanvariabel
weightDoublevariabel

amount​


Legt die Dropmenge fest. Dies kann als Bereich amount: MIN-MAX oder als einzelner Wert amount: VALUE für feste Mengen ausgedrückt werden. Beispiele:

  • Variable Menge: amount: 1-5 (droppt zwischen 1 und 5 Items)
  • Feste Menge: amount: 3 (droppt immer genau 3)

material​

Legt das Material anhand der Spigot API-Namen des potenziell zu droppenden Items fest.


Sonderfall: serialized​

/bs lootify schreibt eine serialized-Map mit Bukkits Item-Serialisierung und erhält dabei die Daten des gehaltenen Items. Lass den Befehl diese Map erzeugen, statt sie manuell zu erstellen. Verwende pro Eintrag nur eine Itemquelle: material, serialized oder mmoitem. Wenn auch ein gültiges material vorhanden ist, hat es Vorrang vor dem serialisierten Item oder MMOItems-Item. Prozedurale Verzauberungen gelten nur für Materialeinträge.


mmoitem​

Legt ein benutzerdefiniertes Item vom MMOItems-Plugin fest. Dies ist eine Alternative zum material-Feld für die Verwendung benutzerdefinierter Items anstelle von Vanilla-Minecraft-Materialien.

Das Format ist: mmoitem: TYPE@ITEMNAME

Beispiel:

- amount: 1-1
mmoitem: SWORD@Excalibur
weight: 1.0

Dies erfordert MMOItems. mmoitems wird ebenfalls als Feldalias akzeptiert. Ungültige Itemabfragen führen normalerweise zu einer Warnung und überspringen den Eintrag. Fehlendes MMOItems ist jedoch nicht sicher abgefangen. Fehlende Klassen können das Laden der Inhalte scheitern lassen. Installiere die Abhängigkeit oder entferne diese Einträge, bevor du die Datei lädst.


info​

Optionales Feld zum Hinzufügen von Notizen oder Kommentaren zu Item-Einträgen. Dieses Feld wird vom Plugin komplett ignoriert und existiert ausschließlich für administrative Dokumentationszwecke. Verwende es, um dich daran zu erinnern, warum bestimmte Items auf bestimmte Weise konfiguriert sind.

Beispiel:

- amount: 1-1
material: DIAMOND_SWORD
weight: 1.0
info: "Rare drop for completing the dungeon"

weight​

Legt das Gewicht für die gewichtete Chance fest. Mehr dazu hier.


procedurallyGenerateEnchantments​

Legt fest, ob das Item basierend auf den Einstellungen in procedurallyGeneratedItemSettings prozedural generiert werden soll. Beachte, dass dies basierend auf den Einstellungen dazu führen kann, dass ein Item ohne Verzauberungen generiert wird.

procedurallyGeneratedItemSettings

Schauen wir uns unser Konfigurationsdatei-Beispiel noch einmal an:

procedurallyGeneratedItemSettings:
golden_sword:
bane_of_arthropods:
minlevel: 1
maxlevel: 5
chance: 0.2
looting:
minlevel: 1
maxlevel: 3
chance: 0.2

Wie du siehst, listet diese Datei Materialtypen auf, gefolgt von Verzauberungen und dann Mindest- und Höchststufen sowie einer Chance.

Dieser Abschnitt akzeptiert Bukkit-Materialien und registrierte Verzauberungen im Namensraum minecraft:. Andere Verzauberungsnamensräume werden übersprungen. Verwende einen serialisierten Itemeintrag, wenn du ein Item eines anderen Plugins unverändert erhalten möchtest.

Hat eine Schatzdatei keinen Abschnitt procedurallyGeneratedItemSettings, schreibt BetterStructures seine Standard-Verzauberungstabelle in die Datei. Eine Datei, die den Abschnitt bereits hat, verwendet nur die darin aufgeführten Einträge.

Bezüglich der Verzauberungseinstellungen:

SchlüsselWerteStandard
minlevelIntegervariabel
maxlevelIntegervariabel
chanceChancevariabel

minlevel​

Legt die minimale Verzauberungsstufe fest. Sie muss mindestens 1 betragen und darf maxlevel nicht überschreiten.


maxlevel​

Legt die maximale Verzauberungsstufe fest, die bei der Zufallsauswahl eingeschlossen ist. Das Plugin begrenzt sie nicht auf das Vanilla-Limit, sondern fügt Verzauberungen unter Umgehung von Bukkits Stufenbeschränkungen hinzu. Ungültige Zahlenwerte oder umgekehrte Bereiche können das Laden oder die Item-Erstellung verhindern.


chance​

Legt die Wahrscheinlichkeit fest, dass die Verzauberung angewendet wird, als Dezimalwert zwischen 0,0 (nie) und 1,0 (immer). Zum Beispiel bedeutet ein Wert von 0,2 eine 20%ige Chance. Dies verwendet eine einfache Wahrscheinlichkeitsprüfung, nicht gewichtete Wahrscheinlichkeit wie das Item-Auswahlsystem.


Fehlerbehebung

Items erscheinen nicht in Truhen

  • Prüfe, ob Struktur und Generator aktiviert sind und auf eine gültige Schatzdatei verweisen. Ein Schematic-Override benötigt trotzdem eine gültige Schatzdatei im Generator.
  • Prüfe die Konsole auf Warnungen über ungültige Materialien oder Items
  • Stelle sicher, dass MMOItems installiert ist, wenn benutzerdefinierte Items verwendet werden
  • Materialien müssen exakte Spigot-API-Namen verwenden

Verzauberungen werden nicht angewendet

  • Setze procedurallyGenerateEnchantments: true beim Item
  • Überprüfe, ob Verzauberungsnamen mit Minecrafts Namespaced Keys übereinstimmen
  • Prüfe, ob Min-/Max-Stufen innerhalb der gültigen Bereiche für diese Verzauberung liegen
  • Denke daran, dass chance-Werte Wahrscheinlichkeiten sind (0,2 = 20%), keine Garantien

Benutzerdefinierte Plugin-Verzauberungen funktionieren nicht

Es werden ausschließlich Verzauberungen gelesen, die unter dem Vanilla-Namensraum minecraft: registriert sind. Alles andere in einem procedurallyGeneratedItemSettings-Block wird ohne Warnung übersprungen – eine benutzerdefinierte Verzauberung, die stillschweigend nichts tut, ist also das erwartete Symptom und kein Fehler. Frage beim Autor des Verzauberungs-Plugins nach der Kompatibilität.

Leere Truhen erscheinen

Das Minimum gilt für Loot-Versuche, nicht für erfolgreich erzeugte Items. Wenn du leere Truhen siehst, überprüfe:

  • Ob die Truhe von BetterStructures befüllt wird (nicht von einem anderen Plugin)
  • Ob alle Items in deiner Schatzdatei gültig sind (prüfe Konsolenwarnungen)
  • Ob die Schatzdatei tatsächlich geladen wird (prüfe die Startprotokolle)