提供: Minecraft Modding Wiki
2012年11月20日 (火) 17:26時点におけるTakanasayo (トーク | 投稿記録)による版 (ページの作成:「<div style="border:double 4px red;background:#ffeeee;margin:1em;padding:1ex 1em;">このMODの動作確認は、<b>Minecraft1.2.5 forge3.3.8_152</b> で行ってい...」)
このMODの動作確認は、Minecraft1.2.5 forge3.3.8_152 で行っています。
この記事は |
目次
既存ブロックの動作を変更する
ここでは例として、本棚を壊した際、そのまま回収できるようにする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 static Block NewBookshelf; public void load() { Block.blocksList[47] = null; 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内のsuparとは引数が異なる点に注意。
- BloclBookshelfのsuparはBlockを呼び出すのに対し、BlockNewBookshelfのsuparはBlockBookshelfを呼び出す。
- そのため、suparの引数は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 で指定する方法もある。
新しい本棚を登録する
NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F) .setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
- 任意のBlockクラスを宣言し、そこに新しい本棚を設定する。
- ブロックリストへの登録は自動的に行われる。
- ブロックの各種設定は、Block.javaから既存の本棚の設定をそのままコピーする。
- .setStepSound のみ注意。この関数の設定値はBlock.javaで定義されているので、(Block.soundWoodFootstep)と、明示的にBlockのスコープを与えてやる必要がある。
応用
ブロックの硬さや爆破耐性などを変更する
ブロックを登録する部分で設定を変更できる。
NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F) .setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
設定できる項目は以下の通り。
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) | 上を歩いた時、破壊した時の音 |
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 を返せばよい。
protected boolean func_50074_q() { return true; }
- 関数が見つからない場合、BlockGlass.java の一番下の関数を参照。
フォーチュンでドロップ数を増やす
幸運のエンチャント付きツールでブロックを破壊した場合のドロップ数は、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になる。