Zum Hauptinhalt springen

Shops

Shop-Menüs mit festen, dynamischen oder Tauschpreisen, Lagerbestand, Limits, Steuern und drei Währungsarten.

Kostenlosv1.12Wirtschaft & Crafting
BenötigtTypeWriter0.9GUI0.17+VaultoptionalPlaceholderAPIoptionalDiscordoptional

Überblick​

Mit Shops können Spieler Items über ein Inventarmenü kaufen und verkaufen, das du im TypeWriter-Web-Panel baust. Ein Shop ist ein einziger Shop Definition-Entry: Er enthält die Liste der angebotenen Items, ihre Preise, die Währung, die Limits, die Nachrichten und das Menü-Layout. Ein Spieler öffnet ihn mit /tw shop <id> oder über eine Open Shop-Aktion, die von einer Quest, einem NPC oder einem Button eines anderen Menüs ausgelöst wird.

Jedes Item wird auf eine von drei Arten bepreist: mit einem festen Preis, mit einem dynamischen Preis, der dem Bestand folgt, oder per Tauschhandel, bei dem das Item statt mit Geld mit anderen Items bezahlt wird. Käufe und Verkäufe laufen über Vault, eine PlaceholderAPI-Wirtschaft oder ein eingebautes Punktekonto.

Das Menü selbst wird mit der Erweiterung GUI gezeichnet. Du platzierst in einem Layout Marker, an denen Produkte erscheinen (SHOP_ITEM), sowie markierte Buttons zum Blättern, Schließen und für Mengen, und Shops befüllt sie für jeden Spieler.

Funktionen​

  • Feste, dynamische und Item-Preise — ein fester Preis pro Einheit, ein Preis, der steigt, wenn der Bestand sinkt, oder eine Liste von Items, die abgegeben werden müssen.
  • Tauschhandel — priceMode ITEMS verkauft einen Artikel gegen ein oder mehrere Items, mit einem shopweiten Standardpreis und dem Lore-Token {item_price}.
  • Drei Währungen — VAULT, PLACEHOLDER (Kontostand aus einem PlaceholderAPI-Platzhalter gelesen, mit Konsolenbefehlen verändert) und ein eingebautes POINTS-Konto.
  • Klickaktionen und Mengen — 1, einen Stack, das Maximum, alles, eine eigene Menge aus einem Dialog oder eine feste Menge wie 10 in einem Untermenü kaufen oder verkaufen.
  • Bestand, Limits und Resets — Bestand pro Item, Limits pro Spieler und globale Limits, shopweite Kauf- und Verkaufsobergrenzen sowie Resets per Cron, Intervall, täglich, wöchentlich oder monatlich.
  • Steuern und Aktionen — eine globale Steuer, Steuerüberschreibungen pro Item und zeitlich begrenzte prozentuale Rabatte.
  • Menü im Panel — Layout-Pool, Untermenü, Füll-Item, Preis-Lore sowie Standardformate für Name und Lore.
  • Tab eines gemeinsamen Menüs — ein Shop kann über baseMenuId zu einer Ansicht eines größeren GUI-Grundgerüsts werden.
  • Admin-Befehle — auflisten, untersuchen, öffnen, zurücksetzen, Bestand bearbeiten und den Transaktionsverlauf lesen.
  • Discord-Ankündigungen — Transaktionen werden als Event angekündigt, das die Erweiterung Discord an einen Webhook weiterleitet.

Installation​

  1. Installiere die Erweiterung GUI (Version 0.17 oder neuer) und TypeWriter auf einem Paper- oder Folia-Server.
  2. Optional, für die Währung VAULT: Installiere Vault und ein Wirtschafts-Plugin, das sich dort registriert.
  3. Optional, für Platzhalter in Titeln und Lore sowie für die Währung PLACEHOLDER: Installiere PlaceholderAPI.
  4. Lade die Shops-JAR von den GitHub-Releases herunter (der Button im Übersichtspanel oben), lege sie in plugins/Typewriter/extensions/ ab und starte den Server neu.
  5. Erstelle im Web-Panel einen Shop Artifact-Entry und nenne ihn shop_artifact. Shops liest und schreibt Bestand, Limits und Punkte über diesen Entry.

Erste Schritte​

Baue einen kleinen Waffenshop, der mit Vault-Geld bezahlt wird:

  1. Füge auf einer statischen Page einen Shop Artifact-Entry mit dem Namen shop_artifact hinzu.
  2. Füge einen Shop Definition-Entry hinzu. Setze title auf <gold>Weapons, rows auf 3 und currency auf VAULT.
  3. Füge in items ein Item hinzu. Wähle in item ein Diamantschwert, setze name auf <aqua>Sword, priceMode auf FIXED, fixedBuyPrice auf 500 und fixedSellPrice auf 100. Lass primaryAction auf BUY_1 und secondaryAction auf SELL_1.
  4. Füge in layoutPool ein simple-Layout mit der id main hinzu und trage main in mainLayoutId ein. Füge ihm ein Item mit buttonPrefix shop_button:, buttonType SHOP_ITEM, x 1, y 1, count 7 und direction right hinzu. In dieser Marker-Reihe erscheinen die Produkte.
  5. Füge dem Layout drei weitere Items mit buttonPrefix shop_button: und buttonType auf PREV_PAGE, NEXT_PAGE und CLOSE gesetzt hinzu, platziert in der untersten Reihe. Gib jedem ein item und einen displayName.
  6. Setze fillerItem auf eine graue gefärbte Glasscheibe, damit ungenutzte Slots gefüllt werden.
  7. Veröffentliche, führe dann im Spiel /tw shop admin list aus, um die Shop-ID zu lesen, und öffne ihn mit /tw shop <id>. Um ihn stattdessen von einer Quest oder einem NPC aus zu öffnen, füge eine Open Shop-Aktion hinzu, die auf den Shop zeigt.

Ein Linksklick kauft ein Schwert, ein Rechtsklick verkauft eines, und Shift + Linksklick öffnet das Kauf-Untermenü, sofern du eines konfiguriert hast.

Angezeigte Items, verkaufte Items

Ein Shop zeigt pro Seite so viele Produkte an, wie er SHOP_ITEM-Marker-Slots hat, und die Blätter-Buttons führen durch den Rest. Existiert kein Marker, öffnet sich das Menü ganz ohne Produkt.

Funktionsweise​

Beim Öffnen prüft der Shop seine Zugangs-criteria, wendet einen ausstehenden Reset an und baut dann das Menü für diesen Spieler auf. Ein Klick sendet die Aktion an den Transaktionshandler, der die Limits prüft, den Preis mit Aktionen und Steuer berechnet, die Zahlung entgegennimmt, das Item übergibt und Bestand, Limitzähler und Verlauf festhält.

Menüs​

Layout und Buttons​

Ein Shop-Menü ist ein simple-Layout im layoutPool der Shop Definition, ausgewählt über mainLayoutId. Items des Layouts tragen einen buttonPrefix von shop_button: und einen buttonType:

buttonTypeAufgabe
SHOP_ITEMEin Slot, in dem ein Produkt platziert wird. Wiederhole ihn mit count, direction, gap und repeatY. Das Präfix darf bei diesem Marker leer bleiben.
NEXT_PAGE, PREV_PAGEDurch die Seiten mit Produkten blättern.
INFOSendet die Zeilen von infoMessage.
CLOSESchließt das Menü.
BACKKehrt zum vorherigen Menü zurück, zum Beispiel aus einem Untermenü.
BUY_1, SELL_1Eine Einheit kaufen oder verkaufen. In einem Untermenü handeln BUY_1:10 und SELL_1:10 mit 10 Einheiten; jede Zahl funktioniert.
BUY_STACK, SELL_STACKEinen vollen Stack des Items handeln.
BUY_MAX, SELL_ALLSo viele wie möglich kaufen oder alles Passende verkaufen.
BUY_CUSTOM, SELL_CUSTOMDen Spieler in einem Dialog nach einer Menge fragen.
BUY_SUBMENU, SELL_SUBMENUDas Untermenü für das Item öffnen.

Andere Buttons als SHOP_ITEM, NEXT_PAGE, PREV_PAGE, INFO, CLOSE und BACK wirken auf das Item, das der Spieler ausgewählt hat, und gehören daher in das Untermenü-Layout. Setze den buttonPrefix immer auf shop_button:: Das Standardpräfix gehört zu einer anderen Erweiterung, und der Button bliebe wirkungslos.

Untermenü​

Erstelle im Pool ein zweites simple-Layout, platziere die Mengen-Buttons darin und trage seine id in subMenuLayoutId ein. Der Titel stammt aus subMenuTitle, wobei {item_name} der name des Items ist. Items öffnen es mit den Aktionen BUY_SUBMENU und SELL_SUBMENU, die dem standardmäßigen Shift-Klick entsprechen.

Klickaktionen​

Jedes Item hat drei Aktions-Slots:

FeldStandardStandard-Klick
primaryActionBUY_1Linksklick
secondaryActionSELL_1Rechtsklick
shiftActionBUY_SUBMENUShift + Linksklick

Die möglichen Aktionen sind NONE, BUY_1, SELL_1, BUY_STACK, SELL_STACK, BUY_MAX, SELL_ALL, BUY_SUBMENU, SELL_SUBMENU, BUY_CUSTOM und SELL_CUSTOM. Die shopweite interactionConfig legt fest, welcher Klick welche Aktion auslöst (1 kaufen, 1 verkaufen, Stack kaufen, alles verkaufen, Untermenü, eigene Menge, Navigation). Jeder Klicktyp kann pro Item nur eine Aktion ausführen, sodass sich bei der Standardkonfiguration mehrere auf einen Linksklick gelegte Aktionen gegenseitig ersetzen: Ändere interactionConfig, wenn du mehr als drei Aktionen verwendest.

buyMaxEnabled schaltet BUY_MAX für ein Item ab.

Mengendialog​

BUY_CUSTOM und SELL_CUSTOM öffnen einen Dialog mit einem Textfeld. Passe ihn mit buyAmountPrompt, sellAmountPrompt, amountConfirmButton, amountInputLabel, amountInputPlaceholder, amountInputWidth und amountInputMaxLength an. Die Antwort muss eine positive ganze Zahl sein; andernfalls wird invalidAmountMessage gesendet. Die üblichen Prüfungen von Preis, Limit und Kontostand laufen, wenn die Menge bestätigt wird.

Item-Anzeige​

Die Zeilen von priceLore werden jedem Produkt angehängt, nach der eigenen Lore des Items und seiner lore. defaultNameFormat und defaultLoreFormat springen für Items ein, die keinen eigenen name oder keine eigene lore haben. In diesen Feldern sowie im name und der lore eines Items werden die folgenden Tokens ersetzt; eine Zeile, die einen nicht vorhandenen Preis verlangt, wird verworfen.

TokenErsetzt durch
{item}Der eigene Name des Items.
{buy}, {sell}Formatierter Stückpreis. Entfällt, wenn das Item nicht gekauft oder verkauft werden kann, wenn der Preis null ist und bei Tauschhandels-Items.
{item_price}Der Preis in Items, eine Zeile pro verlangtem Item, etwa - 12 × Copper Ingot (Wortlaut über itemPriceLineFormat einstellbar). Entfällt bei Items, die nicht in Items bezahlt werden.
{stock}, {stock_max}Aktueller und maximaler Bestand.
{currency}Das currencySymbol.

priceFormat formt den angezeigten Preis: {amount} ist die Zahl mit zwei Dezimalstellen und {currency} das Symbol.

Preise und Wirtschaft​

Preismodi. FIXED verwendet fixedBuyPrice und fixedSellPrice. DYNAMIC verwendet dynamicPricing: Der Preis beginnt bei price (und sellPrice für Verkäufe), wenn der Bestand voll ist, und bewegt sich mit sinkendem Bestand in Schritten von step von stockMax auf max zu, begrenzt durch min und max und gerundet auf rounding. ITEMS ist Tauschhandel.

Tauschhandel. Bei priceMode ITEMS gib die Kosten im itemPrice des Items an oder einmalig für den ganzen Shop in defaultItemPrice. Jede Zeile ist ein Item und eine amount pro gekaufter Einheit. Mehrere Zeilen sind alle gleichzeitig erforderlich, und der Kauf mehrerer Einheiten vervielfacht jede Zeile. Die eigene Liste eines Artikels ersetzt die Liste des Shops, sie wird ihr nie hinzugefügt. Ein Item, das nirgends einen Preis hat, wird abgelehnt und protokolliert, nie verschenkt. Die Zahlung wird am gesamten Inventar geprüft, bevor etwas entfernt wird, der Platz für das gekaufte Item wird zuerst geprüft, und Katalog-Items werden anhand ihrer Identität statt nur nach Material abgeglichen. BUY_MAX kauft so viele Einheiten, wie das Inventar bezahlen kann. Ein Tauschhandels-Item kann nicht für Geld zurückverkauft werden. Fehlende Items werden mit cannotAffordItemsMessage gemeldet, wobei {missing} sie auflistet und {amount} die Menge ist.

Währungen.

currencyVerhalten
VAULTVerwendet die bei Vault registrierte Wirtschaft. Benötigt das Vault-Plugin und einen Provider.
PLACEHOLDERLiest den Kontostand aus balancePlaceholder und ändert ihn, indem addCommand und removeCommand über die Konsole ausgeführt werden, wobei {player} und {amount} ersetzt werden. Alle drei müssen gesetzt sein. Zahlen wie 1,250.5 und 12.5k werden verstanden.
POINTSEin von Shops in seinem Artifact geführter Kontostand. Er beginnt bei 0 und wächst, wenn Spieler Items verkaufen; das Release hat keinen Befehl, um Punkte zu vergeben.

Steuern. taxRate ist ein Prozentsatz, der Käufen aufgeschlagen und von Verkäufen abgezogen wird. Bei taxMode PER_ITEM ersetzt der taxRateOverride eines Items (0 oder mehr) ihn für dieses Item; -1 behält den Satz des Shops bei.

Aktionen. Eine Shop Promotion senkt den Kaufpreis und die Verkaufsauszahlung eines Shops um einen Prozentsatz, für alle Items oder die aufgelisteten targetItemIndices (Position in items, ab 0).

Bestand, Limits und Resets​

  • dynamicPricing.stockMax legt den Bestand eines Items fest. Er beginnt voll, sinkt, wenn Spieler kaufen, und steigt, wenn sie verkaufen. 0 bedeutet keine Bestandsverfolgung. Ist perPlayer aktiv, hat jeder Spieler seinen eigenen Bestand jedes Items; ein Reset füllt den Bestand aller wieder auf. Solange ein Shop geöffnet ist, sorgen defaultRefreshTicks (und das refreshTicks eines Items) dafür, dass er neu gezeichnet wird, wenn sich der angezeigte Bestand ändert, sodass man die Käufe anderer Spieler sieht. Das guiSlot eines Items legt es auf einen festen Slot, und sellAllEnabled schaltet seine Aktion „Alles verkaufen“ ab. Details unter Shop Definition.
  • playerLimit und globalLimit begrenzen, wie viele Einheiten eines Items ein Spieler bzw. alle zusammen pro Reset-Zyklus kaufen können. globalPlayerLimit, globalBuyLimit und globalSellLimit begrenzen den ganzen Shop; 0 bedeutet unbegrenzt. limitReachedMessage wird gesendet, wenn eine Obergrenze erreicht ist.
  • reset stellt den Bestand wieder her und löscht die Limitzähler. Die Richtlinien sind none, cron (ein Ausdruck wie 0 0 * * *), interval (Sekunden), daily, weekly (Tag 1 ist Montag) und monthly. Zeiten verwenden die Zeitzone des Servers. Die erste Prüfung eines Zyklus erfolgt beim Öffnen des Shops, und jede Minute läuft außerdem eine Prüfung.
  • criteria beschränkt den Zugang zum Shop und sendet criteriaFailMessage, wenn sie nicht erfüllt sind. Ein Item, dessen eigene criteria nicht erfüllt sind, wird als lockedItem angezeigt und kann nicht gekauft werden.

Befehle​

Unterbefehle von /typewriter, meist als /tw eingegeben.

BefehlBeschreibung
/tw shop <shop>Öffnet einen Shop für dich selbst. Erfordert typewriter.shop.open.
/tw shop adminListet die Admin-Befehle auf. Erfordert typewriter.shop.admin.
/tw shop admin listListet geladene Shops mit ID, Name, Item-Anzahl und Pool-Anzahl auf.
/tw shop admin info <shop>Zeigt eine Shop-Definition und ihre Items mit ihrem Index.
/tw shop admin open <shop> [target]Öffnet einen Shop für einen Spieler.
/tw shop admin refresh [target]Zeichnet den geöffneten Shop eines Spielers neu.
/tw shop admin close [target]Schließt den geöffneten Shop eines Spielers.
/tw shop admin reset <shop>Setzt Bestand und Limits sofort zurück.
/tw shop admin stock <shop> <item> getZeigt den Bestand des Items an diesem Index.
/tw shop admin stock <shop> <item> set <amount>Setzt den Bestand. Ebenfalls add und remove.
/tw shop admin history [target]Zeigt die letzten 10 Transaktionen eines Spielers seit dem letzten Neustart.

<shop> ist die Entry-ID, die mit der Tab-Taste vervollständigt wird. <item> ist die Position des Items in den items des Shops, beginnend bei 0.

Anpassbare Texte​

Kein im Spiel angezeigter Text ist im Code festgelegt. Drei Arten von Text lassen sich ändern, ohne etwas neu zu bauen.

Was ein Spieler beim Handeln liest, ist ein Feld der Shop Definition: purchaseMessage, sellMessage, cannotAffordMessage, limitReachedMessage, priceLore und die weiteren oben beschriebenen.

Preisformulierungen, Trend-Icons und Pool-Zeilen sind Felder des Eintrags, zu dem sie gehören. Ihr Standardwert ist der Text, den die Erweiterung schon immer angezeigt hat.

FeldEintragStandardwertVerwendung
trendUpIconShop Definition<red>▲</red>Der Platzhalter trend_icon eines Items, dessen Preis seit dem letzten Kauf oder Verkauf gestiegen ist.
trendDownIconShop Definition<green>▼</green>Derselbe Platzhalter, wenn der Preis gesunken ist.
trendStableIconShop Definition<gray>●</gray>Derselbe Platzhalter, wenn sich der Preis nicht bewegt hat oder kein früherer Preis bekannt ist.
itemPriceLineFormatShop Definition- {amount} × {name}Eine Zeile des Lore-Tokens {item_price} für jedes Item, das ein Preis in Items verlangt. {amount} ist die Menge, {name} der Item-Name.
unknownItemNameShop Definitionunknown itemDer Name eines Preis-Items, dessen eigener Name nicht gelesen werden kann, in {item_price} und in der Liste fehlender Items.
missingItemFormatShop Definition{amount} × {name}Ein Eintrag der {missing}-Liste von cannotAffordItemsMessage. {amount} ist die fehlende Menge.
missingItemSeparatorShop Definition, Was zwischen zwei Einträgen der {missing}-Liste steht.
defaultItemNameShop DefinitionItemDer {item_name} von subMenuTitle für ein Item ohne name.
noPriceTextShop Definition—Wird anstelle einer Zahl angezeigt, wo ein Preis in Items keine hat: die Platzhalter buy_price und sell_price sowie {price} in der Nachricht „Inventar voll“ eines solchen Items.
cooldownFormatShop Definition{d}d:{h}h:{m}m:{s}sDas Muster des Platzhalters cooldown, wenn der Platzhalter keines angibt. {d} Tage, {h}, {m}, {s} auf 2 Stellen aufgefüllt.
limitedLoreShop Pool<yellow>Limited: <red>{limit}Die letzte Lore-Zeile eines limitierten Items des Pools. {limit} ist die verfügbare Menge.
unlimitedLoreShop Pool<yellow>UnlimitedDie letzte Lore-Zeile eines Items des Pools ohne Limit.

Verwende %typewriter_shop:<shop>:<n>:trend_icon% in der Lore eines Items, um das Icon anzuzeigen. %typewriter_shop:<shop>:<n>:trend% liefert up, down, stable oder unknown; diese vier Wörter sind fest, weil Bedingungen sie vergleichen.

Was die /tw shop-Befehle antworten, die /tw shop admin-Befehle eingeschlossen, ist ein TypeWriter-Snippet. Öffne plugins/Typewriter/snippets.yml, suche den Schlüssel unter content.shop, ändere den Wert und führe /tw reload aus. Die Erweiterung registriert beim Start alle ihre Snippets mit dem Standardtext, sie erscheinen also nach dem ersten Start in der Datei. Behältst du die Standardwerte, ändert sich nichts.

Die Antworten sind MiniMessage und werden ohne das Typewriter-Präfix gesendet, die Farbe einer Antwort gehört also zu ihrem Text. Ein {name} in einem Text wird durch den in der Tabelle genannten Wert ersetzt; ein Platzhalter, den es nicht gibt, bleibt unverändert stehen, und ein Wert wird nie erneut nach Platzhaltern durchsucht. Ein Wert aus deinen Pages (ein Shop-Name, ein Spielername, ein Inventartitel) wird wie geschrieben angezeigt: Seine Tags werden nie interpretiert. Das Log der Server-Konsole bleibt auf Englisch.

Snippet (unter content.shop.)StandardwertPlatzhalter
help<gold>Shop commands:</gold> <yellow>/tw shop <id></yellow> to open a shop, <yellow>/tw shop admin</yellow> for operator tools.keine
unknown_shop_errorUnknown shop: {shop} (einfacher Text){shop} (das Eingegebene)
admin.helpdie Liste der Admin-Befehle, einer pro Zeilekeine
admin.unknown_shop<red>Unknown shop: {shop}{shop}
admin.list_empty<yellow>No shop definitions are currently loaded.keine
admin.list_header<gold>Loaded shops ({count}):{count}
admin.list_line<white>- {id} | {name} | items={items} | pools={pools}{id}, {name}, {items}, {pools}
admin.opened<green>Opened {shop} for {player}.{shop}, {player}
admin.refreshed<green>Refreshed the shop session for {player}.{player}
admin.closed<green>Closed the shop session for {player}.{player}
admin.reset<green>Reset runtime stock and limits for {shop}.{shop}
admin.history_header<gold>Recent transactions for {player} ({count}):{player}, {count}
admin.history_empty<yellow>No transactions recorded in the current runtime.keine
admin.history_line<white>{time} | {type} | {shop}[{index}] | amount={amount} | price={price}{time}, {type}, {shop}, {index}, {amount}, {price}
admin.info_title<gold>=== Shop {shop} ==={shop}
admin.info_name<white>Name: {name}{name}
admin.info_inventory_title<white>Title: {title}{title}
admin.info_currency<white>Currency: {currency} | rows={rows}{currency}, {rows}
admin.info_items<white>Items: {items} direct | pools={pools} | access criteria={criteria}{items}, {pools}, {criteria}
admin.info_reset<white>Reset policy: {policy}{policy}
admin.info_item<white>[{index}] {name} | buy={buy} sell={sell} | playerLimit={playerLimit} globalLimit={globalLimit} | item criteria={criteria}{index}, {name}, {buy}, {sell}, {playerLimit}, {globalLimit}, {criteria}
admin.info_item_unnamed<unnamed> (einfacher Text)keine; es ist der {name} eines Items ohne Namen
admin.stock_unlimited<yellow>{shop}[{index}] uses unlimited stock.{shop}, {index}
admin.stock_value<green>{shop}[{index}] stock: {stock}/{max}.{shop}, {index}, {stock}, {max}
admin.stock_out_of_range<red>Stock must stay between 0 and {max}.{max}
admin.stock_updated<green>{shop}[{index}] stock set to {stock}/{max}.{shop}, {index}, {stock}, {max}
admin.unknown_item<red>Unknown direct item index {index} in {shop}.{index}, {shop}

unknown_shop_error ist ein Befehlsfehler, den das Spiel beim Tippen in Rot anzeigt: Er ist einfacher Text, ohne MiniMessage.

Berechtigungen​

BerechtigungGewährt
typewriter.shop.open/tw shop <shop>. Standardmäßig an alle vergeben.
typewriter.shop.adminJeden /tw shop admin-Befehl. Standardmäßig nur Operatoren.

Platzhalter​

PlaceholderAPI-Platzhalter mit der Expansion typewriter. <shop> ist der Name oder die ID des Shop-Entries und <n> die Position des Items in items, ab 0.

PlatzhalterGibt zurück
%typewriter_shop:<shop>:name%Name des Entries.
%typewriter_shop:<shop>:entryid%ID des Entries.
%typewriter_shop:<shop>:cooldown%Zeit bis zum nächsten Reset, standardmäßig als 0d:00h:00m:00s (das Feld cooldownFormat des Shops; frühere Versionen verwendeten j für Tage). Hänge nach einem Unterstrich ein Format an, zum Beispiel cooldown_{h}h{m}m, mit {d}, {h}, {m} und {s}.
%typewriter_shop:<shop>:<n>:buy_price%Kaufpreis des Items; bei Tauschitems der noPriceText des Shops (standardmäßig —).
%typewriter_shop:<shop>:<n>:sell_price%Verkaufspreis des Items; bei Tauschitems der noPriceText des Shops (standardmäßig —).
%typewriter_shop:<shop>:<n>:stock%Aktueller Bestand.
%typewriter_shop:<shop>:<n>:stock_max%Maximaler Bestand.
%typewriter_shop:<shop>:<n>:has_promotion%true, wenn eine Aktion für das Item gilt.

Integration​

  • GUI — Shops öffnet seine Menüs über den GUI-Sitzungsdienst, sodass gui:back, Sounds, erweiterte Grundgerüste und baseMenuId wie in jedem anderen Menü funktionieren. Setze baseMenuId auf eine gemeinsame Open GUI-Hülle und füge views hinzu, dann wird der Shop zu einem Tab: contentX, contentY, contentColumns und contentRows platzieren die Produkte in der Hülle.
  • Discord — nach jedem Kauf oder Verkauf löst Shops ein ShopTransactionEvent aus. Ist die Erweiterung Discord installiert und setzt der Shop notificationWebhookId, formatiert ein Shop Notification-Entry die Ankündigung.
  • Sounds — buySound, sellSound und deniedSound werden beim jeweiligen Ergebnis abgespielt.

Entries​

6 Einträge, aus dem Quellcode der Erweiterung generiert.

Aktionen1
Artefakte1
Manifeste4

Fehlerbehebung​

Das Menü öffnet sich, zeigt aber kein Produkt. Das Layout hat keinen SHOP_ITEM-Marker, mainLayoutId entspricht keiner Layout-id im layoutPool, oder das Layout ist kein simple-Layout. Produkte erscheinen nur auf Marker-Slots.

Ein Button bewirkt nichts. Sein buttonPrefix ist nicht shop_button:, oder sein buttonType ist falsch geschrieben (Typen sind in Großbuchstaben). Auch ein Blätter- oder Schließen-Button benötigt das Präfix; nur SHOP_ITEM toleriert ein leeres Präfix.

Der Shop meldet „No economy available“. Bei VAULT fehlt Vault oder sein Wirtschafts-Provider. Bei PLACEHOLDER ist eines von balancePlaceholder, addCommand oder removeCommand leer. Bei einem Tauschhandels-Item erscheint die Meldung auch, wenn weder itemPrice noch defaultItemPrice gesetzt ist, und die Konsole protokolliert die Shop-ID und die Item-Nummer.

Bestand und Limits gehen beim Neustart verloren oder werden nie gespeichert. Es muss einen Shop-Artifact-Entry geben, dessen ID oder Name shop_artifact lautet.

Ein Item kann nicht verkauft werden. Sein Verkaufspreis ist null (bei Tauschhandels-Items immer), sellEnabled ist aus, oder der Spieler besitzt nicht genug passende Items. Es zählen nur Items mit identischem Item-Typ und identischen Daten.

Die Konsole warnt, dass ein Artikel nicht angezeigt werden kann oder verschoben wurde. Ein Item mit guiSlot belegt einen SHOP_ITEM-Marker. Belegen die festgelegten Items alle Marker, werden die übrigen Items auf den freien Zellen des Inhaltsbereichs platziert; ist keine Zelle mehr frei, wird das Item nicht angezeigt. Füge SHOP_ITEM-Marker hinzu oder gib einen Slot frei.

Items aus itemPools erscheinen, lassen sich aber nicht kaufen. In diesem Release werden nur die Einträge von items von den Kauf- und Verkaufsaktionen verarbeitet; Pool-Items werden danach angezeigt.

Limits werden nie zurückgesetzt. reset ist none. Wähle eine Richtlinie oder verwende /tw shop admin reset <shop>.

/tw shop <id> meldet, der Shop sei unbekannt. Der Befehl erwartet die Entry-ID, nicht den Titel. Verwende /tw shop admin list.

Verwandte Erweiterungen​

  • GUI — Layouts, Sitzungen und der Marker-Mechanismus, den Shop-Menüs verwenden.
  • Discord — kündigt Shop-Transaktionen über einen Webhook an.
  • Quest Codex — verwendet dieselbe Grundgerüst-Idee für Quest-Menüs.