【解決済み】1.10.2のmetadataのモデル指定について

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

【解決済み】1.10.2のmetadataのモデル指定について

投稿記事by kixiko » 2017年7月01日(土) 11:13

こんにちは。1.10.2のforge-1.10.2-12.18.3.2185-mdkを使ったブロック追加のMOD製作をしています。

メタデータで追加したブロックのモデル指定についての質問です。
※トピックを立てるまでもない質問トピックで質問させていただいていたのですが、お返事をいただけなかったためそちらを削除しトピックを立てさせていただきましたm( > < )m

メタデータの追加は成功し、インベントリにも表示でき、名前の表示も別々にでき、持っているアイテムの見た目も指定のものにできています。
しかし、実際に置いたときに全てのメタのモデルが、メタ0に指定したモデルになってしまいます。

参考にしたのは、MinecraftModdingWikiの「1.10.2のブロック追加」と「1.8のブロック追加」とたくみのブログさんの「[MINECRAFT][1.8] 覚書 : メタデータからBlockStateへ移行(https://ameblo.jp/hasabon/entry-11993846454.html)」とMrCrayfishさんのGithubのコードが主です。あとは、「ModelBakery」など検索し英語のサイトを見漁ったりなどしました。(Javaに関しては初心者で勉強中です。)

以下コードです。

myMod.java
コード: 全て選択
packagemyMod;

import myMod.init.ModBlocks;
import myMod.init.ModCrafting;
import myMod.init.ModItems;
import myMod.proxy.CommonProxy;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

import static myMod.init.ModBlocks.flower_leaves;

@Mod(modid = myMod.MOD_ID,
        name = myMod.NAME,
        version = myMod.VERSION,
        acceptedMinecraftVersions = myMod.ACCEPTED_MC_VERSIONS,
        useMetadata = true)

public class myMod {

    public static final String MOD_ID = "mymod";
    public static final String NAME = "my Mod";
    public static final String VERSION = "1.0.0";
    public static final String ACCEPTED_MC_VERSIONS = "[1.10.2]";

    public static final String CLIENT_PROXY_CLASS = "myMod.proxy.ClientProxy";
    public static final String SERVER_PROXY_CLASS = "myMod.proxy.ServerProxy";
    @Mod.Instance
    public static myMod instance;

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

    public static CreativeTabs ObjectTab = new CreativeTabs("objecttab") {
        @Override
        public Item getTabIconItem() {
            return Item.getItemFromBlock(ModBlocks.quill_pen);
        }
    };
    public static CreativeTabs TableChairTab = new CreativeTabs("tablechairtab") {
        @Override
        public Item getTabIconItem() {
            return Item.getItemFromBlock(ModBlocks.chair_stool_normal);
        }
    };
    public static CreativeTabs PlantsTab = new CreativeTabs("plantstab") {
        @Override
        public Item getTabIconItem() {
            return Item.getItemFromBlock(ModBlocks.quill_pen);
        }
    };

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event){
        System.out.println("Pre Init");
        ModItems.init();
        ModItems.register();
        ModBlocks.init();
        ModBlocks.register();

        if (event.getSide().isClient())
        {
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(flower_leaves), 0, new ModelResourceLocation(new ModelResourceLocation(MOD_ID, "flower_leaves"), "inventory"));
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(flower_leaves), 1, new ModelResourceLocation(new ModelResourceLocation(MOD_ID, "flower_leaves_1"), "inventory"));
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(flower_leaves), 2, new ModelResourceLocation(new ModelResourceLocation(MOD_ID, "flower_leaves_2"),"inventory"));
        ModelBakery.registerItemVariants(Item.getItemFromBlock(ModBlocks.flower_leaves), new ResourceLocation(MOD_ID, "flower_leaves"), new ResourceLocation(MOD_ID, "flower_leaves_1"), new ResourceLocation(MOD_ID, "flower_leaves_2"));
        }
    }

    @Mod.EventHandler
    public void init(FMLInitializationEvent event){
        System.out.println("Init");
        proxy.init();
        ModCrafting.register();
    }

    @Mod.EventHandler
    public void postInit(FMLPostInitializationEvent event){
        System.out.println("Post Init");
    }
}


ModBlocks
コード: 全て選択
package myMod.init;

import myMod.blocks.*;

import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class ModBlocks {
    public static Block flower_leaves;

    public static void init(){
        flower_leaves = new BlockFlowerLeaves(Material.LEAVES, SoundType.PLANT).setUnlocalizedName("flower_leaves").setRegistryName("flower_leaves");
    }

    public static void register(){
        registerBlock(flower_leaves);
    }

    public static void registerBlock(Block block){
        GameRegistry.register(block);
        ItemBlock item = new ItemBlock(block){
            @Override
            public String getUnlocalizedName(ItemStack stack) {
                int meta = Math.min(stack.getMetadata(), 15);
                if (meta > 0) {
                    return super.getUnlocalizedName() + "_" + meta;
                }
                return super.getUnlocalizedName();
            }
        };
        item.setRegistryName(block.getRegistryName());
        GameRegistry.register(item);
    }

    public static void registerRenders(){   
        registerRender(flower_leaves);
    }

    public static void registerRender(Block block) {
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory"));
    }
}


BlockFlowerLeaves
コード: 全て選択
package myMod.blocks;

import myMod.myMod;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockRenderLayer;

import java.util.List;

public class BlockFlowerLeaves extends Block{

    public static final PropertyInteger META = PropertyInteger.create("meta", 0, 2);

    public BlockFlowerLeaves(Material material, SoundType sound)
    {
        super(material);
        this.setSoundType(sound);
        this.setLightOpacity(1);
        this.setCreativeTab(myMod.PlantsTab);
        this.setDefaultState(getBlockState().getBaseState());
    }

    @Override
    public IBlockState getStateFromMeta(int meta) {
        return this.getDefaultState().withProperty(META, meta);
    }

    @Override
    public int getMetaFromState(IBlockState state) {
        return (Integer)state.getValue(META);
    }

    @Override
    protected BlockStateContainer createBlockState() {
        return new BlockStateContainer(this, META);
    }

    @Override
    public void getSubBlocks(Item itemIn, CreativeTabs tab, List list) {
        super.getSubBlocks(itemIn, tab, list);
        list.add(new ItemStack(itemIn, 1, 1));
        list.add(new ItemStack(itemIn, 1, 2));
    }

    @Override
    public boolean isFullCube(IBlockState state){
        return  false;
    }

    @Override
    public boolean isOpaqueCube(IBlockState state) {
        return false;
    }

    @Override
    public BlockRenderLayer getBlockLayer(){
        return BlockRenderLayer.CUTOUT;
    }
}


blockstates/flower_leaves
コード: 全て選択
{
  "variants": {
    "meta=0": { "model": "mymod:flower_leaves" },
    "meta=1": { "model": "mymod:flower_leaves_1" },
    "meta=2": { "model": "mymod:flower_leaves_2" }
  }
}


models/block に flower_leaves.json、flower_leaves_1.json、flower_leaves_2.json を作っています。


この「flower_leaves.json」が全てのメタに適応されているという状況です。
ModelBakeryのところが関係しているのだと思って色々やっているのですが、行き詰まっています。

一週間以上ここで停滞していて、かなり参っています。
ヒントや参考になるサイトでも構いませんので、ご教授下さればと思います。
何卒よろしくお願い致します。
最後に編集したユーザー kixiko [ 2017年7月22日(土) 11:25 ], 累計 2 回
kixiko
ID:17d0bee3
水から上がったとこ
 
記事: 5
登録日時: 2017年3月17日(金) 14:04

  • (PostNo.304452)

Re: 1.10.2のmetadataのモデル指定について

投稿記事by kixiko » 2017年7月06日(木) 22:16

お返事いただけないので諦めますヽ(´Д`;)ノ
モデル指定は難しいのですね...。
ありがとうございました。
kixiko
ID:17d0bee3
水から上がったとこ
 
記事: 5
登録日時: 2017年3月17日(金) 14:04

  • (PostNo.304478)

Re: 1.10.2のmetadataのモデル指定について

投稿記事by defeatedcrow » 2017年7月07日(金) 20:25

正直、この記述(blockstate上で指定がされている)でblockstate用jsonの内容が反映されないのは、わからないので回答しようがないです。
ファイルパスの指定やファイルの置き場でしくじっている場合など、ご自身が気づく以外に他人からでは指定できない事項も色々とあるので、コンソールログをよく確認するなどしてみてください。
ケアレスミスのたぐいは本人が気づく以外に対処法がありません。質問に回答することは出来ますが、一緒にミス探しをするのは画面越しでは困難です。

Jsonまわりでミスが有る場合、コンソールログにミスの内容がエラーログとして表示されるので、ログを読むのが一番確実です。

ただ、本来ファイルパスのミスであればMissingアイコンの塊が出現するはずなので、「設置状態がメタ0のモデルになってしまう」という状況は、自身でそのような内容のblockstate用jsonを置いてしまったか、BakedModelEvent等で指定でもしていなければ起こらないです。

他にありえるとしたら、Itemメタに合わせたBlockを設置するような自作ItemBlockを用意していなかったとかでしょうかねぇ
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:7e692061
ラピスラズリ収集家
 
記事: 933
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.304809)

Re: 1.10.2のmetadataのモデル指定について

投稿記事by kixiko » 2017年7月15日(土) 09:02

前回に引き続き、お返事ありがとうございます!

defeatedcrow さんが書きました:Itemメタに合わせたBlockを設置するような自作ItemBlockを用意していなかった


まさにこちらが原因のように思います。
このトピックを見た別の方からも、同じご指摘をいただきました。

マイクラ内で確認してみたところ、置いてあるブロックが全てメタ0になっていました。(手に持っているアイテムがメタ1でも置くとメタ0)
置いた時に持っているアイテムのメタにするための処理が必要、という認識がなかったので、なるほど必要だな、と非常に納得しました。

トピック最初の問題定義が間違っていて、

誤:「メタデータの追加は成功し、インベントリにも表示でき、名前の表示も別々にでき、持っているアイテムの見た目も指定のものにできています。しかし、実際に置いたときに全てのメタのモデルが、メタ0に指定したモデルになってしまいます。」
正:「メタデータの追加は成功し、インベントリにも表示でき、名前の表示も別々にでき、持っているアイテムの見た目も指定のものにできています。しかし、実際に置いたときに、メタ0になってしまいます。」

が正しかったようです。
問題の原因が見つかってよかったです。ありがとうございます!
kixiko
ID:17d0bee3
水から上がったとこ
 
記事: 5
登録日時: 2017年3月17日(金) 14:04


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

x