1.16.5日本語化リソースパック配布

302個のMODの翻訳が完了したので YouTube にて配布いたします 。翻訳の内容など不備はありますが、無いよりはましだと思って使ってください。翻訳したMODの詳細については、まとめるのが面倒くさいので止めておきます。このリソースパックを導入することがマイクラMOD攻略の近道...

2019年7月25日木曜日

チェスト自動設置プログラム

プログラムを発展させるには、複数のタートルの連携が必要となります。その中で不可欠なのが、チェストの大量設置です。そこでコンフィグにて縦横の可変、チェストの段数も設定できるプログラムを考えました。特徴として、タートルのスロットが空になると次のスロットへと移る関数を定義してチェスト設置しています。

--###アイテムがなくなるとスロットを変更する関数

function PLACESLOT()--関数の定義
    if turtle.placeDown() then--もしブロックが置けたら処理続行
    else--もしブロックが置けなかったら
        local SLOT=turtle.getSelectedSlot()--選択スロットをSLOTで定義
        for A=SLOT,16 do--スロット変更のループ 
            turtle.select(A)--スロットはループAを選択
            if turtle.getItemCount()>0 then--アイテム個数が0より大きければ
                turtle.placeDown()--ブロックを設置
            break--ループAを終える
            end--もしアイテム個数が...の終わり
        end--スロット変更ループの終わり
    end--もしブロックが置けたらの終わり
end--関数定義の終わり

いろいろと役に立つと思います


16x8x3段のラージチェスト設置のプログラム、最後は元に戻ってきます
可変式の反復するプログラムでは、スタート位置に戻ってくることが必須となります

local COUNT=0--横のチェストに数をカウントする変数の定義
local COMEBACK=0--横に移動した数をカウントする変数の定義


スロット1には木炭などの燃料を入れておきます

※燃料を考えるとプログラムが難しくなりますので、初心者は最初にタートルの燃料を大量に入れておくか、コンフィグで燃料不要にすることをお勧めします



縦方向に移動しながら設置して、戻りながら設置ののプログラムです


縦横、段数を指定できます、最大チェスト1024個まで設置可能です

local LENGTH=16--縦方向のチェストの数の定義
local WIDTH=8--横方向のチェストの数の定義
local STEP=3--チェストの段数の定義




--####可変式チェスト大量設置のプログラム
local LENGTH=16
local WIDTH=8
local STEP=3
function PLACESLOT()
    if turtle.placeDown() then
    else
        local SLOT=turtle.getSelectedSlot()
        for A=SLOT,16 do 
            turtle.select(A)
            if turtle.getItemCount()>0 then
                turtle.placeDown()
            break
            end
        end
    end
end
turtle.select(1)
turtle.refuel()
for A=1,STEP do
    local COUNT=0
    local COMEBACK=0
    turtle.up()
    for A=1,WIDTH do
        COUNT=COUNT+1
        for A=1,LENGTH-1 do
            PLACESLOT()
            turtle.forward()
            turtle.forward()
            PLACESLOT()
        end
        turtle.turnRight()
        turtle.forward()
        COMEBACK=COMEBACK+1
        turtle.turnRight()
        for A=1,LENGTH-1 do
            PLACESLOT()
            turtle.forward()
            turtle.forward()
            PLACESLOT()
        end
        if WIDTH==COUNT then
            turtle.turnRight()
            for A=1,COMEBACK do
                turtle.forward()
            end
            break
        else
            turtle.turnLeft()
            turtle.forward()
            turtle.forward()
            turtle.turnLeft()
            COMEBACK=COMEBACK+2
        end
    end
    turtle.turnRight()
end
--####可変式チェスト大量設置のプログラムの終わり


このプログラムを考えたのは、大量のタートルに自動植林のプログラムで走らせたのですが、チェストは壊す、1段上で止まる、下まで掘りぬく、前後がズレるなどと問題だらけでした。そのたびにチェストに植林素材を入れたりと面倒なことを繰り返していました。ならば、その面倒なことは、タートルが自動でするのが目的です。


関連サイト
コンピュータークラフトを極める その2

2019年7月23日火曜日

その2

高度なプログラムとして自動植林や農業の自動化などを中心として進めていきます。スロットのAPIで限りあるタートルのスロットの管理やインスペクトAPIでタートルにブロックを調べて何かをするなどが中心となります。

使いこなすとプログラムの幅が広がるAPI

turtle.getItemCount()--スロットのアイテムの個数
turtle.transferTo()--他スロットへのアイテムの移動
turtle.getItemDetail()--スロットのアイテムを調べる
turtle.inspect()--前のブロックが何か調べる
turtle.inspectUp()--上のブロックが何か調べる
turtle.inspectDown()--下のブロックが何か調べる


自動植林プログラム
ひとつのチェストで1本の苗木を植えて伐採するプログラムです。タートルの移動が少ないので比較的だと思いますが、一番の難所はタートルのインベントリの操作です。チェストを苗木用、骨粉用、燃料用、回収した原木用と4個設置すればいいんですが、それでは物足りないので、このプログラムはタートルのスロットのAPIを使いこなすことを目的として考えています。



より高度な自動植林
チェスト1個での自動植林の第2弾です。タートルのインベントリAPIを駆使して完成度が上がりました。苗木や骨粉の補充、燃料補給、伐採開始、伐採終了の各タイミングを調整しています。



チェスト自動設置プログラム
チェストを手動で並べるのはとても手間がかかりますのでプログラムを作成しました。縦横、段数を可変式にしてスロットにアイテムがなくなるとスロットを変更できるようになっています。


複数タートルでの自動植林
チェストとタートルを設置する大量自動植林タートルのプログラムです。タートル36個で自動植林と自動分配運搬します。自動植林タートルは16個、パイプの役割のタートルは16個、アイテム輸送、原木輸送、苗木回収の各タートル1個です。メインとなるタートルはチェストとタートルを設置し、アイテムの分配、原木の回収を行います。チェストの数はラージチェスト100個となります。



複数タートルでの自動植林 プログラム1
自動植林のコアとなるタートルのプログラムです。大量にチェストとタートルを設置、アイテムの均等分配、原木だけを回収すると重要な役割となります。タートルの位置ずれは絶対に起こさない、アイテムを均等に分配する、原木は極力残さないをプログラムです。自動植林タートルのインベントリとチェストの圧迫は命取りとなります。



複数タートルでの自動植林 プログラム2
このプログラムはラージチェストを32個設置して原木を入手したら設置したチェストにドロップするプログラムです。チェストに何が入ってもエラーを起こすことがないので簡単なものになっています。自動植林場まで原木を回収に行かせることも考えましたが、アイテムを分配するタートルとの位置関係が難しくなるので断念しました。



複数タートルでの自動植林 プログラム3
このプログラムはラージチェストを32個設置してアイテムを輸送するプログラムです。プレーヤーは決められたチェストに骨粉、ジャングルの苗木、木炭を入れる必要があります。


複数タートルでの自動植林 プログラム4
16台のタートルのタートルで自動植林を行うプログラムです。タートルのスロット1は苗木、2は骨粉、3は木炭で固定しています。各アイテムは規定数より少なくなるとプログラムを停止します。原木を伐採、上昇、原木がなくなれば下降、地面につけば下降を終えます。他の植林の葉っぱが下降を妨げることを対処することが重要となります。



複数タートルでの自動植林 プログラム5
チェストからアイテムを入手して隣のチェストにアイテムを移動、伐採した原木だけを取り出し最初のチェストに原木を移動するプログラムです。タートルは移動することなく回転するだけなので燃料は必要ありません。使い方によっては工業MODのパイプのような役割も可能となります。



複数タートルでの自動植林 プログラム6
ドロップしたジャングルの苗木を回収するプログラムです。回転しながらアイテム入手して進んでいきます。中央の苗木のチェストに苗木だけを入れます。また燃料レベルが300を下回ると中央の燃料チェストから燃料を補給します。



関連サイト
プログラム脱初心者を目指してシリーズ化しました。マイクラのMODをやりつくした人やこれからプログラムを始めたい人には、お勧めのサイトとなっています。思い通りにタートルが動いたときは、きっと感動するでしょう。

関連サイト
コンピュータークラフトを極める その3
自動農業を中心に考えたプログラムです。メタデータで作物の成長度合いで判別したりタートルのスロット操作を主に取り扱っています。水源の有効範囲が決まっているので、タートルの動きが少なくなり意外と楽かもしれません。

露天掘りを極める
タートルのインベントリが少ない、タートルの動きが遅い、タートルの位置ずれでエラーを起こす、前もって整地することやチェストとタートルの設置が面倒くさいなどを解決するために試行錯誤しましたが、64台のタートルを動かして64x64を掘りぬくクアーリーのプログラムが完成しました。

より高度な自動植林

チェスト1個での自動植林の第2弾です。タートルのインベントリAPIを駆使して完成度が上がりました。苗木や骨粉の補充、燃料補給、伐採開始、伐採終了の各タイミングを調整しています。



ただしチェストの中の13スロットまでしかアクセスできないので、伐採した原木が増えてくるとこのプログラムは機能しなくなります。あくまでもタートルのスロットを制するのが目的なので、気にしないでことにします。


ラージチェストの横にタートルを配置します
タートルのインベントリには何も入れません


ラージチェスト内は骨粉多めで入れておきます
13スロット目までしかタートルはアクセスしてくれません

※チェストのインベントリをフル活用するために中身を全部出すことも考えましたが、見た目の問題で却下しました。


スロット1に苗木、スロット2に骨粉、スロット3に木炭が入ります
残りのアイテムはチェストに戻します


苗木を植えて苗木が育つまで骨粉を散布します


原木になったら伐採をスタート、原木部分がなくなるまで伐採


回転しながら葉を破壊して下降します
地上まで下降したら苗木を1回転して回収します


苗木と木炭が5個、骨粉が10個を下回るとチェストに行って補充します

スロット1.2.3に違うアイテムが入ってしまうとプログラムは機能しなくなります

燃料の補給はタートルの燃料値が、80より少なくなったら行います

自動植林 その1では、タートルは前進しませんでしたが、今回は1歩前進しますので、苗木が育ったら伐採を開始するプログラムを加えています。これがないとタートルの位置ずれが発生することがありました。




--####自動植林プログラム
while true do--メイン処理の無限ループ
local COUNT=0--上昇の変数の定義
    turtle.turnLeft()
    while true do--アイテム補充の無限ループの実行
        if turtle.getItemCount(1)<5 or--スロット1のアイテム数が5個か
            turtle.getItemCount(2)<10 or--スロット2がアイテム数が10個か
            turtle.getItemCount(3)<5 then--スロット3がアイテム数が5個なら
            for A=4,16 do--スロット4~16までアイテムをチェストから入手
                turtle.select(A)
                turtle.suck()
                local SLOT=turtle.getItemDetail()
                if SLOT then
                    if SLOT.name=="minecraft:sapling" then--苗木なら
                        turtle.transferTo(1)--スロット1に入れる
                    elseif SLOT.name=="minecraft:dye" then--骨粉なら
                        turtle.transferTo(2)--スロット2に入れる
                    elseif SLOT.name=="minecraft:coal" then--木炭なら
                        turtle.transferTo(3)--スロット3に入れる
                    end
                end
            end
            for A=4,16 do--スロット4~16までのアイテムをチェストに戻す
                turtle.select(A)
                turtle.drop()
            end
        else break--アイテムの補充の無限ループを終える
        end
    end
    turtle.turnRight()
    if turtle.getFuelLevel()<80 then--タートルの燃料が80より少ないなら
        turtle.select(3)
        turtle.refuel(1)--燃料の補給
    end
    turtle.forward()
    turtle.select(1)
    turtle.place()--苗木を植える
    turtle.select(2)
    while true do--骨粉を巻く無限ループの実行
        local ARU,NANIGA=turtle.inspect()
        if ARU then
            if NANIGA.name=="minecraft:log" then--前が原木なら
            break--骨粉を巻く無限ループを終える
            else--原木でないなら
                turtle.place()--骨粉散布
                os.sleep(1)
            end
        end
    end
    for A=1,20 do--原木伐採のループの実行
        local ARU,NANIGA=turtle.inspect()
        if ARU then
            if NANIGA.name=="minecraft:log" then--前が原木なら
                turtle.dig()--原木を破壊
                if turtle.up() then
                    COUNT=COUNT+1--上昇できたら+1
                else--上昇できなければ
                    turtle.digUp()--上の葉を破壊
                    turtle.up()
                    COUNT=COUNT+1--上昇出来たら+1
                end
            else break--原木でないなら原木伐採ループを終える
            end
        end
    end
    turtle.dig()
    turtle.forward()
    for A=1,COUNT do--上昇した分だけ下降
        for A=1,4 do--回転しながら葉を破壊
            turtle.dig()
            turtle.turnRight()
        end
        turtle.down()
    end
    for A=1,4 do--1回転して苗木を回収
        turtle.turnRight()
        turtle.suck()
    end
    turtle.back()
    turtle.back()
end--メイン処理の無限ループの終わり



なぜだか頂上で前に行けずにフリーズすることがありました、原因不明のため、前に行くを無限ループとしたり、COUNT=0の位置を工夫しましたが改善されず、どこかしらのブレークに問題があるのかなとか思います。ただまだ確認が不完全です。※確認できました

原木伐採の無限ループのブレークが全プログラム終了となってしまうことが、あったようです。骨粉散布の無限ループは「もしも原木ならブレーク」、原木伐採は「もしも原木じゃないならブレーク」と真逆なので意味合いが違います。「if not~」を使ってみましたが上手くいきませんでした。

このように変更したらプログラムが止まることがなくなりました。

while true do--原木伐採の無限ループの実行
else break--原木でないなら原木伐採の無限ループを終える
    ↓
for A=1,20 do--原木伐採のループの実行
else break--原木でないなら原木伐採のループを終える

lua 言語はシンプルなのかもしれませんが、単純に考えたらできるってパターンが多いです。プログラムを書くことよりも読むことを重視したら「プログラム=難しい」の無限ループから抜け出せる気がします。


チェスト2個のプログラムです、右に原木回収のチェストを置きます

上記のプログラムの最後から2行目の「end」の前に入れることで機能します

turtle.turnRight()
    for A=4,16 do
        turtle.select(A)
        local SLOT=turtle.getItemDetail()
        if SLOT then
            if SLOT.name=="minecraft:log" then
                turtle.drop()
            end
        end
    end
turtle.turnLeft()


関連サイト
コンピュータークラフトを極める その2

2019年7月19日金曜日

自動植林プログラム

ひとつのチェストで1本の苗木を植えて伐採するプログラムです。タートルの移動が少ないので比較的だと思いますが、一番の難所はタートルのインベントリの操作です。チェストを苗木用、骨粉用、燃料用、回収した原木用と4個設置すればいいんですが、それでは物足りないので、このプログラムはタートルのスロットのAPIを使いこなすことを目的として考えています。
「タートルのスロットを制すものは、プログラムを制す!」ですね


チェストひとつで自動植林システム


ラージチェスト、横にタートル


タートルのインベントリは1に苗木、2に骨粉、3に木炭


ラージチェストの3分の1くらいにランダムに苗木と骨粉と木炭を入れておきます


タートルは前に苗木を植えて1秒おきに骨粉を6回与えます


タートルの前に原木が現れると伐採開始


タートルは右回りに1周しながら苗木を回収してチェストの方向を向きます


一度チェストからタートルのスロット1~16のアイテムを入手
次にスロット4~16までのアイテムをチェストに戻します




このプログラムは問題は多いですが、基本となる伐採部分は使えると思います
タートルが動かないので苗木が回収できていない


周囲を歩き回りながらアイテム回収のAPIを使ってプログラムに追加

turtle.suck()
turtle.forward()


葉っぱが消えるのが遅い


タートルが下降するときに1周まわりながら葉を刈るプログラムを追加

for A=1,COUNT do
    for B=1,4 do     
        turtle.dig()
        turtle.turnRight()
    end
turtle.down()
end


チェストの最初の16スロットが原木になるとアイテムの補充ができない

チェストが原木で満杯のなるのが早ければ問題はないかもしれませんが、そうはなりません。ラージチェストの中を調べたり、入手スロットやアイテムを入れるスロットの指定ができません。一度タートルのインベントリに移動すれば色々なことができますが、タートルのインベントリは16スロットというのは大きな壁となります。

解決策は
一度チェスト内のアイテムを入手して捨てて欲しいものが出るまで繰り返すですかね。

あとは小さいことですが
骨粉がもったいない、燃料はどうでもいいんですが、苗木が育つ確率がつかめないので前のブロックが原木になったら骨粉散布をやめるという無限ループも考えられます。



改良プログラムをこの先考えるとして、まずは第一段階です。

--####自動植林プログラム
local COUNT=0
while true do
    turtle.turnLeft()
    turtle.select(1)
    for A=1,16 do
        turtle.select(A)
        turtle.suck()
    end
    turtle.select(1)
    for A=4,16 do
        turtle.select(A)
        turtle.drop()
    end
    turtle.turnRight()
    turtle.select(1)
    turtle.place()
    turtle.select(2)
    for A=1,7 do
        turtle.place()
        os.sleep(1)
    end
    turtle.select(3)
    turtle.refuel(1)
    while true do
        local ARU,NANIGA=turtle.inspect()
        if ARU then
            if NANIGA.name=="minecraft:log" then
                turtle.dig()
                if turtle.up() then
                    COUNT=COUNT+1
                else
                    turtle.digUp()
                    turtle.up()
                    COUNT=COUNT+1
                end
            else break
            end
        end
    end
    for A=1,COUNT do
        turtle.down()
    end
end

プログラムの内容

上に上がった数にCOUNTを定義
チェストの方を向いて
スロット1~16までチェストから補給
スロット4~16までチェストに入れる
右を向いて
苗木を植える
骨粉を1秒ごとに7回散布
燃料を補給
無限ループ開始
前が原木なら前を破壊
上に上がったらCOUNTに+1
上がれなかった
上を破壊して上に上がりCOUNTに+1
前が原木でないなら無限ループの終了
COUNTの数だけ下に行く


ポイント
ループカウンターは、使い捨てのようで、今回はすべて「A」にしてみました。連続処理はエラーが出やすいようなので、上に行く処理は、もしも上に行けなかったら上を破壊としています。

今回は目的の「タートルのスロットを制すものは、プログラムを制す!」は、達成できていないので敗北感が強いのですが、プログラム歴1か月、「CC初めての自動植林プログラム」って感じで納得しておきます。

関連サイト
コンピュータークラフトを極める その2

2019年7月17日水曜日

API や基本ルール

タートルに関する基本的なことやタートルの動作などに関するAPIやコマンド、プログラムの書き方などです。サバイバルでプログラムを組む人は、まずいないと思いますので、すべての情報は、クリエイティブで考えてサバイバルで実践となります。タートルは上位版であるアドバンスドタートルを使用します。


タートルに名前を付ける
名前がついてないタートルは、破壊したら作成したプログラムが消えてしまいます。タートルは破壊して回収するのが1番楽ですので、まずは名前を付けます。あとでリネームも可能ですので何でもいいので名前を付けましょう。
label set 名前、エンター(大文字でもOKです)
間に半角スペースが入りますので、label␣set␣名前となります
タートルは破壊しての回収が基本となりますので

lua 言語でプログラミングを始めるにあたっての注意事項

文字入力はすべて半角となります
「.」「,」「スペース」をはっきり区別します
行の中に「--」があれば「--」あとの文字は無視されます
タートルAPIは、大文字小文字を正しく入力しなければなりません


プラグラムの読み書き、実行、保存
edit プログラム名、エンター(.lua は拡張子です入力の必要はありません)


Ctrl キーを押すとメニューが出てきます


Save、Run、Exit を方向キーで選択してエンター


燃料の補給
スロット1に木炭を1スタック入れて refuel all と入力してエンター
refuel 24 など補給したい数値でもOKです

スロット1の1スタックの木炭が燃料としてタートル内に入りました
木炭と石炭の1個で80の燃料が入りますので 64x80=5120 となります

タートルは前後と上下の1ブロックの移動に燃料を 1 消費します(方向転換は不要)

使用できる燃料と効率

木材、原木:15
木炭、石炭:80
石炭ブロック:800
溶岩バケツ:1000

燃料に関するコンフィグ設定

燃料補給をプログラムに組み込むと難易度が上がりますので、燃料をフル満タンにしておくか、コンフィグから不要に設定するのもお勧めです

ノーマルなタートルの燃料のリミット「I:turtleFuelLimit=20000」
アドバンスドタートルの燃料のリミット「I:advancedTurtleFuelLimit=100000」
タートルが燃料を必要とするか「B:turtlesNeedFuel=true」false で不必要


ツールの取り外しコマンド
右手にツールを持たせる
equip スロットNO right

左手にツールを持たせる
equip スロットNO left

右手のアイテムを外す
unequip right

左手のアイテムを外す
unequip left




タートルに関する基本的なこと
インベントリ
タートルのインベントリは右側の16スロット
スロットNOの振り分けは、図のように1番~16番
タートル設置時は常にスロット1を選択スロットです
プログラムで成功させるには、選択スロットの把握が重要となります

適正ツール
適正ツールの考え方はバニラのマイクラと同じになりますが、すべてのブロックを同じスピードで破壊します。なので斧で石の破壊が簡単にできてしまいます。その場合はアイテムが回収されません。注意する点はメインハンドは左ということです。

斧とツルハシのように同じように破壊の適性を持ったツールをタートルに両手持ちさせる場合は、左にメイン処理のツールを持たせます。

剣とツルハシなどの反する適性を持ったツールは、右左関係なく使い分けてくれます。


左に持ったツールが優先されますので左に斧、右にツルハシでは、ブロックの破壊はできますがアイテムは回収されません。


メインハンドとなる左に剣を持たせ右にツルハシを持つと攻撃は剣、採掘はツルハシと適正ツールを使い分けてくれます。

その他
タートルは無敵です、モンスターの攻撃は受けません
水流も溶岩も関係なく突き進みます
移動に失敗してもプログラムは止まりませんので、位置ずれの予防が大切になります
タートルは横移動や横のチェストへのアクセスはできません


タートルAPIとは
turtle.xxxxx() が、あらかじめ登録されているタートルのプログラムです。通常は () の中は空白でも使えますが、スロットNOやアイテム数、変数などを入れることでプログラムの幅が広がります。さらに戻り値を把握することで、高度な分岐プログラムなどを作れるようになります。※以下の画面から抜けるには、exit() 、エンター


タートルの画面に「lua」と入力、次にタートルAPIを入力することで戻り値を見ることができます。上の画像は、turtle.inspectDown() と入力してタートルの下のブロックを調べています。戻り値はこのようになります。

true--下にブロックがある
{
    state = {--ステータス
        variant = "stone",--バリアントは、ストーン(種類は石)
    },
    name = "minecraft:ston",--名前は"minecraft:石"
    metadata = 0,--メタデータ(破壊度)
}

ブロックを調べるタートルAPIの inspect は、かなり詳しく情報が戻ってきますので、使い方が難しくなりますが、高度なプログラムには必須となります。


右を向くAPIである turtle.turnLeft() の戻り値は、true(成功)とシンプルです
選択スロットNOを返す turtle.getSelectedSlot() は、1 これはスロットNOです
指定したスロットのアイテム個数を返す turtle.getItemCount() は、24 と個数
今の燃料レベルを調べる turtle.getFuelLevel() は、86025 と燃料値となります

それぞれのタートルAPIの特性と知ることで、アイテム指定、個数指定、分岐など細かくプログラムを組むことに役立ちます。

タートルのプログラム考えるときは、まずはタートルの動きを日本語で考えていくのが一番手っ取り早いと思います。それにはエクセルでセルのコピーとペーストが最適だと思います。その考えたタートルの動きを lua の方式に当てはめ、英語にする、この手順なら初心者でもプログラムが組めると思います。




タートルAPI
燃料関係

turtle.getFuelLevel()--今の燃料値
戻り値:燃料値

turtle.getFuelLimit()--燃料値の上限
戻り値:燃料値

turtle.refuel()--選択スロットからの燃料の補給
戻り値:true,false、()内は燃料数


例:スロット1にある燃料の5補給します

turtle.select(1)--スロット1を選択
turtle.refuel(5)--燃料を5補給

タートルAPI
スロット関係
turtle.select()--アイテムスロット選択
戻り値:スロットNO、()内はスロットNO

turtle.getSelectedSlot()--選択しているスロットNO
戻り値:スロットNO

turtle.getItemCount()--指定スロットのアイテム数
戻り値:アイテム数、()内はスロットNO

turtle.getItemSpace()--指定スロットのアイテムの入る数
戻り値:アイテム数、()内はスロットNO

turtle.compareTo()--選択スロットと指定スロットとのアイテムの比較
戻り値:true,false、()内はスロットNO

turtle.transferTo()--選択スロットから指定スロットへのアイテムの移動
戻り値:true,false、()内はスロットNO

turtle.getItemDetail()--選択スロットのアイテムを調べ
戻り値:true,false、と name(アイテム名)


例:選択スロットが木炭ならアイテムを落とす

turtle.select(1)--スロット1を選択   
local DATA=turtle.getItemDetail()--DATAを定義してAPIを実行               
if DATA then--定義DATAに成功したら              
    if DATA.name=="minecraft:coal" then--名前が木炭なら         
       turtle.dropDown()--下に落とす        
    end
end

タートルAPI
タートルの動き
turtle.forward()--前に行く
戻り値:true,false

turtle.back()--バックする
戻り値:true,false

turtle.up()--上に行く
戻り値:true,false

turtle.down()--下に行く
戻り値:true,false

turtle.turnLeft()--左を向く
戻り値:常にtrue

turtle.turnRight()--右を向く
戻り値:常にtrue


例:4前進して右を向き1周して元の位置に戻る

for B=1,4 do--Bは4前進、右を向くを4回のループ
    for A=1,4 do--Aは前に行くを4回のループ
        turtle.forward()--前に行く
    end
    turtle.turnRight()--右を向く
end

タートルAPI
ブロックの破壊
turtle.dig()--前を壊す
戻り値:true,false、()内は left か right

turtle.digUp()--上を壊す
戻り値:true,false、()内は left か right

turtle.digDown()--下を壊す
戻り値:true,false、()内は left か right


例:深さ3段を10ブロック掘る

turtle.digDown()--下を壊す
turtle.Down()--下に行く
turtle.digDown()--下を壊す
turtle.Down()--下に行く
for A=1,10 do--ループAは10回実行
    turtle.dig()--前を掘る
    turtle.forward()--前に行く
    turtle.digUp()--上を掘る
    turtle.digDown()--下を掘る
end

タートルAPI
ブロックの設置
turtle.place()--前に設置
戻り値:true,false

turtle.placeUp()--上に設置
戻り値:true,false

turtle.placeDown()--下に設置
戻り値:true,false


例:スロット1のブロックを設置、ブロックが置けなかったらスロット2に変更

local SLOT=1--変数SLOTを定義
turtle.select(1)--スロット1を選択
if turtle.placeDown() then--下にブロックを置く
else SLOT=SLOT+1--もしも置けなかったらSLOT+1
    turtle.select(SLOT)--スロットに変数SLOTを挿入
    turtle.placeDown()--下にブロックを置く
end--もしもの終わり

タートルAPI
タートルの攻撃
turtle.attack()--前を攻撃
戻り値:true,false、()内は left か right

turtle.attackUp()--上を攻撃
戻り値:true,false、()内は left か right

turtle.attackDown()--下を攻撃
戻り値:true,false、()内は left か right


例:1秒おきに無限に正面を攻撃

while true do--無限ループの実行
    turtle.attack()--前を攻撃
    os.sleep(1)--1秒間の停止
end--無限ループの終わり


アイテムをチェストなどに入れる
turtle.drop()--正面に落とす
戻り値:true,false、()内はアイテム数

turtle.dropUp()--上に落とす
戻り値:true,false、()内はアイテム数

turtle.dropDown()--下に落とす
戻り値:true,false、()内はアイテム数


例:スロット1~16までのアイテムを下に落とす

for A=1,16 do--ループAは1~16まで実行               
    turtle.select(A)--スロットは変数Aを選択             
    turtle.dropDown()--下にアイテムを落とす     
end--ループAの終わり                 

タートルAPI
アイテムをチェストなどからの入手
turtle.suck()--正面から入手
戻り値:true,false、()内はアイテム数

turtle.suckUp()--上から入手
戻り値:true,false、()内はアイテム数

turtle.suckDown()--下から入手
戻り値:true,false、()内はアイテム数

例:スロット1~16までのスロットにアイテムを下から入手

for A=1,16 do--ループAは1~16まで実行               
    turtle.select(A)--スロットは変数Aを選択             
    turtle.suckDown()--下からアイテムを入手   
end--ループAの終わり

タートルAPI
ブロックを調べる
turtle.detect()--前にブロックがあるか
戻り値:true,false

turtle.detectUp()--上にブロックがあるか
戻り値:true,false

turtle.detectDown()--下にブロックがあるか
戻り値:true,false

turtle.compare()--指定スロットと前のブロックが同じか
戻り値:true,false、()内はスロットNO

turtle.compareUp()--指定スロットと上のブロックが同じか
戻り値:true,false、()内はスロットNO

turtle.compareDown()--指定スロットと下のブロックが同じか
戻り値:true,false、()内はスロットNO

turtle.inspect()--前のブロックが何か
戻り値:true,false、と name(アイテム名)

turtle.inspectUp()--上のブロックが何か
戻り値:true,false、と name(アイテム名)

turtle.inspectDown()--下のブロックが何か
戻り値:true,false、と name(アイテム名)


例:下のブロックが岩盤ならプログラム終了

local ARU,NANIGA=turtle.inspectDown()
--ARUは、何がある、NANIGAは、ブロック名と定義して実行
if ARU then--もしも下にブロックがあるなら
    if NANIGA.name=="minecraft:bedrock" then
--もしもブロック名が岩盤と同じなら
       break--ブレークする
    end--もしもの終わり
end--もしもの終わり

タートルAPI
ツールの持ち変え
turtle.equipLeft()--選択スロットと左手のツールを持ち変える
戻り値:true,false

turtle.equipRight()--選択スロットと右手のツールを持ち変える
戻り値:true,false


例:前に原木があればスロット1の斧と左に持っているツルハシと持ち変える

local ARU,NANIGA=turtle.inspect()
--ARUは、何がある、NANIGAは、ブロックと定義して実行
if ARU then--もしも前にブロックがあるなら
    if NANIGA.name=="minecraft:log" then
--もしもブロック名が原木と同じなら
       turtle.select(1)--スロット1を選択
       turtle.equipLeft()--左のツールと交換
    end--もしもの終わり
end--もしもの終わり

タートルAPI
クラフト
turtle.craft()--3x3のスロットでクラフト
クラフティングタートルのみ

2019年7月16日火曜日

コンピュータークラフトを極める その1

Computer Craft は、プログラムを組み、採掘、整地、植林、建築などをタートルを動かして自動化していく究極のマイクラMODです。様々なプログラムを組み複数台のタートルに連携をさせていけば、大掛かりな自動システムも可能となります。

プログラム経験がないので、もっと効率よいプログラムもあるかもしれませんが、素人なりのひらめきで乗り切っていきたいと思います。



簡単なプログラム
プログラムのチュートリアル。タートルの単純な作業の簡単なループプログラムです。地面に6ブロック設置、上にブロック積み上げていく、最高256段の階段を作って降りるなどの簡単なプログラムです。


豆腐建築プログラム
マイクラのワールドでプログラムを組んでタートルを動かすという一番とっつきにくいMODだといえますが、四角を積み上げていく豆腐建築プログラムは、初心者でも簡単にでき、達成感があるプログラムなので、導入編としては最適です。


外部エディタ Sublime Text
プログラムの編集をマイクラのゲーム内で行うには、かなり無理があります。画面が小さいのでプログラム全体が見えない、日本語のプログラムの説明が記述できない、コピーペーストができないなどとても不便です。一文字違っただけで動かないのがプログラムです。書きやすさと読みやすさ、他の人が作ったプログラムの導入を考えたら外部エディタをお勧めします。


無料で使えて高機能なプログラミングエディター SublimeText3「サブライムテキスト」のツールバーやプルダウンメニューを日本語化する方法です。このエディターは、メニューが多いんで多機能だと思われますが、残念ながらすべて英語です。プラグインを導入して日本語化します。難易度はかなり高めです。


渦巻き状にブロックを敷き詰める
プログラム経験のない初心者が、どれだけのことができるかをやっていきたいと思います。床や天井にブロックを設置することを想定してプログラムしてみました。ただブロックを敷き詰めるだけなら簡単なんですが、コンフィグから縦と横のサイズをそれぞれ設定できるプログラムとなっています。


往復移動で床を貼る
床を作るプログラムです。コンフィグで縦と横のサイズを変更できることが特徴です。プログラミング未経験者ですが、コツをつかめば何とかなりそうなMODのコンピュータークラフト、というかマイクラ経験者はプログラムが好きなのでは・・・


スロットを管理して最大値までの床
床を作るプログラムです。その3 、今回のプログラムは、チェストから燃料とブロックを補給して床を貼っていきます。タートルは横方向に2ブロック分ブロックを設置したら燃料とブロックを補給にチェストに向かいます。
タートルのスロット変更が上手くいかなかったので、範囲は無限にはできませんでした。
最大範囲は縦が256(4の倍数)
横が無限?(2の倍数)となっています。


露天掘りプログラム
サバイバルのいかなる条件でもタートルは確実に戻って来て、アイテムをチェストに入れて燃料を補給する露天掘りプログラム(クアーリー)です。MOBとの接触でタートルの移動位置が変わることを防止していますので、規則正しい採掘が可能です。採掘範囲は可変式ですが、タートルのインベントリが16スロットであることを考えると最大、24x24となります。回収するアイテムを指定すれば、クアーリープラスの最大サイズの256x256も可能になるでしょう。


チェストへの分類輸送
24x24の露天掘りプログラムのクアーリーマイナスの採掘アイテムを入れるチェストは、ラージチェスト1個だけなので当然アイテムはあふれます。必要となるのは、倉庫へのアイテム輸送システム。ただ輸送するだけなら面白くないので丸石、土、鉱石類を仕分けするプログラムを考えました。




40個のチェストに分配輸送
ラージチェストを最大10x4の40個にアイテムを分配してチェストに入れていくプログラムです。コンフィグでアイテムを登録することで、40個の内の20個のチェストに入れるアイテムを指定できます。露天掘りプログラムとの連携を考えていますので、マイニング専用タートルとアイテム輸送タートルの2台のタートルを使用します。



API や基本ルール
タートルに関する基本的なことやタートルの動作などに関するAPIやコマンド、プログラムの書き方などです。サバイバルでプログラムを組む人は、まずいないと思いますので、すべての情報は、クリエイティブで考えてサバイバルで実践となります。タートルは上位版であるアドバンスドタートルを使用します。

関連サイト
コンピュータークラフトを極める その2
高度なプログラムとして自動植林や農業の自動化などを中心として進めていきます。スロットのAPIで限りあるタートルのスロットの管理やインスペクトAPIでタートルにブロックを調べて何かをするなどが中心となります。

関連サイト
コンピュータークラフトを極める その3
自動農業を中心に考えたプログラムです。メタデータで作物の成長度合いで判別したりタートルのスロット操作を主に取り扱っています。水源の有効範囲が決まっているので、タートルの動きが少なくなり意外と楽かもしれません。

関連サイト
露天掘りを極める
タートルのインベントリが少ない、タートルの動きが遅い、タートルの位置ずれでエラーを起こす、前もって整地することやチェストとタートルの設置が面倒くさいなどを解決するために試行錯誤しましたが、64台のタートルを動かして64x64を掘りぬくクアーリーのプログラムが完成しました。

関連コンテンツ