MinecraftのIntegrated dynamics /Integrated tunnnels/Integrated NBTで高度に様々な搬入出を制御したい!中級編/ワールドの状況に応じて搬入出を制御しよう。

こんにちは。野中っていいます。
この記事ではIDs/ITs/integrated NBTについて一歩踏み出した、ワールドの状況に応じてそれを読み取り搬入出をしようという趣旨です。
初級編がわかっている人向けに書いてますので、google検索でこの解説にたどり着いたIntegreted dynamics全然わかんないよ!って方など、まだ読んでない方はどうぞ。下のリンクから飛べるはずです!
また、フィルタリングに関しては次の上級編で触れる予定です。
環境がminecraftの1.12.2なので別バージョンだと細かい所が違うかもしれません。察したり試行錯誤したりしてがんばれ!



初めに:まず何をするの?

まず結論から。
「ワールド内のデータとあらかじめこちらで用意した文字列や数字などをいろんな条件で比較して、それの条件結果によって搬入出をするか決めよう!」

というのが今回の目標です。
でも本当にこんなことできるんでしょうか?まず前回の記事の復習から。

毎度おなじみitem importer君

前回の記事ではimport all itemsってのにbooleanってのを押してtrueって書きこんだカードをここに入れると動くよ!っていう説明をしたと思います。
このbooleanは記事の前半で出てきた通り、true/false、つまり真か偽かの2種類のデータを持ったデータ型です。
そしてですね…

logic programerの画面

カードに書き込めるものの中には、入力されたデータ2つを比較して、それに応じてtrue/falseを変えてくれるというものがあります。
例えば上の例だと1番目に入れたものと二番目に入れたものが同じならtrue、違うならfalseを出力します。
また、後述しますが、ワールド内の様々なブロックの情報を読み取ってIDs/ITsのネットワーク内に渡してくれるものもあります。
つまり、繰り返しにはなりますが、これら二つを用いて
「ワールド内のデータとあらかじめこちらで用意したものをいろんな条件で比較して、それの比較の結果によって搬入出するか決めよう!」
というのが今回の目標になります。
と、その前に。
がっつり英語ではあるんですが、logic programerでカードにどんなことを登録させられるかの一覧があるので貼っておきます。今回からがっつり触れていくので。


その1:レッドストーン制御を通してtrue/falseの制御がどういうものかみてみよう!

必要な物

  • 任意のチェスト 2個

  • cable  任意の本数(パイプみたいな物なので)

  • item importer/exporter 1個

  • item interface 1個

  • variable card 1枚

  • logic programer 1個(使い回しがききます)

  • redstone reader 1個

  • レバー 1本

やり方


配管例

前回と一緒ですね。違うのは同じネットワーク内にredstonereaderをくっつけてることです。おなじケーブルにくっつけてあげれば大丈夫です!
んで、redstone readerの中を開いてみると…

なにこれ

なんかよくわからないのが出てきますね。
でも左のほう見てみると、なんか今まで使ってたvariable cardのような枠がありますね。真ん中にいれてあげると…

なんか出てきた

はい。これが何かというと「この機械で読み取ったデータを反映するカード」です。今回の例でいうとredstone信号がさっきのreaderに出力されていればtrueって条件です。
ちなみに上はレッドストーン信号が入っていなければtrue,下はredstone信号のレベルが15ならtrueって条件ですけど今回は使いません。
そしたらこれをitem importerの一番上に入れてあげましょう。

今はredstone入力をいれていない

はい、この状態だとredstone readerにレッドストーン入力がなければアイテムが運ばれず、あれば運ばれますね。
こんな感じで「ワールド内のデータを読み取り、それをIDs/ITsのネットワーク内に反映させる」という感覚とfalseなら搬出されず、trueなら搬出されるっていう感覚をつかめているのではないでしょうか。

その2:条件演算とはなにかをなんとなくつかんでみよう!

むしろここから本編まであります。
が、この章のこれはあくまで感覚をつかむためのもの。
ここでは導管の制御にはあまり触れないのでトライアンドエラーで感覚つかむからはよ導管回り教えてくれって人はその3までとばしてください。
まぁやっといて損はしない気もするけどね。読んどくことを推奨はする。

必要な物

  • cable  任意の本数(パイプみたいな物なので)

  • variable card 3枚

  • logic programer 1個(使い回しがききます)

  • display panel 1枚

  • variable store 1個

やり方

まずはlogic operatorを開きまして

もはやかなり見慣れてきたまである

integer型、整数のデータ型で10と500ってカードを作りましょう!
その後、equalで検索して


そうそう、equaって入ってるとこはcardに入れたい条件やデータ型など検索することができます

さっきの2枚のカードをいれて、とりだしてあげたカードをdisplay panelに入れてあげましょう!


は?

そう、ここが挫折ポイント。ちゃんと組んだはずの条件式がなんも表示されないです。なぜか。その秘密はいま刺したカードの説明欄に…

クリエ環境なのでなんか赤文字出てるけど期にしないで

Variable IDs:ってとこになんか2つほど数字が並んでいることでしょう。
つまりこのカードは「ネットワーク内にあるさっき入れた2つのカードを比較するよ」ってカードなんですね。
ならばそのカードをネットワークに認識させなければならない。
そのために使うのがさっき下に置いてもらったvariable storeなんですね。
そうそう、ちょっと本題からは外れる物の、おそらく複雑な制御を書いていくときかなり大事になる話なんですがvariable cardには名前をつけることができます。labellerというアイテムを使うと経験値なしですべてのItemにたいして名前をつけることができてとても便利です。
当然variable cardにも名前をつけられる、というかむしろこのために追加されているアイテムなんですが、そうするとvariable cardにカーソルをあてた時に表示されるvariable IDsの中でカード名が表示されます。
特に長期間使う物でメンテナンスとかが必要になるかもしれないIDs/ITsの機構や、何枚も何枚もカードを扱うことになる機構の場合は名付けしてそのカードがどういう働きをしているのかを書いてあげると幸せになれます。
閑話休題。


variable storeの中身

ここにさっきの2つを並べてあげると…

無事にfalseと出ましたね!逆にさっきのintのカード2つのうちどちらかをどちらかの数値にそろえてあげるとtrueってでます。まぁequalsなので当然ですね。
というわけで条件に合致するならtrue,そうじゃないならfalseって流れをつかめたと思います。そんな条件式、いったいどんなものが使えるんでしょう?

条件式いろいろ

and とかorとかnorとかnandとか、等しい、等しくない、あとは>=,<=,>,<などまぁだいたい思いつく演算子はある感じ。これをつかっていい感じに制御してあげると、今回のゴールに近づけるわけですね!
あ、そうそう、演算子についてる!はnot、trueとfalseを反転させた出力だよっていうのを表します。!=は等しくないなら。
また、andとかorの先に上げた4つがピンとこない人は以下のリンクをご覧ください。記事の先の入力1と入力2はこちらがセットした1枚目のカードと2枚目のカードと読み替えてもらえれば。boolean型を出力するカードしかセットできないとこも含めて一緒ですね。


その3の前に:ワールドのブロックのいろんなデータってどういう形で読み取れるの?

これがわからなければどういうデータ制御を組んだらよいかもわかりませんね。
私たちが制御したくなるブロックというのは大抵がtile entityというものでして、NBTという細かいデータが中に入っています。

これはなんも入ってないかまど
逆にこれは石炭をいれたかまど。itemsのとこが少し長いでしょ?

とまぁこんなかんじで加工する機械は99%NBTというデータをもっています。ていうかブロックが状況に応じて変わるなら、その情報はすべてこの中に入っています。それを取り出して比較してあげればうまくいくんじゃね?ってのが今回のやりたいことです。

その3:NBTを参照しながら物流を制御してみよう!


というわけで今回はNBTを用いて制御することを覚えるために
かまどの燃料スロットにあるアイテムが8個を下回った時だけ常に燃料が補充されているチェストから燃料を搬出する
というのを目標にします。
ほんとはこれを達成するだけならinventory readerっていうのを横の面に張り付けてその燃料スロットに入っているアイテムの数を監視させて8未満ならtrueを出すっていうので達成できるんですけど
NBTを扱う練習なので!!!これ扱えるようになるとどのmoduler machinelyでもエラー文監視してそれとこっちの用意した文が一致してればアイテム搬入するとかできるようになるから!!!
というわけで遠回りしていることの理解はしています。していますがなにとぞチュートリアルということでここはひとつ…

必要な物

  • 任意のチェスト 1個

  • かまど 1個

  • cable  任意の本数

  • item importer/exporter 1個

  • item interface 1個

  • variable card 4枚

  • logic programer 1個(使い回しがききます)

  • block reader 1個

  • NBT extractor 1個(使い回しがききます)

方針

ここからはやることが複雑になっていくのである程度方針を立てておきましょう。
NBTにはブロックのすべての情報が入っています。なら
かまどのNBTの中の燃料の個数を扱ってる数字の部分をInterger型で抜き出して、それをintergerの8と比較して小さければ搬出する
が実現できたらなんかうまくいきそうな感じしませんか?
というわけでやってみましょう。

やり方


配管例。
displayはなくてもいいけど、そのカードがどういう状態か表示させられるので、1枚あると便利。あとdisplayにカード入れた状態でそのままcopyを押すと、クリップボードに表示内容が入ります。メモ帳とかに適当にはりつけて確認できるので超便利。

今回の主役はblock reader。こいつが面してるさきのブロックのNBTを読み込んでくれます。今回だとかまど。
block readerを開いて…

NBTって窓にいれれば一発!

これで無事かまどのNBTは取得できました。やったね。
そしたら方針で示していたかまどのNBTの中の石炭の個数を扱ってる数字の部分を抜き出していきます。
抜き出していくんですけど…
じつはIDs/ITsだけでもこの作業はできるんです。
ただし、NBTって…じつはすごい入れ子になってて。
かまどのNBTの中のitemって項目の中に入っているNBTがいくつかあって、その中の燃料スロット部分をあらわすNBTの中のcountっていう何個入ってるかのNBTの中の数字を抜き出して…
なんか抜き出すのにルールはあるらしいんですが、ぶっちゃけめんどくさいです。addon入ってないパターン解説してほしかったらコメント欄に書いてください。そのうち記事が伸びるかもです。
なので!そこをすっ飛ばしてくれるaddonが!ようやく登場!Integrated NBTなんですね。これで追加されるのがNBT extractorなわけですね。
variable storeの上のブロックです。
使い方は単純です。とりあえずblock readerと同じネットワークにつないで右クリック。

左のスロットにブロックのNBTを、右のスロットに新規カードかどうでもいいカードを。

そしたら、今回は石炭が入っているはずなのでそれっぽい表記があるのがItemsって階層ですね。そこをひらいてあげると…

うわこのCountすっごいそれっぽいじゃん

ってノリでここの数字を指定してあげます。
実際今覗いてみると…

57個入ってますね

というわけでここの数字が燃料の個数です。なのでこれをクリックして指定してあげた状態で右のカードを取り出してあげましょう。
ついでに左のカードを取り出すのもわすれずに

この色になってるはず。なってなかったらたぶん余計に右上のボタンをいじってるのでreference modeっていう出力カードがこの色になるモードまで変えてあげましょう

この状態で一回このカードの出力を確認してみましょうか。
このカードは最初のかまどのNBTのデータを持つカードから特定のデータを抜き出すカードなので

さっきもみたね

先ほどと同じようにこれだけではNBTのデータが読めなくなってしまいます。というわけでなにをすればよいか。そう、元となったかまどのNBTのデータを持つカードをvariable storeに入れてあげればいいんですね。

さっきの数字だ!

はい、これで燃料スロットのアイテムの個数をINT型で取り出すことができました。そしたらあとはこれが8未満かどうかを判定してあげればよいですね。

Interger 8のデータ


左がさっきの8、右がさっきの燃料スロットのアイテムの個数

下のは>で検索すれば出ます。まぁ不等号は小学校からやっているのとかわりがありませんね。この条件をみたしていればtrueがでるということはですね、これをはめれば今の状態ならfalseが…

やっべ素でvariable storeにつかった数字突っ込むのわすれてた

つかったカードは全部variable storeに入れないと読めません!
ちゃんと入れてあげようね。
ちなみにさっき作ったカードの8をあとからintergerの16とかに変えると16個未満ってきちんと変わってくれます。えらい。

入れてきた。falseだね!


下がさっきのかまどの中の燃料の数。ちゃんと7個でtrueになっている。

これで条件制御は完ぺき。あとはこれをimporterにいれてあげれば…

ぶじ8つに補給された。ちなみに設定でインポーターの1度の搬出数を1つに絞っています。

これでNBT制御は完ぺきですね!
目標達成です!
あ、そうそう。
NBTextractorは一回NBTのどこを取り出すか指定してしまえば、NBTextractorの装置そのものがネットワークにいる必要はないので再利用できるように倉庫にしまっておきましょう。

こぼれ話


ちなみに、その3の最初のほうにいっていたmoduler machinelyの機械が吐き出すエラー文に関してはblock readerでとってきたあとNBT extractorで必要な部分だけ取り出したデータをこちらで指定したstring、文字列と==、つまり一致しているかどうかをとってあげるか、内部で数字管理されていればそのエラー番号とこちらの指定したintergerで==をとってあげることで特定の条件下でだけtrueをだすなんて芸当もできます。
また、redstone writer というアイテムを使うことによってtrueのときだけredstone信号をだすなんてこともできます。
これを使うと、moduler machinelyの中でエラー文が「Aってエネルギーがたりないよ!」ってなったときだけレッドストーンを出力するってこともできます。

それでmultiblock madnessってmodpack内で作ったのがこんなの。
まぁレッドストーン出力してると閃緑岩の上下のvisを消費してエネルギーを生み出すものが止まるのでエラー文が一致したときだけレッドストーン出力を止めてエンジンを動かしています。

上級編へのリンク(まだ未設置)

ぶっちゃけこれだけでもかなり使えるんですが、
複雑な制御したままフィルタリングもかけたい!
とか
アイテム名の一部分に一致するかだけで搬出入するかきめらんないのー?
とかあるじゃないですか。特にフィルタリングが貧弱すぎる。
のでその解説は上級編にて。


助かった!とかあったらコメント欄に書いてくれると筆者が喜びます。



この記事が気に入ったらサポートをしてみませんか?