Anvilguiは、ANVILインベントリを通じてMinecraftのユーザー入力をキャプチャするライブラリです。 Minecraft / Bukkit / Spigot / Paper APIの領域内のアンビルインベントリは非常にニッカイで、最終的にはユーザー入力のタスクに完全に使用する能力をサポートしていません。その結果、ANVILインベントリを使用してユーザー入力を達成する唯一の方法には、難読化された逆コンパイルコードとの相互作用が必要です。 Anvilguiは、プロジェクトをバージョン固有のコードに依存せずに、簡単で多用途で使いやすいソリューションを提供します。
Anvilguiが機能するためには、Spigotマッピングを使用する必要がありますが、どうすれば自分がいることを確認できますか?以下の質問は、あなたが物事を一掃するのに役立ちます。
あなたのプラグインはbukkitプラグインですか?プラグインは、 plugin.yml
ファイルが含まれており、 paper-plugin.yml
ファイルが含まれていない場合、Bukkitプラグインです。その場合、デフォルトでは、SPIGOTマッピングを使用しています。
あなたのプラグインは紙のプラグインですか?プラグインは、 plugin.yml
ファイルも含まれていても、 paper-plugin.yml
ファイルが含まれている場合、常にペーパープラグインです。その場合、デフォルトでは、SPIGOTマッピングを使用していませんが、これらの指示に従ってマニフェストエントリを介してそれらを有効にすることができます。
Pecoweweight userdev Toolchainを使用していますか?その場合、デフォルトでは、SPIGOTマッピングを使用していませんが、reobFartifactConfigurationオプションを使用して有効にすることができます。
開発者の場合は、バージョンにラッパーモジュールを追加するプルリクエストを送信します。それ以外の場合は、[問題]タブで問題を作成してください。
Anvilguiには、MavenまたはMaven互換のビルドシステムの使用が必要です。
< dependency >
< groupId >net.wesjd</ groupId >
< artifactId >anvilgui</ artifactId >
< version >1.10.3-SNAPSHOT</ version >
</ dependency >
< repository >
< id >codemc-snapshots</ id >
< url >https://repo.codemc.io/repository/maven-snapshots/</ url >
</ repository >
他のプラグインとの競合を防ぐために、優れた市民になり、名前空間内に依存関係を移転することが最善です。依存関係を再配置する方法の例は次のとおりです。
< build >
< plugins >
< plugin >
< groupId >org.apache.maven.plugins</ groupId >
< artifactId >maven-shade-plugin</ artifactId >
< version >${shade.version}</ version > <!-- The version must be at least 3.5.0 -->
< executions >
< execution >
< phase >package</ phase >
< goals >
< goal >shade</ goal >
</ goals >
< configuration >
< relocations >
< relocation >
< pattern >net.wesjd.anvilgui</ pattern >
< shadedPattern >[YOUR_PLUGIN_PACKAGE].anvilgui</ shadedPattern > <!-- Replace [YOUR_PLUGIN_PACKAGE] with your namespace -->
</ relocation >
</ relocations >
< filters >
< filter >
< artifact >*:*</ artifact >
< excludeDefaults >false</ excludeDefaults >
< includes >
< include >net/wesjd/anvilgui/**</ include >
</ includes >
</ filter >
</ filters >
</ configuration >
</ execution >
</ executions >
</ plugin >
</ plugins >
</ build >
注: <minimizeJar>
を解決するために、最終<filter>
からanvilgui VerionWrapper
sを削除し、ライブラリを使用できなくするには、 <filters>
セクションに上記のように例が含まれていることを確認してください。
AnvilGUI.Builder
クラスは、anvilguiの構築方法です。次の方法では、表示されているGUIのさまざまな部分を変更できます。 Javadocsはこちらから入手できます。
onClose(Consumer<StateSnapshot>)
プレイヤーがAnvil GUIを閉じたときに呼び出されるConsumer<StateSnapshot>
引数を取ります。
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
クリックされたスロットと現在のGUI状態のスナップショットを使用して、 BiFunction
を取ります。この関数は、プレーヤーがインベントリ内のスロットをクリックすると呼び出されます。 List<AnvilGUI.ResponseAction>
を返す必要があります。
AnvilGUI.ResponseAction.close()
)AnvilGUI.ResponseAction.replaceInputText(String)
)AnvilGUI.ResponseAction.updateTitle(String, boolean)
)AnvilGUI.ResponseAction.openInventory(Inventory)
)AnvilGUI.ResponseAction.run(Runnable)
)Collections.emptyList()
)アクションのリストは、提供される順序で実行されます。
builder . onClick (( slot , stateSnapshot ) -> {
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( stateSnapshot . getText (). equalsIgnoreCase ( "you" )) {
stateSnapshot . getPlayer (). sendMessage ( "You have magical powers!" );
return Arrays . asList (
AnvilGUI . ResponseAction . close (),
AnvilGUI . ResponseAction . run (() -> myCode ( stateSnapshot . getPlayer ()))
);
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
});
onClickAsync(ClickHandler)
ClickHandler
、 BiFunction<Integer, AnvilGui.StateSnapshot, CompletableFuture<AnvilGUI.ResponseAction>>
の速記を取ります。これは、 CompletableFuture
を返すため、 onClick()
とまったく同じように振る舞い、したがって、 ResponseAction
クションの非緊密な計算を可能にします。
builder . onClickAsync (( slot , stateSnapshot ) -> CompletedFuture . supplyAsync (() -> {
// this code is now running async
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( database . isMagical ( stateSnapshot . getText ())) {
// the `ResponseAction`s will run on the main server thread
return Arrays . asList (
AnvilGUI . ResponseAction . close (),
AnvilGUI . ResponseAction . run (() -> myCode ( stateSnapshot . getPlayer ()))
);
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
}));
allowConcurrentClickHandlerExecution()
Anvilguiに、 onClickAsync(ClickHandler)
によって設定されたクリックハンドラーの同時実行を防ぐために設置されたメカニズムを無効にするように指示します。
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
これにより、ユーザーが提供されているアンビルスロットでアイテムを取得 /入力できるようになります。この機能は、ANVIL GUIを使用して入力システムを作成しようとする場合に役立ちます。
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
Anvilguiに、ユーザーがエスケープを押して在庫を閉じるのを防ぐように伝えます。再生するパスワード入力などの状況に役立ちます。
builder . preventClose ();
geyserCompat()
これにより、ガイザーソフトウェアとの互換性が切り替えられ、特に岩盤で0エクスペリエンスレベルでAnvilguiを使用できます。デフォルトで有効になっています。
builder . geyserCompat ();
text(String)
名前を変更するフィールドの最初のテキストを含む文字String
を取ります。 itemLeft
が提供されている場合、表示名は提供されたテキストに設定されます。 itemLeft
が設定されていない場合、紙が使用されます。
builder . text ( "What is the meaning of life?" );
itemLeft(ItemStack)
左の入力スロットに配置するカスタムItemStack
を使用します。
ItemStack stack = new ItemStack ( Material . IRON_SWORD );
ItemMeta meta = stack . getItemMeta ();
meta . setLore ( Arrays . asList ( "Sharp iron sword" ));
stack . setItemMeta ( meta );
builder . itemLeft ( stack );
itemRight(ItemStack)
右の入力スロットに配置するカスタムItemStack
を使用します。
ItemStack stack = new ItemStack ( Material . IRON_INGOT );
ItemMeta meta = stack . getItemMeta ();
meta . setLore ( Arrays . asList ( "A piece of metal" ));
stack . setItemMeta ( meta );
builder . itemRight ( stack );
title(String)
文字通り在庫タイトルとして使用される文字String
を取ります。 Minecraft 1.14以上でのみ表示されます。
builder . title ( "Enter your answer" );
jsonTitle(String)
JSONとしてシリアル化されたリッチテキストコンポーネントを含むString
を取ります。ヘックスカラーコードまたはアドベンチャーコンポーネントインターナットを備えた設定タイトルに役立ちます。 Minecraft 1.14以上でのみ表示されます。
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
このAnvil GUIを作成しているPlugin
オブジェクトを使用します。リスナーを登録するには必要です。
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
メインサーバースレッドで実行する必要があるExecutor
を使用します。メインサーバースレッドがBukkitスケジューラからアクセスできない場合、Foliaサーバーのように、Folia Awareエグゼクティアのために交換できます。
builder . mainThreadExecutor ( executor );
open(Player)
Anvil GUIを開く必要があるPlayer
を取ります。この方法は、新しいAnvilGUI.Builder
オブジェクトを作成する必要なく、複数回呼び出すことができます。
builder . open ( player );
new AnvilGUI . Builder ()
. onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
})
. onClick (( slot , stateSnapshot ) -> { // Either use sync or async variant, not both
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( stateSnapshot . getText (). equalsIgnoreCase ( "you" )) {
stateSnapshot . getPlayer (). sendMessage ( "You have magical powers!" );
return Arrays . asList ( AnvilGUI . ResponseAction . close ());
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
})
. preventClose () //prevents the inventory from being closed
. text ( "What is the meaning of life?" ) //sets the text the GUI should start with
. title ( "Enter your answer." ) //set the title of the GUI (only works in 1.14+)
. plugin ( myPluginInstance ) //set the plugin instance
. open ( myPlayer ); //opens the GUI for the player provided
Mavenを使用して依存関係を処理します。 Java 21を使用してmvn clean install
実行して、プロジェクトを構築します。
このプロジェクトでは、Spotless Mavenプラグインを利用して、スタイルガイドラインを実施しています。コードがガイドラインを満たしていない場合、プロジェクトを構築することはできません。すべてのコードのフォーマット問題を修正するには、 mvn spotless:apply
。
このプロジェクトは、MITライセンスの下でライセンスされています。