Table of Contents

モデルプレディケートプロバイダー

〔Predicateは、英語で述語という意味があります。 述語という言葉は「××は○○である」という文章の「○○である」の部分を指します。プログラミングの世界では、 あるオブジェクト x が「x は○○である」という条件を満たすかどうかを調べるメソッドのことをプレディケート(predicate)と呼びます。

導入

モデルプロバイダーは、ItemStack からのデータに基づいて項目のモデルを動的に変更するために使用されます。一般的な例は、弓が引かれた時間に基づいて異なるテクスチャを持つ弓です。すべてのプロバイダーは、アイテムのモデルファイルの overrides セクションで使用されます。

実践例

この例では、 EXAMPLE_BOW というカスタムの弓アイテムがあるとします。

メソッド内で、 ModelPredicateProvider をアイテムと Identifier に登録します。 Identifier 〔識別子〕を使用する場合、名前空間を指定する必要はありません。名前空間はいずれも Minecraft のプロバイダーと競合しないためです。これは、ClientModInitializeronInitializeClient メソッドで行う必要があります。 ClientModInitializer がない場合は、エントリポイント チュートリアルで追加方法を確認してください。

  1. ModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pull"), (itemStack, clientWorld, livingEntity) -> {
  2. if (livingEntity == null) {
  3. return 0.0F;
  4. }
  5. return livingEntity.getActiveItem() != itemStack ? 0.0F : (itemStack.getMaxUseTime() - livingEntity.getItemUseTimeLeft()) / 20.0F;
  6. });
  7.  
  8. ModelPredicateProviderRegistry.register(EXAMPLE_BOW, new Identifier("pulling"), (itemStack, clientWorld, livingEntity) -> {
  9. if (livingEntity == null) {
  10. return 0.0F;
  11. }
  12. return livingEntity.isUsingItem() && livingEntity.getActiveItem() == itemStack ? 1.0F : 0.0F;
  13. });

ModelPredicateProviderRegistry が一部のバージョンに存在しない場合は、 FabricModelPredicateProviderRegistry を使用できます。

ModelPredicateProvider は、レンダリングされている現在のスタックの ItemStack、クライアントがいる現在のワールドのClientWorld、および LivingEntity を受け取る機能インターフェースです。アイテムのユーザーとして(1.17 以降では、int も受け取ります)。

すべての ModelPredicateProvider は、モデルのさまざまな状態を表すために使用できる float を返すか、1.0f0f をそれぞれ返すことによって true/false 値を返します。 float 値は 0.0f と 1.0f の間の値を取ります。

pull 〔弓引き〕プレディケートを詳しく見てみると、エンティティが null かどうかを最初に確認することがわかります。これは、アイテムが使用されている(つまり、地面に落とされた)コンテキストの外でアイテムをレンダリングできるためです。次に、エンティティがアイテムを使用していることを確認します。そうでない場合、使用されていないときにアイテムにモデルプレディケートが適用される可能性があります。最後に、 itemStack.getMaxUseTime() から livingEntity.getItemUseTimeLeft() を引きます。これにより、アイテムが保持されたティック数がわかります。弓を完全に引くするには 20 ティックまたは 1 秒かかるため、この数値を 20.0f で割って、通常の引きの進行のために 0f1.0f の間に正規化します。

これらはすべて便利ですが、アイテムのモデルを変更するために実装する必要がある機能の半分にすぎません。

  1. "overrides": [
  2. {
  3. "predicate": {
  4. "pulling": 1
  5. },
  6. "model": "tutorial:item/example_bow_pulling_0"
  7. },
  8. {
  9. "predicate": {
  10. "pulling": 1,
  11. "pull": 0.65
  12. },
  13. "model": "tutorial:item/example_bow_pulling_1"
  14. },
  15. {
  16. "predicate": {
  17. "pulling": 1,
  18. "pull": 0.9
  19. },
  20. "model": "tutorial:item/example_bow_pulling_2"
  21. }
  22. ]

Minecraft が機能する方法は、指定された値よりも大きい値または一致するモデルがリストの最後にあることを確認することです。 したがって、0.8 の弓引き値で、モデル tutorial:item/example_bow_pulling_1 を使用します。 0.5tutorial:item/example_bow_pulling_0 になります。