提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「<div style="border:double 4px red;background:#ffeeee;margin:1em;padding:1ex 1em;">このMODの動作確認は、<b>Minecraft1.2.5 forge3.3.8_152</b> で行ってい...」)
 
(代替クラスが不要な場合を追記)
44行目: 44行目:
 
return "1.2.5-1";
 
return "1.2.5-1";
 
}
 
}
 
public static Block NewBookshelf;
 
  
 
public void load()
 
public void load()
 
{
 
{
 
Block.blocksList[47] = null;
 
Block.blocksList[47] = null;
NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
+
Block NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
 
.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
 
.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
 
}
 
}
70行目: 68行目:
 
*今回は変更点がドロップアイテムだけなので、BlockBookshelf(既存の本棚)クラスを継承して新しい本棚を作る。
 
*今回は変更点がドロップアイテムだけなので、BlockBookshelf(既存の本棚)クラスを継承して新しい本棚を作る。
 
**既存のブロックの動作を変更する場合、既存のクラスを継承して変更点だけ記述する方が楽。
 
**既存のブロックの動作を変更する場合、既存のクラスを継承して変更点だけ記述する方が楽。
*BlockBookshelf内のsuparとは引数が異なる点に注意。
+
*BlockBookshelf内のsuperとは引数が異なる点に注意。
*BloclBookshelfのsuparはBlockを呼び出すのに対し、BlockNewBookshelfのsuparはBlockBookshelfを呼び出す。
+
*BloclBookshelfのsuperはBlockを呼び出すのに対し、BlockNewBookshelfのsuperはBlockBookshelfを呼び出す。
*そのため、suparの引数はBlockBookshelfのコンストラクタに合わせる必要がある。
+
*そのため、superの引数はBlockBookshelfのコンストラクタに合わせる必要がある。
 +
**既存クラスの引継ぎで忘れやすい部分なので注意。
  
 
==ドロップするブロックを設定する==
 
==ドロップするブロックを設定する==
104行目: 103行目:
 
==新しい本棚を登録する==
 
==新しい本棚を登録する==
 
<source lang="java">
 
<source lang="java">
NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
+
Block NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
 
.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
 
.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
 
</source>
 
</source>
110行目: 109行目:
 
*ブロックリストへの登録は自動的に行われる。
 
*ブロックリストへの登録は自動的に行われる。
 
*ブロックの各種設定は、Block.javaから既存の本棚の設定をそのままコピーする。
 
*ブロックの各種設定は、Block.javaから既存の本棚の設定をそのままコピーする。
**.setStepSound のみ注意。この関数の設定値はBlock.javaで定義されているので、(Block.soundWoodFootstep)と、明示的にBlockのスコープを与えてやる必要がある。
+
**.setStepSound のみ注意。このメソッドの設定値はBlock.javaで定義されているので、(Block.soundWoodFootstep)と、明示的にBlockのスコープを与えてやる必要がある。
  
 
=応用=
 
=応用=
 
==ブロックの硬さや爆破耐性などを変更する==
 
==ブロックの硬さや爆破耐性などを変更する==
ブロックを登録する部分で設定を変更できる。
+
ブロックを登録する際に、硬さや明るさを変更できる。
 
<source lang="java">
 
<source lang="java">
NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
+
Block NewBookshelf = (new BlockNewBookshelf(47, 35)).setHardness(1.5F)
 
.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
 
.setStepSound(Block.soundWoodFootstep).setBlockName("bookshelf");
 
</source>
 
</source>
設定できる項目は以下の通り。
+
設定できる項目は以下の通り。他にもset~で変更できる値はほぼ変更できる。
 
{|class="wikitable" style="border-width:1px 1px 1px 1px; border-color:black; border-style:solid; "
 
{|class="wikitable" style="border-width:1px 1px 1px 1px; border-color:black; border-style:solid; "
 
|+ style="background:#ddd;text-align:left;padding:0 0 0 2px;"|登録時に設定可能な値の一例
 
|+ style="background:#ddd;text-align:left;padding:0 0 0 2px;"|登録時に設定可能な値の一例
131行目: 130行目:
 
|setLightOpacity(int par1)||光度減衰量。葉ブロックが1、水が3
 
|setLightOpacity(int par1)||光度減衰量。葉ブロックが1、水が3
 
|-
 
|-
|setStepSound(StepSound par1StepSound)||上を歩いた時、破壊した時の音
+
|setStepSound(StepSound par1StepSound)||上を歩いた時や破壊した時の音 設定値はBlock.java参照
 
|-
 
|-
 
|setBlockUnbreakable()||ブロックを破壊不可能にする
 
|setBlockUnbreakable()||ブロックを破壊不可能にする
139行目: 138行目:
  
 
==シルクタッチで回収可能にする==
 
==シルクタッチで回収可能にする==
本棚は元々シルクタッチでの回収が可能だが、回収不可能なブロックを明示的にシルクタッチ回収可能にするには、MinecraftForge で Blockクラスに追加される canSilkHarvest関数を使用する。
+
本棚は元々シルクタッチでの回収が可能だが、回収不可能なブロックを明示的にシルクタッチ回収可能にするには、MinecraftForge で Blockクラスに追加される canSilkHarvestメソッドを使用する。
 
<source lang="java">
 
<source lang="java">
 
public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata)
 
public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata)
147行目: 146行目:
 
</source>
 
</source>
 
*これで true を返せばシルクタッチで回収可能になる。
 
*これで true を返せばシルクタッチで回収可能になる。
*MinecraftForgeを使わない場合、func_50074_q関数で true を返せばよい。
+
*MinecraftForgeを使わない場合、func_50074_q()メソッドで true を返せばよい。
 +
**なおこのメソッドはMinecraftForgeでは存在しないので注意が必要である。
 
<source lang="java">
 
<source lang="java">
 
protected boolean func_50074_q()
 
protected boolean func_50074_q()
154行目: 154行目:
 
}
 
}
 
</source>
 
</source>
*関数が見つからない場合、BlockGlass.java の一番下の関数を参照。
 
  
 
==フォーチュンでドロップ数を増やす==
 
==フォーチュンでドロップ数を増やす==
幸運のエンチャント付きツールでブロックを破壊した場合のドロップ数は、quantityDroppedWithBonus関数で設定する。<br>
+
幸運のエンチャント付きツールでブロックを破壊した場合のドロップ数は、quantityDroppedWithBonusメソッドで設定する。<br>
 
以下に例としてスイカのソースを掲載する。
 
以下に例としてスイカのソースを掲載する。
 
<source lang="java">
 
<source lang="java">
176行目: 175行目:
 
*par2Random.nextInt(1 + par1) で追加するドロップ数を指定(幸運IIIなら0~3)
 
*par2Random.nextInt(1 + par1) で追加するドロップ数を指定(幸運IIIなら0~3)
 
*9以上は9になるので、最終的なドロップ数は、幸運IIIで3~9になる。
 
*9以上は9になるので、最終的なドロップ数は、幸運IIIで3~9になる。
 +
 +
==メソッドの追加などが無い場合==
 +
例えば光レベルの変更や、硬さ、爆破耐性の変更など、メソッドを書き換えたり、追加したりする必要の無い要素のみの変更であれば、代替クラスファイルも不要で簡単に実現できる。<br>
 +
この書き方で変更可能なのは、set~のメソッドで変更可能な値のみなので、ドロップアイテムの変更などは不可能。<br>
 +
 +
例のソースは、黒曜石の硬さ(50.0F)を、丸石と同じ(2.0F)に変更するだけのMOD。
 +
;mod_ChangeHardness.java
 +
<source lang="java">
 +
package net.minecraft.src;
 +
 +
public class mod_ChangeHardness extends BaseMod
 +
{
 +
public void load()
 +
{
 +
Block.obsidian.setHardness(2.0F);
 +
}
 +
}
 +
</source>
  
 
<!--
 
<!--

2012年11月29日 (木) 20:04時点における版

この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では存在しないので注意が必要である。
protected boolean func_50074_q()
{
    return true;
}

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

幸運のエンチャント付きツールでブロックを破壊した場合のドロップ数は、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);
	}
}