CCCPaste

dc_turt

-- === CONFIG ===
local TARGET_COUNT = 63
local ORE_WHITELIST = { 
    ["minecraft:raw_iron"] = true, 
    ["minecraft:raw_copper"] = true,
    ["minecraft:raw_gold"] = true,
    ["silentgear:raw_azure_silver"] = true,
    ["allthemodium:raw_allthemodium"] = true,
    ["allthemodium:raw_vibranium"] = true,
    ["allthemodium:raw_unobtainium"] = true,
    ["alltheores:raw_tin"] = true,
    ["alltheores:raw_lead"] = true,
    ["alltheores:raw_silver"] = true,
    ["alltheores:raw_nickel"] = true,
    ["alltheores:raw_aluminum"] = true,
    ["alltheores:raw_platinum"] = true
}
local FUEL_NAME = "minecraft:coal"

-- positions of blocks (example coords, replace with yours!)
local LOCS = {
    barrel = {x=772, y=86, z=-83, facing="north"},
    chamber = {x=769, y=84, z=-83, facing="north"},
    enderChest = {x=772, y=88, z=-83, facing="north"}
}

-- === POSITION TRACKING ===
local pos = {x=769, y=84, z=-82, facing="north"}  -- starting point
-- you can set this with gps.locate() if GPS is available!

local function face(dir)
    -- turn turtle until facing dir
    local dirs = {"north","east","south","west"}
    local idx = 1
    for i,v in ipairs(dirs) do if v==pos.facing then idx=i end end
    local target = 1
    for i,v in ipairs(dirs) do if v==dir then target=i end end
    local diff = (target - idx) % 4
    if diff == 1 then turtle.turnRight()
    elseif diff == 2 then turtle.turnRight(); turtle.turnRight()
    elseif diff == 3 then turtle.turnLeft() end
    pos.facing = dir
end

local function forward()
    while not turtle.forward() do sleep(0.5) end
    if pos.facing=="north" then pos.z=pos.z-1
    elseif pos.facing=="south" then pos.z=pos.z+1
    elseif pos.facing=="east" then pos.x=pos.x+1
    elseif pos.facing=="west" then pos.x=pos.x-1 end
end

local function up() while not turtle.up() do sleep(0.5) end pos.y=pos.y+1 end
local function down() while not turtle.down() do sleep(0.5) end pos.y=pos.y-1 end

local function goTo(x,y,z)
    -- very simple pathing: vertical first, then X, then Z
    while pos.y < y do up() end
    while pos.y > y do down() end
    if pos.x < x then face("east"); while pos.x < x do forward() end
    elseif pos.x > x then face("west"); while pos.x > x do forward() end end
    if pos.z < z then face("south"); while pos.z < z do forward() end
    elseif pos.z > z then face("north"); while pos.z > z do forward() end end
end

local function goToLoc(loc)
    goTo(loc.x, loc.y, loc.z)
    face(loc.facing)
end

-- === CHAMBER FUNCTIONS ===
local function countChamberItems()
    goToLoc(LOCS.chamber)
    local chamber = peripheral.wrap("front")
    local input = chamber.getInputItem()
    return input and input.count or 0
end

local function topUpChamber()
    local current = countChamberItems()
    if current >= TARGET_COUNT then return end
    local need = TARGET_COUNT - current

    -- fetch ore from barrel
    goToLoc(LOCS.barrel)
    for i=1,16 do
        turtle.select(i)
        turtle.suck(need)
        local item = turtle.getItemDetail()
        if item and ORE_WHITELIST[item.name] then
            goToLoc(LOCS.chamber)
            turtle.drop(item.count)
            return
        elseif item then
            turtle.drop() -- dump non-ore back
        end
    end
end

-- === REFUEL ===
local function refuelIfNeeded()
    if turtle.getFuelLevel() < 100 then
        goToLoc(LOCS.enderChest)
        for i=1,16 do
            turtle.select(i)
            turtle.suck(1)
            local item = turtle.getItemDetail()
            if item and item.name == FUEL_NAME then
                turtle.refuel()
                return
            elseif item then
                turtle.drop()
            end
        end
    end
end

-- === MAIN LOOP ===
while true do
    refuelIfNeeded()
    topUpChamber()
    sleep(5)
end