Der Shop ist zurück!

Nur knapp 3 Jahre hat es gedauert, jetzt ist der Shop zurück und erlaubt endlich wieder ein normales Spielen auf dem Server, wobei ihr überschüssige Items verkauft und das Geld in neue Grundstücke oder andere dringend benötigte Items investiert.

Damit wäre es das für diese News auch schon gewesen. Weil der Weg dorthin jedoch unzählige Stunden Arbeit bedeutet hat und auch von Spielern immer wieder die Frage aufkam, was denn eigentlich alles dafür getan werden muss, haben wir uns dazu entschlossen, euch an dieser Stelle eine kurze Zusammenfassung zu geben.

Wie fängt man also am besten an?

Teil 1: Eine Gesamtliste mit Gegenständen und Preisen erstellen

Zunächst benötigt man eine aktuelle Liste mit allen Gegenständen, die es in Minecraft gibt. Diese muss die ID (z.B. minecraft.oak_planks) und nach Möglichkeit auch den deutschen Namen des Gegenstands (in diesem Fall dann Eichenholzbretter) beinhalten. Leider stellt man bereits an diesem Punkt fest, dass es gar nicht so leicht ist, eine solche Liste zu bekommen und da es inzwischen in Minecraft mehr als 1.000 Gegenstände gibt, möchte man diese auch nicht von Hand zusammenstellen. Wir haben uns eine solche Liste mithilfe der offiziellen deutschen Übersetzung von Minecraft erzeugt. Jede Minecraft-Installation beinhaltet eine Textdatei für jede unterstützte Sprache, in der jeglicher im Spiel vorhandener Text in die jeweilige Sprache übersetzt wird. Dies beinhaltet natürlich auch die Übersetzung für alle Gegenstände. Die Zeile für unser Beispiel Eichenholzbretter sieht zum Beispiel so aus:

"block.minecraft.oak_planks": "Eichenholzbretter",

Glücklicherweise haben die Entwickler sich hier dazu entschieden, die ID (minecraft.oak_planks) des Gegenstands zum Zuordnen des übersetzten Textes zu verwenden, sodass lediglich ein paar überflüssige Bestandteile abgeschnitten und alle sonstigen Einträge entfernt werden müssen, um eine vollständige Liste für alle Gegenstände zu erhalten. Mit ein bisschen Übung in Textverarbeitung erzeugt man sich so in wenigen Minuten eine fertige Liste und hat dann neben den IDs auch die offiziellen deutschen Übersetzungen zu jedem Gegenstand parat.

Im nächsten Schritt wird damit begonnen, Preise für die Gegenstände zu definieren. Da hierbei einige Rechnungen automatisiert durchgeführt werden sollen, wird die zuvor erstellte Liste in ein Tabellenkalkulationsprogramm wie beispielsweise Microsoft Excel, LibreOffice Calc oder Google Tabellen überführt. Wir haben uns für Letzteres entschieden, da es ein sehr gut funktionierendes gemeinsames Arbeiten an Tabellen ermöglicht und kostenlos zur Verfügung steht.

Liste mit Gegenständen in Google Tabellen

Die Tabelle wird um eine neue Spalte für den Preis erweitert. Die Preise werden für alle Gegenstände in mehreren Durchläufen festgelegt. Begonnen wird mit allen Gegenständen, für die es ein Rezept zur Herstellung gibt. Ein Akazienholzboot kann aus 5 Akazienholzbrettern hergestellt werden. Es gibt dafür genau ein Rezept.

Rezept zur Herstellung eines Akazienholzboots

Dieses Rezept wird in dem Tabellenkalkulationsprogramm mit einer Formel abgebildet. Die Formel für das Akazienholzboot ist =(C9*5)/1 Wörtlich kann man diese in etwa wie folgt ausdrücken: Der Preis für 1 Akazienholzboot ergibt sich aus 5x dem Preis für Akazienholzbretter, dessen Wert in der C-Spalte in der 9. Reihe steht, daher C9.

Berechnung des Preises für ein Akazienholzboot mithilfe einer Formel

Das Ist gleich-Zeichen zu Beginn ist erforderlich, damit das Programm erkennt, dass es sich hierbei um eine Formel handelt. Die Klammern sind in dieser Rechnung nicht erforderlich und dienen lediglich der besseren Übersicht. Das abschließende Teilen des Wertes durch 1 hat natürlich ebenfalls keinen Effekt auf das Ergebnis und dient lediglich der Übersicht. Erhält man jedoch mehrere Gegenstände aus einem Rezept (z.B. 6 Bretter ergeben 3 Türen), dann muss durch die Anzahl geteilt werden, um den Preis für einen Gegenstand zu erhalten. Da beim händischen Eintragen von hunderten Rezepten auch mal Fehler passieren, hilft es enorm, die Formeln immer nach dem gleichen Prinzip lesen zu können, weshalb wir immer Werte geklammert und gegebenenfalls auch durch 1 geteilt haben.

Dieses Prinzip wird auf alle Einträge angewandt, dessen Gegenstände ein oder mehrere Rezepte im Spiel besitzen. Gibt es für einen Gegenstand mehrere Rezepte und enthalten diese auch noch mehrere verschiedene Gegenstände als Zutat, kann so eine Formel schnell etwas länger werden. Für beispielsweise die Seelenfackel, die entweder mit Holzkohle oder mit Steinkohle und jeweils Seelensand oder Seelenerde sowie immer einem Stock hergestellt wird, ergeben sich vier Rezepte und folgende Formel: =MIN(((D1127*1+D1076*1+D202*1)/4),((D1127*1+D1076*1+D181*1)/4),((D1127*1+D1077*1+D202*1)/4),((D1127*1+D1077*1+D181*1)/4)) Das MIN() steht hierbei für Minimum und wählt den günstigsten der vier resultierenden Preise aus, da später nur dieser interessiert, damit niemand einen Gegenstand günstiger herstellt und gewinnbringend verkauft.

Nachdem alle Rezepte aus dem Spiel übertragen und dabei weitere kleine Probleme, wie zyklische Abhängigkeiten von Rezepten oder Brennpreise für Öfen usw. gelöst wurden, sollte mehr als die Hälfte der Gegenstände in der Tabelle einen Preis haben, der in irgendeiner Weise von den Preisen anderer Gegenstände abhängt.

Im nächsten Schritt wird nun allen Gegenständen, für die es kein Rezept gibt, ein Preis zugeordnet. Hierfür muss für jeden Gegenstand von Hand festgelegt werden, wie viel er im Verhältnis zu einem anderen Gegenstand wert ist. Wir haben uns für BigCraft z.B. dazu entschieden, Netherwarzen preislich sehr ähnlich zu Karotten oder Kartoffeln einzuordnen, da alle Pflanzen gefahrlos in der Stadt gezüchtet werden können. Der Faktor, dass Netherwarzen zu Beginn etwas schwerer zu erlangen sind, ist in unserem Fall zu vernachlässigen, da man einfach einen Samen im Shop kaufen oder nett einen Nachbarn fragen kann. An dieser Stelle wird jeder Server abhängig von seiner Spielweise auf andere Preisverhältnisse kommen.

Am Ende dieser Schritte sollte nach Möglichkeit nur noch ein Gegenstand übrig bleiben, für den ein tatsächlicher numerischer Preis angegeben wird und aus dem sich dann die Preise aller anderen Gegenstände ableiten. Im Fall von BigCraft wurde hierfür ein Eichenholzstamm gewählt. 64 Eichenholzstämme kosten 20,00 BP (BigPoints).

Die fertige Tabelle „Gesamtliste“ mit Namen und Preisen für alle Gegenstände

Teil 2: Kategorien erstellen und Gegenstände zuordnen

Zur Umsetzung des Shops kommt auf BigCraft das Plugin BossShopPro zum Einsatz. Mit diesem lässt sich von überall durch Ausführen des /shop Befehls auf den Shop zugreifen. Als Oberfläche kommen Inventar-basierte Menüs zum Einsatz.

Für diese Menüs müssen Kategorien erstellt und die im Shop angebotenen Gegenstände diesen zugeordnet werden. Dazu empfiehlt es sich, im Spiel ein solches Menü mit Truhen nachzubauen. Für BigCraft haben wir dies in doppelter Ausführung getan, um mögliche Unterschiede der angebotenen Gegenstände im An- und Verkauf abbilden zu können.

Shop für An- und Verkauf im Spiel mit Truhen nachgebaut

Sobald geklärt ist, welche Gegenstände in welcher Anzahl in welche Kategorie gehören, werden diese Angebote von Hand in eine neue Tabelle übertragen.

Neue Tabelle „Angebote“ zur Festlegung, welche Gegenstände in welchen Kategorien an- bzw. verkauft werden

In der neuen Tabelle werden die Einträge in den Spalten ID, Name und Basis-Einzelpreis mit den gleichnamigen Gegenstücken aus der ersten Tabelle verknüpft. Dadurch werden automatisch die Werte aus der ersten Tabelle in die neue zweite Tabelle übernommen und auch bei späteren Änderungen entsprechend aktualisiert. In Folge sind Korrekturen und Anpassungen an den Preisen jederzeit sehr einfach und komfortabel umsetzbar.

Abschließend wird eine dritte Tabelle erstellt, in der festgelegt wird, welche Kategorien zu welchen anderen Kategorien gehören. Hier kann entweder zu jeder Kategorie die obergeordnete Eltern-Kategorie notiert werden, zu der diese gehört oder eine Liste mit untergeordneten Kinder-Kategorien. Wir haben uns für das Speichern der Eltern-Kategorie zu jeder Kategorie entschieden, da sich dies unkompliziert mit einem Eintrag zu jeder Kategorie umsetzen lässt.

Neue Tabelle „Kategorien“ zur Zuordnung von Kategorien zu anderen Kategorien

Mit den beiden Tabellen für Angebote und Kategorienzuordnungen liegen alle benötigten Informationen vor, um daraus echte Shops zu erstellen.

Teil 3: Konvertieren in Plugin-Konfigurationsdateien

Wie anfänglich erwähnt, setzen wir für den Shop auf BigCraft das Plugin BossShopPro ein. Dieses verwendet Konfigurationsdateien, in denen beschrieben wird, wie der Shop aufgebaut ist. In diesem Abschnitt geht es darum, wie aus den beiden Tabellen für das Plugin lesbare Konfigurationsdateien generiert werden.

Im ersten Schritt wird mithilfe der Dokumentation für das Plugin ermittelt, wie solche Konfigurationsdateien grundlegend aufgebaut sind. Etwas vereinfach lässt sich zusammenfassen, dass für jede neue Seite im Shop eine eigene Konfigurationsdatei erstellt wird. Der Inhalt der einzelnen Seiten kann beliebig zusammengestellt werden.

Damit ergeben sich mehrere Möglichkeiten, wie ein Shop grundsätzlich aufgebaut werden kann. In der Vergangenheit haben wir auf BigCraft bereits im Hauptmenü des Shops zwischen Einkauf und Verkauf unterschieden und damit quasi zwei vollständige Shops parallel zueinander angeboten. Dies hat gelegentlich zu Verwechslungen mit Fehleinkäufen bzw. Fehlverkäufen geführt, da die Shops optisch identisch aufgebaut waren und auch der Begriff „Verkauf“, je nachdem, ob er aus Spielersicht „Ich möchte etwas verkaufen“ oder aus Shop-Sicht „Der Shop verkauft etwas“ betrachtet wird, eine gegensätzliche Bedeutung hat. Für den neuen Shop haben wir uns daher dazu entschieden, die Auswahl zwischen Ein- und Verkauf ganz ans Ende zu verlagern, sodass sich beim Klick auf einen angebotenen Gegenstand eine neue Seite öffnet, in der auf der einen Seite des Menüs eingekauft und auf der anderen Seite verkauft werden kann. Durch diese Trennung in linke und rechte Seite erhoffen wir uns, dass es künftig deutlich seltener zu Verwechslungen kommt.

Shop-Menü für Knochen, links zum Einkaufen, rechts zum Verkaufen

Ein weiterer Vorteil von diesem Ansatz mit einer eigenen Seite für jeden Gegenstand ist, dass wir es uns prinzipiell möglich ist, für jeden Gegenstand unterschiedliche Stapelgrößen im Ein- und Verkauf anzubieten. In der jetzt veröffentlichten Version des Shops gibt es aktuell nur jeweils ein Angebot, in Zukunft werden wir von dieser Möglichkeit jedoch Gebrauch machen und hier weitere sinnvolle Stapelgrößen wie beispielsweise „ein Inventar voll“ anbieten.

Für den Shop ergeben sich mit dieser Festlegung zwei Arten von Konfigurationsdateien, jene für Kategorien und jene für Gegenstände. Für die obige Shopseite mit Knochen sieht die fertige Konfiguration wie folgt aus:

ShopName: item_mob-drops_bone
DisplayName: Knochen
signs:
  text: '[item_mob-drops_bone]'
  NeedPermissionToCreateSign: true
shop:
  Verkauf:
    PriceType: money
    RewardType: item
    Price: 0.63
    Reward:
    - - type:bone
      - amount:16
    MenuItem:
    - type:bone
    - amount:16
    - name:&b16x Knochen
    - 'lore:&2Preis: 0,63 BPs#&f(Anklicken zum Einkaufen)'
    Message: '&8[&f⚖&8] &fDu hast 16x Knochen für 0,63 BPs gekauft.'
    InventoryLocation: 12
    ExtraPermission: ''
  Ankauf:
    PriceType: item
    RewardType: money
    Price:
    - - type:bone
      - amount:64
    Reward: 2
    MenuItem:
    - type:bone
    - amount:64
    - name:&b64x Knochen
    - 'lore:&2Erlös: 2 BPs#&f(Anklicken zum Verkaufen)'
    Message: '&8[&f⚖&8] &fDu hast 64x Knochen für 2 BPs verkauft.'
    InventoryLocation: 16
    ExtraPermission: ''
  Trenner1:
    PriceType: nothing
    RewardType: nothing
    MenuItem:
    - type:gray_stained_glass_pane
    - amount:1
    Message: ''
    InventoryLocation: 5
    ExtraPermission: ''
  Trenner2:
    PriceType: nothing
    RewardType: nothing
    MenuItem:
    - type:gray_stained_glass_pane
    - amount:1
    Message: ''
    InventoryLocation: 14
    ExtraPermission: ''
  Trenner3:
    PriceType: nothing
    RewardType: nothing
    MenuItem:
    - type:gray_stained_glass_pane
    - amount:1
    Message: ''
    InventoryLocation: 23
    ExtraPermission: ''
  Back:
    PriceType: nothing
    RewardType: shop
    Reward: menu_mob-drops
    MenuItem:
    - type:player_head
    - amount:1
    - name:&bZurück zu Mob-Drops
    - customskull:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2RjOWU0ZGNmYTQyMjFhMWZhZGMxYjViMmIxMWQ4YmVlYjU3ODc5YWYxYzQyMzYyMTQyYmFlMWVkZDUifX19
    Message: ''
    InventoryLocation: 50
    ExtraPermission: ''

Wie zu sehen, werden solche Konfigurationsdateien schnell sehr lang und umfangreich, entsprechend ergibt es Sinn, sich für die Erzeugung dieser ein kleines Skript oder Programm zu schreiben. Der alte Shop wurde mit einen Shell-Script erstellt. Für den neuen Shop haben wir ein eigenes kleines .NET Programm geschrieben. Da es schwierig ist, Programmcode „spannend“ zu erklären, hier nur ein paar Stichpunkte zur groben Funktionsweise:

  • Die beiden Tabellen für Angebote und Kategorienzuordnung werden als CSV-Dateien gespeichert und dem Programm übergeben.
  • Das Programm liest die beiden Dateien aus und wandelt die Inhalte in viele kleine Objekte um.
  • Mit etwas Programmcode lassen sich diese Objekte sehr komfortabel umsortieren und miteinander in Verbindung bringen. Auf diese Weise werden die Informationen aus den Tabellen so umgebaut, dass sich damit neue Objekte befüllen lassen, die identisch zu den benötigten Konfigurationsdateien aussehen.
  • Abschließend werden die Inhalte aus den neuen Objekten in .yml-Dateien gespeichert.

Praktisch steckt natürlich etwas mehr dahinter und wie üblich gab es auch hier ein paar unerwartete Hindernisse, die es zu überwinden galt. So dichtet beispielsweise die Software-Bibliothek, die zum Speichern als .yml-Dateien eingesetzt wird, bei manchen Zahlenwerten ein paar Nachkommastellen hinzu, wie in diesem Bugreport von uns geschildert. Für das und andere kleine Probleme galt es Lösungen zu finden.

Das fertige Programm erfüllt seinen Zweck und wandelt die beiden Tabellen für unseren Shop in unter einer Sekunde in über 1000 Konfigurationsdateien um. Zusätzlich lässt es sich leicht anpassen, sodass auch künftige Änderungen wie das Hinzufügen von neuen Stapelgröße schnell ergänzt werden können. Und natürlich erspart es eine Menge Zeit im Vergleich dazu, all die Konfigurationsdateien von Hand zu erstellen bzw. anzupassen.

Teil 4: Konfigurationsdateien hochladen und Testen

Zum Schluss wird das Plugin auf dem Server installiert und die erzeugten Shop-Konfigurationsdateien hochgeladen. Damit das Plugin genutzt werden kann, werden Berechtigungen für die jeweiligen Benutzergruppen vergeben. In einem abschließenden Test wird der Shop noch einmal überprüft und gegebenenfalls letzte Feinheiten überarbeitet.

Und dann ist der Shop endlich fertig!

Anhang 1: Statistiken

  • Der Shop besteht aus 1058 Konfigurationsdateien:
    • 1 Startseite
    • 123 Kategorien, davon:
      • 17 Hauptkategorien
      • 105 Unterkategorien
    • 934 Gegenständen, davon:
      • 835 verschiedene Gegenstände
      • 99 erneut in anderen Kategorien angebotene Gegenstände
  • Die Arbeiten für den neuen Shop erfolgten im Zeitraum von April 2021 bis Januar 2022
  • Die Datei mit den Tabellen wurde an 41 verschiedenen Tagen bearbeitet
    • 2021-04: an 3 Tagen
    • 2021-05: an 2 Tagen
    • 2021-06: an 3 Tagen
    • 2021-07: an 2 Tagen
    • 2021-08: an 14 Tagen
    • 2021-09: an 6 Tagen
    • 2021-10: an 4 Tagen
    • 2021-11: an 2 Tagen
    • 2021-12: an 0 Tagen
    • 2022-01: an 5 Tagen
  • Von Februar bis August fehlte die Motivation Anhang 2 in diesem Beitrag fertigzustellen.
  • Im August wurden mit dem Update auf Minecraft 1.19 „schnell“ noch die neu hinzugekommenen Gegenstände ergänzt.

Anhang 2: Das Problem mit der Farmbarkeit von Gegenständen

Wie mit dieser „kurzen“ Zusammenfassung hoffentlich deutlich geworden ist, erfordert das Erstellen eines Shops, wie wir ihn anbieten, einiges an Zeit und technischer Kenntnis. Es ist uns ein persönliches Anliegen, an dieser Stelle noch einen weiteren Faktor aufzuzeigen, der uns sehr beeinflusst und die Fertigstellung des Shops gravierend verzögert hat: Motivation

Beim Festlegen des Preises für einen Gegenstand ist es erforderlich, zu schätzen, wieviel Aufwand ein Spieler betreiben muss, um einen Gegenstand zu erhalten. Ein Beispiel: Aus einem Knochen kann ich Knochenmehl herstellen und dieses als Dünger für viele Pflanzenarten verwenden. Um einen Knochen zu erhalten, muss der Spieler ein Skelett töten, welches ihn im ungünstigsten Fall umbringen kann. Um diesen Knochenjob also ein wenig zu honorieren, sollten ein paar Knochen auch ein kleines Sümmchen beim Verkauf an den Shop einbringen. „Leider“ erlaubt es Minecraft mit seiner vollständig editierbaren Welt, groß angelegte Fallen für so ziemlich jede Art von Mob zu bauen, sogenannte Mobfarmen. In diesen werden hunderte Mobs (nahezu) vollständig getötet und deren Items eingelagert. Dies bringt einen beim Festlegen eines Preises in die unangenehme Lage, dass viele Gegenstände entwertet werden müssten, wenn verhindert werden soll, dass Spieler durch Betreiben einer solchen Mobfarm in kurzer Zeit enorme Summen erlangen können und damit eine Inflation des Geldsystems auslösen.

In der Startphase der Erneuerung des Shops haben wir versucht, alle „farmbaren“ Gegenstände im Verkauf an den Shop zu entwerten. Wir haben diesen Ansatz jedoch verworfen, als uns klar wurde, wie viele Gegenstände von diesem Problem betroffen sind. Denn leider erstreckt sich das Problem der durch Mobs fallen gelassenen Gegenständen über Rezepte und Spielmechaniken auch auf viele weitere Gegenstände. Ein Knochen beispielsweise lässt sich in Knochenmehl umwandeln, mit dem Blumen automatisiert gepflanzt und geerntet werden können, woraus sich wiederum Farbstoffe gewinnen lassen, die wiederum in vielen Produkten stecken und so weiter.

Mit dem persönlichen Ziel, ein faires Spielerlebnis für jeden gleichermaßen zu erstellen, ist es extrem frustrierend zu sehen, wie unglaublich weit sich diese Problematik inzwischen durch das Spiel zieht. Auch alternative Ansätze wie das Verfolgen der Herkunft eines Items zur differenzierten Bewertung oder das Verhindern des „Farmens“ von Gegenständen an sich, erweisen sich als ausgesprochen komplex und in vielen Fällen praktisch nicht umsetzbar.

Final haben wir uns dazu entschieden, Gegenstände für den kleinen Mann zu bewerten, für den den Jäger, der Herausforderungen liebt und sich nachts unter Einsatz seines virtuellen Lebens durch Horden von Mobs schnetzelt, für den leidenschaftlicher Gärtner, der sich mühevoll um jede seiner Pflanzen einzeln kümmert, für all diejenigen Spieler, die ihre hart erarbeiteten wenigen Gegenstände verkaufen wollen. Es ist damit bei uns jedem Spieler selbst überlassen, für sich zu entscheiden, wie er spielen möchte. Wir bitten lediglich jeden darum, nicht mit „faul“ verdientem Geld anzugeben.

2 Kommentare

  1. Ist der Shop mittlerweile wieder inaktiv?

    1. Author

      Ja, gibt leider gerade einen Bug mit dem Plugin ausgelöst durch eine Änderung in der API der Serversoftware, der erst behoben werden muss.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert