前回精錬レシピの追加の追加を行った際にクラフトレシピの追加メソッドを
見たので今回はそれを行いたいと思います。GameRegistryを使って登録を行う方法と
RegistryEvent.Register<IRecipe> eventでの登録の方法とjsonファイルを作成してその中に
記述する方法と3種類あるみたいですね。
一応両方やってみますが1.12以降はjsonファイルの作成の方が主流みたいです。
【定形レシピの追加登録】
~GameRegistryで登録するやり方~
定形レシピとは材料を作業台の3×3のグリットの中に決まった配置をしたら
クラフト後のアイテムが取り出せるというやつです。
(2×2のグリットに収まるレシピの配置ならプレイヤーのインベントリからのでも
作成できる。)
GameRegistryクラスのレシピの登録メソッド。
preIntメソッドの前回の精錬レシピの追加の登録の下にレシピの追加登録を行っていきます。
(場所はpreIntメソッド内ならどこでもいいです。)
GameRegistry.と入力すると候補が出てくるのでaddShapedRecipeメソッドを選択。
第一引数ではレシピ名の登録を行います。新規なのでもうお馴染みのnewをつけて候補を
だします。ResourceLocation(String resourceName)を選びます。
レシピ名を文字列で()の中に入れます。レシピ名は何でもいいですがわかりやすい様に、
出来上がりのアイテム名をいれたり~to~みたいに材料to出来上がりアイテム名をいれたり
します。
第二引数はレシピのグループ名の登録を行います。
newをつけて候補をだしてResourceLocation(String resourceName)を選びます
modidを文字列でいれるか定数にしているはずなのでMODIDを選んで入れます。
第三引数はoutputとなっていますので出来上がりのアイテムを入れます。
newをつけて候補を出して出来上がりのものがItemならItemStack(Item itemIn)を
BlockならItemStack(Block blockIn)を候補の中から出来上がりのものに合わせて
選びます。
ItemStackメソッドのことはItemStackクラスをみると数量やメタデータを入れられるのも
あるのでこれを参考にします。new ItemStack(enchanted_silverapple,2)として出来上がりの個数を2個にしてみます。1つでいいときは数値を1とするか何もつけないと1つになります。
メタデータがある場合はnew ItemStack(enchanted_silverapple,2,1)とします。
出来上がりの物のフィールド名,数量,メタデータと引数の設定がなされています。
第四引数はObjectになっています。ここがjava知識がないと難しいところです。
私はjava知識が乏しいので説明ができないのですがObjectととして配列やメソッドを実装
するものと書いてあるのでそうなのでしょう(-_-;)
javaにおいてすべてのクラスはObjectクラスの子孫である。
すべてのインスタンスはObject型変数に格納可能である。
すべてのクラスはObjectからtoString()を継承している
自分で作成したクラスにでは文字列表現を指定するためtoString()をオーバーライドする。
新しいObjectの実装なのでまたnewをつけて候補をだしてObject()を選びます。
配列にしたいので()は消して[]にします。なぜ配列にするのかは
こういう風にForgeでプログラムされているからです。
私はeclipseの設定のところでjavaエディタの構成の色を変えるところで細かく設定しているのでそれでなにかを判別しているのです。フィールド系は青系メソッド系は緑系クラスはオレンジ
など。なので'x'はオートボクシングの色になっていることがわかります。基本データ型を
オブジェクトとして扱うのがラッパークラス。基本データ型の情報をインスタンスとして
扱えるようになる。int型が基本データ型でIntegerがラッパークラスの型。本来なら相互交換をする記述を書くところを自動で相互交換を行ってくれる機能がオートボクシング・オートアンボクシングです。ラッパー型は参照型とも言われているみたいですね。
こうやって変換しているものを自動で変換してくれる機能がオート(アン)ボクシング。
ブロックをアイテムスタックにするにはやっぱりgetItemFromBlockメソッドを使用します。
別にxやyでなくてもaでもbでもいいです。
文字列×3で3×3のグリットの配置を、文字,フィールド名で材料の指定をしているようです。
" X ","X X"のようにグリット部分の配置をしない箇所は空白にしておきます。
ちゃんとForgeでプログラムされているのでこういう風に入力すればレシピ追加ができる。と
それでいいと思います。深く考えてもわからないですし(-_-;)
クラスを色々見て回ってもさっぱり仕組みがわかりませんでした(-_-;)
文字列はString型で""で囲う。文字一つだけはchar型で''で囲う。
Character型・・・'X'の中に入れられるのは一つのフィールドのみです。
実行結果。
銀のブロックはこのために新たに追加したものです。
既存のアイテムでレシピを追加するときはItemsクラスの方にフィールドの宣言が
まとめてしてあるところがあるのでマイクラのアイテムなどはそちらを見て書きます。
ブロックはBlocksクラスにあります。こうやって既存のアイテムなどは指定します。
自分で追加したアイテムなどはフィールドを宣言したクラス名.フィールド名。
私の場合だとRobby.greenappleとします。同じクラス内で書いているのでクラス名は省いて
いますが。
上は普通のリンゴでもエフェクト付き銀のリンゴを作れるように。Yのところを別アイテムでも
同じものができるようにするやり方がわからないのでもう一つ別に登録しただけなんですが
・・・・YのところをgreenappleでもItems.APPLEでもできるようにするやり方がどうしても
わからない( ノД`)シクシク…。jsonファイルの方では簡単にできるのに。
下のはエフェクト付きの金のリンゴを作るものです。
出来上がりのアイテムの指定はItem.getItemById()で番号をいれてもいいです。
エフェクト付きの金のリンゴと金のリンゴはフィールド名の登録は同じで
メタデータ番号で区別しているみたいなのでID番号と引数にメタデータの数値1を入れないといけません。(id番号),出来上がりの個数,メタデータの数値となってます。
Itemクラスに一覧があるのでこれを見て・・・金のリンゴのクラスが別にあるのでそれをみると
メタデータの数値が1だとわかるのです(;´∀`)
ItemsやBlocksのfinal staticフィールドで登録されているもので複数のメタデータを
持つものがあります。葉ブロックや木材などオーク・ダークオークなどセットになってますよね、
ああいうのです。それは予め一つのフィールドで登録されているので(でもなぜか6種類あるはずのものが4種類と2種類に分かれていますが・・・。)予め登録されているものは
そのまま'X'にいれればオークでもダークオークでも作成が可能になります。
写真はLEAVES2の方です。
public static final BlockLeaves LEAVES;
public static final BlockLeaves LEAVES2;とフィールドの宣言がされていて、
その下に
こうやってBlocksクラスにフィールドが登録されているので
'X',Blocks.LEAVESとすればいいです。oakと白樺?しかはいってないっぽいけど(-_-;)
Blocks.LEAVES2にはoakとdarkoak以外が入っていると思われますたぶんwなぜ分けられているのかはわからない(;´∀`)
今わからないのはマイクラのアイテムと自作のアイテムを同じフィールドで登録するやり方。
クラスを新たに作成してマイクラのリンゴをメタ値0で自作の青りんごをメタ値1にして
greenappleのところのフィールドのところのItemFoodをGreenAppleに直してモデル指定のところのメタ値を1に直して材料の'Y'のところに greenappleをいれて実行
リンゴが2つクリエイティブタブに表示されるようになってしまった(;´∀`)2つは全く同じものなんです。ですが~・・・
リンゴでも青りんごでも同じものが作れるようにはなりました。でもクリエイティブのところが
2重になってて気持ち悪いのです。jeiのところ・・・右側のメニューでは2重になってません。
クリエイティブタブだけです。
それぞれ違うアイテムを一括りにするやり方を見つけました。
このクラスを利用します。この登録してあるやつの文字列を使えばちゃんと木も6種類
入れられたり・・・できるんですね~。
"apples"格納する入れ物の名前みたいな感じ?で文字列で名前を入れます。
そして'X',に"apples"を入れれば・・・
ちゃんとリンゴでも青りんごでもクラフトできるようになりました。あくまで例なので・・・
ちゃんと後でインゴットに直しておきますよ(;´∀`)
~イベントでレシピを登録するやり方~
これが一番難解かも・・・私にはいまいち仕組みというか理解できてないので
ソースコードの説明ができません(-_-;)
なのでサクッと・・さらっと流す程度に。
MinecraftForge.EVENT_BUS.register(this);がinit(FMLInitializationEvent event)メソッド内に
あることが前提です。(私の場合は全部同じクラス内(@Modがあるクラス)にイベント系のメソッドを入れています)だから()の中はthisにしていますが別クラスにイベントメソッドがある場合
は MinecraftForge.EVENT_BUS.register(new クラス名());みたいにするようです。
ここでも違うアイテムを一括りにするコードは使えます。
RegistryEvent.Register~は他にもブロックを登録したり・・・でもこのクラスよりも
こっちをよく見た方がいいのですが・・・4つもあるし~よくわからない(´・ω・`)特に4番目が!
とりあえず今回はItemの方のを使用しました。
あくまでも例なのでリンゴで杖が出来る仕様ではないので後で変えます(-_-;)
set.Mirroredはたぶんグリッドの配置を左右逆転させておいても
クラフトできるようにしているものだと思います。
logWoodとtreeLeavesはバニラで登録されているのでそのまま使えます。
こういう風に左右逆転した配置でもクラフト可能にするのがsetMirrored・・・だと思っていたら
ん~・・・setMirroredなしにしても左右逆転して配置してもクラフト出来ました・・・
(-_-;)じゃあなんだろう?因みにjsonファイルでもGameRegistryでも特に何も記述しなくても
反転して材料を置いてもクラフトできるようですので安心です。
3番目の。GameRegistryのと大体同じ感じですね。
さて1つ1つじゃなくてまとめて記述する場合は・・・
registerAllにして()内にカンマで区切って new ShapedOreRecipe~を入れていく感じです。
event.getRegistry()の部分だけ楽ができるだけなんで・・・一つ一つ書いてもあまり
かわらない(´・ω・`)
沢山登録するものがあるならMODID,nameの部分も楽できるようにメソッドを作成しておくのもいいかもです。
~定形レシピjsonファイルで登録するやり方。~
assets/modid フォルダの中にrecipesという名前のフォルダを新規作成します。
このrecipesフォルダの中にjsonファイルを作成してレシピの登録を行います。
Forgeの参照ライブラリーのassets/minecraftのrecipesのフォルダがこういう位置づけに
なっているので同じように配置するのです。そしてライブラリーのjsonファイルの内容を
自分の作成したいrecipeに近いものをコピーしてきて張り付けて必要な箇所を書き換えるのです。
近いものをコピペって来ます。これを全部自分で打つのは大変なので。
そして自分のjsonファイルに貼り付けて必要箇所を書き換えます。
typeのところはminecraft:をつけます。
グリットのところの配置は変える必要があるなら変えます。
" # ",
" X ",
"## "
みたいに配置しない箇所は空白にします。
jsonファイルの名前は他のrecipe名と被らなければなんでもいいですが
わかりやすい用に出来上がりのアイテム名を私は付けています。
既存のリンゴでも追加アイテムの青りんごでもエフェクト付きの金のリンゴが出来るようにした
jsonファイルです。javaファイルでのソースコードではこのやり方がわかりませんでしたが
jsonファイルの方ではあっさり。これもForgeの参照ライブラリーの似たようなレシピから
コピペして書き換えただけなのです。
Forgeでjsonファイルを組み込んだプログラムがなされているのでこうして簡単にjsonファイル
を作成するだけでレシピの追加ができるのです。CraftingHelperクラスをみてみるといいとおもいます。私は見てもわかりませんでしたが(´・ω・`)
青りんごでもリンゴでもエフェクト付きの金のリンゴが作成できるようになりました。

















































