From 0fe33c2aa08dc19f74e701ae651b0f27453f6429 Mon Sep 17 00:00:00 2001 From: brulijam Date: Wed, 19 Jun 2024 21:24:03 +0200 Subject: [PATCH] . --- src/brulijam/lib/tutel.lua | 89 ++++++++++ src/brulijam/sync.lua | 2 + src/brulijam/t-fiboMiner.lua | 324 ++++++++++++++++++++++++++++++++++ src/brulijam/t-path-miner.lua | 1 + 4 files changed, 416 insertions(+) create mode 100644 src/brulijam/lib/tutel.lua create mode 100644 src/brulijam/t-fiboMiner.lua diff --git a/src/brulijam/lib/tutel.lua b/src/brulijam/lib/tutel.lua new file mode 100644 index 0000000..d323cef --- /dev/null +++ b/src/brulijam/lib/tutel.lua @@ -0,0 +1,89 @@ +--secure digging wrappers +local function secureDig() + while turtle.detect() do + turtle.dig() + end +end +local function secureDigUp() + while turtle.detectUp() do + turtle.digUp() + end +end +local function secureDigDown() + while turtle.detectDown() do + turtle.digDown() + end +end + + + +--location returning move wrapper +--https://www.youtube.com/watch?v=bZe5J8SVCYQ +local function forward(x, y, z, rotation) + if turtle.forward() then + if roation == 0 then + z = z + 1 + elseif rotation == 1 then + x = x - 1 + elseif rotation == 2 then + z = z - 1 + else + x = x + 1 + end + end + return x,y,z,rotation +end + +local function back(x, y, z, rotation) + if turtle.back() then + if roation == 0 then + z = z - 1 + elseif rotation == 1 then + x = x + 1 + elseif rotation == 2 then + z = z + 1 + else + x = x - 1 + end + end + return x,y,z,rotation +end + +local function up(x, y, z, rotation) + if turtle.up() then + y = y + 1 + end + return x,y,z,rotation +end + +local function down(x, y, z, rotation) + if turtle.down() then + y = y - 1 + end + return x,y,z,rotation +end + +local function left() + rotation = (rotation-1) % 4 + return x,y,z,rotation +end + +local function right() + rotation = (rotation+1) % 4 + return x,y,z,rotation +end + + + +return +{ + secureDig=secureDig, + secureDigUp=secureDigUp, + secureDigDown=secureDigDown, + forward=forward, + back=back, + up=up, + down=down, + left=left, + right=right, +} \ No newline at end of file diff --git a/src/brulijam/sync.lua b/src/brulijam/sync.lua index 77f08ff..bba8321 100644 --- a/src/brulijam/sync.lua +++ b/src/brulijam/sync.lua @@ -24,6 +24,8 @@ local copyList = { [16] = "/brulijam/files/shape-hex-64.svg", [17] = "/brulijam/t-farmer.lua", [18] = "/brulijam/t-path-miner.lua", + [19] = "/brulijam/lib/tutel.lua", + [20] = "/brulijam/t-fiboMiner.lua", } diff --git a/src/brulijam/t-fiboMiner.lua b/src/brulijam/t-fiboMiner.lua new file mode 100644 index 0000000..ce77295 --- /dev/null +++ b/src/brulijam/t-fiboMiner.lua @@ -0,0 +1,324 @@ +-- This version does not use the gps module because it sometimes fails on servers when no one is online + + + +basic = require("lib.basic") +tutel = require("lib.tutel") +networking = require("lib.networking") + +oreList = { + [0] = "minecraft:gold_ore", + [1] = "minecraft:deepslate_gold_ore", + [2] = "minecraft:iron_ore", + [3] = "minecraft:deepslate_iron_ore", + [4] = "minecraft:coal_ore", + [5] = "minecraft:deepslate_coal_ore", + [6] = "minecraft:lapis_ore", + [7] = "minecraft:deepslate_lapis_ore", + [8] = "minecraft:diamond_ore", + [9] = "minecraft:deepslate_diamond_ore", + [10] = "minecraft:redstone_ore", + [11] = "minecraft:deepslate_redstone_ore", + [12] = "minecraft:emerald_ore", + [13] = "minecraft:deepslate_emerald_ore", + [14] = "minecraft:nether_quartz_ore", + [15] = "minecraft:nether_gold_ore", + [16] = "minecraft:copper_ore", + [17] = "minecraft:deepslate_copper_ore", + [18] = "minecraft:ancient_debris", +} + +keepList = { + [0] = "computercraft:wireless_modem_advanced", + [1] = "minecraft:chest", + [2] = "minecraft:barrel", + [3] = "minecraft:raw_gold", + [4] = "minecraft:raw_iron", + [5] = "minecraft:coal", + [6] = "minecraft:lapis_lazuli", + [7] = "minecraft:diamond", + [8] = "minecraft:redstone", + [9] = "minecraft:emerald", + [10] = "minecraft:quartz", + [11] = "minecraft:gold_nugget", + [12] = "minecraft:ancient_debris", + [13] = "minecraft:raw_copper", +} + + + + + +local function setState() + basic.writeToFile("brulijam/files/state-t-fiboMiner.txt", textutils.serialize(state)) +end + +local function getState() + if not fs.exists "brulijam/files/state-t-fiboMiner.txt" then + turtleState = {} + turtleState["dataCurrentFibo"] = 2 + turtleState["dataGoalRows"] = 0 + turtleState["dataGoalPathProgress"] = 0 + turtleState["dataCurrentRow"] = 0 + turtleState["dataCurrentPathProgress"] = 0 + turtleState["posX"] = 0 + turtleState["posY"] = 0 + turtleState["posZ"] = 0 + turtleState["rotation"] = 0 --towards south (pos Z) + turtleState["startX"] = 0 + turtleState["startY"] = 0 + turtleState["startZ"] = 0 + + + basic.writeToFile("brulijam/files/state-t-fiboMiner.txt", textutils.serialize(turtleState)) + else + turtleState = basic.readFileAll("brulijam/files/state-t-fiboMiner.txt") + turtleState = textutils.unserialize(turtleState) + end + return turtleState +end + + +local function savePos(prefix) + --swap modem with Pickaxe + --by convention the chunkloader is always left, so that Tools are right + for i=1, 16 do + turtle.select(i) + itemDetail = turtle.getItemDetail() + + if itemDetail ~= nil then + if itemDetail.name == "computercraft:wireless_modem_advanced" then + turtle.equipRight() + posZ, posY, posX = gps.locate() + sleep(1) + if prefix == "Chest placed at " then + posY = posY + 1 + end + basic.appendToFileNl("/brulijam/files/chests-turtle-miner-fibo.txt", prefix .. posX .. ", " .. posY .. ", " .. posZ) + networking.sendLog("all", "/brulijam/logs/chests-to-collect.txt", prefix .. posX .. ", " .. posY .. ", " .. posZ) + turtle.equipRight() + end + end + end +end + +local function inventoryRework() + chestAvailable = false + chestSlot = 0 + spaceAvailable = false + + for i=1, 16 do + turtle.select(i) + itemDetail = turtle.getItemDetail() + if itemDetail ~= nil then + if itemDetail.name == "minecraft:coal" then + turtle.refuel() + spaceAvailable = true + elseif itemDetail.name == "minecraft:chest" or itemDetail.name == "minecraft:barrel" then + chestAvailable = true + chestSlot = i + else --check if item can be thrown away + keepItem = false + for j=0, #keepList do + if itemDetail.name == keepList[j] then + keepItem = true + end + end + if not keepItem then + turtle.dropDown() + spaceAvailable = true + end + end + else --at least one slot of space remaining + spaceAvailable = true + end + end + + --store items away + if not spaceAvailable and chestAvailable then + turtle.up() + basic.secureDigUp() + turtle.up() + basic.secureDigUp() + turtle.select(chestSlot) + turtle.placeUp() + savePos("Chest placed at ") + + for k=1, 16 do + turtle.select(k) + itemDetail = turtle.getItemDetail() + if itemDetail ~= nil then + if itemDetail.name ~= "minecraft:chest" and itemDetail.name ~= "minecraft:barrel" and itemDetail.name ~= "computercraft:wireless_modem_advanced" then + turtle.dropUp() + end + end + end + turtle.down() + turtle.down() + end + + if not spaceAvailable and not chestAvailable then + savePos("Turtle stopped") + shell.run("delete /brulijam/task.lua") + shell.run("reboot") + end +end + + +local function isOre(blockData) + for i=0, #oreList do + if blockData["name"] == oreList[i] then + inventoryRework() + return true + end + end + return false +end + +local function recursiveOreMining() + for i=0, 3 do + turtle.turnLeft() + blockFound, blockData = turtle.inspect() + if isOre(blockData) then + tutel.secureDig() + turtle.forward() + recursiveOreMining() + turtle.back() + end + end + + blockFound, blockData = turtle.inspectUp() + if isOre(blockData) then + tutel.secureDigUp() + turtle.up() + recursiveOreMining() + turtle.down() + end + + blockFound, blockData = turtle.inspectDown() + if isOre(blockData) then + tutel.secureDigDown() + turtle.down() + recursiveOreMining() + turtle.up() + end +end + +local function mineRow() + --mine a 3 Block high Tunnel for Blocks + for i=state["dataCurrentPathProgress"], state["dataGoalPathProgress"]-2 do + print("row: " .. state["dataCurrentRow"]+1 .. "/" .. state["dataGoalRows"] .. ", pathProgress: " .. state["dataCurrentPathProgress"]+1 .. "/" .. state["dataGoalPathProgress"]) + + tutel.secureDig() + turtle.forward() + tutel.secureDigUp() + tutel.secureDigDown() + + --clearInventory() + --inventoryRework() + + --check current mining step for ore + turtle.up() + recursiveOreMining() + turtle.down() + recursiveOreMining() + turtle.down() + recursiveOreMining() + turtle.up() + + inventoryRework() + --clearInventory() + --checkInventory() + + --save path progress + state["dataCurrentPathProgress"] = i+1 + setState(state) + end + print("row: " .. state["dataCurrentRow"]+1 .. "/" .. state["dataGoalRows"] .. ", pathProgress: " .. state["dataCurrentPathProgress"]+1 .. "/" .. state["dataGoalPathProgress"]) +end + +local function mineChunk() + state = getState() + + state["dataGoalRows"] = state["dataCurrentFibo"] + state["dataGoalPathProgress"] = 3*(state["dataCurrentFibo"]-1)+1 + setState(state) + + for i=state["dataCurrentRow"], state["dataGoalRows"]-1 do + sleep(0.5) + mineRow(state["dataGoalPathProgress"]) + + --turn back and return to start of row if not last row + if i