MinecraftのIntegrated dynamics /Integrated tunnnels/Integrated NBTで高度に様々な搬入出を制御したい!上級編/アイテムのフィルタリングをしよう!


こんにちは、野中です。
この記事ではIDs/ITs/integrated NBTを組み合わせた物流制御の中で、特にフィルタリングについてスポットを当てて、特定のアイテムだけ搬入出する!というポイントにスポットをあてて書いてきます。
その1、その2くらいまではおそらく中級編より簡単ですが、その3はかなり複雑になるので頑張ってください。
そうそう、この記事は初級編/中級編をきっちり読んできた人むけに作ってます。なので、google検索でこの解説にたどり着いたIntegreted dynamics全然わかんないよ!って方など、まだ初級編、中級編を読んで来てない方は目を通してみてください。
環境がminecraftの1.12.2なので別バージョンだと細かい所が違うかもしれません。察したり試行錯誤したりしてがんばれ!

初級編が基本的な搬入出、中級編がNBTなどワールドの状況に応じた様々な搬出入するかどうかの制御について触れています。
まぁ読んでないなら読んでおいて間違いは無いです。


その1:とりあえずフィルタリングをしてみよう!

必要な物

  • 任意のチェスト 2個

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

  • item importer/exporter 1個

  • item interface 1個

  • variable card 1枚

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

やり方


配管例

フィルタリングには特に特別なブロックはいりません。
そしたらlogic programerを開いてください。

ここで大事になってくるのがList。listの画面の左右を押してItemにしてあげます。
itemの右の+を押すと項目が増やせて、他にも無限にアイテムを登録できます。
ここで意識しておいてほしいのが「Itemってデータ型がたくさん入ったListを作っている」という事。
intergerとかいろいろなデータ型を扱ってきましたがIDs/ITs内ではitemも別のデータ型として扱われてることを意識しておくとこの先役立ちます。
このItemのListにいろいろ追加したら、

こんな感じで赤いImport Itemsに入れてあげるとさっきのリストに入ってた物だけ搬出されます。
フィルタリング自体はこれでできます。やったね!
横にある+のボタンをおすと…

初級編で解説したの以外にblack listとかcheck damageとか、読むだけでわかるオプション項目がありますね。(でもcheck stack sizeは何かわかりませんでした。ごめんなさい。知ってる方教えて。)
ただし!
この項目はList内に入っているItemを常に搬出してしまいます。
でもIDs/ITsの売りは高度な条件制御。フィルタリングできるならせっかくなら組み合わせたい!!!
というのをその2でやっていきます。

その2:条件制御で合致した時だけアイテムを搬入出しよう!

必要な物

  • 任意のチェスト 2個

  • cable  任意の本数

  • item importer/exporter 1個

  • item interface 1個

  • variable card 4枚

  • logic programer 1個

  • variable store 1個

  • redstone reader 1個

  • レバー1本

ちなみにredstone readerとレバーが一番true/false切り替えやすいので採用していますが、各々制御したい条件にあわせてtrue/falseは読み替えてください。

やり方


配管例

とはいえ、その1とやることはたいして変わりません。
それに加えて用意してほしいのがitemに合わせるだけ合わせて、何にもせずただ左下のスロットに入れた何も項目が入っていないlist。

こういうカード

用意できたら、今回使うのはchoiceという項目です。
といってもこいつがやるのは単純。

あ、一番左のやつは中級編その1で使ったのと同じ処理をしてます

左に入れたboolean型のデータを読み、その型がtrueなら左、falseなら右を出力します。
なので左に出力したいアイテムのリストを、右には空のリストを入れてあげましょう。
これを使えば今の場合はredstone readerがを出力したときだけ左のリスト、そうじゃないときは何も出力しないはずです。
ほんとかな?って思ったそこのあなた。ちゃんとすべてのカードを同じネットワークにあるvariable storeに入れた上で該当カードをdisplayにセットして確認してみましょう。この姿勢がわかんなくなった時とっても大事。
そしたら、これをitem importerの所に入れてあげましょう。
これでlistに入れてるアイテムだけ、redstone readerにredstone信号が入っていたら出力されるっていう風になりました。
この方法を使えば、今回はredstone readerだった部分をtrue/falseで出力されるすべての条件、例えば前回のNBT制御とかに置き換えてあげることで、簡単にフィルタリング制御ができます。どころか、今回は空だったリストにアイテムを入れてあげることで、別のアイテムの出力もできます。
これで特定のアイテムだけの決まったフィルタリングに関しては完全にできますね。やったー!
正直ここまでできてるだけでくそほど強いです。
が、ここでとどまらないのがIDs/ITs。さらに複雑さは増しますが、さらに強い性能を引き出すことができます。

その3:もっと複雑な条件でフィルタリングしたーい!

はい。もっと複雑とはなんぞやと。
まぁいろいろ例はあると思うんですが、今回の例として
名前にOreを含むアイテムだけ、レッドストーンがオンの時搬出する
これを目標にやっていきます。
とはいえですね、名前の部分一致となると、先ほどまでのようにItem型のListの中に完全一致するものだけ搬出するとはいかないわけです。
ではどうする?
っていうのが今回の解説部分ですね。

解説の前に

今回肝になって来るのがここ。

↑この真上の緑のとこ

ここについてです。ここはoperator型というのが詰め込めるところです。
operator型というのは今まで作ってきた様々な処理を1枚のカードに組み合わせた物だと思ってください。
こいつだけは今までと毛色がちがいます。
今までは搬入出するアイテムかどうかの判断に外部の情報を使っていました。
ですが、この緑の枠に差し込んだ場合の動作はそれぞれ搬出するアイテムをItem型としてこのカードの関数にいれて、それでtrueと出力されれば搬出するという、Item自身の情報を扱うのがポイントです。
ここでItem型というのが出てくるので、Itemという型であるのを念頭に置いておいてほしかったんですね。

方針

上記の通り、やらなきゃ行けないことがかなり複雑なので何をしなければいけないかざっくりと考えてから組んでいきましょう。
まず大前提としてもっていてほしいのがこのイメージ。

ちょっと不格好なのはゆるしてね

チェスト内のアイテム1つ1つに対してする比較のセットを考えていく!
というのを念頭に置いておいてください。絶対true/falseで出ないと行けないし、入力は絶対にItem型です。
というわけでどんなことをすれば今回の目標が達成できるのか考えてみます。


はい。こんな感じですね。ピンとこなければoperatorを使わず試しにItemカードで条件に当てはまりそうなやつと当てはまらなそうなやつ2枚用意して、それでアイテムの名前をstring型で取得するものに指定するitemカードだけ変えてtrue/falseが思い通りになっているか確かめてみるのも良いでしょう。
ともかく、やりたい事を脳内でカード1枚分の単位までバラバラにしてあげられたらもはや勝ち確定です!
ちなみに僕の探し方ですが、文字列に部分一致するかでtrue/falseが出るの内かなー?って考えて、

filterの部分に注目

filterの左(inputのデータ型)と右(outputのデータ型)を指定してfilterにかけて探し出しました。

必要な物

  • 任意のチェスト 2個

  • cable  任意の本数

  • item importer/exporter 1個

  • item interface 1個

  • variable card いっぱい

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

やり方

そうそう、ここからは混乱してくるのでlabellerでの名付けを積極的に使っていきます。中級編にちょっろっと書いたので心当たりがない方はよろしく。じゃあさっきまで言っていたのをどうやってoperatorという形で実装していくのか。とりあえず使いそうな命令とその仕様に目星をつけておきます。

一回filterで検索してみる

Itemの名前を取り出すためにItem型→string型に直してくれる関数で調べてみるとnameというのがありました。
また、containについても調べてみたところ

こうすると
false


こうすると
true

というわけで前にいれた文字列が後ろに含まれているかどうかという処理であることを覚えておきましょう。
あとはlogic programerでひたすら書いていくだけではありますが、適宜displayでそのカードが今どんな状態かを確認しておくととっても良いです。

まずはoperatorを開いてもらうんですが、恐ろしいほど何もありませんね。
これは上の検索ボックスに命令名を入力して使います。

こんなの。部分一致で出てくるのでこれはANDだけで出てくる。
あと、labellerをもっていればlogic programerでcardに書き込むときにそのまま名前をつけられる。
Eのとこを押すと出てくるので頭の片隅にでも。


日本語の名前もつけられる
結構長くてもつけられる。

とまぁ順番に3枚のカードをつくっていただきます。
命令が間違えてないか不安になったときは白いとこに書いてあるものを読んでみると良いでしょう。上から入力1、入力2…で、最後のデータ型だけ出力です。データ型を意識して読んでみると間違いに気がつける可能性はあります。

ですが。
今のままだとカードは3枚のままになってしまいます。これを1枚にまとめていくのが今回の目標。
そこで活躍するのがこれ。

Pipe、わかりやすい名前

これは1枚目にさしたoperatorの出力をoperator2の入力1に入れた結果を出力するよってものです。
順番につないでいかなければいけない以上、まずは頭からつないでみましょうか。

ここの部分の実装


pipeでつないでみた

あれ…?でもちょっと待ってください。僕らがしたいことって与えた文字列がItemに含まれているかの識別ですよね?
そうなると、入力1、前の文字列に後ろの文字列が入ってしまっては不都合です。これを解決するには2通り。
1:2個目のoperatorのデータの受け入れ順序をひっくり返す。

データの受け入れ順序を反転させるflip

flipというのを使うとデータの受け入れ順序の1つめと2つめを反転させられます。
受け入れ順序が逆になれば当然pipeで入力したときに2つめのデータを先に受け入れてくれるわけですね。
2:先にcontainのoperatorに文字を入れておく

pipeは一つ目の入力にデータを流し込むという処理をします。
なら先にcontainの1つ目の文字列をあらかじめ入れておくという手段でも解決できます。
ここで活用していくのがapplyという命令です。
これは左にセットされたoperatorの1つ目の入力に右にセットしたデータを入力するというものです。
pipeとの違いはoperatorの出力データ以外も受け付けることです。
逆にoperatorにたいして別のoperatorをapplyで入力してもそのoperatorに入力されるのはoperatorそのものであって、operatorの処理結果自体は出力してくれないので注意が必要です。


containのoperator型を突っ込むとこんな感じ


こんな感じでapplyしたカードを作って


それをdisplayにセットするとこんな感じ。
入力が一つに減っていることがわかるだろう。

こんな感じで入力が1つに減ってしまえば、これをpipeでつないでさえあげればtrue/falseのboolean型の出力が得られるわけですね!

まぁどちらか好きな方をえらんであげまして。

1の方を選んで実装しようとする


当然ではあるが部分一致で絞り込みたいstringを入力しようとするとできない


flipすると


よさげ!


これは余談ではあるが、materializerを使うとこれまで使ったカードを1枚にできる
operatorなど様々なカードを参照したoperator→その時点でのカードの情報を固定したoperatorに成形する形


1枚作ってしまえば作業台でまっさらなカードとクラフトしてコピーできる
書き込んだカードのリセットも単体クラフトで可能


variable storeが無くても写ってることからわかるとおり、これまでのカードが無くても
処理ができることがわかるだろう


あとはstringを入力して
この状態になったら(namedってなってるけど大丈夫。ちゃんと動きます。もしも不安だったらitem型のcardをapplyして確かめてみるといいよ)

はい、ここまでで「itemの名前が入力した文字列(今回だとore)部分一致したらtrueを出力する」というカードができました。

最後!

したら最後の仕上げ!ここの処理を作ってあげましょう。


pipeして
こうなるので
flipして


applyすると
こうなる

はい!ここまできたらItem→booleanの命令群が1枚にまとまってることがわかりますね!(namedでやってしまったからややこしいが、基本的にはitem→booleanになる関数を作ってあげる)

そしたら最後に!

久しぶり!

この緑色の所に詰めてあげるとこれでやりたかった事ができているはずです!チェストに鉱石とそれ以外のアイテムを入れてredstone readerにつけたレバーをONにして試してみてください!
できなかった場合は…displayでこまめに確認するのをおすすめします。
が、今回一番可能性として高いのは指定したstringがOreではなくoreになっている可能性が高いかなと思います。

"O"re

こんな感じで、鉱石はかならずOか完全に大文字になっています。かつ、IDs/ITsは大文字小文字をどんな場合でも区別して扱うのでそこを確かめてみてください。

はい、おめでとうございます!これでどんな複雑な条件でも(カード1枚分までバラバラにできれば)あなたはIDs/ITsで制御ができるようになりました!お疲れ様でした!
初級編から読んでくれた皆さん、長らくお付き合いありがとうございました。

おまけ:無線搬入出がしたい(要エンド到達)

ここまで読んできた皆さんは、IDs/ITsがくっそ強い配管であることをご理解いただけてると思います。が、このMod、なんとDimentionすらとび越えて無線でネットワークをつなげることができます。当然無線搬入出もできます。
けど先に弱いほうからご紹介。強い方のための中間素材でこっちはエンド到達がいりません。

これは直線上の2点間をつなぐというもの。

端の金ブロックが外れてるとこはコネクターが見えなかったから。
これは31マス離れてもできた

直線に二つのコネクタがあればそこの2点間はケーブルが無くて非透過ブロックがおいてあろうが無視してネットワークをつないでくれます。
ただこれはまだ強くなります。

これの上下にコーラスフルーツが必要なのがエンド到達が必要な理由

これはもう何もかも無視できます。fluxnetworkとかender chestみたいな感じでチャンクさえロードされていればネザーだろうがエンドだろうがどこからでも無線搬入出できます。

こんな感じでずれてても運べます。ディメンションを超えても運べます。しかも、3か所以上離れた地点を同じネットワークに組み込むこともできます。

この3つはすべて同じネットワーク

ただし、使い方には少しだけコツがあります。
基本的に2こセットでできるんですが、同じネットワークに属するコネクターを増やしたいときは、同じグループに属している必要があります。

こんな感じで真ん中を既においてグループを持っているコネクターにすることで作成される新しいコネクターを同じグループに加えることができます。

またこのように2個クラフトすることで左上の置いた方にグループがそろえられます。

最後に

大変長くなりましたが、お付き合いありがとうございました。
IDs/ITsはめちゃくちゃ強いmodなのでこれを片手にいろいろと活用してみてください。
助かった!とかコメント欄に書いてくれると筆者はとても喜びます。
また、質問がありましたらコメント欄に投げてくれたら答えられる範囲で答えます。(この記事にきた有識者の方がいた場合は代わりに答えていただいても大丈夫です)
ここまでの閲覧、本当にありがとうございました。

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