最新版 |
編集中の文章 |
67行目: |
67行目: |
| *ブロックが雪のように地面をカバーするかどうか | | *ブロックが雪のように地面をカバーするかどうか |
| | | |
− | 正確なリストは、net.minecraft.src.Materialにて見つけることができます。それらの中から選ぶことは難しいはずがありません。もし、あなたの望むようなマテリアルが存在しなければ、新しく作って使えばいいのです。
| + | 性格なリストは、net.minecraft.src.Materialにて見つけることができます。それらの中から選ぶことは難しいはずがありません。もし、あなたの望むようなマテリアルが存在しなければ、新しく作って使えばいいのです。 |
− | | |
− | ==GenericBlock==
| |
− | Blockを継承しなくてもブロックをすることは可能ですが、カスタムテクスチャを利用する際は便利です。そのため、以下のクラスをtutorial.generic.packageに追加してください。
| |
− | | |
− | <source lang="java">
| |
− | 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;
| |
− | }
| |
− | | |
− | }
| |
− | </source>
| |
− | このコンストラクタはブロックのコンストラクタに渡しているだけです。Blockに対しての改良は、独自のテクスチャファイルを読み込むためのgetTextureFileに対してのオーバーライドのみです。
| |
− | 残りの設定はbaseModクラス内で行います。
| |
− | | |
− | ==Generic Dirt==
| |
− | | |
− | ブロッククラスを見てください。Dirtは0.5Fの硬さ、じゃりと同じ音を持っています。ここでは、少しのメソッドしかありません。
| |
− | | |
− | <source lang="java">
| |
− | public final static Block genericDirt = new GenericBlock(500, 1, Material.ground)
| |
− | .setHardness(0.5F).setStepSound(Block.soundGravelFootstep)
| |
− | .setBlockName("genericDirt").setCreativeTab(CreativeTabs.tabBlock);
| |
− | </source>
| |
− | | |
− | 見る限り、ブロックIDは500になり、textureは0でgroundマテリアルを利用します。
| |
− | setHardnessでは、float値を取ります。dirtは0.5Fで、黒曜石は50Fです。硬さについては、[[http://www.minecraftwiki.net/wiki/Digging#Digging_speed Minecraft Wiki]]にて詳しく記述されています。
| |
− | setStepSoundは音を設定します。簡単にいえば、あなたの使いたい全ての音はBlockクラス内のフィールドに記述されています。
| |
− | setBlockNameは内部的なブロックへの名前を設定します。
| |
− | setCreativeTabはクリエイティブでのインベントリのタブにアイテムを設定します。この例では、ブロックタブが利用されています。
| |
− | | |
− | 他のプロパティはデフォルト値になっています。
| |
− | | |
− | ==ブロックの登録==
| |
− | ブロックはForgeに登録される必要性があります。そうするために、GameRegistry.registerBlock(Block block,String internalName)をloadメソッドに追加してください。
| |
− | | |
− | <source lang="java">
| |
− | GameRegistry.registerBlock(genericDirt, "genericDirt");
| |
− | </source>
| |
− | | |
− | この内部名はあなたのMODの中の他のブロックに対して一意である必要があります。名前を一意にするための良いアイデアとして、Block.setBlockName()で使った名前と同じにすることを薦めます。
| |
− | この文字列の値はIDからブロックに対応づける文字列になります。
| |
− | | |
− | ==パブリックネーム==
| |
− | 人間の読めない名前をつけるべきではありません。インベントリでこのブロックにオーバーレイした時、このブロックの名前が読めなくなります。このため、パブリックネームをLanguageRegistryを利用して登録する必要があります。ココで使うメソッドはaddNameです。
| |
− | | |
− | <source lang="java">
| |
− | LanguageRegistry.addName(Object toName, String readableName);
| |
− | </source>
| |
− | アイテムやアイテムスタックやブロックにオブジェクトはなり得ます。このケースでは、ブロックになります。Genericのloadメソッドに以下のように追加してください。
| |
− | <source lang="java">
| |
− | LanguageRegistry.addName(genericDirt, "Generic Dirt");
| |
− | </source>
| |
− | これで、アイテムを拾っても"Generic Dirt"と表示されるようになりました。
| |
− | | |
− | ==効果的なツール==
| |
− | ここまでで、ブロックは作れましたが、もしそのブロックを何かのツール(ソードを除く)で掘りたい場合、1.5秒かかります。たとえ、シャベルであっても。これはDirtらしくありません。ブロックを効果的に掘ることを可能にするために、MinecraftForgeのスタティックメソッドであるsetBlockHarvestLevelを利用します。
| |
− | | |
− | <source lang="java">
| |
− | MinecraftForge.setBlockHarvestLevel(Block block, String toolClass, int tier);
| |
− | </source>
| |
− | toolClassは"pickaxe"、"shovel"、"axe"もしくは自分で作った新しいツールクラスのな前から選んでください。tierは0が木、1が石、2が鉄、3がダイアモンドです。
| |
− | | |
− | それでは、このメソッドを使って、木のシャベルを用いてより効果的に採掘できるようにgenericDirtを設定しましょう。
| |
− | | |
− | <source lang="java">
| |
− | MinecraftForge.setBlockHarvestLevel(genericDirt, "shovel", 0);
| |
− | </source>
| |
− | | |
− | ==テクスチャ==
| |
− | テクスチャについては、アイテムとブロックで共通なことが多いので[[Icons and Textures]]を御覧ください。
| |
− | | |
− | ==Generic Ore==
| |
− | Dirtに似せたGeneric Dirtを作りましたが、別のブロックを作ります。もし、ここまで読んで疲れたのなら、ここらで一度休憩しましょう。
| |
− | | |
− | GenericOreは[[Basic items]]チュートリアルで作ったGeneric Ingotをドロップする鉱石です。もし、そのチュートリアルをやっていないなら、Generic.genericIngotをItem.ingot.Ironと置き換えるか、Basic itemsチュートリアルをやってください。
| |
− | Generic鉱石はダイアモンドよりも強いです。ダイアモンドよりも高い硬さを持つので、ダイアモンドのピッケルでしか掘れないでしょう。
| |
− | | |
− | ではGeneric鉱石を作りましょう。以下がGeneric鉱石のコードです。
| |
− | | |
− | <source lang="java">
| |
− | 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;
| |
− | }
| |
− | }
| |
− | </source>
| |
− | 鉱石への設定はサブクラス化したコンストラクタにおいても可能です。
| |
− | 以下のように追加できます。
| |
− | <source lang="java">
| |
− | setHardness(4.0F); // ダイアモンドよりも33%硬い
| |
− | setStepSound(Block.soundStoneFootstep);
| |
− | setBlockName("genericOre");
| |
− | setCreativeTab(CreativeTabs.tabBlock);
| |
− | </source>
| |
− | | |
− | そして、GenericのBasemodクラスに言って、以下のフィールドを追加してください。
| |
− | <source lang="java">
| |
− | public final static Block genericOre = new GenericOre(501, 1, Material.iron);
| |
− | </source>
| |
− | | |
− | さらに、以下の3つのメソッドをBaseModクラスのロードメソッドに追加してください。
| |
− | <source lang="java">
| |
− | LanguageRegistry.addName(genericOre, "Genreric Ore");
| |
− | MinecraftForge.setBlockHarvestLevel(genericOre, "pickaxe", 3);
| |
− | GameRegistry.registerBlock(genericOre, "genericOre");
| |
− | </source>
| |
− | もし、これらの一部でも理解していないならば、GenericDirtのセクションを参照してください。
| |
− | | |
− | ==鉱石のドロップ==
| |
− | このアイテムが壊された時、アイテムをドロップするかは言及していません。収穫レベルが低いツールで、収穫することはできません。例えば、Generic鉱石はダイアモンドのピッケルでは収穫出来ますが、他の行為では何も出て来ません。
| |
− | | |
− | ブロックが壊れた時に常にドロップはしてほしくありません。ダイアモンドやレッドストーンやGeneric Ingotのようにドロップして欲しい時もあります。ブロックはidDroppedで、ドロップをするかを設定します。idDroppedは以下の様な書式を持ちます。
| |
− | <source lang="java">
| |
− | public int idDropped(int metadata, Random random, int zero);
| |
− | </source>
| |
− | 最初の引数は、ブロックのメタデータです。ブロックでは、常に0となります。二番目の引数は乱数です。IndustrialCraftのようにばらばらになるか、ブロックになるかを指定したい場合に使います。3番目の引数は常に0となります。ドロップしたいアイテムのIDを返り値として返してください。何もドロップさせたくない場合は、-1を返します。
| |
− | Generic鉱石はそれ自身がドロップしない鉱石なので、Minecraftの他のインゴットと同様に精錬する必要があります。しかし、それが面倒であるならば、以下のようにGeneric.Ingotをドロップすることができます。
| |
− | <source lang="java">
| |
− | public int idDropped(int par1, Random random, int zero) {
| |
− | return Generic.genericIngot.itemID;
| |
− | }
| |
− | </source>
| |
− | | |
− | ==完成形==
| |
− | ===Generic Class===
| |
− | <source lang="java">
| |
− | 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
| |
− | }
| |
− | }
| |
− | </source>
| |
− | ===GenericBlock Class===
| |
− | <source lang="java">
| |
− | 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;
| |
− | }
| |
− | | |
− | }
| |
− | </source>
| |
− | ===GenericOre Class===
| |
− | <source lang="java">
| |
− | 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;
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | ==次に何をしましょう?==
| |
− | *[[Crafting and Smelting]](クラフティングと精錬)
| |
− | *[[Basic items]]
| |
− | *[[Icons and Textures]]
| |
− | | |
− | 上記のものが終わったら、以下のことを続けて行うことができます。
| |
− | *[[Metadata Based Subblocks]]
| |
− | *[[Plants]]
| |