提供: Minecraft Modding Wiki
2014年11月29日 (土) 16:17時点におけるRkEclair (トーク | 投稿記録)による版
移動先: 案内検索

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

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


植物の追加

BlockBushとIGrowableを使って作物を追加する。
種や作物のアイテムの追加は省略。

ソースコード

  • SampleBushCore.java
package mods.plant;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid = "BushSampleMod", name = "BushSampleMod", version = "0.0.0")
public class SampleBushCore {
    public static Block sampleBush;
    public static int sampleBushID = 4078;

    @EventHandler
    public void init(FMLInitializationEvent event) {
        // ローカライズ
        LanguageRegistry.addName(sampleBush, "Sample Bush");
        LanguageRegistry.instance().addNameForObject(sampleBush, "ja_JP", "サンプル 植物");
    }

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        sampleBush = new BlockSampleBush(sampleBushID);
        GameRegistry.registerBlock(sampleBush, "sampleBush");
    }
}
  • BlockSampleBush.java
package mods.plant;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

import java.util.Random;

import net.minecraft.block.BlockBush;
import net.minecraft.block.IGrowable;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.util.IIcon;
import net.minecraft.world.ColorizerGrass;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public BlockSampleBush extends BlockBush implements IGrowable {
    @SideOnly(Side.CLIENT)
    private IIcon[] icon;

    public BlockSampleBush(int id) {
        super(id);
        setCreativeTab(CreativeTabs.tabBlock);
        setUnlocalizedName("bush.block.plant");
        setTextureName("samplebushmod:bush");
        // たまに成長するようにする。
        setTickRandomly(true);
        setStepSound(soundTypeGrass);
    }

    @Override
    protected boolean canPlaceBlockOn(Block parBlock)
    {
        return parBlock == Blocks.farmland;
    }

    @Override
    public void updateTick(World world, int x, int y, int z, Random random) {
        super.updateTick(world, x, y, z, random);

        int growStage = world.getBlockMetadata(x, y, z); // メタデータ=成長段階
        growStage++;
        if (growStage > 6) { // 0が1段階目なのでこうなる
            growStage = 6; // バグ防止
        }
        world.setBlockMetadataWithNotify(x, y, z, growStage);
    }

    @Override
    // 完全成長しているか確認するメソッド (7段階目が完全成長)
    public boolean func_149851_a(World parWorld, int parX, int parY, int parZ, boolean p_149851_5_) {
        return parWorld.getBlockMetadata(parX, parY, parZ) != 7;
    }

    @Override
    // 骨粉処理
    public boolean func_149852_a(World p_149852_1_, Random parRand, int p_149852_3_, int p_149852_4_, int p_149852_5_) {
        return true;
    }

    @Override
    // 骨粉処理
    public void func_149853_b(World parWorld, Random parRand, int parX, int parY, int parZ) {
        incrementGrowStage(parWorld, parRand, parX, parY, parZ);
    }

    @Override
    public int getRenderType() { return 1; // 描画タイプ:1はクロステクスチャ }

    @Override
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int side, int metadata) { return icon[metadata]; }

    @Override
    // ドロップする個数
    public int quantityDropped(int metadata, int fortune, Random random) {
        return metadata == 6 ? random.nextInt() + 1 : 1; // 完全成長ならランダム、それ以外なら1つ
    }

    @Override
    // ドロップするアイテム
    public Item getItemDropped(int metadata, Random random, int fortune) {
        return /* ここに種や収穫物等*/ ;
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister parIIconRegister)
    {
          iIcon = new IIcon[7];
          // 全成長段階のテクスチャを登録
          iIcon[0] = parIIconRegister.registerIcon("samplebushmod:bush_stage_0");
          iIcon[1] = parIIconRegister.registerIcon("samplebushmod:bush_stage_0");
          iIcon[2] = parIIconRegister.registerIcon("samplebushmod:bush_stage_1");
          iIcon[3] = parIIconRegister.registerIcon("samplebushmod:bush_stage_1");
          iIcon[4] = parIIconRegister.registerIcon("samplebushmod:bush_stage_2");
          iIcon[5] = parIIconRegister.registerIcon("samplebushmod:bush_stage_2");
          iIcon[6] = parIIconRegister.registerIcon("samplebushmod:bush_stage_3");
          iIcon[7] = parIIconRegister.registerIcon("samplebushmod:bush_stage_3");
    }
}

解説

SampleBushCore.java

このModのエントリポイント。作物のブロックの追加をしている。

BlockSampleBush.java

作物のブロック。

setTickRandomly(true);

でランダムにupdateTickを呼び、そこで

int growStage = world.getBlockMetadata(x, y, z); // メタデータ=成長段階
growStage++;
if (growStage > 6) { // 0が1段階目なのでこうなる
    growStage = 6; // バグ防止
}
world.setBlockMetadataWithNotify(x, y, z, growStage);

で成長させる。