[チュートリアル]鉱石追加MODの作り方[初~中級][1.0.0]

クライアント/サーバーMODの開発に関する話題、技術交換はこちらで。質問は質問フォーラムへお願いします。
  • (PostNo.18336)

[チュートリアル]鉱石追加MODの作り方[初~中級][1.0.0]

投稿記事by Nuclear » 2011年12月28日(水) 05:45

ModLoader、ModLoaderMp、MinecraftForgeを利用して鉱石を追加するmodの制作方法
MOD製作環境についてはWikiのMOD製作のページ(こちら)を参考にしてください。

このチュートリアルでは新鉱石Tritium(適当)を追加してみます。
[仕様]
通常世界の地下31以下に生成され、掘削するとブロックから2、3個アイテムのTritiumが出る。

用意するもの
・テスクチャ画像
TritiumTerrain.png
TritiumTerrain.png (1.65 KiB) 表示数: 5951 回

TritiumItems.png
TritiumItems.png (1.49 KiB) 表示数: 5951 回

(場所:MCPROOT\bin\minecraft\Tritium\)

まず、ModLoaderからエントリポイントとなるmod_Tritium.javaを作ります。(場所:MCPROOT\src\minecraft\net\minecraft\src\)
コード: 全て選択
package net.minecraft.src;

import java.io.*;
import net.minecraft.src.forge.*;

public class mod_Tritium extends BaseModMp {

   public mod_Tritium() {
   }

   @Override
   public String getVersion() {
      //modのバージョンを返す
      return "v10";
   }

   @Override
   public void load() {
      File file = new File(ModLoader.getMinecraftInstance().getMinecraftDir(), "config");
      file = new File(file, "Tritium.cfg");
      Configuration cfg = new Configuration(file);
      //Forge式Configの生成
      cfg.load();
      //Configのロード

      TritiumID = Integer.valueOf(cfg.getOrCreateBlockIdProperty("TritiumID", TritiumID).value).intValue();
      //TritiumのIDをconfigで設定できるようにする

      TritiumItemID = Integer.valueOf(cfg.getOrCreateIntProperty("TritiumItemID", cfg.ITEM_PROPERTY, TritiumItemID).value).intValue();
      //TritiumItemのIDをconfigで設定できるようにする

      cfg.save();
      //Configのセーブ
   }

   public static Block Tritium;
   public static int TritiumID = 240;
   public static Item TritiumItem;
   public static int TritiumItemID = 10900;

}

ここまでできたら、次はMCPROOT\src\minecraft\net\minecraft\src\に「Tritium」というディレクトリを作成します。
作成できたら、画像などの場所を指定するパスの文字列を含むインターフェース、ITritiumStatics.javaを作ります。(場所:MCPROOT\src\minecraft\net\minecraft\src\Tritium\)
コード: 全て選択
package net.minecraft.src.Tritium;

public interface ITritiumStatics {

   String TerrainImgPath = "/Tritium/TritiumTerrain.png";
   String ItemsImgPath = "/Tritium/TritiumItems.png";
}

そして、BlockTritium.java、ItemTritium.javaを作ります。(場所:MCPROOT\src\minecraft\net\minecraft\src\Tritium\)
コード: 全て選択
package net.minecraft.src.Tritium;

import java.util.Random;

import net.minecraft.src.*;
import net.minecraft.src.forge.*;

public class BlockTritium extends Block implements ITextureProvider, ITritiumStatics {

   public BlockTritium(int i, int j, Material material) {
      super(i, j, material);
   }

   public int quantityDropped(Random random)
   {
      return 2 + random.nextInt(2);
      //2、もしくは3個出るように設定
   }

   public int idDropped(int i, Random random, int j)
   {
      return mod_Tritium.TritiumItem.shiftedIndex;
      //ドロップはブロック自体ではなくアイテムなのでアイテムのIDを指定
   }

   @Override
   public String getTextureFile() {
      return TerrainImgPath;
      //テクスチャファイルを指定
   }

}

コード: 全て選択
package net.minecraft.src.Tritium;

import net.minecraft.src.*;
import net.minecraft.src.forge.*;

public class ItemTritium extends Item implements ITextureProvider, ITritiumStatics {

   public ItemTritium(int i) {
      super(i);
   }

   @Override
   public String getTextureFile() {
      return ItemsImgPath;
   }

}

そしてTritiumのインスタンスを生成します。(mod_Tritium.java)
コード: 全て選択
package net.minecraft.src;

import java.io.*;

//インポート(忘れずに!)
import net.minecraft.src.Tritium.*;
import net.minecraft.src.forge.*;

public class mod_Tritium extends BaseModMp implements ITritiumStatics {

   public mod_Tritium() {
   }

   @Override
   public String getVersion() {
      //modのバージョンを返す
      return "v10";
   }

   @Override
   public void load() {
      //テクスチャの先行読み込み
      MinecraftForgeClient.preloadTexture(TerrainImgPath);
      MinecraftForgeClient.preloadTexture(ItemsImgPath);

      File file = new File(ModLoader.getMinecraftInstance().getMinecraftDir(), "config");
      file = new File(file, "Tritium.cfg");
      Configuration cfg = new Configuration(file);
      //Forge式Configの生成
      cfg.load();
      //Configのロード

      TritiumID = Integer.valueOf(cfg.getOrCreateBlockIdProperty("TritiumID", TritiumID).value).intValue();
      //TritiumのIDをconfigで設定できるようにする

      TritiumItemID = Integer.valueOf(cfg.getOrCreateIntProperty("TritiumItemID", cfg.ITEM_PROPERTY, TritiumItemID).value).intValue();
      //TritiumItemのIDをconfigで設定できるようにする

      //インスタンスの生成
      Tritium = (new BlockTritium(TritiumID, 0, Material.rock))
         .setBlockName("Tritium") //内部名の設定
         .setHardness(2.0F) //硬さ
         .setStepSound(Block.soundStoneFootstep); //音
      ModLoader.RegisterBlock(Tritium); //ブロック登録
      MinecraftForge.registerOre("Tritium", new ItemStack(Tritium)); //鉱石辞書に登録(これだけでは意味が無いので省いても良い)

      //インスタンスの生成
      TritiumItem = (new ItemTritium(TritiumItemID)).setItemName("TritiumItem").setIconIndex(0);

      //名付け
      ModLoader.AddName(Tritium, "Tritium Ore");
      ModLoader.AddName(TritiumItem, "Tritium");

      cfg.save();
      //Configのセーブ
   }

   public static Block Tritium;
   public static int TritiumID = 240;
   public static Item TritiumItem;
   public static int TritiumItemID = 10900;

}

これで完成としたいところなのですが、まだワールドには生成されるようになっていません。
なのでその処理を加えます。
コード: 全て選択
package net.minecraft.src;

import java.io.*;
import java.util.Random;

//インポート(忘れずに!)
import net.minecraft.src.Tritium.*;
import net.minecraft.src.forge.*;

public class mod_Tritium extends BaseModMp implements ITritiumStatics {

   public mod_Tritium() {
   }

   @Override
   public String getVersion() {
      //modのバージョンを返す
      return "v10";
   }

   @Override
   public void load() {
      //テクスチャの先行読み込み
      MinecraftForgeClient.preloadTexture(TerrainImgPath);
      MinecraftForgeClient.preloadTexture(ItemsImgPath);

      File file = new File(ModLoader.getMinecraftInstance().getMinecraftDir(), "config");
      file = new File(file, "Tritium.cfg");
      Configuration cfg = new Configuration(file);
      //Forge式Configの生成
      cfg.load();
      //Configのロード

      TritiumID = Integer.valueOf(cfg.getOrCreateBlockIdProperty("TritiumID", TritiumID).value).intValue();
      //TritiumのIDをconfigで設定できるようにする

      TritiumItemID = Integer.valueOf(cfg.getOrCreateIntProperty("TritiumItemID", cfg.ITEM_PROPERTY, TritiumItemID).value).intValue();
      //TritiumItemのIDをconfigで設定できるようにする

      //インスタンスの生成
      Tritium = (new BlockTritium(TritiumID, 0, Material.rock))
         .setBlockName("Tritium") //内部名の設定
         .setHardness(2.0F) //硬さ
         .setStepSound(Block.soundStoneFootstep); //音
      ModLoader.RegisterBlock(Tritium); //ブロック登録
      MinecraftForge.registerOre("Tritium", new ItemStack(Tritium)); //鉱石辞書に登録(これだけでは意味が無いので省いても良い)

      //インスタンスの生成
      TritiumItem = (new ItemTritium(TritiumItemID)).setItemName("TritiumItem").setIconIndex(0);

      //名付け
      ModLoader.AddName(Tritium, "Tritium Ore");
      ModLoader.AddName(TritiumItem, "Tritium");

      cfg.save();
      //Configのセーブ
   }

   @Override
   public void GenerateSurface(World world, Random random, int i, int j)
   {
      super.GenerateSurface(world, random, i, j);

      for(int l = 0; l < 8; l++) //1Chunkあたり8塊生成
      {
         int i0 = (i - (i % 16)) + random.nextInt(16);
         int j0 = random.nextInt(32); //0から31の高さに生成
         int k0 = (j - (j % 16)) + random.nextInt(16);
         (new WorldGenMinable(Tritium.blockID, 8)).generate(world, random, i0, j0, k0); //最大で8連続で埋蔵?(よく分からない)
      }
   }

   public static Block Tritium;
   public static int TritiumID = 240;
   public static Item TritiumItem;
   public static int TritiumItemID = 10900;

}

地下に埋まっていることを確認したらチュートリアルは終了です。お疲れ様でした
2011-12-28_05.32.28.png

鉱石を使ったレシピや道具などを考えてみるのも面白いかも。

完成したmod
Tritium.zip
(5.26 KiB) ダウンロード数: 118 回

ソースコード
Tritium_src.zip
(2.58 KiB) ダウンロード数: 148 回
アバター
Nuclear
ID:4228b998
1スタック
 
記事: 64
登録日時: 2011年6月21日(火) 19:08
お住まい: 幻想郷 地霊殿 105皇室

  • (PostNo.18702)

Re: [チュートリアル]鉱石追加MODの作り方[初~中級][1.0.0]

投稿記事by アルゴ » 2012年1月01日(日) 19:15

とても参考になりました。
どうやら既存のブロックを生成させるだけならModLoaderだけでも十分みたいですね。

それで、「◆総合◆特にトピックを立てるまでもないMODとかの公開所」
でこちらのチュートリアルを参考にしたModを投稿させていただきました。ありがとうございます。
viewtopic.php?f=13&t=1758&p=18700#p18700
アルゴ
ID:56c9117e
石炭掘り
 
記事: 218
登録日時: 2011年12月26日(月) 03:13

  • (PostNo.18747)

Re: [チュートリアル]鉱石追加MODの作り方[初~中級][1.0.0]

投稿記事by アルゴ » 2012年1月02日(月) 16:39

Mod作ってて気づいたのですが鉱石をワールドに生成する部分でループのたびにnewをしているので
新しい場所に移動すると一気にメモリを占有してしまうようです。
フィールドで持っておいてインスタンスの再利用をするようにしたら改善しました。
コード: 全て選択
public class mod_Tritium extends BaseModMp implements ITritiumStatics {
   ~~

   public void load() {
      ~~
      genTritium = new WorldGenMinable(Tritium.blockID, 8); //インスタンスを保存
   }

   public void GenerateSurface(World world, Random random, int i, int j)
   {
         ~~
         //(new WorldGenMinable(Tritium.blockID, 8)).generate(world, random, i0, j0, k0);
         genTritium.generate(world, random, i0, j0, k0); //再利用
      }
   }

   WorldGenMinable genTritium; //インスタンス保持用
   ~~
}


全体
コード: 全て選択
package net.minecraft.src;

import java.io.*;
import java.util.Random;

import net.minecraft.src.Tritium.*;
import net.minecraft.src.forge.*;

public class mod_Tritium extends BaseModMp implements ITritiumStatics {

   public mod_Tritium() {
   }

   @Override
   public String getVersion() {
      return "v10";
   }

   @Override
   public void load() {
      //テクスチャの先行読み込み
      MinecraftForgeClient.preloadTexture(TerrainImgPath);
      MinecraftForgeClient.preloadTexture(ItemsImgPath);

      File file = new File(ModLoader.getMinecraftInstance().getMinecraftDir(), "config");
      file = new File(file, "Tritium.cfg");
      Configuration cfg = new Configuration(file);
      //Forge式Configの生成
      cfg.load();
      //Configのロード

      TritiumID = Integer.valueOf(cfg.getOrCreateBlockIdProperty("TritiumID", TritiumID).value).intValue();
      //TritiumのIDをconfigで設定できるようにする

      TritiumItemID = Integer.valueOf(cfg.getOrCreateIntProperty("TritiumItemID", cfg.ITEM_PROPERTY, TritiumItemID).value).intValue();
      //TritiumItemのIDをconfigで設定できるようにする

      //インスタンスの生成
      Tritium = (new BlockTritium(TritiumID, 0, Material.rock))
         .setBlockName("Tritium") //内部名の設定
         .setHardness(2.0F) //硬さ
         .setStepSound(Block.soundStoneFootstep); //音
      ModLoader.RegisterBlock(Tritium); //ブロック登録
      MinecraftForge.registerOre("Tritium", new ItemStack(Tritium)); //鉱石辞書に登録(これだけでは意味が無いので省いても良い)

      //インスタンスの生成
      TritiumItem = (new ItemTritium(TritiumItemID)).setItemName("TritiumItem").setIconIndex(0);

      //名付け
      ModLoader.AddName(Tritium, "Tritium Ore");
      ModLoader.AddName(TritiumItem, "Tritium");

      cfg.save();
      //Configのセーブ

      genTritium = new WorldGenMinable(Tritium.blockID, 8); //インスタンスを保存
   }

   @Override
   public void GenerateSurface(World world, Random random, int i, int j)
   {
      super.GenerateSurface(world, random, i, j);

      for(int l = 0; l < 8; l++) //1Chunkあたり8塊生成
      {
         int i0 = (i - (i % 16)) + random.nextInt(16);
         int j0 = random.nextInt(32); //0から31の高さに生成
         int k0 = (j - (j % 16)) + random.nextInt(16);
         //(new WorldGenMinable(Tritium.blockID, 8)).generate(world, random, i0, j0, k0);
         genTritium.generate(world, random, i0, j0, k0); //インスタンスを生成しない
      }
   }

   WorldGenMinable genTritium; //インスタンス保持用

   public static Block Tritium;
   public static int TritiumID = 240;
   public static Item TritiumItem;
   public static int TritiumItemID = 10900;

}
アルゴ
ID:56c9117e
石炭掘り
 
記事: 218
登録日時: 2011年12月26日(月) 03:13


Return to 開発関連

x