Numerical Storage
概要
Numerical Storage を使うと、プレイヤーごとに名前付きの数値ストアを作成できます。銀行口座、マナプール、トークンの財布、あらゆるリソースの備蓄などです。ストアを definition(定義) で一度記述すると、拡張機能がプレイヤーごとに 1 つの残高と 1 つのレベルを保存します。
ストアにはレベルを設け、それぞれに最大容量を持たせられます。プレイヤーは、GUI 拡張機能で作られたインベントリメニューを通じて、入金と出金を行います。お金は、Vault を通じて経済プラグインから出すことも、任意のプレースホルダーとコンソールコマンドから出すこともできます。利息はスケジュールに従って付与でき、ストアはコマンドでリセット、編集、オープンできます。
残高は TypeWriter のアーティファクトに保存され、非同期で書き込まれるため、入金がサーバースレッドをブロックすることはありません。残高、レベル、容量は、スコアボード、ホログラム、メニュー用の PlaceholderAPI プレースホルダーとして公開されます。
機能
- 複数のストア — 必要なだけ定義を作成でき、それぞれに独自の名前、プレフィックス、レベル、メニューを持たせられます。
- レベルと容量 — 各レベルに最大残高があり、プレイヤーはアップグレードして上限を引き上げます。
- レベルの要件 — プレースホルダーやファクトの比較でレベルを解放し、必要に応じてコストを徴収します。
- 利息 — cron スケジュール、全体の利率、レベルごとの利率、権限ごとの利率、サイクルごとの上限。
- Vault またはコマンド — 入金と出金は、Vault か、プレースホルダーとコンソールコマンドの組み合わせで行います。
- 送金 — 2 つのストア間で残高をアトミックに移動します。
- メニューボタン — 固定額、割合、全額、任意の金額(ダイアログ)、サブメニュー、アップグレード、閉じる。
- 安全な永続化 — 非同期の保存、アーティファクトごとのロック、古いファイルの自動移行。
- プロファイルモード — MMOProfiles によるプロファイルごとの残高(任意)。
- プレースホルダーとコマンド — どこでも値を読み取れ、コンソールから編集できます。
インストール
- GUI 拡張機能をインストールします。Numerical Storage はメニューのためにこれを必要とします。GUI 拡張機能は
GuiAndDialogsという名前で公開されています。 %typewriter_ns_...%プレースホルダーを使う場合は、PlaceholderAPI をインストールします。- 任意:
VAULTの取引モードを使うには、Vault(拡張機能は VaultUnlocked に対してビルドされています)と経済プラグインをインストールします。 - 任意:
profileModeを使うには、MMOProfiles をインストールします。 - Numerical Storage の JAR を
plugins/Typewriter/extensions/に置き、サーバーを再起動します。
任意の金額を入力するウィンドウは Paper のダイアログを使うため、それに対応した Paper のバージョン(Minecraft 1.21.6 以降)が必要です。
バージョン 0.9 以降、新しいアーティファクトは、技術的な識別子と JSON スキーマのバージョン 2 を使います。古いファイルを最初に読み込むとき、新しいパスにコピーされ、backups/numericalstorage/ に保存されたうえで、元のファイルは削除されます。更新する前に、TypeWriter の assets/ フォルダのコピーを保管してください。
はじめに
Vault の経済で支払う銀行を作成します。
- TypeWriter の Web パネルで manifest ページを開き、Player Numerical Storage アーティファクトを追加します。
artifactIdは空のままにします。TypeWriter が生成します。 - Numerical Storage Definition を追加します。
displayName(例:Bank)とprefixを設定し、artifactにアーティファクトをリンクします。 levelsに、limitが1000の最初のレベルを追加し、続いて5000の 2 つ目を追加します。独自のテキストにしたい場合は、depositMessageとlevelUpMessageを入力します。transactionで、transactionModeをVAULTに設定します。menu.transactionButtonsに、タイプDEPOSIT、amountTypeがFIXED、amountが100のボタンと、表示するアイテムを追加します。2 つ目として、タイプWITHDRAWのボタンを追加します。- Open Numerical Storage Menu アクションを追加します。
definitionをリンクします。 - その
layoutPoolに、idがmainのsimpleレイアウトを追加し、mainLayoutIdをmainに設定します。レイアウトに、buttonPrefixをnumericalstorage_button:、buttonTypeをDEPOSIT_FIXED:100に設定したアイテムを追加します。WITHDRAW_FIXED:100、UPGRADE_LEVEL、NAV_CLOSEについても同様に行います。 - アクションを、NPC のダイアログまたはコマンドイベントにリンクしてパブリッシュし、ゲーム内で銀行を開きます。
/typewriter ns open <definition>でも開けます。
各取引の後、新しい残高を表示するためにメニューが開き直されます。拡張機能は、同じ定義にリンクされた Open Numerical Storage Menu エントリを探します。ない場合、メニューは単に閉じられます。
仕組み
メニュー
メニューは、通常の GUI レイアウトです。Open Menu アクションは、定義のタイトルと行数(menu.title、menu.rows、1〜6)でメニューを開き、各アイテムをどこに置くかは layoutPool が決めます。拡張機能は、buttonPrefix が numericalstorage_button: に設定され、buttonType が次の一覧にあるアイテムを、動作するボタンに変えます。
buttonType | ボタンの動作 |
|---|---|
DEPOSIT_FIXED | 固定額を入金します。金額はコロンの後に追加します。例: DEPOSIT_FIXED:100。 |
DEPOSIT_PERCENT | 元の残高の一定割合を入金します。例: DEPOSIT_PERCENT:50。 |
DEPOSIT_CUSTOM | メニューを閉じ、ダイアログで金額を尋ねます。 |
DEPOSIT_ALL | 元の残高を、残りの容量まで入金します。これには amountPlaceholder が必要です。VAULT モードでは、ボタンは残りの容量全体を入金しようとし、経済の残高がそれより少ない場合は失敗します。 |
DEPOSIT_SUBMENU | 入金ボタンのサブメニューを開きます。サブメニューの ID はコロンの後に続きます。 |
WITHDRAW_FIXED, WITHDRAW_PERCENT, WITHDRAW_CUSTOM, WITHDRAW_ALL, WITHDRAW_SUBMENU | 上記と同じで、出金用です。割合は、保存されている残高から計算されます。 |
TRANSFER_FIXED, TRANSFER_PERCENT, TRANSFER_ALL | 残高を別の定義に移動します。このボタンは、transferTarget を持つタイプ TRANSFER の transactionButtons エントリから生成されます。 |
SUB_MENU | コロンの後に続く ID のサブメニューを開きます。例: SUB_MENU:deposit_options。 |
UPGRADE_LEVEL | 次のレベルにアップグレードします。最大レベルの場合は、最大レベルのアイテムを表示します。 |
NAV_CLOSE | メニューを閉じます。 |
buttonType に金額がある場合(DEPOSIT_FIXED:100)、拡張機能は、menu.transactionButtons から、同じタイプ、金額タイプ、金額を持つエントリを選び、その template をアイテムとして使います。金額がない場合は、最初に一致したエントリを使います。何も一致しない場合は、デフォルトのラベルが付いた、ただの染料アイテムが表示されます。
サブメニューは menu.subMenus で定義します。ID からの対応表で、タイトル、行数、slots に配置する取引ボタン、戻るボタン、閉じるボタンを指定します。
送金ボタンには、もう一方の定義の transferTarget(そのエントリ ID)が必要で、プレイヤーは、送金先のストアに空きがなければなりません。
コマンド
すべてのコマンドは /typewriter(エイリアス /tw)のサブコマンドです。<definition> は定義エントリです。省略可能な [target] は別のプレイヤーを選択します。省略すると、コマンドは送信者に適用されます。
| コマンド | 権限 | 説明 |
|---|---|---|
/typewriter ns open <definition> [target] | typewriter.ns.open | ストアのメニューを、その Open Menu エントリを通じて開きます。 |
/typewriter ns add <definition> <amount> [target] | typewriter.ns.add | 残高を加算します。容量はチェックされません。 |
/typewriter ns remove <definition> <amount> [target] | typewriter.ns.remove | 残高を 0 を下限として減算します。 |
/typewriter ns level <definition> <level> [target] | typewriter.ns.level | レベルを設定し、残高を 0 にリセットします。 |
/typewriter ns reset <definition> [target] | typewriter.ns.reset | レベルを 1 に、残高を 0 にリセットします。 |
/typewriter numstorage tx ...、upgrade、back_main のコマンドは、メニューのボタンが内部的に使います。メニューを開いていないプレイヤーには、何も起きません。
profileMode が有効な場合、add、remove、level、reset は、メニューと同様に、対象のプロファイルの残高とレベルを変更します。
コマンドの返信
add、remove、level、reset、open の返信と、下記のエラー返信は、定義の adminMessages のフィールドです。MiniMessage で、いずれも <player>、<storage>(定義の ID)、<prefix> を使用できます。
| フィールド | 追加のプレースホルダー | デフォルト |
|---|---|---|
resetMessage | なし | Numerical storage reset for <player>. |
levelSetMessage | <level> | Set numerical storage level to <level> for <player>. |
addMessage | <amount> | Added <amount> to <player>. |
removeMessage | <amount> | Removed <amount> from <player>. |
noMenuMessage | なし | ストレージに Open Menu エントリーがない場合に表示されるメッセージ。 |
invalidAmountMessage | <amount>(入力された値) | Invalid amount '<amount>'. Use a positive number. 金額が正の数でない場合に add と remove が表示します。 |
noArtifactMessage | なし | 定義にアーティファクトがリンクされていない場合に、add、remove、level、reset が表示するメッセージ。 |
noActiveProfileMessage | なし | <player> has no active profile. profileMode がオンで、プレイヤーにアクティブな MMOProfiles プロファイルがない場合に、add、remove、level、reset、およびメニューアクションをクリックしたプレイヤーに表示されます。何も書き込まれません。 |
デフォルトは Typewriter のプレフィックスで始まります。3 つのテキストはどの定義にも属さないため、代わりに snippets.yml のスニペットになっています。numericalstorage.command.player_only(プレイヤー以外が実行したメニューボタンのコマンド)と、プレースホルダーのテキスト numericalstorage.placeholder.interest_disabled(Disabled)、numericalstorage.placeholder.interest_error(Error)、numericalstorage.placeholder.capacity_unlimited(無限大の記号)です。interest_cooldown の時間単位は、スニペット numericalstorage.duration.days、hours、minutes、seconds(それぞれ {value} を含むテンプレートで、デフォルトは {value}j)と numericalstorage.duration.separator です。
権限
| 権限 | 許可される内容 |
|---|---|
typewriter.ns.open | /typewriter ns open。 |
typewriter.ns.add | /typewriter ns add。 |
typewriter.ns.remove | /typewriter ns remove。 |
typewriter.ns.level | /typewriter ns level。 |
typewriter.ns.reset | /typewriter ns reset。 |
interestRates の権限 | プレイヤーに特定の利率を与えます。リストの中で、プレイヤーが持っている最初の権限が使われます。 |
プレースホルダー
<id> を、定義のエントリ ID に置き換えてください。PlaceholderAPI が必要で、値はキャッシュから読み取られるため、スコアボードでも安全に使えます。profileMode が有効な場合、balance、level、capacity、interest は、メニューと同様に、プレイヤーがプレイ中のプロファイルに従います。
| プレースホルダー | 返す値 |
|---|---|
%typewriter_ns_balance_<id>% | 現在の残高。 |
%typewriter_ns_level_<id>% | 現在のレベル(1 から始まります)。 |
%typewriter_ns_capacity_<id>% | 現在のレベルの容量。レベルが定義されていない場合は無限大の記号。 |
%typewriter_ns_interest_<id>% | プレイヤーに適用される利率(パーセント)。 |
%typewriter_ns_interest_cooldown_<id>% | 次回の定期利息サイクルまでの時間。無効の場合は Disabled。 |
%typewriter_ns_name_<id>% | 定義の displayName。 |
%typewriter_ns_prefix_<id>% | 定義の prefix。 |
エントリ
4 件のエントリー(拡張機能のソースから生成)。
アクション2
- Numericalstorage MenuOpens a Numerical Storage menu
- Numericalstorage Open MenuOpens a Numerical Storage menu (triggerable)
アーティファクト1
- Player Numericalstorage ArtifactStores the numericalstorage amount per player
マニフェスト1
- Numericalstorage DefinitionDefines a configurable numerical storage
トラブルシューティング
メニューが空で開く、またはボタンが何もしない。 各アイテムの buttonPrefix が、正確に numericalstorage_button: に設定され、有効な buttonType があることを確認してください。プレフィックスが間違っていると、アイテムは動作を持たない通常のアイテムのままです。また、mainLayoutId が、layoutPool のレイアウトの id と一致していることも確認してください。
入金するたびにメニューが閉じる。 メニューは、同じ定義にリンクされた Open Numerical Storage Menu エントリを通じて開き直されます。別のエントリでメニューを開く場合でも、1 つ追加してください。
「Cannot add ... Would exceed limit」と出る。 ストアが、プレイヤーのレベルの容量(levels[].limit)に達しています。レベルをアップグレードするか、上限を引き上げてください。レベルが定義されていない場合、上限はありません。
INTERNAL モードでの入金が失敗する。 プレイヤーの元の残高は amountPlaceholder で読み取られ、単純な数値を返す必要があります。addCommand は、入金の前にコンソールから実行され、成功しなければなりません。コマンド内では {player} と {amount} を使ってください。
「Economy system is not available.」と出る。 transactionMode が VAULT ですが、Vault または経済プロバイダーがありません。両方をインストールして、再起動してください。
利息が支払われない。 利息は、プレイヤーの参加時に、前回の支払い以降に経過した cron サイクル分(最大 100 サイクル)が適用されます。interestEnabled がオンで、interestCron が入力されている必要があります。最初の参加時は、開始時刻が記録されるだけです。レベルの容量に達している残高には、利息は付きません。
アップグレードのコストとして、容量が要求される。 次のレベルに criteria がない場合、アップグレードのコストは、現在のレベルの limit で、保存されている残高から徴収されます。別の要件を定義するには、次のレベルに criteria を追加してください。
プレースホルダーが別のプロファイルの残高を表示する。 profileMode がオンの場合、プレースホルダーとアップグレードボタンは、プレイヤーが選択したプロファイルの残高とレベルを読みます。MMOProfiles がない場合はプレイヤー自身の残高を読みます。MMOProfiles があってアクティブなプロファイルがない場合(選択画面、/mmoprofiles quit の後)は 0 を表示します。プレイヤーの UUID は Main プロファイルの ID であり、その残高を表示したり加算したりしてはならないためです。書き込みは noActiveProfileMessage で拒否され、プロファイルの利息はそのプロファイルが選択されたときに精算されます。
再起動の直後にプレースホルダーが空になる。 ストレージは参加時にバックグラウンドで読み込まれます。最初の読み取りが読み込み完了より前になることがあり、次の読み取りで保存済みの値が表示されます。
プレースホルダーが空になる。 プレースホルダー内の ID は、定義の名前ではなく、エントリ ID でなければなりません。/papi parse me %typewriter_ns_balance_<id>% を実行して、テストしてください。
関連する拡張機能
- GUI — レイアウトとボタンに使われるメニューエンジン。
- MMOProfiles — 任意。
profileModeが使います。