【解決済み】[1.10.2]metadataを持つblockがインベントリ内にあると描画されない

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.305417)

【解決済み】[1.10.2]metadataを持つblockがインベントリ内にあると描画されない

投稿記事by ikatako/イカタコ » 2017年7月29日(土) 14:33

こんにちは。blockのitemblockモデルについて質問させていただきます。
metadataを持つblockを追加してみて、それぞれ別の名前を表示させたり、別のblockとしてワールド上に設置・描画させたりまではできました。
しかし、プレイヤーのインベントリ内にあるblock(itemblock?)が正しく描画されず、紫と黒の欠落テクスチャになってしまいます。
Forgeのバージョンは1.10.2-12.18.3.2185です。

ゲームログ
コード: 全て選択
[19:47:43] [Client thread/ERROR] [FML]: Exception loading model for variant wagashimod:BlockWagashi#inventory for item "wagashimod:BlockWagashi", normal location exception:
net.minecraftforge.client.model.ModelLoaderRegistry$LoaderException: Exception loading model wagashimod:item/BlockWagashi with loader VanillaLoader.INSTANCE, skipping
(中略)
Caused by: java.io.FileNotFoundException: wagashimod:models/item/BlockWagashi.json
(後略)

とあるので、存在し得ないitem/BlockWagashi.jsonを参照しようとしているようです...
(本当はitem/BlockWagashi_<そのmetaに対応する文字列>を参照させたいのです。)
略部分
コード: 全て選択
...VanillaLoader.INSTANCE, skipping
   at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:153) ~[ModelLoaderRegistry.class:?]
   at net.minecraftforge.client.model.ModelLoader.loadItemModels(ModelLoader.java:317) ~[ModelLoader.class:?]
   at net.minecraft.client.renderer.block.model.ModelBakery.loadVariantItemModels(ModelBakery.java:170) ~[ModelBakery.class:?]
   at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:147) ~[ModelLoader.class:?]
   at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?]
   at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:122) [SimpleReloadableResourceManager.class:?]
   at net.minecraft.client.Minecraft.startGame(Minecraft.java:540) [Minecraft.class:?]
   at net.minecraft.client.Minecraft.run(Minecraft.java:386) [Minecraft.class:?]
   at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
   at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
   at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
   at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
   at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
   at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
   at GradleStart.main(GradleStart.java:26) [start/:?]
Caused by: java.io.FileNotFoundException: wagashimod:models/item/BlockWagashi.json
   at net.minecraft.client.resources.FallbackResourceManager.getResource(FallbackResourceManager.java:68) ~[FallbackResourceManager.class:?]
   at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:65) ~[SimpleReloadableResourceManager.class:?]
   at net.minecraft.client.renderer.block.model.ModelBakery.loadModel(ModelBakery.java:311) ~[ModelBakery.class:?]
   at net.minecraftforge.client.model.ModelLoader.access$1100(ModelLoader.java:118) ~[ModelLoader.class:?]
   at net.minecraftforge.client.model.ModelLoader$VanillaLoader.loadModel(ModelLoader.java:868) ~[ModelLoader$VanillaLoader.class:?]
   at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:149) ~[ModelLoaderRegistry.class:?]
   ... 20 more

さらに下
コード: 全て選択
[19:47:43] [Client thread/ERROR] [FML]: Exception loading model for variant wagashimod:BlockWagashi#inventory for item "wagashimod:BlockWagashi", blockstate location exception:
net.minecraftforge.client.model.ModelLoaderRegistry$LoaderException: Exception loading model wagashimod:BlockWagashi#inventory with loader VariantLoader.INSTANCE, skipping
 (中略)
Caused by: net.minecraft.client.renderer.block.model.ModelBlockDefinition$MissingVariantException

MissingVariantExcepitionとあるので、ModelBakery.registerItemVariantsが間違っているのでしょうか?
略部分
コード: 全て選択
...VariantLoader.INSTANCE, skipping
   at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:153) ~[ModelLoaderRegistry.class:?]
   at net.minecraftforge.client.model.ModelLoader.loadItemModels(ModelLoader.java:325) ~[ModelLoader.class:?]
   at net.minecraft.client.renderer.block.model.ModelBakery.loadVariantItemModels(ModelBakery.java:170) ~[ModelBakery.class:?]
   at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:147) ~[ModelLoader.class:?]
   at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28) [ModelManager.class:?]
   at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:122) [SimpleReloadableResourceManager.class:?]
   at net.minecraft.client.Minecraft.startGame(Minecraft.java:540) [Minecraft.class:?]
   at net.minecraft.client.Minecraft.run(Minecraft.java:386) [Minecraft.class:?]
   at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
   at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
   at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
   at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
   at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
   at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
   at GradleStart.main(GradleStart.java:26) [start/:?]
Caused by: net.minecraft.client.renderer.block.model.ModelBlockDefinition$MissingVariantException
   at net.minecraft.client.renderer.block.model.ModelBlockDefinition.getVariant(ModelBlockDefinition.java:78) ~[ModelBlockDefinition.class:?]
   at net.minecraftforge.client.model.ModelLoader$VariantLoader.loadModel(ModelLoader.java:1184) ~[ModelLoader$VariantLoader.class:?]
   at net.minecraftforge.client.model.ModelLoaderRegistry.getModel(ModelLoaderRegistry.java:149) ~[ModelLoaderRegistry.class:?]
   ... 20 more


ソースコード
mainclass
コード: 全て選択
importは省略します。
@Mod(modid = Reference.MOD_ID/*, name = Reference.NAME, version = Reference.VERSION*/)
public class main_class {

   @SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.SERVER_PROXY_CLASS)
   public static CommonProxy proxy;

   @EventHandler
   public void preInit(FMLPreInitializationEvent event) {
      ModBlocks.init(); //blockの初期化と登録
      ModBlocks.register();

      ModItems.init(); //itemの初期化と登録
      ModItems.register();
   }

   @EventHandler
   public void init(FMLInitializationEvent event) {
      proxy.init(); //itemやblockのregisterrenderを行います。
      proxy.registerModelBakeryStuff(); //ModelBakery.registerItemVariantsを実行します。

      ModRecipes.register(); //レシピ登録
      ModTileEntities.register(); //タイルエンティティ登録
   }

   @EventHandler
   public void postinit(FMLPostInitializationEvent event) {}
}


clientproxy (commonproxyとserverproxyは何もしません。)
コード: 全て選択
public class ClientProxy implements CommonProxy {

   @Override
   public void init() {
      ModItems.registerRenders(); //itemやblockのregisterrenderを実行
      ModBlocks.registerRenders();

      //TileEntitySpecialRendererのbind
      ModTileEntities.bindTESR();
   }

   public void registerModelBakeryStuff() { //mainclassから呼ばれます。
      ModelBakery.registerItemVariants(Item.getItemFromBlock(ModBlocks.blockwagashi),
            new ResourceLocation(Reference.MOD_ID + ":" + "BlockWagashi_white"),
            new ResourceLocation(Reference.MOD_ID + ":" + "BlockWagashi_orange"),
            (中略)
            new ResourceLocation(Reference.MOD_ID + ":" + "BlockWagashi_black"));
   }

}


ModBlocks
コード: 全て選択
public class ModBlocks {
   public static Block blockwagashi;

   public static void init() { //mainclassから呼ばれます。
      blockwagashi = new BlockWagashi();
   }

   public static void register() { //同じくmainclassから
      registerMetadataBlock(blockwagashi);
   }

   private static void registerMetadataBlock(Block block) { //itemblockを登録します。
      GameRegistry.register(block);
      ItemBlock item = new ItemBlockMeta(block);
      item.setRegistryName(block.getRegistryName()); //ItemBlockMeta(後述)からitemblockのRegistryNameを指定します。
      GameRegistry.register(item);
   }

   public static void registerRenders() { //proxyから
      for(int i = 0; i < WagashiTypes.values().length; i++) {
         registerRender(blockwagashi, i, blockwagashi.getRegistryName() + "_" + WagashiTypes.values() [i].getName());
//「BlockWagashi_<WagashiTypes(後述)で定義するmetadataの名前(whiteなど)>.json」を読み込ませようとしています。
      }
   }
   private static void registerRender(Block block, int meta, String fileName) {
      ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), meta, new ModelResourceLocation(Reference.MOD_ID + ":" + fileName, "inventory"));
   }
}


BlockWagashi (implements元のIMetaBlockNameは、getSpecialName()を書いているだけです。(定義はしていません。))
コード: 全て選択
public class BlockWagashi extends Block implements IMetaBlockName {

   public static final PropertyEnum TYPE = PropertyEnum.create("type", WagashiTypes.class);

   public BlockWagashi() {
      super(Material.ROCK);
      setUnlocalizedName(Reference.AdditionalBlocks.WAGASHI.getUnlocalizedName()); //blockのunlocalizednameと
      setRegistryName(Reference.AdditionalBlocks.WAGASHI.getRegistryName());            //registerynameを定義しています。
      setDefaultState(this.blockState.getBaseState().withProperty(TYPE, WagashiTypes.WHITE));
                //DefaultStateをWagashiTypes(後述)のWHITEに設定しています。
   }

   @Override
   protected BlockStateContainer createBlockState() {
      return new BlockStateContainer(this, new IProperty[] {TYPE});
   }

   @Override
   public IBlockState getStateFromMeta(int meta) {
      return getDefaultState().withProperty(TYPE, WagashiTypes.values()[meta]);
   }

   @Override
   public int getMetaFromState(IBlockState state) {
      WagashiTypes type = (WagashiTypes) state.getValue(TYPE);
      return type.getID();
   }

   @Override
   public int damageDropped(IBlockState state) {
      return getMetaFromState(state);
   }

   @Override
   public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) {
      return new ItemStack(Item.getItemFromBlock(this), 1, this.getMetaFromState(world.getBlockState(pos)));
   }

   @Override
   public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list) {
      for(int i = 0; i < WagashiTypes.values().length; i++) {
         list.add(new ItemStack(itemIn, 1, i));
      }
   }

   @Override
   public String getSpecialName(ItemStack stack) {
      return WagashiTypes.values()[stack.getItemDamage()].getName();
   }


}


WagashiTypes
コード: 全て選択
public enum WagashiTypes implements IStringSerializable {
      WHITE("white", 0),
      ORANGE("orange", 1),
      (中略)
      BLACK("black",15);

      private int ID;
      private String name;

      private WagashiTypes(String name,int ID) {
         this.ID = ID;
         this.name = name;
      }
      @Override
      public String getName() {
         return this.name;
      }
      public int getID() {
         return ID;
      }
      @Override
      public String toString() {
         return getName();
      }
   }


ItemBlockMeta
コード: 全て選択
public class ItemBlockMeta extends ItemBlock {

   public ItemBlockMeta(Block block) {
      super (block);
      if (!(block instanceof IMetaBlockName)) { //渡されたblockがIMetaBlockNameを実装しているか確認しています。(問題のblockではきちんと実装させています。)
         throw new IllegalArgumentException(String.format("%s is not an instance of IMetaBlockName!", block.getUnlocalizedName()));
      }
      this.setMaxDamage(0);
      this.setHasSubtypes(true);
   }
   @Override
   public int getMetadata(int damage) {
      return damage;
   }
   @Override
   public String getUnlocalizedName(ItemStack stack) {
      return super.getUnlocalizedName(stack) + "." + ((IMetaBlockName)this.block).getSpecialName(stack);
   }
}


jsonファイル
blockstates/BlockWagashi.json
コード: 全て選択
{
    "variants": {
        "type=white": {"model": "wagashimod:BlockWagashi_white"},
        "type=orange": {"model": "wagashimod:BlockWagashi_orange"},
        (中略)
        "type=black": {"model": "wagashimod:BlockWagashi_black"}
    }
}


block/BlockWagashi_white.json (これ以外にもorangeなどがあります。)
コード: 全て選択
{
    "parent": "block/cube_all",
        "textures": {
      "all": "wagashimod:blocks/wagashi_white"
   },
       "display": {
        "gui": {
            "rotation": [ 30, 225, 0 ],
            "translation": [ 0, 0, 0],
            "scale":[ 0.7, 0.7, 0.7 ]
        },
        "ground": {
            "rotation": [ 0, 0, 0 ],
            "translation": [ 0, 3, 0],
            "scale":[ 0.4, 0.4, 0.4 ]
        },
        "fixed": {
            "rotation": [ 0, 0, 0 ],
            "translation": [ 0, 0, 0],
            "scale":[ 0.5, 0.5, 0.5 ]
        },
        "thirdperson_righthand": {
            "rotation": [ 75, 45, 0 ],
            "translation": [ 0, 2.5, 0],
            "scale": [ 0.6, 0.6, 0.6 ]
        },
        "firstperson_righthand": {
            "rotation": [ 0, 45, 0 ],
            "translation": [ 0, 0, 0 ],
            "scale": [ 0.60, 0.60, 0.60 ]
        },
        "firstperson_lefthand": {
            "rotation": [ 0, 225, 0 ],
            "translation": [ 0, 0, 0 ],
            "scale": [ 0.60, 0.60, 0.60 ]
        }
    }
}


item/BlockWagashi_white.json (これ以外にもorangeなどがあります。)
コード: 全て選択
{
    "parent": "wagashimod:block/BlockWagashi_white"
}


ここここなど色々なところを参考にしたため、ソースコードがぐちゃぐちゃになっています。すみません...

投げやりな感じで申し訳ないのですが、どうかご教授お願い致します。
最後に編集したユーザー ikatako/イカタコ [ 2017年8月09日(水) 18:26 ], 累計 1 回
アバター
ikatako/イカタコ
ID:937e32df
大工さん
 
記事: 68
登録日時: 2014年2月03日(月) 18:47
お住まい: 溶岩の中

  • (PostNo.305804)

Re: [1.10.2]metadataを持つblockがインベントリ内にあると描画されない

投稿記事by CrafterKina » 2017年8月04日(金) 19:05

senbongi さんが書きました:こんにちは。blockのitemblockモデルについて質問させていただきます。
metadataを持つblockを追加してみて、それぞれ別の名前を表示させたり、別のblockとしてワールド上に設置・描画させたりまではできました。
しかし、プレイヤーのインベントリ内にあるblock(itemblock?)が正しく描画されず、紫と黒の欠落テクスチャになってしまいます。

ModelLoader#setCustomModelResourceLocationはMinecraftの初期化前(StateEventではFMLPreInitializationEventが該当)に呼ばれる必要があります。
前述の通りFMLPreInitializationEvent、もしくは専用のイベントであるModelRegistryEvent(1.10.2-12.18.1.2092にて追加)で呼ぶと良いでしょう。
また、モデルなどのリソース類は小文字が推奨されます。
さらにModelLoader#setCustomModelResourceLocationでモデルを指定する場合、ModelBakery#registerItemVariantsの呼び出しは必要ありません。(逆に、ModelLoader#setCustomMeshDefinitionでの指定では必要になります)
アバター
CrafterKina
ID:10ad58cf
石炭掘り
 
記事: 190
登録日時: 2013年4月06日(土) 14:42
お住まい: 廃坑

  • (PostNo.305953)

Re: [1.10.2]metadataを持つblockがインベントリ内にあると描画されない

投稿記事by ikatako/イカタコ » 2017年8月07日(月) 18:39

CrafterKina さんが書きました:さらにModelLoader#setCustomModelResourceLocationでモデルを指定する場合、ModelBakery#registerItemVariantsの呼び出しは必要ありません。(逆に、ModelLoader#setCustomMeshDefinitionでの指定では必要になります)

調べてみたのですが、ModelLoader#setCustomMeshDefinitionの使い方がよくわかりません。
こんな質問ばかりで大変申し訳ないです。

因みに、preInit内でModelLoader#setCustomModelResourceLocationを呼んでみたり、リソース名を小文字にしてみたりしたのですが、症状は全く同じままです...
アバター
ikatako/イカタコ
ID:937e32df
大工さん
 
記事: 68
登録日時: 2014年2月03日(月) 18:47
お住まい: 溶岩の中

  • (PostNo.306033)

Re: [1.10.2]metadataを持つblockがインベントリ内にあると描画されない

投稿記事by CrafterKina » 2017年8月09日(水) 06:49

senbongi さんが書きました:因みに、preInit内でModelLoader#setCustomModelResourceLocationを呼んでみたり、リソース名を小文字にしてみたりしたのですが、症状は全く同じままです...

初期化前にModelLoader#setCustomModelResourceLocationを呼び出しても全く同じコンソールログであるという場合には、
  • アイテムの登録前に呼び出している
  • RegistryNameが不正
などの可能性が考えられます。

コンソールログは異なるもののアイテム状態のモデルがMissingであるという場合には
  • ModelResourceLocationが不正
という可能性が挙げられます。
例えば、BlockWagashiのRegistryNameが"wagashimod:block_wagashi"であればCustomModelResourseLocationが"wagashimod:wagashimod:block_wagashi_white#inventory"などになることが予想できます。

上記のいずれの可能性も当てはまらない/絞り込めない、という場合はコンソールログの完全版と改変後のソースがないとちょっとこれ以上の解析は厳しいです。

ModelLoader#setCustomMeshDefinitionに関しては完全に蛇足なので気にしなくていいです。
蛇足
ModelLoader#setCustomMeshDefinitionはモデルの切り替えをより包括的に柔軟に行うためのものです。
NBTに応じて変えたいといった例が最も典型的でしょう。
この場合は、実行時にすべてのResourceLocationを把握することが不可能であるため明示的にリストアップして#registerItemVariantsに渡して登録してあげないといけません。
対して#setCustomModelResourceLocationは読み込まれうるResourceLocationが容易にリストアップ可能であるため、実装を見れば分かる通り#registerItemVariantsを勝手に呼び出してくれます。よって、明示的にこちら側から#registerItemVariantsを呼び出す必要はありません。もちろん、呼び出したからといって悪影響はないのでそのままにしておいても大丈夫です。
アバター
CrafterKina
ID:10ad58cf
石炭掘り
 
記事: 190
登録日時: 2013年4月06日(土) 14:42
お住まい: 廃坑

  • (PostNo.306066)

Re: 【解決済み】[1.10.2]metadataを持つblockがインベントリ内にあると描画されない

投稿記事by ikatako/イカタコ » 2017年8月09日(水) 18:26

CrafterKina さんが書きました:
  • ModelResourceLocationが不正
という可能性が挙げられます。
例えば、BlockWagashiのRegistryNameが"wagashimod:block_wagashi"であればCustomModelResourseLocationが"wagashimod:wagashimod:block_wagashi_white#inventory"などになることが予想できます。


コード: 全て選択
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), meta, new ModelResourceLocation(Reference.MOD_ID + ":" + fileName, "inventory"));
からReference.MOD_ID + ":" + を抜いて
コード: 全て選択
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), meta, new ModelResourceLocation(fileName, "inventory"));
に変更してみたところ、正常に動作しました!
本当に有難うございました!
サイン
画像
こちらで、和菓子が作れる和菓子MODを配布しています。よかったらどうぞ。
実はへっぽこなMODを作ったことがあります (1.7.10)
こちらで にわとりMODの配布を行っています。 単機能MODです。
アバター
ikatako/イカタコ
ID:937e32df
大工さん
 
記事: 68
登録日時: 2014年2月03日(月) 18:47
お住まい: 溶岩の中


Return to 質問:開発・制作関連

x