Shops
Ü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 —
priceModeITEMSverkauft 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 eingebautesPOINTS-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
baseMenuIdzu 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
- Installiere die Erweiterung GUI (Version 0.17 oder neuer) und TypeWriter auf einem Paper- oder Folia-Server.
- Optional, für die Währung
VAULT: Installiere Vault und ein Wirtschafts-Plugin, das sich dort registriert. - Optional, für Platzhalter in Titeln und Lore sowie für die Währung
PLACEHOLDER: Installiere PlaceholderAPI. - 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. - 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:
- Füge auf einer statischen Page einen Shop Artifact-Entry mit dem Namen
shop_artifacthinzu. - Füge einen Shop Definition-Entry hinzu. Setze
titleauf<gold>Weapons,rowsauf3undcurrencyaufVAULT. - Füge in
itemsein Item hinzu. Wähle initemein Diamantschwert, setzenameauf<aqua>Sword,priceModeaufFIXED,fixedBuyPriceauf500undfixedSellPriceauf100. LassprimaryActionaufBUY_1undsecondaryActionaufSELL_1. - Füge in
layoutPooleinsimple-Layout mit deridmainhinzu und tragemaininmainLayoutIdein. Füge ihm ein Item mitbuttonPrefixshop_button:,buttonTypeSHOP_ITEM,x1,y1,count7 unddirectionrighthinzu. In dieser Marker-Reihe erscheinen die Produkte. - Füge dem Layout drei weitere Items mit
buttonPrefixshop_button:undbuttonTypeaufPREV_PAGE,NEXT_PAGEundCLOSEgesetzt hinzu, platziert in der untersten Reihe. Gib jedem einitemund einendisplayName. - Setze
fillerItemauf eine graue gefärbte Glasscheibe, damit ungenutzte Slots gefüllt werden. - Veröffentliche, führe dann im Spiel
/tw shop admin listaus, 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.
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:
buttonType | Aufgabe |
|---|---|
SHOP_ITEM | Ein 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_PAGE | Durch die Seiten mit Produkten blättern. |
INFO | Sendet die Zeilen von infoMessage. |
CLOSE | Schließt das Menü. |
BACK | Kehrt zum vorherigen Menü zurück, zum Beispiel aus einem Untermenü. |
BUY_1, SELL_1 | Eine Einheit kaufen oder verkaufen. In einem Untermenü handeln BUY_1:10 und SELL_1:10 mit 10 Einheiten; jede Zahl funktioniert. |
BUY_STACK, SELL_STACK | Einen vollen Stack des Items handeln. |
BUY_MAX, SELL_ALL | So viele wie möglich kaufen oder alles Passende verkaufen. |
BUY_CUSTOM, SELL_CUSTOM | Den Spieler in einem Dialog nach einer Menge fragen. |
BUY_SUBMENU, SELL_SUBMENU | Das 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:
| Feld | Standard | Standard-Klick |
|---|---|---|
primaryAction | BUY_1 | Linksklick |
secondaryAction | SELL_1 | Rechtsklick |
shiftAction | BUY_SUBMENU | Shift + 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.
| Token | Ersetzt 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.
currency | Verhalten |
|---|---|
VAULT | Verwendet die bei Vault registrierte Wirtschaft. Benötigt das Vault-Plugin und einen Provider. |
PLACEHOLDER | Liest 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. |
POINTS | Ein 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.stockMaxlegt den Bestand eines Items fest. Er beginnt voll, sinkt, wenn Spieler kaufen, und steigt, wenn sie verkaufen.0bedeutet keine Bestandsverfolgung. IstperPlayeraktiv, hat jeder Spieler seinen eigenen Bestand jedes Items; ein Reset füllt den Bestand aller wieder auf. Solange ein Shop geöffnet ist, sorgendefaultRefreshTicks(und dasrefreshTickseines Items) dafür, dass er neu gezeichnet wird, wenn sich der angezeigte Bestand ändert, sodass man die Käufe anderer Spieler sieht. DasguiSloteines Items legt es auf einen festen Slot, undsellAllEnabledschaltet seine Aktion „Alles verkaufen“ ab. Details unter Shop Definition.playerLimitundglobalLimitbegrenzen, wie viele Einheiten eines Items ein Spieler bzw. alle zusammen pro Reset-Zyklus kaufen können.globalPlayerLimit,globalBuyLimitundglobalSellLimitbegrenzen den ganzen Shop;0bedeutet unbegrenzt.limitReachedMessagewird gesendet, wenn eine Obergrenze erreicht ist.resetstellt den Bestand wieder her und löscht die Limitzähler. Die Richtlinien sindnone,cron(ein Ausdruck wie0 0 * * *),interval(Sekunden),daily,weekly(Tag 1 ist Montag) undmonthly. 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.criteriabeschränkt den Zugang zum Shop und sendetcriteriaFailMessage, wenn sie nicht erfüllt sind. Ein Item, dessen eigenecriterianicht erfüllt sind, wird alslockedItemangezeigt und kann nicht gekauft werden.
Befehle
Unterbefehle von /typewriter, meist als /tw eingegeben.
| Befehl | Beschreibung |
|---|---|
/tw shop <shop> | Öffnet einen Shop für dich selbst. Erfordert typewriter.shop.open. |
/tw shop admin | Listet die Admin-Befehle auf. Erfordert typewriter.shop.admin. |
/tw shop admin list | Listet 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> get | Zeigt 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.
| Feld | Eintrag | Standardwert | Verwendung |
|---|---|---|---|
trendUpIcon | Shop Definition | <red>▲</red> | Der Platzhalter trend_icon eines Items, dessen Preis seit dem letzten Kauf oder Verkauf gestiegen ist. |
trendDownIcon | Shop Definition | <green>▼</green> | Derselbe Platzhalter, wenn der Preis gesunken ist. |
trendStableIcon | Shop Definition | <gray>●</gray> | Derselbe Platzhalter, wenn sich der Preis nicht bewegt hat oder kein früherer Preis bekannt ist. |
itemPriceLineFormat | Shop 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. |
unknownItemName | Shop Definition | unknown item | Der Name eines Preis-Items, dessen eigener Name nicht gelesen werden kann, in {item_price} und in der Liste fehlender Items. |
missingItemFormat | Shop Definition | {amount} × {name} | Ein Eintrag der {missing}-Liste von cannotAffordItemsMessage. {amount} ist die fehlende Menge. |
missingItemSeparator | Shop Definition | , | Was zwischen zwei Einträgen der {missing}-Liste steht. |
defaultItemName | Shop Definition | Item | Der {item_name} von subMenuTitle für ein Item ohne name. |
noPriceText | Shop 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. |
cooldownFormat | Shop Definition | {d}d:{h}h:{m}m:{s}s | Das Muster des Platzhalters cooldown, wenn der Platzhalter keines angibt. {d} Tage, {h}, {m}, {s} auf 2 Stellen aufgefüllt. |
limitedLore | Shop Pool | <yellow>Limited: <red>{limit} | Die letzte Lore-Zeile eines limitierten Items des Pools. {limit} ist die verfügbare Menge. |
unlimitedLore | Shop Pool | <yellow>Unlimited | Die 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.) | Standardwert | Platzhalter |
|---|---|---|
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_error | Unknown shop: {shop} (einfacher Text) | {shop} (das Eingegebene) |
admin.help | die Liste der Admin-Befehle, einer pro Zeile | keine |
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
| Berechtigung | Gewährt |
|---|---|
typewriter.shop.open | /tw shop <shop>. Standardmäßig an alle vergeben. |
typewriter.shop.admin | Jeden /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.
| Platzhalter | Gibt 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 undbaseMenuIdwie in jedem anderen Menü funktionieren. SetzebaseMenuIdauf eine gemeinsame Open GUI-Hülle und fügeviewshinzu, dann wird der Shop zu einem Tab:contentX,contentY,contentColumnsundcontentRowsplatzieren die Produkte in der Hülle. - Discord — nach jedem Kauf oder Verkauf löst Shops ein
ShopTransactionEventaus. Ist die Erweiterung Discord installiert und setzt der ShopnotificationWebhookId, formatiert ein Shop Notification-Entry die Ankündigung. - Sounds —
buySound,sellSoundunddeniedSoundwerden beim jeweiligen Ergebnis abgespielt.
Entries
6 Einträge, aus dem Quellcode der Erweiterung generiert.
Aktionen1
- Open ShopOpen a shop for a player
Artefakte1
- Shop ArtifactRuntime storage for shops
Manifeste4
- Item PoolA weighted pool of items for shops
- Shop CategoryA category within a shop
- Shop DefinitionDefines a shop
- Shop PromotionA shop discount promotion
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.