View difference between Paste ID: jy4CXZ8k and 5nLt2Bsx
SHOW: | | - or go back to the newest paste.
1-
local ms = require("movescript")
1+
local ms = require("movescript")
2-
local robot = require("robot")
2+
local robot = require("robot")
3-
local component = require("component")
3+
local component = require("component")
4-
local ic = component.inventory_controller
4+
local ic = component.inventory_controller
5-
5+
6-
local RECHARGE_THRESHOLD = 0.55
6+
local RECHARGE_THRESHOLD = 0.1
7-
local ENERGY_SLOT = 1
7+
local ENERGY_SLOT = 1
8-
local ENERGY_ITEM = "thermalexpansion:cell"
8+
local ENERGY_ITEM = "thermalexpansion:cell"
9-
local CHARGER_SLOT = 2
9+
local CHARGER_SLOT = 2
10-
local CHARGER_ITEM = "opencomputers:charger"
10+
local CHARGER_ITEM = "opencomputers:charger"
11-
local RS_BLOCK_SLOT = 3
11+
local RS_BLOCK_SLOT = 3
12-
local RS_BLOCK_ITEM = "minecraft:redstone_block"
12+
local RS_BLOCK_ITEM = "minecraft:redstone_block"
13-
13+
14-
local args = {...}
14+
local args = {...}
15-
local WIDTH = tonumber(args[1])
15+
local WIDTH = tonumber(args[1])
16-
local LENGTH = tonumber(args[2])
16+
local LENGTH = tonumber(args[2])
17-
17+
18-
if WIDTH == nil then error("Invalid width") end
18+
if WIDTH == nil then error("Invalid width") end
19-
if LENGTH == nil then error("Invalid length") end
19+
if LENGTH == nil then error("Invalid length") end
20-
20+
21-
local energyStack = ic.getStackInInternalSlot(ENERGY_SLOT)
21+
local energyStack = ic.getStackInInternalSlot(ENERGY_SLOT)
22-
local chargerStack = ic.getStackInInternalSlot(CHARGER_SLOT)
22+
local chargerStack = ic.getStackInInternalSlot(CHARGER_SLOT)
23-
local rsBlockStack = ic.getStackInInternalSlot(RS_BLOCK_SLOT)
23+
local rsBlockStack = ic.getStackInInternalSlot(RS_BLOCK_SLOT)
24-
24+
25-
if energyStack == nil or energyStack.name ~= ENERGY_ITEM then
25+
if energyStack == nil or energyStack.name ~= ENERGY_ITEM then
26-
  error("Energy cell required in slot "..ENERGY_SLOT)
26+
  error("Energy cell required in slot "..ENERGY_SLOT)
27
end
28-
if chargerStack == nil or chargerStack.name ~= CHARGER_ITEM then
28+
if chargerStack == nil or chargerStack.name ~= CHARGER_ITEM then
29-
  error("Charger required in slot "..CHARGER_SLOT)
29+
  error("Charger required in slot "..CHARGER_SLOT)
30
end
31-
if rsBlockStack == nil or rsBlockStack.name ~= RS_BLOCK_ITEM then
31+
if rsBlockStack == nil or rsBlockStack.name ~= RS_BLOCK_ITEM then
32-
  error("RS block required in slot "..RS_BLOCK_SLOT)
32+
  error("RS block required in slot "..RS_BLOCK_SLOT)
33
end
34-
34+
35-
local function digRow(startLeft)
35+
local function safeForward()
36-
  local dir = "L"
36+
  robot.swing()
37-
  local antiDir = "R"
37+
  while not robot.forward() do
38-
  if startLeft then dir = "R" antiDir = "L" end
38+
    robot.swing()
39-
  ms.exec("d_SF"..dir.."SuSd")
39+
  end
40-
  for i=1, WIDTH - 1 do
40+
end
41-
    ms.exec("d_SFSuSd")
41+
42-
  end
42+
local function digAllUp()
43-
  ms.exec("d_"..antiDir)
43+
  robot.swingUp()
44
  while robot.detectUp() do
45-
45+
    robot.swingUp()
46-
local function rechargeIfNeeded()
46+
  end
47-
  if ms.getEnergyRatio() < RECHARGE_THRESHOLD then
47+
end
48-
    robot.select(ENERGY_SLOT)
48+
49-
    ms.exec("d_RRUPD")
49+
local function digRow(startLeft)
50-
    robot.select(CHARGER_SLOT)
50+
  local dir = "L"
51-
    ms.exec("d_PD")
51+
  local antiDir = "R"
52-
    robot.select(RS_BLOCK_SLOT)
52+
  if startLeft then dir = "R" antiDir = "L" end
53-
    ms.exec("d_PU")
53+
  safeForward()
54-
    ms.waitUntilEnergyRatio(0.95)
54+
  if dir == "R" then
55-
    robot.select(ENERGY_SLOT)
55+
    robot.turnRight()
56-
    ms.exec("d_USD")
56+
  else
57-
    robot.select(CHARGER_SLOT)
57+
    robot.turnLeft()
58-
    ms.exec("d_SD")
58+
  end
59-
    robot.select(RS_BLOCK_SLOT)
59+
  digAllUp()
60-
    ms.exec("d_SURR")
60+
  robot.swingDown()
61-
  end
61+
  for i=1, WIDTH - 1 do
62
    safeForward()
63-
63+
    digAllUp()
64-
-- assume to start on right.
64+
    robot.swingDown()
65-
local startLeft = false
65+
  end
66-
for i = 1, LENGTH do
66+
  if antiDir == "R" then
67-
  digRow(startLeft)
67+
    robot.turnRight()
68-
  startLeft = not startLeft
68+
  else
69-
  rechargeIfNeeded()  
69+
    robot.turnLeft()
70
  end
71
end
72
73
local function rechargeIfNeeded()
74
  if ms.getEnergyRatio() < RECHARGE_THRESHOLD then
75
    robot.select(ENERGY_SLOT)
76
    ms.exec("d_RRUPD")
77
    robot.select(CHARGER_SLOT)
78
    ms.exec("d_PD")
79
    robot.select(RS_BLOCK_SLOT)
80
    ms.exec("d_PU")
81
    ms.waitUntilEnergyRatio(0.95)
82
    robot.select(ENERGY_SLOT)
83
    ms.exec("d_USD")
84
    robot.select(CHARGER_SLOT)
85
    ms.exec("d_SD")
86
    robot.select(RS_BLOCK_SLOT)
87
    ms.exec("d_SURR")
88
  end
89
end
90
91
-- assume to start on right.
92
local startLeft = false
93
for i = 1, LENGTH do
94
  digRow(startLeft)
95
  startLeft = not startLeft
96
  rechargeIfNeeded()  
97
end