[1.6.2][Forgeチュートリアル]レシピの追加

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

[1.6.2][Forgeチュートリアル]レシピの追加

投稿記事by Sdaru241 » 2013年5月10日(金) 20:39

MinecraftForgeを利用しています。
Modの制作環境についてはコチラを参照してください。
トピックの書き方についてはコチラを参考にさせていただきました。本当にありがとうございました。
今回は鉄インゴット4つと黒曜石3つでダイヤモンドを作るレシピ、丸石4つ(自由配置)で石を1つ作レシピを追加します。


レシピの追加
・必要なもの
Tutorial.java

まず、forge/mcp/src/minecraftフォルダにmodsフォルダを追加します。
そしてmodsフォルダの中にTutorialModフォルダを追加します。
さらにその中にcommonフォルダを追加。
Tutrial.javaはcommonフォルダに入れてください。
※modのjavaファイルはsrc以下ならばどこに置いても特に問題はありませんが、
ブロック等のテクスチャーを指定する際、わかりやすくなるのでmodsフォルダ下に制作することを推奨します。
…となっていましたが、1.6.2に変わり、テクスチャの指定方法が変わったためそれほど役目をなさなくなってきました。

Tutorial.java
コード: 全て選択
/* フォルダの場所 */
package mods.TutorialMod.common;

/* インポートしてるファイル。慣れればわかる */
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid = "Modの名前(略で可)", name = "Modの名前", version = "Modのバージョン")
@NetworkMod(clientSideRequired = true, serverSideRequired = false, versionBounds = "[マインクラフトのバージョン]")

public class Tutorial {

   /* 実行するコードを書く場所 */
   @Init
   public void load(FMLInitializationEvent event) {

      //ダイアモンドレシピの追加
      GameRegistry.addRecipe(new ItemStack(Item.diamond),
            new Object[]{"XYX", " Y ", "XYX", 'X', Item.ingotIron, 'Y', Block.obsidian});

      //石のレシピ
      GameRegistry.addShapelessRecipe(new ItemStack(Block.stone, 1), new ItemStack(Block.cobblestone, 1),
            new ItemStack(Block.cobblestone, 1), new ItemStack(Block.cobblestone, 1), new ItemStack(Block.cobblestone, 1));

      //骨粉のレシピ
      GameRegistry.addShapelessRecipe(new ItemStack(Item.dyePowder, 1, 15),
            new ItemStack(Block.wood, 1, 1), new ItemStack(Block.wood, 1, 2));

      //壊れかけのダイヤモンドの剣のレシピ
      GameRegistry.addShapelessRecipe(new ItemStack(Item.swordDiamond, 1, 1200), new ItemStack(Item.swordIron, 1, 1));


   }
}


定型レシピの追加方法について
詳しい解説です。
まずはダイアモンドのレシピを追加するコードを抜き出してみました。
(鉄インゴット:4 + 黒曜石:3 = ダイヤモンド:1)

GameRegistry.addRecipe(new ItemStack(Item.diamond),
new Object[]{"XYX", " Y ", "XYX", 'X', Item.ingotIron, 'Y', Block.obsidian});

Item.diamond = 作成されるアイテムを指定しています。今回はクラフトによってダイアモンドが作られるので、
Item.diamondと指定しています。因みに丸石の場合はBlock.cobblestoneのようにBlock.~と指定します。

"XYX", " Y ", "XYX" = クラフトのアイテム配列について設定しています。"XYX"が上段、" Y "が中段、 "XYX"が下段となります。
空欄の場合はスペースをうってください。同じアイテムには同じ文字を、違うアイテムには違う文字を使用してください。
この場合、こんな風にレシピが生成されます。
画像
要は、
画像
このようにXとYが決まりますので、ブロック又はアイテムをこのXとYに代入すればよいのです。つまり、

'X', Item.ingotIron, 'Y', Block.obsidian = ここでXにはアイテムの鉄インゴットを、Yにはブロックの黒曜石を代入しています。
最後にはセミコロンを忘れないように気を付けてください。


不定レシピの追加方法について
詳しい解説です。
まずは石のレシピを追加するコードを抜き出してみました。
(レシピ:丸石4つ→石1つ)

GameRegistry.addShapelessRecipe(new ItemStack(Block.stone, 1), new ItemStack(Block.cobblestone, 1),
new ItemStack(Block.cobblestone, 1), new ItemStack(Block.cobblestone, 1), new ItemStack(Block.cobblestone, 1));

Block.stone, 1 = 規定レシピと同様に作成されるアイテムを指定しています。今回はブロックなので、Block.~にします。

Block.cobblestone, 1 = レシピの一つとして追加するアイテムを指定します。因みに最後の1は個数です。
ここで注意してほしいのが、丸石4つだからといってBlock.cobblestone, 4にしないことです。
4つのクラフトなので、new ItemStack(Block.cobblestone, 1)を4つにします。



詳細設定
詳細な設定方法について解説します。

アイテムのダメージ値(メタデータ)について
ダメージ値(メタデータ)とは、同じ種類のブロックを区別するための値です。
たとえば、骨粉の追加レシピを見てみましょう。
(樫の原木:1 + 松の原木:1→骨粉)

GameRegistry.addShapelessRecipe(new ItemStack(Item.dyePowder, 1, 15),
new ItemStack(Block.wood, 1, 1), new ItemStack(Block.wood, 1, 2));

Item.dyePowder, 1, 15 = ここで、制作されるもの(骨粉)を指定しています。骨粉の名前は"dyePowder"ですが、
そのまま"Item.dyePowder, 1"と入力すると、イカスミが作成されてしまいます。なぜならば、骨粉の名前の"dyePowder"は染料を表すのです。
つまり、骨粉の名前の"dyePowder"には様々な種類の染料が入っているのです。そしてアイテムはその後に指定するダメージ値で種類を変更できます。
では、コチラをご覧ください。そこから骨粉のアイコンを探して
10進数の数字をみて下さい。15ですね。それがダメージ値です。他にもその上にある石炭のダメージ値は0です。
このように、指定したアイテム以外のアイテムが精製された時はダメージ値を確認してみてください。
他にも原木や葉、苗木などにもダメージ値があります。
後のレシピは前述の「不定レシピの追加方法について」と同じです。
ただ、レシピの方にもダメージ値が指定されています。
Block.wood, 1, 1は松の原木、Block.wood, 1, 2は白樺の原木です。

次に、壊れかけのダイアモンド剣のレシピを見てみましょう。

GameRegistry.addShapelessRecipe(new ItemStack(Item.swordDiamond, 1, 1200), new ItemStack(Item.swordWood, 1, 1));

Item.swordDiamond, 1, 1200 = ダイアモンド剣を指定しています。そしてダメージ値が1200というのは、その名の通りでダメージです。
剣に付与されるダメージについて書かれています。ダイアモンド剣の耐久力は1562なので、1200のダメージが付きます。よって耐久力は残り362となります。

Item.swordWood, 1, 1 = 木の剣がレシピとなりますが、ダメージ値が1指定されています。なので耐久力が59の時(木の剣の耐久力は60)、
クラフトされるようになります。ゾンビに一度だけ攻撃した場合、クラフトされます。

たとえば、耐久力が59の場合は以下のようにクラフトできますが、
画像

耐久力が58の場合は以下のようにクラフトできなくなります。
画像


このように、耐久力があるものにもダメージ値が指定できます。また、ダメージ値をマイナスにすることで、さらに耐久力を増やすことができます。
武器の耐久力はコチラの、防具の耐久力はコチラの、道具の耐久力はコチラのWikiを参照にしてください。


以上でレシピの追加については終了です。


質問があればぜひ返信をお願いします。
誤字・脱字・間違い・ご指摘もあればぜひお願いします。
読んでくださりありがとうございました。


おまけ:上記のソース
最後に編集したユーザー Sdaru241 [ 2013年9月02日(月) 15:56 ], 累計 11 回
自分のID名をなんて読めばいいのか分からない人
アバター
Sdaru241
ID:89089f53
大工さん
 
記事: 53
登録日時: 2013年4月14日(日) 16:04

  • (PostNo.98936)

Re: [1.5.2][Forgeチュートリアル]レシピの追加

投稿記事by A.K. » 2013年5月10日(金) 21:44

チュートリアル作成お疲れ様です.
実はレシピ追加のみならModLoaderで十分なのですが,Forgeが開発のメインAPIの現状Forge流の記述方法でのチュートリアルがあることに意義はあると思います.
いくつか記述部分に間違いがありますので,コメントします.
まず,レシピ追加のみならProxyシステムを使う必要はありませんので,
ClientProxySettings.java
CommonProxy.java
は必要ありません.(そもそもソースに指定していないので意味ないです.)
次にソースの置き場所ですが,srcフォルダ以下ならどのようなフォルダ構造で配置しても(圧縮時に間違えなければ)問題ないのことを付記した上で,テクスチャの配置の都合上modsフォルダ以下にフォルダを作成することが便利であるということを書いておいたほうが良いと思います.
それと
@Mod(modid = "あなたの名前", name = "Modの名前", version = "Modのバージョン")
の部分ですが,modidはMod1つ1つの識別に使われ,@Instanceの指定はmodidと同じ文字列である必要もあるので,製作者の名前を指定するのは不適当であると思います.MODの名前の短縮形が無難ではないでしょうか.

あとは良い解説だと思いますが,Itemのダメージ値やBlockのメタデータを指定する場合についても解説があるとより良くなるのではないかと思います.
もじんぐしたい。。。。
アバター
A.K.
ID:1e285010
ラピスラズリ収集家
 
記事: 1367
登録日時: 2012年9月03日(月) 19:34

  • (PostNo.98938)

Re: [1.5.2][Forgeチュートリアル]レシピの追加

投稿記事by Sdaru241 » 2013年5月10日(金) 21:49

A.K.さん、ご指摘ありがとうございます。
指摘通りあなたの名前になっていましたので変更させていただきました。
また、ClientProxySettings、CommonProxyについては必要皆無なので削除させていただきました。
今後のチュートリアル作成の役に立てさせていただきます。
ご指摘ありがとうございました。
自分のID名をなんて読めばいいのか分からない人
アバター
Sdaru241
ID:89089f53
大工さん
 
記事: 53
登録日時: 2013年4月14日(日) 16:04

  • (PostNo.114429)

Re: [1.6.2][Forgeチュートリアル]レシピの追加

投稿記事by PIXSEL » 2013年7月15日(月) 23:16

ForgeModLoaderの場合はどのような書式になるんでしょうか?

ModLoader版のままでいいのか、
Forgeとしての記述の使える箇所があるのか。
少々気になるところです。
PIXSEL
ID:64478b33
木を殴ってる
 
記事: 14
登録日時: 2012年2月12日(日) 23:28

  • (PostNo.114500)

Re: [1.6.2][Forgeチュートリアル]レシピの追加

投稿記事by yogpstop » 2013年7月16日(火) 11:08

PIXSEL さんが書きました:ForgeModLoaderの場合はどのような書式になるんでしょうか?

ModLoader版のままでいいのか、
Forgeとしての記述の使える箇所があるのか。
少々気になるところです。

ForgeModLoaderの場合、基本的なチュートリアルはMinecraftForgeのものが使えると考えて良いです。
例外としては、net.minecraftforgeパッケージ内のクラスが使われている場合や、Forgeによって提供されるnet.minecraftパッケージ内の一部の機能が使われている場合です。
レシピ追加の場合は、そのようなことはないはずですから、このチュートリアルが使えると見て良いと思います。
※ブロック・アイテムの追加についてはまた別

あと、1点だけ修正したほうが良いと思われる点があったので申し上げておきます。
loadメソッドにて使用しているアノテーションが、cpw.mods.fml.common.Mod.Initとなっておりますが、
1.6版のForgeModLoaderからはこれがDeprecatedされて、cpw.mods.fml.common.Mod.EventHandlerを使用することが推奨されております。
1.6.2向けのチュートリアルですので、ここは変更するべきかと思われます。

ではよろしくお願いいたします。
MOD等のソースコード(GitHub)
ゲーム内外ともにロマンのある自動化に興味があります。
作りたいMODたくさんあるけど時間が完全に足りてない・・・
一緒にModdedマルチやる友達が欲しい・・・
アバター
yogpstop
ID:903aedc9
鉄鉱掘り
 
記事: 264
登録日時: 2011年12月19日(月) 00:20
お住まい: 千葉県 日本

  • (PostNo.125495)

Re: [1.6.2][Forgeチュートリアル]レシピの追加

投稿記事by Sdaru241 » 2013年9月01日(日) 18:06

yogpstopさん、報告ありがとうございます。
編集させていただきます。
自分のID名をなんて読めばいいのか分からない人
アバター
Sdaru241
ID:89089f53
大工さん
 
記事: 53
登録日時: 2013年4月14日(日) 16:04

  • (PostNo.193050)

Re: [1.6.2][Forgeチュートリアル]レシピの追加

投稿記事by ゲスト » 2014年9月08日(月) 19:52

作成お疲れ様です。
一つお聞きしたいのですが、Modや、他ファイルで追加されているアイテムを使用、作成するにはどのように書けば良いのですか?
ゲスト
ID:bee77c45
 

  • (PostNo.193178)

Re: [1.6.2][Forgeチュートリアル]レシピの追加

投稿記事by yusukemac » 2014年9月09日(火) 18:57

ゲスト さんが書きました:作成お疲れ様です。
一つお聞きしたいのですが、Modや、他ファイルで追加されているアイテムを使用、作成するにはどのように書けば良いのですか?

GameRegistry.addRecipe(ItemStack, Object[]) = GameRegistry.addRecipe(new ItemStack(<? extends Item>, amount, metadata), Object[])
                                            (<? extends Block>, amount, metadata)

つまり、addRecipeにはItemStack型とObject[]型を渡せばいいわけです
ItemStackはItemまたはBlockを継承したクラスのインスタンス、それの量、(メタデータ)を渡せばいいわけです

コード: 全て選択
new ItemStack  (Item,              amount, metadata)
          (ItemまたはBlockのインスタンス, それの量, metadata)


例:
コード: 全て選択
@Mod(modid = "SomeMod", name = "SomeMod", version = "1.0")
public class SomeMod {
    public static Item theItem;
    public static Block fooBlock;

    @EventHandler
    public void Init
(FMLInitializationEvent event) {
        GameRegistry.addRecipe(new ItemStack(SomeMod.theItem, 1), new Object[] {"XXX", " X ", "XXX", 'X', Item.stick}); //問題のレシピ追加部分
        GameRegistry.addRecipe(new ItemStack(this.fooBlock, 1), new Object[] {"X X", " X ", "X X", 'X', Block.dirt});
    }

    /**
      * こういう気持ち悪いアイテムの代入でも、当然Item型なのでokです。
      * また、一応参考としてBlock型も置いておきました
      **/
    @EventHnadler
    public void PreInit
(FMLPreInitializationEvent event) {
        theItem = new Item() {
            @Override
            public void onUpdate
(ItemStack itemstack, World world, Entity entity, int par4, boolean par5) {
                if (!world.isRemote && par5)
                    ((EntityPlayer)player).addPotionEffect(new PotionEffect(Potion.digSpeed.id, 10 * 20, 0));
            }
        }.setUnlocalizedName("theItem");

        fooBlock = new Block(Material.rock).setBlockName("fooBlock");
    }
}
 


まとめ: とにかく別ファイルで追加されているものはprivateとかprotectedでなくてクラス名とインスタンス名が合っていれば使えます。
たとえば私のMoreToolsの場合なら、net.walltomcat.MoreTools.Objects.ingotPlasticなんてのも、
コード: 全て選択

import net
.walltomcat.MoreTools.Objects;

@
Mod(modid = "foo", name = "foo", version = "foo")
public class fooMod {
    @EventHandler                                                                      //   \\
    public void Init(FMLInitializationEvent event) {                                          //---ここ---\\
        GameRegistry.addRecipe(new ItemStack(Block.dirt, 16), new Objects[] {" X ", "XSX", " X ", 'X', Item.stick, 'S', Objects.ingotPlastic});
    }
}
 

Mod作成頑張ってね!わからなかったらPMで聞いても全然いいよ。
      ___________________________
      Minecraft               ❘❘丨|
      server               1/1
      xxx
      ___________________________

         Scanning for games on your local network
                   o 0 o

私は2011/11/11にminecraftを買いました。
画像

Github
アバター
yusukemac
ID:4f64bbe6
石掘り
 
記事: 123
登録日時: 2012年2月04日(土) 16:09
お住まい: 千葉県


Return to 開発関連

x