Jump to content
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal
  • 0
Me4eHoCeTc

Robot builder

Question

Hello, i want use robot for build spawn from schematic.

I have found one programm https://github.com/MightyPirates/OpenComputers/commit/09cabc902dd091a67bf499a59a13f1889b213102

local computer = require("computer")
local event = require("event")
local fs = require("filesystem")
local process = require("process")
local robot = require("robot")
local shell = require("shell")

local args = {...}
if #args < 1 then
print("Please enter a file name with the schematic to build.")
return
end

local file, reason = io.open(shell.resolve(args[1], "plan"))
if not file then
io.stderr:write(reason .. "\n")
return
end

print("Analyzing schematic...")

local counts = {}
local width, height, depth = 0, 1, 0
do
local lx, lz = 0, 0
while true do
local line = file:read()
if line == nil then
width = math.max(width, lx)
depth = math.max(depth, lz)
file:seek("set")
break
end
line = line:gsub("\r", "")
if line:sub(1, 1) == "#" then
height = height + 1
width = math.max(width, lx)
depth = math.max(depth, lz)
lx, lz = 0, 0
else
lz = lz + 1
lx = math.max(lx, #line)
for i = 1, #line do
if line:sub(i, i) == "1" then
counts[lz] = (counts[lz] or 0) + 1
end
end
end
end
end

print("Model bounds: " .. width .. "x" .. height .. "x" .. depth)

local SLOT_DIRT = 1
local SLOT_STONE = 2
local y, z = 0, 0
local offset, count = 0, depth

if #args > 1 then
offset = tonumber(args[2]) or 0
count = tonumber(args[3]) or (depth - offset)
end

local cost = count * height -- the "wall"
for z = offset + 1, offset + count do
cost = cost + (counts[z] or 0)
end

do
local path = fs.path(process.running())
local stateFile = io.open(fs.concat(path, ".state"))
if stateFile then
print("State file found, loading...")
file:seek("set", tonumber(stateFile:read()))
y = tonumber(stateFile:read())
z = tonumber(stateFile:read())
offset = tonumber(stateFile:read())
count = tonumber(stateFile:read())
cost = tonumber(stateFile:read())
stateFile:close()
print("Resuming work on slabs " .. (offset + 1) .. " through " .. (offset + count) .. ".")
print("Continuing at height " .. y .. ", depth " .. z .. ".")
print("There's a total number of " .. cost .. " blocks left to place.")
else
robot.select(SLOT_DIRT)
print("I'll be working on slabs " .. (offset + 1) .. " through " .. (offset + count) .. ".")
print("That'll take a total of " .. cost .. " blocks. Put them in a chest in front of me.")
print("Also put a stack of dirt into my first inventory slot (the selected one).")
end
end

print("Press any key when ready.")
os.sleep(0.5)
event.pull("key")
print("Starting in 3 seconds...")
os.sleep(3)

local function save()
local path = fs.path(process.running())
local stateFile, reason = io.open(fs.concat(path, ".state"), "w")
if not stateFile then
io.stderr:write("Failed saving state: " .. tostring(reason))
return
end
stateFile:write(tostring(file:seek("cur")) .. "\n")
stateFile:write(tostring(y) .. "\n")
stateFile:write(tostring(z) .. "\n")
stateFile:write(tostring(offset) .. "\n")
stateFile:write(tostring(count) .. "\n")
stateFile:write(tostring(cost) .. "\n")
stateFile:close()
print("State saved.")
end

function restock()
local slot = SLOT_STONE
robot.select(slot)
while cost > 0 and slot <= 16 do
-- fill up this slot, stop if we have all we need.
while true do
local count = robot.count(slot)
local space = robot.space(slot)
local wantCount = math.min(cost, space) -- avoid overflow
if wantCount <= 0 then
break
end
robot.suck(wantCount)
local suckCount = robot.count(slot) - count
cost = cost - suckCount
if suckCount == 0 then
-- not enough materials in chest
os.sleep(5)
end
end
slot = slot + 1
end
local energy = computer.energy()
if energy < computer.maxEnergy() * 0.5 then
repeat
os.sleep(1)
if computer.energy() < energy and computer.energy() < computer.maxEnergy() * 0.05 then
print("Emergency shutdown - out of energy!")
save()
print("Shutting down in 3 seconds...")
os.sleep(3)
computer.shutdown()
end
until computer.energy() > computer.maxEnergy() * 0.95
end
end

local function selectStone()
local didPrint = false
while true do
for slot = SLOT_STONE, 16 do
if robot.count(slot) > 0 then
robot.select(slot)
return
end
end
if not didPrint then
print("I need more materials!")
didPrint = true
end
os.sleep(5)
end
end

local function gotoWork()
-- PRE: looks at chest
robot.turnLeft()
repeat until robot.back()
robot.turnRight()
for _ = 1, z do
repeat until robot.back()
end
for _ = 1, y do
repeat until robot.up()
end
robot.turnLeft()
repeat until robot.back()
repeat until robot.back()
-- POST: stands at job pos, facing -x
end

local function moveToChest(force)
-- PRE: stands at job pos, facing -x
local stones = 0
for slot = SLOT_STONE, 16 do
stones = stones + robot.count(slot)
end
if force or (stones < width and cost > 0) or (computer.energy() > 0 and computer.energy() < computer.maxEnergy() * 0.1) then
repeat until robot.forward()
repeat until robot.forward()
robot.turnRight()
for _ = 1, y do
repeat until robot.down()
end
for _ = 1, z do
repeat until robot.forward()
end
robot.turnLeft()
repeat until robot.forward()
robot.turnRight()
restock()
return true
end
end

restock()
gotoWork()
for _ = 1, offset do
file:read()
end
while true do
local row = file:read()
if not row then
moveToChest(true)
return
end
if string.sub(row, 1, 1) == "#" then
-- skip, handled in z == depth below
for _ = 1, offset do
file:read()
end
else
-- PRE: at job pos, facing -x
selectStone()
repeat until robot.place()
local placed = 0
for x = 1, width do
if not string.find(row, "1", x, true) then
break
end
repeat until robot.back()
if string.sub(row, x, x) == "0" then
robot.select(SLOT_DIRT)
else
selectStone()
end
repeat until robot.place()
placed = placed + 1
end
repeat until robot.up()
robot.select(SLOT_DIRT)
for _ = 1, placed do
repeat until robot.forward()
robot.swingDown()
end
-- POST: above job pos, facing -x
if z + 1 < count then
robot.turnLeft()
repeat until robot.forward()
robot.turnRight()
repeat until robot.down()
z = z + 1
if moveToChest() then
gotoWork()
end
else
for _ = 1, depth - offset - count do
file:read()
end
y = y + 1
moveToChest(true)
z = 0
gotoWork()
end
end
end

file:close()
fs.remove(fs.concat(fs.path(process.running()), ".state"))
print("Done!")

after installing and runing it's asks to enter the name of schematic project, but i can't understand where i should put this file.

Any one can help?

And one more question: i found in dungeon disk with programm "build" how install it ?

OpenComputers a bit complicated for me,but i hope you help me guys :)

Link to post
Share on other sites

2 answers to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and Privacy Policy.