Skip to content

Instantly share code, notes, and snippets.

@karakufire
Last active March 10, 2016 12:42
Show Gist options
  • Save karakufire/c12906481d3fb308b4a5 to your computer and use it in GitHub Desktop.
Save karakufire/c12906481d3fb308b4a5 to your computer and use it in GitHub Desktop.
Minecraft ForgeでのModdingで作物を作る手法の覚え書き

MinecraftForgeでのModdingで作物を追加する手法の覚え書き

環境

  • Windows 8.1
  • Java 1.8.0_73
  • Netbeans 8.1
  • MinecraftForge 10.13.4.1558 (Minecraft 1.7.10)

概要

自分で適当に作ってた作物を追加する手法を記す。
net.minecraft.block.BlockCropsを拡張して作物のブロックを追加、
net.minecraft.item.ItemSeedsを拡張して作物の種を追加する。
適当なパッケージにでもコード書いたファイルぶち込んどけばだいたいjavadocが教えてくれるはず。

要点

最低限オーバーライドするべきメソッド

  • 種となるアイテムを返すメソッド
protected net.minecraft.item.Item #func_149866_i()
  • 成熟時の収穫物となるアイテムを返すメソッド
protected net.minecraft.item.Item #func_149865_P()
  • ブロックを壊した際にドロップするアイテムを返すメソッド
public java.util.ArrayList<net.minecraft.item.Item> #getDrops(  
        net.minecraft.world.World world,  
        int x,  
        int y,  
        int z,  
        int metadata,  
        int fortune  
        )

自前で成長処理を組みたい際にオーバーライドするメソッド

  • 普通の成長処理
public void updateTick(
        net.minecraft.world.World p_149674_1_,
        int p_149674_2_,
        int p_149674_3_,
        int p_149674_4_,
        java.util.Random p_149674_5
        )
  • 骨粉が使えるか否かの判定
public boolean func_149851_a(
        net.minecraft.world.World p_149851_1_,
        int p_149851_2_,
        int p_149851_3_,
        int p_149851_4_,
        boolean p_149851_5
        )
  • 骨粉使用時の成長処理
public void func_149863_m(
        net.minecraft.world.World p_149863_1_,
        int p_149863_2_,
        int p_149863_3_,
        int p_149863_4_
        )
package samplemod.sample;
import java.util.ArrayList;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockCrops;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
/**
* 作物ブロックを追加するクラス.
* {@link BlockCrops}クラスを継承する形で,成長や骨粉の処理の流用を行っている.
* この場合,取れる成長段階が8段階のみになるため,自分で段階を設定したい場合は
* {@link BlockCrops#func_149863_m}をオーバーライドしよう.
* @author karakufire
*/
public class SampleCrop extends BlockCrops {
/**
* インスタンス. ブロックを登録するときに使う.
* 別にクラスを作ってstaticメンバとしてインスタンスを置く方法もいいだろう.
*/
static final SampleCrop BLOCK = new SampleCrop();
/**
* テクスチャを保持するメンバ. privateなりpublicなり好きにどうぞ.
*/
@SideOnly(Side.CLIENT)
IIcon[] icons;
/**
* コンストラクタ.
* テクスチャや非翻訳名などを定義する.
* 作物ブロックは{@link Block#disableStats()}で
* 統計にカウントしないようにした方がいい.
*/
public SampleCrop(){
super();
setBlockName("SampleCrop");
setBlockTextureName("SampleMod:SampleCrop");
setTickRandomly(true);
setStepSound(soundTypeGrass);
disableStats();
}
/**
* 種となるアイテムを返すメソッド.
* 作物ブロックに対して中クリックすると得られるアイテムを定義している.
* くっそわかりにくいメソッド名.
* @return この例では{@link SampleSeed#ITEM}を返している.
*/
@Override
protected Item func_149866_i(){
return SampleSeed.ITEM;
}
/**
* 作物となるアイテムを返すメソッド.
* 完全に成熟した作物ブロックを破壊すると得られるアイテムを定義している.
* こっちもわかりにくいメソッド名.
* @return この例では{@link SampleHarvested#ITEM}を返している.
*/
@Override
protected Item func_149865_P(){
return SampleHarvested.ITEM;
}
/**
* 実際に作物ブロックを破壊した時、何が得られるかを定義するメソッド.
* ここが一番の肝心要でもある(と思う).
* 成長度合いによって落とすアイテムを変えたいとかいう場合には引数metadataを基に
* ifとかswitchを使って定義しよう.
*
* @param world よくわからない
* @param x X座標の値
* @param y Y座標の値
* @param z Z座標の値
* @param metadata よくダメージ値と言われる数値.ここでは成長度合いを表している.
* @param fortune 幸運エンチャント付きアイテムの場合,
* 幸運エンチャントの値がここに入る.
* @return 落とすアイテムのリスト.
*/
@Override
public ArrayList<ItemStack> getDrops(
World world,
int x, int y, int z,
int metadata,
int fortune){
ArrayList<ItemStack> drops = new ArrayList<>();
drops.add(func_149866_i, 1);
if(metadata == 7){
drops.add(func_149865_P, 1);
}
return drops;
}
/**
* ブロックのメタデータに合わせたテクスチャを決定するメソッド.
* @param p_149691_1_ 側面を示す番号
* @param p_149691_2_ メタデータを示す引数
* @return テクスチャ
*/
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int p_149691_1_, int p_149691_2_){
return icons[p_149691_2_];
}
/**
* ブロックのテクスチャを設定するメソッド.
* この例ではメンバ{@link #icons}に設定している.
*
*/
@Override
public void registerBlockIcons(IIconRegister p_149651_1_){
icons = new IIcon[8];
icons[0] =p_149651_1_.registerIcon("SampleMod:SampleCrop_0");
icons[1] =p_149651_1_.registerIcon("SampleMod:SampleCrop_1");
icons[2] =p_149651_1_.registerIcon("SampleMod:SampleCrop_1");
icons[3] =p_149651_1_.registerIcon("SampleMod:SampleCrop_1");
icons[4] =p_149651_1_.registerIcon("SampleMod:SampleCrop_2");
icons[5] =p_149651_1_.registerIcon("SampleMod:SampleCrop_2");
icons[6] =p_149651_1_.registerIcon("SampleMod:SampleCrop_2");
icons[7] =p_149651_1_.registerIcon("SampleMod:SampleCrop_3");
}
}
package samplemod.sample;
import net.minecraft.item.Item;
import net.minecraft.creativetab.CreativeTabs;
/**
* SampleCropを刈り取って得られる収穫物を保持するクラス.
* たぶん30秒で出来る.
* @author karakufire
*/
public class SampleHarvested {
/**
* アイテムのインスタンス.
*/
static final Item ITEM
= new Item()
.setUnlocalizedName("SampleHarvested")
.setTextureName("SampleMod:SampleHarvested")
.setCreativeTab(CreativeTabs.tabMaterials);
}
package samplemod.sample
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.item.ItemSeeds;
/**
* 種を追加するクラス.
* {@link ItemSeeds}をオーバーライドする.
* 正直{@code Item sampleseed
* = new ItemSeeds(SampleCrop.Block, Blocks.farmland)
* .setTextureName("SampleMod:SampleSeed")
* .setUnlocalizedName("SampleSeed");}
* でもよかったりする.
*
* @author karakufire
*/
public class SampleSeed extends ItemSeeds{
/**
* アイテムのインスタンス. 登録用.
* 別の方法でもあまり問題ない.
*
*/
static final SampleSeed ITEM
= new SampleSeed(SampleCrop.BLOCK, Blocks.farmland);
/**
* コンストラクタ.
* @param plant 植わる植物
* @param farmland 対象となる耕地
*/
public SampleSeed(Block plant, Block farmland){
super(plant, famrland);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment