提供: Minecraft Modding Wiki
移動先: 案内検索

このページはForge wiki内のBasic Blocks Tutorialの翻訳記事です。多くが意訳で、雑な翻訳であること、見やすさに応じて太字などは独自に変えられている場合がありますのでご注意ください。

Havvy's Minecraft Forge Tutorials(Basic Blocks)

終着点

  • Minecraftにおける新しいブロックの追加の基礎を学ぶ
    • Dirt,Stone,GlowStoneに似ているものを追加する
  • 以下のブロックのメソッドの利用方法について理解する
    • setStepSound
    • setResistance
    • setHardness
    • setCreativeTab
  • 以下のブロックのメソッドのオーバーライドの利用方法について理解する。
    • idDropped
    • quantityDropped

前提知識

  • Forgeの開発環境が整っていること
  • Basic Moddingの理解

基本

ブロックはMinecraftのワールドの大部分を構成しています。プレイヤーやモブ、壁画やアイテム以外はすべてがブロックです。

シンプルなブロックを作ることは、Blockのコンストラクタがデフォルトでpublicなので、アイテムを作ることよりも簡単です。一方で、ブロックは設定しなくてはならないことを多く持っています。すべてのブロックは以下のプロパティを持ちます。

Block ID

ゲーム内では、ブロックに0~4095の一意の値をつけます。500からはじめ1つのブロックにつき1づつ使います。

Texture ID

ユーザーに見せるテクスチャ

Material マテリアルは、次のセクションで解説する様々なプロパティを設定します。

Blast Resistance

クリーパーやTNTなどの爆発をどの程度軽減するか。

Luminance

どの程度そのブロックが明るく輝くか

Hardness

そのブロックを掘るのにどれだけ時間がかかるか

Creative Tab

どのクリエイティブのタブに属するか。

Sounds

エンティティがブロックの上を歩いた時、どのような音が聞こえるか。

Materials

残りのプロパティと比べると、マテリアルは何をセットするか複雑です。ですが、良いニュースなことに、あなたはおそらくマテリアルを作成する必要はありません。マテリアルは以下のプロパティによって設定されます。

  • ブロックが燃えるかどうか
  • ブロックがそれ自身でドロップされるかどうか
  • ブロックがピストンなどで押すことができるかどうか
  • マッピングにおけるカラー
  • ブロックが雪や葉っぱのように半透明かどうか
  • ブロックが雪のように地面をカバーするかどうか

正確なリストは、net.minecraft.src.Materialにて見つけることができます。それらの中から選ぶことは難しいはずがありません。もし、あなたの望むようなマテリアルが存在しなければ、新しく作って使えばいいのです。

GenericBlock

Blockを継承しなくてもブロックをすることは可能ですが、カスタムテクスチャを利用する際は便利です。そのため、以下のクラスをtutorial.generic.packageに追加してください。

package tutorial.generic;

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

public class GenericBlock extends Block {

        public GenericBlock (int id, int texture, Material material) {
                super(id, texture, material);
        }
        
        @Override
        public String getTextureFile () {
                return CommonProxy.BLOCK_PNG;
        }

}

このコンストラクタはブロックのコンストラクタに渡しているだけです。Blockに対しての改良は、独自のテクスチャファイルを読み込むためのgetTextureFileに対してのオーバーライドのみです。 残りの設定はbaseModクラス内で行います。

Generic Dirt

ブロッククラスを見てください。Dirtは0.5Fの硬さ、じゃりと同じ音を持っています。ここでは、少しのメソッドしかありません。

public final static Block genericDirt = new GenericBlock(500, 1, Material.ground)
        .setHardness(0.5F).setStepSound(Block.soundGravelFootstep)
        .setBlockName("genericDirt").setCreativeTab(CreativeTabs.tabBlock);

見る限り、ブロックIDは500になり、textureは0でgroundマテリアルを利用します。 setHardnessでは、float値を取ります。dirtは0.5Fで、黒曜石は50Fです。硬さについては、[Minecraft Wiki]にて詳しく記述されています。 setStepSoundは音を設定します。簡単にいえば、あなたの使いたい全ての音はBlockクラス内のフィールドに記述されています。 setBlockNameは内部的なブロックへの名前を設定します。 setCreativeTabはクリエイティブでのインベントリのタブにアイテムを設定します。この例では、ブロックタブが利用されています。

他のプロパティはデフォルト値になっています。

ブロックの登録

ブロックはForgeに登録される必要性があります。そうするために、GameRegistry.registerBlock(Block block,String internalName)をloadメソッドに追加してください。

GameRegistry.registerBlock(genericDirt, "genericDirt");

この内部名はあなたのMODの中の他のブロックに対して一意である必要があります。名前を一意にするための良いアイデアとして、Block.setBlockName()で使った名前と同じにすることを薦めます。 この文字列の値はIDからブロックに対応づける文字列になります。

パブリックネーム

人間の読めない名前をつけるべきではありません。インベントリでこのブロックにオーバーレイした時、このブロックの名前が読めなくなります。このため、パブリックネームをLanguageRegistryを利用して登録する必要があります。ココで使うメソッドはaddNameです。

LanguageRegistry.addName(Object toName, String readableName);

アイテムやアイテムスタックやブロックにオブジェクトはなり得ます。このケースでは、ブロックになります。Genericのloadメソッドに以下のように追加してください。

LanguageRegistry.addName(genericDirt, "Generic Dirt");

これで、アイテムを拾っても"Generic Dirt"と表示されるようになりました。

効果的なツール

ここまでで、ブロックは作れましたが、もしそのブロックを何かのツール(ソードを除く)で掘りたい場合、1.5秒かかります。たとえ、シャベルであっても。これはDirtらしくありません。ブロックを効果的に掘ることを可能にするために、MinecraftForgeのスタティックメソッドであるsetBlockHarvestLevelを利用します。

MinecraftForge.setBlockHarvestLevel(Block block, String toolClass, int tier);

toolClassは"pickaxe"、"shovel"、"axe"もしくは自分で作った新しいツールクラスのな前から選んでください。tierは0が木、1が石、2が鉄、3がダイアモンドです。

それでは、このメソッドを使って、木のシャベルを用いてより効果的に採掘できるようにgenericDirtを設定しましょう。

MinecraftForge.setBlockHarvestLevel(genericDirt, "shovel", 0);

テクスチャ

テクスチャについては、アイテムとブロックで共通なことが多いのでIcons and Texturesを御覧ください。

Generic Ore

Dirtに似せたGeneric Dirtを作りましたが、別のブロックを作ります。もし、ここまで読んで疲れたのなら、ここらで一度休憩しましょう。

GenericOreはBasic itemsチュートリアルで作ったGeneric Ingotをドロップする鉱石です。もし、そのチュートリアルをやっていないなら、Generic.genericIngotをItem.ingot.Ironと置き換えるか、Basic itemsチュートリアルをやってください。 Generic鉱石はダイアモンドよりも強いです。ダイアモンドよりも高い硬さを持つので、ダイアモンドのピッケルでしか掘れないでしょう。

ではGeneric鉱石を作りましょう。以下がGeneric鉱石のコードです。

package tutorial.generic;

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

public class GenericOre extends Block {
        public GenericOre(int id, int texture, Material material) {
                super(id, texture, material);
        }

        @Override
        public String getTextureFile () {
                return CommonProxy.BLOCK_PNG;
        }
}

鉱石への設定はサブクラス化したコンストラクタにおいても可能です。 以下のように追加できます。

setHardness(4.0F); // ダイアモンドよりも33%硬い
setStepSound(Block.soundStoneFootstep);
setBlockName("genericOre");
setCreativeTab(CreativeTabs.tabBlock);

そして、GenericのBasemodクラスに言って、以下のフィールドを追加してください。

public final static Block genericOre = new GenericOre(501, 1, Material.iron);

さらに、以下の3つのメソッドをBaseModクラスのロードメソッドに追加してください。

LanguageRegistry.addName(genericOre, "Genreric Ore");
MinecraftForge.setBlockHarvestLevel(genericOre, "pickaxe", 3);
GameRegistry.registerBlock(genericOre, "genericOre");

もし、これらの一部でも理解していないならば、GenericDirtのセクションを参照してください。

鉱石のドロップ

このアイテムが壊された時、アイテムをドロップするかは言及していません。収穫レベルが低いツールで、収穫することはできません。例えば、Generic鉱石はダイアモンドのピッケルでは収穫出来ますが、他の行為では何も出て来ません。

ブロックが壊れた時に常にドロップはしてほしくありません。ダイアモンドやレッドストーンやGeneric Ingotのようにドロップして欲しい時もあります。ブロックはidDroppedで、ドロップをするかを設定します。idDroppedは以下の様な書式を持ちます。

public int idDropped(int metadata, Random random, int zero);

最初の引数は、ブロックのメタデータです。ブロックでは、常に0となります。二番目の引数は乱数です。IndustrialCraftのようにばらばらになるか、ブロックになるかを指定したい場合に使います。3番目の引数は常に0となります。ドロップしたいアイテムのIDを返り値として返してください。何もドロップさせたくない場合は、-1を返します。 Generic鉱石はそれ自身がドロップしない鉱石なので、Minecraftの他のインゴットと同様に精錬する必要があります。しかし、それが面倒であるならば、以下のようにGeneric.Ingotをドロップすることができます。

public int idDropped(int par1, Random random, int zero) {
        return Generic.genericIngot.itemID;
}

完成形

Generic Class

package tutorial.generic;


import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.block.material.Material;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid="Generic", name="Generic", version="0.0.0")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)
public class Generic {
        // GenericIngotに関するアイテムのチュートリアルをご覧ください。
        public final static Item genericIngot = new GenericItem(5001)
                .setMaxStackSize(16).setIconIndex(1).setItemName("specificItem");
        
        public final static Block genericDirt = new GenericBlock(500, 0, Material.ground)
                .setHardness(0.5F).setStepSound(Block.soundGravelFootstep)
                .setBlockName("genericDirt").setCreativeTab(CreativeTabs.tabDeco);
        public final static Block genericOre = new GenericOre(501, 1);
        
        @Instance("Generic")
        public static Generic instance;
        
        @SidedProxy(clientSide="tutorial.generic.client.ClientProxy",
                        serverSide="tutorial.generic.CommonProxy")
        public static CommonProxy proxy;
        
        @PreInit
        public void preInit(FMLPreInitializationEvent event) {
                // Stub Method
        }
        
        @Init
        public void load(FMLInitializationEvent event) {
                // GenericIngotに対するアイテムのチュートリアルをご覧ください。
                LanguageRegistry.addName(genericIngot, "Generic Ingot");
                
                LanguageRegistry.addName(genericDirt, "Generic Dirt");
                MinecraftForge.setBlockHarvestLevel(genericDirt, "shovel", 0);
                GameRegistry.registerBlock(genericDirt, "genericDirt");
                
                LanguageRegistry.addName(genericOre, "Generic Ore");
                MinecraftForge.setBlockHarvestLevel(genericOre, "pickaxe", 3);
                GameRegistry.registerBlock(genericOre, "genericOre");
                // ブロックの基本設定はここで終わりです。
                
                proxy.registerRenderers();
        }
        
        @PostInit
        public void postInit(FMLPostInitializationEvent event) {
                // Stub Method
        }
}

GenericBlock Class

package tutorial.generic;

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

public class GenericBlock extends Block {

        public GenericBlock (int id, int texture, Material material) {
                super(id, texture, material);
        }
        
        @Override
        public String getTextureFile () {
                return CommonProxy.BLOCK_PNG;
        }

}

GenericOre Class

package tutorial.generic;

import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockOre;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.block.material.Material;

public class GenericOre extends BlockOre {
        public GenericOre(int id, int texture, Material material) {
                super(id, texture, material);
                
                setHardness(4.0F); //ダイアモンドより33%硬い
                setStepSound(Block.soundStoneFootstep);
                setBlockName("genericOre");
                setCreativeTab(CreativeTabs.tabBlock);
        }
        
        @Override
        public String getTextureFile () {
                return CommonProxy.BLOCK_PNG;
        }
        
        public int idDropped(int par1, Random random, int par2) {
                return Generic.genericIngot.itemID;
        }
}

次に何をしましょう?

上記のものが終わったら、以下のことを続けて行うことができます。