Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

【公式】タートルにinspect関数【チート】

はじめに

ひさしぶりの更新です。

今回は、最新のComputerCraft1.65で追加されたタートル関数をご紹介します。

このバージョンのCCは、Minecraft1.7.10でしか動かないのでご注意ください。

新しく追加された強力な関数

記事タイトルが過激ですが、そのくらい新しく追加された関数が強力であるとご理解ください。

一言でいうと、「目の前のブロックの名前がわかる」関数、「インベントリ内のアイテムの名前がわかる」関数です。

CC初心者の方でしたら、「え、いままでそんな基本的な関数がなかったの?」と思うかもしれませんが、CCのプログラムをいくつか書いたことがある方、本Webサイトを普段から閲覧されている方であるならば、ある種の衝撃を受けることでしょう。

「今までの苦労っていったい・・・。この機能、強力すぎない?」と。

turtle.inspect() の紹介

気を取り直して、新しく追加された関数の使い方を紹介しましょう。

まずは、目の前にあるブロックの名前(とメタデータ)を調べるturtle.inspect()関数です。

下画像のように、タートルの目の前にブロックを設置しましょう。ここでは土ブロックを置いています。

f:id:hevohevo:20150125023414p:plain

次にタートルを右クリックしてターミナルを開き、luaと打ち込みエンターキーを押すことで、Luaインタラクティブモードに入ります。

そして表示されるプロンプト(促し)に、turtle.inspect()と打ち込みましょう。

f:id:hevohevo:20150125023639p:plain

エンターキーを押して、turtle.inspect()を実行すると以下のような表示になります。

f:id:hevohevo:20150125023644p:plain

つまり、目の前にブロックがあり、その名前がminecraft:dirtでありメタデータが0であることを示しています。

前回の記事で紹介したように、マインクラフトのブロックは、ユニーク(一意な)名前を持っています。

Modの設定ファイルに他Modのアイテム・ブロック名を追加する方法 - Minecraftとタートルと僕

バニラの(素の)マインクラフトのブロックは、minecraft:XXXX(XXXXはブロック名)という名前を持っていることが特徴ですね。

また、土ブロックはメタデータを使っていないので0と表示されていますが、たとえば羊毛ブロックなどはメタデータで色の違いを示しています。

これまでのCCでは、目の前にブロックがあるかないかくらいしか判別できなかったので、これは大きな進歩と言えるでしょう。

turtle.inspect()関数の仕様

turtle.inspect()関数の仕様は以下の通りです。

  • turtle.inspect()
    • 目の前にブロックがあるかどうか、そしてその名前など詳細を調べる。
    • 返値は2つ
      • 返値1: ブロックがあるならばtrue、なければfalse
      • 返値2: ブロックがあるならばその詳細情報をテーブルで返す。ないならば、エラー文字列「No block to inspect」を返す

ブロック詳細情報テーブルの例

{
    name = "minecraft:dirt",
    metadata = 0,
}

なお、類似関数として、turtle.inspectUp()turtle.inspectDown()もあります。これらは、タートルの真上や真下のブロックを調べる関数になります。

サンプルコード

turtle.inspect()関数を使ったサンプルコード

-- 5秒おきに目の前のブロックの情報を調べ、表示する。
while true do
  local status, value = turtle.inspect() -- 2つの返値をそれぞれの変数に代入

  if status then -- ブロックありを1番目の返値で判別
    -- valueがテーブルなのでその情報を表示
    print("name: ",value["name"])
    print("meta: ",value["metadata"])
  else -- ブロックなし
    print("error: ",value) -- エラー文字列表示
  end

  os.sleep(5) -- 5秒スリープ
end

実行結果(最初はブロックを置かず、しばらくしてから土ブロック設置)

f:id:hevohevo:20150125030545p:plain

おわりに

目の前にあるブロックの名前がわかるようになることで、これまで作ってきたプログラムが一気に古臭くなってしまいました。

たとえばこの関数を使うことで、以下のようなプログラムが組めるかもしれません。

  • 目の前のブロックが丸石ブロックならばインベントリに入れずにそのまま放棄
  • 物理的に採掘できないブロックに突き当たったので名前を調べたら岩盤(minecraft:bedrock)だったので、採掘を進める方向を変えた。
  • 目の前のブロックを調べたら水ブロック(minecraft:water)だったので、持っているバケツを使って汲み上げた。

夢が広がりますね!

次回は、もう一つの強力な関数turtle.getItemDetail(スロット番号)を紹介しましょう。

この関数もまた、今回紹介したinspect関数に負けないくらいチートな性能なんですよ!

お楽しみに。