追加アイテム等を村人のトレードリストに追加したいと思います。
マイクラではemeraldが通貨代わりに使われていますが、これを追加アイテムrubyでも
何かと交換したり、何かをrubyと交換したり・・・他にも既存の物でも自作の追加したものでも
トレードリストに追加可能です。
村人の追加は今回は行いません。既存の村人のトレードリストの追加です。
どこでもいいので新たにクラスを作成します今回はインタフェースを継承するので
Imprementsをつけて ITradeListを継承します。大体I~とIがついているクラス名は
インタフェースです。普通のクラスと違ってインタフェースは複数継承できます。
インポートを促されるのでインポートします。
実装されていないメソッドの追加を選びます
自動でここまで入力してくれるのでメソッドの内容を入力していきます。
なんでこういう内容を入れるのかということはItradeListクラスを見ればわかります。
Listに加える時はadd~で加えるのとListの変数名がrecipeListとなっているので
recipeList.add~と入れるわけです。なにを入れるのかは引数の内容とItaradelistクラスの
内容を見ればわかります。
何種類かありますが支払う物、交換後の物という風になっています。
支払う物は2枠あるのですが支払う物が1種類の時はbuy1だけに入れて
2種類設定したいときはbuy1とbuy2にそれぞれいれます。
newはもうだいぶ慣れてきましたね・・・配列の中身を入れたり、ArrayListのaddで中身をいれたり、ItemStackの前にはnewが付くものなのです。
アイテム名、個数、メタ値の順番で引数を入れます。数値を入れない場合は1個、メタ値0
になります。ブロックを登録するときにgetItemFromBlockをしているので自作のブロックも
フィールド名だけでいいみたいです。別にgetItemFromBlockをしてもokです。
既存のアイテム等ももちろん加えることができます。
これはトレードリストを作ったにすぎません。次にこのリストを村人に反映させるように
してForgeに登録する記述をします。
pure~のメソッド内に登録します。
お馴染みForgeRegistriesです。
候補からVILLAGER_PROFESSIONSを選びます。
getvalueを選びます
newを入れてResourceLocation(String resourceName)を選びます。
ここで村人の職業をいれます。今回はニートを入れました。当然この職業もリストが
あります。ニートも他の村人と同じような設定になていますが取引リストがないだけなのです。
次に職業のcareer番号を取得するgetCareer()を選びます
ちょっと2次元配列になっててわかりづらいですが2番目の[ ]の番号がcareer番号だと思います。ニートはニートしかいませんから0ですが、他の職人は防具とか武器とか道具とかに
分かれているみたいですからね。ニートは職業idは5careerは0。
スミスは防具が職業id3careerは0 武器が職業3career1という風になっています。
これを参考にして好きな職業にトレードリストを追加させます。
先ほどの職業のトレードリストにこちらで作成したリストを付け加えるのでまたadd~です。
levelはトレードlevelで最初は1です。交換のフラグが立つとlv2へ進みますが
最初はlv1からなのでここは1を入れます。
またnewをつけて加えたいリストを入れます。
先ほどリストを作成したクラスをそのまま入れています。
とりあえずlv1だけですが登録はこれで完了です。
適当に村人エッグか/summon villager召喚コマンドで
目的の村人をだします。(選べないので出るまで)
MerchanRecipeメソッドが読み込まれるときは対象の村人が召喚された時でした。
ちゃんとリストが反映されています。
リストを追加する前から存在していた村人には反映されないみたいです。
ニートも仕事を与えられて生き生きしています♪
Lvごとの追加とエンチャント付きの本とエンチャント付きの武器の追加を一気にやります。
LV2のリストを作成。
LV3のリストを作成
本とルビー(ランダムの式で個数が決まる)をエンチャント付きの本と交換
LV4とLV1のリストを作成。
指定したアイテムにエンチャントをランダムで付与する(アイテムの指定は登録のところでする)。ルビーの数はランダムの式の答えで決まる。
エンチャントはランダムで決まり、エンチャントlvはランダムの引数の数値で
決まると思われるたぶん・・・。
.add~の項目を足していく。
エンチャント付きアイテムのリストを入れる時はエンチャントをつけたいアイテムを入れる。
priceInfoは価格の最低値と最高値?だと思うのですが・・・。ちょっとよくわからないのです。
ダイヤモンドソードが12,15となってたのでそれを参考に。
ついでにニートの表記を変えてあげますw
~突然のおまけ~
なんとなく取引追加に自作アイテムを割り込めるなら宝箱的なものにも
入れられるんじゃないかなと思ったのが運の尽き・・・・(;´∀`)
予想外に全く別の仕組みすぎて・・・・((+_+)) またまたjsonファイルが絡んできます(;´・ω・)
やり方はForgeのhpに英語で・・・さらにBotaniaのGitHubを参考に見ろと・・・
BotaniaのGitHubの方は見てもさっぱり・・・基本的なForgeのhpの説明もちょっと
私にはざっくばらんすぎて何日か悩んだりふて寝したり現実逃避してweb小説読んだりと
しましたが・・・( ノД`)シクシク…グーグル先生(翻訳の方)の力を借りながら
なんとか出来ました!!
これで一発で理解できる人は天才だと思う(´・ω・`)
nameは何の名前だよ・・・とかまあ色々つっこんだのですが・・・
促されているBotaniaのGitHubを見に行ったらもっと複雑になってたけど!(-_-;)
こういうイベント的な奴は・・・クラスを別に作ってinit(FMLInitializationEvent event)で呼び出すかmodidを登録しているクラスに直接メソッドを書き込むか・・・。私は直接メソッドを書き込みました。
だいたいはForgeのhp道理やればおkっぽいです。newRe~の後のはjsonファイル名でなければいけませんが引数最後のnameは別にjsonファイルの名前でなくてもいいっぽいです。
jsonファイルの書き方もForgeのhp道理コピペして入れたい自作のアイテムで書き換えるだけ。 "pools": [
{
"name": "main",
"rolls": 1,
"entries": [
が既存の宝箱に割り込ませるキーワードだと思います。 nameのmainというなまえはそのまま
でBotaniaのGitHubのほうもなんかmainのままだったから。
rollsの数値は変えてもいいんではないかなと。
でForgeのhpで注意されているように
登録自体はいつも道理preInt(FMLPreInitializationEvent event)メソッド内に書き込みます。
jsonファイルの位置もForgeのhpに書いてあるようにします。
今回はスポーンしたときのボーナスチェストに割り込ませたのですがちゃんと
入っていました・・・ここまでとっても苦労したので大喜びですヽ(^o^)丿
/setblock ~-1 ~0 ~ minecraft:chest 0 replace {LootTable:"minecraft:chests/spawn_bonus_chest"}というチートコマンドで
スポーンボーナスチェストを呼び出します。確率で1回で確認できるとは限らないので。
寺院の宝箱とかも呼び出せますよ~。いちいち確認するのが大変なので
チートコマンドで呼び出します。
このルートテーブルもマイクラのデータのフォルダに入ってるjsonファイルの方を
いじればmodなしで好きにルートテーブルの中身を書き換えられるんですって。
私のmodの存在意義が~(;´Д`)
毎回おまけに翻弄されすぎですがちゃんと出来るようになったので満足です。
改めてルートテーブルはやる予定ではあります。