見出し画像

【minecraft】OpenComputers×AE2で注入の儀式を”完全”自動化【Thaumcraft Infusion Automation】

※このnoteの内容は、minecraft 1.7.10(GregTech: New Horizons v2.3.0)環境で動作した装置を解説するものです

注入の儀式とは?

Infusion Altarで実行できるThaumcraftの特殊なクラフトで、素材アイテムの他にThaumcraftの特殊な流体「エッセンシア」が必要です。儀式を開始した後の輸液が遅れれば遅れるほど、様々な悪影響(素材アイテムの消失, フラックスの発生等)が出てきます。

自動化に使用したmod

参考にしたGTNH wiki

Open Computers(+Computronics)

ComputerCraftと同じ部類のプログラミングmod
Computerの基本部品に加え、今回の自動化では

  • Redstone I/O(周辺機器以外の起動)

  • Transposer(アイテムの搬出入)

  • Adapter(ME Interface, ME Controllerの読込)

を使用しています。
また、プレイヤーへの通知用にアドオンであるComputronicsのChat Boxを使用していますが、自動化には影響しません。

Applied Energistics + Thaumic Energistics(+ Thaumic Insurgence)

このnote見てる人には説明不要な気がする定番mod、+アドオンとか
AE2のクラフトシステムに対応させる形で自動化していくので必須です。
Thaumic EnergisticsはMEネットワーク上でのエッセンシア管理に使います。

Thaumic Insurgenceは、祭壇へのエッセンシア供給の許容量を∞にする装置が優秀で採用しています。

中央Pedestal直下に設置したInfusion Intercepterにエッセンシアを搬入することで祭壇に供給できます。これとThaumic EnergisticsのEssentia Provider(≠Infusion Provider)を組み合わせることで、『祭壇を起動した瞬間に輸液が完了しただとっ!?…』ってなります。チートです。

Gadomancy

Thaumcraftのアドオン
Infusion Clawという装置をRunic Matrixの上に設置しVisが充填された杖をセットすることで、本来プレイヤーが杖で行う祭壇の起動を代わりに実行できるようになります。RS信号を与えると、長めのアニメーションのあと杖のVisを消費して祭壇が起動します。
(OCのRobotに杖を持たせても起動してくれなかったので仕方なく採用)

GregTech

言わずと知れた鬼畜便利mod
範囲内のブロックを加速できるWorld Acceleratorと、電力を使って高速でエッセンシアを抽出するマルチブロック機械 Large Essentia Smelteryを使用しています。
どちらも必須ではないですが、導入するとクラフト時間が大幅に短縮されるのでオススメです。(GTNHはいいゾ)

完全自動化に必要なこと

あえて言語化すると…

『AE2のターミナルから注入の儀式が必要なクラフト注文を受けた際、プレイヤーの介入が一切ない状態で注入の儀式を安全に成功させ完成品をネットワークに戻す。また儀式に足りないエッセンシアがある場合は自動で補填する。補填が不可能な場合はその旨を通知後プレイヤーが問題を解消するまで祭壇を起動せず、解消後自動でクラフトを再開する。それらの処理を恒久的に繰り返し、あらゆる種類のアイテムで注入の儀式が行えるようにする。』

うーん長い。
エッセンシア自動補填, あらゆる種類のアイテム, などの余計な要件を外せばOCを使わない自動化もできるらしい(上で挙げたGTNH wikiに載ってる)のですが、どうせ作るならもっと良いものを!ということで挑戦します。

問題点とその解決策

①OCで注入の儀式のレシピデータを自動取得できない

もしかしたら、いい感じにレシピデータを取得する方法があるのかもしれないです。自分は思いつきませんでした。

解決策:予め各レシピの必要なエッセンシアとその量をテキストデータとして入力しておき、中央の台座に入るアイテムをキーとしてレシピを参照できるようにする。

②中央台座のアイテムが被るレシピを登録できない

上の仕様によって新たに出てくる問題点です。

解決策:被るアイテム名を別のテキストデータで入力しておき、そのアイテムが検出された場合は代わりに周囲の台座のうち、1番優先度が高い台座のアイテム(2番目に登録されたアイテム)でレシピを参照するようにする

これら以外は、割と上で挙げた要件通りにプログラムしている筈です。

実際のセットアップ

※セットアップ例であり、同じように組んだからといってプログラムをそのまま使えるわけではありません。

AE機器

祭壇の周囲にArcane Pedestalを配置し、全てにStorage Busを貼り付けて、同一のMEネットワークで管理します。(メインのMEネットワークと隔離)

中央のArcane Pedestalには、2面からStorage BusとP2P Tunnel - Itemを貼り付けます。このうちStorage BusのPriorityは周囲の台座より上げておきます。

周りは0で、中央だけ1000

また、ネットワークのどこかにP2P Tunnel - ItemとME Interfaceを向かい合わせで配置しておきます。(ME InterfaceはBlock, Panelどちらでも大丈夫)

わかりやすい位置にP2P Tunnel - Itemを設置した後、向かい合うようにメインネットワークに組み込まれたME Interfaceを設置します。(画像だと青のケーブルがメイン側)
最終的に、このME InterfaceにEncoded Patternを入れていくことになります。予めME InterfaceのBlocking ModeをONにしておきます。

そして、今設置したP2PをInput側、それより前に設置したP2PをOutput側としてリンクさせます。(Memory Cardを持った状態でInput P2PをShift右クリック、その後Output P2P2つに普通に右クリック)

こうすることでOutput P2Pの両方にBlocking Modeが利くため、アイテムを1セットづつ搬入することができます。

(ここまでの内容だけで、台座に適切なアイテムをセットするという機能は実装できています。そのため、OCを触りたくない&特定のアイテムだけクラフトできれば良いって人はここでストップして、エッセンシアの確保, Infusion Clawの起動, 完成品をフィルタしてメインに戻すシステムを組めば一応動くと思います。)

OCに進む場合は、準備としてメインネットワークのME Interfaceに向かってExport Busを貼り付け、ME Toggle Busを挟んで接続します。
そして、中央台座に付けたStorage BusをInsert Onlyにしておきます。


OC機器

画像の位置にRedstone I/Oを設置します。
上はME Toggle Bus用、左下はInfusion Claw用です。

右下のはWorld Accelerator用です。Screwdriverで右クリックすることで隣接するTileEntityに効果を及ぼすようになるので、これでInfusion ClawとRunic Matrixを加速しています。
(ずっとONのままでも問題ないのですが、ラグの原因になるらしい&機械Tierの電圧×6A×2台分の電力がもったいなく感じたので、Machine Controller Coverでon/offできるようにしました。)

画像の位置にTransposerを設置します。上はInfusion Claw内の杖の交換用で、下は台座のアイテム管理用です。下にはメインのME Interfaceを繋げておきます。

周囲の台座のうち1つを選び、Transposerを隣接するよう設置します。その台座のStorage BusのPriorityを中央台座と他の台座の中間の値にしておきます。
(優先度が 中央台座 > 選んだ台座 > その他の台座 となるように)

祭壇側のME Controller, メイン側のME Interfaceと隣接するようにAdapterを設置します。(1台で済むようにInterfaceの位置を調整してありますが、それぞれ1台づつ設置しても問題はない…と思います。)

最後に、設置したOC周辺機器をCableで繋ぎます。それらを管理するComputerと操作するためのDisplay, Keyboardをアクセスしやすい場所に設置します。お好みでChat Boxも設置します。

Computerの動力はPower Converterを噛ませることで、MEネットワークから供給できます。

OC, AE機器の設置はこれで終了です。杖のVis充填の自動化は、取り出された杖にVisを充填してInfusion Clawに戻すだけなので省略します。任意のアイテム輸送手段で実装します。


プログラム

部品は最低限でいい

Open Computersの基礎的な解説は省きます。Open OSをインストールしたHDDに書き込んでいきます。

Open Computersの日本語の解説は、この方の記事が大変参考になります。
英語であれば、公式ドキュメントが分かりやすいです。

実際に動かしているコードを下に表示しておきます。
ここで紹介しているGistのテキストデータは自由に改変して使用してもらって構いません。
https://gist.github.com/cons-tan-tan/a54a86b86a5fba56767aedfae4da3aec

うーん長い。
コード自体の解説は需要があるか分からないので省略します。もし解説要望あればコメントまで。

このままコピペして動かしても絶対正常に動作しないので、使えるように改変する手順&レシピ登録手順を解説していきます。

必要な改変

Componentに同種のものが複数存在している場合、component.invoke()メソッドを用いて個別に操作する方法があります。このとき、それぞれの機器に個別に割り振られるAdressという文字列で操作する機器を指定します。

プレイしている鯖での画像

Addressは機器を設置したときに初めて決まるので、Analyzerを持ったまま設置機器を右クリックしてAddressを調べます。
チャット欄に表示されたAddressはクリックするとClipBoardにコピーされるので、そのまま貼り付けることができます。ゲーム内ComputerでのPasteはInsertキーでできます。

local rs_wand = "d836a45e-28cf-4d22-9620-0a4f2dea4067"--Infusion Claw起動用のRedstone I/O
local rs_acce = "9be974b2-ee18-454b-9e49-1989fe8e5386"--World Accelerator起動用のRedstone I/O
local rs_expo = "4e1db502-a478-4ff7-91f0-fadbfbb88ae7"--Export Busを機能させる用のRedstone I/O
local tr_wand = "deba8439-2522-42c3-a99e-2705a1526a0f"--Infusion Clawの杖管理用のTransposer
local tr_cent = "4bb9d3b6-a8e1-4f73-a0d6-dde515568383"--中央の台座管理用のTransposer
local tr_sub = "492459ac-d58f-4467-8712-cf40eade4e3e"--代替アイテム検出用のTransposer

コードの上のほうで代入している文字列を、調べたAddressで上書きしてください。

また、Sides APIを使って方向を指定している箇所は、適切な方向(方角)に直してください。
他のテキストエディタにコピペしてから"sides."で探すのをおすすめします。

地図modがあると手軽に方角がわかる

レシピ登録

基本的には、AE側へのアイテムレシピ登録とOC側への必要エッセンシア登録の2つが必要です。

AE側

Arcane Assemblerの場合、中央の台座にMolecular Assemblerを搬入する必要があります。Pattern Terminalで登録した際、中央の台座に搬入したいアイテムを左上に設定します。左上から順に搬入されるので、最初に搬入されたアイテムはOutput P2Pのどちらから入っても、最も優先度の高い中央の台座に搬入されます。

Not Enough Energisticsの自動登録ボタンを使うと中央のアイテムを左上に登録してくれる(場合が多い)です。その場合余計なエッセンシアが同時に登録されることもあるので、削除しアイテムのみにしておきます。

また、Water Bucket, Lava Bucket, primordial Pearlなどは注入後周囲の台座にアイテムを残すことがあるので、ME Export Busに排出したいアイテムを登録しておきます。他にもあれば都度追加していきます。

レシピが増えてPatternスロットが足りなくなった場合は、Thaumic TinkererのTransvector Interfaceを使うと上限を増やせます。Input側のP2P Tunnel - Itemとリンクさせて、同じ方向からBlocking ModeのPattern Interfaceを追加すると同じように動作します。

OC側

若干面倒です。完全自動化の弊害がここに詰まっています。
まずファイル構造から説明します。

/homeディレクトリにaspects, recipes, sub, testという4つのファイルを作成しています。testの中身は上で挙げたauto-infusion.luaと同じです。(左手で打ちやすいのでよくこの名前にしています。名前の指定はないです。)
これを起動することでプログラムが開始します。

レシピ登録では、基本的にrecipesを編集していきます。(例外あり)
recipesの中身は、任意の注入レシピの中央台座のアイテム(キーアイテム)と必要エッセンシアを1行ずつ記録したテキストデータとなっています。内容はプレイ環境や登録レシピで変わってきますが、一例として自環境のrecipesのデータを下に表示します。
https://gist.github.com/cons-tan-tan/7beb83e577a7c977c6396349d6045d78

レシピ登録の度に書き加える必要があるので、できるだけ簡潔に記述できるようにしています。

記述形式はなんとなくわかると思いますが、
「キーアイテム , 相の名称 : 必要量 , 相の名称 : 必要量 , ・・・ ,」
という形式で記述します。文末の "," は必須です。
また、文末に","を追加して",,"と書くとこれ以降の文字は読み込まれずコメント扱いになります。recipesには完成品の名称のデータが無いため、必要に応じてメモを残しておくと良いかもしれません。
先に挙げたArcane Assemblerのレシピの場合、以下のように対応します。

Molecular Assembler,fabrico:64,praecantatio:48,permutatio:32,auram:16,lucrum:16,vitreus:16,metallum:8,

中央台座のアイテム名を間違えた場合はレシピが反応しないです。特定のレシピだけ動かない場合はスペルミスを疑いましょう。とはいえ勝手に祭壇が起動したりする訳ではないので、全く違うアイテム名を書いたりしない限り安全です。
あと、おま環かもしれませんが稀にアイテム名が表示とデータで違うものがありました 。
e.g.)"Irradiend Reinforced Iridium Plate"(表示)≠"Irradiend Reinforced Plate"(データ)

相の名称は、aspectsのテキストデータを参照してチェックしています。
https://gist.github.com/cons-tan-tan/2eae0b98815d2ca66c4421128dd8fb84

ここに無い相をrecipesで指定するとエラーを吐いて止まります。(自分がテスト中にスペルミスしまくったので追加した仕様だったりします。)

一番ヤバいのが必要エッセンシア量を間違えたときや、特定の相を書き忘れたときです。実際に必要な量より少なく書いてしまった場合、Computer側で校正しようがなく、エッセンシアが足りない状態で儀式実行の判断を下してしまう可能性があります。起動後足りない状態が続くほどWorld Acceleratorによって2^(tier)倍の速度で不安定性が増加し、あっという間に汚染まみれになります。もし儀式が完了しない不具合が発生した場合は、即座にクラフトオーダーをキャンセルし中央台座のアイテムを取り除いてください。
とにかく、recipesに追加する際は相の種類数数量データだけは複数回確認しましょう。(戒め)

なお実際の判断は、ここで書いた数値に+64を安全マージンとして追加した値で行っています。

また、問題点②でも取り上げた「中央台座のアイテムが同一の別レシピ」の登録は少し特殊です。

上の例だと、IchorとPure Tearは中央台座のアイテムが共にNether Starなので普通に登録することはできません。(recipesのキーアイテムが重複している場合はエラー吐いて止まります。)

ここで先程挙げたrecipesのデータのうち、IchorとPure Tearのレシピを見てみると..

Nether Shard,spiritus:64,humanus:32,lux:32,alienis:16,ordo:16,,sub for Nether StarIchorium Ingot,alienis:32,permutatio:32,praecantatio:16,sano:16,,sub for Nether Star

キーアイテムとしてNether Starではなく周囲の台座のアイテムの1つを指定しています。これで正常に動くのは何故かというと、subのテキストデータにNether Starを登録しているからです。
https://gist.github.com/cons-tan-tan/d943174c2a0efb31cbc21b0a760f30a8

subに追加されたアイテムが中央台座に入った場合、Computerはキーアイテムを中央ではなく、2番目に優先度が高い台座のアイテムで行います。

左上の1つ右の欄が2番めに搬入されるアイテムなので、そこに代わりのキーアイテムが登録されるようにします。

注意点として、代わりのキーアイテムとして登録したアイテムが別のレシピのキーアイテムと重複してもNGです。
解決策としては、そもそも被らないキーアイテムを設定する、もしくは被ったレシピのキーアイテムをsubをつかって変更すると良いです。

例えば、Pure Tearの代わりのキーアイテムであるIchorium Ingotを、本来のキーにもつ(Ichorium Ingotを中央の台座に置く)レシピXがある場合、subにIchorium Ingotを追加して、レシピXのキーアイテムをIchorium Ingot以外の周囲のアイテムに変更すればキーアイテム被りを回避できます。
…これを使う必要がある特異的なレシピの組み合わせは、まだ確認できていませんが。

ともかく、subのデータを使うことでほぼすべての注入レシピを登録できるのは明白です。完全自動化の要件として定めた「あらゆる種類のアイテム」は、これで達成できたとみなします。

エッセンシア自動化

エッセンシアの自動補填は、読み取っているメインのMEネットワークにレシピが存在しない限りは動きません。自動補填システムを使いたいときは、Thaumic EnergisticsのDistillation Pattern Encoderでレシピを登録します。

エッセンシアの不足分だけ自動で注文するので、十分なCrafting CPUを用意しておくことを推奨します。

特殊な挙動として、注文完了後に別要因(crucibleなど)でエッセンシアが減った場合があります。
ピッタリな量を注文した後不足したということは、同じように不足分ピッタリを注文しても別要因のエッセシア消費が同様のペースで行われる場合再度不足して…と永遠に必要エッセンシアが貯まらない可能性があるので、不足分+10の量を注文するようにしています。

実際の挙動

振り返り

minecraft上でしかテストできないのでバグ探しが大変でした。主にLua独自の仕様に振り回された気がします。でも超楽しかった。
OCで使えるAPIがあればそれを用いた創意工夫の幅が広がるので、mod製作者様方は是非お願いします!(他人任せ)

1年前までScratch以外のプログラミング経験0の自分でもどうにかなったので、OpenComputersに少しでも興味があればぜひ触ってみましょう!そしてOpenComputersの日本語コンテンツを充実させてください!(願望)

質問・意見等あればコメントかtwitterまで!


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