提供: Minecraft Modding Wiki
2015年12月11日 (金) 23:46時点におけるA.K. (トーク | 投稿記録)による版 (acceptedMinecraftVersionsの追加)
移動先: 案内検索

この記事は1.8のブロック追加を読んだ事を前提としています。

この記事は"Minecraft Forge Universal 11.14.3.1487~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
C block.png
Blockに関係のあるチュートリアルです。

簡単なB3Dモデル利用ブロックの追加方法

ブロックの追加

注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。

通常のブロック追加と同様の箇所の解説は省きます。1.8のブロック追加を参照のこと。

※:使用するB3Dのオブジェクトはエディタで1つにまとめておくこと。

ソースコード

  • SampleB3DModelMod.java
package com.example.examplemod;

import net.minecraft.block.Block;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.b3d.B3DLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

/**
 * Modエントリークラス
 */
@Mod(modid = SampleB3DModelMod.MOD_ID, 
     name = "SampleMod", 
     version = "1.0", 
     dependencies = "required-after:Forge@[1.8-11.14.0.1239,)", 
     acceptedMinecraftVersions = "[1.8,1.8.8]",
     useMetadata = true)
public class SampleB3DModelMod {
    /** ModId文字列 */
    public static final String MOD_ID = "sampleb3dmod";
    /** ブロック登録名 */
    public static final String BLOCK_REGISTER_NAME = "sample_b3d_block";

    /** このクラスのインスタンス。GUI実装するなどしなければ不要。他のMODのエントリークラスのインスタンスも取得可能 */
    @Mod.Instance("SampleMod")
    public static SampleB3DModelMod INSTANCE;

    /** サンプルブロックのインスタンス */
    public static Block sampleB3dModelBlock;

    /** PreInitialization処理。ブロック・アイテムの登録、Messageクラスの登録、ItemMeshDefinition、CustomStateMapperの登録を行う */
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        /* ブロックのインスタンス生成 */
        sampleB3dModelBlock = new SampleB3dBlock();

        /*ブロックの登録。登録文字列はMOD内で被らなければ何でも良い。*/
        GameRegistry.registerBlock(sampleB3dModelBlock, SampleItemBlock.class, BLOCK_REGISTER_NAME);

        if (event.getSide().isClient()) {
            /* B33Dファイルの配置先ドメイン名登録。基本的にmodidの小文字を登録 */
            B3DLoader.instance.addDomain(MOD_ID);
            /*手持ち描画用のModelResourceLocation登録*/
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleB3dModelBlock), 0, new ModelResourceLocation(MOD_ID + ":" + BLOCK_REGISTER_NAME, "inventory"));
        }
    }
}
  • SampleB3dBlock.java
package com.example.examplemod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;

public class SampleB3dBlock extends Block {

    /**
     * コンストラクタ
     */
    public SampleB3dBlock() {
        super(Material.ground);
        /*ブロックの内部名設定*/
        this.setUnlocalizedName("blockSampleB3d");
        /*クリエイティブタブ設定*/
        this.setCreativeTab(CreativeTabs.tabBlock);
        /*ブロックの大きさを設定*/
        this.setBlockBounds(0.199F, 0, 0.199F, 0.8F, 0.601F, 0.8F);
    }

    /**
     * 通常のブロックの形かどうか
     * @return true:通常のブロックと同じ。false:違う場合。
     */
    @Override
    public boolean isNormalCube() {
        return false;
    }

    /**
     * 1*1*1の大きさのブロックかどうか
     * @return true:1*1*1の立方体、false:違う場合。
     */
    @Override
    public boolean isFullCube() {
        return false;
    }

    /**
     * 不透過ブロックかどうか。
     * @return true:不透過。false:透過
     */
    @Override
    public boolean isOpaqueCube() {
        return false;
    }
}
  • sample_b3d_block.json
{
    "forge_marker": 1,
    "defaults": {
        "textures": {
            "sample_b3d_block": "samplemod:blocks/sample_b3d_block"
        },
        "model": "samplemod:sample_b3d_block.b3d"
    },
    "variants": {
        "normal": [{
            "transform" : "forge:default-block"
        }],
        "inventory": [{
            "transform" : "forge:default-block"
        }]
    }
}

解説

SampleB3DModelMod.java

/* B33Dファイルの配置先ドメイン名登録。基本的にmodidの小文字を登録 */
            B3DLoader.instance.addDomain(MOD_ID);

B3DLoaderにドメイン名を登録する処理。 登録しないと、B3Dファイルの走査対象フォルダとならない。

/*手持ち描画用のModelResourceLocation登録*/
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleB3dModelBlock), 0, new ModelResourceLocation(MOD_ID + ":" + BLOCK_REGISTER_NAME, "inventory"));

手持ち描画用の登録処理。 手持ちはアイコンでやりたい場合も、そのアイコンのJSON名を登録する必要あり。

sample_b3d_block.json

"forge_marker": 1,

forgeの形式のJSONであることを指定している。

"defaults": {
        "textures": {
            "sample_b3d_block": "sampleb3dmod:blocks/sample_b3d_block"
        },
        "model": "sampleb3dmod:sample_b3d_block.b3d"
    },

blockstateに依らない項目の設定。

  • textures:B3Dファイル内のテクスチャ指定文字列の置換。

この場合は"sample_b3d_block.png"のテクスチャで指定していたものを"assets/sampleb3dmod/textures/blocks/sample_b3d_block.png"に置き換えている。

  • model:モデルのJSON名指定。B3Dモデルの場合B3Dファイルを指定。この場合は"assets/sampleb3dmod/models/block/sample_b3d_block.b3d"を指定している。

他にもuvlockを設定できる。

"variants": {
        "normal": [{
            "transform" : "forge:default-block"
        }],
        "inventory": [{
            "transform" : "forge:default-block"
        }]
    }

blockstate別の指定。

  • normal:特別なBlockStateを持たないブロックの場合の指定。
  • inventory:手持ち描画時の指定。

この中では以下の項目が設定できる。

  • transform:モデルの平行移動、拡大縮小、回転の指定。以下の項目で設定できる他、通常のブロックの指定として"forge:default-block"という指定もできる。
    • translation:平行移動。"[x, y, z]"の形で指定。※機能してない
    • scale:拡大縮小。"1.0"の形で指定。※機能してない
    • rotate:回転。"[ {"y": -45}, {"x": 10}, {"z": 170} ]"の形で指定。※機能してない
  • submodel:blockstate別サブモデル指定。

参考等

Blender用B3D出力プラグイン(改良)