MOD製作チュートリアル > ブロックの追加

概要

何の機能もない基本的なブロックを追加する。

ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
 
@Mod(modid = "AluminiumMod", name = "Aluminium Mod", version = "1.0.0")
public class AluminiumMod {
 
	public static Item aluminium;
 
	//追加するブロックの宣言
	public static Block blockAluminium;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		aluminium = new Item()
		.setCreativeTab(CreativeTabs.tabMaterials)
		.setUnlocalizedName("aluminium")
		.setTextureName("aluminiummod:aluminium");
		GameRegistry.registerItem(aluminium, "aluminium");
 
		//Blockを継承したクラスのインスタンスを生成し、代入する。
		blockAluminium = new AluminiumBlock(Material.rock)
		//システム名の登録
		.setBlockName("blockAluminium")
		//テクスチャ名の登録
		.setBlockTextureName("aluminiummod:aluminium_block");
		//GameRegistryへの登録
		GameRegistry.registerBlock(blockAluminium, "blockAluminium");
	}
 
}
 

  • AluminiumBlock.java
package tutorial.aluminiummod;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
 
public class AluminiumBlock extends Block {
 
	public AluminiumBlock(Material material) {
		super(material);
		//クリエイティブタブの登録
		this.setCreativeTab(CreativeTabs.tabBlock);
		//硬さの設定
		this.setHardness(5.0F);
		//爆破耐性の設定
		this.setResistance(10.0F);
		//ブロックの上を歩いた時の音を登録する。
		this.setStepSound(Block.soundTypeMetal);
		//回収するのに必要なツールを設定する。
		this.setHarvestLevel("pickaxe", 2);
		//明るさの設定
		this.setLightLevel(0.0F);
	}
 
}
 

解説

Block

minecraftのブロックはすべてこのクラスを継承している。
modで追加するブロックもこのクラスを継承することになる。

コンストラクタ(Material material)

そのブロックのマテリアルを設定する。
Materialにまとめれているので確認されたし。

Block setBlockName(String name)

ブロックのシステム名を登録するメソッド。

Block setBlockTextureName(String name)

ブロックのテクスチャを登録するメソッド。
アイテムと同様。

Block setCreativeTab(CreativeTabs tab)

ブロックをクリエイティブタブに登録するメソッド。
アイテムと同様。

Block setHardness(float hardness)

ブロックの硬さを設定する。
数値を上げると硬くなる。
黒曜石は50.0F。金・ラピスラズリ以外の圧縮ブロックが5.0F。net.minecraft.block.Blockを参照。

Block setResistance(float resistance)

ブロックの爆破耐性を設定する。
数値を上げると耐えられる爆発力が高くなる。
黒曜石は2000.0F。圧縮ブロックは10.0F。こちらもnet.minecraft.block.Blockを参照。

Block setStepSound(StepSound sound)

ブロックの上を歩いたり、破壊したりしたときになる音の種類を設定する。

void setHarvestLevel(String type, int level)

typeで適正ツールの種類を指定、levelでレベルを指定する。
レベルは高いほど要求するツールが強力なものになる。

Block setLightLevel(float level)

ブロックの光度を設定する。
ここで渡した値に15をかけたものが光源レベルになる。
0.0~1.0以外は無効。

GameRegistry

Block registerBlock(Block block, String name)

GameRegistryに追加ブロックを登録するメソッド。

使用例

オファレンブロックを追加する部分。
メタデータなどを使っている箇所は省略した。
+オファレンMOD
  • OfalenModCore.java
package nahama.ofalenmod;
 
/*略*/
 
/**@author Akasata Nahama*/
@Mod(modid = OfalenModCore.MODID, name = OfalenModCore.MODNAME, version = OfalenModCore.VERSION)
public class OfalenModCore {
 
	public static final String MODID = "OfalenMod";
	public static final String MODNAME = "Ofalen Mod";
	public static final String VERSION = "[1.7.10]1.0.0";
 
/*略*/
 
	/**最初に行われる処理。アイテム・ブロックの追加などを行う*/
	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
/*略*/
		//ブロックを設定するメソッドを実行
		OfalenModBlockCore.registerBlock();
/*略*/
	}
/*略*/
}
 

  • OfalenModBlockCore.java
package nahama.ofalenmod.core;
 
/*略*/
 
public class OfalenModBlockCore {
/*略*/
	public static Block blockOfalen;
/*略*/
	/**ブロックを設定する*/
	public static void registerBlock () {
/*略*/
		blockOfalen = new OfalenBlock()
		.setBlockName("blockOfalen")
		.setBlockTextureName("ofalenmod:ofalen_block-");
		GameRegistry.registerBlock(blockOfalen, ItemOfalenBlock.class, "blockOfalen");
/*略*/
	}
 
}
 

  • OfalenBlock.java
package nahama.ofalenmod.block;
 
/*略*/
 
public class OfalenBlock extends Block {
 
/*略*/
 
	public OfalenBlock() {
		super(Material.rock);
		this.setCreativeTab(OfalenModCore.tabOfalen);
		this.setHardness(7.5F);
		this.setResistance(15.0F);
		this.setStepSound(Block.soundTypeMetal);
		this.setLightLevel(1.0F);
		this.setHarvestLevel("pickaxe", 3);
	}
 
/*略*/
 
}
 

このままテストプレイをしてみると、テクスチャがない状態ではピンクと黒のデフォルトテクスチャになってしまう。
また、名前も、tile.blockAluminium.nameとなる。
これらの解決方法は次回。

コメント

この項目に関する質問などをどうぞ。
  • アルミニウムモッドの時のブロック作成法はないのですか。 - # 2015-07-04 14:49:30
    • (7月2日までのこのページのソースコードがみたいです。) - # 2015-07-04 14:51:54
    • ご意見ありがとうございます。現在修正、もしくは併記予定です。 - Tom Kate 2015-07-05 12:22:45
      • 併記する形で修正いたしました。 - Tom Kate 2015-07-05 13:27:24
    • とても見やすくなってよかったです。ありがとうございます。 - # 2015-07-05 14:46:28
  • ブロックの面によってテクスチャを変えるにはどうしたらよいのでしょうか - 名無しさん 2015-07-05 20:20:18
    • ご意見ありがとうございます。使えるメソッドのgetIcon と registerBlockIconsに追記いたしました。 - Tom Kate 2015-07-06 19:56:48
      • 一時的に削除します。「メタデータを持つブロックの追加」で触れるよう修正する予定です。 - 赤砂蛇凪浜 2015-07-10 21:12:56
        • 遅くなりましたが、修正が完了しました。 - 赤砂蛇凪浜 2015-07-23 12:35:35
  • 申し訳ありません blockAluminium = new AluminiumBlock(Material.rock) の部分でなぜかいつもAluminiumBlockのところにエラーが付きますどうすればよいでしょうか?丸コピペしたソースコードを使ってもそうなります - 名無しさん 2015-09-19 15:28:50
    • クラッシュレポートをクラウドサービスか何かにおいていただいて、urlを送っていただくことはできますか? - Tom Kate 2015-09-19 15:59:11
    • クラッシュレポートを見せていただければ、こちらで対応いたします。 - Tom Kate 2015-09-19 15:59:49
  • net.minecraft.block.Blockを参照 と書かれているのですが、どうやって参照するのですか? - 名無しさん 2015-11-01 17:26:38
    • AluminiumBlock.javaをeclipse上で開き、...extends Block {...のBlockにカーソルを合わせてF3を押せば、Block.classを表示することができます。
      Blockにはバニラのブロックを追加している部分があるので、そこを見れば、バニラのブロックがどういう設定をされているかを知ることができます。 - 赤砂蛇凪浜 2015-11-04 19:23:57
  • ブロックを複数追加し、クリエイティブタブも参考にさせていただき作成できました。ですが、ブロック1、ブロック2と数を増やしていくとタブ内での並び順がバラバラになってしまいます。この場合どうすればよいのでしょうか? - 名無しさん 2016-03-05 20:30:20
    • forge側の不具合で、既存のワールドのクリエイティブタブにアイテム・ブロックを追加すると順序がばらばらになってしまいます。
      新しくワールドを作り直すと正しい順で表示されると思います。お試しください。 - 赤砂蛇凪浜 2016-03-06 09:15:21
    • 返信ありがとうございます。ワールドを再生成しましたが直りませんでした。。何か設定し忘れているのでしょうか……。ブロックの並び順はブロックIDで決められているのですよね? - 名無しさん 2016-03-07 19:11:47
      • はい。ブロックIDはMOD側から指定することができないため、基本的にGameRegistryに登録した順ですね。 - 赤砂蛇凪浜 2016-03-07 20:38:17
        • 多分、そこが自分は理解できてないと思うんです。登録順を並べるにはどうすればいいのでしょう?また、registerBlock(X, "Y");このXとYはどういう値にすればうまく並べれるのでしょうか。今は - 名無しさん 2016-03-07 21:40:26
          • (○○1, "1")、(○○2, "2")という感じになっています - 名無しさん 2016-03-07 21:41:41
          • おそらく、GameRegistry.registerBlockを呼び出した順だと思われます。 - 赤砂蛇凪浜 2016-03-08 21:37:25
            • 呼び出し順を変える方法を教えて頂きたいです! - 名無しさん 2016-03-09 23:14:39
              • コード内で記述する順を変えるだけです。 - 赤砂蛇凪浜 2016-03-10 19:21:04
                • 記述する順番はしっかりならべてるんだけどなぁ・・・。どうしても解決できません。。。メタブロックの追加だとうまく表示できたのでそちらに切り替えることにします。初心者に丁寧に教えていただいてありがとうございました!(涙) - 名無しさん 2016-03-13 20:55:45
  • 基本的にできないことはわかっていることを前提として置いて質問します。何か裏技的な形でブロックid - anatawa12 2016-12-16 01:01:27
    • 続き 裏技的な形でブロックidを指定することはできませんか? - anatawa12 2016-12-16 01:03:10
      • 私達も試したことがないためはっきりとしたことは言えません。すみません。
        以下は軽く調べてみた結果で、間違っている可能性がありますので、ご了承ください。
        Forgeのシステムに入り込む形で指定することは可能かもしれませんが、簡単ではないと思います。
        Forgeのブロック追加処理は、GameRegistryからGameData、FMLControlledNamespacedRegistryを経由して行っているようです。
        ブロックIDは、GameDataやFMLControlledNamespacedRegistryでItem IDとの対応を見ながら決定しているようです。
        GameData.getMain()がprotectedに指定されているため、代替メソッドを作ろうとしたらそこで詰まりました。 - 赤砂蛇凪浜 2016-12-17 18:26:34
        • 返信ありがとうございます やっぱり難しいですよね 1.7にはたを1.8のidで追加するmodを作ろうと思ったのですが、、 - anatawa12 2016-12-22 15:51:48
  • 質問です。レッドストーンブロックのようにブロックをレッドストーン動力源にするにはどうすればいいのでしょうか? - 名無しさん 2017-01-07 16:00:06
    • レッドストーンブロックのクラスであるBlockCompressedPoweredを見るとわかると思いますが、以下のようにすればよいです。
      canProvidePowerをオーバーライドし、常にtrueを返す。
      isProvidingWeakPowerをオーバーライドし、常に15を返す。 - 赤砂蛇凪浜 2017-01-10 16:06:40
      • 解決しました!! もうひとつ質問なんですけどブロックが光を透過するようにするにはどうすればいいのでしょう。 - 名無しさん 2017-01-11 20:39:31
        • こっちも解決しました!! .setLightOpacityというメソッドを使いました。 - 名無しさん 2017-01-14 15:12:24
  • このブロックを階段にするにはどうすればいいですか? - 名無しさん 2017-02-04 16:05:17
    • 返信が遅くなってしまい申し訳ありません。
      今後チュートリアルを作成する予定です。
      また、単純な階段ならば、BlockStairsのインスタンスを生成することで実装できます。
      以下、そのサンプルです。perInitに追記すれば動作します。
      stairsAluminium = new BlockStairs(blockAluminium, 0)
      .setBlockName("stairsAluminium")
      .setBlockTextureName("aluminiummod:aluminium_block");
      stairsAluminium.setCreativeTab(CreativeTabs.tabBlock);
      stairsAluminium.setHarvestLevel("pickaxe", 2);
      stairsAluminium.useNeighborBrightness = true;
      GameRegistry.registerBlock(stairsAluminium, "stairsAluminium"); - 赤砂蛇凪浜 2017-02-23 17:46:40
名前: