忍者ブログ

cc-memo

Computer Craft のメモ

mining (ブランチマイニング)

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

mining (ブランチマイニング)



mining
ブランチマイニングを行うプログラム。

・前回の根こそぎ機能を使用(nekoNega()のほう)。
・拠点の四方の壁の真ん中、(の1ブロック進んだ所)にマイニングタートルを配置し、
 そこから奥行128ブロックの位置まで、ブランチマイニングを行わせる。
・効率良く採掘する為に、奥に進むにつれて坑道を長くする。
 ただし、隣の方角のタートルと作業範囲が重複しないようにする。
・採掘範囲はチャンクローダーが効いている必要有り。
・採掘したブロックは、スタート地点の(スティーブが手動で設置した)チェストに納品する。
燃料不足対策 : 納品に戻った際に、次の坑道を処理できるだけの燃料が有るか計算し、
 足りない場合は投入待ち。
 未実装⇒実装したけどテストまだ。燃料が2000以下になったらスタート地点で給油待ち
・松明不足 & チェストあふれ対策 : 
 枝分かれした坑道から正面の通路に戻る際に、
 ・松明を回収
 ・不要ブロックで坑道を埋め戻す。
 ・適当なタイミングで不要ブロックをその場に捨てるようにした。不要ブロックで埋まっていて必要なブロックが採集できていない可能性が有る為。

とりあえず一晩実行してみて問題点を見つけたい。
改良版は後日
【動かしてみたらいろいろ不具合が、、、】
松明の設置が下手。
 これから壊すブロックに松明を立てかけてしまい。ドロップする。暗い。
 直した。
・ドロップしたアイテムを吸うコマンドも入れているが、効いていない模様。
全機、nekoNega()関数を実行中に、岩盤にぶち当たって機能停止。
 ようするにまだ駄目。

 直した。
正面の通路に採掘対象ブロックが残る。
 直した。
3ブロック空けて坑道を掘るつもりだったが、2ブロックしか空いていない。
 直した。
黒曜石も、根こそぎ採掘しないように指定すべきかも。
 直した。
スクリプト内に、下を掘ってすぐに下に移動していない箇所が有る?
 溶岩と水流がせめぎあっているような場所で、
 下掘り⇒黒曜石化⇒下移動(移動できてない)という動作になり、y座標がずれてしまう。
 
lib_turtle_0.2.3
前回から変更なし。

lib_neko_0.1.1
前回から変更なし。

以下ソース。
インストーラー(pastebin)

mining_0.1.1(pastebin)
dofile("lib_turtle_0.2.3");
dofile("lib_neko_0.1.1");

local tunnelLen = 0;
local depthLevel = 0;

local negaAry = { 3, 4, 5, 6, 7 };
local OTHER_FROM = 8;
local OTHER_TO = 16;

local function unloadBlocks()
  local tmpAry = {};
  for _, slotIdx in pairs(negaAry) do
    table.insert(tmpAry, { slotIndex = slotIdx, keepCnt = 1 });
  end
  for i = OTHER_FROM, OTHER_TO do
    table.insert(tmpAry, { slotIndex = i, keepCnt = 0 });
  end

  local primaryChest = true;
  for _, unloadInfo in pairs(tmpAry) do
    local idx = unloadInfo.slotIndex;
    local keepCnt = unloadInfo.keepCnt;
    turtle.select(idx);
    local failureCnt = 0;
    while true do
      turtle.drop(turtle.getItemCount(idx) - keepCnt);
      if keepCnt < turtle.getItemCount(idx) then
        failureCnt = failureCnt + 1;
        if 2 <= failureCnt then
          print("Since the contents of the chest are full,");
          print("blocks cannot be put in.");
          print("Please make sufficient free space.");
          print("Hit enter key when ready.");
          read();
          failureCnt = 0;
        end
        turtle.turnRight();
        turtle.turnRight();
        primaryChest = not primaryChest;
      else
        break;
      end
    end
  end
  if primaryChest then
    turtle.turnLeft();
  else
    turtle.turnRight();
  end
end

local function dropNegaBlocks()
  for _, slotIdx in pairs(negaAry) do
    turtle.select(slotIdx);
    for j = OTHER_FROM, OTHER_TO do
      if turtle.compareTo(j) then
        turtle.select(j);
        turtle.drop();
        turtle.select(slotIdx);
      end
    end
  end
  
end

local function myUserEvent(para1)
  if 0 == para1 then
    nekoNega(0, negaAry);
  elseif 1 == para1 then
    nekoNega(1, negaAry);
  elseif 2 == para1 then
    nekoNega(2, negaAry);
  elseif 3 == para1 then
    for _, slotIdx in pairs(negaAry) do
      if 2 <= turtle.getItemCount(slotIdx) then
        turtle.select(slotIdx);
        turtle.place();
        break;
      end
    end
  elseif 4 == para1 then
    if 0 == tunnelLen % 8 then
      local sel = -1;
      if 2 <= turtle.getItemCount(1) then
        sel = 1;
      elseif 2 <= turtle.getItemCount(2) then
        sel = 2;
      end
      if -1 ~= sel then
        turtle.select(sel);
        turtle.up();
        turtle.dig();
        turtle.down();
        turtle.placeUp();
        turtle.select(1);
      end
    end
    tunnelLen = tunnelLen + 1;
    if 0 == tunnelLen % 6 then
      dropNegaBlocks();
    end
  elseif 5 == para1 then
    tunnelLen = 0;
  elseif 6 == para1 then
    unloadBlocks();
  elseif 7 == para1 then
    dropNegaBlocks();
  end
end

userEventHandler = myUserEvent;

print("slot1 : torch x 64");
print("slot2 : torch x 64");
print("slot3 : Stone       x 1");
print("slot4 : Dirt        x 1");
print("slot5 : Gravel      x 1");
print("slot6 : Obsidian    x 1");
print("slot7 : Cobblestone x 1");
print("Hit enter key when ready.");
read();

log("-------------------------------");
log("-- mining_0.1.1 start");
log("-------------------------------");

for depthLevel = 0, 31 do
  local msg = "depthLevel = " .. depthLevel .. " / fuelLevel = " .. turtle.getFuelLevel();
  print(msg);
  log(msg);

  doCommand(
          " e0e1f"
       .. "(e0e1 v2 lv1 rrv1 u v1 ll v1 r v0 df)3 e0 v2 l v7"
       .. "(e1fv2 lv1 rrv1 e0uv1 llv1 rv0d v4)" .. (depthLevel * 4 + 10)
       .. "(s1 ll e1fe0rr v3 uv3d)" .. (depthLevel * 4 + 10)
       .. "e0u e1 s1p1d rr v5"
       .. "s1 (e1fv2 lv1 rrv1 e0uv1 llv1 rv0d v4)" .. (depthLevel * 4 + 10)
       .. "(s1 ll e1f k1 e0rr v3 uv3d)" .. (depthLevel * 4 + 10)
       .. "r  (e1f)" .. ((depthLevel + 1) * 4)
       .. "l v6"
       );
  if turtle.getFuelLevel() < 2000 then
    print("Keep fuelLevel over 2000.");
    print("Please refuel.");
    refuelPrompt(nil);
  end
  doCommand(
          "   (e1f)" .. ((depthLevel + 1) * 4)
       );
end
PR

コメント

プロフィール

HN:
kssr
性別:
非公開

Twitter

最古記事

(04/25)
(04/26)
(04/27)
(04/28)
(04/29)

アンテナ・ランキング