提供: Minecraft Modding Wiki
2012年12月3日 (月) 04:50時点におけるTakanasayo (トーク | 投稿記録)による版 (シルクタッチ追記)
移動先: 案内検索
このMODの動作確認は、Minecraft1.2.5 forge3.3.8_152 で行っています。

この記事は
"ModLoader及びMinecraftForge"
を前提MODとしています。

既存ブロックの動作を変更する

ここでは例として、本棚を壊した際、そのまま回収できるようにするMODを作成します。

作成するファイル

  • BlockNewBookshelf.java  新しい本棚クラス
  • mod_DropedBookshelf.java 前提MODから呼び出されるクラス

ソースファイル全文

BlockNewBookshelf.java
package net.minecraft.src;

import java.util.Random;

public class BlockNewBookshelf extends BlockBookshelf
{
	public BlockNewBookshelf(int par1, int par2)
	{
		super(par1, par2);
	}

	public int idDropped(int par1, Random par2Random, int par3)
	{
		return blockID;
	}

	public int quantityDropped(Random par1Random)
	{
		return 1;
	}
}
mod_DropedBookshelf.java
package net.minecraft.src;

public class mod_DropedBookshelf extends BaseMod
{
	public String getVersion()
	{
		return "1.2.5-1";
	}

	public void load()
	{
		Block.blocksList[47] = null;
		Block NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
		.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
	}

}

BlockNewBookshelf.javaの解説

このクラスでは、新しい本棚の動作を定義する。

Bookshelf型を継承する

public class BlockNewBookshelf extends BlockBookshelf //既存の本棚を継承
{
	public BlockNewBookshelf(int par1, int par2)
	{
		super(par1, par2); //継承元のBlockBookshelfメソッドを呼び出す。
	}
  • 今回は変更点がドロップアイテムだけなので、BlockBookshelf(既存の本棚)クラスを継承して新しい本棚を作る。
    • 既存のブロックの動作を変更する場合、既存のクラスを継承して変更点だけ記述する方が楽。
  • BlockBookshelf内のsuperとは引数が異なる点に注意。
  • BloclBookshelfのsuperはBlockを呼び出すのに対し、BlockNewBookshelfのsuperはBlockBookshelfを呼び出す。
  • そのため、superの引数はBlockBookshelfのコンストラクタに合わせる必要がある。
    • 既存クラスの引継ぎで忘れやすい部分なので注意。

ドロップするブロックを設定する

public int idDropped(int par1, Random par2Random, int par3)
	{
		return blockID;
	}
  • idDropped で自分自身をドロップするように変更。
public int quantityDropped(Random par1Random)
	{
		return 1;
	}
  • quantityDropped で落とす個数を1に変更。
    • 継承元で3に設定されているため、これを指定し忘れると本棚を3つドロップしてしまう。

mod_DropedBookshelf.javaの解説

前提MODから呼び出されるクラス。 ここで既存のブロックと入れ替える。

既存の本棚を削除する

Block.blocksList[47] = null;
  • ブロックリストから本棚(ID=47)を削除する
  • IDは次項でコピーしたものを使用する。
    • ID部分は Block.bookshelf.blockID で指定する方法もある。

新しい本棚を登録する

Block NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
	.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
  • 任意のBlockクラスを宣言し、そこに新しい本棚を設定する。
  • ブロックリストへの登録は自動的に行われる。
  • ブロックの各種設定は、Block.javaから既存の本棚の設定をそのままコピーする。
    • .setStepSound のみ注意。このメソッドの設定値はBlock.javaで定義されているので、(Block.soundWoodFootstep)と、明示的にBlockのスコープを与えてやる必要がある。


応用

ブロックの硬さや爆破耐性などを変更する

ブロックを登録する際に、硬さや明るさを変更できる。

Block NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
	.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");

設定できる項目は以下の通り。他にもset~で変更できる値はほぼ変更できる。

登録時に設定可能な値の一例
setHardness(float par1) ブロックの硬さ
setResistance(float par1) 爆破耐性(必ず setHaerdness の後に書く事)
setLightValue(float par1) ブロックの明るさ0.0F~1.0F(光レベル15で1.0F、7で0.5F)
setLightOpacity(int par1) 光度減衰量。葉ブロックが1、水が3
setStepSound(StepSound par1StepSound) 上を歩いた時や破壊した時の音 設定値はBlock.java参照
setBlockUnbreakable() ブロックを破壊不可能にする

シルクタッチで回収可能にする

本棚は元々シルクタッチでの回収が可能だが、回収不可能なブロックを明示的にシルクタッチ回収可能にするには、MinecraftForge で Blockクラスに追加される canSilkHarvestメソッドを使用する。

public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata)
{
    return true;
}
  • これで true を返せばシルクタッチで回収可能になる。
  • MinecraftForgeを使わない場合、func_50074_q()メソッドで true を返せばよい。
    • なおこのメソッドはMinecraftForgeではcanSilkHarvest()に改名されているが、参照されないので注意が必要である。
protected boolean func_50074_q()
{
    return true;
}
※ForgeとModLoader両対応MODを作る場合
Forgeで開発し、canSilkHarvest() と canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) の両方を記述する必要があります。

フォーチュンでドロップ数を増やす

幸運のエンチャント付きツールでブロックを破壊した場合のドロップ数は、quantityDroppedWithBonusメソッドで設定する。
以下に例としてスイカのソースを掲載する。

public int quantityDroppedWithBonus(int par1, Random par2Random)
{
    int var3 = this.quantityDropped(par2Random) + par2Random.nextInt(1 + par1);

    if (var3 > 9)
    {
        var3 = 9;
    }

    return var3;
}
  • スイカは元々のドロップ数が3~7で、this.quantityDropped(par2Random) でその数を呼び出している。
  • par1 は幸運のエンチャントレベルで、幸運IIIだと 3 になる。
  • par2Random.nextInt(1 + par1) で追加するドロップ数を指定(幸運IIIなら0~3)
  • 9以上は9になるので、最終的なドロップ数は、幸運IIIで3~9になる。

メソッドの追加などが無い場合

例えば光レベルの変更や、硬さ、爆破耐性の変更など、メソッドを書き換えたり、追加したりする必要の無い要素のみの変更であれば、代替クラスファイルも不要で簡単に実現できる。
この書き方で変更可能なのは、set~のメソッドで変更可能な値のみなので、ドロップアイテムの変更などは不可能。

例のソースは、黒曜石の硬さ(50.0F)を、丸石と同じ(2.0F)に変更するだけのMOD。

mod_ChangeHardness.java
package net.minecraft.src;

public class mod_ChangeHardness extends BaseMod
{
	public void load()
	{
		Block.obsidian.setHardness(2.0F);
	}
}